Added Japan civ!

Some units now recieve promotions when created/upgraded to, as per Civ V
This commit is contained in:
Yair Morgenstern 2019-03-02 21:27:35 +02:00
parent f3cbeb5ca4
commit 58e38ea634
19 changed files with 253 additions and 198 deletions

View file

@ -37,6 +37,7 @@ All the following are from [the Noun Project](https://thenounproject.com) licenc
* [Longbow](https://thenounproject.com/search/?q=longbow&i=815991) By Hamish for Longbowman
* [Trebuchet](https://thenounproject.com/search/?q=Trebuchet&i=827987) By Ben Davis
* [Sword](https://thenounproject.com/search/?q=Sword&i=1432662) By uzeir syarief for Longswordsman
* [Samurai](https://thenounproject.com/search/?q=samurai&i=1683729) By Chanut is Industries
* [Spear](https://thenounproject.com/search/?q=Spear&i=1233840) By Alvaro Cabrera for Pikeman
* [Knight](https://thenounproject.com/search/?q=Knight&i=30912) By Tyler Glaude

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

View file

@ -412,161 +412,161 @@ BuildingIcons/SS Stasis Chamber
index: -1
BuildingIcons/Seaport
rotate: false
xy: 1814, 620
xy: 1916, 620
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
BuildingIcons/Sistine Chapel
rotate: false
xy: 653, 520
xy: 551, 418
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
BuildingIcons/Solar Plant
rotate: false
xy: 755, 520
xy: 551, 316
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
BuildingIcons/Spaceship Factory
rotate: false
xy: 551, 316
xy: 653, 418
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
BuildingIcons/Stable
rotate: false
xy: 755, 418
xy: 959, 520
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
BuildingIcons/Stadium
rotate: false
xy: 959, 520
xy: 755, 316
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
BuildingIcons/Statue of Liberty
rotate: false
xy: 755, 316
xy: 857, 418
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
BuildingIcons/Stock Exchange
rotate: false
xy: 857, 316
xy: 959, 418
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
BuildingIcons/Stone Works
rotate: false
xy: 1163, 520
xy: 959, 316
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
BuildingIcons/Stonehenge
rotate: false
xy: 959, 316
xy: 1061, 418
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
BuildingIcons/Sydney Opera House
rotate: false
xy: 1163, 316
xy: 1265, 418
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
BuildingIcons/Taj Mahal
rotate: false
xy: 1265, 418
xy: 1265, 316
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
BuildingIcons/Temple
rotate: false
xy: 1367, 519
xy: 1367, 417
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
BuildingIcons/The Great Library
rotate: false
xy: 1367, 417
xy: 1367, 315
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
BuildingIcons/The Great Lighthouse
rotate: false
xy: 1367, 315
xy: 1469, 518
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
BuildingIcons/The Louvre
rotate: false
xy: 1469, 518
xy: 1469, 416
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
BuildingIcons/The Oracle
rotate: false
xy: 1469, 416
xy: 1571, 518
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
BuildingIcons/The Pyramids
rotate: false
xy: 1571, 518
xy: 1571, 416
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
BuildingIcons/Theatre
rotate: false
xy: 1673, 518
xy: 1673, 416
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
BuildingIcons/University
rotate: false
xy: 1877, 416
xy: 1469, 314
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
BuildingIcons/Walls
rotate: false
xy: 1571, 314
xy: 1673, 314
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
BuildingIcons/Windmill
rotate: false
xy: 438, 203
xy: 438, 101
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
BuildingIcons/Workshop
rotate: false
xy: 755, 214
xy: 857, 214
size: 100, 100
orig: 100, 100
offset: 0, 0
@ -762,7 +762,7 @@ ImprovementIcons/Road
index: -1
ImprovementIcons/Trading post
rotate: false
xy: 1775, 518
xy: 1775, 416
size: 100, 100
orig: 100, 100
offset: 0, 0
@ -839,14 +839,14 @@ OtherIcons/Pillage
index: -1
OtherIcons/Shield
rotate: false
xy: 449, 408
xy: 449, 306
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
OtherIcons/Sleep
rotate: false
xy: 551, 418
xy: 755, 520
size: 100, 100
orig: 100, 100
offset: 0, 0
@ -860,7 +860,7 @@ OtherIcons/Star
index: -1
OtherIcons/Stop
rotate: false
xy: 1061, 418
xy: 1265, 520
size: 100, 100
orig: 100, 100
offset: 0, 0
@ -909,7 +909,7 @@ PolicyIcons/Civil Society
index: -1
PolicyIcons/Collective Rule
rotate: false
xy: 959, 264
xy: 1061, 264
size: 50, 50
orig: 50, 50
offset: 0, 0
@ -930,14 +930,14 @@ PolicyIcons/Democracy
index: -1
PolicyIcons/Discipline
rotate: false
xy: 1011, 264
xy: 1113, 264
size: 50, 50
orig: 50, 50
offset: 0, 0
index: -1
StatIcons/Strength
rotate: false
xy: 1011, 264
xy: 1113, 264
size: 50, 50
orig: 50, 50
offset: 0, 0
@ -951,224 +951,224 @@ PolicyIcons/Entrepreneurship
index: -1
PolicyIcons/Facism
rotate: false
xy: 1063, 264
xy: 1165, 264
size: 50, 50
orig: 50, 50
offset: 0, 0
index: -1
PolicyIcons/Free Religion
rotate: false
xy: 1115, 264
xy: 1217, 264
size: 50, 50
orig: 50, 50
offset: 0, 0
index: -1
PolicyIcons/Free Speech
rotate: false
xy: 1167, 264
xy: 1269, 264
size: 50, 50
orig: 50, 50
offset: 0, 0
index: -1
PolicyIcons/Free Thought
rotate: false
xy: 1219, 264
xy: 1061, 212
size: 50, 50
orig: 50, 50
offset: 0, 0
index: -1
PolicyIcons/Humanism
rotate: false
xy: 1271, 264
xy: 1113, 212
size: 50, 50
orig: 50, 50
offset: 0, 0
index: -1
PolicyIcons/Landed Elite
rotate: false
xy: 959, 212
xy: 1165, 212
size: 50, 50
orig: 50, 50
offset: 0, 0
index: -1
PolicyIcons/Legalism
rotate: false
xy: 1011, 212
xy: 1217, 212
size: 50, 50
orig: 50, 50
offset: 0, 0
index: -1
PolicyIcons/Mandate Of Heaven
rotate: false
xy: 1063, 212
xy: 1269, 212
size: 50, 50
orig: 50, 50
offset: 0, 0
index: -1
PolicyIcons/Mercantilism
rotate: false
xy: 1115, 212
xy: 492, 49
size: 50, 50
orig: 50, 50
offset: 0, 0
index: -1
PolicyIcons/Meritocracy
rotate: false
xy: 1167, 212
xy: 1966, 1588
size: 50, 50
orig: 50, 50
offset: 0, 0
index: -1
PolicyIcons/Militarism
rotate: false
xy: 1219, 212
xy: 1966, 1536
size: 50, 50
orig: 50, 50
offset: 0, 0
index: -1
PolicyIcons/Military Caste
rotate: false
xy: 1271, 212
xy: 1966, 1484
size: 50, 50
orig: 50, 50
offset: 0, 0
index: -1
PolicyIcons/Military Tradition
rotate: false
xy: 492, 49
xy: 1966, 1432
size: 50, 50
orig: 50, 50
offset: 0, 0
index: -1
PolicyIcons/Monarchy
rotate: false
xy: 1966, 1588
xy: 1966, 1380
size: 50, 50
orig: 50, 50
offset: 0, 0
index: -1
PolicyIcons/Oligarchy
rotate: false
xy: 1966, 1484
xy: 1966, 1276
size: 50, 50
orig: 50, 50
offset: 0, 0
index: -1
PolicyIcons/Organized Religion
rotate: false
xy: 1966, 1432
xy: 1966, 1224
size: 50, 50
orig: 50, 50
offset: 0, 0
index: -1
PolicyIcons/Patronage
rotate: false
xy: 1966, 1380
xy: 1966, 1172
size: 50, 50
orig: 50, 50
offset: 0, 0
index: -1
PolicyIcons/Police State
rotate: false
xy: 1966, 1328
xy: 1966, 1120
size: 50, 50
orig: 50, 50
offset: 0, 0
index: -1
PolicyIcons/Populism
rotate: false
xy: 1966, 1276
xy: 1966, 1068
size: 50, 50
orig: 50, 50
offset: 0, 0
index: -1
PolicyIcons/Professional Army
rotate: false
xy: 1966, 1224
xy: 1966, 1016
size: 50, 50
orig: 50, 50
offset: 0, 0
index: -1
PolicyIcons/Protectionism
rotate: false
xy: 1966, 1172
xy: 1966, 964
size: 50, 50
orig: 50, 50
offset: 0, 0
index: -1
PolicyIcons/Reformation
rotate: false
xy: 1966, 1068
xy: 540, 110
size: 50, 50
orig: 50, 50
offset: 0, 0
index: -1
PolicyIcons/Representation
rotate: false
xy: 1966, 1016
xy: 592, 162
size: 50, 50
orig: 50, 50
offset: 0, 0
index: -1
PolicyIcons/Republic
rotate: false
xy: 1966, 964
xy: 592, 110
size: 50, 50
orig: 50, 50
offset: 0, 0
index: -1
PolicyIcons/Scientific Revolution
rotate: false
xy: 540, 162
xy: 644, 162
size: 50, 50
orig: 50, 50
offset: 0, 0
index: -1
PolicyIcons/Secularism
rotate: false
xy: 540, 110
xy: 644, 110
size: 50, 50
orig: 50, 50
offset: 0, 0
index: -1
PolicyIcons/Sovereignty
rotate: false
xy: 592, 162
xy: 696, 162
size: 50, 50
orig: 50, 50
offset: 0, 0
index: -1
PolicyIcons/Theocracy
rotate: false
xy: 592, 110
xy: 696, 110
size: 50, 50
orig: 50, 50
offset: 0, 0
index: -1
PolicyIcons/Total War
rotate: false
xy: 644, 162
xy: 748, 162
size: 50, 50
orig: 50, 50
offset: 0, 0
index: -1
PolicyIcons/Trade Unions
rotate: false
xy: 644, 110
xy: 748, 110
size: 50, 50
orig: 50, 50
offset: 0, 0
index: -1
PolicyIcons/Universal Suffrage
rotate: false
xy: 696, 162
xy: 800, 162
size: 50, 50
orig: 50, 50
offset: 0, 0
index: -1
PolicyIcons/Warrior Code
rotate: false
xy: 696, 110
xy: 800, 110
size: 50, 50
orig: 50, 50
offset: 0, 0
@ -1301,70 +1301,70 @@ ResourceIcons/Pearls
index: -1
ResourceIcons/Sheep
rotate: false
xy: 449, 510
xy: 449, 408
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
ResourceIcons/Silk
rotate: false
xy: 449, 306
xy: 551, 520
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
ResourceIcons/Silver
rotate: false
xy: 551, 520
xy: 653, 520
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
ResourceIcons/Spices
rotate: false
xy: 653, 316
xy: 755, 418
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
ResourceIcons/Stone
rotate: false
xy: 959, 418
xy: 1163, 520
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
ResourceIcons/Sugar
rotate: false
xy: 1061, 316
xy: 1163, 418
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
ResourceIcons/Uranium
rotate: false
xy: 1469, 314
xy: 1571, 314
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
ResourceIcons/Whales
rotate: false
xy: 1775, 314
xy: 1877, 314
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
ResourceIcons/Wheat
rotate: false
xy: 1877, 314
xy: 438, 203
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
ResourceIcons/Wine
rotate: false
xy: 438, 101
xy: 551, 214
size: 100, 100
orig: 100, 100
offset: 0, 0
@ -1427,7 +1427,7 @@ StatIcons/Malcontent
index: -1
StatIcons/Movement
rotate: false
xy: 1966, 1536
xy: 1966, 1328
size: 50, 50
orig: 50, 50
offset: 0, 0
@ -1448,7 +1448,7 @@ StatIcons/Production
index: -1
StatIcons/RangedStrength
rotate: false
xy: 1966, 1120
xy: 540, 162
size: 50, 50
orig: 50, 50
offset: 0, 0
@ -1469,7 +1469,7 @@ StatIcons/Science
index: -1
StatIcons/Specialist
rotate: false
xy: 857, 520
xy: 653, 316
size: 100, 100
orig: 100, 100
offset: 0, 0
@ -1938,56 +1938,56 @@ TechIcons/Sailing
index: -1
TechIcons/Satellites
rotate: false
xy: 1508, 620
xy: 1610, 620
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
TechIcons/Scientific Theory
rotate: false
xy: 1610, 620
xy: 1712, 620
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
TechIcons/Steam Power
rotate: false
xy: 857, 418
xy: 1061, 520
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
TechIcons/Steel
rotate: false
xy: 1061, 520
xy: 857, 316
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
TechIcons/The Wheel
rotate: false
xy: 1571, 416
xy: 1673, 518
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
TechIcons/Theology
rotate: false
xy: 1673, 416
xy: 1775, 518
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
TechIcons/Trapping
rotate: false
xy: 1775, 416
xy: 1877, 518
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
TechIcons/Writing
rotate: false
xy: 857, 214
xy: 959, 214
size: 100, 100
orig: 100, 100
offset: 0, 0
@ -2370,51 +2370,58 @@ UnitIcons/Rocket Artillery
orig: 100, 100
offset: 0, 0
index: -1
UnitIcons/Samurai
rotate: false
xy: 1508, 620
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
UnitIcons/Scout
rotate: false
xy: 1712, 620
xy: 1814, 620
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
UnitIcons/Settler
rotate: false
xy: 1916, 620
xy: 449, 510
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
UnitIcons/Spearman
rotate: false
xy: 653, 418
xy: 857, 520
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
UnitIcons/Submarine
rotate: false
xy: 1265, 520
xy: 1061, 316
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
UnitIcons/Swordsman
rotate: false
xy: 1163, 418
xy: 1163, 316
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
UnitIcons/Tank
rotate: false
xy: 1265, 316
xy: 1367, 519
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
UnitIcons/Trebuchet
rotate: false
xy: 1877, 518
xy: 1877, 416
size: 100, 100
orig: 100, 100
offset: 0, 0
@ -2428,21 +2435,21 @@ UnitIcons/Trireme
index: -1
UnitIcons/Warrior
rotate: false
xy: 1673, 314
xy: 1775, 314
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
UnitIcons/Work Boats
rotate: false
xy: 551, 214
xy: 653, 214
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
UnitIcons/Worker
rotate: false
xy: 653, 214
xy: 755, 214
size: 100, 100
orig: 100, 100
offset: 0, 0
@ -2540,105 +2547,105 @@ UnitPromotionIcons/Bombardment_I_(Civ5)
index: -1
UnitPromotionIcons/Charge_(Civ5)
rotate: false
xy: 1323, 294
xy: 1321, 294
size: 20, 20
orig: 20, 20
offset: 0, 0
index: -1
UnitPromotionIcons/Coastal_Raider_III_(Civ5)
rotate: false
xy: 1345, 294
xy: 2015, 1822
size: 20, 20
orig: 20, 20
offset: 0, 0
index: -1
UnitPromotionIcons/Coastal_Raider_II_(Civ5)
rotate: false
xy: 2015, 1822
xy: 1966, 942
size: 20, 20
orig: 20, 20
offset: 0, 0
index: -1
UnitPromotionIcons/Coastal_Raider_I_(Civ5)
rotate: false
xy: 1966, 942
xy: 852, 192
size: 20, 20
orig: 20, 20
offset: 0, 0
index: -1
UnitPromotionIcons/Cover_II_(Civ5)
rotate: false
xy: 748, 192
xy: 1531, 1952
size: 20, 20
orig: 20, 20
offset: 0, 0
index: -1
UnitPromotionIcons/Cover_I_(Civ5)
rotate: false
xy: 1531, 1952
xy: 2018, 678
size: 20, 20
orig: 20, 20
offset: 0, 0
index: -1
UnitPromotionIcons/Drill_III_(Civ5)
rotate: false
xy: 2018, 678
xy: 1979, 576
size: 20, 20
orig: 20, 20
offset: 0, 0
index: -1
UnitPromotionIcons/Drill_II_(Civ5)
rotate: false
xy: 1979, 576
xy: 1981, 1952
size: 20, 20
orig: 20, 20
offset: 0, 0
index: -1
UnitPromotionIcons/Drill_I_(Civ5)
rotate: false
xy: 1981, 1952
xy: 2003, 1974
size: 20, 20
orig: 20, 20
offset: 0, 0
index: -1
UnitPromotionIcons/Formation_II_(Civ5)
rotate: false
xy: 2003, 1974
xy: 336, 5
size: 20, 20
orig: 20, 20
offset: 0, 0
index: -1
UnitPromotionIcons/Formation_I_(Civ5)
rotate: false
xy: 336, 5
xy: 358, 27
size: 20, 20
orig: 20, 20
offset: 0, 0
index: -1
UnitPromotionIcons/Indirect_Fire_(Civ5)
rotate: false
xy: 358, 27
xy: 106, 24
size: 20, 20
orig: 20, 20
offset: 0, 0
index: -1
UnitPromotionIcons/Logistics_(Civ5)
rotate: false
xy: 106, 24
xy: 106, 2
size: 20, 20
orig: 20, 20
offset: 0, 0
index: -1
UnitPromotionIcons/March_(Civ5)
rotate: false
xy: 106, 2
xy: 1343, 294
size: 20, 20
orig: 20, 20
offset: 0, 0
index: -1
UnitPromotionIcons/Mobility_(Civ5)
rotate: false
xy: 1323, 272
xy: 1321, 272
size: 20, 20
orig: 20, 20
offset: 0, 0
@ -2659,14 +2666,14 @@ UnitPromotionIcons/Scouting_III_(Civ5)
index: -1
UnitPromotionIcons/Scouting_II_(Civ5)
rotate: false
xy: 748, 170
xy: 852, 170
size: 20, 20
orig: 20, 20
offset: 0, 0
index: -1
UnitPromotionIcons/Scouting_I_(Civ5)
rotate: false
xy: 770, 192
xy: 874, 192
size: 20, 20
orig: 20, 20
offset: 0, 0
@ -2708,49 +2715,49 @@ UnitPromotionIcons/Siege_(Civ5)
index: -1
UnitPromotionIcons/Targeting_III_(Civ5)
rotate: false
xy: 1323, 250
xy: 1321, 250
size: 20, 20
orig: 20, 20
offset: 0, 0
index: -1
UnitPromotionIcons/Targeting_II_(Civ5)
rotate: false
xy: 1345, 272
xy: 1343, 272
size: 20, 20
orig: 20, 20
offset: 0, 0
index: -1
UnitPromotionIcons/Targeting_I_(Civ5)
rotate: false
xy: 1367, 293
xy: 2015, 1778
size: 20, 20
orig: 20, 20
offset: 0, 0
index: -1
UnitPromotionIcons/Volley_(Civ5)
rotate: false
xy: 2015, 1778
xy: 852, 148
size: 20, 20
orig: 20, 20
offset: 0, 0
index: -1
UnitPromotionIcons/Wolfpack_III_(Civ5)
rotate: false
xy: 748, 148
xy: 874, 170
size: 20, 20
orig: 20, 20
offset: 0, 0
index: -1
UnitPromotionIcons/Wolfpack_II_(Civ5)
rotate: false
xy: 770, 170
xy: 896, 192
size: 20, 20
orig: 20, 20
offset: 0, 0
index: -1
UnitPromotionIcons/Wolfpack_I_(Civ5)
rotate: false
xy: 792, 192
xy: 2018, 634
size: 20, 20
orig: 20, 20
offset: 0, 0

Binary file not shown.

Before

Width:  |  Height:  |  Size: 878 KiB

After

Width:  |  Height:  |  Size: 885 KiB

View file

@ -319,6 +319,36 @@
"Portland","St. Louis","Miami","Buffalo","Detroit","New Orleans","Baltimore","Denver","Cincinnati","Dallas","Memphis",
"Cleveland","Kansas City","San Diego","Richmond","Las Vegas","Phoenix","Albuquerque","Minneapolis","Pittsburgh"]
},
{
name:"Japan",
leaderName:"Oda Nobunaga",
startIntroPart1: "Blessings upon you, noble Oda Nobunaga, ruler of Japan, the land of the Rising Sun! May you long walk among its flowering blossoms. The Japanese are an island people, proud and pious with a rich culture of arts and letters. Your civilization stretches back thousands of years, years of bloody warfare, expansion and isolation, great wealth and great poverty. In addition to their prowess on the frield of battle, your people are also immensely industious, and their technological innovation and mighty factories are the envy of lesser people everywhere."
startIntroPart2: "Legendary damiyo, will you grab the reins of destiny? Will you bring your family and people the honor and glory they deserve? Will you once again pick up the sword and march to triumph? Will you build a civilization that stands the test of time?"
declaringWar:"I hereby inform you of our intention to wipe out your civilization from this world."
attacked:"Pitiful fool! Now we shall destroy you!"
defeated:"You were much wiser than I thought."
introduction:"We hope for a fair and just relationship with you, who are renowned for military bravery."
neutralHello:"Hello."
neutralLetsHearIt:["Go on.","Proceed.","I'm listening."]
neutralNo:["Sorry.","No.","Maybe another time."]
neutralYes:["Very well.","Agreed.","Hai. (Yes)"]
hateHello:"Oh, it's you..."
hateLetsHearIt:["Let me hear it.","Go on","Proceed"]
hateNo:["Hya. (No)","Excuse me?","Maybe another time"]
hateYes:["I agree.","Oh... very well.","There is probably no other way."]
afterPeace:"It was an honor to fight you."
tradeRequest:"I would be grateful if you agreed on the following proposal."
mainColor:[215,225,225],
secondaryColor:[185,0,0],
unique: "Units fight as though they were at full strength even when damaged",
cities:["Kyoto","Osaka","Tokyo","Satsuma","Kagoshima","Nara","Nagoya","Izumo","Nagasaki","Yokohama","Shimonoseki","Matsuyama","Sapporo","Hakodate","Ise","Toyama","Fukushima","Suo","Bizen","Echizen","Izumi","Omi","Echigo","Kozuke","Sado","Kobe","Nagano","Hiroshima","Takayama","Akita","Fukuoka","Aomori","Kamakura","Kochi","Naha","Sendai","Gifu","Hakodate","Ota","Tottori"]
},
/*
{
name:"Germany",
@ -447,36 +477,6 @@
unique:"Melee units cost 50% less maintenance, and all units require 25% less experience to earn their next promotion.",
cities:["Ulundi","Umugungundlovu","Nobamba","Bulawayo","KwaDukuza","Nongoma","oNdini","Nodwengu","Ndonakusuka","Babanango","Khangela","KwaHlomendlini","Hlobane","eThekwini","Mlambongwenya","Eziqwaqweni","eMangweni","Isiphezi","Masotsheni","Mtunzini","Nyakamubi","Dumazulu","Hlatikulu","Mthonjaneni","Empangeni","Pongola","Tugela","Kwamashi","Ingwavuma","Hluhluwe","Matubatuba","Mhlahlandlela","Mthatha","Maseru","Lobamba","Qunu"]
},
{
name:"Japan",
leaderName:"Oda Nobunaga",
startIntroPart1: "Blessings upon you, noble Oda Nobunaga, ruler of Japan, the land of the Rising Sun! May you long walk among its flowering blossoms. The Japanese are an island people, proud and pious with a rich culture of arts and letters. Your civilization stretches back thousands of years, years of bloody warfare, expansion and isolation, great wealth and great poverty. In addition to their prowess on the frield of battle, your people are also immensely industious, and their technological innovation and mighty factories are the envy of lesser people everywhere."
startIntroPart2: "Legendary damiyo, will you grab the reins of destiny? Will you bring your family and people the honor and glory they deserve? Will you once again pick up the sword and march to triumph? Will you build a civilization that stands the test of time?"
declaringWar:"I hereby inform you of our intention to wipe out your civilization from this world."
attacked:"Pitiful fool! Now we shall destroy you!"
defeated:"You were much wiser than I thought."
introduction:"We hope for a fair and just relationship with you, who are renowned for military bravery."
neutralHello:"Hello."
neutralLetsHearIt:["Go on.","Proceed.","I'm listening."]
neutralNo:["Sorry.","No.","Maybe another time."]
neutralYes:["Very well.","Agreed.","Hai. (Yes)"]
hateHello:"Oh, it's you..."
hateLetsHearIt:["Let me hear it.","Go on","Proceed"]
hateNo:["Hya. (No)","Excuse me?","Maybe another time"]
hateYes:["I agree.","Oh... very well.","There is probably no other way."]
afterPeace:"It was an honor to fight you."
tradeRequest:"I would be grateful if you agreed on the following proposal."
mainColor:[255,255,255],
secondaryColor:[255,0,0],
unique:"Units fight as though they were at full strength even when damaged. You gain +1 Culture from each Fishing Boat, and +2 Culture from each Atoll.",
cities:["Kyoto","Osaka","Tokyo","Satsuma","Kagoshima","Nara","Nagoya","Izumo","Nagasaki","Yokohama","Shimonoseki","Matsuyama","Sapporo","Hakodate","Ise","Toyama","Fukushima","Suo","Bizen","Echizen","Izumi","Omi","Echigo","Kozuke","Sado","Kobe","Nagano","Hiroshima","Takayama","Akita","Fukuoka","Aomori","Kamakura","Kochi","Naha","Sendai","Gifu","Hakodate","Ota","Tottori"]
},
{
name:"Incan",
leaderName:"Pachacuti",

View file

@ -3872,6 +3872,7 @@
French:"Arabie"
}
"America":{
Italian:"Stati Uniti"
Romanian:"Statele Unite"
@ -3888,9 +3889,15 @@
German:"Alle militärischen Landeinheiten haben +1 Sicht; 50% niedrigerer Preis beim Kauf von Feldern"
French:"Toutes les unités terrestres ont +1 porté de vision, les cases coutent 50% de leurs prix à l'achat"
}
"Uniques:":{
"Japan":{}
"Units fight as though they were at full strength even when damaged":{}
"Uniques":{ // unit uniques, displayed on the new game screen when choosing a civ
Italian:"Abilità unica"
}
"Promotions":{}
"units in rough terrain:":{
Italian:"unità in terreno accidentato"
}
@ -7476,7 +7483,7 @@
}
" OR ":{// as in "Requires Accuracy I OR Barrage I
Italian:"O"
Italian:" O "
}
"Accuracy I":{

View file

@ -226,7 +226,7 @@
{
name:"Longbowman",
unitType:"Ranged",
range:3,
range:2,
movement:2,
strength:13,
rangedStrength:18,
@ -236,6 +236,7 @@
requiredTech:"Machinery",
upgradesTo:"Gatling Gun",
obsoleteTech:"Industrialization",
promotions:["Range"],
hurryCostModifier:20,
attackSound:"arrow"
},
@ -266,6 +267,23 @@
hurryCostModifier:20,
attackSound:"metalhit"
},
{
name:"Samurai",
replaces:"Longswordsman",
uniqueTo:"Japan",
unitType:"Melee",
movement:2,
strength:21,
cost: 120,
requiredTech:"Steel",
upgradesTo:"Musketman",
obsoleteTech:"Gunpowder",
requiredResource:"Iron",
uniques:["Combat very likely to create Great Generals"]
promotions:["Shock I"]
hurryCostModifier:20,
attackSound:"metalhit"
},
{
name:"Pikeman",
unitType:"Melee",
@ -390,7 +408,8 @@
requiredTech:"Gunpowder",
upgradesTo:"Rifleman"
obsoleteTech:"Rifling",
uniques:["Bonus vs units in rough terrain 15%","Ignores terrain cost"]
uniques:["Ignores terrain cost"]
promotions:["Drill I"],
hurryCostModifier:20,
attackSound:"shot"
},

View file

@ -20,7 +20,7 @@ class UnCivGame : Game() {
val viewEntireMapForDebug = false
// For when you need to test something in an advanced game and don't have time to faff around
val superchargedForDebug = false
val superchargedForDebug = true
lateinit var worldScreen: WorldScreen

View file

@ -124,8 +124,8 @@ class UnitAutomation{
val tileCombatant = Battle(combatant.getCivInfo().gameInfo).getMapCombatantOfTile(tile)
if(tileCombatant==null) return false
if(tileCombatant.getCivilization()==combatant.getCivInfo() ) return false
if(!combatant.getCivInfo().isAtWarWith(tileCombatant.getCivilization())) return false
if(tileCombatant.getCivInfo()==combatant.getCivInfo() ) return false
if(!combatant.getCivInfo().isAtWarWith(tileCombatant.getCivInfo())) return false
//only submarine and destroyer can attack submarine
//garisoned submarine can be attacked by anyone, or the city will be in invincible

View file

@ -47,7 +47,7 @@ class Battle(val gameInfo:GameInfo) {
private fun postBattleAction(attacker: ICombatant, defender: ICombatant, attackedTile:TileInfo){
if(attacker.getCivilization()!=defender.getCivilization()) { // If what happened was that a civilian unit was captures, that's dealt with in the CaptureCilvilianUnit function
if(attacker.getCivInfo()!=defender.getCivInfo()) { // If what happened was that a civilian unit was captures, that's dealt with in the CaptureCilvilianUnit function
val whatHappenedString =
if (attacker !is CityCombatant && attacker.isDefeated()) " {was destroyed while attacking}"
else " has " + (if (defender.isDefeated()) "destroyed" else "attacked")
@ -58,7 +58,7 @@ class Battle(val gameInfo:GameInfo) {
if (defender.getUnitType() == UnitType.City) " [" + defender.getName()+"]"
else " our [" + defender.getName()+"]"
val notificationString = attackerString + whatHappenedString + defenderString
defender.getCivilization().addNotification(notificationString, attackedTile.position, Color.RED)
defender.getCivInfo().addNotification(notificationString, attackedTile.position, Color.RED)
}
@ -71,11 +71,11 @@ class Battle(val gameInfo:GameInfo) {
// we're a melee unit and we destroyed\captured an enemy unit
else if (attacker.isMelee()
&& (defender.isDefeated() || defender.getCivilization()==attacker.getCivilization() )
&& (defender.isDefeated() || defender.getCivInfo()==attacker.getCivInfo() )
// This is so that if we attack e.g. a barbarian in enemy territory that we can't enter, we won't enter it
&& (attacker as MapUnitCombatant).unit.canMoveTo(attackedTile)) {
// we destroyed an enemy military unit and there was a civilian unit in the same tile as well
if(attackedTile.civilianUnit!=null && attackedTile.civilianUnit!!.civInfo != attacker.getCivilization())
if(attackedTile.civilianUnit!=null && attackedTile.civilianUnit!!.civInfo != attacker.getCivInfo())
captureCivilianUnit(attacker,MapUnitCombatant(attackedTile.civilianUnit!!))
attacker.unit.moveToTile(attackedTile)
}
@ -98,16 +98,19 @@ class Battle(val gameInfo:GameInfo) {
// XP!
fun addXp(thisCombatant:ICombatant, amount:Int, otherCombatant:ICombatant){
if(thisCombatant !is MapUnitCombatant) return
if(thisCombatant.unit.promotions.totalXpProduced() >= 30 && otherCombatant.getCivilization().isBarbarianCivilization())
if(thisCombatant.unit.promotions.totalXpProduced() >= 30 && otherCombatant.getCivInfo().isBarbarianCivilization())
return
var amountToAdd = amount
if(thisCombatant.getCivilization().policies.isAdopted("Military Tradition")) amountToAdd = (amountToAdd * 1.5f).toInt()
if(thisCombatant.getCivInfo().policies.isAdopted("Military Tradition")) amountToAdd = (amountToAdd * 1.5f).toInt()
thisCombatant.unit.promotions.XP += amountToAdd
if(thisCombatant.getCivilization().getNation().unique
if(thisCombatant.getCivInfo().getNation().unique
== "Great general provides double combat bonus, and spawns 50% faster")
amountToAdd = (amountToAdd * 1.5f).toInt()
thisCombatant.getCivilization().greatPeople.greatGeneralPoints += amountToAdd
if(thisCombatant.unit.hasUnique("Combat very likely to create Great Generals"))
amountToAdd *= 2
thisCombatant.getCivInfo().greatPeople.greatGeneralPoints += amountToAdd
}
if(attacker.isMelee()){
@ -123,8 +126,8 @@ class Battle(val gameInfo:GameInfo) {
}
if(defender.isDefeated() && defender is MapUnitCombatant && !defender.getUnitType().isCivilian()
&& attacker.getCivilization().policies.isAdopted("Honor Complete"))
attacker.getCivilization().gold += defender.unit.baseUnit.getGoldCost(hashSetOf()) / 10
&& attacker.getCivInfo().policies.isAdopted("Honor Complete"))
attacker.getCivInfo().gold += defender.unit.baseUnit.getGoldCost(hashSetOf()) / 10
if(attacker is MapUnitCombatant && attacker.unit.action!=null && attacker.unit.action!!.startsWith("moveTo"))
attacker.unit.action=null
@ -132,14 +135,14 @@ class Battle(val gameInfo:GameInfo) {
private fun conquerCity(city: CityInfo, attacker: ICombatant) {
val enemyCiv = city.civInfo
attacker.getCivilization().addNotification("We have conquered the city of [${city.name}]!",city.location, Color.RED)
attacker.getCivInfo().addNotification("We have conquered the city of [${city.name}]!",city.location, Color.RED)
city.getCenterTile().apply {
if(militaryUnit!=null) militaryUnit!!.destroy()
if(civilianUnit!=null) captureCivilianUnit(attacker,MapUnitCombatant(civilianUnit!!))
}
if (attacker.getCivilization().isBarbarianCivilization()){
if (attacker.getCivInfo().isBarbarianCivilization()){
city.destroyCity()
}
else {
@ -149,12 +152,12 @@ class Battle(val gameInfo:GameInfo) {
city.health = city.getMaxHealth() / 2 // I think that cities recover to half health when conquered?
if(!attacker.getCivilization().policies.isAdopted("Police State")) {
if(!attacker.getCivInfo().policies.isAdopted("Police State")) {
city.expansion.cultureStored = 0
city.expansion.reset()
}
city.moveToCiv(attacker.getCivilization())
city.moveToCiv(attacker.getCivInfo())
city.resistanceCounter = city.population.population
city.cityStats.update()
}
@ -183,7 +186,7 @@ class Battle(val gameInfo:GameInfo) {
}
fun captureCivilianUnit(attacker: ICombatant, defender: ICombatant){
if(attacker.getCivilization().isBarbarianCivilization()){
if(attacker.getCivInfo().isBarbarianCivilization()){
defender.takeDamage(100)
return
} // barbarians don't capture civilians!
@ -192,6 +195,6 @@ class Battle(val gameInfo:GameInfo) {
defender.getTile().position, Color.RED)
capturedUnit.civInfo.removeUnit(capturedUnit)
capturedUnit.assignOwner(attacker.getCivilization())
capturedUnit.assignOwner(attacker.getCivInfo())
}
}

View file

@ -46,19 +46,19 @@ class BattleDamage{
}
//https://www.carlsguides.com/strategy/civilization5/war/combatbonuses.php
if (combatant.getCivilization().happiness < 0)
modifiers["Unhappiness"] = max(0.02f * combatant.getCivilization().happiness,-0.9f) // otherwise it could exceed -100% and start healing enemy units...
if (combatant.getCivInfo().happiness < 0)
modifiers["Unhappiness"] = max(0.02f * combatant.getCivInfo().happiness,-0.9f) // otherwise it could exceed -100% and start healing enemy units...
if(combatant.getCivilization().policies.isAdopted("Populism"))
if(combatant.getCivInfo().policies.isAdopted("Populism"))
modifiers["Populism"] = 0.25f
if(combatant.getCivilization().policies.isAdopted("Discipline") && combatant.isMelee()
if(combatant.getCivInfo().policies.isAdopted("Discipline") && combatant.isMelee()
&& combatant.getTile().neighbors.flatMap { it.getUnits() }
.any { it.civInfo==combatant.getCivilization() && !it.type.isCivilian()})
.any { it.civInfo==combatant.getCivInfo() && !it.type.isCivilian()})
modifiers["Discipline"] = 0.15f
val requiredResource = combatant.unit.baseUnit.requiredResource
if(requiredResource!=null && combatant.getCivilization().getCivResourcesByName()[requiredResource]!!<0){
if(requiredResource!=null && combatant.getCivInfo().getCivResourcesByName()[requiredResource]!!<0){
modifiers["Missing resource"]=-0.25f
}
@ -76,7 +76,7 @@ class BattleDamage{
}
}
if (combatant.getCivilization().policies.isAdopted("Honor") && enemy.getCivilization().isBarbarianCivilization())
if (combatant.getCivInfo().policies.isAdopted("Honor") && enemy.getCivInfo().isBarbarianCivilization())
modifiers["vs Barbarians"] = 0.25f
return modifiers
@ -119,7 +119,7 @@ class BattleDamage{
if (attacker.isMelee()) {
val numberOfAttackersSurroundingDefender = defender.getTile().neighbors.count {
it.militaryUnit != null
&& it.militaryUnit!!.owner == attacker.getCivilization().civName
&& it.militaryUnit!!.owner == attacker.getCivInfo().civName
&& MapUnitCombatant(it.militaryUnit!!).isMelee()
}
if (numberOfAttackersSurroundingDefender > 1)
@ -172,13 +172,15 @@ class BattleDamage{
private fun modifiersToMultiplicationBonus(modifiers: HashMap<String, Float>): Float {
// modifiers are like 0.1 for a 10% bonus, -0.1 for a 10% loss
var modifier = 1f
for (m in modifiers.values) modifier *= (1 + m)
return modifier
var finalModifier = 1f
for (modifierValue in modifiers.values) finalModifier *= (1 + modifierValue)
return finalModifier
}
private fun getHealthDependantDamageRatio(combatant: ICombatant): Float {
if (combatant.getUnitType() == UnitType.City) return 1f
if (combatant.getUnitType() == UnitType.City
|| combatant.getCivInfo().getNation().unique == "Units fight as though they were at full strength even when damaged")
return 1f
return 1/2f + combatant.getHealth()/200f // Each point of health reduces damage dealt by 0.5%
}

View file

@ -12,12 +12,11 @@ class CityCombatant(val city: CityInfo) : ICombatant {
}
override fun getHealth(): Int = city.health
override fun getCivilization(): CivilizationInfo = city.civInfo
override fun getCivInfo(): CivilizationInfo = city.civInfo
override fun getTile(): TileInfo = city.getCenterTile()
override fun getName(): String = city.name
override fun isDefeated(): Boolean = city.health==1
override fun isInvisible(): Boolean = false
override fun getCivInfo(): CivilizationInfo = city.civInfo
override fun canAttack(): Boolean = (!city.attackedThisTurn)
override fun takeDamage(damage: Int) {

View file

@ -13,10 +13,9 @@ interface ICombatant{
fun getDefendingStrength(): Int
fun takeDamage(damage:Int)
fun isDefeated():Boolean
fun getCivilization(): CivilizationInfo
fun getCivInfo(): CivilizationInfo
fun getTile(): TileInfo
fun isInvisible(): Boolean
fun getCivInfo(): CivilizationInfo
fun canAttack(): Boolean
fun isMelee(): Boolean {

View file

@ -8,12 +8,11 @@ import com.unciv.models.gamebasics.unit.UnitType
class MapUnitCombatant(val unit: MapUnit) : ICombatant {
override fun getHealth(): Int = unit.health
override fun getMaxHealth() = 100
override fun getCivilization(): CivilizationInfo = unit.civInfo
override fun getCivInfo(): CivilizationInfo = unit.civInfo
override fun getTile(): TileInfo = unit.getTile()
override fun getName(): String = unit.name
override fun isDefeated(): Boolean = unit.health <= 0
override fun isInvisible(): Boolean = unit.isInvisible()
override fun getCivInfo(): CivilizationInfo = unit.civInfo
override fun canAttack(): Boolean = unit.canAttack()
override fun takeDamage(damage: Int) {

View file

@ -86,6 +86,10 @@ class TileMap {
// only once we know the unit can be placed do we add it to the civ's unit list
unit.putInTile(unitToPlaceTile)
unit.currentMovement = unit.getMaxMovement().toFloat()
// Only once we add the unit to the civ we can activate addPromotion, because it will try to update civ viewable tiles
for(promotion in unit.baseUnit.promotions)
unit.promotions.addPromotion(promotion,true)
}
else civInfo.removeUnit(unit) // since we added it to the civ units in the previous assignOwner

View file

@ -11,6 +11,9 @@ import com.unciv.models.gamebasics.tr
import com.unciv.models.stats.INamed
// This is BaseUnit because Unit is already a base Kotlin class and to avoid mixing the two up
/** This is the basic info of the units, as specified in Units.json,
in contrast to MapUnit, which is a specific unit of a certain type that appears on the map */
class BaseUnit : INamed, IConstruction, ICivilopedia {
override lateinit var name: String
@ -25,6 +28,7 @@ class BaseUnit : INamed, IConstruction, ICivilopedia {
var requiredTech:String? = null
var requiredResource:String? = null
var uniques =HashSet<String>()
var promotions =HashSet<String>()
var obsoleteTech:String?=null
var upgradesTo:String? = null
var replaces:String?=null
@ -40,9 +44,10 @@ class BaseUnit : INamed, IConstruction, ICivilopedia {
fun getShortDescription(): String {
val infoList= mutableListOf<String>()
for(unique in uniques){
for(unique in uniques)
infoList+=Translations.translateBonusOrPenalty(unique)
}
for(promotion in promotions)
infoList += promotion.tr()
if(strength!=0) infoList += "{Strength}: $strength".tr()
if(rangedStrength!=0) infoList += "{Ranged strength}: $rangedStrength".tr()
if(movement!=2) infoList+="{Movement}: $movement".tr()
@ -67,9 +72,12 @@ class BaseUnit : INamed, IConstruction, ICivilopedia {
sb.appendln()
}
for(unique in uniques) {
for(unique in uniques)
sb.appendln(unique.tr())
}
for(promotion in promotions)
sb.appendln(promotion.tr())
sb.appendln("{Movement}: $movement".tr())
return sb.toString()
}
@ -77,7 +85,9 @@ class BaseUnit : INamed, IConstruction, ICivilopedia {
fun getMapUnit(): MapUnit {
val unit = MapUnit()
unit.name = name
unit.setTransients() // must be after setting name because it sets the baseUnit according to the name
return unit
}

View file

@ -76,10 +76,10 @@ class NationTable(val nation: Nation, val newGameParameters: GameParameters, ski
textList+= " {Range} " + unit.range+ " vs " + originalUnit.range
if (unit.movement!= originalUnit.movement)
textList+= " {Movement} " + unit.movement+ " vs " + originalUnit.movement
val newUniques = unit.uniques.filterNot { it in originalUnit.uniques }
if(newUniques.isNotEmpty())
textList+=" {Uniques}: "+newUniques.joinToString{ Translations.translateBonusOrPenalty(it) }
textList+=""
for(unique in unit.uniques.filterNot { it in originalUnit.uniques })
textList += " "+Translations.translateBonusOrPenalty(unique)
for(promotions in unit.promotions.filter { it !in originalUnit.promotions})
textList += " "+promotions.tr()
}

View file

@ -49,9 +49,9 @@ class BattleTable(val worldScreen: WorldScreen): Table() {
val defender: ICombatant? = Battle(worldScreen.gameInfo).getMapCombatantOfTile(selectedTile)
if(defender==null ||
defender.getCivilization()==worldScreen.currentPlayerCiv
defender.getCivInfo()==worldScreen.currentPlayerCiv
|| !(UnCivGame.Current.viewEntireMapForDebug
|| attacker.getCivilization().exploredTiles.contains(selectedTile.position))) {
|| attacker.getCivInfo().exploredTiles.contains(selectedTile.position))) {
hide()
return
}

View file

@ -76,6 +76,11 @@ class UnitActions {
val newunit = unit.civInfo.placeUnitNearTile(unitTile.position, upgradedUnit.name)
newunit.health = unit.health
newunit.promotions = unit.promotions
for(promotion in unit.baseUnit.promotions)
if(promotion !in newunit.promotions.promotions)
newunit.promotions.addPromotion(promotion,true)
newunit.updateUniques()
newunit.currentMovement = 0f
worldScreen.shouldUpdate = true