move to stack based model

This commit is contained in:
zongor 2025-01-26 10:00:40 -05:00
parent d93b4d8dc6
commit 4e3de8bdb1
9 changed files with 271 additions and 221 deletions

View File

@ -1,10 +1,10 @@
(set screen-width 800) (set screen-width 800:i32)
(set screen-height 450) (set screen-height 450:i32)
(set username (get argv 1)) (set username (get argv 1))
(set password (get argv 2)) (set password (get argv 2))
(set me (make :player username (0.0 1.0 2.0) PURPLE)) (set me (make:player username (0.0 1.0 2.0) PURPLE))
(set players (login me)) (set players (login me))
(set camera (make :camera (me.pos.x (add me.pos.y 10.0) (add me.pos.z 10.0)) (set camera (make:camera (me.pos.x (add me.pos.y 10.0) (add me.pos.z 10.0))
(me.pos.x me.pos.y me.pos.z) (me.pos.x me.pos.y me.pos.z)
(0.0 1.0 0.0) (0.0 1.0 0.0)
45.0 45.0

View File

@ -0,0 +1,47 @@
fn build(c: ProjectConfig) {
c.name("MMO Project");
c.client([
LanguageSettings {
lang: "c",
file: "src/client.ztl",
outpath: "client/",
ffi: [
FFISetting {
"name":"raylib",
"library":"$RAYLIB_PATH/libraylib.a",
"path":"",
"build": "make build",
}
]
}
])
c.server([
LanguageSettings {
lang: "javascript",
file: "src/server.ztl",
outpath: "server/"
}
]);
c.common([
LanguageSettings {
lang: "c",
file: "src/common.ztl",
outpath: "client/"
},
LanguageSettings {
lang: "javascript",
file: "src/common.ztl",
outpath: "server/"
},
LanguageSettings {
lang: "sqlite",
file: "src/common.ztl",
outpath: "db/"
}
]);
c.build();
}

View File

@ -1,100 +1,93 @@
use "common.ztl" use "common.ztl"
fn :login (9p, Player, str -> []Player) { fn login(s: 9p, p: Player, password: str): []Player {
set s to pop; s.auth(p.username, password)
set p to pop; return s.read("players")
set password to pop; }
s.auth(p.username, password); fn main(argc: i32, argv: []str): i32 {
return s.read("players"); const screen_width = 800;
}; const screen_height = 450;
fn :main (i32 str[] -> i32) { let username = argv[0];
set :argc to pop; let password = argv[1];
set :argv to pop;
set :screen_width to i32 800; let s = tunnel("localhost:25565");
set :screen_height to i32 450; s.attach();
set :username to argv[0]; let me = Player(
set :password to argv[1];
set :me to Player {
username, username,
vec {0.0 1.0 2.0}, Vec(0.0, 1.0, 2.0),
purple, purple
}; );
let players = login(s, me, password);
set :players to Player[] { login me password; }; let camera = Camera3D(
Vec(0.0, 1.0, 0.0),
45.0,
:CAMERA_PERSPECTIVE,
Vec(
me.pos.x + 10.0,
me.pos.y + 10.0,
me.pos.z
),
me.pos
);
set :camera to Camera3D { init_window("zwl client : raylib", screen_width, screen_height);
vec {0.0 1.0 0.0}, set_target_fps(60);
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 *) (* Main game loop *)
while ( not window_should_close ) { while ( not window_should_close() ) {
let player_updated = false;
if (is_key_down :KEY_RIGHT) { if (is_key_down(KEY_RIGHT)) {
set me.pos.x to {add me.pos.x 0.2}; me.pos.x = me.pos.x + 0.2;
set :player_updated true; player_updated = true;
} }
if (is_key_down :KEY_LEFT) { if (is_key_down(KEY_LEFT)) {
set me.pos.x to {sub me.pos.x 0.2}; me.pos.x = me.pos.x - 0.2;
set :player_updated true; player_updated = true;
} }
if (is_key_down :KEY_DOWN) { if (is_key_down(KEY_DOWN)) {
set me.pos.z to {add me.pos.z 0.2}; me.pos.z = me.pos.z + 0.2;
set :player_updated true; player_updated = true;
} }
if (is_key_down :KEY_UP) { if (is_key_down(KEY_UP)) {
set me.pos.z to {sub me.pos.z 0.2}; me.pos.z = me.pos.z - 0.2;
set :player_updated true; player_updated = true;
} }
sync_camera camera me; sync_camera(s, me, camera);
if (player_updated) { if (player_updated) {
set :players move me; players = move(s, me);
} else { } else {
set :players ping me; players = ping(s, me);
} }
begin_drawing; begin_drawing();
clear_background RAYWHITE; clear_background(RAYWHITE);
begin_mode_3d camera; begin_mode_3d(camera);
(* Draw floor *) (* Draw floor *)
draw_grid 30 1.0; draw_grid(30, 1.0);
draw_cube me.pos 0.5 0.5 0.5 me.apperance; draw_cube(me.pos, 0.5, 0.5, 0.5, me.apperance);
map :player players { for (player in players) {
draw_cube player.pos 0.5 0.5 0.5 player.apperance; draw_cube(player.pos, 0.5, 0.5, 0.5, player.apperance);
} }
end_mode_3d; end_mode_3d();
end_drawing; end_drawing();
} }
/* Detect window close button or ESC key */
set :players to logout me; logout(me);
close_window; /*Close window and OpenGL context */ close_window(); (* Close window and OpenGL context *)
}; }
main;

View File

@ -1,19 +1,19 @@
type :Vec { type Vec {
f32 :x, x: f32,
f32 :y, y: f32,
f32 :z, z: f32,
}; }
type :Color { type Color {
i8 :r, r: u8,
i8 :g, g: u8,
i8 :b, b: u8,
}; }
type :Player { type Player {
str :username, username: str,
Vec :pos, pos: Vec,
Color :color, color: Color,
}; }
Color :purple {255 255 0}; const purple = Color{255, 255, 0};

View File

@ -1,11 +1,8 @@
use "common.ztl" use "common.ztl"
fn :main(i32, []str -> i32) { fn main(argc: i32, argv: []str): i32 {
set :argc to pop; let s = tunnel();
set :argv to pop; s.host("0.0.0.0:25565",
set s to tunnel "0.0.0.0:25565";
s.host (
version, version,
auth, auth,
error, error,
@ -18,46 +15,45 @@ fn :main(i32, []str -> i32) {
write, write,
clunk, clunk,
remove, remove,
stat, stat);
);
} }
fn :version(9pmsg) { fn version(m : 9pmsg) {
} }
fn :auth(9pmsg) { fn auth(m : 9pmsg) {
} }
fn :error(9pmsg) { fn error(m : 9pmsg) {
} }
fn :flush(9pmsg) { fn flush(m : 9pmsg) {
} }
fn :attach(9pmsg) { fn attach(m : 9pmsg) {
} }
fn :walk(9pmsg) { fn walk(m : 9pmsg) {
} }
fn :open(9pmsg) { fn open(m : 9pmsg) {
} }
fn :create(9pmsg) { fn create(m : 9pmsg) {
} }
fn :read(9pmsg) { fn read(m : 9pmsg) {
} }
fn :write(9pmsg) { fn write(m : 9pmsg) {
} }
fn :clunk(9pmsg) { fn clunk(m : 9pmsg) {
} }
fn :remove(9pmsg) { fn remove(m : 9pmsg) {
} }
fn :stat(9pmsg) { fn stat(m : 9pmsg) {
} }

View File

@ -1,16 +1,18 @@
fn build(c: ProjectConfig) { fn :build (ProjectConfig) {
set c to pop;
c.name("MMO Project"); c.name("MMO Project");
c.client([ c.client([
LanguageSettings { LanguageSettings {
lang: "c", "lang": "c",
file: "src/client.ztl", "file": "src/client.ztl",
outpath: "client/", "outpath": "client/",
ffi: [ "ffi": [
FFISetting { FFISetting {
"name":"raylib", "name":"raylib",
"library":"$RAYLIB_PATH/libraylib.a", "library":"$RAYLIB_PATH/libraylib.a",
"path":"", "path":"./",
"build": "make build", "build": "make build",
} }
] ]
@ -19,27 +21,27 @@ fn build(c: ProjectConfig) {
c.server([ c.server([
LanguageSettings { LanguageSettings {
lang: "javascript", "lang": "javascript",
file: "src/server.ztl", "file": "src/server.ztl",
outpath: "server/" "outpath": "server/"
} }
]); ]);
c.common([ c.common([
LanguageSettings { LanguageSettings {
lang: "c", "lang": "c",
file: "src/common.ztl", "file": "src/common.ztl",
outpath: "client/" "outpath": "client/"
}, },
LanguageSettings { LanguageSettings {
lang: "javascript", "lang": "javascript",
file: "src/common.ztl", "file": "src/common.ztl",
outpath: "server/" "outpath": "server/"
}, },
LanguageSettings { LanguageSettings {
lang: "sqlite", "lang": "sqlite",
file: "src/common.ztl", "file": "src/common.ztl",
outpath: "db/" "outpath": "db/"
} }
]); ]);

View File

@ -1,93 +1,101 @@
use "common.ztl" use "common.ztl"
fn login(s: 9p, p: Player, password: str): []Player { fn :login (9p Player str -> []Player) {
s.auth(p.username, password) set s to pop;
return s.read("players") set p to pop;
} set password to pop;
fn main(argc: i32, argv: []str): i32 { s.auth(p.username, password);
const screen_width = 800; return s.read("players");
const screen_height = 450; };
let username = argv[0];
let password = argv[1];
let s = tunnel("localhost:25565"); fn :main (i32 str[i32] -> i32) { /* str[i32] is the same as Map<number, string> in JS*/
s.attach(); set :argc to pop;
set :argv to pop;
let me = Player( 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 {
username, username,
Vec(0.0, 1.0, 2.0), vec {0.0 1.0 2.0},
purple purple,
); };
let players = login(s, me, password);
let camera = Camera3D( set :players to Player[] { login me password; };
Vec(0.0, 1.0, 0.0),
45.0,
:CAMERA_PERSPECTIVE,
Vec(
me.pos.x + 10.0,
me.pos.y + 10.0,
me.pos.z
),
me.pos
);
init_window("zwl client : raylib", screen_width, screen_height); set :camera to Camera3D {
set_target_fps(60); 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,
};
(* Main game loop *) init_window "zwl client : raylib" screen_width screen_height;
while ( not window_should_close() ) { set_target_fps 60;
let player_updated = false;
if (is_key_down(KEY_RIGHT)) { /* Main game loop */
me.pos.x = me.pos.x + 0.2; while ( not window_should_close ) {
player_updated = true;
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)) { if (is_key_down :KEY_LEFT) {
me.pos.x = me.pos.x - 0.2; set me.pos.x to {sub me.pos.x 0.2};
player_updated = true; set :player_updated true;
} }
if (is_key_down(KEY_DOWN)) { if (is_key_down :KEY_DOWN) {
me.pos.z = me.pos.z + 0.2; set me.pos.z to {add me.pos.z 0.2};
player_updated = true; set :player_updated true;
} }
if (is_key_down(KEY_UP)) { if (is_key_down :KEY_UP) {
me.pos.z = me.pos.z - 0.2; set me.pos.z to {sub me.pos.z 0.2};
player_updated = true; set :player_updated true;
} }
sync_camera(s, me, camera); sync_camera camera me;
if (player_updated) { if (player_updated) {
players = move(s, me); set :players move me;
} else { } else {
players = ping(s, me); set :players ping me;
} }
begin_drawing(); begin_drawing;
clear_background(RAYWHITE); clear_background RAYWHITE;
begin_mode_3d(camera); begin_mode_3d camera;
(* Draw floor *) /* Draw floor */
draw_grid(30, 1.0); draw_grid 30 1.0;
draw_cube(me.pos, 0.5, 0.5, 0.5, me.apperance); draw_cube me.pos 0.5 0.5 0.5 me.apperance;
for (player in players) { map :player players {
draw_cube(player.pos, 0.5, 0.5, 0.5, player.apperance); draw_cube player.pos 0.5 0.5 0.5 player.apperance;
} }
end_mode_3d(); end_mode_3d;
end_drawing(); end_drawing;
} }
/* Detect window close button or ESC key */
logout(me); set :players to logout me;
close_window(); (* Close window and OpenGL context *) close_window; /*Close window and OpenGL context */
} };
main;

View File

@ -1,19 +1,19 @@
type Vec { type :Vec {
x: f32, f32 :x,
y: f32, f32 :y,
z: f32, f32 :z,
} };
type Color { type :Color {
r: u8, i8 :r,
g: u8, i8 :g,
b: u8, i8 :b,
} };
type Player { type :Player {
username: str, str :username,
pos: Vec, Vec :pos,
color: Color, Color :color,
} };
const purple = Color{255, 255, 0}; Color :purple {255 255 0};

View File

@ -1,8 +1,11 @@
use "common.ztl" use "common.ztl"
fn main(argc: i32, argv: []str): i32 { fn :main(i32, []str -> i32) {
let s = tunnel(); set :argc to pop;
s.host("0.0.0.0:25565", set :argv to pop;
set s to tunnel "0.0.0.0:25565";
s.host (
version, version,
auth, auth,
error, error,
@ -15,45 +18,46 @@ fn main(argc: i32, argv: []str): i32 {
write, write,
clunk, clunk,
remove, remove,
stat); stat,
);
} }
fn version(m : 9pmsg) { fn :version(9pmsg) {
} }
fn auth(m : 9pmsg) { fn :auth(9pmsg) {
} }
fn error(m : 9pmsg) { fn :error(9pmsg) {
} }
fn flush(m : 9pmsg) { fn :flush(9pmsg) {
} }
fn attach(m : 9pmsg) { fn :attach(9pmsg) {
} }
fn walk(m : 9pmsg) { fn :walk(9pmsg) {
} }
fn open(m : 9pmsg) { fn :open(9pmsg) {
} }
fn create(m : 9pmsg) { fn :create(9pmsg) {
} }
fn read(m : 9pmsg) { fn :read(9pmsg) {
} }
fn write(m : 9pmsg) { fn :write(9pmsg) {
} }
fn clunk(m : 9pmsg) { fn :clunk(9pmsg) {
} }
fn remove(m : 9pmsg) { fn :remove(9pmsg) {
} }
fn stat(m : 9pmsg) { fn :stat(9pmsg) {
} }