diff --git a/game.ayin b/game.ayin index c63a095..31359c7 100644 --- a/game.ayin +++ b/game.ayin @@ -1,8 +1,9 @@ let screen_size = 360 -let shoot_timer = 60 +let shoot_timer = 120 +let shot_timer = 1 let dim = { - .w: 16, - .h: 16, + .w: 32, + .h: 32, } let bullet_dim = { .w: dim.w / 4, @@ -10,41 +11,41 @@ let bullet_dim = { } let migrate = fn(state) { - return setup(); state } - let setup = fn() { return { .player: { - .pos: { - .x: (screen_size - dim.w) - dim.w, - .y: dim.h, - }, + .pos: { + .x: (screen_size - dim.w) - dim.w, + .y: dim.h, + }, .speed: 360, - }, - .enemy: { - .pos: { - .x: dim.w, - .y: dim.h, - }, - .speed: 20, - .timer: shoot_timer, - }, - .bullets: { - .pos: { - .x: dim.w, - .y: dim.h, - }, - .movement: { - .x: 0, - .y: 0, - }, - .speed: 180, - }, - .timer: 0, - .status: "ongoing", + .shot: 1, + .shot_timer: 0, + }, + .enemy: { + .pos: { + .x: dim.w, + .y: dim.h, + }, + .speed: 60, + .timer: 0, + }, + .bullets: { + .pos: { + .x: dim.w, + .y: dim.h, + }, + .movement: { + .x: 0, + .y: 0, + }, + .speed: 180, + }, + .timer: 0, + .status: "ongoing", }; } @@ -61,23 +62,20 @@ let move_player = fn(state, input) { state.player.pos.x = max(0, - min( state.player.pos.x + (delta * state.player.speed * movement.x) - , screen_size - dim.w - ) - ); + min( state.player.pos.x + ((delta * state.player.speed * movement.x) / state.player.shot) + , screen_size - dim.w + ) + ); state.player.pos.y = max(0, - min( state.player.pos.y + (delta * state.player.speed * movement.y) - , screen_size - dim.w - ) + min( state.player.pos.y + ((delta * state.player.speed * movement.y) / state.player.shot) + , screen_size - dim.w + ) ); } -let update = fn(state, input) { +let move_enemy = fn(state) { let delta = get_frame_time(); - state.timer = state.timer + delta; - - move_player(state, input); let enemy_movement = { .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 } }, @@ -87,29 +85,70 @@ let update = fn(state, input) { state.enemy.pos.x = max(0, min( state.enemy.pos.x + (delta * state.enemy.speed * enemy_movement.x) - , screen_size - dim.w - ) - ); + , screen_size - dim.w + ) + ); state.enemy.pos.y = max(0, min( state.enemy.pos.y + (delta * state.enemy.speed * enemy_movement.y) - , screen_size - dim.w - ) + , screen_size - dim.w + ) ); + shoot_bullets(state, enemy_movement); +} + +let shoot_bullets = fn(state, enemy_movement) { + let delta = get_frame_time(); + state.enemy.timer = state.enemy.timer - 1; - if state.enemy.timer == 0 { - 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; + if (state.enemy.timer <= 0) && (state.status != "caught") { + 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; }; +} + +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 delta = get_frame_time(); + + if state.status != "caught" { + state.timer = state.timer + delta; + }; + + if state.status == "ongoing" { + move_player(state, input); + }; + + if state.player.shot_timer > 0 { + state.player.shot_timer = state.player.shot_timer - delta; + } else { + state.player.shot_timer = 0; + }; + + move_enemy(state); + move_bullets(state); + + 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.player.shot = state.player.shot + 1; + state.player.shot_timer = shot_timer; + }; + if is_touching(make_rect(state.enemy.pos, dim), make_rect(state.player.pos, dim)) { + state.status = "caught"; + }; return state; } @@ -145,7 +184,21 @@ let draw = fn(state) { let color = { .r: 255, .g: 255, .b: 255 }; 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!", 20, 20, 20, { .r: 155, .g: 55, .b: 255 }); + } else { + draw_text("RUN!!!", 20, 20, 20, { .r: 255, .g: 55, .b: 155 }); + + if state.player.shot_timer > 0 { + draw_text("Oof!", 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) { @@ -165,14 +218,24 @@ let max = fn(a,b) { } 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) { - if ((rect1.x < rect2.x) && ((rect1.x + rect1.w) > rect2.x)) - && ((rect1.y < rect2.y) && ((rect1.y + rect1.h) > rect2.y)) { - true - } else { - false - } + if (((rect1.x < rect2.x) && ((rect1.x + rect1.w) > rect2.x)) + && ((rect1.y < rect2.y) && ((rect1.y + rect1.h) > rect2.y))) + || (((rect2.x < rect1.x) && ((rect2.x + rect2.w) > rect1.x)) + && ((rect2.y < rect1.y) && ((rect2.y + rect2.h) > rect1.y))) { + true + } else { + false + } }