diff --git a/fcore/game-type.sml b/fcore/game-type.sml index 6e79733..f6b22c2 100644 --- a/fcore/game-type.sml +++ b/fcore/game-type.sml @@ -1,16 +1,20 @@ signature GAME_TYPE = sig - datatype mode = - LEVEL of LevelType.level_type + datatype mode = LEVEL of LevelType.level_type + + type game_type = {userKeys: CoreKey.user_key, mode: mode} + + val init: CoreKey.user_key -> game_type end structure GameType :> GAME_TYPE = struct - datatype mode = - LEVEL of LevelType.level_type + datatype mode = LEVEL of LevelType.level_type - type game_type = { - userKeys: CoreKey.user_key, - mode: mode - } + type game_type = {userKeys: CoreKey.user_key, mode: mode} + + fun init userKeys = + let val mode = LEVEL LevelType.initial + in {mode = mode, userKeys = userKeys} + end end diff --git a/fcore/game-update.sml b/fcore/game-update.sml index e69de29..f15b381 100644 --- a/fcore/game-update.sml +++ b/fcore/game-update.sml @@ -0,0 +1,18 @@ +structure GameUpdate = +struct + open GameType + + fun update (game: GameType.game_type, input) = + let + val {mode, userKeys} = game + + val mode = + case mode of + LEVEL level => + let val level = LevelUpdate.update (level, input) + in LEVEL level + end + in + {mode = mode, userKeys = userKeys} + end +end diff --git a/fcore/level/level-type.sml b/fcore/level/level-type.sml index 6766411..a68e4f2 100644 --- a/fcore/level/level-type.sml +++ b/fcore/level/level-type.sml @@ -9,10 +9,9 @@ sig , enemies: EnemyMap.t , graph: PlatSet.elem vector vector , fallingEnemies: FallingEnemyMap.t - , userKeys: CoreKey.user_key } - val initial: CoreKey.user_key -> level_type + val initial: level_type end structure LevelType :> LEVEL_TYPE = @@ -26,7 +25,6 @@ struct , enemies: EnemyMap.t , graph: PlatSet.elem vector vector , fallingEnemies: FallingEnemyMap.t - , userKeys: CoreKey.user_key } fun enemyMapFromList (hd :: tl, map) = @@ -35,7 +33,7 @@ struct end | enemyMapFromList ([], map) = map - fun initial userKeys = + val initial = let val player = { yAxis = EntityType.JUMPING 0 @@ -142,7 +140,6 @@ struct , enemies = enemies , graph = graph , fallingEnemies = FallingEnemyMap.empty - , userKeys = userKeys } end end diff --git a/fcore/level/level-update.sml b/fcore/level/level-update.sml index 9418dbc..51bf420 100644 --- a/fcore/level/level-update.sml +++ b/fcore/level/level-update.sml @@ -11,7 +11,6 @@ struct , enemies , graph , fallingEnemies - , userKeys } = game val player = Player.runPhysicsAndInput (game, input) @@ -40,7 +39,6 @@ struct , enemies = enemies , graph = graph , fallingEnemies = fallingEnemies - , userKeys = userKeys } end end diff --git a/fcore/level/player/player.sml b/fcore/level/player/player.sml index 6a377ac..ff8e326 100644 --- a/fcore/level/player/player.sml +++ b/fcore/level/player/player.sml @@ -501,10 +501,7 @@ struct case attacked of NOT_ATTACKED => (1.0, 1.0, 1.0) | ATTACKED amt => - if amt mod 5 = 0 then - (1.0, 1.0, 1.0) - else - (1.0, 0.75, 0.75) + if amt mod 5 = 0 then (1.0, 1.0, 1.0) else (1.0, 0.75, 0.75) in PlayerSprite.lerp (x, y, realWidth, realHeight, width, height, r, g, b) end diff --git a/oms.mlb b/oms.mlb index 620b6d2..08edc14 100644 --- a/oms.mlb +++ b/oms.mlb @@ -52,6 +52,7 @@ fcore/level/player/player-attack.sml fcore/level/projectile.sml fcore/level/level-update.sml +fcore/game-type.sml fcore/game-update.sml (* shell *) diff --git a/shell/gl-draw.sml b/shell/gl-draw.sml index a7308c2..1420000 100644 --- a/shell/gl-draw.sml +++ b/shell/gl-draw.sml @@ -213,7 +213,7 @@ struct fun drawField ({fieldVertexBuffer, fieldProgram, fieldLength, ...}) = drawXyrgba (fieldVertexBuffer, fieldProgram, fieldLength) - fun draw (shellState: t) = + fun drawLevel (shellState: t) = let val _ = drawWall shellState val _ = drawPlayer shellState @@ -222,6 +222,40 @@ struct () end + fun drawMode (shellState: t, game: GameType.game_type) = + let + open GameType + in + case #mode game of + LEVEL level => + let + val width = InputState.getWidth () + val height = InputState.getHeight () + + val playerVec = Player.getDrawVec (#player level, width, height) + val enemyVec = Enemy.getDrawVec (#enemies level, width, height) + val playerVec = Vector.concat [playerVec, enemyVec] + + val wallVec = Wall.getDrawVec (#walls level, width, height) + val platVec = Platform.getDrawVec (#platforms level, width, height) + val chainVec = Player.getFieldVec (#player level, width, height) + val fallingVec = FallingEnemies.getDrawVec (level, width, height) + val wallVec = Vector.concat [wallVec, platVec, chainVec, fallingVec] + + val pelletVec = Player.getPelletVec (#player level, width, height) + val projectileVec = + Projectile.getProjectileVec (#player level, width, height) + val fieldVec = Vector.concat [pelletVec, projectileVec] + + val shellState = uploadWall (shellState, wallVec) + val shellState = uploadPlayer (shellState, playerVec) + val shellState = uploadField (shellState, fieldVec) + val () = drawLevel shellState + in + shellState + end + end + fun helpLoop (shellState as {window, ...}: t, game) = case Glfw.windowShouldClose window of false => @@ -230,32 +264,9 @@ struct val _ = Gles3.clear () val input = InputState.getSnapshot () - val width = InputState.getWidth () - val height = InputState.getHeight () + val game = GameUpdate.update (game, input) - val game = LevelUpdate.update (game, input) - - val playerVec = Player.getDrawVec (#player game, width, height) - val enemyVec = Enemy.getDrawVec (#enemies game, width, height) - val playerVec = Vector.concat [playerVec, enemyVec] - - 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 fallingVec = FallingEnemies.getDrawVec (game, width, height) - val wallVec = Vector.concat [wallVec, platVec, chainVec, fallingVec] - - (* temp *) - val pelletVec = Player.getPelletVec (#player game, width, height) - val projectileVec = - Projectile.getProjectileVec (#player game, width, height) - val fieldVec = Vector.concat [pelletVec, projectileVec] - - val shellState = uploadWall (shellState, wallVec) - val shellState = uploadPlayer (shellState, playerVec) - val shellState = uploadField (shellState, fieldVec) - - val _ = draw shellState + val shellState = drawMode (shellState, game) val _ = Glfw.swapBuffers window val _ = Glfw.pollEvents () @@ -281,6 +292,6 @@ struct val () = InputState.setControls controls in - helpLoop (shellState, LevelType.initial controls) + helpLoop (shellState, GameType.init controls) end end