ayin/src/runtime/runtime.rs
2025-12-21 00:29:51 +02:00

193 lines
6.3 KiB
Rust

use super::primitive_functions::primitive_funcs;
use super::types::*;
use crate::ast;
use crate::ast::helpers;
use crate::interpret;
use gamepads;
use macroquad::prelude::*;
pub async fn setup(code: ast::Program) -> State {
let font = load_ttf_font("./assets/fonts/monogram.ttf").await.unwrap();
let mut state = match interpret::setup(code, primitive_funcs()) {
Ok(state) => state,
Err(err) => {
println!("Error: {}", err);
interpret::State::new("game".into(), primitive_funcs())
}
};
let game_state = match interpret::interpret(&mut state, "setup".into(), vec![]) {
Ok(result) => result,
Err(err) => {
println!("Error: {}", err);
ast::UNIT_VALUE
}
};
State {
assets: Assets { font },
state,
game_state,
gamepads: gamepads::Gamepads::new(),
}
}
pub async fn migrate(mut state: State, code: ast::Program) -> State {
println!("Migrating...");
match interpret::setup(code, primitive_funcs()) {
Err(err) => {
println!("Error: {}", err);
state
}
Ok(mut new_program_state) => {
match interpret::value_to_stadnalone_expr(&state.state, state.game_state.clone()) {
Err(err) => {
println!("Error: {}", err);
state
}
Ok(expanded_game_state) => {
match interpret::interpret(
&mut new_program_state,
"migrate".into(),
vec![expanded_game_state],
) {
Err(err) => {
println!("Error: {}", err);
state
}
Ok(result) => {
println!("Success!");
state.game_state = result;
state.state = new_program_state;
state
}
}
}
}
}
}
}
pub fn update(state: &mut State, input: Input) {
let input = helpers::record(vec![(
"gamepad1",
helpers::record(vec![
(
"buttons",
helpers::record(vec![
("a", input.gamepad1.buttons.a.into()),
("b", input.gamepad1.buttons.b.into()),
("x", input.gamepad1.buttons.x.into()),
("y", input.gamepad1.buttons.y.into()),
]),
),
(
"dpad",
helpers::record(vec![
("left", input.gamepad1.dpad.left.into()),
("right", input.gamepad1.dpad.right.into()),
("up", input.gamepad1.dpad.up.into()),
("down", input.gamepad1.dpad.down.into()),
]),
),
(
"sticks",
helpers::record(vec![
(
"left",
helpers::record(vec![
("x", input.gamepad1.left_stick.x.into()),
("y", (0.0 - input.gamepad1.left_stick.y).into()),
]),
),
(
"right",
helpers::record(vec![
("x", input.gamepad1.right_stick.x.into()),
("y", (0.0 - input.gamepad1.right_stick.y).into()),
]),
),
]),
),
]),
)]);
match interpret::interpret(
&mut state.state,
"update".into(),
vec![ast::Expr::Value(state.game_state.clone()), input],
) {
Ok(_) => {}
Err(err) => println!("Error: {}", err),
}
}
pub fn fetch_events(state: &mut State) -> Input {
state.gamepads.poll();
let mut input = Input::new();
for gamepad in state.gamepads.all() {
//println!("{:#?}", gamepad.all_currently_pressed().collect::<Vec<_>>());
// action buttons
input.gamepad1.buttons.a = gamepad.is_currently_pressed(gamepads::Button::ActionRight);
input.gamepad1.buttons.b = gamepad.is_currently_pressed(gamepads::Button::ActionDown);
input.gamepad1.buttons.x = gamepad.is_currently_pressed(gamepads::Button::ActionUp);
input.gamepad1.buttons.y = gamepad.is_currently_pressed(gamepads::Button::ActionLeft);
// dpad
input.gamepad1.dpad.left = gamepad.is_currently_pressed(gamepads::Button::DPadLeft);
input.gamepad1.dpad.right = gamepad.is_currently_pressed(gamepads::Button::DPadRight);
input.gamepad1.dpad.up = gamepad.is_currently_pressed(gamepads::Button::DPadUp);
input.gamepad1.dpad.down = gamepad.is_currently_pressed(gamepads::Button::DPadDown);
// shoulders
input.gamepad1.shoulders.l1 =
gamepad.is_currently_pressed(gamepads::Button::FrontLeftUpper);
input.gamepad1.shoulders.r1 =
gamepad.is_currently_pressed(gamepads::Button::FrontRightUpper);
input.gamepad1.shoulders.l2 = gamepad.left_trigger();
input.gamepad1.shoulders.r2 = gamepad.right_trigger();
// sticks
input.gamepad1.left_stick.x = gamepad.left_stick_x();
input.gamepad1.left_stick.y = gamepad.left_stick_y();
input.gamepad1.right_stick.x = gamepad.right_stick_x();
input.gamepad1.right_stick.y = gamepad.right_stick_y();
break;
}
input
}
pub fn draw(state: &mut State) {
clear_background(Color::from_hex(0x081829));
set_default_camera();
let (w, h) = (SCREEN_WIDTH as f32 / 2., 400.0);
set_camera(&Camera2D {
zoom: vec2(2.2 / w, 2.2 / h),
target: Vec2 { x: w / 2.2, y: 0.0 },
viewport: Some((0, 0, w as i32, h as i32)),
..Default::default()
});
set_default_camera();
match interpret::interpret(
&mut state.state,
"draw".into(),
vec![ast::Expr::Value(state.game_state.clone())],
) {
Ok(_) => {}
Err(err) => println!("Error: {}", err),
}
draw_fps();
/*
println!(
"{:#?}",
interpret::value_to_stadnalone_expr(&state.state, state.game_state.clone())
);
*/
}