loader: build_module_importation invalidates the mmodule on errors
[nit.git] / examples / mnit_dino / src / game_logic.nit
index bbf6123..8d1a849 100644 (file)
@@ -159,19 +159,30 @@ end
 class Entity
        super Turnable
 
-       fun run_over_distance: Int do return 500
+       fun run_over_distance_x: Int do return 50
+       fun run_over_distance_y: Int do return 16
+
        var pos = new GamePos( 0, 0 )
 
        fun squared_dist_with_dino( game : Game ) : Int
        do
                return pos.squared_dist_with( game.dino.pos )
        end
+
+       fun under_dino(game: Game): Bool
+       do
+               var dy = pos.y - game.dino.pos.y
+               if dy.abs > run_over_distance_y then return false
+
+               var dx = pos.x - game.dino.pos.x
+               return dx.abs <= run_over_distance_x
+       end
 end
 
 class MovingEntity
        super Entity
 
-       var going_to : nullable GamePos writable = null
+       var going_to : nullable GamePos = null is writable
 
        fun speed : Int is abstract
 
@@ -233,8 +244,7 @@ class Dino
                end
 
                for i in t.game.items_on_ground do
-                       var dwd = i.squared_dist_with_dino(t.game)
-                       if dwd < i.run_over_distance then
+                       if i.under_dino(t.game) then
                                t.game.items_on_ground.remove i
                                t.game.entities.remove i
                        end
@@ -267,20 +277,20 @@ class Caveman
 
        fun is_afraid( turn : Turn ) : Bool do return turn.nbr < afraid_until
        fun can_throw( turn : Turn ) : Bool do return cannot_throw_until < turn.nbr
+       fun die(turn: Turn) do is_alive = false
 
        redef fun do_turn( t )
        do
                if is_alive then
-                       var dwd = squared_dist_with_dino( t.game )
-
-                       if dwd < run_over_distance then
-                               if t.game.dino.is_alive then is_alive = false
+                       if under_dino(t.game) then
+                               if t.game.dino.is_alive then die(t)
                                return
                        else if is_afraid( t ) then
                                # going to destination
                        else if t.game.dino.life <= 0 then
                                # dino is dead, chill
                        else
+                               var dwd = squared_dist_with_dino( t.game )
                                if dwd < fear_distance then
                                        afraid_until = t.nbr + fear_duration
 
@@ -347,6 +357,12 @@ class Javelin
                else
                        if z <= 0 then
                                hit_ground = true
+                               if thrown_angle_xy.cos > 0.0 then
+                                       angle = pi*5.0/8.0+(pi/4.0).rand
+                               else
+                                       # left of the screen
+                                       angle = pi*9.0/8.0+(pi/4.0).rand
+                               end
                        else
                                # in the air
                                speed_z += gravity
@@ -370,7 +386,8 @@ class Bush super Entity end
 
 # Sort entities on screen in order of Y, entities in the back are drawn first
 class EntitiesSorter
-       super AbstractSorter[Entity]
+       super Comparator
+       redef type COMPARED: Entity
 
        redef fun compare(a, b) do return b.pos.y <=> a.pos.y
 end