diff --git a/data/scripts/game.lua b/data/scripts/game.lua index 9bff208..7cf0efe 100644 --- a/data/scripts/game.lua +++ b/data/scripts/game.lua @@ -11,21 +11,59 @@ function start_blasting(track) audio_play(ctx.udata.blast) end +function process_player(state) + input_action { name = "up", control = "W" } + input_action { name = "left", control = "A" } + input_action { name = "down", control = "S" } + input_action { name = "right", control = "D" } + + local right = vec3_norm(vec3_cross(state.player.camera_direction, { x=0, y=1, z=0 })) + local up = { x = right.z, y = right.y, z = -right.x } + + local direction = { x = 0, y = 0 , z = 0 } + + if input_action_pressed { name = "up" } then + direction = vec3_add(direction, up) + end + if input_action_pressed { name = "down" } then + direction = vec3_sub(direction, up) + end + if input_action_pressed { name = "right" } then + direction = vec3_add(direction, right) + end + if input_action_pressed { name = "left" } then + direction = vec3_sub(direction, right) + end + + if vec3_length(direction) > 0 then + direction = vec3_norm(direction) + end + + state.player.position = vec3_add(state.player.position, vec3_scale(direction, state.player.speed / (60 / state.blast.bpm))) +end + function game_tick() if ctx.initialization_needed then ctx.udata = { time = 0, beat = 0, + player = { + position = { x=3, y=0, z=0 }, + speed = 0.06, -- tiles per beat + camera_direction = { x=-math.sin(math.pi / 4), y=-1, z=math.cos(math.pi / 4) }, + } } - start_blasting("mod22") + start_blasting("mod171") end local state = ctx.udata + process_player(state) + draw_camera { - position = { x=0, y=0, z=0 }, - -- direction = { x=-math.sin(math.pi / 4), y=-1, z=math.cos(math.pi / 4) }, - direction = { x=-math.sin(ctx.frame_number / 100), y=-1, z=math.cos(ctx.frame_number / 100) }, + position = state.player.position, + direction = state.player.camera_direction, + -- direction = { x=-math.sin(ctx.frame_number / 100), y=-1, z=math.cos(ctx.frame_number / 100) }, up = { x=0, y=1, z=0 }, fov = 0, zoom = 0.15 + math.sin(ctx.frame_number / 100) / 20, diff --git a/data/scripts/traxx.lua b/data/scripts/traxx.lua index a49591f..3bc609c 100644 --- a/data/scripts/traxx.lua +++ b/data/scripts/traxx.lua @@ -11,4 +11,10 @@ return { bpm = 177 / 2, loops = true, }, + + mod171 = { + audio = "traxx/mod171.xm", + bpm = 125, + loops = true, + }, } diff --git a/data/scripts/utils.lua b/data/scripts/utils.lua index 2d57ad1..e04c687 100644 --- a/data/scripts/utils.lua +++ b/data/scripts/utils.lua @@ -28,3 +28,39 @@ end function sinease(c, t, d, b) return -c*math.cos(t/d*(math.pi/2)) + c + b end + +function vec3_cross(a, b) + return { + x = a.y * b.z - a.z * b.y, + y = a.z * b.x - a.x * b.z, + z = a.x * b.y - a.y * b.x, + } +end + +function vec3_dot(a, b) + return a.x * b.x + a.y * b.y + a.z * b.z +end + +function vec3_scale(a, s) + return { + x = a.x * s, + y = a.y * s, + z = a.z * s, + } +end + +function vec3_norm(a) + return vec3_scale(a, 1.0 / math.sqrt(vec3_dot(a, a))) +end + +function vec3_add(a, b) + return { x = a.x + b.x, y = a.y + b.y, z = a.z + b.z } +end + +function vec3_sub(a, b) + return { x = a.x - b.x, y = a.y - b.y, z = a.z - b.z } +end + +function vec3_length(a) + return math.sqrt(a.x * a.x + a.y * a.y + a.z * a.z) +end diff --git a/data/traxx/mod171.xm b/data/traxx/mod171.xm new file mode 100755 index 0000000..c7f6818 Binary files /dev/null and b/data/traxx/mod171.xm differ