type :Vec { f32 :x, f32 :y, f32 :z, }; type :Color { i8 :r, i8 :g, i8 :b, }; type :Player { str :username, Vec :pos, Color :color, }; fn :login (Player str -> bool) { set p to pop; /* getting the player from the stack */ set password to pop; /* get the string from the stack */ return true; /* return back from function and push value on stack */ }; Color :purple {255 255 0}; fn :main (i32 str[] -> i32) { set :argc to pop; // to is a noop but makes it more readable set :argv to pop; set :screen_width to i32 800; set :screen_height to i32 450; set :username to argv[0]; set :password to argv[1]; set :me to Player { // the brackets are for readablity, the ';' is neccisarry username, vec {0.0 1.0 2.0}, purple, }; set :players to Player[] { login me password; }; set :camera to Camera3D { vec {0.0 1.0 0.0}, i32 45.0, atom :CAMERA_PERSPECTIVE, vec { add me.pos.x 10.0, add me.pos.y 10.0, me.pos.z, }, me.pos, }; init_window "zwl client : raylib" screen_width screen_height; set_target_fps 60; (* Main game loop *) while ( not window_should_close ) { if (is_key_down :KEY_RIGHT) { set me.pos.x to {add me.pos.x 0.2}; set :player_updated true; } if (is_key_down :KEY_LEFT) { set me.pos.x to {sub me.pos.x 0.2}; set :player_updated true; } if (is_key_down :KEY_DOWN) { set me.pos.z to {add me.pos.z 0.2}; set :player_updated true; } if (is_key_down :KEY_UP) { set me.pos.z to {sub me.pos.z 0.2}; set :player_updated true; } sync_camera camera me; if (player_updated) { set :players move me; } else { set :players ping me; } begin_drawing; clear_background RAYWHITE; begin_mode_3d camera; (* Draw floor *) draw_grid 30 1.0; draw_cube me.pos 0.5 0.5 0.5 me.apperance; map :player players { draw_cube player.pos 0.5 0.5 0.5 player.apperance; } end_mode_3d; end_drawing; } /* Detect window close button or ESC key */ set :players to logout me; close_window; /*Close window and OpenGL context */ } main;