use static rather than const

This commit is contained in:
Corwin 2023-12-10 16:35:15 +00:00
parent 92c39ecc5d
commit 184b11ed81
No known key found for this signature in database
43 changed files with 328 additions and 330 deletions

View file

@ -414,15 +414,15 @@ pub fn include_aseprite_inner(input: TokenStream) -> TokenStream {
#(#include_paths)* #(#include_paths)*
const PALETTES: &[Palette16] = &[ static PALETTES: &[Palette16] = &[
#(#palette_data),* #(#palette_data),*
]; ];
pub const SPRITES: &[Sprite] = &[ static SPRITES: &[Sprite] = &[
#(#sprites),* #(#sprites),*
]; ];
const TAGS: &TagMap = &TagMap::new( static TAGS: TagMap = TagMap::new(
&[ &[
#(#tags),* #(#tags),*
] ]

View file

@ -31,7 +31,7 @@ pub(crate) fn generate_palette_code(
}); });
quote! { quote! {
pub const PALETTES: &[#crate_prefix::display::palette16::Palette16] = &[#(#palettes),*]; pub static PALETTES: &[#crate_prefix::display::palette16::Palette16] = &[#(#palettes),*];
} }
} }
@ -122,7 +122,7 @@ pub(crate) fn generate_code(
quote! { quote! {
#[allow(non_upper_case_globals)] #[allow(non_upper_case_globals)]
pub const #output_variable_name: #crate_prefix::display::tile_data::TileData = { pub static #output_variable_name: #crate_prefix::display::tile_data::TileData = {
const _: &[u8] = include_bytes!(#image_filename); const _: &[u8] = include_bytes!(#image_filename);
const TILE_DATA: &[u8] = { const TILE_DATA: &[u8] = {

View file

@ -18,7 +18,7 @@ fn main(mut gba: agb::Gba) -> ! {
let (gfx, mut vram) = gba.display.video.tiled1(); let (gfx, mut vram) = gba.display.video.tiled1();
let vblank = agb::interrupt::VBlank::get(); let vblank = agb::interrupt::VBlank::get();
let tileset = affine_tiles::water_tiles.tiles; let tileset = &affine_tiles::water_tiles.tiles;
vram.set_background_palettes(affine_tiles::PALETTES); vram.set_background_palettes(affine_tiles::PALETTES);
@ -26,7 +26,7 @@ fn main(mut gba: agb::Gba) -> ! {
for y in 0..32u16 { for y in 0..32u16 {
for x in 0..32u16 { for x in 0..32u16 {
bg.set_tile(&mut vram, (x, y), &tileset, 1); bg.set_tile(&mut vram, (x, y), tileset, 1);
} }
} }

View file

@ -16,7 +16,7 @@ fn main(mut gba: agb::Gba) -> ! {
let (gfx, mut vram) = gba.display.video.tiled0(); let (gfx, mut vram) = gba.display.video.tiled0();
let vblank = agb::interrupt::VBlank::get(); let vblank = agb::interrupt::VBlank::get();
let tileset = water_tiles::water_tiles.tiles; let tileset = &water_tiles::water_tiles.tiles;
vram.set_background_palettes(water_tiles::PALETTES); vram.set_background_palettes(water_tiles::PALETTES);
@ -31,7 +31,7 @@ fn main(mut gba: agb::Gba) -> ! {
bg.set_tile( bg.set_tile(
&mut vram, &mut vram,
(x, y), (x, y),
&tileset, tileset,
water_tiles::water_tiles.tile_settings[0], water_tiles::water_tiles.tile_settings[0],
); );
} }
@ -44,7 +44,7 @@ fn main(mut gba: agb::Gba) -> ! {
loop { loop {
i = (i + 1) % 8; i = (i + 1) % 8;
vram.replace_tile(&tileset, 0, &tileset, i); vram.replace_tile(tileset, 0, tileset, i);
vblank.wait_for_vblank(); vblank.wait_for_vblank();
} }

View file

@ -14,9 +14,9 @@ use agb::{
use core::fmt::Write; use core::fmt::Write;
// Music - "Crazy glue" by Josh Woodward, free download at http://joshwoodward.com // Music - "Crazy glue" by Josh Woodward, free download at http://joshwoodward.com
const CRAZY_GLUE: &[u8] = include_wav!("examples/JoshWoodward-CrazyGlue.wav"); static CRAZY_GLUE: &[u8] = include_wav!("examples/JoshWoodward-CrazyGlue.wav");
const FONT: Font = include_font!("examples/font/yoster.ttf", 12); static FONT: Font = include_font!("examples/font/yoster.ttf", 12);
#[agb::entry] #[agb::entry]
fn main(mut gba: Gba) -> ! { fn main(mut gba: Gba) -> ! {

View file

@ -7,7 +7,7 @@ use agb::sound::mixer::{Frequency, SoundChannel};
use agb::{fixnum::num, include_wav, Gba}; use agb::{fixnum::num, include_wav, Gba};
// Music - "Dead Code" by Josh Woodward, free download at http://joshwoodward.com // Music - "Dead Code" by Josh Woodward, free download at http://joshwoodward.com
const DEAD_CODE: &[u8] = include_wav!("examples/JoshWoodward-DeadCode.wav"); static DEAD_CODE: &[u8] = include_wav!("examples/JoshWoodward-DeadCode.wav");
#[agb::entry] #[agb::entry]
fn main(mut gba: Gba) -> ! { fn main(mut gba: Gba) -> ! {

View file

@ -11,14 +11,14 @@ use agb::fixnum::num;
use agb_fixnum::Num; use agb_fixnum::Num;
use alloc::vec::Vec; use alloc::vec::Vec;
const GRAPHICS: &Graphics = agb::include_aseprite!( static GRAPHICS: &Graphics = agb::include_aseprite!(
"examples/gfx/objects.aseprite", "examples/gfx/objects.aseprite",
"examples/gfx/boss.aseprite", "examples/gfx/boss.aseprite",
"examples/gfx/wide.aseprite", "examples/gfx/wide.aseprite",
"examples/gfx/tall.aseprite" "examples/gfx/tall.aseprite"
); );
const SPRITES: &[Sprite] = GRAPHICS.sprites(); static SPRITES: &[Sprite] = GRAPHICS.sprites();
const TAG_MAP: &TagMap = GRAPHICS.tags(); static TAG_MAP: &TagMap = GRAPHICS.tags();
fn all_sprites(gfx: &OamManaged, rotation_speed: Num<i32, 16>) { fn all_sprites(gfx: &OamManaged, rotation_speed: Num<i32, 16>) {
let mut input = agb::input::ButtonController::new(); let mut input = agb::input::ButtonController::new();

View file

@ -14,9 +14,9 @@ use agb::{
use core::fmt::Write; use core::fmt::Write;
// Music - "Let it in" by Josh Woodward, free download at http://joshwoodward.com // Music - "Let it in" by Josh Woodward, free download at http://joshwoodward.com
const LET_IT_IN: &[u8] = include_wav!("examples/JoshWoodward-LetItIn.wav"); static LET_IT_IN: &[u8] = include_wav!("examples/JoshWoodward-LetItIn.wav");
const FONT: Font = include_font!("examples/font/yoster.ttf", 12); static FONT: Font = include_font!("examples/font/yoster.ttf", 12);
#[agb::entry] #[agb::entry]
fn main(mut gba: Gba) -> ! { fn main(mut gba: Gba) -> ! {

View file

@ -127,7 +127,7 @@ fn is_private_use(c: char) -> bool {
/// ///
/// use core::fmt::Write; /// use core::fmt::Write;
/// ///
/// const EXAMPLE_FONT: Font = agb::include_font!("examples/font/yoster.ttf", 12); /// static EXAMPLE_FONT: Font = agb::include_font!("examples/font/yoster.ttf", 12);
/// ///
/// # fn foo() { /// # fn foo() {
/// let mut palette = [0x0; 16]; /// let mut palette = [0x0; 16];
@ -214,7 +214,7 @@ impl BufferedRender<'_> {
/// ///
/// use core::fmt::Write; /// use core::fmt::Write;
/// ///
/// const EXAMPLE_FONT: Font = agb::include_font!("examples/font/yoster.ttf", 12); /// static EXAMPLE_FONT: Font = agb::include_font!("examples/font/yoster.ttf", 12);
/// ///
/// #[agb::entry] /// #[agb::entry]
/// fn main(gba: &mut agb::Gba) -> ! { /// fn main(gba: &mut agb::Gba) -> ! {

View file

@ -528,9 +528,9 @@ mod tests {
use super::*; use super::*;
const TEST_SPRITES: &Graphics = include_aseprite!("examples/gfx/tall.aseprite"); static TEST_SPRITES: &Graphics = include_aseprite!("examples/gfx/tall.aseprite");
const TEST_SPRITE: &Sprite = &TEST_SPRITES.sprites()[0]; static TEST_SPRITE: &Sprite = &TEST_SPRITES.sprites()[0];
#[test_case] #[test_case]
fn test_always_ordered(gba: &mut crate::Gba) { fn test_always_ordered(gba: &mut crate::Gba) {

View file

@ -82,7 +82,7 @@ macro_rules! align_bytes {
/// # #![no_std] /// # #![no_std]
/// # #![no_main] /// # #![no_main]
/// # use agb::{display::object::Graphics, include_aseprite}; /// # use agb::{display::object::Graphics, include_aseprite};
/// const GRAPHICS: &Graphics = include_aseprite!( /// static GRAPHICS: &Graphics = include_aseprite!(
/// "examples/gfx/boss.aseprite", /// "examples/gfx/boss.aseprite",
/// "examples/gfx/objects.aseprite" /// "examples/gfx/objects.aseprite"
/// ); /// );
@ -112,7 +112,7 @@ macro_rules! include_aseprite {
$crate::include_aseprite_inner!($($aseprite_path),*); $crate::include_aseprite_inner!($($aseprite_path),*);
&Graphics::new(SPRITES, TAGS) &Graphics::new(SPRITES, &TAGS)
}}; }};
} }
@ -151,12 +151,12 @@ impl Graphics {
/// # #![no_std] /// # #![no_std]
/// # #![no_main] /// # #![no_main]
/// # use agb::{display::object::{Graphics, Tag}, include_aseprite}; /// # use agb::{display::object::{Graphics, Tag}, include_aseprite};
/// const GRAPHICS: &Graphics = include_aseprite!( /// static GRAPHICS: &Graphics = include_aseprite!(
/// "examples/gfx/boss.aseprite", /// "examples/gfx/boss.aseprite",
/// "examples/gfx/objects.aseprite" /// "examples/gfx/objects.aseprite"
/// ); /// );
/// ///
/// const EMU_WALK: &Tag = GRAPHICS.tags().get("emu-walk"); /// static EMU_WALK: &Tag = GRAPHICS.tags().get("emu-walk");
/// ``` /// ```
/// This being the whole animation associated with the walk sequence of the emu. /// This being the whole animation associated with the walk sequence of the emu.
/// See [Tag] for details on how to use this. /// See [Tag] for details on how to use this.
@ -213,12 +213,12 @@ impl TagMap {
/// # #![no_std] /// # #![no_std]
/// # #![no_main] /// # #![no_main]
/// # use agb::{display::object::{Graphics, Tag}, include_aseprite}; /// # use agb::{display::object::{Graphics, Tag}, include_aseprite};
/// const GRAPHICS: &Graphics = include_aseprite!( /// static GRAPHICS: &Graphics = include_aseprite!(
/// "examples/gfx/boss.aseprite", /// "examples/gfx/boss.aseprite",
/// "examples/gfx/objects.aseprite" /// "examples/gfx/objects.aseprite"
/// ); /// );
/// ///
/// const EMU_WALK: &Tag = GRAPHICS.tags().get("emu-walk"); /// static EMU_WALK: &Tag = GRAPHICS.tags().get("emu-walk");
/// ``` /// ```
/// ///
/// See [Tag] for more details. /// See [Tag] for more details.
@ -262,6 +262,8 @@ pub struct Tag {
direction: Direction, direction: Direction,
} }
unsafe impl Sync for Tag {}
impl Tag { impl Tag {
/// The individual sprites that make up the animation themselves. /// The individual sprites that make up the animation themselves.
#[must_use] #[must_use]

View file

@ -398,12 +398,12 @@ mod tests {
#[test_case] #[test_case]
fn object_usage(gba: &mut crate::Gba) { fn object_usage(gba: &mut crate::Gba) {
const GRAPHICS: &Graphics = include_aseprite!( static GRAPHICS: &Graphics = include_aseprite!(
"../examples/the-purple-night/gfx/objects.aseprite", "../examples/the-purple-night/gfx/objects.aseprite",
"../examples/the-purple-night/gfx/boss.aseprite" "../examples/the-purple-night/gfx/boss.aseprite"
); );
const BOSS: &Tag = GRAPHICS.tags().get("Boss"); static BOSS: &Tag = GRAPHICS.tags().get("Boss");
let (mut gfx, mut loader) = gba.display.object.get_unmanaged(); let (mut gfx, mut loader) = gba.display.object.get_unmanaged();

View file

@ -40,7 +40,7 @@ use crate::{
/// use agb::display::Priority; /// use agb::display::Priority;
/// ///
/// mod tilemap { /// mod tilemap {
/// pub const BACKGROUND_MAP: &[usize] = &[ // Probably load this from a file /// pub static BACKGROUND_MAP: &[usize] = &[ // Probably load this from a file
/// # 0, 1, 2]; /// # 0, 1, 2];
/// pub const WIDTH: i32 = // set it to some width /// pub const WIDTH: i32 = // set it to some width
/// # 12; /// # 12;
@ -51,7 +51,7 @@ use crate::{
/// # fn foo(mut gba: agb::Gba) { /// # fn foo(mut gba: agb::Gba) {
/// let (gfx, mut vram) = gba.display.video.tiled0(); /// let (gfx, mut vram) = gba.display.video.tiled0();
/// ///
/// let tile_data = water_tiles::tiles; /// let tile_data = &water_tiles::tiles;
/// ///
/// let mut backdrop = InfiniteScrolledMap::new( /// let mut backdrop = InfiniteScrolledMap::new(
/// gfx.background(Priority::P2, RegularBackgroundSize::Background32x32, TileFormat::FourBpp), /// gfx.background(Priority::P2, RegularBackgroundSize::Background32x32, TileFormat::FourBpp),
@ -133,9 +133,9 @@ impl<'a> InfiniteScrolledMap<'a> {
/// # use agb::display::Priority; /// # use agb::display::Priority;
/// # /// #
/// # mod tilemap { /// # mod tilemap {
/// # pub const BACKGROUND_MAP: &[usize] = &[0, 1, 2]; /// # pub static BACKGROUND_MAP: &[usize] = &[0, 1, 2];
/// # pub const WIDTH: i32 = 12; /// # pub const WIDTH: i32 = 12;
/// # pub const MAP_TILES: &[u8] = &[0]; /// # pub static MAP_TILES: &[u8] = &[0];
/// # } /// # }
/// # /// #
/// # agb::include_background_gfx!(water_tiles, tiles => "examples/water_tiles.png"); /// # agb::include_background_gfx!(water_tiles, tiles => "examples/water_tiles.png");
@ -143,7 +143,7 @@ impl<'a> InfiniteScrolledMap<'a> {
/// # fn foo(mut gba: agb::Gba) { /// # fn foo(mut gba: agb::Gba) {
/// # let (gfx, mut vram) = gba.display.video.tiled0(); /// # let (gfx, mut vram) = gba.display.video.tiled0();
/// # /// #
/// # let tile_data = water_tiles::tiles; /// # let tile_data = &water_tiles::tiles;
/// # /// #
/// # let mut backdrop = InfiniteScrolledMap::new( /// # let mut backdrop = InfiniteScrolledMap::new(
/// # gfx.background(Priority::P2, RegularBackgroundSize::Background32x32, TileFormat::FourBpp), /// # gfx.background(Priority::P2, RegularBackgroundSize::Background32x32, TileFormat::FourBpp),
@ -209,9 +209,9 @@ impl<'a> InfiniteScrolledMap<'a> {
/// # use agb::display::Priority; /// # use agb::display::Priority;
/// # /// #
/// # mod tilemap { /// # mod tilemap {
/// # pub const BACKGROUND_MAP: &[usize] = &[0, 1, 2]; /// # pub static BACKGROUND_MAP: &[usize] = &[0, 1, 2];
/// # pub const WIDTH: i32 = 12; /// # pub const WIDTH: i32 = 12;
/// # pub const MAP_TILES: &[u8] = &[0]; /// # pub static MAP_TILES: &[u8] = &[0];
/// # } /// # }
/// # /// #
/// # agb::include_background_gfx!(water_tiles, tiles => "examples/water_tiles.png"); /// # agb::include_background_gfx!(water_tiles, tiles => "examples/water_tiles.png");
@ -219,7 +219,7 @@ impl<'a> InfiniteScrolledMap<'a> {
/// # fn foo(mut gba: agb::Gba) { /// # fn foo(mut gba: agb::Gba) {
/// # let (gfx, mut vram) = gba.display.video.tiled0(); /// # let (gfx, mut vram) = gba.display.video.tiled0();
/// # /// #
/// # let tile_data = water_tiles::tiles; /// # let tile_data = &water_tiles::tiles;
/// # /// #
/// # let mut backdrop = InfiniteScrolledMap::new( /// # let mut backdrop = InfiniteScrolledMap::new(
/// # gfx.background(Priority::P2, RegularBackgroundSize::Background32x32, TileFormat::FourBpp), /// # gfx.background(Priority::P2, RegularBackgroundSize::Background32x32, TileFormat::FourBpp),

View file

@ -49,7 +49,7 @@
/// ```rust,ignore /// ```rust,ignore
/// // module name comes from the first argument, name of the constant from the arrow /// // module name comes from the first argument, name of the constant from the arrow
/// mod water_tiles { /// mod water_tiles {
/// pub const tiles = /* ... */; /// pub static tiles = /* ... */;
/// } /// }
/// ``` /// ```
/// ///
@ -77,7 +77,7 @@
/// agb::include_background_gfx!(water_tiles, tiles => "examples/water_tiles.png"); /// agb::include_background_gfx!(water_tiles, tiles => "examples/water_tiles.png");
/// ///
/// # fn load_tileset(mut gfx: Tiled0, mut vram: VRamManager) { /// # fn load_tileset(mut gfx: Tiled0, mut vram: VRamManager) {
/// let tileset = water_tiles::tiles.tiles; /// let tileset = &water_tiles::tiles.tiles;
/// ///
/// vram.set_background_palettes(water_tiles::PALETTES); /// vram.set_background_palettes(water_tiles::PALETTES);
/// ///
@ -88,7 +88,7 @@
/// bg.set_tile( /// bg.set_tile(
/// &mut vram, /// &mut vram,
/// (x, y), /// (x, y),
/// &tileset, /// tileset,
/// water_tiles::tiles.tile_settings[0], /// water_tiles::tiles.tile_settings[0],
/// ); /// );
/// } /// }

View file

@ -12,7 +12,7 @@ use crate::{
interrupt::VBlank, interrupt::VBlank,
}; };
const PALETTE: &[u16] = &include_palette!("gfx/pastel.png"); static PALETTE: &[u16] = &include_palette!("gfx/pastel.png");
fn letters() -> Vec<Vec<Vector2D<Num<i32, 8>>>> { fn letters() -> Vec<Vec<Vector2D<Num<i32, 8>>>> {
vec![ vec![

View file

@ -82,7 +82,7 @@
//! # let vblank = agb::interrupt::VBlank::get(); //! # let vblank = agb::interrupt::VBlank::get();
//! # use agb::{*, sound::mixer::*}; //! # use agb::{*, sound::mixer::*};
//! // Outside your main function in global scope: //! // Outside your main function in global scope:
//! const MY_CRAZY_SOUND: &[u8] = include_wav!("examples/sfx/jump.wav"); //! static MY_CRAZY_SOUND: &[u8] = include_wav!("examples/sfx/jump.wav");
//! //!
//! // Then to play the sound: //! // Then to play the sound:
//! let mut channel = SoundChannel::new(MY_CRAZY_SOUND); //! let mut channel = SoundChannel::new(MY_CRAZY_SOUND);
@ -194,7 +194,7 @@ impl Frequency {
/// # use agb::sound::mixer::*; /// # use agb::sound::mixer::*;
/// # use agb::*; /// # use agb::*;
/// // in global scope: /// // in global scope:
/// const MY_BGM: &[u8] = include_wav!("examples/sfx/my_bgm.wav"); /// static MY_BGM: &[u8] = include_wav!("examples/sfx/my_bgm.wav");
/// ///
/// // somewhere in code /// // somewhere in code
/// # fn foo(gba: &mut Gba) { /// # fn foo(gba: &mut Gba) {
@ -213,7 +213,7 @@ impl Frequency {
/// # use agb::sound::mixer::*; /// # use agb::sound::mixer::*;
/// # use agb::*; /// # use agb::*;
/// // in global scope: /// // in global scope:
/// const JUMP_SOUND: &[u8] = include_wav!("examples/sfx/jump.wav"); /// static JUMP_SOUND: &[u8] = include_wav!("examples/sfx/jump.wav");
/// ///
/// // somewhere in code /// // somewhere in code
/// # fn foo(gba: &mut Gba) { /// # fn foo(gba: &mut Gba) {
@ -258,7 +258,7 @@ impl SoundChannel {
/// # fn foo(gba: &mut Gba) { /// # fn foo(gba: &mut Gba) {
/// # let mut mixer = gba.mixer.mixer(agb::sound::mixer::Frequency::Hz10512); /// # let mut mixer = gba.mixer.mixer(agb::sound::mixer::Frequency::Hz10512);
/// // in global scope: /// // in global scope:
/// const JUMP_SOUND: &[u8] = include_wav!("examples/sfx/jump.wav"); /// static JUMP_SOUND: &[u8] = include_wav!("examples/sfx/jump.wav");
/// ///
/// // somewhere in code /// // somewhere in code
/// let jump_sound = SoundChannel::new(JUMP_SOUND); /// let jump_sound = SoundChannel::new(JUMP_SOUND);
@ -302,7 +302,7 @@ impl SoundChannel {
/// # fn foo(gba: &mut Gba) { /// # fn foo(gba: &mut Gba) {
/// # let mut mixer = gba.mixer.mixer(agb::sound::mixer::Frequency::Hz10512); /// # let mut mixer = gba.mixer.mixer(agb::sound::mixer::Frequency::Hz10512);
/// // in global scope: /// // in global scope:
/// const MY_BGM: &[u8] = include_wav!("examples/sfx/my_bgm.wav"); /// static MY_BGM: &[u8] = include_wav!("examples/sfx/my_bgm.wav");
/// ///
/// // somewhere in code /// // somewhere in code
/// let mut bgm = SoundChannel::new_high_priority(MY_BGM); /// let mut bgm = SoundChannel::new_high_priority(MY_BGM);

View file

@ -89,7 +89,7 @@ extern "C" {
/// # let mut mixer = gba.mixer.mixer(agb::sound::mixer::Frequency::Hz10512); /// # let mut mixer = gba.mixer.mixer(agb::sound::mixer::Frequency::Hz10512);
/// # let vblank = agb::interrupt::VBlank::get(); /// # let vblank = agb::interrupt::VBlank::get();
/// // Outside your main function in global scope: /// // Outside your main function in global scope:
/// const MY_CRAZY_SOUND: &[u8] = include_wav!("examples/sfx/jump.wav"); /// static MY_CRAZY_SOUND: &[u8] = include_wav!("examples/sfx/jump.wav");
/// ///
/// // in your main function: /// // in your main function:
/// let mut mixer = gba.mixer.mixer(Frequency::Hz10512); /// let mut mixer = gba.mixer.mixer(Frequency::Hz10512);
@ -133,7 +133,7 @@ pub struct Mixer<'gba> {
/// # use agb::*; /// # use agb::*;
/// # fn foo(gba: &mut Gba) { /// # fn foo(gba: &mut Gba) {
/// # let mut mixer = gba.mixer.mixer(agb::sound::mixer::Frequency::Hz10512); /// # let mut mixer = gba.mixer.mixer(agb::sound::mixer::Frequency::Hz10512);
/// # const MY_BGM: &[u8] = include_wav!("examples/sfx/my_bgm.wav"); /// # static MY_BGM: &[u8] = include_wav!("examples/sfx/my_bgm.wav");
/// let mut channel = SoundChannel::new_high_priority(MY_BGM); /// let mut channel = SoundChannel::new_high_priority(MY_BGM);
/// let bgm_channel_id = mixer.play_sound(channel).unwrap(); // will always be Some if high priority /// let bgm_channel_id = mixer.play_sound(channel).unwrap(); // will always be Some if high priority
/// ///
@ -258,7 +258,7 @@ impl Mixer<'_> {
/// # use agb::*; /// # use agb::*;
/// # fn foo(gba: &mut Gba) { /// # fn foo(gba: &mut Gba) {
/// # let mut mixer = gba.mixer.mixer(agb::sound::mixer::Frequency::Hz10512); /// # let mut mixer = gba.mixer.mixer(agb::sound::mixer::Frequency::Hz10512);
/// # const MY_BGM: &[u8] = include_wav!("examples/sfx/my_bgm.wav"); /// # static MY_BGM: &[u8] = include_wav!("examples/sfx/my_bgm.wav");
/// let mut channel = SoundChannel::new_high_priority(MY_BGM); /// let mut channel = SoundChannel::new_high_priority(MY_BGM);
/// let bgm_channel_id = mixer.play_sound(channel).unwrap(); // will always be Some if high priority /// let bgm_channel_id = mixer.play_sound(channel).unwrap(); // will always be Some if high priority
/// # } /// # }
@ -307,7 +307,7 @@ impl Mixer<'_> {
/// # use agb::*; /// # use agb::*;
/// # fn foo(gba: &mut Gba) { /// # fn foo(gba: &mut Gba) {
/// # let mut mixer = gba.mixer.mixer(agb::sound::mixer::Frequency::Hz10512); /// # let mut mixer = gba.mixer.mixer(agb::sound::mixer::Frequency::Hz10512);
/// # const MY_BGM: &[u8] = include_wav!("examples/sfx/my_bgm.wav"); /// # static MY_BGM: &[u8] = include_wav!("examples/sfx/my_bgm.wav");
/// let mut channel = SoundChannel::new_high_priority(MY_BGM); /// let mut channel = SoundChannel::new_high_priority(MY_BGM);
/// let bgm_channel_id = mixer.play_sound(channel).unwrap(); // will always be Some if high priority /// let bgm_channel_id = mixer.play_sound(channel).unwrap(); // will always be Some if high priority
/// ///

View file

@ -15,16 +15,16 @@ use agb::{
include_aseprite, include_aseprite,
}; };
// Import the sprites in to this constant. This holds the sprite // Import the sprites in to this static. This holds the sprite
// and palette data in a way that is manageable by agb. // and palette data in a way that is manageable by agb.
const GRAPHICS: &Graphics = include_aseprite!("gfx/sprites.aseprite"); static GRAPHICS: &Graphics = include_aseprite!("gfx/sprites.aseprite");
// We define some easy ways of referencing the sprites // We define some easy ways of referencing the sprites
#[allow(dead_code)] #[allow(dead_code)]
const PADDLE_END: &Tag = GRAPHICS.tags().get("Paddle End"); static PADDLE_END: &Tag = GRAPHICS.tags().get("Paddle End");
#[allow(dead_code)] #[allow(dead_code)]
const PADDLE_MID: &Tag = GRAPHICS.tags().get("Paddle Mid"); static PADDLE_MID: &Tag = GRAPHICS.tags().get("Paddle Mid");
const BALL: &Tag = GRAPHICS.tags().get("Ball"); static BALL: &Tag = GRAPHICS.tags().get("Ball");
// The main function must take 0 arguments and never return. The agb::entry decorator // The main function must take 0 arguments and never return. The agb::entry decorator
// ensures that everything is in order. `agb` will call this after setting up the stack // ensures that everything is in order. `agb` will call this after setting up the stack

View file

@ -46,14 +46,14 @@ use agb::{
display::object::{Graphics, Tag} display::object::{Graphics, Tag}
}; };
// Import the sprites in to this constant. This holds the sprite // Import the sprites in to this static. This holds the sprite
// and palette data in a way that is manageable by agb. // and palette data in a way that is manageable by agb.
const GRAPHICS: &Graphics = include_aseprite!("gfx/sprites.aseprite"); static GRAPHICS: &Graphics = include_aseprite!("gfx/sprites.aseprite");
// We define some easy ways of referencing the sprites // We define some easy ways of referencing the sprites
const PADDLE_END: &Tag = GRAPHICS.tags().get("Paddle End"); static PADDLE_END: &Tag = GRAPHICS.tags().get("Paddle End");
const PADDLE_MID: &Tag = GRAPHICS.tags().get("Paddle Mid"); static PADDLE_MID: &Tag = GRAPHICS.tags().get("Paddle Mid");
const BALL: &Tag = GRAPHICS.tags().get("Ball"); static BALL: &Tag = GRAPHICS.tags().get("Ball");
``` ```
This uses the `include_aseprite` macro to include the sprites in the given aseprite file. This uses the `include_aseprite` macro to include the sprites in the given aseprite file.

View file

@ -133,7 +133,7 @@ fn draw_number(
impl SpriteCache { impl SpriteCache {
fn new(loader: &mut SpriteLoader) -> Self { fn new(loader: &mut SpriteLoader) -> Self {
const SPRITES: &Graphics = include_aseprite!( static SPRITES: &Graphics = include_aseprite!(
"gfx/circles.aseprite", "gfx/circles.aseprite",
"gfx/saw.aseprite", "gfx/saw.aseprite",
"gfx/numbers.aseprite", "gfx/numbers.aseprite",
@ -152,12 +152,12 @@ impl SpriteCache {
.into_boxed_slice() .into_boxed_slice()
} }
const NUMBERS: &Tag = SPRITES.tags().get("numbers"); static NUMBERS: &Tag = SPRITES.tags().get("numbers");
const BLUE_CIRCLE: &Sprite = SPRITES.tags().get("Blue").sprite(0); static BLUE_CIRCLE: &Sprite = SPRITES.tags().get("Blue").sprite(0);
const RED_CIRCLE: &Sprite = SPRITES.tags().get("Red").sprite(0); static RED_CIRCLE: &Sprite = SPRITES.tags().get("Red").sprite(0);
const SAW: &Sprite = SPRITES.tags().get("Saw").sprite(0); static SAW: &Sprite = SPRITES.tags().get("Saw").sprite(0);
const BAR_RED: &Tag = SPRITES.tags().get("Red Bar"); static BAR_RED: &Tag = SPRITES.tags().get("Red Bar");
const BAR_BLUE: &Tag = SPRITES.tags().get("Blue Bar"); static BAR_BLUE: &Tag = SPRITES.tags().get("Blue Bar");
Self { Self {
saw: loader.get_vram_sprite(SAW), saw: loader.get_vram_sprite(SAW),

View file

@ -21,21 +21,21 @@ type Game = fn(agb::Gba) -> !;
struct GameWithTiles { struct GameWithTiles {
game: fn(agb::Gba) -> !, game: fn(agb::Gba) -> !,
tiles: TileData, tiles: &'static TileData,
} }
impl GameWithTiles { impl GameWithTiles {
const fn new(tiles: TileData, game: fn(agb::Gba) -> !) -> Self { const fn new(tiles: &'static TileData, game: fn(agb::Gba) -> !) -> Self {
GameWithTiles { game, tiles } GameWithTiles { game, tiles }
} }
} }
const GAMES: &[GameWithTiles] = &[ static GAMES: &[GameWithTiles] = &[
GameWithTiles::new(games::hat, the_hat_chooses_the_wizard::main), GameWithTiles::new(&games::hat, the_hat_chooses_the_wizard::main),
GameWithTiles::new(games::purple, the_purple_night::main), GameWithTiles::new(&games::purple, the_purple_night::main),
GameWithTiles::new(games::hyperspace, hyperspace_roll::main), GameWithTiles::new(&games::hyperspace, hyperspace_roll::main),
GameWithTiles::new(games::dungeon_puzzler, the_dungeon_puzzlers_lament::entry), GameWithTiles::new(&games::dungeon_puzzler, the_dungeon_puzzlers_lament::entry),
GameWithTiles::new(games::amplitude, amplitude::main), GameWithTiles::new(&games::amplitude, amplitude::main),
]; ];
include_background_gfx!( include_background_gfx!(

View file

@ -23,7 +23,7 @@ pub(crate) fn load_help_text(
help_text_line: u16, help_text_line: u16,
at_tile: (u16, u16), at_tile: (u16, u16),
) { ) {
let help_tiledata = backgrounds::help; let help_tiledata = &backgrounds::help;
for x in 0..16 { for x in 0..16 {
let tile_id = help_text_line * 16 + x; let tile_id = help_text_line * 16 + x;
@ -43,9 +43,9 @@ pub(crate) fn load_description(
vram: &mut VRamManager, vram: &mut VRamManager,
) { ) {
let description_data = if face_id < 10 { let description_data = if face_id < 10 {
backgrounds::descriptions1 &backgrounds::descriptions1
} else { } else {
backgrounds::descriptions2 &backgrounds::descriptions2
}; };
for y in 0..11 { for y in 0..11 {

View file

@ -6,73 +6,88 @@ use alloc::vec::Vec;
use crate::{EnemyAttackType, Face, Ship}; use crate::{EnemyAttackType, Face, Ship};
const SPRITES: &agb::display::object::Graphics = agb::include_aseprite!( static SPRITES: &agb::display::object::Graphics = agb::include_aseprite!(
"gfx/dice-faces.aseprite", "gfx/dice-faces.aseprite",
"gfx/ships.aseprite", "gfx/ships.aseprite",
"gfx/small-sprites.aseprite" "gfx/small-sprites.aseprite"
); );
pub const FACE_SPRITES: &FaceSprites = &FaceSprites::load_face_sprites(); pub static FACE_SPRITES: &FaceSprites = {
pub const ENEMY_ATTACK_SPRITES: &EnemyAttackSprites = &EnemyAttackSprites::new(); static S_SHOOT: &Sprite = SPRITES.tags().get("shoot").sprite(0);
pub const SELECT_BOX: &Tag = SPRITES.tags().get("selection"); static S_SHIELD: &Sprite = SPRITES.tags().get("shield").sprite(0);
pub const SELECTED_BOX: &Sprite = SPRITES.tags().get("selected").sprite(0); static S_MALFUNCTION: &Sprite = SPRITES.tags().get("malfunction").sprite(0);
pub const MODIFIED_BOX: &Sprite = SPRITES.tags().get("modified").sprite(0); static S_HEAL: &Sprite = SPRITES.tags().get("player_heal").sprite(0);
static S_BYPASS: &Sprite = SPRITES.tags().get("shield bypass").sprite(0);
static S_DOUBLE_SHOT: &Sprite = SPRITES.tags().get("double shoot").sprite(0);
static S_TRIPLE_SHOT: &Sprite = SPRITES.tags().get("triple shoot").sprite(0);
static S_BLANK: &Sprite = SPRITES.tags().get("blank").sprite(0);
static S_DISRUPT: &Sprite = SPRITES.tags().get("disruption").sprite(0);
static S_MALFUNCTION_SHOOT: &Sprite = SPRITES.tags().get("malfunction shot").sprite(0);
static S_DOUBLE_SHIELD: &Sprite = SPRITES.tags().get("double shield").sprite(0);
static S_TRIPLE_SHIELD: &Sprite = SPRITES.tags().get("triple shield").sprite(0);
static S_DOUBLE_SHIELD_VALUE: &Sprite = SPRITES.tags().get("double shield value").sprite(0);
static S_DOUBLE_SHOT_VALUE: &Sprite = SPRITES.tags().get("double shoot power").sprite(0);
static S_TRIPLE_SHOT_VALUE: &Sprite = SPRITES.tags().get("triple shoot power").sprite(0);
static S_BURST_SHIELD: &Sprite = SPRITES.tags().get("burst shield").sprite(0);
static S_INVERT: &Sprite = SPRITES.tags().get("swap shield and shoot").sprite(0);
pub const BULLET_SPRITE: &Sprite = SPRITES.tags().get("bullet").sprite(0); &FaceSprites {
pub const DISRUPT_BULLET: &Sprite = SPRITES.tags().get("disrupt bullet").sprite(0); sprites: [
pub const BURST_BULLET: &Sprite = SPRITES.tags().get("burst shield bullet").sprite(0); S_SHOOT,
pub const SHIELD: &Tag = SPRITES.tags().get("ship shield"); S_SHIELD,
S_MALFUNCTION,
S_HEAL,
S_BYPASS,
S_DOUBLE_SHOT,
S_TRIPLE_SHOT,
S_BLANK,
S_DISRUPT,
S_MALFUNCTION_SHOOT,
S_DOUBLE_SHIELD,
S_TRIPLE_SHIELD,
S_DOUBLE_SHIELD_VALUE,
S_DOUBLE_SHOT_VALUE,
S_TRIPLE_SHOT_VALUE,
S_BURST_SHIELD,
S_INVERT,
],
}
};
pub static ENEMY_ATTACK_SPRITES: &EnemyAttackSprites = {
static S_SHOOT: &Sprite = SPRITES.tags().get("enemy shoot").sprite(0);
static S_SHIELD: &Sprite = SPRITES.tags().get("enemy shield").sprite(0);
static S_HEAL: &Sprite = SPRITES.tags().get("enemy heal").sprite(0);
pub const SHIP_SPRITES: &ShipSprites = &ShipSprites::load_ship_sprites(); &EnemyAttackSprites {
sprites: [S_SHOOT, S_SHIELD, S_HEAL],
}
};
pub static SELECT_BOX: &Tag = SPRITES.tags().get("selection");
pub static SELECTED_BOX: &Sprite = SPRITES.tags().get("selected").sprite(0);
pub static MODIFIED_BOX: &Sprite = SPRITES.tags().get("modified").sprite(0);
pub const SMALL_SPRITES: &SmallSprites = &SmallSprites {}; pub static BULLET_SPRITE: &Sprite = SPRITES.tags().get("bullet").sprite(0);
pub static DISRUPT_BULLET: &Sprite = SPRITES.tags().get("disrupt bullet").sprite(0);
pub static BURST_BULLET: &Sprite = SPRITES.tags().get("burst shield bullet").sprite(0);
pub static SHIELD: &Tag = SPRITES.tags().get("ship shield");
pub static SHIP_SPRITES: &ShipSprites = {
static S_PLAYER: &Sprite = SPRITES.tags().get("player").sprite(0);
static S_DRONE: &Sprite = SPRITES.tags().get("drone").sprite(0);
static S_PILOTED_SHIP: &Sprite = SPRITES.tags().get("piloted ship").sprite(0);
static S_SHIELD: &Sprite = SPRITES.tags().get("ship shield").sprite(0);
&ShipSprites {
sprites: [S_PLAYER, S_DRONE, S_PILOTED_SHIP, S_SHIELD],
}
};
pub static SMALL_SPRITES: &SmallSprites = &SmallSprites {};
pub struct FaceSprites { pub struct FaceSprites {
sprites: [&'static Sprite; 17], sprites: [&'static Sprite; 17],
} }
impl FaceSprites { impl FaceSprites {
const fn load_face_sprites() -> Self {
const S_SHOOT: &Sprite = SPRITES.tags().get("shoot").sprite(0);
const S_SHIELD: &Sprite = SPRITES.tags().get("shield").sprite(0);
const S_MALFUNCTION: &Sprite = SPRITES.tags().get("malfunction").sprite(0);
const S_HEAL: &Sprite = SPRITES.tags().get("player_heal").sprite(0);
const S_BYPASS: &Sprite = SPRITES.tags().get("shield bypass").sprite(0);
const S_DOUBLE_SHOT: &Sprite = SPRITES.tags().get("double shoot").sprite(0);
const S_TRIPLE_SHOT: &Sprite = SPRITES.tags().get("triple shoot").sprite(0);
const S_BLANK: &Sprite = SPRITES.tags().get("blank").sprite(0);
const S_DISRUPT: &Sprite = SPRITES.tags().get("disruption").sprite(0);
const S_MALFUNCTION_SHOOT: &Sprite = SPRITES.tags().get("malfunction shot").sprite(0);
const S_DOUBLE_SHIELD: &Sprite = SPRITES.tags().get("double shield").sprite(0);
const S_TRIPLE_SHIELD: &Sprite = SPRITES.tags().get("triple shield").sprite(0);
const S_DOUBLE_SHIELD_VALUE: &Sprite = SPRITES.tags().get("double shield value").sprite(0);
const S_DOUBLE_SHOT_VALUE: &Sprite = SPRITES.tags().get("double shoot power").sprite(0);
const S_TRIPLE_SHOT_VALUE: &Sprite = SPRITES.tags().get("triple shoot power").sprite(0);
const S_BURST_SHIELD: &Sprite = SPRITES.tags().get("burst shield").sprite(0);
const S_INVERT: &Sprite = SPRITES.tags().get("swap shield and shoot").sprite(0);
Self {
sprites: [
S_SHOOT,
S_SHIELD,
S_MALFUNCTION,
S_HEAL,
S_BYPASS,
S_DOUBLE_SHOT,
S_TRIPLE_SHOT,
S_BLANK,
S_DISRUPT,
S_MALFUNCTION_SHOOT,
S_DOUBLE_SHIELD,
S_TRIPLE_SHIELD,
S_DOUBLE_SHIELD_VALUE,
S_DOUBLE_SHOT_VALUE,
S_TRIPLE_SHOT_VALUE,
S_BURST_SHIELD,
S_INVERT,
],
}
}
pub fn sprite_for_face(&self, face: Face) -> &'static Sprite { pub fn sprite_for_face(&self, face: Face) -> &'static Sprite {
self.sprites[face as usize] self.sprites[face as usize]
} }
@ -83,17 +98,6 @@ pub struct ShipSprites {
} }
impl ShipSprites { impl ShipSprites {
const fn load_ship_sprites() -> Self {
const S_PLAYER: &Sprite = SPRITES.tags().get("player").sprite(0);
const S_DRONE: &Sprite = SPRITES.tags().get("drone").sprite(0);
const S_PILOTED_SHIP: &Sprite = SPRITES.tags().get("piloted ship").sprite(0);
const S_SHIELD: &Sprite = SPRITES.tags().get("ship shield").sprite(0);
Self {
sprites: [S_PLAYER, S_DRONE, S_PILOTED_SHIP, S_SHIELD],
}
}
pub fn sprite_for_ship(&self, ship: Ship) -> &'static Sprite { pub fn sprite_for_ship(&self, ship: Ship) -> &'static Sprite {
self.sprites[ship as usize] self.sprites[ship as usize]
} }
@ -101,17 +105,19 @@ impl ShipSprites {
pub struct SmallSprites; pub struct SmallSprites;
static NUMBERS: &Tag = SPRITES.tags().get("numbers");
static RED_BAR: &Tag = SPRITES.tags().get("red bar");
impl SmallSprites { impl SmallSprites {
pub const fn number(&self, i: u32) -> &'static Sprite { pub fn number(&self, i: u32) -> &'static Sprite {
SPRITES.tags().get("numbers").sprite(i as usize) NUMBERS.sprite(i as usize)
} }
pub const fn slash(&self) -> &'static Sprite { pub fn slash(&self) -> &'static Sprite {
SPRITES.tags().get("numbers").sprite(10) NUMBERS.sprite(10)
} }
pub const fn red_bar(&self, i: usize) -> &'static Sprite { pub fn red_bar(&self, i: usize) -> &'static Sprite {
SPRITES.tags().get("red bar").sprite(i) RED_BAR.sprite(i)
} }
} }
@ -120,16 +126,6 @@ pub struct EnemyAttackSprites {
} }
impl EnemyAttackSprites { impl EnemyAttackSprites {
const fn new() -> Self {
const S_SHOOT: &Sprite = SPRITES.tags().get("enemy shoot").sprite(0);
const S_SHIELD: &Sprite = SPRITES.tags().get("enemy shield").sprite(0);
const S_HEAL: &Sprite = SPRITES.tags().get("enemy heal").sprite(0);
Self {
sprites: [S_SHOOT, S_SHIELD, S_HEAL],
}
}
pub fn sprite_for_attack(&self, attack: EnemyAttackType) -> &'static Sprite { pub fn sprite_for_attack(&self, attack: EnemyAttackType) -> &'static Sprite {
self.sprites[attack as usize] self.sprites[attack as usize]
} }

View file

@ -2,7 +2,7 @@ use agb::fixnum::num;
use agb::sound::mixer::{ChannelId, Mixer, SoundChannel}; use agb::sound::mixer::{ChannelId, Mixer, SoundChannel};
use agb::{include_wav, rng}; use agb::{include_wav, rng};
const DICE_ROLLS: &[&[u8]] = &[ static DICE_ROLLS: &[&[u8]] = &[
include_wav!("sfx/SingleRoll_1.wav"), include_wav!("sfx/SingleRoll_1.wav"),
include_wav!("sfx/SingleRoll_2.wav"), include_wav!("sfx/SingleRoll_2.wav"),
include_wav!("sfx/SingleRoll_3.wav"), include_wav!("sfx/SingleRoll_3.wav"),
@ -10,7 +10,7 @@ const DICE_ROLLS: &[&[u8]] = &[
include_wav!("sfx/SingleRoll_5.wav"), include_wav!("sfx/SingleRoll_5.wav"),
]; ];
const MULTI_ROLLS: &[&[u8]] = &[ static MULTI_ROLLS: &[&[u8]] = &[
include_wav!("sfx/MultiRoll_1.wav"), include_wav!("sfx/MultiRoll_1.wav"),
include_wav!("sfx/MultiRoll_2.wav"), include_wav!("sfx/MultiRoll_2.wav"),
include_wav!("sfx/MultiRoll_3.wav"), include_wav!("sfx/MultiRoll_3.wav"),
@ -18,24 +18,24 @@ const MULTI_ROLLS: &[&[u8]] = &[
include_wav!("sfx/MultiRoll_5.wav"), include_wav!("sfx/MultiRoll_5.wav"),
]; ];
const MENU_BGM: &[u8] = include_wav!("sfx/BGM_Menu.wav"); static MENU_BGM: &[u8] = include_wav!("sfx/BGM_Menu.wav");
const BATTLE_BGM: &[u8] = include_wav!("sfx/BGM_Fight.wav"); static BATTLE_BGM: &[u8] = include_wav!("sfx/BGM_Fight.wav");
const TITLE_BGM: &[u8] = include_wav!("sfx/BGM_Title.wav"); static TITLE_BGM: &[u8] = include_wav!("sfx/BGM_Title.wav");
const SHOOT: &[u8] = include_wav!("sfx/shoot.wav"); static SHOOT: &[u8] = include_wav!("sfx/shoot.wav");
const SHOT_HIT: &[u8] = include_wav!("sfx/shot_hit.wav"); static SHOT_HIT: &[u8] = include_wav!("sfx/shot_hit.wav");
const SHIP_EXPLODE: &[u8] = include_wav!("sfx/ship_explode.wav"); static SHIP_EXPLODE: &[u8] = include_wav!("sfx/ship_explode.wav");
const MOVE_CURSOR: &[u8] = include_wav!("sfx/move_cursor.wav"); static MOVE_CURSOR: &[u8] = include_wav!("sfx/move_cursor.wav");
const SELECT: &[u8] = include_wav!("sfx/select.wav"); static SELECT: &[u8] = include_wav!("sfx/select.wav");
const BACK: &[u8] = include_wav!("sfx/back.wav"); static BACK: &[u8] = include_wav!("sfx/back.wav");
const ACCEPT: &[u8] = include_wav!("sfx/accept.wav"); static ACCEPT: &[u8] = include_wav!("sfx/accept.wav");
const SHIELD_DOWN: &[u8] = include_wav!("sfx/shield_down.wav"); static SHIELD_DOWN: &[u8] = include_wav!("sfx/shield_down.wav");
const SHIELD_UP: &[u8] = include_wav!("sfx/shield_up.wav"); static SHIELD_UP: &[u8] = include_wav!("sfx/shield_up.wav");
const SHIELD_DEFEND: &[u8] = include_wav!("sfx/shield_defend.wav"); static SHIELD_DEFEND: &[u8] = include_wav!("sfx/shield_defend.wav");
const DISRUPT: &[u8] = include_wav!("sfx/disrupt.wav"); static DISRUPT: &[u8] = include_wav!("sfx/disrupt.wav");
const HEAL: &[u8] = include_wav!("sfx/heal.wav"); static HEAL: &[u8] = include_wav!("sfx/heal.wav");
const SEND_BURST_SHIELD: &[u8] = include_wav!("sfx/send_burst_shield.wav"); static SEND_BURST_SHIELD: &[u8] = include_wav!("sfx/send_burst_shield.wav");
const BURST_SHIELD_HIT: &[u8] = include_wav!("sfx/burst_shield_hit.wav"); static BURST_SHIELD_HIT: &[u8] = include_wav!("sfx/burst_shield_hit.wav");
#[derive(Clone, Copy, PartialEq, Eq)] #[derive(Clone, Copy, PartialEq, Eq)]
enum BattleOrMenu { enum BattleOrMenu {

View file

@ -78,12 +78,12 @@ fn main() {
let tilemaps_output = quote! { let tilemaps_output = quote! {
use agb::display::tiled::TileSetting; use agb::display::tiled::TileSetting;
pub const UI_BACKGROUND_MAP: &[TileSetting] = #ui_tiles; pub static UI_BACKGROUND_MAP: &[TileSetting] = #ui_tiles;
pub const LEVELS_MAP: &[&[TileSetting]] = &[#(#levels_tiles),*]; pub static LEVELS_MAP: &[&[TileSetting]] = &[#(#levels_tiles),*];
}; };
let levels_output = quote! { let levels_output = quote! {
pub const LEVELS: &[Level] = &[#(#levels_data),*]; pub static LEVELS: &[Level] = &[#(#levels_data),*];
}; };
{ {

View file

@ -19,14 +19,14 @@ pub fn load_palettes(vram_manager: &mut VRamManager) {
} }
pub fn load_ui(map: &mut RegularMap, vram_manager: &mut VRamManager) { pub fn load_ui(map: &mut RegularMap, vram_manager: &mut VRamManager) {
let ui_tileset = backgrounds::ui.tiles; let ui_tileset = &backgrounds::ui.tiles;
for y in 0..20u16 { for y in 0..20u16 {
for x in 0..30u16 { for x in 0..30u16 {
let tile_pos = y * 30 + x; let tile_pos = y * 30 + x;
let tile_setting = tilemaps::UI_BACKGROUND_MAP[tile_pos as usize]; let tile_setting = tilemaps::UI_BACKGROUND_MAP[tile_pos as usize];
map.set_tile(vram_manager, (x, y), &ui_tileset, tile_setting); map.set_tile(vram_manager, (x, y), ui_tileset, tile_setting);
} }
} }
} }
@ -38,14 +38,14 @@ pub fn load_level_background(
) { ) {
let level_map = &tilemaps::LEVELS_MAP[level_number]; let level_map = &tilemaps::LEVELS_MAP[level_number];
let level_tileset = backgrounds::level.tiles; let level_tileset = &backgrounds::level.tiles;
for y in 0..20u16 { for y in 0..20u16 {
for x in 0..22u16 { for x in 0..22u16 {
let tile_pos = y * 22 + x; let tile_pos = y * 22 + x;
let tile_setting = level_map[tile_pos as usize]; let tile_setting = level_map[tile_pos as usize];
map.set_tile(vram_manager, (x, y), &level_tileset, tile_setting); map.set_tile(vram_manager, (x, y), level_tileset, tile_setting);
} }
} }
} }

View file

@ -429,7 +429,7 @@ impl CursorState {
} }
} }
const fn arrow_for_direction(direction: Direction) -> &'static Tag { fn arrow_for_direction(direction: Direction) -> &'static Tag {
match direction { match direction {
Direction::Up => resources::ARROW_UP, Direction::Up => resources::ARROW_UP,
Direction::Down => resources::ARROW_DOWN, Direction::Down => resources::ARROW_DOWN,

View file

@ -151,11 +151,11 @@ impl Level {
} }
} }
pub const fn get_level(level_number: usize) -> &'static Level { pub fn get_level(level_number: usize) -> &'static Level {
&levels::LEVELS[level_number] &levels::LEVELS[level_number]
} }
pub const fn num_levels() -> usize { pub fn num_levels() -> usize {
levels::LEVELS.len() levels::LEVELS.len()
} }
} }

View file

@ -3,7 +3,7 @@ use agb::{
include_aseprite, include_font, include_aseprite, include_font,
}; };
const SPRITES: &Graphics = include_aseprite!( static SPRITES: &Graphics = include_aseprite!(
"gfx/sprites16x16.aseprite", "gfx/sprites16x16.aseprite",
"gfx/sprites8x8.aseprite", "gfx/sprites8x8.aseprite",
"gfx/countdown.aseprite" "gfx/countdown.aseprite"
@ -16,7 +16,7 @@ macro_rules! named_tag {
] $(,)? ] $(,)?
) => { ) => {
$( $(
pub const $name: &agb::display::object::Tag = $sprites.tags().get(stringify!($name)); pub static $name: &agb::display::object::Tag = $sprites.tags().get(stringify!($name));
)+ )+
}; };
} }
@ -68,4 +68,4 @@ named_tag!(
] ]
); );
pub const FONT: Font = include_font!("fnt/yoster.ttf", 12); pub static FONT: Font = include_font!("fnt/yoster.ttf", 12);

View file

@ -5,18 +5,18 @@ use agb::{
}; };
use agb_tracker::{include_xm, Track, Tracker}; use agb_tracker::{include_xm, Track, Tracker};
const MUSIC: Track = include_xm!("sfx/gwilym-theme2.xm"); static MUSIC: Track = include_xm!("sfx/gwilym-theme2.xm");
const BAD_SELECTION: &[u8] = include_wav!("sfx/bad.wav"); static BAD_SELECTION: &[u8] = include_wav!("sfx/bad.wav");
const SELECT: &[u8] = include_wav!("sfx/select.wav"); static SELECT: &[u8] = include_wav!("sfx/select.wav");
const PLACE: &[u8] = include_wav!("sfx/place.wav"); static PLACE: &[u8] = include_wav!("sfx/place.wav");
const SLIME_DEATH: &[u8] = include_wav!("sfx/slime_death.wav"); static SLIME_DEATH: &[u8] = include_wav!("sfx/slime_death.wav");
const SWORD_PICKUP: &[u8] = include_wav!("sfx/sword_pickup.wav"); static SWORD_PICKUP: &[u8] = include_wav!("sfx/sword_pickup.wav");
const WALL_HIT: &[u8] = include_wav!("sfx/wall_hit.wav"); static WALL_HIT: &[u8] = include_wav!("sfx/wall_hit.wav");
const DOOR_OPEN: &[u8] = include_wav!("sfx/door_open.wav"); static DOOR_OPEN: &[u8] = include_wav!("sfx/door_open.wav");
const SWICTH_TOGGLES: &[&[u8]] = &[include_wav!("sfx/switch_toggle1.wav")]; static SWICTH_TOGGLES: &[&[u8]] = &[include_wav!("sfx/switch_toggle1.wav")];
pub struct Sfx<'a> { pub struct Sfx<'a> {
mixer: &'a mut Mixer<'a>, mixer: &'a mut Mixer<'a>,

View file

@ -164,8 +164,8 @@ mod tiled_export {
use crate::Level; use crate::Level;
use agb::fixnum::Vector2D; use agb::fixnum::Vector2D;
pub const fn get_level() -> Level {{ pub const fn get_level() -> &'static Level {{
Level {{ &Level {{
background: TILEMAP, background: TILEMAP,
foreground: BACKGROUND, foreground: BACKGROUND,
dimensions: Vector2D {{x: WIDTH, y: HEIGHT}}, dimensions: Vector2D {{x: WIDTH, y: HEIGHT}},

View file

@ -6,14 +6,14 @@ use agb::{
fixnum::Vector2D, fixnum::Vector2D,
}; };
const SLIME_IDLE: &Tag = TAG_MAP.get("Slime Idle"); static SLIME_IDLE: &Tag = TAG_MAP.get("Slime Idle");
const SLIME_JUMP: &Tag = TAG_MAP.get("Slime Jump"); static SLIME_JUMP: &Tag = TAG_MAP.get("Slime Jump");
const SLIME_SPLAT: &Tag = TAG_MAP.get("Slime splat"); static SLIME_SPLAT: &Tag = TAG_MAP.get("Slime splat");
const SNAIL_EMERGE: &Tag = TAG_MAP.get("Snail Emerge"); static SNAIL_EMERGE: &Tag = TAG_MAP.get("Snail Emerge");
const SNAIL_MOVE: &Tag = TAG_MAP.get("Snail Move"); static SNAIL_MOVE: &Tag = TAG_MAP.get("Snail Move");
const SNAIL_DEATH: &Tag = TAG_MAP.get("Snail Death"); static SNAIL_DEATH: &Tag = TAG_MAP.get("Snail Death");
const SNAIL_IDLE: &Tag = TAG_MAP.get("Snail Idle"); static SNAIL_IDLE: &Tag = TAG_MAP.get("Snail Idle");
enum UpdateState { enum UpdateState {
Nothing, Nothing,

View file

@ -42,7 +42,7 @@ pub struct Level {
mod map_tiles { mod map_tiles {
use super::Level; use super::Level;
pub const LEVELS: &[Level] = &[ pub static LEVELS: &[&Level] = &[
l1_1::get_level(), l1_1::get_level(),
l1_2::get_level(), l1_2::get_level(),
l1_3::get_level(), l1_3::get_level(),
@ -103,16 +103,16 @@ mod map_tiles {
agb::include_background_gfx!(tile_sheet, "2ce8f4", background => deduplicate "gfx/tile_sheet.png"); agb::include_background_gfx!(tile_sheet, "2ce8f4", background => deduplicate "gfx/tile_sheet.png");
const GRAPHICS: &Graphics = agb::include_aseprite!("gfx/sprites.aseprite"); static GRAPHICS: &Graphics = agb::include_aseprite!("gfx/sprites.aseprite");
const TAG_MAP: &TagMap = GRAPHICS.tags(); static TAG_MAP: &TagMap = GRAPHICS.tags();
const WALKING: &Tag = TAG_MAP.get("Walking"); static WALKING: &Tag = TAG_MAP.get("Walking");
const JUMPING: &Tag = TAG_MAP.get("Jumping"); static JUMPING: &Tag = TAG_MAP.get("Jumping");
const FALLING: &Tag = TAG_MAP.get("Falling"); static FALLING: &Tag = TAG_MAP.get("Falling");
const PLAYER_DEATH: &Tag = TAG_MAP.get("Player Death"); static PLAYER_DEATH: &Tag = TAG_MAP.get("Player Death");
const HAT_SPIN_1: &Tag = TAG_MAP.get("HatSpin"); static HAT_SPIN_1: &Tag = TAG_MAP.get("HatSpin");
const HAT_SPIN_2: &Tag = TAG_MAP.get("HatSpin2"); static HAT_SPIN_2: &Tag = TAG_MAP.get("HatSpin2");
const HAT_SPIN_3: &Tag = TAG_MAP.get("HatSpin3"); static HAT_SPIN_3: &Tag = TAG_MAP.get("HatSpin3");
type FixedNumberType = FixedNum<10>; type FixedNumberType = FixedNum<10>;
@ -788,14 +788,14 @@ pub fn main(mut agb: agb::Gba) -> ! {
TileFormat::FourBpp, TileFormat::FourBpp,
); );
let tileset = tile_sheet::background.tiles; let tileset = &tile_sheet::background.tiles;
for y in 0..32u16 { for y in 0..32u16 {
for x in 0..32u16 { for x in 0..32u16 {
world_display.set_tile( world_display.set_tile(
&mut vram, &mut vram,
(x, y), (x, y),
&tileset, tileset,
tile_sheet::background.tile_settings[level_display::BLANK], tile_sheet::background.tile_settings[level_display::BLANK],
); );
} }
@ -839,7 +839,7 @@ pub fn main(mut agb: agb::Gba) -> ! {
&mut world_display, &mut world_display,
current_level / 8 + 1, current_level / 8 + 1,
current_level % 8 + 1, current_level % 8 + 1,
&tileset, tileset,
&mut vram, &mut vram,
tile_sheet::background.tile_settings, tile_sheet::background.tile_settings,
); );
@ -860,7 +860,7 @@ pub fn main(mut agb: agb::Gba) -> ! {
Box::new(|pos: Vector2D<i32>| { Box::new(|pos: Vector2D<i32>| {
let level = &map_tiles::LEVELS[map_current_level as usize]; let level = &map_tiles::LEVELS[map_current_level as usize];
( (
&tileset, tileset,
tile_sheet::background.tile_settings[*level tile_sheet::background.tile_settings[*level
.background .background
.get((pos.y * level.dimensions.x as i32 + pos.x) as usize) .get((pos.y * level.dimensions.x as i32 + pos.x) as usize)
@ -878,7 +878,7 @@ pub fn main(mut agb: agb::Gba) -> ! {
Box::new(|pos: Vector2D<i32>| { Box::new(|pos: Vector2D<i32>| {
let level = &map_tiles::LEVELS[map_current_level as usize]; let level = &map_tiles::LEVELS[map_current_level as usize];
( (
&tileset, tileset,
tile_sheet::background.tile_settings[*level tile_sheet::background.tile_settings[*level
.foreground .foreground
.get((pos.y * level.dimensions.x as i32 + pos.x) as usize) .get((pos.y * level.dimensions.x as i32 + pos.x) as usize)
@ -889,7 +889,7 @@ pub fn main(mut agb: agb::Gba) -> ! {
); );
let mut level = PlayingLevel::open_level( let mut level = PlayingLevel::open_level(
&map_tiles::LEVELS[current_level as usize], map_tiles::LEVELS[current_level as usize],
&object, &object,
&mut background, &mut background,
&mut foreground, &mut foreground,

View file

@ -7,9 +7,9 @@ mod music_data {
// 1. Play the intro. // 1. Play the intro.
// 2. When the intro reaches approximately 11.080 seconds, trigger the main loop and let the intro finish underneath it. // 2. When the intro reaches approximately 11.080 seconds, trigger the main loop and let the intro finish underneath it.
// 3. Re-trigger the main loop every time it reaches 1 minute 26.080 seconds, and let the old instance finish underneath the new one. // 3. Re-trigger the main loop every time it reaches 1 minute 26.080 seconds, and let the old instance finish underneath the new one.
pub const INTRO_MUSIC: &[u8] = pub static INTRO_MUSIC: &[u8] =
agb::include_wav!("sfx/Otto Halmén - Sylvan Waltz (loop intro).wav"); agb::include_wav!("sfx/Otto Halmén - Sylvan Waltz (loop intro).wav");
pub const LOOP: &[u8] = agb::include_wav!("sfx/Otto Halmén - Sylvan Waltz (loop main).wav"); pub static LOOP: &[u8] = agb::include_wav!("sfx/Otto Halmén - Sylvan Waltz (loop main).wav");
// These are based on the instructions above and a frame rate of 59.73Hz // These are based on the instructions above and a frame rate of 59.73Hz
pub const TRIGGER_MUSIC_POINT: i32 = 662; pub const TRIGGER_MUSIC_POINT: i32 = 662;
@ -17,24 +17,24 @@ mod music_data {
} }
mod effects { mod effects {
const WOOSH1: &[u8] = agb::include_wav!("sfx/woosh1.wav"); static WOOSH1: &[u8] = agb::include_wav!("sfx/woosh1.wav");
const WOOSH2: &[u8] = agb::include_wav!("sfx/woosh2.wav"); static WOOSH2: &[u8] = agb::include_wav!("sfx/woosh2.wav");
const WOOSH3: &[u8] = agb::include_wav!("sfx/woosh3.wav"); static WOOSH3: &[u8] = agb::include_wav!("sfx/woosh3.wav");
pub const WHOOSHES: &[&[u8]] = &[WOOSH1, WOOSH2, WOOSH3]; pub static WHOOSHES: &[&[u8]] = &[WOOSH1, WOOSH2, WOOSH3];
pub const CATCH: &[u8] = agb::include_wav!("sfx/catch.wav"); pub static CATCH: &[u8] = agb::include_wav!("sfx/catch.wav");
pub const JUMP: &[u8] = agb::include_wav!("sfx/jump.wav"); pub static JUMP: &[u8] = agb::include_wav!("sfx/jump.wav");
pub const LAND: &[u8] = agb::include_wav!("sfx/land.wav"); pub static LAND: &[u8] = agb::include_wav!("sfx/land.wav");
pub const SLIME_JUMP: &[u8] = agb::include_wav!("sfx/slime-jump.wav"); pub static SLIME_JUMP: &[u8] = agb::include_wav!("sfx/slime-jump.wav");
pub const SLIME_DEATH: &[u8] = agb::include_wav!("sfx/slime-death.wav"); pub static SLIME_DEATH: &[u8] = agb::include_wav!("sfx/slime-death.wav");
pub const SNAIL_EMERGE: &[u8] = agb::include_wav!("sfx/snail-emerge.wav"); pub static SNAIL_EMERGE: &[u8] = agb::include_wav!("sfx/snail-emerge.wav");
pub const SNAIL_RETREAT: &[u8] = agb::include_wav!("sfx/snail-retreat.wav"); pub static SNAIL_RETREAT: &[u8] = agb::include_wav!("sfx/snail-retreat.wav");
pub const SNAIL_HAT_BOUNCE: &[u8] = agb::include_wav!("sfx/snail-hat-bounce.wav"); pub static SNAIL_HAT_BOUNCE: &[u8] = agb::include_wav!("sfx/snail-hat-bounce.wav");
pub const SNAIL_DEATH: &[u8] = agb::include_wav!("sfx/snail-death.wav"); pub static SNAIL_DEATH: &[u8] = agb::include_wav!("sfx/snail-death.wav");
} }
pub struct SfxPlayer<'a> { pub struct SfxPlayer<'a> {

View file

@ -19,8 +19,8 @@ pub fn show_splash_screen(
) { ) {
map.set_scroll_pos((0i16, 0i16)); map.set_scroll_pos((0i16, 0i16));
let tile_data = match which { let tile_data = match which {
SplashScreen::Start => splash_screens::splash, SplashScreen::Start => &splash_screens::splash,
SplashScreen::End => splash_screens::thanks_for_playing, SplashScreen::End => &splash_screens::thanks_for_playing,
}; };
let vblank = agb::interrupt::VBlank::get(); let vblank = agb::interrupt::VBlank::get();
@ -30,7 +30,7 @@ pub fn show_splash_screen(
sfx.frame(); sfx.frame();
vblank.wait_for_vblank(); vblank.wait_for_vblank();
map.fill_with(vram, &tile_data); map.fill_with(vram, tile_data);
map.commit(vram); map.commit(vram);
vram.set_background_palettes(splash_screens::PALETTES); vram.set_background_palettes(splash_screens::PALETTES);

View file

@ -42,22 +42,22 @@ fn main() {
(0..map.tilesets[0].tilecount.unwrap()).map(|id| tile_types.get(&(id + 1)).unwrap_or(&0)); (0..map.tilesets[0].tilecount.unwrap()).map(|id| tile_types.get(&(id + 1)).unwrap_or(&0));
let output = quote! { let output = quote! {
pub const CLOUD_MAP: &[u16] = &[#(#cloud_tiles),*]; pub static CLOUD_MAP: &[u16] = &[#(#cloud_tiles),*];
pub const BACKGROUND_MAP: &[u16] = &[#(#background_tiles),*]; pub static BACKGROUND_MAP: &[u16] = &[#(#background_tiles),*];
pub const FOREGROUND_MAP: &[u16] = &[#(#foreground_tiles),*]; pub static FOREGROUND_MAP: &[u16] = &[#(#foreground_tiles),*];
pub const WIDTH: i32 = #width as i32; pub const WIDTH: i32 = #width as i32;
pub const HEIGHT: i32 = #height as i32; pub const HEIGHT: i32 = #height as i32;
pub const SLIME_SPAWNS_X: &[u16] = &[#(#slimes_x),*]; pub static SLIME_SPAWNS_X: &[u16] = &[#(#slimes_x),*];
pub const SLIME_SPAWNS_Y: &[u16] = &[#(#slimes_y),*]; pub static SLIME_SPAWNS_Y: &[u16] = &[#(#slimes_y),*];
pub const BAT_SPAWNS_X: &[u16] = &[#(#bats_x),*]; pub static BAT_SPAWNS_X: &[u16] = &[#(#bats_x),*];
pub const BAT_SPAWNS_Y: &[u16] = &[#(#bats_y),*]; pub static BAT_SPAWNS_Y: &[u16] = &[#(#bats_y),*];
pub const EMU_SPAWNS_X: &[u16] = &[#(#emus_x),*]; pub static EMU_SPAWNS_X: &[u16] = &[#(#emus_x),*];
pub const EMU_SPAWNS_Y: &[u16] = &[#(#emus_y),*]; pub static EMU_SPAWNS_Y: &[u16] = &[#(#emus_y),*];
pub const TILE_TYPES: &[u8] = &[#(#tile_types),*]; pub static TILE_TYPES: &[u8] = &[#(#tile_types),*];
}; };
let output_file = File::create(format!("{out_dir}/tilemap.rs")) let output_file = File::create(format!("{out_dir}/tilemap.rs"))

View file

@ -27,32 +27,32 @@ use agb::{
use generational_arena::Arena; use generational_arena::Arena;
use sfx::Sfx; use sfx::Sfx;
const GRAPHICS: &Graphics = agb::include_aseprite!("gfx/objects.aseprite", "gfx/boss.aseprite"); static GRAPHICS: &Graphics = agb::include_aseprite!("gfx/objects.aseprite", "gfx/boss.aseprite");
const TAG_MAP: &TagMap = GRAPHICS.tags(); static TAG_MAP: &TagMap = GRAPHICS.tags();
const LONG_SWORD_IDLE: &Tag = TAG_MAP.get("Idle - longsword"); static LONG_SWORD_IDLE: &Tag = TAG_MAP.get("Idle - longsword");
const LONG_SWORD_WALK: &Tag = TAG_MAP.get("Walk - longsword"); static LONG_SWORD_WALK: &Tag = TAG_MAP.get("Walk - longsword");
const LONG_SWORD_JUMP: &Tag = TAG_MAP.get("Jump - longsword"); static LONG_SWORD_JUMP: &Tag = TAG_MAP.get("Jump - longsword");
const LONG_SWORD_ATTACK: &Tag = TAG_MAP.get("Attack - longsword"); static LONG_SWORD_ATTACK: &Tag = TAG_MAP.get("Attack - longsword");
const LONG_SWORD_JUMP_ATTACK: &Tag = TAG_MAP.get("Jump attack - longsword"); static LONG_SWORD_JUMP_ATTACK: &Tag = TAG_MAP.get("Jump attack - longsword");
const SHORT_SWORD_IDLE: &Tag = TAG_MAP.get("Idle - shortsword"); static SHORT_SWORD_IDLE: &Tag = TAG_MAP.get("Idle - shortsword");
const SHORT_SWORD_WALK: &Tag = TAG_MAP.get("Walk - shortsword"); static SHORT_SWORD_WALK: &Tag = TAG_MAP.get("Walk - shortsword");
const SHORT_SWORD_JUMP: &Tag = TAG_MAP.get("jump - shortsword"); static SHORT_SWORD_JUMP: &Tag = TAG_MAP.get("jump - shortsword");
const SHORT_SWORD_ATTACK: &Tag = TAG_MAP.get("attack - shortsword"); static SHORT_SWORD_ATTACK: &Tag = TAG_MAP.get("attack - shortsword");
const SHORT_SWORD_JUMP_ATTACK: &Tag = TAG_MAP.get("jump attack - shortsword"); static SHORT_SWORD_JUMP_ATTACK: &Tag = TAG_MAP.get("jump attack - shortsword");
const KNIFE_IDLE: &Tag = TAG_MAP.get("idle - knife"); static KNIFE_IDLE: &Tag = TAG_MAP.get("idle - knife");
const KNIFE_WALK: &Tag = TAG_MAP.get("walk - knife"); static KNIFE_WALK: &Tag = TAG_MAP.get("walk - knife");
const KNIFE_JUMP: &Tag = TAG_MAP.get("jump - knife"); static KNIFE_JUMP: &Tag = TAG_MAP.get("jump - knife");
const KNIFE_ATTACK: &Tag = TAG_MAP.get("attack - knife"); static KNIFE_ATTACK: &Tag = TAG_MAP.get("attack - knife");
const KNIFE_JUMP_ATTACK: &Tag = TAG_MAP.get("jump attack - knife"); static KNIFE_JUMP_ATTACK: &Tag = TAG_MAP.get("jump attack - knife");
const SWORDLESS_IDLE: &Tag = TAG_MAP.get("idle swordless"); static SWORDLESS_IDLE: &Tag = TAG_MAP.get("idle swordless");
const SWORDLESS_WALK: &Tag = TAG_MAP.get("walk swordless"); static SWORDLESS_WALK: &Tag = TAG_MAP.get("walk swordless");
const SWORDLESS_JUMP: &Tag = TAG_MAP.get("jump swordless"); static SWORDLESS_JUMP: &Tag = TAG_MAP.get("jump swordless");
const SWORDLESS_ATTACK: &Tag = KNIFE_ATTACK; static SWORDLESS_ATTACK: &Tag = KNIFE_ATTACK;
const SWORDLESS_JUMP_ATTACK: &Tag = KNIFE_JUMP_ATTACK; static SWORDLESS_JUMP_ATTACK: &Tag = KNIFE_JUMP_ATTACK;
agb::include_background_gfx!(background, "53269a", background => deduplicate "gfx/background.aseprite"); agb::include_background_gfx!(background, "53269a", background => deduplicate "gfx/background.aseprite");
@ -809,7 +809,7 @@ impl BatData {
.unwrap_or(false); .unwrap_or(false);
let should_damage = entity.collider().touches(player.entity.collider()); let should_damage = entity.collider().touches(player.entity.collider());
const BAT_IDLE: &Tag = TAG_MAP.get("bat"); static BAT_IDLE: &Tag = TAG_MAP.get("bat");
match &mut self.bat_state { match &mut self.bat_state {
BatState::Idle => { BatState::Idle => {
@ -883,7 +883,7 @@ impl BatData {
} }
} }
BatState::Dead => { BatState::Dead => {
const BAT_DEAD: &Tag = TAG_MAP.get("bat dead"); static BAT_DEAD: &Tag = TAG_MAP.get("bat dead");
let sprite = BAT_DEAD.sprite(0); let sprite = BAT_DEAD.sprite(0);
let sprite = controller.sprite(sprite); let sprite = controller.sprite(sprite);
@ -950,7 +950,7 @@ impl SlimeData {
self.sprite_offset = 0; self.sprite_offset = 0;
} }
const IDLE: &Tag = TAG_MAP.get("slime idle"); static IDLE: &Tag = TAG_MAP.get("slime idle");
let sprite = IDLE.sprite(self.sprite_offset as usize / 16); let sprite = IDLE.sprite(self.sprite_offset as usize / 16);
let sprite = controller.sprite(sprite); let sprite = controller.sprite(sprite);
@ -990,7 +990,7 @@ impl SlimeData {
sfx.slime_boing(); sfx.slime_boing();
} }
const CHASE: &Tag = TAG_MAP.get("Slime jump"); static CHASE: &Tag = TAG_MAP.get("Slime jump");
let sprite = CHASE.sprite(frame as usize); let sprite = CHASE.sprite(frame as usize);
let sprite = controller.sprite(sprite); let sprite = controller.sprite(sprite);
@ -1021,7 +1021,7 @@ impl SlimeData {
} }
SlimeState::Dead(count) => { SlimeState::Dead(count) => {
if *count < 5 * 4 { if *count < 5 * 4 {
const DEATH: &Tag = TAG_MAP.get("Slime death"); static DEATH: &Tag = TAG_MAP.get("Slime death");
let sprite = DEATH.sprite(*count as usize / 4); let sprite = DEATH.sprite(*count as usize / 4);
let sprite = controller.sprite(sprite); let sprite = controller.sprite(sprite);
@ -1074,7 +1074,7 @@ impl MiniFlameData {
self.sprite_offset += 1; self.sprite_offset += 1;
const ANGRY: &Tag = TAG_MAP.get("angry boss"); static ANGRY: &Tag = TAG_MAP.get("angry boss");
match &mut self.state { match &mut self.state {
MiniFlameState::Idle(frames) => { MiniFlameState::Idle(frames) => {
@ -1148,7 +1148,7 @@ impl MiniFlameData {
instruction = UpdateInstruction::Remove; instruction = UpdateInstruction::Remove;
} }
const DEATH: &Tag = TAG_MAP.get("angry boss dead"); static DEATH: &Tag = TAG_MAP.get("angry boss dead");
let sprite = DEATH.animation_sprite(self.sprite_offset as usize / 12); let sprite = DEATH.animation_sprite(self.sprite_offset as usize / 12);
let sprite = controller.sprite(sprite); let sprite = controller.sprite(sprite);
@ -1209,7 +1209,7 @@ impl EmuData {
self.sprite_offset = 0; self.sprite_offset = 0;
} }
const IDLE: &Tag = TAG_MAP.get("emu - idle"); static IDLE: &Tag = TAG_MAP.get("emu - idle");
let sprite = IDLE.sprite(self.sprite_offset as usize / 16); let sprite = IDLE.sprite(self.sprite_offset as usize / 16);
let sprite = controller.sprite(sprite); let sprite = controller.sprite(sprite);
@ -1256,7 +1256,7 @@ impl EmuData {
sfx.emu_step(); sfx.emu_step();
} }
const WALK: &Tag = TAG_MAP.get("emu-walk"); static WALK: &Tag = TAG_MAP.get("emu-walk");
let sprite = WALK.sprite(self.sprite_offset as usize / 2); let sprite = WALK.sprite(self.sprite_offset as usize / 2);
let sprite = controller.sprite(sprite); let sprite = controller.sprite(sprite);
@ -1311,7 +1311,7 @@ impl EmuData {
instruction = UpdateInstruction::Remove; instruction = UpdateInstruction::Remove;
} }
const DEATH: &Tag = TAG_MAP.get("emu - die"); static DEATH: &Tag = TAG_MAP.get("emu - die");
let sprite = DEATH.animation_sprite(self.sprite_offset as usize / 4); let sprite = DEATH.animation_sprite(self.sprite_offset as usize / 4);
let sprite = controller.sprite(sprite); let sprite = controller.sprite(sprite);
@ -1345,10 +1345,10 @@ impl EnemyData {
} }
fn sprite(&self) -> &'static Sprite { fn sprite(&self) -> &'static Sprite {
const SLIME: &Tag = TAG_MAP.get("slime idle"); static SLIME: &Tag = TAG_MAP.get("slime idle");
const BAT: &Tag = TAG_MAP.get("bat"); static BAT: &Tag = TAG_MAP.get("bat");
const MINI_FLAME: &Tag = TAG_MAP.get("angry boss"); static MINI_FLAME: &Tag = TAG_MAP.get("angry boss");
const EMU: &Tag = TAG_MAP.get("emu - idle"); static EMU: &Tag = TAG_MAP.get("emu - idle");
match self { match self {
EnemyData::Slime(_) => SLIME.sprite(0), EnemyData::Slime(_) => SLIME.sprite(0),
EnemyData::Bat(_) => BAT.sprite(0), EnemyData::Bat(_) => BAT.sprite(0),
@ -1436,7 +1436,7 @@ impl ParticleData {
return UpdateInstruction::Remove; return UpdateInstruction::Remove;
} }
const DUST: &Tag = TAG_MAP.get("dust"); static DUST: &Tag = TAG_MAP.get("dust");
let sprite = DUST.sprite(*frame as usize / 3); let sprite = DUST.sprite(*frame as usize / 3);
let sprite = controller.sprite(sprite); let sprite = controller.sprite(sprite);
@ -1450,7 +1450,7 @@ impl ParticleData {
return UpdateInstruction::Remove; // have played the animation 6 times return UpdateInstruction::Remove; // have played the animation 6 times
} }
const HEALTH: &Tag = TAG_MAP.get("Heath"); static HEALTH: &Tag = TAG_MAP.get("Heath");
let sprite = HEALTH.animation_sprite(*frame as usize / 3); let sprite = HEALTH.animation_sprite(*frame as usize / 3);
let sprite = controller.sprite(sprite); let sprite = controller.sprite(sprite);
@ -1476,7 +1476,7 @@ impl ParticleData {
UpdateInstruction::None UpdateInstruction::None
} }
ParticleData::BossHealer(frame, target) => { ParticleData::BossHealer(frame, target) => {
const HEALTH: &Tag = TAG_MAP.get("Heath"); static HEALTH: &Tag = TAG_MAP.get("Heath");
let sprite = HEALTH.animation_sprite(*frame as usize / 3); let sprite = HEALTH.animation_sprite(*frame as usize / 3);
let sprite = controller.sprite(sprite); let sprite = controller.sprite(sprite);
@ -1633,7 +1633,7 @@ impl<'a> FollowingBoss<'a> {
self.timer / 16 self.timer / 16
}; };
const BOSS: &Tag = TAG_MAP.get("happy boss"); static BOSS: &Tag = TAG_MAP.get("happy boss");
let sprite = BOSS.animation_sprite(frame as usize); let sprite = BOSS.animation_sprite(frame as usize);
let sprite = controller.sprite(sprite); let sprite = controller.sprite(sprite);
@ -1766,7 +1766,7 @@ impl<'a> Boss<'a> {
self.timer += 1; self.timer += 1;
let frame = self.timer / animation_rate; let frame = self.timer / animation_rate;
const BOSS: &Tag = TAG_MAP.get("Boss"); static BOSS: &Tag = TAG_MAP.get("Boss");
let sprite = BOSS.animation_sprite(frame as usize); let sprite = BOSS.animation_sprite(frame as usize);
let sprite = object_controller.sprite(sprite); let sprite = object_controller.sprite(sprite);
@ -2192,7 +2192,7 @@ fn game_with_level(gba: &mut agb::Gba) {
let (background, mut vram) = gba.display.video.tiled0(); let (background, mut vram) = gba.display.video.tiled0();
vram.set_background_palettes(background::PALETTES); vram.set_background_palettes(background::PALETTES);
let tileset = background::background.tiles; let tileset = &background::background.tiles;
let object = gba.display.object.get_managed(); let object = gba.display.object.get_managed();
loop { loop {
@ -2204,7 +2204,7 @@ fn game_with_level(gba: &mut agb::Gba) {
), ),
Box::new(|pos| { Box::new(|pos| {
( (
&tileset, tileset,
background::background.tile_settings[*tilemap::BACKGROUND_MAP background::background.tile_settings[*tilemap::BACKGROUND_MAP
.get((pos.x + tilemap::WIDTH * pos.y) as usize) .get((pos.x + tilemap::WIDTH * pos.y) as usize)
.unwrap_or(&0) .unwrap_or(&0)
@ -2221,7 +2221,7 @@ fn game_with_level(gba: &mut agb::Gba) {
), ),
Box::new(|pos| { Box::new(|pos| {
( (
&tileset, tileset,
background::background.tile_settings[*tilemap::FOREGROUND_MAP background::background.tile_settings[*tilemap::FOREGROUND_MAP
.get((pos.x + tilemap::WIDTH * pos.y) as usize) .get((pos.x + tilemap::WIDTH * pos.y) as usize)
.unwrap_or(&0) .unwrap_or(&0)
@ -2238,7 +2238,7 @@ fn game_with_level(gba: &mut agb::Gba) {
), ),
Box::new(|pos| { Box::new(|pos| {
( (
&tileset, tileset,
background::background.tile_settings[*tilemap::CLOUD_MAP background::background.tile_settings[*tilemap::CLOUD_MAP
.get((pos.x + tilemap::WIDTH * pos.y) as usize) .get((pos.x + tilemap::WIDTH * pos.y) as usize)
.unwrap_or(&0) .unwrap_or(&0)

View file

@ -2,28 +2,28 @@ use agb::fixnum::num;
use agb::rng; use agb::rng;
use agb::sound::mixer::{ChannelId, Mixer, SoundChannel}; use agb::sound::mixer::{ChannelId, Mixer, SoundChannel};
const BAT_DEATH: &[u8] = agb::include_wav!("sfx/BatDeath.wav"); static BAT_DEATH: &[u8] = agb::include_wav!("sfx/BatDeath.wav");
const BAT_FLAP: &[u8] = agb::include_wav!("sfx/BatFlap.wav"); static BAT_FLAP: &[u8] = agb::include_wav!("sfx/BatFlap.wav");
const JUMP1: &[u8] = agb::include_wav!("sfx/Jump1.wav"); static JUMP1: &[u8] = agb::include_wav!("sfx/Jump1.wav");
const JUMP2: &[u8] = agb::include_wav!("sfx/Jump2.wav"); static JUMP2: &[u8] = agb::include_wav!("sfx/Jump2.wav");
const JUMP3: &[u8] = agb::include_wav!("sfx/Jump3.wav"); static JUMP3: &[u8] = agb::include_wav!("sfx/Jump3.wav");
const PLAYER_GETS_HIT: &[u8] = agb::include_wav!("sfx/PlayerGetsHit.wav"); static PLAYER_GETS_HIT: &[u8] = agb::include_wav!("sfx/PlayerGetsHit.wav");
const PLAYER_HEAL: &[u8] = agb::include_wav!("sfx/PlayerHeal.wav"); static PLAYER_HEAL: &[u8] = agb::include_wav!("sfx/PlayerHeal.wav");
const PLAYER_LANDS: &[u8] = agb::include_wav!("sfx/PlayerLands.wav"); static PLAYER_LANDS: &[u8] = agb::include_wav!("sfx/PlayerLands.wav");
const SLIME_BOING: &[u8] = agb::include_wav!("sfx/SlimeBoing.wav"); static SLIME_BOING: &[u8] = agb::include_wav!("sfx/SlimeBoing.wav");
const SLIME_DEATH: &[u8] = agb::include_wav!("sfx/SlimeDeath.wav"); static SLIME_DEATH: &[u8] = agb::include_wav!("sfx/SlimeDeath.wav");
const SWORD_SWING: &[u8] = agb::include_wav!("sfx/SwordSwing.wav"); static SWORD_SWING: &[u8] = agb::include_wav!("sfx/SwordSwing.wav");
const FLAME_CHARGE: &[u8] = agb::include_wav!("sfx/FlameCharge.wav"); static FLAME_CHARGE: &[u8] = agb::include_wav!("sfx/FlameCharge.wav");
const BOSS_FLAME_MOVE: &[u8] = agb::include_wav!("sfx/FlameMove.wav"); static BOSS_FLAME_MOVE: &[u8] = agb::include_wav!("sfx/FlameMove.wav");
const BURNING_FLAME: &[u8] = agb::include_wav!("sfx/Burning.wav"); static BURNING_FLAME: &[u8] = agb::include_wav!("sfx/Burning.wav");
const EMU_CRASH: &[u8] = agb::include_wav!("sfx/EmuCrash.wav"); static EMU_CRASH: &[u8] = agb::include_wav!("sfx/EmuCrash.wav");
const EMU_STEP: &[u8] = agb::include_wav!("sfx/EmuStep.wav"); static EMU_STEP: &[u8] = agb::include_wav!("sfx/EmuStep.wav");
const EMU_DEATH: &[u8] = agb::include_wav!("sfx/EmuDeath.wav"); static EMU_DEATH: &[u8] = agb::include_wav!("sfx/EmuDeath.wav");
const PURPLE_NIGHT: &[u8] = agb::include_wav!("sfx/01 - The Purple Night (Main Loop).wav"); static PURPLE_NIGHT: &[u8] = agb::include_wav!("sfx/01 - The Purple Night (Main Loop).wav");
const SUNRISE: &[u8] = agb::include_wav!("sfx/02 - Sunrise (Main Loop).wav"); static SUNRISE: &[u8] = agb::include_wav!("sfx/02 - Sunrise (Main Loop).wav");
const BLUE_SPIRIT: &[u8] = agb::include_wav!("sfx/03 - Blue Spirit (Main Loop).wav"); static BLUE_SPIRIT: &[u8] = agb::include_wav!("sfx/03 - Blue Spirit (Main Loop).wav");
pub struct Sfx<'a> { pub struct Sfx<'a> {
bgm: Option<ChannelId>, bgm: Option<ChannelId>,

View file

@ -94,11 +94,11 @@ impl<'a> quote::ToTokens for Track<'a> {
tokens.append_all(quote! { tokens.append_all(quote! {
{ {
const SAMPLES: &[agb_tracker::__private::agb_tracker_interop::Sample<'static>] = &[#(#samples),*]; static SAMPLES: &[agb_tracker::__private::agb_tracker_interop::Sample<'static>] = &[#(#samples),*];
const PATTERN_DATA: &[agb_tracker::__private::agb_tracker_interop::PatternSlot] = &[#(#pattern_data),*]; static PATTERN_DATA: &[agb_tracker::__private::agb_tracker_interop::PatternSlot] = &[#(#pattern_data),*];
const PATTERNS: &[agb_tracker::__private::agb_tracker_interop::Pattern] = &[#(#patterns),*]; static PATTERNS: &[agb_tracker::__private::agb_tracker_interop::Pattern] = &[#(#patterns),*];
const PATTERNS_TO_PLAY: &[usize] = &[#(#patterns_to_play),*]; static PATTERNS_TO_PLAY: &[usize] = &[#(#patterns_to_play),*];
const ENVELOPES: &[agb_tracker::__private::agb_tracker_interop::Envelope<'static>] = &[#(#envelopes),*]; static ENVELOPES: &[agb_tracker::__private::agb_tracker_interop::Envelope<'static>] = &[#(#envelopes),*];
agb_tracker::Track { agb_tracker::Track {
samples: SAMPLES, samples: SAMPLES,
@ -149,7 +149,7 @@ impl quote::ToTokens for Envelope<'_> {
tokens.append_all(quote! { tokens.append_all(quote! {
{ {
const AMOUNTS: &[agb_tracker::__private::Num<i16, 8>] = &[#(#amount),*]; static AMOUNTS: &[agb_tracker::__private::Num<i16, 8>] = &[#(#amount),*];
agb_tracker::__private::agb_tracker_interop::Envelope { agb_tracker::__private::agb_tracker_interop::Envelope {
amount: AMOUNTS, amount: AMOUNTS,
@ -201,7 +201,7 @@ impl<'a> quote::ToTokens for Sample<'a> {
#[repr(align(4))] #[repr(align(4))]
struct AlignmentWrapper<const N: usize>([u8; N]); struct AlignmentWrapper<const N: usize>([u8; N]);
const SAMPLE_DATA: &[u8] = &AlignmentWrapper(*#samples).0; static SAMPLE_DATA: &[u8] = &AlignmentWrapper(*#samples).0;
agb_tracker::__private::agb_tracker_interop::Sample { agb_tracker::__private::agb_tracker_interop::Sample {
data: SAMPLE_DATA, data: SAMPLE_DATA,
should_loop: #should_loop, should_loop: #should_loop,

View file

@ -6,7 +6,7 @@ use agb::Gba;
use agb_tracker::{include_xm, Track, Tracker}; use agb_tracker::{include_xm, Track, Tracker};
// Found on: https://modarchive.org/index.php?request=view_by_moduleid&query=36662 // Found on: https://modarchive.org/index.php?request=view_by_moduleid&query=36662
const DB_TOFFE: Track = include_xm!("examples/db_toffe.xm"); static DB_TOFFE: Track = include_xm!("examples/db_toffe.xm");
#[agb::entry] #[agb::entry]
fn main(mut gba: Gba) -> ! { fn main(mut gba: Gba) -> ! {

View file

@ -6,7 +6,7 @@ use agb::Gba;
use agb_tracker::{include_xm, Track, Tracker}; use agb_tracker::{include_xm, Track, Tracker};
// Found on: https://modarchive.org/index.php?request=view_by_moduleid&query=36662 // Found on: https://modarchive.org/index.php?request=view_by_moduleid&query=36662
const DB_TOFFE: Track = include_xm!("examples/db_toffe.xm"); static DB_TOFFE: Track = include_xm!("examples/db_toffe.xm");
#[agb::entry] #[agb::entry]
fn main(mut gba: Gba) -> ! { fn main(mut gba: Gba) -> ! {

View file

@ -29,7 +29,7 @@
//! use agb::{Gba, sound::mixer::Frequency}; //! use agb::{Gba, sound::mixer::Frequency};
//! use agb_tracker::{include_xm, Track, Tracker}; //! use agb_tracker::{include_xm, Track, Tracker};
//! //!
//! const DB_TOFFE: Track = include_xm!("examples/db_toffe.xm"); //! static DB_TOFFE: Track = include_xm!("examples/db_toffe.xm");
//! //!
//! #[agb::entry] //! #[agb::entry]
//! fn main(mut gba: Gba) -> ! { //! fn main(mut gba: Gba) -> ! {

View file

@ -502,7 +502,7 @@ fn note_to_frequency_amega(note: Note, fine_tune: f64, relative_note: i8) -> f64
8363.0 * 1712.0 / period 8363.0 * 1712.0 / period
} }
const AMEGA_FREQUENCIES: &[u32] = &[ static AMEGA_FREQUENCIES: &[u32] = &[
907, 900, 894, 887, 881, 875, 868, 862, 856, 850, 844, 838, 832, 826, 820, 814, 808, 802, 796, 907, 900, 894, 887, 881, 875, 868, 862, 856, 850, 844, 838, 832, 826, 820, 814, 808, 802, 796,
791, 785, 779, 774, 768, 762, 757, 752, 746, 741, 736, 730, 725, 720, 715, 709, 704, 699, 694, 791, 785, 779, 774, 768, 762, 757, 752, 746, 741, 736, 730, 725, 720, 715, 709, 704, 699, 694,
689, 684, 678, 675, 670, 665, 660, 655, 651, 646, 640, 636, 632, 628, 623, 619, 614, 610, 604, 689, 684, 678, 675, 670, 665, 660, 655, 651, 646, 640, 636, 632, 628, 623, 619, 614, 610, 604,