Add ruins and desolation FX on nuke explosions (#847)

## Description:

Add a few animations after a nuke exploded:
- small fire
- big fire
- small smoke
- big smokes


https://github.com/user-attachments/assets/6ef7c1e3-ae3e-4420-aab2-3a3a3630ad98

## Please complete the following:

- [x] I have added screenshots for all UI updates
- [x] I confirm I have thoroughly tested these changes and take full
responsibility for any bugs introduced
- [x] I understand that submitting code with bugs that could have been
caught through manual testing blocks releases and new features for all
contributors

## Please put your Discord username so you can be contacted if a bug or
regression is found:

IngloriousTom
This commit is contained in:
DevelopingTom
2025-05-22 19:27:07 -04:00
committed by GitHub
parent 85c03d659c
commit 7520bc8352
10 changed files with 197 additions and 40 deletions
+10 -12
View File
@@ -3,7 +3,7 @@ import { GameUpdateType } from "../../../core/game/GameUpdates";
import { GameView, UnitView } from "../../../core/game/GameView";
import { loadAllAnimatedSpriteImages } from "../AnimatedSpriteLoader";
import { Fx } from "../fx/Fx";
import { NukeExplosionFx, ShockwaveFx } from "../fx/NukeFx";
import { nukeFxFactory, ShockwaveFx } from "../fx/NukeFx";
import { SAMExplosionFx } from "../fx/SAMExplosionFx";
import { Layer } from "./Layer";
@@ -36,41 +36,39 @@ export class FxLayer implements Layer {
switch (unit.type()) {
case UnitType.AtomBomb:
case UnitType.MIRVWarhead:
this.handleNukes(unit, 70);
this.onNukeEvent(unit, 70);
break;
case UnitType.HydrogenBomb:
this.handleNukes(unit, 250);
this.onNukeEvent(unit, 160);
break;
}
}
handleNukes(unit: UnitView, shockwaveRadius: number) {
onNukeEvent(unit: UnitView, radius: number) {
if (!unit.isActive()) {
if (unit.wasInterceptedBySAM()) {
this.handleSAMInterception(unit);
} else {
// Kaboom
this.handleNukeExplosion(unit, shockwaveRadius);
this.handleNukeExplosion(unit, radius);
}
}
}
handleNukeExplosion(unit: UnitView, shockwaveRadius: number) {
handleNukeExplosion(unit: UnitView, radius: number) {
const x = this.game.x(unit.lastTile());
const y = this.game.y(unit.lastTile());
const nuke = new NukeExplosionFx(x, y, 1000);
this.allFx.push(nuke as Fx);
const shockwave = new ShockwaveFx(x, y, 1500, shockwaveRadius);
this.allFx.push(shockwave as Fx);
const nukeFx = nukeFxFactory(x, y, radius, this.game);
this.allFx = this.allFx.concat(nukeFx);
}
handleSAMInterception(unit: UnitView) {
const x = this.game.x(unit.lastTile());
const y = this.game.y(unit.lastTile());
const interception = new SAMExplosionFx(x, y, 1000);
this.allFx.push(interception as Fx);
this.allFx.push(interception);
const shockwave = new ShockwaveFx(x, y, 800, 40);
this.allFx.push(shockwave as Fx);
this.allFx.push(shockwave);
}
async init() {