Ragnarokkr/main.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()
}
}