Make Action struct agnostic
This commit is contained in:
parent
cb171b7cf8
commit
d8e86e24d4
|
@ -0,0 +1,17 @@
|
||||||
|
const Game = @import("Game.zig");
|
||||||
|
const Self = @This();
|
||||||
|
|
||||||
|
activate: bool = false,
|
||||||
|
holding: bool = false,
|
||||||
|
code: u8, // SDL Keycode
|
||||||
|
callback: *const anyopaque,
|
||||||
|
|
||||||
|
pub fn init(code: u8, callback: *const anyopaque) Self {
|
||||||
|
return Self{
|
||||||
|
.code = code,
|
||||||
|
.callback = callback,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
pub fn call(self: Self, state: anytype) void {
|
||||||
|
@call(.{}, @ptrCast(fn (@TypeOf(state)) void, self.callback), .{state});
|
||||||
|
}
|
38
src/Game.zig
38
src/Game.zig
|
@ -6,18 +6,15 @@ const Piece = @import("Piece.zig");
|
||||||
const Bag = @import("Bag.zig");
|
const Bag = @import("Bag.zig");
|
||||||
const Timer = @import("Timer.zig");
|
const Timer = @import("Timer.zig");
|
||||||
const State = @import("flow.zig").State;
|
const State = @import("flow.zig").State;
|
||||||
|
const Action = @import("Action.zig");
|
||||||
|
|
||||||
const renderer = @import("renderer.zig");
|
const renderer = @import("renderer.zig");
|
||||||
const movement = @import("movement.zig");
|
const movement = @import("movement.zig");
|
||||||
|
|
||||||
const Self = @This();
|
const Self = @This();
|
||||||
|
|
||||||
const Action = struct {
|
// Codes to access action list
|
||||||
activate: bool = false,
|
pub const ActionCode = enum(usize) {
|
||||||
holding: bool = false,
|
|
||||||
code: u8,
|
|
||||||
callback: fn (*Self) void,
|
|
||||||
pub const Offset = enum(usize) {
|
|
||||||
right = 0,
|
right = 0,
|
||||||
left = 1,
|
left = 1,
|
||||||
down = 2,
|
down = 2,
|
||||||
|
@ -25,7 +22,6 @@ const Action = struct {
|
||||||
swap = 4,
|
swap = 4,
|
||||||
rot_r = 5,
|
rot_r = 5,
|
||||||
rot_l = 6,
|
rot_l = 6,
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
grid: Grid,
|
grid: Grid,
|
||||||
|
@ -44,13 +40,13 @@ shadow: Piece,
|
||||||
renderer: *SDL.SDL_Renderer,
|
renderer: *SDL.SDL_Renderer,
|
||||||
|
|
||||||
action_list: [7]Action = .{
|
action_list: [7]Action = .{
|
||||||
.{ .code = SDL.SDL_SCANCODE_D, .callback = actionRight }, // Right
|
Action.init(SDL.SDL_SCANCODE_D, actionRight), // Right
|
||||||
.{ .code = SDL.SDL_SCANCODE_A, .callback = actionLeft }, // Left
|
Action.init(SDL.SDL_SCANCODE_A, actionLeft), // Left
|
||||||
.{ .code = SDL.SDL_SCANCODE_S, .callback = actionDown }, // Down
|
Action.init(SDL.SDL_SCANCODE_S, actionDown), // Down
|
||||||
.{ .code = SDL.SDL_SCANCODE_W, .callback = actionHard }, // Instant Drop
|
Action.init(SDL.SDL_SCANCODE_W, actionHard), // Instant Drop
|
||||||
.{ .code = SDL.SDL_SCANCODE_SPACE, .callback = actionSwap }, // Swap Piece
|
Action.init(SDL.SDL_SCANCODE_SPACE, actionSwap), // Swap Piece
|
||||||
.{ .code = SDL.SDL_SCANCODE_RIGHT, .callback = actionRotR }, // Rotate
|
Action.init(SDL.SDL_SCANCODE_RIGHT, actionRotR), // Rotate
|
||||||
.{ .code = SDL.SDL_SCANCODE_LEFT, .callback = actionRotL }, // Rotate
|
Action.init(SDL.SDL_SCANCODE_LEFT, actionRotL), // Rotate
|
||||||
},
|
},
|
||||||
|
|
||||||
timer_down: Timer,
|
timer_down: Timer,
|
||||||
|
@ -108,7 +104,7 @@ pub fn tick(self: *Self) State {
|
||||||
// Repeat Right
|
// Repeat Right
|
||||||
|
|
||||||
// DAS
|
// DAS
|
||||||
if (self.action_list[@enumToInt(Action.Offset.right)].holding) {
|
if (self.action_list[@enumToInt(ActionCode.right)].holding) {
|
||||||
if (!self.timer_right_das.started) {
|
if (!self.timer_right_das.started) {
|
||||||
self.timer_right_das.start();
|
self.timer_right_das.start();
|
||||||
}
|
}
|
||||||
|
@ -124,14 +120,14 @@ pub fn tick(self: *Self) State {
|
||||||
self.timer_right_arr.start();
|
self.timer_right_arr.start();
|
||||||
} else if (self.timer_right_arr.finished()) {
|
} else if (self.timer_right_arr.finished()) {
|
||||||
self.timer_right_arr.stop();
|
self.timer_right_arr.stop();
|
||||||
self.action_list[@enumToInt(Action.Offset.right)].holding = false;
|
self.action_list[@enumToInt(ActionCode.right)].holding = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Repeat Left
|
// Repeat Left
|
||||||
|
|
||||||
// DAS
|
// DAS
|
||||||
if (self.action_list[@enumToInt(Action.Offset.left)].holding) {
|
if (self.action_list[@enumToInt(ActionCode.left)].holding) {
|
||||||
if (!self.timer_left_das.started) {
|
if (!self.timer_left_das.started) {
|
||||||
self.timer_left_das.start();
|
self.timer_left_das.start();
|
||||||
}
|
}
|
||||||
|
@ -147,17 +143,17 @@ pub fn tick(self: *Self) State {
|
||||||
self.timer_left_arr.start();
|
self.timer_left_arr.start();
|
||||||
} else if (self.timer_left_arr.finished()) {
|
} else if (self.timer_left_arr.finished()) {
|
||||||
self.timer_left_arr.stop();
|
self.timer_left_arr.stop();
|
||||||
self.action_list[@enumToInt(Action.Offset.left)].holding = false;
|
self.action_list[@enumToInt(ActionCode.left)].holding = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Repeat Down
|
// Repeat Down
|
||||||
if (self.action_list[@enumToInt(Action.Offset.down)].holding) {
|
if (self.action_list[@enumToInt(ActionCode.down)].holding) {
|
||||||
if (!self.timer_down.started) {
|
if (!self.timer_down.started) {
|
||||||
self.timer_down.start();
|
self.timer_down.start();
|
||||||
} else if (self.timer_down.finished()) {
|
} else if (self.timer_down.finished()) {
|
||||||
self.timer_down.stop();
|
self.timer_down.stop();
|
||||||
self.action_list[@enumToInt(Action.Offset.down)].holding = false;
|
self.action_list[@enumToInt(ActionCode.down)].holding = false;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
self.timer_down.stop();
|
self.timer_down.stop();
|
||||||
|
@ -186,7 +182,7 @@ pub fn tick(self: *Self) State {
|
||||||
// Action
|
// Action
|
||||||
if (action.*.activate) {
|
if (action.*.activate) {
|
||||||
action.*.activate = false;
|
action.*.activate = false;
|
||||||
@call(.{}, action.*.callback, .{self});
|
action.*.call(self);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue