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 BuildingIcons.png
size: 2048,1024 size: 2048, 1024
format: RGBA8888 format: RGBA8888
filter: MipMapLinearLinear,MipMapLinearLinear filter: MipMapLinearLinear, MipMapLinearLinear
repeat: none repeat: none
Alhambra Alhambra
rotate: false 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 UnitIcons.png
size: 2048,512 size: 2048, 512
format: RGBA8888 format: RGBA8888
filter: MipMapLinearLinear,MipMapLinearLinear filter: MipMapLinearLinear, MipMapLinearLinear
repeat: none repeat: none
Anti-Aircraft Gun Anti-Aircraft Gun
rotate: false rotate: false
@ -256,188 +256,195 @@ Great War Infantry
orig: 100, 100 orig: 100, 100
offset: 0, 0 offset: 0, 0
index: -1 index: -1
Helicopter Gunship Guided Missile
rotate: false rotate: false
xy: 614, 104 xy: 614, 104
size: 100, 100 size: 100, 100
orig: 100, 100 orig: 100, 100
offset: 0, 0 offset: 0, 0
index: -1 index: -1
Hoplite Helicopter Gunship
rotate: false rotate: false
xy: 614, 2 xy: 614, 2
size: 100, 100 size: 100, 100
orig: 100, 100 orig: 100, 100
offset: 0, 0 offset: 0, 0
index: -1 index: -1
Horseman Hoplite
rotate: false rotate: false
xy: 716, 206 xy: 716, 206
size: 100, 100 size: 100, 100
orig: 100, 100 orig: 100, 100
offset: 0, 0 offset: 0, 0
index: -1 index: -1
Hwach'a Horseman
rotate: false rotate: false
xy: 818, 308 xy: 818, 308
size: 100, 100 size: 100, 100
orig: 100, 100 orig: 100, 100
offset: 0, 0 offset: 0, 0
index: -1 index: -1
Infantry Hwach'a
rotate: false rotate: false
xy: 920, 410 xy: 920, 410
size: 100, 100 size: 100, 100
orig: 100, 100 orig: 100, 100
offset: 0, 0 offset: 0, 0
index: -1 index: -1
Ironclad Infantry
rotate: false rotate: false
xy: 716, 104 xy: 716, 104
size: 100, 100 size: 100, 100
orig: 100, 100 orig: 100, 100
offset: 0, 0 offset: 0, 0
index: -1 index: -1
Jaguar Ironclad
rotate: false rotate: false
xy: 716, 2 xy: 716, 2
size: 100, 100 size: 100, 100
orig: 100, 100 orig: 100, 100
offset: 0, 0 offset: 0, 0
index: -1 index: -1
Janissary Jaguar
rotate: false rotate: false
xy: 818, 206 xy: 818, 206
size: 100, 100 size: 100, 100
orig: 100, 100 orig: 100, 100
offset: 0, 0 offset: 0, 0
index: -1 index: -1
Jet Fighter Janissary
rotate: false rotate: false
xy: 920, 308 xy: 920, 308
size: 100, 100 size: 100, 100
orig: 100, 100 orig: 100, 100
offset: 0, 0 offset: 0, 0
index: -1 index: -1
Keshik Jet Fighter
rotate: false rotate: false
xy: 1022, 410 xy: 1022, 410
size: 100, 100 size: 100, 100
orig: 100, 100 orig: 100, 100
offset: 0, 0 offset: 0, 0
index: -1 index: -1
Khan Keshik
rotate: false rotate: false
xy: 818, 104 xy: 818, 104
size: 100, 100 size: 100, 100
orig: 100, 100 orig: 100, 100
offset: 0, 0 offset: 0, 0
index: -1 index: -1
Knight Khan
rotate: false rotate: false
xy: 818, 2 xy: 818, 2
size: 100, 100 size: 100, 100
orig: 100, 100 orig: 100, 100
offset: 0, 0 offset: 0, 0
index: -1 index: -1
Lancer Knight
rotate: false rotate: false
xy: 920, 206 xy: 920, 206
size: 100, 100 size: 100, 100
orig: 100, 100 orig: 100, 100
offset: 0, 0 offset: 0, 0
index: -1 index: -1
Landship Lancer
rotate: false rotate: false
xy: 1022, 308 xy: 1022, 308
size: 100, 100 size: 100, 100
orig: 100, 100 orig: 100, 100
offset: 0, 0 offset: 0, 0
index: -1 index: -1
Landsknecht Landship
rotate: false rotate: false
xy: 1124, 410 xy: 1124, 410
size: 100, 100 size: 100, 100
orig: 100, 100 orig: 100, 100
offset: 0, 0 offset: 0, 0
index: -1 index: -1
Legion Landsknecht
rotate: false rotate: false
xy: 920, 104 xy: 920, 104
size: 100, 100 size: 100, 100
orig: 100, 100 orig: 100, 100
offset: 0, 0 offset: 0, 0
index: -1 index: -1
Longbowman Legion
rotate: false rotate: false
xy: 920, 2 xy: 920, 2
size: 100, 100 size: 100, 100
orig: 100, 100 orig: 100, 100
offset: 0, 0 offset: 0, 0
index: -1 index: -1
Longswordsman Longbowman
rotate: false rotate: false
xy: 1022, 206 xy: 1022, 206
size: 100, 100 size: 100, 100
orig: 100, 100 orig: 100, 100
offset: 0, 0 offset: 0, 0
index: -1 index: -1
Machine Gun Longswordsman
rotate: false rotate: false
xy: 1124, 308 xy: 1124, 308
size: 100, 100 size: 100, 100
orig: 100, 100 orig: 100, 100
offset: 0, 0 offset: 0, 0
index: -1 index: -1
Mandekalu Cavalry Machine Gun
rotate: false rotate: false
xy: 1226, 410 xy: 1226, 410
size: 100, 100 size: 100, 100
orig: 100, 100 orig: 100, 100
offset: 0, 0 offset: 0, 0
index: -1 index: -1
Maori Warrior Mandekalu Cavalry
rotate: false rotate: false
xy: 1022, 104 xy: 1022, 104
size: 100, 100 size: 100, 100
orig: 100, 100 orig: 100, 100
offset: 0, 0 offset: 0, 0
index: -1 index: -1
Mechanized Infantry Maori Warrior
rotate: false rotate: false
xy: 1022, 2 xy: 1022, 2
size: 100, 100 size: 100, 100
orig: 100, 100 orig: 100, 100
offset: 0, 0 offset: 0, 0
index: -1 index: -1
Minuteman Mechanized Infantry
rotate: false rotate: false
xy: 1124, 206 xy: 1124, 206
size: 100, 100 size: 100, 100
orig: 100, 100 orig: 100, 100
offset: 0, 0 offset: 0, 0
index: -1 index: -1
Modern Armor Minuteman
rotate: false rotate: false
xy: 1226, 308 xy: 1226, 308
size: 100, 100 size: 100, 100
orig: 100, 100 orig: 100, 100
offset: 0, 0 offset: 0, 0
index: -1 index: -1
Mohawk Warrior Modern Armor
rotate: false rotate: false
xy: 1328, 410 xy: 1328, 410
size: 100, 100 size: 100, 100
orig: 100, 100 orig: 100, 100
offset: 0, 0 offset: 0, 0
index: -1 index: -1
Musketeer Mohawk Warrior
rotate: false rotate: false
xy: 1124, 104 xy: 1124, 104
size: 100, 100 size: 100, 100
orig: 100, 100 orig: 100, 100
offset: 0, 0 offset: 0, 0
index: -1 index: -1
Musketeer
rotate: false
xy: 1124, 2
size: 100, 100
orig: 100, 100
offset: 0, 0
index: -1
Musketman Musketman
rotate: false rotate: false
xy: 1226, 207 xy: 1226, 207
@ -447,210 +454,210 @@ Musketman
index: -1 index: -1
Naresuan's Elephant Naresuan's Elephant
rotate: false rotate: false
xy: 1124, 2 xy: 1328, 308
size: 100, 100 size: 100, 100
orig: 100, 100 orig: 100, 100
offset: 0, 0 offset: 0, 0
index: -1 index: -1
Norwegian Ski Infantry Norwegian Ski Infantry
rotate: false rotate: false
xy: 1328, 308 xy: 1430, 410
size: 100, 100 size: 100, 100
orig: 100, 100 orig: 100, 100
offset: 0, 0 offset: 0, 0
index: -1 index: -1
Nuclear Missile Nuclear Missile
rotate: false rotate: false
xy: 1430, 410 xy: 1226, 105
size: 100, 100 size: 100, 100
orig: 100, 100 orig: 100, 100
offset: 0, 0 offset: 0, 0
index: -1 index: -1
Panzer Panzer
rotate: false rotate: false
xy: 1226, 105 xy: 1328, 206
size: 100, 100 size: 100, 100
orig: 100, 100 orig: 100, 100
offset: 0, 0 offset: 0, 0
index: -1 index: -1
Persian Immortal Persian Immortal
rotate: false rotate: false
xy: 1328, 206 xy: 1430, 308
size: 100, 100 size: 100, 100
orig: 100, 100 orig: 100, 100
offset: 0, 0 offset: 0, 0
index: -1 index: -1
Pikeman Pikeman
rotate: false rotate: false
xy: 1430, 308 xy: 1532, 410
size: 100, 100 size: 100, 100
orig: 100, 100 orig: 100, 100
offset: 0, 0 offset: 0, 0
index: -1 index: -1
Rifleman Rifleman
rotate: false rotate: false
xy: 1532, 410 xy: 1226, 3
size: 100, 100 size: 100, 100
orig: 100, 100 orig: 100, 100
offset: 0, 0 offset: 0, 0
index: -1 index: -1
Rocket Artillery Rocket Artillery
rotate: false rotate: false
xy: 1226, 3 xy: 1328, 104
size: 100, 100 size: 100, 100
orig: 100, 100 orig: 100, 100
offset: 0, 0 offset: 0, 0
index: -1 index: -1
Samurai Samurai
rotate: false rotate: false
xy: 1328, 104 xy: 1328, 2
size: 100, 100 size: 100, 100
orig: 100, 100 orig: 100, 100
offset: 0, 0 offset: 0, 0
index: -1 index: -1
Scout Scout
rotate: false rotate: false
xy: 1328, 2 xy: 1430, 206
size: 100, 100 size: 100, 100
orig: 100, 100 orig: 100, 100
offset: 0, 0 offset: 0, 0
index: -1 index: -1
Settler Settler
rotate: false rotate: false
xy: 1430, 206 xy: 1532, 308
size: 100, 100 size: 100, 100
orig: 100, 100 orig: 100, 100
offset: 0, 0 offset: 0, 0
index: -1 index: -1
Ship of the Line Ship of the Line
rotate: false rotate: false
xy: 1532, 308 xy: 1634, 410
size: 100, 100 size: 100, 100
orig: 100, 100 orig: 100, 100
offset: 0, 0 offset: 0, 0
index: -1 index: -1
Sipahi Sipahi
rotate: false rotate: false
xy: 1634, 410 xy: 1430, 104
size: 100, 100 size: 100, 100
orig: 100, 100 orig: 100, 100
offset: 0, 0 offset: 0, 0
index: -1 index: -1
Slinger Slinger
rotate: false rotate: false
xy: 1430, 104 xy: 1430, 2
size: 100, 100 size: 100, 100
orig: 100, 100 orig: 100, 100
offset: 0, 0 offset: 0, 0
index: -1 index: -1
Spearman Spearman
rotate: false rotate: false
xy: 1430, 2 xy: 1532, 206
size: 100, 100 size: 100, 100
orig: 100, 100 orig: 100, 100
offset: 0, 0 offset: 0, 0
index: -1 index: -1
Stealth Bomber Stealth Bomber
rotate: false rotate: false
xy: 1532, 206 xy: 1634, 308
size: 100, 100 size: 100, 100
orig: 100, 100 orig: 100, 100
offset: 0, 0 offset: 0, 0
index: -1 index: -1
Submarine Submarine
rotate: false rotate: false
xy: 1634, 308 xy: 1736, 410
size: 100, 100 size: 100, 100
orig: 100, 100 orig: 100, 100
offset: 0, 0 offset: 0, 0
index: -1 index: -1
Swordsman Swordsman
rotate: false rotate: false
xy: 1736, 410 xy: 1532, 104
size: 100, 100 size: 100, 100
orig: 100, 100 orig: 100, 100
offset: 0, 0 offset: 0, 0
index: -1 index: -1
Tank Tank
rotate: false rotate: false
xy: 1532, 104 xy: 1532, 2
size: 100, 100 size: 100, 100
orig: 100, 100 orig: 100, 100
offset: 0, 0 offset: 0, 0
index: -1 index: -1
Tercio Tercio
rotate: false rotate: false
xy: 1532, 2 xy: 1634, 206
size: 100, 100 size: 100, 100
orig: 100, 100 orig: 100, 100
offset: 0, 0 offset: 0, 0
index: -1 index: -1
Trebuchet Trebuchet
rotate: false rotate: false
xy: 1634, 206 xy: 1736, 308
size: 100, 100 size: 100, 100
orig: 100, 100 orig: 100, 100
offset: 0, 0 offset: 0, 0
index: -1 index: -1
Triplane Triplane
rotate: false rotate: false
xy: 1736, 308 xy: 1838, 410
size: 100, 100 size: 100, 100
orig: 100, 100 orig: 100, 100
offset: 0, 0 offset: 0, 0
index: -1 index: -1
Trireme Trireme
rotate: false rotate: false
xy: 1838, 409 xy: 1634, 103
size: 100, 101 size: 100, 101
orig: 100, 101 orig: 100, 101
offset: 0, 0 offset: 0, 0
index: -1 index: -1
Turtle Ship Turtle Ship
rotate: false rotate: false
xy: 1634, 104 xy: 1736, 206
size: 100, 100 size: 100, 100
orig: 100, 100 orig: 100, 100
offset: 0, 0 offset: 0, 0
index: -1 index: -1
War Chariot War Chariot
rotate: false rotate: false
xy: 1634, 2 xy: 1838, 308
size: 100, 100 size: 100, 100
orig: 100, 100 orig: 100, 100
offset: 0, 0 offset: 0, 0
index: -1 index: -1
War Elephant War Elephant
rotate: false rotate: false
xy: 1736, 206 xy: 1940, 410
size: 100, 100 size: 100, 100
orig: 100, 100 orig: 100, 100
offset: 0, 0 offset: 0, 0
index: -1 index: -1
Warrior Warrior
rotate: false rotate: false
xy: 1838, 307 xy: 1736, 104
size: 100, 100 size: 100, 100
orig: 100, 100 orig: 100, 100
offset: 0, 0 offset: 0, 0
index: -1 index: -1
Work Boats Work Boats
rotate: false rotate: false
xy: 1940, 410 xy: 1736, 2
size: 100, 100 size: 100, 100
orig: 100, 100 orig: 100, 100
offset: 0, 0 offset: 0, 0
index: -1 index: -1
Worker Worker
rotate: false rotate: false
xy: 1736, 104 xy: 1838, 206
size: 100, 100 size: 100, 100
orig: 100, 100 orig: 100, 100
offset: 0, 0 offset: 0, 0
index: -1 index: -1
Zero Zero
rotate: false rotate: false
xy: 1736, 2 xy: 1940, 308
size: 100, 100 size: 100, 100
orig: 100, 100 orig: 100, 100
offset: 0, 0 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 index: -1
ImprovementIcons/Railroad ImprovementIcons/Railroad
rotate: false rotate: false
xy: 1326, 1152 xy: 1224, 948
size: 100, 100 size: 100, 100
orig: 100, 100 orig: 100, 100
offset: 0, 0 offset: 0, 0
index: -1 index: -1
TileSets/Default/Railroad TileSets/Default/Railroad
rotate: false rotate: false
xy: 1326, 1152 xy: 1224, 948
size: 100, 100 size: 100, 100
orig: 100, 100 orig: 100, 100
offset: 0, 0 offset: 0, 0
@ -1644,7 +1644,7 @@ TechIcons/Radio
index: -1 index: -1
TechIcons/Railroad TechIcons/Railroad
rotate: false rotate: false
xy: 1224, 948 xy: 1326, 1152
size: 100, 100 size: 100, 100
orig: 100, 100 orig: 100, 100
offset: 0, 0 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. // 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 // Single-use like missile
// No strength/rangedStrength tags in civ 5 xmls. Instead has NukeDamageLevel = 1 tag (Nuclear Missile has NukeDamageLevel = 2) // No strength/rangedStrength tags in civ 5 xmls. Instead has NukeDamageLevel = 1 tag (Nuclear Missile has NukeDamageLevel = 2)
}, }, */
{ {
"name": "Guided Missile", "name": "Guided Missile",
"unitType": "Missile", "unitType": "Missile",
@ -1063,11 +1063,9 @@
"rangedStrength": 60, "rangedStrength": 60,
"range": 8, "range": 8,
"cost": 150, "cost": 150,
"requiredTech": "Satellites" "requiredTech": "Rocketry",
// don't cost Maintenance, but count towards the limit of air units in city "uniques": ["Self-destructs when attacking"]
// requiredTech "Advanced ballistics" in expansions
}, },
*/
{ {
"name": "Nuclear Missile", "name": "Nuclear Missile",
"unitType": "Missile", "unitType": "Missile",
@ -1078,7 +1076,7 @@
"cost": 1000, "cost": 1000,
"requiredTech": "Rocketry", "requiredTech": "Rocketry",
"requiredResource": "Uranium", "requiredResource": "Uranium",
"uniques": ["Nuclear weapon", "Requires [Manhattan Project]"] "uniques": ["Self-destructs when attacking", "Nuclear weapon", "Requires [Manhattan Project]"]
}, },
{ {
"name": "Landship", "name": "Landship",

View File

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

View File

@ -43,7 +43,7 @@ class BattleTable(val worldScreen: WorldScreen): Table() {
val attacker = tryGetAttacker() val attacker = tryGetAttacker()
if(attacker==null || !worldScreen.canChangeState){ hide(); return } 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 val selectedTile = worldScreen.mapHolder.selectedTile
if (selectedTile == null) { hide(); return } // no selected tile if (selectedTile == null) { hide(); return } // no selected tile
simulateNuke(attacker as MapUnitCombatant, selectedTile) simulateNuke(attacker as MapUnitCombatant, selectedTile)