bench there-she-is

This commit is contained in:
me 2025-12-25 00:52:34 +02:00
parent 8b35f18bd8
commit 25a4f1d7dd

View file

@ -21,10 +21,11 @@ let main = fn() {
} }
let screen_size = 360 let screen_size = 360
let shoot_timer = 60 let shoot_timer = 90
let shot_timer = 1
let dim = { let dim = {
.w: 16, .w: 32,
.h: 16, .h: 32,
} }
let bullet_dim = { let bullet_dim = {
.w: dim.w / 4, .w: dim.w / 4,
@ -32,142 +33,203 @@ let bullet_dim = {
} }
let migrate = fn(state) { let migrate = fn(state) {
return setup();
state state
} }
let setup = fn() { let setup = fn() {
return { return {
.player: { .player: {
.pos: { .pos: {
.x: (screen_size - dim.w) - dim.w, .x: (screen_size - dim.w) - dim.w,
.y: dim.h, .y: dim.h * 5,
}, },
.speed: 360, .speed: 220,
}, .shot: 1,
.enemy: { .shot_timer: 0,
.pos: { },
.x: dim.w, .opponent: {
.y: dim.h, .pos: {
}, .x: dim.w,
.speed: 20, .y: dim.h,
.timer: shoot_timer, },
}, .speed: 60,
.bullets: { .timer: 0,
.pos: { },
.x: dim.w, .bullets: {
.y: dim.h, .pos: {
}, .x: -20,
.movement: { .y: -20,
.x: 0, },
.y: 0, .movement: {
}, .x: 0,
.speed: 180, .y: 0,
}, },
.timer: 0, .speed: 180,
.status: \"ongoing\", },
}; .timer: 0,
.status: \"ongoing\",
}
} }
let move_player = fn(state, input) { let move_player = fn(state, input) {
let delta = get_frame_time(); let delta = get_frame_time()
let dpad_x = if input.gamepad1.dpad.right { 1 } else { 0 } + if input.gamepad1.dpad.left { -1 } else { 0 }; let dpad_x = if input.gamepad1.dpad.right { 1 } else { 0 } + if input.gamepad1.dpad.left { -1 } else { 0 }
let dpad_y = if input.gamepad1.dpad.down { 1 } else { 0 } + if input.gamepad1.dpad.up { -1 } else { 0 }; let dpad_y = if input.gamepad1.dpad.down { 1 } else { 0 } + if input.gamepad1.dpad.up { -1 } else { 0 }
let movement = { let movement = {
.x: input.gamepad1.sticks.left.x + dpad_x, .x: input.gamepad1.sticks.left.x + dpad_x,
.y: input.gamepad1.sticks.left.y + dpad_y, .y: input.gamepad1.sticks.left.y + dpad_y,
}; }
state.player.pos.x = state.player.pos.x =
max(0, max(0,
min( state.player.pos.x + (delta * state.player.speed * movement.x) min( state.player.pos.x + ((delta * state.player.speed * movement.x) / state.player.shot)
, screen_size - dim.w , screen_size - dim.w
) )
); )
state.player.pos.y = state.player.pos.y =
max(0, max(0,
min( state.player.pos.y + (delta * state.player.speed * movement.y) min( state.player.pos.y + ((delta * state.player.speed * movement.y) / state.player.shot)
, screen_size - dim.w , screen_size - dim.w
) )
); )
}
let move_opponent = fn(state) {
let delta = get_frame_time()
let opponent_movement = {
.x: if abs(state.opponent.pos.x - state.player.pos.x) < 5 { 0 } else { if state.opponent.pos.x < state.player.pos.x { 1 } else { -1 } },
.y: if abs(state.opponent.pos.y - state.player.pos.y) < 5 { 0 } else { if state.opponent.pos.y < state.player.pos.y { 1 } else { -1 } },
}
state.opponent.pos.x =
max(0,
min( state.opponent.pos.x + (delta * state.opponent.speed * opponent_movement.x)
, screen_size - dim.w
)
)
state.opponent.pos.y =
max(0,
min( state.opponent.pos.y + (delta * state.opponent.speed * opponent_movement.y)
, screen_size - dim.w
)
)
shoot_bullets(state, opponent_movement)
}
let shoot_bullets = fn(state, opponent_movement) {
let delta = get_frame_time()
state.opponent.timer = state.opponent.timer - 1
if (state.opponent.timer <= 0) && (state.status != \"caught\") {
state.opponent.timer = shoot_timer
state.bullets.pos.x = state.opponent.pos.x + (dim.w * opponent_movement.x)
state.bullets.pos.y = state.opponent.pos.y + (dim.h * opponent_movement.y)
state.bullets.movement.x = opponent_movement.x
state.bullets.movement.y = opponent_movement.y
}
}
let move_bullets = fn(state) {
let delta = get_frame_time()
state.bullets.pos.x =
state.bullets.pos.x + (delta * state.bullets.speed * state.bullets.movement.x)
state.bullets.pos.y =
state.bullets.pos.y + (delta * state.bullets.speed * state.bullets.movement.y)
} }
let update = fn(state, input) { let update = fn(state, input) {
let delta = get_frame_time(); let delta = get_frame_time()
state.timer = state.timer + delta;
move_player(state, input); if state.status != \"caught\" {
state.timer = state.timer + delta
}
let enemy_movement = { if state.status == \"ongoing\" {
.x: if abs(state.enemy.pos.x - state.player.pos.x) < 5 { 0 } else { if state.enemy.pos.x < state.player.pos.x { 1 } else { -1 } }, move_player(state, input)
.y: if abs(state.enemy.pos.y - state.player.pos.y) < 5 { 0 } else { if state.enemy.pos.y < state.player.pos.y { 1 } else { -1 } }, }
};
state.enemy.pos.x = if state.player.shot_timer > 0 {
max(0, state.player.shot_timer = state.player.shot_timer - delta
min( state.enemy.pos.x + (delta * state.enemy.speed * enemy_movement.x) } else {
, screen_size - dim.w state.player.shot_timer = 0
) }
);
state.enemy.pos.y =
max(0,
min( state.enemy.pos.y + (delta * state.enemy.speed * enemy_movement.y)
, screen_size - dim.w
)
);
state.enemy.timer = state.enemy.timer - 1; move_opponent(state)
if state.enemy.timer == 0 { move_bullets(state)
state.enemy.timer = shoot_timer;
state.bullets.pos.x = state.enemy.pos.x + (dim.w * enemy_movement.x);
state.bullets.pos.y = state.enemy.pos.y + (dim.h * enemy_movement.y);
state.bullets.movement.x = enemy_movement.x;
state.bullets.movement.y = enemy_movement.y;
};
state.bullets.pos.x = if is_touching(make_rect(state.bullets.pos, { .w: dim.w / 2, .h: dim.h / 2 }), make_rect(state.player.pos, dim)) && (state.player.shot_timer == 0) {
state.bullets.pos.x + (delta * state.bullets.speed * state.bullets.movement.x); state.player.shot = state.player.shot + 1
state.bullets.pos.y = state.player.shot_timer = shot_timer
state.bullets.pos.y + (delta * state.bullets.speed * state.bullets.movement.y); }
if is_touching(make_rect(state.opponent.pos, dim), make_rect(state.player.pos, dim)) {
state.status = \"caught\"
}
return state; if input.gamepad1.buttons.y {
let new_state = setup()
state.player = new_state.player
state.opponent = new_state.opponent
state.bullets = new_state.bullets
state.status = new_state.status
state.timer = new_state.timer
}
state
} }
let draw = fn(state) { let draw = fn(state) {
frame_clear(0, 0, 0); frame_clear(0, 0, 0)
let player_rect = { let player_rect = {
.x: state.player.pos.x, .x: state.player.pos.x,
.y: state.player.pos.y, .y: state.player.pos.y,
.w: dim.w, .w: dim.w,
.h: dim.h, .h: dim.h,
}; }
let color = { .r: 155, .g: 205, .b: 255 }; let color = { .r: 105 + (state.player.shot_timer * 100), .g: 225, .b: 125 }
draw_rectangle(player_rect, color); draw_rectangle(player_rect, color)
let enemy_rect = { let opponent_rect = {
.x: state.enemy.pos.x, .x: state.opponent.pos.x,
.y: state.enemy.pos.y, .y: state.opponent.pos.y,
.w: dim.w, .w: dim.w,
.h: dim.h, .h: dim.h,
}; }
let color = { .r: 255, .g: 155, .b: 255 }; let color = { .r: 255, .g: 155, .b: 255 - (state.player.shot_timer * 50) }
draw_rectangle(enemy_rect, color); draw_rectangle(opponent_rect, color)
let bullet_rect = { let bullet_rect = {
.x: state.bullets.pos.x, .x: state.bullets.pos.x,
.y: state.bullets.pos.y, .y: state.bullets.pos.y,
.w: bullet_dim.w, .w: bullet_dim.w,
.h: bullet_dim.h, .h: bullet_dim.h,
}; }
let color = { .r: 255, .g: 255, .b: 255 }; let color = { .r: 255, .g: 135, .b: 225 }
draw_rectangle(bullet_rect, color); draw_rectangle(bullet_rect, color)
draw_text(\"RUN!!!\", 20, 50, 50, { .r: 255, .g: 55, .b: 55 }); if state.status == \"caught\" {
draw_text(\"You got caught <3\", 20, 20, 20, { .r: 155, .g: 55, .b: 255 })
} else {
draw_text(\"There she is!\", 40, 20, 20, { .r: 255, .g: 55, .b: 155 })
if state.player.shot_timer > 0 {
draw_text(\"<3\", 200, 20, 20, {
.r: 100 + (state.player.shot_timer * 50 * state.player.shot) % 255,
.g: 100,
.b: 100,
})
}
}
draw_text(state.timer, 260, 20, 20, { .r: 55, .g: 205, .b: 155 })
} }
let min = fn(a,b) { let min = fn(a,b) {
@ -187,16 +249,26 @@ let max = fn(a,b) {
} }
let abs = fn(a) { let abs = fn(a) {
if a >= 0 { a } else { 0 - a } if a >= 0 { a } else { 0 - a }
}
let make_rect = fn(pos, dim) {
{ .x: pos.x,
.y: pos.y,
.w: dim.w,
.h: dim.h,
}
} }
let is_touching = fn(rect1, rect2) { let is_touching = fn(rect1, rect2) {
if ((rect1.x < rect2.x) && ((rect1.x + rect1.w) > rect2.x)) if (((rect1.x < rect2.x) && ((rect1.x + rect1.w) > rect2.x))
&& ((rect1.y < rect2.y) && ((rect1.y + rect1.h) > rect2.y)) { && ((rect1.y < rect2.y) && ((rect1.y + rect1.h) > rect2.y)))
true || (((rect2.x < rect1.x) && ((rect2.x + rect2.w) > rect1.x))
} else { && ((rect2.y < rect1.y) && ((rect2.y + rect2.h) > rect1.y))) {
false true
} } else {
false
}
} }
"; ";
ayin::run_main(black_box(program)) ayin::run_main(black_box(program))