tamamo/src/main.zig

263 lines
6.3 KiB
Zig

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 textBuf: [160]u8 = undefined;
export fn start() void {
palette.mist();
}
const Tile = packed struct {
x: u4,
y: u4,
};
pub const map = [100]Tile{
Tile{.x = 8, .y = 2},
Tile{.x = 8, .y = 2},
Tile{.x = 8, .y = 2},
Tile{.x = 8, .y = 2},
Tile{.x = 8, .y = 2},
Tile{.x = 8, .y = 2},
Tile{.x = 8, .y = 2},
Tile{.x = 8, .y = 2},
Tile{.x = 8, .y = 2},
Tile{.x = 8, .y = 2},
Tile{.x = 8, .y = 2},
Tile{.x = 8, .y = 2},
Tile{.x = 8, .y = 2},
Tile{.x = 8, .y = 2},
Tile{.x = 8, .y = 2},
Tile{.x = 8, .y = 2},
Tile{.x = 8, .y = 2},
Tile{.x = 8, .y = 2},
Tile{.x = 8, .y = 2},
Tile{.x = 8, .y = 2},
Tile{.x = 8, .y = 2},
Tile{.x = 8, .y = 2},
Tile{.x = 8, .y = 2},
Tile{.x = 8, .y = 2},
Tile{.x = 8, .y = 2},
Tile{.x = 8, .y = 2},
Tile{.x = 8, .y = 2},
Tile{.x = 8, .y = 2},
Tile{.x = 8, .y = 2},
Tile{.x = 8, .y = 2},
Tile{.x = 8, .y = 2},
Tile{.x = 8, .y = 2},
Tile{.x = 8, .y = 2},
Tile{.x = 8, .y = 2},
Tile{.x = 8, .y = 2},
Tile{.x = 7, .y = 1},
Tile{.x = 8, .y = 2},
Tile{.x = 8, .y = 2},
Tile{.x = 8, .y = 2},
Tile{.x = 8, .y = 2},
Tile{.x = 8, .y = 2},
Tile{.x = 8, .y = 2},
Tile{.x = 8, .y = 2},
Tile{.x = 8, .y = 2},
Tile{.x = 8, .y = 2},
Tile{.x = 7, .y = 3},
Tile{.x = 8, .y = 2},
Tile{.x = 8, .y = 2},
Tile{.x = 8, .y = 2},
Tile{.x = 8, .y = 2},
Tile{.x = 0, .y = 0},
Tile{.x = 1, .y = 0},
Tile{.x = 2, .y = 0},
Tile{.x = 3, .y = 0},
Tile{.x = 1, .y = 0},
Tile{.x = 7, .y = 4},
Tile{.x = 3, .y = 0},
Tile{.x = 1, .y = 0},
Tile{.x = 2, .y = 0},
Tile{.x = 3, .y = 0},
Tile{.x = 5, .y = 0},
Tile{.x = 9, .y = 4},
Tile{.x = 9, .y = 4},
Tile{.x = 9, .y = 4},
Tile{.x = 9, .y = 4},
Tile{.x = 9, .y = 4},
Tile{.x = 9, .y = 4},
Tile{.x = 1, .y = 2},
Tile{.x = 9, .y = 4},
Tile{.x = 2, .y = 2},
Tile{.x = 5, .y = 1},
Tile{.x = 1, .y = 2},
Tile{.x = 9, .y = 4},
Tile{.x = 2, .y = 2},
Tile{.x = 9, .y = 4},
Tile{.x = 2, .y = 4},
Tile{.x = 9, .y = 4},
Tile{.x = 9, .y = 4},
Tile{.x = 9, .y = 4},
Tile{.x = 9, .y = 4},
Tile{.x = 5, .y = 2},
Tile{.x = 0, .y = 4},
Tile{.x = 9, .y = 4},
Tile{.x = 9, .y = 4},
Tile{.x = 9, .y = 4},
Tile{.x = 9, .y = 4},
Tile{.x = 9, .y = 4},
Tile{.x = 1, .y = 2},
Tile{.x = 9, .y = 4},
Tile{.x = 9, .y = 4},
Tile{.x = 5, .y = 0},
Tile{.x = 9, .y = 4},
Tile{.x = 9, .y = 4},
Tile{.x = 9, .y = 4},
Tile{.x = 1, .y = 2},
Tile{.x = 9, .y = 4},
Tile{.x = 9, .y = 4},
Tile{.x = 9, .y = 4},
Tile{.x = 1, .y = 4},
Tile{.x = 9, .y = 4},
};
fn drawMap() !void {
w4.m.colors.* = .{
._0 = .p0,
._1 = .p1,
._2 = .p2,
._3 = .p3,
};
for (map) |tile, i| {
var x: u32 = i % 10;
var y: u32 = i / 10;
w4.blitSub(
&sprites.Cave,
x * 16,
y * 16,
16,
16,
@intCast(u32, tile.x) * 16,
@intCast(u32, tile.y) * 16,
sprites.Cave_width,
w4.BlitFlags{.two_bits = true},
);
}
}
export fn update() void {
// w4.m.colors._0 = .p3;
// w4.m.colors._1 = .p0;
// w4.text("Mara 2:\nTamamo's Fury", 10, 10);
drawMap() catch unreachable;
const gamepad = w4.m.gamepads[0];
var old_speed = mara_speed;
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;
},
}
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;
}