summaryrefslogtreecommitdiff
path: root/control.ha
blob: ee1f22da1c8f382695279abfccc78761f59c0160 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
use sdl2::*;

type ControlKey = struct {
	key: Key,
	pressed: bool,
};

let CONTROL_KEY_FORWARD = ControlKey { key = KEY_W, ... };
let CONTROL_KEY_BACKWARD = ControlKey { key = KEY_S, ... };
let CONTROL_KEY_LEFT = ControlKey { key = KEY_A, ... };
let CONTROL_KEY_RIGHT = ControlKey { key = KEY_D, ... };
let CONTROL_KEY_JUMP = ControlKey { key = KEY_SPACE, ... };
let CONTROL_KEY_SNEAK = ControlKey { key = KEY_LSHIFT, ... };

const CONTROL_KEYS = [
	&CONTROL_KEY_FORWARD,
	&CONTROL_KEY_BACKWARD,
	&CONTROL_KEY_LEFT,
	&CONTROL_KEY_RIGHT,
	&CONTROL_KEY_JUMP,
	&CONTROL_KEY_SNEAK,
];

fn control_input(event: InputEvent) void = {
	match (event) {
	case CancelEvent =>
		for (let i = 0z; i < len(CONTROL_KEYS); i += 1) {
			CONTROL_KEYS[i].pressed = false;
		};
	case let event: KeyEvent =>
		const pressed = switch (event.status) {
		case ButtonStatus::DOWN, ButtonStatus::HELD =>
			yield true;
		case ButtonStatus::UP =>
			yield false;
		};
		for (let i = 0z; i < len(CONTROL_KEYS); i += 1) {
			if (CONTROL_KEYS[i].key == event.key) {
				CONTROL_KEYS[i].pressed = pressed;
			};
		};
	case => void;
	};
};

type Control = struct {
	yaw: f32,
	pitch: f32,
	walk: f32,
	strafe: f32,
	jump: bool,
	sneak: bool,
};

def MOUSE_SENSITIVITY = 0.115f32;

fn control_frame() void = {
	let mx = 0, my = 0;
	SDL_GetRelativeMouseState(&mx, &my);

	player_control(&Control {
		yaw = mx: f32 * MOUSE_SENSITIVITY,
		pitch = my: f32 * MOUSE_SENSITIVITY,
		walk = (if (CONTROL_KEY_FORWARD.pressed) 1.0f32 else 0.0f32)
			- (if (CONTROL_KEY_BACKWARD.pressed) 1.0f32 else 0.0f32),
		strafe = (if (CONTROL_KEY_LEFT.pressed) 1.0f32 else 0.0f32)
			- (if (CONTROL_KEY_RIGHT.pressed) 1.0f32 else 0.0f32),
		jump = CONTROL_KEY_JUMP.pressed,
		sneak = CONTROL_KEY_SNEAK.pressed,
	});
};