module main import std.io import vendor.raylib rl let background_png = @embed("assets/background.png") let bird_midflap_png = @embed("assets/bird_midflap.png") let bird_upflap_png = @embed("assets/bird_upflap.png") let bird_downflap_png = @embed("assets/bird_downflap.png") let pipe_png = @embed("assets/pipe.png") let pipe_head_png = @embed("assets/pipe_head.png") let base_png = @embed("assets/base.png") let die_wav = @embed("assets/die.wav") let hit_wav = @embed("assets/hit.wav") let point_wav = @embed("assets/point.wav") let swoosh_wav = @embed("assets/swoosh.wav") let wing_wav = @embed("assets/wing.wav") let TextureType = type enum { Background, BirdMidflap, BirdUpflap, BirdDownflap, Pipe, PipeHead, Base, } let TextureType.format(self, writer: *mut dyn std.io.Writer) { std.io.wprint(writer, "{}", match self { .Background => "background", .BirdMidflap => "bird_midflap", .BirdUpflap => "bird_upflap", .BirdDownflap => "bird_downflap", .Pipe => "pipe", .PipeHead => "pipe_head", .Base => "base", }) } let SoundType = type enum { Die, Hit, Point, Swoosh, Wing, } let SoundType.format(self, writer: *mut dyn std.io.Writer) { std.io.wprint(writer, "{}", match self { .Die => "die", .Hit => "hit", .Point => "point", .Swoosh => "swoosh", .Wing => "wing", }) } let GameAssets = type struct { background: rl.Texture2D, bird_midflap: rl.Texture2D, bird_upflap: rl.Texture2D, bird_downflap: rl.Texture2D, pipe: rl.Texture2D, pipe_head: rl.Texture2D, base: rl.Texture2D, die: rl.Sound, hit: rl.Sound, point: rl.Sound, swoosh: rl.Sound, wing: rl.Sound, } let load_texture_from_memory(texture: TextureType, png_data: []u8): rl.Texture2D { if @len(png_data) <= 0 { std.io.eprintln("Error: {} texture data length is zero", texture) panic("Failed to load texture from memory") } let image = rl.load_image_from_memory(".png", png_data[:], @len(png_data).(i32)) if !rl.is_image_valid(image) { std.io.eprintln("Error: {} texture data is invalid", texture) panic("Failed to load texture from memory") } let texture = rl.load_texture_from_image(image) rl.unload_image(image) if !rl.is_texture_valid(texture) { std.io.eprintln("Error: {} texture could not be loaded", texture) panic("Failed to load texture from memory") } rl.set_texture_filter(texture, .Point) return texture } let load_sound_from_memory(sound: SoundType, wav_data: []u8): rl.Sound { if @len(wav_data) <= 0 { std.io.eprintln("Error: {} sound data length is zero", sound) panic("Failed to load sound from memory") } let wave = rl.load_wave_from_memory(".wav", wav_data[:], @len(wav_data).(i32)) if !rl.is_wave_valid(wave) { std.io.eprintln("Error: {} sound data is invalid", sound) panic("Failed to load sound from memory") } let loaded_sound = rl.load_sound_from_wave(wave) rl.unload_wave(wave) if !rl.is_sound_valid(loaded_sound) { std.io.eprintln("Error: {} sound could not be loaded", sound) panic("Failed to load sound from memory") } return loaded_sound } let GameAssets.load() = GameAssets.{ background = load_texture_from_memory(.Background, background_png), bird_midflap = load_texture_from_memory(.BirdMidflap, bird_midflap_png), bird_upflap = load_texture_from_memory(.BirdUpflap, bird_upflap_png), bird_downflap = load_texture_from_memory(.BirdDownflap, bird_downflap_png), pipe = load_texture_from_memory(.Pipe, pipe_png), pipe_head = load_texture_from_memory(.PipeHead, pipe_head_png), base = load_texture_from_memory(.Base, base_png), die = load_sound_from_memory(.Die, die_wav), hit = load_sound_from_memory(.Hit, hit_wav), point = load_sound_from_memory(.Point, point_wav), swoosh = load_sound_from_memory(.Swoosh, swoosh_wav), wing = load_sound_from_memory(.Wing, wing_wav), } let GameAssets.unload(*self) { rl.unload_texture(self.background) rl.unload_texture(self.bird_midflap) rl.unload_texture(self.bird_upflap) rl.unload_texture(self.bird_downflap) rl.unload_texture(self.pipe) rl.unload_texture(self.pipe_head) rl.unload_texture(self.base) rl.unload_sound(self.die) rl.unload_sound(self.hit) rl.unload_sound(self.point) rl.unload_sound(self.swoosh) rl.unload_sound(self.wing) }