const w4 = @import("wasm4.zig"); const sh0rk = @import("sh0rk.zig"); const sprites = @import("sprites.zig"); const palette = @import("palette.zig"); const Direction = sh0rk.Direction; const Point = sh0rk.Point; const Rect = sh0rk.Rect; var frame_count: u32 = 0; var mara_direction: Direction = Direction.Right; var mara_frame: bool = false; var mara_box: Rect = Rect{.base = Point{.x = 20, .y = 40}, .width = 16, .height = 16}; var mara_speed: i32 = 0; var screen = Rect{.base = Point{.x = 0, .y = 0}, .width = 160, .height = 160}; var sound_timer: u8 = 0; var textBuf: [160]u8 = undefined; export fn start() void { palette.mist(); } const map = @import("./maps/rpg.zig"); fn bonk() void { if (sound_timer != 0) { return; } w4.tone( w4.Tone.Frequency{.start = 220, .end = 40}, w4.Tone.Duration{ .attack = 0, .decay = 0, .sustain = 6, .release = 6, }, w4.Tone.Volume{ .sustain = 100, .attack = 100, }, w4.Tone.Flags{ .channel = .triangle, .pulse_duty = .@"1/2", }, ); sound_timer = 12; } fn drawMap() !void { w4.m.colors.* = .{ ._0 = .p0, ._1 = .p1, ._2 = .p2, ._3 = .p3, }; for (map.data) |tile, i| { const width = sprites.kenney_rpg_width / 16; const height = sprites.kenney_rpg_width / 16; var x: u32 = (i % width) * 16; var y: u32 = (i / height) * 16; w4.blitSub( &sprites.kenney_rpg, x, y, 16, 16, @intCast(u32, tile.x) * 16, @intCast(u32, tile.y) * 16, sprites.kenney_rpg_width, w4.BlitFlags{.two_bits = true}, ); } } fn move_mara(gamepad: w4.GamePad) void { mara_speed -= 1; if (mara_speed < 0) { mara_speed = 0; } if (gamepad.up) { mara_direction = Direction.Up; mara_speed = 1; } else if (gamepad.down) { mara_direction = Direction.Down; mara_speed = 1; } else if (gamepad.left) { mara_direction = Direction.Left; mara_speed = 1; } else if (gamepad.right) { mara_direction = Direction.Right; mara_speed = 1; } switch (mara_direction) { .Up => { mara_box.base.y -= mara_speed; }, .Down => { mara_box.base.y += mara_speed; }, .Left => { mara_box.base.x -= mara_speed; }, .Right => { mara_box.base.x += mara_speed; }, } } export fn update() void { if (sound_timer != 0) { sound_timer -= 1; } drawMap() catch unreachable; // w4.m.colors._0 = .p3; // w4.m.colors._1 = .p0; // w4.text("Mara 2:\nTamamo's Fury", 10, 10); const gamepad = w4.m.gamepads[0]; const old_speed = mara_speed; move_mara(gamepad); for (map.coll) |box| { if (mara_box.collides(box)) { switch (mara_direction) { .Up => { mara_box.base.y += mara_speed; }, .Down => { mara_box.base.y -= mara_speed; }, .Left => { mara_box.base.x += mara_speed; }, .Right => { mara_box.base.x -= mara_speed; }, } mara_speed = 0; bonk(); } } if (mara_box.base.x < 0) { mara_box.base.x = 0; } else if (mara_box.base.x > 160 - mara_box.width) { mara_box.base.x = 160 - mara_box.width; } if (mara_box.base.y < 0) { mara_box.base.y = 0; } else if (mara_box.base.y > 160 - mara_box.height) { mara_box.base.y = 160 - mara_box.height; } var flags: w4.BlitFlags = w4.BlitFlags { .two_bits = true, }; // w4.m.colors._0 = .p0; // w4.m.colors._1 = .p1; // w4.m.colors._2 = .p2; // w4.m.colors._3 = .p3; // w4.blit(&sprites.tamamotitle, 60, 60, sprites.tamamotitle_width, sprites.tamamotitle_height, flags); // w4.m.colors._0 = .p0; // w4.m.colors._1 = .p1; // w4.m.colors._2 = .p3; // w4.m.colors._3 = .transparent; // w4.blit(&sprites.glaceon, 100, 128, sprites.glaceon_width, sprites.glaceon_height, flags); w4.m.colors.* = .{ ._0 = .transparent, ._1 = .p0, ._2 = .p1, ._3 = .p3, }; if (mara_direction == Direction.Left) { flags.flip_x = true; } if (frame_count % 15 == 0 and mara_speed > 0) { mara_frame = !mara_frame; } if (old_speed != mara_speed) { mara_frame = !mara_frame; } var frame: u32 = switch (mara_direction) { .Left => 4, .Right => 4, .Up => 2, .Down => 0, }; var step: u32 = if (mara_frame) 1 else 0; w4.blitSub(&sprites.Mara, @intCast(u32, mara_box.base.x), @intCast(u32, mara_box.base.y), 16, 16, 16 * (frame + step), 0, 96, flags); frame_count += 1; }