From 26870816dbd58a2b6f5506e677b7ebf18ab544af Mon Sep 17 00:00:00 2001 From: Humza Shahid Date: Sat, 8 Feb 2025 10:48:34 +0000 Subject: [PATCH] add code so that enemy gains a new projectile when attacking falling enemies, and also draw the falling enemies --- fcore/enemy/falling-enemies.sml | 52 +++++++++++++++++++++++++++++++++ fcore/player.sml | 8 +++++ shell/gl-draw.sml | 3 +- 3 files changed, 62 insertions(+), 1 deletion(-) diff --git a/fcore/enemy/falling-enemies.sml b/fcore/enemy/falling-enemies.sml index cf3a33a..337d95a 100644 --- a/fcore/enemy/falling-enemies.sml +++ b/fcore/enemy/falling-enemies.sml @@ -58,4 +58,56 @@ struct * as it is off screen *) updateList (pos - 1, vec, acc) end + + fun helpGetDrawVec + (pos, fallingVec, width, height, ratio, xOffset, yOffset, acc) = + if pos = Vector.length fallingVec then + Vector.concat acc + else + let + val {x, y, variant = _, jumped = _} = Vector.sub (fallingVec, pos) + + val x = Real32.fromInt x * ratio + xOffset + val y = Real32.fromInt y * ratio + yOffset + val size = Real32.fromInt Constants.enemySize * ratio + + val vec = Block.lerp (x, y, size, size, width, height, 0.3, 0.3, 0.3) + val acc = vec :: acc + in + helpGetDrawVec + (pos + 1, fallingVec, width, height, ratio, xOffset, yOffset, acc) + end + + fun getDrawVec (game: game_type, width, height) = + if Vector.length (#fallingEnemies game) = 0 then + Vector.fromList [] + else + let + val fallingEnemies = #fallingEnemies game + val wratio = width / Constants.worldWidthReal + val hratio = height / Constants.worldHeightReal + in + if wratio < hratio then + let + val scale = Constants.worldHeightReal * wratio + val yOffset = + if height > scale then (height - scale) / 2.0 + else if height < scale then (scale - height) / 2.0 + else 0.0 + in + helpGetDrawVec + (0, fallingEnemies, width, height, wratio, 0.0, yOffset, []) + end + else + let + val scale = Constants.worldWidthReal * hratio + val xOffset = + if width > scale then (width - scale) / 2.0 + else if width < scale then (scale - width) / 2.0 + else 0.0 + in + helpGetDrawVec + (0, fallingEnemies, width, height, hratio, xOffset, 0.0, []) + end + end end diff --git a/fcore/player.sml b/fcore/player.sml index 5dc1a37..27c2756 100644 --- a/fcore/player.sml +++ b/fcore/player.sml @@ -451,8 +451,16 @@ struct | FACING_LEFT => x - length) val state = [] + (* detect collisions from enemies who are hit by attack *) val newDefeated = AttackEnemies.foldRegion (x, y, length, height, (), state, enemyTree) + + (* detect collisions from falling enemies too *) + val fallingTree = + FallingEnemies.generateTree (#fallingEnemies game) + val newDefeated = AttackEnemies.foldRegion + (x, y, length, height, (), newDefeated, fallingTree) + val allDefeated = Vector.concat [Vector.fromList newDefeated, enemies] in diff --git a/shell/gl-draw.sml b/shell/gl-draw.sml index 97e61d7..8f632a7 100644 --- a/shell/gl-draw.sml +++ b/shell/gl-draw.sml @@ -242,7 +242,8 @@ struct val wallVec = Wall.getDrawVec (#walls game, width, height) val platVec = Platform.getDrawVec (#platforms game, width, height) val chainVec = Player.getFieldVec (#player game, width, height) - val wallVec = Vector.concat [wallVec, platVec, chainVec] + val fallingVec = FallingEnemies.getDrawVec (game, width, height) + val wallVec = Vector.concat [wallVec, platVec, chainVec, fallingVec] (* temp *) val pelletVec = Player.getPelletVec (#player game, width, height)