diff --git a/Credits.md b/Credits.md index 8898e857b3..b722935c13 100644 --- a/Credits.md +++ b/Credits.md @@ -1,12 +1,11 @@ # Icon Credits - Flag Icons made by [Freepik](https://www.flaticon.com/authors/freepik) from [www.flaticon.com](https://www.flaticon.com) and licensed by Creative Commons 3.0 - All the following are from [the Noun Project](https://thenounproject.com) licenced under either Creative Commons or Public Domain + ## Units ### Ancient Era @@ -17,7 +16,7 @@ All the following are from [the Noun Project](https://thenounproject.com) licenc * [Axe](https://thenounproject.com/search/?q=Axe&i=1688143) By ehab.abdullah for Warrior * [Bow And Arrow](https://thenounproject.com/search/?q=Bow%20and%20Arrow&i=338261) By Viktor Ostrovsky for Archer * [Bow](https://thenounproject.com/search/?q=bow&i=101736) By Arthur Shlain for Bowman -* Work Boats +* [Fishing Vessel](https://thenounproject.com/term/fishing-vessel/23815/) By Luis Prado for Work Boats * [Chariot](https://thenounproject.com/search/?q=Chariot&i=1189930) By Andrew Doane for Chariot Archer * [Spear](https://thenounproject.com/search/?q=Spear&i=11432) By Stephen Copinger for Spearman @@ -85,88 +84,110 @@ All the following are from [the Noun Project](https://thenounproject.com) licenc ## Improvements -* [Woodcutting axe](https://thenounproject.com/term/woodcutting-axe/1060560/) By Chanut is Industries -* [Monument](https://thenounproject.com/term/monument/1175928/) By Setyo Ari Wibowo +* [Woodcutting axe](https://thenounproject.com/term/woodcutting-axe/1060560/) By Chanut is Industries for Lumber Mill +* [Monument](https://thenounproject.com/term/monument/1175928/) By Setyo Ari Wibowo for Landmark * [Farm](https://thenounproject.com/term/farm/25362/) By Bonnie Beach -* [Unhappy](https://thenounproject.com/term/unhappy/116793/) By Daryl Vandermont -* [Bank](https://thenounproject.com/term/bank/1648569/) By Scott Dunlap +* [Unhappy](https://thenounproject.com/term/unhappy/116793/) By Daryl Vandermont (doesn't belong here) +* [Bank](https://thenounproject.com/term/bank/1648569/) By Scott Dunlap for Customs House * [Academy](https://thenounproject.com/term/academy/1689703/) By CJS -* [Factory](https://thenounproject.com/term/factory/1049531/) By RULI +* [Factory](https://thenounproject.com/term/factory/1049531/) By RULI for Manufactory * [Mine](https://thenounproject.com/term/mine/543/) By Edward Boatman * [Corral](https://thenounproject.com/term/corral/1340751/) By Luis Prado for Pasture -* [Plants](https://thenounproject.com/term/plants/1760916/) By hendra sudibyo -* [Pickaxe](https://thenounproject.com/term/pickaxe/175792/) By Creative Stall -* [Food stall](https://thenounproject.com/term/food-stall/1618358/) By I Putu Kharismayadi +* [Plants](https://thenounproject.com/term/plants/1760916/) By hendra sudibyo for Plantation +* [Pickaxe](https://thenounproject.com/term/pickaxe/175792/) By Creative Stall for Quarry +* [Food stall](https://thenounproject.com/term/food-stall/1618358/) By I Putu Kharismayadi for Trading post * [Road](https://thenounproject.com/term/road/1600491/) By REVA -* [Ruins](https://thenounproject.com/term/ruins/175277/) By Creative Stall -* [Ruins](https://thenounproject.com/term/ruins/3849/) By Paulo Volkova +* [Ruins](https://thenounproject.com/term/ruins/175277/) By Creative Stall for Ancient runs +* [Ruins](https://thenounproject.com/term/ruins/3849/) By Paulo Volkova for City ruins +* [Fishing Net](https://thenounproject.com/term/fishing-net/1073133/) By Made for Fishing Boats ## Buildings -* [Chinese traditional tower](https://thenounproject.com/term/chinese-traditional-tower/1808410/) By 1516 -* [Factory](https://thenounproject.com/term/factory/545906/) By icon 54 -* [Factory](https://thenounproject.com/term/factory/1624235/) By Maxim Kulikov -* [Bullets](https://thenounproject.com/term/bullets/810156/) By Aldric Rodriguez -* [Observatory](https://thenounproject.com/term/observatory/1259/) By Nathan Driskell -* [Opera House](https://thenounproject.com/term/opera-house/446672/) By Xinh Studio -* [Aqueduct](https://thenounproject.com/term/aqueduct/24639/) By Arthur Shlain -* [Hand saw](https://thenounproject.com/term/hand-saw/990902/) By b farias -* [Forge](https://thenounproject.com/term/forge/1044767/) By Monjin Friends -* [Books](https://thenounproject.com/term/books/1140218/) By Abir Alward -* [Cambodia](https://thenounproject.com/term/cambodia/1809152/) By Wichai Wi -* [Stadium](https://thenounproject.com/term/stadium/1152530/) By Creaticca Creative Agency -* [Stadium](https://thenounproject.com/term/stadium/1500595/) By sandra -* [Stadium](https://thenounproject.com/term/stadium/13872/) By Karuna Lalvani -* [Market](https://thenounproject.com/term/market/1723050/) By sofi -* [Christian Church](https://thenounproject.com/term/christian-church/1174183/) By Andrejs Kirma -* [Notre Dame](https://thenounproject.com/term/notre-dame/1361725/) By Marco Livolsi -* [Hagia Sophia](https://thenounproject.com/term/hagia-sophia/1907752/) By Felipe Alvarado -* [Shekel Coin](https://thenounproject.com/term/shekel-coin/204154/) By Till Teenck -* [Machu Pichu](https://thenounproject.com/term/machu-picchu/1569706/) By Carpe Diem -* [Parthenon](https://thenounproject.com/term/parthenon/493272/) By Christopher T. Howlett -* [College](https://thenounproject.com/term/college/129978/) By Alexander Skowalsky -* [College](https://thenounproject.com/term/college/1203703/) By Vectors Market -* [Chichen Itza](https://thenounproject.com/term/chichen-itza/668065/) By Hea Poh Lin -* [Great Wall Of China](https://thenounproject.com/term/great-wall-of-china/146039/) By Arthur Shlain -* [Cross swords](https://thenounproject.com/term/cross-swords/965398/) By Creaticca Creative Agency -* [Temple](https://thenounproject.com/term/temple/1808407/) By 1516 -* [Anubis](https://thenounproject.com/term/anubis/1080090/) By Carpe Diem -* [Stonehenge](https://thenounproject.com/term/stonehenge/543289/) By icon 54 +### Ancient Era + +* [Storehouse](https://thenounproject.com/term/storehouse/966786/) By Pedro Santos for Granary +* [Great Wall Of China](https://thenounproject.com/term/great-wall-of-china/146039/) By Arthur Shlain for Walls +* [Block](https://thenounproject.com/term/block/1711553/) By Monjin Friends for Stone Works +* [korean palace](https://thenounproject.com/term/korean-palace/1797542/) By 1516 for Palace +* [Obelisk](https://thenounproject.com/term/obelisk/749104/) By Eliricon for Monument +* [Cross swords](https://thenounproject.com/term/cross-swords/965398/) By Creaticca Creative Agency for Barracks * [Paper](https://thenounproject.com/term/paper/1443472/) By anam * [Circus](https://thenounproject.com/term/circus/743734/) By Ralph Schmitzer -* [korean palace](https://thenounproject.com/term/korean-palace/1797542/) By 1516 -* [Obelisk](https://thenounproject.com/term/obelisk/749104/) By Eliricon -* [Storehouse](https://thenounproject.com/term/storehouse/966786/) By Pedro Santos -* [Library](https://thenounproject.com/term/library/1122689/) By Rob Crosswell -* [Block](https://thenounproject.com/term/block/1711553/) By Monjin Friends -* [Water dam](https://thenounproject.com/term/water-dam/1002726/) By Symbolon -* [Spaceship](https://thenounproject.com/term/spaceship/1444621/) By Dinosoft Labs -* [Nuclear Plant](https://thenounproject.com/term/nuclear-plant/1132340/) By Andrejs Kirma -* [Build](https://thenounproject.com/term/build/1156478/) By Michael G Brown -* [Missile](https://thenounproject.com/term/missile/799922/) By ProSymbols -* [Rocket](https://thenounproject.com/term/rocket/937173/) By BomSymbols -* [Engine](https://thenounproject.com/term/engine/1877958/) By Andre -* [Chamber](https://thenounproject.com/term/chamber/1242689/) By IYIKON -* [Bank](https://thenounproject.com/term/bank/1882194/) By projecthayat -* [Forbidden City](https://thenounproject.com/term/forbidden-city/1797540/) By 1516 -* [Theatre](https://thenounproject.com/term/theatre/1780401/) By b farias -* [Taj Mahal](https://thenounproject.com/term/taj-mahal/1907755/) By Felipe Alvarado -* [Windmill](https://thenounproject.com/term/windmill/1705107/) By corpus delicti +* [Stonehenge](https://thenounproject.com/term/stonehenge/543289/) By icon 54 + +### Classical Era + +* [Temple](https://thenounproject.com/term/temple/1808407/) By 1516 +* [Anubis](https://thenounproject.com/term/anubis/1080090/) By Carpe Diem for Burial Tomb +* [Parthenon](https://thenounproject.com/term/parthenon/493272/) By Christopher T. Howlett for The Oracle +* [Stadium](https://thenounproject.com/term/stadium/1500595/) By sandra for Colloseum +* [Stadium](https://thenounproject.com/term/stadium/1152530/) By Creaticca Creative Agency for Circus Maximus +* [Market](https://thenounproject.com/term/market/1723050/) By sofi +* [Bazaar](https://thenounproject.com/term/bazaar/902288/) By Tokka Elkholy +* [Shekel Coin](https://thenounproject.com/term/shekel-coin/204154/) By Till Teenck for Mint +* [Aqueduct](https://thenounproject.com/term/aqueduct/24639/) By Arthur Shlain + +### Medieval Era + +* [College](https://thenounproject.com/term/college/129978/) By Alexander Skowalsky for University +* [College](https://thenounproject.com/term/college/1203703/) By Vectors Market for National College +* [Chichen Itza](https://thenounproject.com/term/chichen-itza/668065/) By Hea Poh Lin +* [Christian Church](https://thenounproject.com/term/christian-church/1174183/) By Andrejs Kirma for Monastary +* [Cambodia](https://thenounproject.com/term/cambodia/1809152/) By Wichai Wi for Angkor Wat +* [Books](https://thenounproject.com/term/books/1140218/) By Abir Alward for Oxford University +* [Forge](https://thenounproject.com/term/forge/1044767/) By Monjin Friends +* [Hand saw](https://thenounproject.com/term/hand-saw/990902/) By b farias for Workshop +* [Hagia Sophia](https://thenounproject.com/term/hagia-sophia/1907752/) By Felipe Alvarado +* [Factory](https://thenounproject.com/term/factory/1624235/) By Maxim Kulikov for Ironworks +* [Notre Dame](https://thenounproject.com/term/notre-dame/1361725/) By Marco Livolsi +* [Bullets](https://thenounproject.com/term/bullets/810156/) By Aldric Rodriguez for Armory +* [Machu Pichu](https://thenounproject.com/term/machu-picchu/1569706/) By Carpe Diem + +### Renaissance Era + * [Museum](https://thenounproject.com/term/museum/803560/) by zidney * [Hermitage](https://thenounproject.com/term/hermitage/133969/) By Yuri Mamaev * [The Louvre](https://thenounproject.com/term/the-louvre/1577539/) By roundicons.com -* [Books](https://thenounproject.com/term/books/1767500/) By Minh Do +* [Forbidden City](https://thenounproject.com/term/forbidden-city/1797540/) By 1516 +* [Theatre](https://thenounproject.com/term/theatre/1780401/) By b farias +* [Windmill](https://thenounproject.com/term/windmill/1705107/) By corpus delicti +* [Taj Mahal](https://thenounproject.com/term/taj-mahal/1907755/) By Felipe Alvarado +* [Observatory](https://thenounproject.com/term/observatory/1259/) By Nathan Driskell +* [Opera House](https://thenounproject.com/term/opera-house/446672/) By Xinh Studio +* [Chinese traditional tower](https://thenounproject.com/term/chinese-traditional-tower/1808410/) By 1516 for Porcelain Tower +* [Bank](https://thenounproject.com/term/bank/1882194/) By projecthayat + +### Industrial Era + +* [Books](https://thenounproject.com/term/books/1767500/) By Minh Do for Public School * [Hospital](https://thenounproject.com/term/hospital/1658509/) By Adrien Coquet * [Stock exchange](https://thenounproject.com/term/stock-exchange/1210199/) By Pundimon -* [Christ the redeemer](https://thenounproject.com/term/christ-the-redeemer/56112/) By Stefan Spieler -* [Military](https://thenounproject.com/term/military/1857519/) By myiconfinder -* [Signal Tower](https://thenounproject.com/term/signal-tower/1547758/) By Nociconist +* [Military](https://thenounproject.com/term/military/1857519/) By myiconfinder for Military Academy +* [Factory](https://thenounproject.com/term/factory/545906/) By icon 54 + +### Modern Era + +* [Stadium](https://thenounproject.com/term/stadium/13872/) By Karuna Lalvani +* [Signal Tower](https://thenounproject.com/term/signal-tower/1547758/) By Nociconist for Broadcast Tower * [Eiffel Tower](https://thenounproject.com/term/eiffel-tower/1907757/) By Felipe Alvarado -* [Microscope](https://thenounproject.com/term/microscope/1452362/) By Arafat Uddin -* [Chemistry](https://thenounproject.com/term/chemistry/175847/) By Creative Stall -* [Solar panel](https://thenounproject.com/term/solar-panel/154447/) By Andrew J. Young -* [Cathedral](https://thenounproject.com/term/cathedral/1325415/) By Dairy Free Design -* [Bazaar](https://thenounproject.com/term/bazaar/902288/) By Tokka Elkholy +* [Christ the redeemer](https://thenounproject.com/term/christ-the-redeemer/56112/) By Stefan Spieler for Cristo Redentor + +### Information Era + +* [Chemistry](https://thenounproject.com/term/chemistry/175847/) By Creative Stall for Medical Lab +* [Microscope](https://thenounproject.com/term/microscope/1452362/) By Arafat Uddin for Research Lab +* [Water dam](https://thenounproject.com/term/water-dam/1002726/) By Symbolon for Hydro Plant +* [Solar panel](https://thenounproject.com/term/solar-panel/154447/) By Andrew J. Young for Solar Plant +* [Spaceship](https://thenounproject.com/term/spaceship/1444621/) By Dinosoft Labs for Apollo Program +* [Build](https://thenounproject.com/term/build/1156478/) By Michael G Brown for Spaceship Factory +* [Nuclear Plant](https://thenounproject.com/term/nuclear-plant/1132340/) By Andrejs Kirma + +### Future Era + +* [Missile](https://thenounproject.com/term/missile/799922/) By ProSymbols for SS Booster +* [Rocket](https://thenounproject.com/term/rocket/937173/) By BomSymbols for SS Cockpit +* [Engine](https://thenounproject.com/term/engine/1877958/) By Andre for SS Engine +* [Chamber](https://thenounproject.com/term/chamber/1242689/) By IYIKON for SS Statis Chamber ## Social Policies @@ -224,7 +245,6 @@ All the following are from [the Noun Project](https://thenounproject.com) licenc ## Technologies ### Ancient - * [Agriculture](https://thenounproject.com/term/agriculture/4221/) By OCHA Visual Information Unit * [Jug](https://thenounproject.com/term/jug/869999/) By Vladimir Belochkin for Pottery * [Archery](https://thenounproject.com/term/archery/213836/) By icon 54 @@ -237,7 +257,7 @@ All the following are from [the Noun Project](https://thenounproject.com) licenc * [Bricks](https://thenounproject.com/term/bricks/1018659/) By Vaibhav Radhakrishnan for Construction * [Mallet](https://thenounproject.com/term/mallet/1306669/) By Ben Avery for Bronze Working -## Classical +### Classical * [Horse Riding](https://thenounproject.com/term/horse-riding/583093/) By Hea Poh Lin * [Abacus](https://thenounproject.com/term/abacus/1943303/) By Yo! Baba for Mathematics * [Arch](https://thenounproject.com/term/arch/1174168/) By Andrejs Kirma for Construction @@ -246,7 +266,7 @@ All the following are from [the Noun Project](https://thenounproject.com) licenc * [Engineering Blueprint](https://thenounproject.com/term/engineering-blueprint/1588543/) By Sachin Modgekar for Engineering * [Metalworking](https://thenounproject.com/term/metalworking/1561383/) By Symbolon for Iron Working -## Medieval +### Medieval * [Judaism](https://thenounproject.com/term/judaism/324145/) By Ben Davis for Theology * [Institution](https://thenounproject.com/term/institution/260586/) By Luis Prado for Civil Service * [Education](https://thenounproject.com/term/education/1817512/) By Tomas Knopp @@ -257,7 +277,7 @@ All the following are from [the Noun Project](https://thenounproject.com) licenc * [Lever](https://thenounproject.com/term/lever/4927/) By Jakob Ukrop for Physics * [Sword](https://thenounproject.com/term/sword/1365080/) By Jonathan P Lambert for Steel -## Renaissance +### Renaissance * [Telescope](https://thenounproject.com/term/telescope/1976706/) By ProSymbols for Astronomy * [Sound waves](https://thenounproject.com/term/sound-waves/792661/) By Makarenko Andrey for Acoustics * [Banking](https://thenounproject.com/term/banking/763867/) By Delwar Hossein @@ -269,7 +289,7 @@ All the following are from [the Noun Project](https://thenounproject.com) licenc * [Metal Block](https://thenounproject.com/term/metal-bock/1518464/) By Creaticca Creative Agency for Metallurgy * [Chemistry](https://thenounproject.com/term/chemistry/175847/) By Creative Stall -## Industrial +### Industrial * [Science](https://thenounproject.com/term/science/1901524/) By Dinosoft Labs for Scientific Theory * [Factory](https://thenounproject.com/term/factory/26212/) By Lil Squid for Industrialization * [Rifle](https://thenounproject.com/term/rifle/371894/) By Alexander Skowalsky for Rifling @@ -280,14 +300,14 @@ All the following are from [the Noun Project](https://thenounproject.com) licenc * [Turbines](https://thenounproject.com/term/turbine/86212/) By Leonardo Schneider for Steam Power * [Dynamite](https://thenounproject.com/term/dynamite/610652/) By Simon Martin -## Modern +### Modern * [Radio](https://thenounproject.com/term/radio/124575/) By Arthur Shlain * [Piston](https://thenounproject.com/term/piston/1224/) By Proletkult Graphik for Combustion * [Plastic](https://thenounproject.com/term/plastic/478826/) By Yu luck * [Microphone](https://thenounproject.com/term/microphone/470266/) By Viktor Vorobyev for Mass Media * [Flight](https://thenounproject.com/term/flight/1014306/) By Genius Icons -## Information +### Information * [Pill](https://thenounproject.com/term/pill/780458/) By Alex Arseneau for Pharmaceuticals * [Computer](https://thenounproject.com/term/computer/1967529/) By Shastry * [Nuclear Reactor](https://thenounproject.com/term/nuclear-reactor/426463/) By Jeremie Sommet for Nuclear Fission @@ -295,7 +315,7 @@ All the following are from [the Noun Project](https://thenounproject.com) licenc * [Robotic Arm](https://thenounproject.com/term/robotic-arm/1970874/) By Karl Gilbert for Robotics * [Rocket](https://thenounproject.com/term/rocket/1743642/) By kareemov for Rocketry -## Future +### Future * [Nanoparticles](https://thenounproject.com/term/nanoparticles/822286/) By Gyan Lakhwani for Nanotechnology * [Satellite](https://thenounproject.com/term/satellite/1466641/) By Ben Davis for Satellites * [Atom](https://thenounproject.com/term/atom/1586852/) By Kelsey Armstrong for Particle Physics diff --git a/android/assets/jsons/Buildings.json b/android/assets/jsons/Buildings.json index f297b8642a..e4d905ac73 100644 --- a/android/assets/jsons/Buildings.json +++ b/android/assets/jsons/Buildings.json @@ -1,5 +1,5 @@ [ - + // Ancient Era { name:"Palace", baseDescription: "Indicates that this city is the capital", @@ -100,52 +100,9 @@ maintenance:1, requiredTech:"Bronze Working" }, - { - name:"Temple", - culture:3, - specialistSlots:{culture:1}, - requiredBuilding:"Monument", - maintenance:2, - hurryCostModifier:25, - requiredTech:"Philosophy" - }, - { - name:"Burial Tomb", - replaces:"Temple", - uniqueTo:"Egypt", - culture:3, - happiness:1, - specialistSlots:{culture:1}, - requiredBuilding:"Monument", - hurryCostModifier:25, - requiredTech:"Philosophy" - }, - { - name:"The Oracle", - baseDescription: "Provides a free social policy", - culture:3, - greatPersonPoints:{science:1}, - isWonder:true, - uniques:["Free Social Policy"], - requiredTech:"Philosophy" - }, - { - name:"National College", - science:3, - culture:1, - isWonder:true, - percentStatBonus:{science:50}, - requiredBuildingInAllCities:"Library", - requiredTech:"Civil Service" - }, - { - name:"Chichen Itza", - culture:1, - greatPersonPoints:{production:1}, - isWonder:true, - uniques:["Golden Age length increases +50%"], - requiredTech:"Civil Service" - }, + + // Classical Era + { name:"Stable", maintenance:1, @@ -177,6 +134,35 @@ hurryCostModifier:25, requiredTech:"Construction" }, + { + name:"Temple", + culture:3, + specialistSlots:{culture:1}, + requiredBuilding:"Monument", + maintenance:2, + hurryCostModifier:25, + requiredTech:"Philosophy" + }, + { + name:"Burial Tomb", + replaces:"Temple", + uniqueTo:"Egypt", + culture:3, + happiness:1, + specialistSlots:{culture:1}, + requiredBuilding:"Monument", + hurryCostModifier:25, + requiredTech:"Philosophy" + }, + { + name:"The Oracle", + baseDescription: "Provides a free social policy", + culture:3, + greatPersonPoints:{science:1}, + isWonder:true, + uniques:["Free Social Policy"], + requiredTech:"Philosophy" + }, { name:"Market", gold:2, @@ -196,6 +182,24 @@ uniques:["Provides 1 extra copy of each improved luxury resource near this City","+2 Gold for each source of Oil and oasis"], requiredTech:"Currency" }, + { + name:"Mint", + maintenance:0, + requiredNearbyImprovedResources:["Gold","Silver"], + resourceBonusStats:{gold:2}, + hurryCostModifier:25, + requiredTech:"Currency" + }, + { + name:"Aqueduct", + maintenance:1, + hurryCostModifier:25, + uniques:["40% of food is carried over after a new citizen is born"] + requiredTech:"Engineering" + }, + + // Medieval Era + { name:"Monastery", maintenance:0, @@ -204,14 +208,6 @@ hurryCostModifier:25, requiredTech:"Theology" }, - { - name:"Notre Dame", - culture:1, - happiness:10, - greatPersonPoints:{gold:1}, - isWonder:true, - requiredTech:"Physics" - }, { name:"Hagia Sophia", culture:1, @@ -221,12 +217,21 @@ requiredTech:"Theology" }, { - name:"Mint", - maintenance:0, - requiredNearbyImprovedResources:["Gold","Silver"], - resourceBonusStats:{gold:2}, - hurryCostModifier:25, - requiredTech:"Currency" + name:"National College", + science:3, + culture:1, + isWonder:true, + percentStatBonus:{science:50}, + requiredBuildingInAllCities:"Library", + requiredTech:"Civil Service" + }, + { + name:"Chichen Itza", + culture:1, + greatPersonPoints:{production:1}, + isWonder:true, + uniques:["Golden Age length increases +50%"], + requiredTech:"Civil Service" }, { name:"Machu Pichu", @@ -237,13 +242,6 @@ uniques:["Gold from all trade routes +25%"], requiredTech:"Guilds" }, - { - name:"Aqueduct", - maintenance:1, - hurryCostModifier:25, - uniques:["40% of food is carried over after a new citizen is born"] - requiredTech:"Engineering" - }, { name:"Workshop", maintenance:2, @@ -297,14 +295,6 @@ uniques:["Cost of acquiring new tiles reduced by 25%"], requiredTech:"Chivalry" }, - { - name:"Porcelain Tower", - culture:1, - greatPersonPoints:{science:2}, - isWonder:true, - uniques:["Free great scientist appears","Production to science conversion in cities increased by 33%"], - requiredTech:"Architecture" - }, { name:"Ironworks", production:8, @@ -313,6 +303,14 @@ requiredBuildingInAllCities:"Workshop", requiredTech:"Machinery" }, + { + name:"Notre Dame", + culture:1, + happiness:10, + greatPersonPoints:{gold:1}, + isWonder:true, + requiredTech:"Physics" + }, { name:"Armory", xpForNewUnits:15, @@ -321,6 +319,9 @@ requiredBuilding:"Barracks", requiredTech:"Steel" }, + + // Renaissance Era + { name:"Observatory", baseDescription: "City must be bordering a mountain", @@ -329,7 +330,7 @@ percentStatBonus:{science:50}, requiredBuilding:"Library", requiredTech:"Astronomy" - }, + }, { name:"Opera House", culture:4, @@ -370,24 +371,6 @@ requiredBuilding:"Colloseum", requiredTech:"Printing Press" }, - { - name:"Taj Mahal", - baseDescription: "Empire enters a golden age", - culture:1, - happiness:4, - isWonder:true, - uniques:["Empire enters golden age"], - requiredTech:"Architecture" - }, - { - name:"Windmill", - production:2, - specialistSlots:{production:1}, - hurryCostModifier:25, - maintenance:2, - percentStatBonus:{production:10}, - requiredTech:"Economics" - }, { name:"Museum", culture:5, @@ -404,7 +387,7 @@ isWonder:true, requiredBuildingInAllCities:"Opera House", requiredTech:"Archaeology" - }, + }, { name:"The Louvre", baseDescription: "A Free Great Artist appears near the city", @@ -414,6 +397,35 @@ uniques:["Free Great Artist Appears"], requiredTech:"Archaeology" }, + { + name:"Taj Mahal", + baseDescription: "Empire enters a golden age", + culture:1, + happiness:4, + isWonder:true, + uniques:["Empire enters golden age"], + requiredTech:"Architecture" + }, + { + name:"Porcelain Tower", + culture:1, + greatPersonPoints:{science:2}, + isWonder:true, + uniques:["Free great scientist appears","Production to science conversion in cities increased by 33%"], + requiredTech:"Architecture" + }, + { + name:"Windmill", + production:2, + specialistSlots:{production:1}, + hurryCostModifier:25, + maintenance:2, + percentStatBonus:{production:10}, + requiredTech:"Economics" + }, + + // Industrial Era + { name:"Public School", science:3, @@ -424,14 +436,6 @@ uniques:["+1 Science Per 2 Population"], requiredTech:"Scientific Theory" }, - { - name:"Hospital", - food:5, - requiredBuilding:"Aqueduct", - maintenance:2, - hurryCostModifier:0, - requiredTech:"Biology" - }, { name:"Factory", production:4, @@ -443,6 +447,22 @@ requiredResource:"Coal", requiredTech:"Industrialization" }, + { + name:"Military Academy", + xpForNewUnits:15, + hurryCostModifier:25, + maintenance:1, + requiredBuilding:"Armory", + requiredTech:"Military Science" + }, + { + name:"Hospital", + food:5, + requiredBuilding:"Aqueduct", + maintenance:2, + hurryCostModifier:0, + requiredTech:"Biology" + }, { name:"Stock Exchange", gold:3, @@ -452,21 +472,9 @@ requiredBuilding:"Bank", requiredTech:"Electricity" }, - { - name:"Cristo Redentor", - culture:5, - isWonder:true, - uniques:["Culture cost of adopting new Policies reduced by 10%"], - requiredTech:"Flight" - }, - { - name:"Military Academy", - xpForNewUnits:15, - hurryCostModifier:25, - maintenance:1, - requiredBuilding:"Armory", - requiredTech:"Military Science" - }, + + // Modern Era + { name:"Broadcast Tower", culture:3, @@ -484,13 +492,6 @@ uniques:["Provides 1 happiness per social policy"], requiredTech:"Radio" }, - { - name:"Medical Lab", - baseDescription: "25% of food carried over after a new citizen is born", - requiredBuilding:"Hospital", - maintenance:3, - requiredTech:"Pharmaceuticals" - }, { name:"Research Lab", science:4, @@ -515,22 +516,21 @@ requiredTech:"Mass Media" }, { - name:"Solar Plant", - baseDescription: "Can only be built in cities next to deserts; cannot be built in a city with a Nuclear Plant", - production:5, - percentStatBonus:{production:15}, - requiredBuilding:"Factory", - maintenance:3, - cannotBeBuiltWith:"Nuclear Plant", - requiredTech:"Ecology", - uniques:["Must be next to desert"] - }, - { - name:"Apollo Program", - cost:1500, + name:"Cristo Redentor", + culture:5, isWonder:true, - uniques:["Enables construction of Spaceship parts"], - requiredTech:"Rocketry" + uniques:["Culture cost of adopting new Policies reduced by 10%"], + requiredTech:"Flight" + }, + + // Information Era + + { + name:"Medical Lab", + baseDescription: "25% of food carried over after a new citizen is born", + requiredBuilding:"Hospital", + maintenance:3, + requiredTech:"Pharmaceuticals" }, { name:"Nuclear Plant", @@ -542,6 +542,17 @@ requiredResource:"Uranium", requiredTech:"Nuclear Fission" }, + { + name:"Solar Plant", + baseDescription: "Can only be built in cities next to deserts; cannot be built in a city with a Nuclear Plant", + production:5, + percentStatBonus:{production:15}, + requiredBuilding:"Factory", + maintenance:3, + cannotBeBuiltWith:"Nuclear Plant", + requiredTech:"Ecology", + uniques:["Must be next to desert"] + }, { name:"Spaceship Factory", production:3, @@ -556,6 +567,16 @@ requiredTech:"Robotics", uniques:["Spaceship part"] }, + { + name:"Apollo Program", + cost:1500, + isWonder:true, + uniques:["Enables construction of Spaceship parts"], + requiredTech:"Rocketry" + }, + + // Future Era + { name:"SS Cockpit", requiredResource:"Aluminum", diff --git a/android/assets/jsons/Techs.json b/android/assets/jsons/Techs.json index 16cbf58573..6bea4457cf 100644 --- a/android/assets/jsons/Techs.json +++ b/android/assets/jsons/Techs.json @@ -452,7 +452,7 @@ row:6, prerequisites:["Flight","Computers"] } - ] + ] }, { columnNumber: 15, diff --git a/core/src/com/unciv/logic/GameInfo.kt b/core/src/com/unciv/logic/GameInfo.kt index eba7cfcf5e..78d1c36288 100644 --- a/core/src/com/unciv/logic/GameInfo.kt +++ b/core/src/com/unciv/logic/GameInfo.kt @@ -1,7 +1,7 @@ package com.unciv.logic import com.badlogic.gdx.graphics.Color -import com.unciv.logic.automation.Automation +import com.unciv.logic.automation.NextTurnAutomation import com.unciv.logic.civilization.CivilizationInfo import com.unciv.logic.civilization.Notification import com.unciv.logic.map.TileInfo @@ -48,7 +48,7 @@ class GameInfo { for (civInfo in civilizations.filterNot { it==player || (it.isDefeated() && !it.isBarbarianCivilization()) }){ civInfo.startTurn() - Automation().automateCivMoves(civInfo) + NextTurnAutomation().automateCivMoves(civInfo) } if(turns%10 == 0){ // every 10 turns add a barbarian in a random place diff --git a/core/src/com/unciv/logic/automation/Automation.kt b/core/src/com/unciv/logic/automation/Automation.kt index 2c8ea0db74..f8480e54c4 100644 --- a/core/src/com/unciv/logic/automation/Automation.kt +++ b/core/src/com/unciv/logic/automation/Automation.kt @@ -5,21 +5,15 @@ import com.unciv.logic.battle.CityCombatant import com.unciv.logic.city.CityConstructions import com.unciv.logic.city.CityInfo import com.unciv.logic.civilization.CivilizationInfo -import com.unciv.logic.map.MapUnit import com.unciv.logic.map.TileInfo -import com.unciv.logic.trade.TradeLogic -import com.unciv.logic.trade.TradeType -import com.unciv.models.gamebasics.GameBasics import com.unciv.models.gamebasics.unit.BaseUnit import com.unciv.models.gamebasics.unit.UnitType import com.unciv.ui.utils.getRandom import kotlin.math.max -import kotlin.math.min import kotlin.math.sqrt class Automation { - internal fun rankTile(tile: TileInfo, civInfo: CivilizationInfo): Float { val stats = tile.getTileStats(null, civInfo) var rank = 0.0f @@ -35,113 +29,7 @@ class Automation { return rank } - fun automateCivMoves(civInfo: CivilizationInfo) { - if (civInfo.tech.techsToResearch.isEmpty()) { - val researchableTechs = GameBasics.Technologies.values.filter { civInfo.tech.canBeResearched(it.name) } - val techToResearch = researchableTechs.groupBy { it.cost }.minBy { it.key }!!.value.getRandom() - civInfo.tech.techsResearched.add(techToResearch.name) - } - - while(civInfo.policies.canAdoptPolicy()){ - val adoptablePolicies = GameBasics.PolicyBranches.values.flatMap { it.policies.union(listOf(it))} - .filter { civInfo.policies.isAdoptable(it) } - val policyToAdopt = adoptablePolicies.getRandom() - civInfo.policies.adopt(policyToAdopt) - } - - // trade luxuries for luxuries if you can - for(otherCiv in civInfo.diplomacy.values.map { it.otherCiv() }.filterNot { it.isPlayerCivilization() }){ - val tradeLogic = TradeLogic(civInfo, otherCiv) - val ourTradableLuxuryResources = tradeLogic.ourAvailableOffers - .filter { it.type==TradeType.Luxury_Resource && it.amount>1 } - val theirTradableLuxuryResources = tradeLogic.theirAvailableOffers - .filter { it.type==TradeType.Luxury_Resource && it.amount>1 } - val weHaveTheyDont = ourTradableLuxuryResources - .filter { resource -> tradeLogic.theirAvailableOffers - .none { it.name==resource.name && it.type==TradeType.Luxury_Resource } } - val theyHaveWeDont = theirTradableLuxuryResources - .filter { resource -> tradeLogic.ourAvailableOffers - .none { it.name==resource.name && it.type==TradeType.Luxury_Resource } } - val numberOfTrades = min(weHaveTheyDont.size,theyHaveWeDont.size) - if(numberOfTrades>0){ - tradeLogic.currentTrade.ourOffers.addAll(weHaveTheyDont.take(numberOfTrades).map { it.copy(amount = 1) }) - tradeLogic.currentTrade.theirOffers.addAll(theyHaveWeDont.take(numberOfTrades).map { it.copy(amount = 1) }) - tradeLogic.acceptTrade() - } - } - - fun getMinDistanceBetweenCities(civ1:CivilizationInfo,civ2:CivilizationInfo): Int { - return civ1.cities.map { city -> civ2.cities.map { it.getCenterTile().arialDistanceTo(city.getCenterTile()) }.min()!! }.min()!! - } - - // Declare war? - if(civInfo.cities.isNotEmpty() && civInfo.diplomacy.isNotEmpty() - && !civInfo.isAtWar() - && civInfo.getCivUnits().filter { !it.baseUnit.unitType.isCivilian() }.size > civInfo.cities.size*2) { - - val enemyCivsByDistanceToOurs = civInfo.diplomacy.values.map { it.otherCiv() } - .filterNot { it == civInfo || it.cities.isEmpty() || !civInfo.diplomacy[it.civName]!!.canDeclareWar() } - .groupBy { getMinDistanceBetweenCities(civInfo,it) } - .toSortedMap() - val ourCombatStrength = evaluteCombatStrength(civInfo) - for (group in enemyCivsByDistanceToOurs){ - if(group.key>7) break - for(otherCiv in group.value){ - if(evaluteCombatStrength(otherCiv)*2() - val meleeUnits = mutableListOf() - val civilianUnits = mutableListOf() - - for (unit in civInfo.getCivUnits()) { - if(unit.promotions.canBePromoted()){ - val availablePromotions = unit.promotions.getAvailablePromotions() - if(availablePromotions.isNotEmpty()) - unit.promotions.addPromotion(availablePromotions.getRandom().name) - } - - val unitType = unit.baseUnit().unitType - if(unitType.isRanged()) rangedUnits.add(unit) - else if(unitType.isMelee()) meleeUnits.add(unit) - else civilianUnits.add(unit) - } - - for (unit in civilianUnits) UnitAutomation().automateUnitMoves(unit) // They move first so that combat units can accompany a settler - for (unit in rangedUnits) UnitAutomation().automateUnitMoves(unit) - for (unit in meleeUnits) UnitAutomation().automateUnitMoves(unit) - - - for (city in civInfo.cities) { - // reassign everyone from scratch - city.workedTiles.clear() - (0..city.population.population).forEach { city.population.autoAssignPopulation()} - chooseNextConstruction(city.cityConstructions) - if (city.health < city.getMaxHealth()) - trainCombatUnit(city) // override previous decision if city is under attack - } - - - // train settler? - if (civInfo.cities.any() - && civInfo.happiness > civInfo.cities.size +5 - && civInfo.getCivUnits().none { it.name == "Settler" } - && civInfo.cities.none { it.cityConstructions.currentConstruction == "Settler" }) { - - val bestCity = civInfo.cities.maxBy { it.cityStats.currentCityStats.production }!! - if(bestCity.cityConstructions.builtBuildings.size > 1) // 2 buildings or more, otherwisse focus on self first - bestCity.cityConstructions.currentConstruction = "Settler" - } - - } - - private fun trainCombatUnit(city: CityInfo) { + fun trainCombatUnit(city: CityInfo) { val combatUnits = city.cityConstructions.getConstructableUnits().filter { !it.unitType.isCivilian() } val chosenUnit: BaseUnit if(!city.civInfo.isAtWar() && city.civInfo.cities.any { it.getCenterTile().militaryUnit==null} diff --git a/core/src/com/unciv/logic/automation/NextTurnAutomation.kt b/core/src/com/unciv/logic/automation/NextTurnAutomation.kt new file mode 100644 index 0000000000..d2996b0b97 --- /dev/null +++ b/core/src/com/unciv/logic/automation/NextTurnAutomation.kt @@ -0,0 +1,137 @@ +package com.unciv.logic.automation + +import com.unciv.logic.civilization.CivilizationInfo +import com.unciv.logic.map.MapUnit +import com.unciv.logic.trade.TradeLogic +import com.unciv.logic.trade.TradeType +import com.unciv.models.gamebasics.GameBasics +import com.unciv.ui.utils.getRandom +import kotlin.math.min + +class NextTurnAutomation(){ + + fun automateCivMoves(civInfo: CivilizationInfo) { + chooseTechToResearch(civInfo) + adoptPolicy(civInfo) + exchangeLuxuries(civInfo) + declareWar(civInfo) + automateUnits(civInfo) + reassignWorkedTiles(civInfo) + trainSettler(civInfo) + } + + private fun chooseTechToResearch(civInfo: CivilizationInfo) { + if (civInfo.tech.techsToResearch.isEmpty()) { + val researchableTechs = GameBasics.Technologies.values.filter { civInfo.tech.canBeResearched(it.name) } + val techToResearch = researchableTechs.groupBy { it.cost }.minBy { it.key }!!.value.getRandom() + civInfo.tech.techsResearched.add(techToResearch.name) + } + } + + private fun adoptPolicy(civInfo: CivilizationInfo) { + while (civInfo.policies.canAdoptPolicy()) { + val adoptablePolicies = GameBasics.PolicyBranches.values.flatMap { it.policies.union(listOf(it)) } + .filter { civInfo.policies.isAdoptable(it) } + val policyToAdopt = adoptablePolicies.getRandom() + civInfo.policies.adopt(policyToAdopt) + } + } + + private fun exchangeLuxuries(civInfo: CivilizationInfo) { + for (otherCiv in civInfo.diplomacy.values.map { it.otherCiv() }.filterNot { it.isPlayerCivilization() }) { + val tradeLogic = TradeLogic(civInfo, otherCiv) + val ourTradableLuxuryResources = tradeLogic.ourAvailableOffers + .filter { it.type == TradeType.Luxury_Resource && it.amount > 1 } + val theirTradableLuxuryResources = tradeLogic.theirAvailableOffers + .filter { it.type == TradeType.Luxury_Resource && it.amount > 1 } + val weHaveTheyDont = ourTradableLuxuryResources + .filter { resource -> + tradeLogic.theirAvailableOffers + .none { it.name == resource.name && it.type == TradeType.Luxury_Resource } + } + val theyHaveWeDont = theirTradableLuxuryResources + .filter { resource -> + tradeLogic.ourAvailableOffers + .none { it.name == resource.name && it.type == TradeType.Luxury_Resource } + } + val numberOfTrades = min(weHaveTheyDont.size, theyHaveWeDont.size) + if (numberOfTrades > 0) { + tradeLogic.currentTrade.ourOffers.addAll(weHaveTheyDont.take(numberOfTrades).map { it.copy(amount = 1) }) + tradeLogic.currentTrade.theirOffers.addAll(theyHaveWeDont.take(numberOfTrades).map { it.copy(amount = 1) }) + tradeLogic.acceptTrade() + } + } + } + + fun getMinDistanceBetweenCities(civ1: CivilizationInfo, civ2: CivilizationInfo): Int { + return civ1.cities.map { city -> civ2.cities.map { it.getCenterTile().arialDistanceTo(city.getCenterTile()) }.min()!! }.min()!! + } + + private fun declareWar(civInfo: CivilizationInfo) { + if (civInfo.cities.isNotEmpty() && civInfo.diplomacy.isNotEmpty() + && !civInfo.isAtWar() + && civInfo.getCivUnits().filter { !it.baseUnit.unitType.isCivilian() }.size > civInfo.cities.size * 2) { + + val enemyCivsByDistanceToOurs = civInfo.diplomacy.values.map { it.otherCiv() } + .filterNot { it == civInfo || it.cities.isEmpty() || !civInfo.diplomacy[it.civName]!!.canDeclareWar() } + .groupBy { getMinDistanceBetweenCities(civInfo, it) } + .toSortedMap() + val ourCombatStrength = Automation().evaluteCombatStrength(civInfo) + for (group in enemyCivsByDistanceToOurs) { + if (group.key > 7) break + for (otherCiv in group.value) { + if (Automation().evaluteCombatStrength(otherCiv) * 2 < ourCombatStrength) { + civInfo.diplomacy[otherCiv.civName]!!.declareWar() + break + } + } + } + } + } + + private fun automateUnits(civInfo: CivilizationInfo) { + val rangedUnits = mutableListOf() + val meleeUnits = mutableListOf() + val civilianUnits = mutableListOf() + + for (unit in civInfo.getCivUnits()) { + if (unit.promotions.canBePromoted()) { + val availablePromotions = unit.promotions.getAvailablePromotions() + if (availablePromotions.isNotEmpty()) + unit.promotions.addPromotion(availablePromotions.getRandom().name) + } + + val unitType = unit.baseUnit().unitType + if (unitType.isRanged()) rangedUnits.add(unit) + else if (unitType.isMelee()) meleeUnits.add(unit) + else civilianUnits.add(unit) + } + + for (unit in civilianUnits) UnitAutomation().automateUnitMoves(unit) // They move first so that combat units can accompany a settler + for (unit in rangedUnits) UnitAutomation().automateUnitMoves(unit) + for (unit in meleeUnits) UnitAutomation().automateUnitMoves(unit) + } + + private fun reassignWorkedTiles(civInfo: CivilizationInfo) { + for (city in civInfo.cities) { + city.workedTiles.clear() + (0..city.population.population).forEach { city.population.autoAssignPopulation() } + Automation().chooseNextConstruction(city.cityConstructions) + if (city.health < city.getMaxHealth()) + Automation().trainCombatUnit(city) // override previous decision if city is under attack + } + } + + private fun trainSettler(civInfo: CivilizationInfo) { + if (civInfo.cities.any() + && civInfo.happiness > civInfo.cities.size + 5 + && civInfo.getCivUnits().none { it.name == "Settler" } + && civInfo.cities.none { it.cityConstructions.currentConstruction == "Settler" }) { + + val bestCity = civInfo.cities.maxBy { it.cityStats.currentCityStats.production }!! + if (bestCity.cityConstructions.builtBuildings.size > 1) // 2 buildings or more, otherwisse focus on self first + bestCity.cityConstructions.currentConstruction = "Settler" + } + } + +} \ No newline at end of file