@@ -19,9 +19,12 @@ import ktx.ashley.exclude
19
19
import ktx.ashley.get
20
20
import kotlin.math.max
21
21
22
+ const val DAMAGE_AREA_HEIGHT = 2f
22
23
private const val DAMAGE_PER_SECOND = 25f
23
24
private const val DAM_SOUND_LENGTH = 0.6f
24
25
private const val BLOCK_SOUND_LENGTH = 0.6f
26
+ private const val DEATH_EXPLOSION_SIZE = 1.5f
27
+ private const val DEATH_EXPLOSION_DURATION = 0.9f
25
28
26
29
class DamageSystem (
27
30
private val gameEventManager : GameEventManager ,
@@ -56,48 +59,49 @@ class DamageSystem(
56
59
}
57
60
58
61
override fun processEntity (entity : Entity , deltaTime : Float ) {
59
- entity[TransformComponent .mapper]?.let { transform ->
60
- entity[PlayerComponent .mapper]?.let { player ->
61
- if (transform.position.y <= 2f ) {
62
- var damage = DAMAGE_PER_SECOND * deltaTime
63
- if (player.shield > 0f ) {
64
- val blockAmount = player.shield
65
- blocked = true
66
- player.shield = max(player.shield - damage, 0f )
67
- damage - = blockAmount
68
- if (damage <= 0f ) {
69
- // entire damage was blocked
70
- return
71
- }
72
- }
62
+ val transform = entity[TransformComponent .mapper]
63
+ require(transform != null ) { " Entity |entity| must have a TransformComponent. entity=$entity " }
64
+ val player = entity[PlayerComponent .mapper]
65
+ require(player != null ) { " Entity |entity| must have a PlayerComponent. entity=$entity " }
66
+
67
+ if (transform.position.y <= DAMAGE_AREA_HEIGHT ) {
68
+ var damage = DAMAGE_PER_SECOND * deltaTime
69
+ if (player.shield > 0f ) {
70
+ val blockAmount = player.shield
71
+ blocked = true
72
+ player.shield = max(player.shield - damage, 0f )
73
+ damage - = blockAmount
74
+ if (damage <= 0f ) {
75
+ // entire damage was blocked
76
+ return
77
+ }
78
+ }
73
79
74
- damageTaken = true
75
- player.life - = damage
80
+ damageTaken = true
81
+ player.life - = damage
76
82
77
- gameEventManager.dispatchEvent(GameEventType .PLAYER_DAMAGED , GameEventPlayerDamaged .apply {
78
- this .player = entity
79
- })
80
- if (player.life <= 0f ) {
81
- entity.add(engine.createComponent(RemoveComponent ::class .java).apply {
82
- delay = 1f
83
- })
84
- entity[GraphicComponent .mapper]?.sprite?.setAlpha(0f )
85
- engine.entity {
86
- with<TransformComponent > {
87
- size.set(1.5f , 1.5f )
88
- setInitialPosition(transform.position.x, transform.position.y, 2f )
89
- }
90
- with<AnimationComponent > {
91
- type = AnimationType .EXPLOSION
92
- }
93
- with<GraphicComponent >()
94
- with<RemoveComponent > {
95
- delay = 0.9f
96
- }
97
- }
98
- audioService.play(SoundAsset .EXPLOSION )
83
+ gameEventManager.dispatchEvent(GameEventType .PLAYER_DAMAGED , GameEventPlayerDamaged .apply {
84
+ this .player = entity
85
+ })
86
+ if (player.life <= 0f ) {
87
+ entity.add(engine.createComponent(RemoveComponent ::class .java).apply {
88
+ delay = 1f
89
+ })
90
+ entity[GraphicComponent .mapper]?.sprite?.setAlpha(0f )
91
+ engine.entity {
92
+ with<TransformComponent > {
93
+ size.set(DEATH_EXPLOSION_SIZE , DEATH_EXPLOSION_SIZE )
94
+ setInitialPosition(transform.position.x, transform.position.y, 2f )
95
+ }
96
+ with<AnimationComponent > {
97
+ type = AnimationType .EXPLOSION
98
+ }
99
+ with<GraphicComponent >()
100
+ with<RemoveComponent > {
101
+ delay = DEATH_EXPLOSION_DURATION
99
102
}
100
103
}
104
+ audioService.play(SoundAsset .EXPLOSION )
101
105
}
102
106
}
103
107
}
0 commit comments