Add guided missile which acts differently from nuclear missile. (#3957)

* Add guided missile which acts differently from nuclear missile.

* Clean png.
This commit is contained in:
Duan Tao 2021-05-20 17:33:39 +08:00 committed by GitHub
parent 11c8a67596
commit 3d062e3424
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 89 additions and 81 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@ -1,8 +1,8 @@
BuildingIcons.png
size: 2048,1024
size: 2048, 1024
format: RGBA8888
filter: MipMapLinearLinear,MipMapLinearLinear
filter: MipMapLinearLinear, MipMapLinearLinear
repeat: none
Alhambra
rotate: false

Binary file not shown.

Before

Width:  |  Height:  |  Size: 210 KiB

After

Width:  |  Height:  |  Size: 236 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 112 KiB

After

Width:  |  Height:  |  Size: 120 KiB

View File

@ -1,8 +1,8 @@
UnitIcons.png
size: 2048,512
size: 2048, 512
format: RGBA8888
filter: MipMapLinearLinear,MipMapLinearLinear
filter: MipMapLinearLinear, MipMapLinearLinear
repeat: none
Anti-Aircraft Gun
rotate: false
@ -256,188 +256,195 @@ Great War Infantry
orig: 100, 100
offset: 0, 0
index: -1
Helicopter Gunship
Guided Missile
rotate: false
xy: 614, 104
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
Hoplite
Helicopter Gunship
rotate: false
xy: 614, 2
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
Horseman
Hoplite
rotate: false
xy: 716, 206
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
Hwach'a
Horseman
rotate: false
xy: 818, 308
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
Infantry
Hwach'a
rotate: false
xy: 920, 410
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
Ironclad
Infantry
rotate: false
xy: 716, 104
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
Jaguar
Ironclad
rotate: false
xy: 716, 2
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
Janissary
Jaguar
rotate: false
xy: 818, 206
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
Jet Fighter
Janissary
rotate: false
xy: 920, 308
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
Keshik
Jet Fighter
rotate: false
xy: 1022, 410
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
Khan
Keshik
rotate: false
xy: 818, 104
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
Knight
Khan
rotate: false
xy: 818, 2
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
Lancer
Knight
rotate: false
xy: 920, 206
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
Landship
Lancer
rotate: false
xy: 1022, 308
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
Landsknecht
Landship
rotate: false
xy: 1124, 410
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
Legion
Landsknecht
rotate: false
xy: 920, 104
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
Longbowman
Legion
rotate: false
xy: 920, 2
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
Longswordsman
Longbowman
rotate: false
xy: 1022, 206
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
Machine Gun
Longswordsman
rotate: false
xy: 1124, 308
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
Mandekalu Cavalry
Machine Gun
rotate: false
xy: 1226, 410
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
Maori Warrior
Mandekalu Cavalry
rotate: false
xy: 1022, 104
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
Mechanized Infantry
Maori Warrior
rotate: false
xy: 1022, 2
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
Minuteman
Mechanized Infantry
rotate: false
xy: 1124, 206
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
Modern Armor
Minuteman
rotate: false
xy: 1226, 308
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
Mohawk Warrior
Modern Armor
rotate: false
xy: 1328, 410
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
Musketeer
Mohawk Warrior
rotate: false
xy: 1124, 104
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
Musketeer
rotate: false
xy: 1124, 2
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
Musketman
rotate: false
xy: 1226, 207
@ -447,210 +454,210 @@ Musketman
index: -1
Naresuan's Elephant
rotate: false
xy: 1124, 2
xy: 1328, 308
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
Norwegian Ski Infantry
rotate: false
xy: 1328, 308
xy: 1430, 410
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
Nuclear Missile
rotate: false
xy: 1430, 410
xy: 1226, 105
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
Panzer
rotate: false
xy: 1226, 105
xy: 1328, 206
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
Persian Immortal
rotate: false
xy: 1328, 206
xy: 1430, 308
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
Pikeman
rotate: false
xy: 1430, 308
xy: 1532, 410
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
Rifleman
rotate: false
xy: 1532, 410
xy: 1226, 3
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
Rocket Artillery
rotate: false
xy: 1226, 3
xy: 1328, 104
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
Samurai
rotate: false
xy: 1328, 104
xy: 1328, 2
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
Scout
rotate: false
xy: 1328, 2
xy: 1430, 206
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
Settler
rotate: false
xy: 1430, 206
xy: 1532, 308
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
Ship of the Line
rotate: false
xy: 1532, 308
xy: 1634, 410
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
Sipahi
rotate: false
xy: 1634, 410
xy: 1430, 104
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
Slinger
rotate: false
xy: 1430, 104
xy: 1430, 2
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
Spearman
rotate: false
xy: 1430, 2
xy: 1532, 206
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
Stealth Bomber
rotate: false
xy: 1532, 206
xy: 1634, 308
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
Submarine
rotate: false
xy: 1634, 308
xy: 1736, 410
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
Swordsman
rotate: false
xy: 1736, 410
xy: 1532, 104
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
Tank
rotate: false
xy: 1532, 104
xy: 1532, 2
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
Tercio
rotate: false
xy: 1532, 2
xy: 1634, 206
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
Trebuchet
rotate: false
xy: 1634, 206
xy: 1736, 308
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
Triplane
rotate: false
xy: 1736, 308
xy: 1838, 410
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
Trireme
rotate: false
xy: 1838, 409
xy: 1634, 103
size: 100, 101
orig: 100, 101
offset: 0, 0
index: -1
Turtle Ship
rotate: false
xy: 1634, 104
xy: 1736, 206
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
War Chariot
rotate: false
xy: 1634, 2
xy: 1838, 308
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
War Elephant
rotate: false
xy: 1736, 206
xy: 1940, 410
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
Warrior
rotate: false
xy: 1838, 307
xy: 1736, 104
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
Work Boats
rotate: false
xy: 1940, 410
xy: 1736, 2
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
Worker
rotate: false
xy: 1736, 104
xy: 1838, 206
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
Zero
rotate: false
xy: 1736, 2
xy: 1940, 308
size: 100, 100
orig: 100, 100
offset: 0, 0

Binary file not shown.

Before

Width:  |  Height:  |  Size: 240 KiB

After

Width:  |  Height:  |  Size: 278 KiB

View File

@ -160,14 +160,14 @@ ImprovementIcons/Quarry
index: -1
ImprovementIcons/Railroad
rotate: false
xy: 1326, 1152
xy: 1224, 948
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
TileSets/Default/Railroad
rotate: false
xy: 1326, 1152
xy: 1224, 948
size: 100, 100
orig: 100, 100
offset: 0, 0
@ -1644,7 +1644,7 @@ TechIcons/Radio
index: -1
TechIcons/Railroad
rotate: false
xy: 1224, 948
xy: 1326, 1152
size: 100, 100
orig: 100, 100
offset: 0, 0

Binary file not shown.

Before

Width:  |  Height:  |  Size: 962 KiB

After

Width:  |  Height:  |  Size: 962 KiB

View File

@ -1054,7 +1054,7 @@
// Plane rather than a missile - can be based in city or Carrier only. But cannot be intercepted because of a civ 5 bug that was never fixed.
// Single-use like missile
// No strength/rangedStrength tags in civ 5 xmls. Instead has NukeDamageLevel = 1 tag (Nuclear Missile has NukeDamageLevel = 2)
},
}, */
{
"name": "Guided Missile",
"unitType": "Missile",
@ -1063,11 +1063,9 @@
"rangedStrength": 60,
"range": 8,
"cost": 150,
"requiredTech": "Satellites"
// don't cost Maintenance, but count towards the limit of air units in city
// requiredTech "Advanced ballistics" in expansions
"requiredTech": "Rocketry",
"uniques": ["Self-destructs when attacking"]
},
*/
{
"name": "Nuclear Missile",
"unitType": "Missile",
@ -1078,7 +1076,7 @@
"cost": 1000,
"requiredTech": "Rocketry",
"requiredResource": "Uranium",
"uniques": ["Nuclear weapon", "Requires [Manhattan Project]"]
"uniques": ["Self-destructs when attacking", "Nuclear weapon", "Requires [Manhattan Project]"]
},
{
"name": "Landship",

View File

@ -311,18 +311,19 @@ object SpecificUnitAutomation {
// This really needs to be changed, to have better targetting for missiles
fun automateMissile(unit: MapUnit) {
val tilesInRange = unit.currentTile.getTilesInDistance(unit.getRange() * 2)
for (tile in tilesInRange) {
// For now AI will only use nukes against cities because in all honesty that's the best use for them.
if (tile.isCityCenter() && tile.getOwner()!!.isAtWarWith(unit.civInfo)) {
Battle.nuke(MapUnitCombatant(unit), tile)
return
val tilesInRange = unit.currentTile.getTilesInDistance(unit.getRange())
if (unit.hasUnique("Nuclear weapon")) {
for (tile in tilesInRange) {
// For now AI will only use nukes against cities because in all honesty that's the best use for them.
if (tile.isCityCenter() && tile.getOwner()!!.isAtWarWith(unit.civInfo)) {
Battle.nuke(MapUnitCombatant(unit), tile)
return
}
}
} else { //Guided Missile
if (BattleHelper.tryAttackNearbyEnemy(unit)) return
}
val immediatelyReachableCities = tilesInRange
.filter { unit.movement.canMoveTo(it) }

View File

@ -415,7 +415,9 @@ object Battle {
}
// Instead of postBattleAction() just destroy the missile, all other functions are not relevant
(attacker as MapUnitCombatant).unit.destroy()
if ((attacker as MapUnitCombatant).unit.hasUnique("Self-destructs when attacking")) {
(attacker as MapUnitCombatant).unit.destroy()
}
}
private fun tryInterceptAirAttack(attacker: MapUnitCombatant, defender: ICombatant) {

View File

@ -43,7 +43,7 @@ class BattleTable(val worldScreen: WorldScreen): Table() {
val attacker = tryGetAttacker()
if(attacker==null || !worldScreen.canChangeState){ hide(); return }
if (attacker.getUnitType()==UnitType.Missile) {
if (attacker is MapUnitCombatant && attacker.unit.hasUnique("Nuclear weapon")) {
val selectedTile = worldScreen.mapHolder.selectedTile
if (selectedTile == null) { hide(); return } // no selected tile
simulateNuke(attacker as MapUnitCombatant, selectedTile)