Use static rather than const (#529)

This commit is contained in:
Corwin 2024-03-29 14:51:11 +00:00 committed by GitHub
commit 9cbddfec80
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
44 changed files with 335 additions and 330 deletions

View file

@ -15,6 +15,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Export the `dma` module correctly so you can write the types from it and use it in more complex cases. - Export the `dma` module correctly so you can write the types from it and use it in more complex cases.
### Changed
- Many macros now emit statics rather than consts OR can be used as statics OR
have had examples changed to use statics. You should use statics where possble
for assets as consts can lead to them being included multiple times in the
ROM.
## [0.19.1] - 2024/03/06 ## [0.19.1] - 2024/03/06
### Added ### Added

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,51 +6,31 @@ 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);
pub const BURST_BULLET: &Sprite = SPRITES.tags().get("burst shield bullet").sprite(0);
pub const SHIELD: &Tag = SPRITES.tags().get("ship shield");
pub const SHIP_SPRITES: &ShipSprites = &ShipSprites::load_ship_sprites();
pub const SMALL_SPRITES: &SmallSprites = &SmallSprites {};
pub struct FaceSprites {
sprites: [&'static Sprite; 17],
}
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: [ sprites: [
S_SHOOT, S_SHOOT,
S_SHIELD, S_SHIELD,
@ -71,8 +51,43 @@ impl FaceSprites {
S_INVERT, 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);
&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 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 {
sprites: [&'static Sprite; 17],
}
impl FaceSprites {
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,