86 lines
1.8 KiB
Odin
86 lines
1.8 KiB
Odin
package main
|
|
|
|
import hm "core:container/handle_map"
|
|
import rl "vendor:raylib"
|
|
|
|
Player :: struct {
|
|
using actor: Actor,
|
|
attack_range: f32,
|
|
attack_dmg: i32,
|
|
attack_cd: f32,
|
|
attack_timer: f32,
|
|
invuln_timer: f32,
|
|
}
|
|
|
|
PlayerInput :: struct {
|
|
move: rl.Vector2,
|
|
attack: bool,
|
|
}
|
|
|
|
make_player :: proc() -> Entity {
|
|
return Entity {
|
|
v = Player {
|
|
actor = Actor {
|
|
base = BaseEntity {
|
|
pos = {0, 0},
|
|
col_size = 16,
|
|
gfx = {0 = GfxCircle{pos = {}, radius = 14, color = {80, 220, 100, 255}}},
|
|
},
|
|
hp = 100,
|
|
max_hp = 100,
|
|
speed = 220,
|
|
},
|
|
attack_range = 75,
|
|
attack_dmg = 35,
|
|
attack_cd = 0.3,
|
|
},
|
|
}
|
|
}
|
|
|
|
sys_input :: proc(state: ^GameState, dt: f32) {
|
|
input: PlayerInput
|
|
|
|
if rl.IsKeyDown(.W) || rl.IsKeyDown(.UP) do input.move += {-1, -1}
|
|
if rl.IsKeyDown(.S) || rl.IsKeyDown(.DOWN) do input.move += {1, 1}
|
|
if rl.IsKeyDown(.A) || rl.IsKeyDown(.LEFT) do input.move += {-1, 1}
|
|
if rl.IsKeyDown(.D) || rl.IsKeyDown(.RIGHT) do input.move += {1, -1}
|
|
input.attack = rl.IsKeyPressed(.SPACE)
|
|
|
|
player_input(state, input, dt)
|
|
}
|
|
|
|
player_input :: proc(state: ^GameState, input: PlayerInput, dt: f32) {
|
|
_, p := get_player(state)
|
|
if p == nil do return
|
|
|
|
p.vel = rl.Vector2Normalize(input.move) * p.speed
|
|
|
|
if p.attack_timer > 0 do p.attack_timer -= dt
|
|
if input.attack && p.attack_timer <= 0 {
|
|
p.attack_timer = p.attack_cd
|
|
|
|
init_attack(
|
|
state,
|
|
Attack {
|
|
base = BaseEntity {
|
|
gfx = {
|
|
0 = GfxRing {
|
|
inner_radius = p.attack_range * 0.7,
|
|
outer_radius = p.attack_range,
|
|
color = {255, 255, 255, 40},
|
|
},
|
|
},
|
|
},
|
|
parent = state.player,
|
|
dmg = p.attack_dmg,
|
|
radius = p.attack_range,
|
|
lifetime = p.attack_cd,
|
|
},
|
|
)
|
|
}
|
|
}
|
|
|
|
player_update :: proc(state: ^GameState, p: ^Player, h: Handle, dt: f32) {
|
|
if p.invuln_timer > 0 do p.invuln_timer -= dt
|
|
}
|