From 7a8a1464b3144e765f4430245e161bea39832673 Mon Sep 17 00:00:00 2001 From: ubq323 Date: Sun, 12 Nov 2023 01:00:48 +0000 Subject: initial --- main.ha | 91 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 main.ha (limited to 'main.ha') diff --git a/main.ha b/main.ha new file mode 100644 index 0000000..9009947 --- /dev/null +++ b/main.ha @@ -0,0 +1,91 @@ +use math::random; + +type player = struct { + x: int, + y: int, +}; + +type wall = void; +type floor = void; + +type tile = (wall | floor); + +type room = struct { + w: size, + h: size, + tiles: []tile, +}; + +fn tile_at(r: room, x: size, y: size) tile = { + const ix = x+(r.w*y); + return r.tiles[ix]; +}; + +fn set_tile_at(r: room, x: size, y: size, t: tile) void = { + const ix = x+(r.w*y); + r.tiles[ix] = t; +}; + +fn tile_repr(t: tile) str = match (t) { + case wall => yield "\x1b[90m\u2588"; + case floor => yield "\x1b[37m."; +}; + +fn draw_room(r: room) void = { + assert(r.w < 20); + assert(r.h < 20); + for (let x = 0z; x < r.w; x+=1) + for (let y = 0z; y < r.h; y+=1) + put_at(x:int,y:int, tile_repr(tile_at(r,x,y))); +}; + + +export fn main() void = { + const term = setup_term(); + + const tiles: [100]tile = [floor...]; + const room = room { w=10, h=10, tiles=tiles }; + + for (let i = 0z; i < 10; i+=1) { + set_tile_at(room, 0, i, wall); + set_tile_at(room, 9, i, wall); + set_tile_at(room, i, 0, wall); + set_tile_at(room, i, 9, wall); + }; + + let rand = random::init(12345); + for (let i = 0; i < 6; i+=1) { + const x = (random::u64n(&rand, 9)+1): size; + const y = (random::u64n(&rand, 9)+1): size; + set_tile_at(room, x,y, wall); + }; + + + + + let player = player { x=1, y=1 }; + for (true) { + clear(); + draw_room(room); + put_at(player.x, player.y, "@"); + const c = get_key(): rune; + let nx = player.x; + let ny = player.y; + switch (c) { + case 'h' => nx -= 1; + case 'l' => nx += 1; + case 'j' => ny += 1; + case 'k' => ny -= 1; + case 'q' => break; + case => yield; + }; + if (tile_at(room, nx:size, ny:size) is floor) { + player.x = nx; + player.y = ny; + }; + }; + + finish_term(&term); +}; + + -- cgit v1.2.3