159 lines
4.4 KiB
Odin
159 lines
4.4 KiB
Odin
package main
|
|
|
|
import rl "vendor:raylib"
|
|
import "core:path/filepath"
|
|
import "core:strings"
|
|
|
|
vec3 :: [3]f32
|
|
vec2 :: [2]f32
|
|
vec3right := vec3{1, 0, 0}
|
|
vec3left := vec3{-1, 0, 0}
|
|
vec3up := vec3{0, 1, 0}
|
|
vec3down := vec3{0, -1, 0}
|
|
vec3forward := vec3{0, 0, 1}
|
|
vec3backward := vec3{0, 0, -1}
|
|
|
|
|
|
WSize := [2]f32{}
|
|
WSizei := [2]i32{}
|
|
|
|
WindowShouldExit := false
|
|
|
|
NeedTutorial := true
|
|
KeyboardOnly := false
|
|
|
|
|
|
Overlay_Opacity : f32 = 0
|
|
|
|
Resources :: struct {
|
|
Fonts: struct {
|
|
UI: rl.Font,
|
|
Title: rl.Font,
|
|
},
|
|
Models: struct {
|
|
PlayerModel: rl.Model,
|
|
SnakeHeadTop: rl.Model,
|
|
SnakeHeadJaw: rl.Model,
|
|
SnakeBody: rl.Model,
|
|
Background: rl.Model,
|
|
},
|
|
Sfx: struct {
|
|
Drums: rl.Sound,
|
|
Lightning: rl.Sound,
|
|
LightningHit: rl.Sound,
|
|
Rocket: rl.Sound,
|
|
PlayerHit: rl.Sound,
|
|
PlayerSwoosh: rl.Sound,
|
|
PlayerDead: rl.Sound,
|
|
SnakeGrowl: rl.Sound,
|
|
SnakeRoarBlast: rl.Sound,
|
|
SnakeEarthHit: rl.Sound,
|
|
SnakeSegmentExplode: rl.Sound,
|
|
SnakeBeam: rl.Sound,
|
|
},
|
|
Music: struct {
|
|
First: rl.Music,
|
|
Second: rl.Music,
|
|
}
|
|
}
|
|
|
|
Res : Resources
|
|
|
|
|
|
load_sfx :: proc(name: string, volume: f32 = 1) -> rl.Sound {
|
|
p := filepath.join([]string{"./assets/sfx/", name})
|
|
cstr := strings.clone_to_cstring(p)
|
|
snd := rl.LoadSound(cstr)
|
|
rl.SetSoundVolume(snd, volume)
|
|
return snd
|
|
}
|
|
|
|
load_music :: proc(name: string, volume: f32 = 1) -> rl.Music {
|
|
p := filepath.join([]string{"./assets/music/", name})
|
|
cstr := strings.clone_to_cstring(p)
|
|
snd := rl.LoadMusicStream(cstr)
|
|
rl.SetMusicVolume(snd, volume)
|
|
return snd
|
|
}
|
|
|
|
current_music : rl.Music
|
|
|
|
change_track :: proc(music: rl.Music) {
|
|
rl.StopMusicStream(current_music)
|
|
current_music = music
|
|
rl.PlayMusicStream(current_music)
|
|
}
|
|
|
|
Cursor : rl.Texture
|
|
load_resources :: proc() {
|
|
Res.Fonts.Title = rl.LoadFontEx("./assets/fonts/norse.otf", 96*2, nil, 2048)
|
|
Res.Fonts.UI = rl.LoadFontEx("./assets/fonts/PTSerif-Regular.ttf", 96, nil, 2048)
|
|
|
|
Res.Models.PlayerModel = rl.LoadModel("./assets/models/chariot.glb")
|
|
Res.Models.SnakeHeadTop = rl.LoadModel("./assets/models/snake_head_top.obj")
|
|
Res.Models.SnakeHeadJaw = rl.LoadModel("./assets/models/snake_jaw.obj")
|
|
Res.Models.SnakeBody = rl.LoadModel("./assets/models/snake_body.obj")
|
|
|
|
Res.Sfx.Drums = load_sfx("drums.ogg")
|
|
Res.Sfx.Lightning = load_sfx("lightning.ogg", 0.5)
|
|
Res.Sfx.LightningHit = load_sfx("lightning-hit.ogg", 0.3)
|
|
Res.Sfx.Rocket = load_sfx("rocket.ogg", 0.5)
|
|
Res.Sfx.PlayerHit = load_sfx("player-hit.ogg", 0.5)
|
|
Res.Sfx.PlayerSwoosh = load_sfx("player-swoosh.ogg")
|
|
Res.Sfx.PlayerDead = load_sfx("player-dead.ogg")
|
|
Res.Sfx.SnakeGrowl = load_sfx("snake-growl.ogg", 0.7)
|
|
Res.Sfx.SnakeRoarBlast = load_sfx("snake-roar-blast.ogg", 0.8)
|
|
Res.Sfx.SnakeBeam = load_sfx("snake-beam.ogg")
|
|
Res.Sfx.SnakeSegmentExplode = load_sfx("snake-segment-explode.ogg", 0.8)
|
|
Res.Sfx.SnakeEarthHit = load_sfx("snake-earth-hit.ogg", 0.6)
|
|
|
|
Res.Music.First = load_music("alexander-nakarada-mjolnir.mp3", 0.7)
|
|
Res.Music.Second = load_music("alexander-nakarada-the-northern-path.mp3", 0.7)
|
|
}
|
|
|
|
Fullscreen := true
|
|
|
|
main :: proc() {
|
|
rl.SetConfigFlags(rl.ConfigFlags{.MSAA_4X_HINT, .FULLSCREEN_MODE, .VSYNC_HINT, .WINDOW_RESIZABLE})
|
|
rl.SetWindowMinSize(800, 480)
|
|
|
|
rl.InitWindow(0, 0, "Ragnarøkkr")
|
|
rl.InitAudioDevice()
|
|
|
|
rl.HideCursor()
|
|
Cursor = rl.LoadTexture("./assets/gfx/crosshair.png")
|
|
load_resources()
|
|
|
|
WSizei = {rl.GetScreenWidth(), rl.GetScreenHeight()}
|
|
WSize = {f32(WSizei.x), f32(WSizei.y)}
|
|
|
|
game := game_init()
|
|
stack_push(game)
|
|
menu := menu_init(game)
|
|
stack_push(menu)
|
|
|
|
for !WindowShouldExit {
|
|
if rl.IsWindowResized() {
|
|
WSizei = {rl.GetScreenWidth(), rl.GetScreenHeight()}
|
|
WSize = {f32(WSizei.x), f32(WSizei.y)}
|
|
}
|
|
|
|
rl.UpdateMusicStream(current_music)
|
|
|
|
state := stack_top()
|
|
delta := rl.GetFrameTime()
|
|
timers_process(delta)
|
|
tweens_process(delta)
|
|
state->update(delta)
|
|
|
|
rl.BeginDrawing()
|
|
rl.ClearBackground(rl.SKYBLUE)
|
|
state->draw()
|
|
|
|
rl.DrawRectangleV({}, WSize, rl.Color{0, 0, 0, u8(Overlay_Opacity * 255)})
|
|
pos := rl.GetMousePosition()
|
|
rl.DrawTextureEx(Cursor, pos - {16, 16} * 3, 0, 3, rl.WHITE)
|
|
rl.EndDrawing()
|
|
}
|
|
}
|