tests: test_syntax now reports other errors before the pkgconfig error
[nit.git] / contrib / tinks / src / client / client.nit
index 32a9852..bc434b7 100644 (file)
@@ -23,7 +23,7 @@ import game
 import common
 
 import assets
-import context
+import base
 
 # A position within the screen
 class ScreenPos
@@ -80,85 +80,13 @@ redef class App
        redef fun on_create
        do
                super
-               maximum_fps = 60
+               maximum_fps = 60.0
                assets.assign_images_to_story context.game.story
        end
 
        # Camera managing transformation between world and screen positions
        var camera = new Camera
 
-       # Context of the game, either local or remote
-       var context: GameContext is lazy do
-
-               # Server info
-               var address = null
-               var port = default_listening_port
-
-               if args.not_empty then
-                       # Use first argument as the server address
-                       address = args[0]
-                       if args.length > 1 then port = args[1].to_i
-               else
-                       print "Looking for a server..."
-
-                       var s = new UDPSocket
-                       s.enable_broadcast = true
-                       s.blocking = false
-                       s.broadcast(discovery_port, "Server? {handshake_app_name}")
-                       nanosleep(0, 100_000_000)
-
-                       var ptr = new Ref[nullable SocketAddress](null)
-                       var resp = s.recv_from(1024, ptr)
-                       var src = ptr.item
-
-                       if not resp.is_empty then
-                               var words = resp.split(" ")
-                               if words.length == 3 and words[0] == "Server!" and words[1] == handshake_app_name and words[2].is_numeric then
-                                       address = src.address
-                                       port = words[2].to_i
-                               end
-                       end
-               end
-
-               if address == null then
-                       print "Launching a local server"
-
-                       # No command line
-                       return new LocalServerContext
-               else
-                       print "Connecting to:{address}:{port}"
-                       maximum_fps = 0
-
-                       # Args are: tinks server_address {port}
-                       #var address = "riph" # args[0]
-                       #var port = sys.default_listening_port
-                       if args.length > 1 then port = args[1].to_i
-
-                       # Setup connection config
-                       var server_config = new RemoteServerConfig(address, port)
-                       var server = new RemoteServer(server_config)
-
-                       # Connect then complete handshake
-                       assert server.connect else print_error "Connection to server failed with {server.socket.last_error or else "none"}"
-                       assert server.handshake else print_error "Handshake with server failed"
-
-                       # Download and setup remote game
-                       var context = new RemoteGameContext(server)
-                       context.setup
-
-                       return context
-               end
-       end
-
-       # `Tank` of the local player, if any
-       fun local_tank: nullable Tank
-       do
-               # FIXME use a ? to one line this
-               var local_player = context.local_player
-               if local_player == null then return null
-               return local_player.tank
-       end
-
        # Square of the minimum distance from the tank for an object to be "far"
        #
        # This value influences which sounds are heard,
@@ -166,6 +94,13 @@ redef class App
        # whether an arrow points to a far unit
        private var far_dist2 = 2000.0
 
+       redef fun context
+       do
+               var s = super
+               if s isa RemoteGameContext then maximum_fps = 0.0
+               return s
+       end
+
        # Tank tracks tracks on the ground
        #
        # TODO use particles or at least optimize drawing
@@ -189,7 +124,7 @@ redef class App
                var local_tank = local_tank
                if local_tank != null then
                        var tank_speed = local_tank.direction_forwards*local_tank.rule.max_speed
-                       tank_speed = tank_speed.min(0.5).max(-0.5)
+                       tank_speed = tank_speed.clamp(-0.5, 0.5)
 
                        var prop_pos = local_tank.pos + local_tank.heading.to_vector(tank_speed * 16.0)
                        var old_pos = camera.center(display)
@@ -259,7 +194,7 @@ redef class App
                        var screen_pos = tank.pos.to_screen(camera)
 
                        var damage = tank.rule.max_health - tank.health
-                       damage = damage.max(0).min(tank.rule.base_images.length)
+                       damage = damage.clamp(0, tank.rule.base_images.length)
 
                        var base_image = tank.rule.base_images[damage]
                        display.blit_rotated(base_image, screen_pos.x, screen_pos.y, tank.heading)
@@ -276,26 +211,7 @@ redef class App
                end
 
                # Events
-               for event in turn.events do
-                       event.client_react(display, turn)
-
-                       if event isa ExplosionEvent then
-                               var pos = event.pos.to_screen(camera)
-                               display.blit_centered(assets.drawing.explosion, pos.x, pos.y)
-                       else if event isa OpenFireEvent then
-                               var tank = event.tank
-                               var screen_pos = tank.pos.to_screen(camera)
-                               display.blit_rotated(assets.drawing.turret_firing, screen_pos.x, screen_pos.y, tank.turret.heading)
-
-                               if tank.pos.dist2(camera.center(display)) < far_dist2 then
-                                       assets.turret_fire.play
-                               end
-                       else if event isa TurretReadyEvent then
-                               if event.tank.pos.dist2(camera.center(display)) < far_dist2 then
-                                       assets.turret_ready.play
-                               end
-                       end
-               end
+               for event in turn.events do event.client_react(display, turn)
 
                # Gather and show some performance stats!
                sys.perfs["draw"].add clock.lapse