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

View File

@ -3872,6 +3872,7 @@
French:"Arabie" French:"Arabie"
} }
"America":{ "America":{
Italian:"Stati Uniti" Italian:"Stati Uniti"
Romanian:"Statele Unite" Romanian:"Statele Unite"
@ -3888,9 +3889,15 @@
German:"Alle militärischen Landeinheiten haben +1 Sicht; 50% niedrigerer Preis beim Kauf von Feldern" 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" 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" Italian:"Abilità unica"
} }
"Promotions":{}
"units in rough terrain:":{ "units in rough terrain:":{
Italian:"unità in terreno accidentato" Italian:"unità in terreno accidentato"
} }
@ -7476,7 +7483,7 @@
} }
" OR ":{// as in "Requires Accuracy I OR Barrage I " OR ":{// as in "Requires Accuracy I OR Barrage I
Italian:"O" Italian:" O "
} }
"Accuracy I":{ "Accuracy I":{

View File

@ -226,7 +226,7 @@
{ {
name:"Longbowman", name:"Longbowman",
unitType:"Ranged", unitType:"Ranged",
range:3, range:2,
movement:2, movement:2,
strength:13, strength:13,
rangedStrength:18, rangedStrength:18,
@ -236,6 +236,7 @@
requiredTech:"Machinery", requiredTech:"Machinery",
upgradesTo:"Gatling Gun", upgradesTo:"Gatling Gun",
obsoleteTech:"Industrialization", obsoleteTech:"Industrialization",
promotions:["Range"],
hurryCostModifier:20, hurryCostModifier:20,
attackSound:"arrow" attackSound:"arrow"
}, },
@ -266,6 +267,23 @@
hurryCostModifier:20, hurryCostModifier:20,
attackSound:"metalhit" 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", name:"Pikeman",
unitType:"Melee", unitType:"Melee",
@ -390,7 +408,8 @@
requiredTech:"Gunpowder", requiredTech:"Gunpowder",
upgradesTo:"Rifleman" upgradesTo:"Rifleman"
obsoleteTech:"Rifling", obsoleteTech:"Rifling",
uniques:["Bonus vs units in rough terrain 15%","Ignores terrain cost"] uniques:["Ignores terrain cost"]
promotions:["Drill I"],
hurryCostModifier:20, hurryCostModifier:20,
attackSound:"shot" attackSound:"shot"
}, },

View File

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

View File

@ -124,8 +124,8 @@ class UnitAutomation{
val tileCombatant = Battle(combatant.getCivInfo().gameInfo).getMapCombatantOfTile(tile) val tileCombatant = Battle(combatant.getCivInfo().gameInfo).getMapCombatantOfTile(tile)
if(tileCombatant==null) return false if(tileCombatant==null) return false
if(tileCombatant.getCivilization()==combatant.getCivInfo() ) return false if(tileCombatant.getCivInfo()==combatant.getCivInfo() ) return false
if(!combatant.getCivInfo().isAtWarWith(tileCombatant.getCivilization())) return false if(!combatant.getCivInfo().isAtWarWith(tileCombatant.getCivInfo())) return false
//only submarine and destroyer can attack submarine //only submarine and destroyer can attack submarine
//garisoned submarine can be attacked by anyone, or the city will be in invincible //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){ 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 = val whatHappenedString =
if (attacker !is CityCombatant && attacker.isDefeated()) " {was destroyed while attacking}" if (attacker !is CityCombatant && attacker.isDefeated()) " {was destroyed while attacking}"
else " has " + (if (defender.isDefeated()) "destroyed" else "attacked") else " has " + (if (defender.isDefeated()) "destroyed" else "attacked")
@ -58,7 +58,7 @@ class Battle(val gameInfo:GameInfo) {
if (defender.getUnitType() == UnitType.City) " [" + defender.getName()+"]" if (defender.getUnitType() == UnitType.City) " [" + defender.getName()+"]"
else " our [" + defender.getName()+"]" else " our [" + defender.getName()+"]"
val notificationString = attackerString + whatHappenedString + defenderString 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 // we're a melee unit and we destroyed\captured an enemy unit
else if (attacker.isMelee() 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 // 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)) { && (attacker as MapUnitCombatant).unit.canMoveTo(attackedTile)) {
// we destroyed an enemy military unit and there was a civilian unit in the same tile as well // 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!!)) captureCivilianUnit(attacker,MapUnitCombatant(attackedTile.civilianUnit!!))
attacker.unit.moveToTile(attackedTile) attacker.unit.moveToTile(attackedTile)
} }
@ -98,16 +98,19 @@ class Battle(val gameInfo:GameInfo) {
// XP! // XP!
fun addXp(thisCombatant:ICombatant, amount:Int, otherCombatant:ICombatant){ fun addXp(thisCombatant:ICombatant, amount:Int, otherCombatant:ICombatant){
if(thisCombatant !is MapUnitCombatant) return if(thisCombatant !is MapUnitCombatant) return
if(thisCombatant.unit.promotions.totalXpProduced() >= 30 && otherCombatant.getCivilization().isBarbarianCivilization()) if(thisCombatant.unit.promotions.totalXpProduced() >= 30 && otherCombatant.getCivInfo().isBarbarianCivilization())
return return
var amountToAdd = amount 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 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") == "Great general provides double combat bonus, and spawns 50% faster")
amountToAdd = (amountToAdd * 1.5f).toInt() 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()){ if(attacker.isMelee()){
@ -123,8 +126,8 @@ class Battle(val gameInfo:GameInfo) {
} }
if(defender.isDefeated() && defender is MapUnitCombatant && !defender.getUnitType().isCivilian() if(defender.isDefeated() && defender is MapUnitCombatant && !defender.getUnitType().isCivilian()
&& attacker.getCivilization().policies.isAdopted("Honor Complete")) && attacker.getCivInfo().policies.isAdopted("Honor Complete"))
attacker.getCivilization().gold += defender.unit.baseUnit.getGoldCost(hashSetOf()) / 10 attacker.getCivInfo().gold += defender.unit.baseUnit.getGoldCost(hashSetOf()) / 10
if(attacker is MapUnitCombatant && attacker.unit.action!=null && attacker.unit.action!!.startsWith("moveTo")) if(attacker is MapUnitCombatant && attacker.unit.action!=null && attacker.unit.action!!.startsWith("moveTo"))
attacker.unit.action=null attacker.unit.action=null
@ -132,14 +135,14 @@ class Battle(val gameInfo:GameInfo) {
private fun conquerCity(city: CityInfo, attacker: ICombatant) { private fun conquerCity(city: CityInfo, attacker: ICombatant) {
val enemyCiv = city.civInfo 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 { city.getCenterTile().apply {
if(militaryUnit!=null) militaryUnit!!.destroy() if(militaryUnit!=null) militaryUnit!!.destroy()
if(civilianUnit!=null) captureCivilianUnit(attacker,MapUnitCombatant(civilianUnit!!)) if(civilianUnit!=null) captureCivilianUnit(attacker,MapUnitCombatant(civilianUnit!!))
} }
if (attacker.getCivilization().isBarbarianCivilization()){ if (attacker.getCivInfo().isBarbarianCivilization()){
city.destroyCity() city.destroyCity()
} }
else { 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? 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.cultureStored = 0
city.expansion.reset() city.expansion.reset()
} }
city.moveToCiv(attacker.getCivilization()) city.moveToCiv(attacker.getCivInfo())
city.resistanceCounter = city.population.population city.resistanceCounter = city.population.population
city.cityStats.update() city.cityStats.update()
} }
@ -183,7 +186,7 @@ class Battle(val gameInfo:GameInfo) {
} }
fun captureCivilianUnit(attacker: ICombatant, defender: ICombatant){ fun captureCivilianUnit(attacker: ICombatant, defender: ICombatant){
if(attacker.getCivilization().isBarbarianCivilization()){ if(attacker.getCivInfo().isBarbarianCivilization()){
defender.takeDamage(100) defender.takeDamage(100)
return return
} // barbarians don't capture civilians! } // barbarians don't capture civilians!
@ -192,6 +195,6 @@ class Battle(val gameInfo:GameInfo) {
defender.getTile().position, Color.RED) defender.getTile().position, Color.RED)
capturedUnit.civInfo.removeUnit(capturedUnit) 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 //https://www.carlsguides.com/strategy/civilization5/war/combatbonuses.php
if (combatant.getCivilization().happiness < 0) if (combatant.getCivInfo().happiness < 0)
modifiers["Unhappiness"] = max(0.02f * combatant.getCivilization().happiness,-0.9f) // otherwise it could exceed -100% and start healing enemy units... 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 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() } && 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 modifiers["Discipline"] = 0.15f
val requiredResource = combatant.unit.baseUnit.requiredResource 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 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 modifiers["vs Barbarians"] = 0.25f
return modifiers return modifiers
@ -119,7 +119,7 @@ class BattleDamage{
if (attacker.isMelee()) { if (attacker.isMelee()) {
val numberOfAttackersSurroundingDefender = defender.getTile().neighbors.count { val numberOfAttackersSurroundingDefender = defender.getTile().neighbors.count {
it.militaryUnit != null it.militaryUnit != null
&& it.militaryUnit!!.owner == attacker.getCivilization().civName && it.militaryUnit!!.owner == attacker.getCivInfo().civName
&& MapUnitCombatant(it.militaryUnit!!).isMelee() && MapUnitCombatant(it.militaryUnit!!).isMelee()
} }
if (numberOfAttackersSurroundingDefender > 1) if (numberOfAttackersSurroundingDefender > 1)
@ -172,13 +172,15 @@ class BattleDamage{
private fun modifiersToMultiplicationBonus(modifiers: HashMap<String, Float>): Float { private fun modifiersToMultiplicationBonus(modifiers: HashMap<String, Float>): Float {
// modifiers are like 0.1 for a 10% bonus, -0.1 for a 10% loss // modifiers are like 0.1 for a 10% bonus, -0.1 for a 10% loss
var modifier = 1f var finalModifier = 1f
for (m in modifiers.values) modifier *= (1 + m) for (modifierValue in modifiers.values) finalModifier *= (1 + modifierValue)
return modifier return finalModifier
} }
private fun getHealthDependantDamageRatio(combatant: ICombatant): Float { 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% 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 getHealth(): Int = city.health
override fun getCivilization(): CivilizationInfo = city.civInfo override fun getCivInfo(): CivilizationInfo = city.civInfo
override fun getTile(): TileInfo = city.getCenterTile() override fun getTile(): TileInfo = city.getCenterTile()
override fun getName(): String = city.name override fun getName(): String = city.name
override fun isDefeated(): Boolean = city.health==1 override fun isDefeated(): Boolean = city.health==1
override fun isInvisible(): Boolean = false override fun isInvisible(): Boolean = false
override fun getCivInfo(): CivilizationInfo = city.civInfo
override fun canAttack(): Boolean = (!city.attackedThisTurn) override fun canAttack(): Boolean = (!city.attackedThisTurn)
override fun takeDamage(damage: Int) { override fun takeDamage(damage: Int) {

View File

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

View File

@ -8,12 +8,11 @@ import com.unciv.models.gamebasics.unit.UnitType
class MapUnitCombatant(val unit: MapUnit) : ICombatant { class MapUnitCombatant(val unit: MapUnit) : ICombatant {
override fun getHealth(): Int = unit.health override fun getHealth(): Int = unit.health
override fun getMaxHealth() = 100 override fun getMaxHealth() = 100
override fun getCivilization(): CivilizationInfo = unit.civInfo override fun getCivInfo(): CivilizationInfo = unit.civInfo
override fun getTile(): TileInfo = unit.getTile() override fun getTile(): TileInfo = unit.getTile()
override fun getName(): String = unit.name override fun getName(): String = unit.name
override fun isDefeated(): Boolean = unit.health <= 0 override fun isDefeated(): Boolean = unit.health <= 0
override fun isInvisible(): Boolean = unit.isInvisible() override fun isInvisible(): Boolean = unit.isInvisible()
override fun getCivInfo(): CivilizationInfo = unit.civInfo
override fun canAttack(): Boolean = unit.canAttack() override fun canAttack(): Boolean = unit.canAttack()
override fun takeDamage(damage: Int) { 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 // only once we know the unit can be placed do we add it to the civ's unit list
unit.putInTile(unitToPlaceTile) unit.putInTile(unitToPlaceTile)
unit.currentMovement = unit.getMaxMovement().toFloat() 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 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 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 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 { class BaseUnit : INamed, IConstruction, ICivilopedia {
override lateinit var name: String override lateinit var name: String
@ -25,6 +28,7 @@ class BaseUnit : INamed, IConstruction, ICivilopedia {
var requiredTech:String? = null var requiredTech:String? = null
var requiredResource:String? = null var requiredResource:String? = null
var uniques =HashSet<String>() var uniques =HashSet<String>()
var promotions =HashSet<String>()
var obsoleteTech:String?=null var obsoleteTech:String?=null
var upgradesTo:String? = null var upgradesTo:String? = null
var replaces:String?=null var replaces:String?=null
@ -40,9 +44,10 @@ class BaseUnit : INamed, IConstruction, ICivilopedia {
fun getShortDescription(): String { fun getShortDescription(): String {
val infoList= mutableListOf<String>() val infoList= mutableListOf<String>()
for(unique in uniques){ for(unique in uniques)
infoList+=Translations.translateBonusOrPenalty(unique) infoList+=Translations.translateBonusOrPenalty(unique)
} for(promotion in promotions)
infoList += promotion.tr()
if(strength!=0) infoList += "{Strength}: $strength".tr() if(strength!=0) infoList += "{Strength}: $strength".tr()
if(rangedStrength!=0) infoList += "{Ranged strength}: $rangedStrength".tr() if(rangedStrength!=0) infoList += "{Ranged strength}: $rangedStrength".tr()
if(movement!=2) infoList+="{Movement}: $movement".tr() if(movement!=2) infoList+="{Movement}: $movement".tr()
@ -67,9 +72,12 @@ class BaseUnit : INamed, IConstruction, ICivilopedia {
sb.appendln() sb.appendln()
} }
for(unique in uniques) { for(unique in uniques)
sb.appendln(unique.tr()) sb.appendln(unique.tr())
}
for(promotion in promotions)
sb.appendln(promotion.tr())
sb.appendln("{Movement}: $movement".tr()) sb.appendln("{Movement}: $movement".tr())
return sb.toString() return sb.toString()
} }
@ -77,7 +85,9 @@ class BaseUnit : INamed, IConstruction, ICivilopedia {
fun getMapUnit(): MapUnit { fun getMapUnit(): MapUnit {
val unit = MapUnit() val unit = MapUnit()
unit.name = name unit.name = name
unit.setTransients() // must be after setting name because it sets the baseUnit according to the name unit.setTransients() // must be after setting name because it sets the baseUnit according to the name
return unit return unit
} }

View File

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

View File

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

View File

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