X-Git-Url: http://nitlanguage.org diff --git a/lib/bucketed_game.nit b/lib/bucketed_game.nit index 09a4ee8..ae0d792 100644 --- a/lib/bucketed_game.nit +++ b/lib/bucketed_game.nit @@ -24,6 +24,8 @@ module bucketed_game # Something acting on the game class Turnable[G: Game] + + # Execute `turn` for this instance. fun do_turn(turn: GameTurn[G]) is abstract end @@ -39,9 +41,11 @@ class Bucketable[G: Game] fun cancel_act do act_at = null end -# Optiomized organization of `Bucketable` instances +# Optimized organization of `Bucketable` instances class Buckets[G: Game] super Turnable[G] + + # Bucket type used in this implementation. type BUCKET: HashSet[Bucketable[G]] private var buckets: Array[BUCKET] is noinit @@ -59,6 +63,7 @@ class Buckets[G: Game] end end + # Add the Bucketable event `e` at `at_tick`. fun add_at(e: Bucketable[G], at_tick: Int) do var at_key = key_for_tick(at_tick) @@ -103,6 +108,8 @@ end # Game related event interface GameEvent + + # Apply `self` to `game` logic. fun apply( game : ThinGame ) is abstract end @@ -113,39 +120,43 @@ end # Game logic on the client class ThinGame + + # Game tick when `self` should act. + # + # Default is 0. var tick: Int = 0 is protected writable end # Game turn on the client class ThinGameTurn[G: ThinGame] - var tick: Int = 0 is protected writable - var events: List[GameEvent] = new List[GameEvent] is protected writable + # Game tick when `self` should act. + var tick: Int is protected writable - init (t: Int) do tick = t + # List of game events occured for `self`. + var events = new List[GameEvent] is protected writable end # Game turn on the full logic class GameTurn[G: Game] super ThinGameTurn[G] + + # Game that `self` belongs to. var game: G - init (g: G) - do - super(g.tick) - game = g + # Create a new game turn for `game`. + init (game: G) is old_style_init do + super(game.tick) + self.game = game end - fun act_next(e: Bucketable[G]) - do - game.buckets.add_at(e, tick + 1) - end + # Insert the Bucketable event `e` to be executed at next tick. + fun act_next(e: Bucketable[G]) do game.buckets.add_at(e, tick + 1) - fun act_in(e: Bucketable[G], t: Int) - do - game.buckets.add_at(e, tick + t) - end + # Insert the Bucketable event `e` to be executed at tick `t`. + fun act_in(e: Bucketable[G], t: Int) do game.buckets.add_at(e, tick + t) + # Add and `apply` a game `event`. fun add_event( event : GameEvent ) do event.apply( game ) @@ -156,8 +167,11 @@ end # Full game logic class Game super ThinGame + + # Game type used in this implementation. type G: Game + # Bucket list in this game. var buckets: Buckets[G] = new Buckets[G] # Last turn executed in this game @@ -165,8 +179,10 @@ class Game # but cannot be used to add new Events. var last_turn: nullable ThinGameTurn[G] = null - init do end - + # Execute and return a new GameTurn. + # + # This method calls `do_pre_turn` before executing the GameTurn + # and `do_post_turn` after. fun do_turn: GameTurn[G] do var turn = new GameTurn[G](self) @@ -182,6 +198,15 @@ class Game return turn end + # Execute something before executing the current GameTurn. + # + # Should be redefined by clients to add a pre-turn behavior. + # See `Game::do_turn`. fun do_pre_turn(turn: GameTurn[G]) do end + + # Execute something after executing the current GameTurn. + # + # Should be redefined by clients to add a post-turn behavior. + # See `Game::do_turn`. fun do_post_turn(turn: GameTurn[G]) do end end