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)*
const PALETTES: &[Palette16] = &[
static PALETTES: &[Palette16] = &[
#(#palette_data),*
];
pub const SPRITES: &[Sprite] = &[
static SPRITES: &[Sprite] = &[
#(#sprites),*
];
const TAGS: &TagMap = &TagMap::new(
static TAGS: TagMap = TagMap::new(
&[
#(#tags),*
]

View file

@ -31,7 +31,7 @@ pub(crate) fn generate_palette_code(
});
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! {
#[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 TILE_DATA: &[u8] = {

View file

@ -18,7 +18,7 @@ fn main(mut gba: agb::Gba) -> ! {
let (gfx, mut vram) = gba.display.video.tiled1();
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);
@ -26,7 +26,7 @@ fn main(mut gba: agb::Gba) -> ! {
for y 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 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);
@ -31,7 +31,7 @@ fn main(mut gba: agb::Gba) -> ! {
bg.set_tile(
&mut vram,
(x, y),
&tileset,
tileset,
water_tiles::water_tiles.tile_settings[0],
);
}
@ -44,7 +44,7 @@ fn main(mut gba: agb::Gba) -> ! {
loop {
i = (i + 1) % 8;
vram.replace_tile(&tileset, 0, &tileset, i);
vram.replace_tile(tileset, 0, tileset, i);
vblank.wait_for_vblank();
}

View file

@ -14,9 +14,9 @@ use agb::{
use core::fmt::Write;
// 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]
fn main(mut gba: Gba) -> ! {

View file

@ -7,7 +7,7 @@ use agb::sound::mixer::{Frequency, SoundChannel};
use agb::{fixnum::num, include_wav, Gba};
// 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]
fn main(mut gba: Gba) -> ! {

View file

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

View file

@ -14,9 +14,9 @@ use agb::{
use core::fmt::Write;
// 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]
fn main(mut gba: Gba) -> ! {

View file

@ -127,7 +127,7 @@ fn is_private_use(c: char) -> bool {
///
/// 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() {
/// let mut palette = [0x0; 16];
@ -214,7 +214,7 @@ impl BufferedRender<'_> {
///
/// 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]
/// fn main(gba: &mut agb::Gba) -> ! {

View file

@ -528,9 +528,9 @@ mod tests {
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]
fn test_always_ordered(gba: &mut crate::Gba) {

View file

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

View file

@ -398,12 +398,12 @@ mod tests {
#[test_case]
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/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();

View file

@ -40,7 +40,7 @@ use crate::{
/// use agb::display::Priority;
///
/// 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];
/// pub const WIDTH: i32 = // set it to some width
/// # 12;
@ -51,7 +51,7 @@ use crate::{
/// # fn foo(mut gba: agb::Gba) {
/// 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(
/// gfx.background(Priority::P2, RegularBackgroundSize::Background32x32, TileFormat::FourBpp),
@ -133,9 +133,9 @@ impl<'a> InfiniteScrolledMap<'a> {
/// # use agb::display::Priority;
/// #
/// # 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 MAP_TILES: &[u8] = &[0];
/// # pub static MAP_TILES: &[u8] = &[0];
/// # }
/// #
/// # 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) {
/// # 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(
/// # gfx.background(Priority::P2, RegularBackgroundSize::Background32x32, TileFormat::FourBpp),
@ -209,9 +209,9 @@ impl<'a> InfiniteScrolledMap<'a> {
/// # use agb::display::Priority;
/// #
/// # 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 MAP_TILES: &[u8] = &[0];
/// # pub static MAP_TILES: &[u8] = &[0];
/// # }
/// #
/// # 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) {
/// # 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(
/// # gfx.background(Priority::P2, RegularBackgroundSize::Background32x32, TileFormat::FourBpp),

View file

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

View file

@ -12,7 +12,7 @@ use crate::{
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>>>> {
vec![

View file

@ -82,7 +82,7 @@
//! # let vblank = agb::interrupt::VBlank::get();
//! # use agb::{*, sound::mixer::*};
//! // 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:
//! let mut channel = SoundChannel::new(MY_CRAZY_SOUND);
@ -194,7 +194,7 @@ impl Frequency {
/// # use agb::sound::mixer::*;
/// # use agb::*;
/// // 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
/// # fn foo(gba: &mut Gba) {
@ -213,7 +213,7 @@ impl Frequency {
/// # use agb::sound::mixer::*;
/// # use agb::*;
/// // 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
/// # fn foo(gba: &mut Gba) {
@ -258,7 +258,7 @@ impl SoundChannel {
/// # fn foo(gba: &mut Gba) {
/// # let mut mixer = gba.mixer.mixer(agb::sound::mixer::Frequency::Hz10512);
/// // 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
/// let jump_sound = SoundChannel::new(JUMP_SOUND);
@ -302,7 +302,7 @@ impl SoundChannel {
/// # fn foo(gba: &mut Gba) {
/// # let mut mixer = gba.mixer.mixer(agb::sound::mixer::Frequency::Hz10512);
/// // 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
/// 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 vblank = agb::interrupt::VBlank::get();
/// // 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:
/// let mut mixer = gba.mixer.mixer(Frequency::Hz10512);
@ -133,7 +133,7 @@ pub struct Mixer<'gba> {
/// # use agb::*;
/// # fn foo(gba: &mut Gba) {
/// # 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 bgm_channel_id = mixer.play_sound(channel).unwrap(); // will always be Some if high priority
///
@ -258,7 +258,7 @@ impl Mixer<'_> {
/// # use agb::*;
/// # fn foo(gba: &mut Gba) {
/// # 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 bgm_channel_id = mixer.play_sound(channel).unwrap(); // will always be Some if high priority
/// # }
@ -307,7 +307,7 @@ impl Mixer<'_> {
/// # use agb::*;
/// # fn foo(gba: &mut Gba) {
/// # 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 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,
};
// 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.
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
#[allow(dead_code)]
const PADDLE_END: &Tag = GRAPHICS.tags().get("Paddle End");
static PADDLE_END: &Tag = GRAPHICS.tags().get("Paddle End");
#[allow(dead_code)]
const PADDLE_MID: &Tag = GRAPHICS.tags().get("Paddle Mid");
const BALL: &Tag = GRAPHICS.tags().get("Ball");
static PADDLE_MID: &Tag = GRAPHICS.tags().get("Paddle Mid");
static BALL: &Tag = GRAPHICS.tags().get("Ball");
// 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

View file

@ -46,14 +46,14 @@ use agb::{
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.
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
const PADDLE_END: &Tag = GRAPHICS.tags().get("Paddle End");
const PADDLE_MID: &Tag = GRAPHICS.tags().get("Paddle Mid");
const BALL: &Tag = GRAPHICS.tags().get("Ball");
static PADDLE_END: &Tag = GRAPHICS.tags().get("Paddle End");
static PADDLE_MID: &Tag = GRAPHICS.tags().get("Paddle Mid");
static BALL: &Tag = GRAPHICS.tags().get("Ball");
```
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 {
fn new(loader: &mut SpriteLoader) -> Self {
const SPRITES: &Graphics = include_aseprite!(
static SPRITES: &Graphics = include_aseprite!(
"gfx/circles.aseprite",
"gfx/saw.aseprite",
"gfx/numbers.aseprite",
@ -152,12 +152,12 @@ impl SpriteCache {
.into_boxed_slice()
}
const NUMBERS: &Tag = SPRITES.tags().get("numbers");
const BLUE_CIRCLE: &Sprite = SPRITES.tags().get("Blue").sprite(0);
const RED_CIRCLE: &Sprite = SPRITES.tags().get("Red").sprite(0);
const SAW: &Sprite = SPRITES.tags().get("Saw").sprite(0);
const BAR_RED: &Tag = SPRITES.tags().get("Red Bar");
const BAR_BLUE: &Tag = SPRITES.tags().get("Blue Bar");
static NUMBERS: &Tag = SPRITES.tags().get("numbers");
static BLUE_CIRCLE: &Sprite = SPRITES.tags().get("Blue").sprite(0);
static RED_CIRCLE: &Sprite = SPRITES.tags().get("Red").sprite(0);
static SAW: &Sprite = SPRITES.tags().get("Saw").sprite(0);
static BAR_RED: &Tag = SPRITES.tags().get("Red Bar");
static BAR_BLUE: &Tag = SPRITES.tags().get("Blue Bar");
Self {
saw: loader.get_vram_sprite(SAW),

View file

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

View file

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

View file

@ -6,51 +6,31 @@ use alloc::vec::Vec;
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/ships.aseprite",
"gfx/small-sprites.aseprite"
);
pub const FACE_SPRITES: &FaceSprites = &FaceSprites::load_face_sprites();
pub const ENEMY_ATTACK_SPRITES: &EnemyAttackSprites = &EnemyAttackSprites::new();
pub const SELECT_BOX: &Tag = SPRITES.tags().get("selection");
pub const SELECTED_BOX: &Sprite = SPRITES.tags().get("selected").sprite(0);
pub const MODIFIED_BOX: &Sprite = SPRITES.tags().get("modified").sprite(0);
pub static FACE_SPRITES: &FaceSprites = {
static S_SHOOT: &Sprite = SPRITES.tags().get("shoot").sprite(0);
static S_SHIELD: &Sprite = SPRITES.tags().get("shield").sprite(0);
static S_MALFUNCTION: &Sprite = SPRITES.tags().get("malfunction").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);
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 {
&FaceSprites {
sprites: [
S_SHOOT,
S_SHIELD,
@ -71,8 +51,43 @@ impl FaceSprites {
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 {
self.sprites[face as usize]
}
@ -83,17 +98,6 @@ pub struct 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 {
self.sprites[ship as usize]
}
@ -101,17 +105,19 @@ impl ShipSprites {
pub struct SmallSprites;
static NUMBERS: &Tag = SPRITES.tags().get("numbers");
static RED_BAR: &Tag = SPRITES.tags().get("red bar");
impl SmallSprites {
pub const fn number(&self, i: u32) -> &'static Sprite {
SPRITES.tags().get("numbers").sprite(i as usize)
pub fn number(&self, i: u32) -> &'static Sprite {
NUMBERS.sprite(i as usize)
}
pub const fn slash(&self) -> &'static Sprite {
SPRITES.tags().get("numbers").sprite(10)
pub fn slash(&self) -> &'static Sprite {
NUMBERS.sprite(10)
}
pub const fn red_bar(&self, i: usize) -> &'static Sprite {
SPRITES.tags().get("red bar").sprite(i)
pub fn red_bar(&self, i: usize) -> &'static Sprite {
RED_BAR.sprite(i)
}
}
@ -120,16 +126,6 @@ pub struct 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 {
self.sprites[attack as usize]
}

View file

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

View file

@ -78,12 +78,12 @@ fn main() {
let tilemaps_output = quote! {
use agb::display::tiled::TileSetting;
pub const UI_BACKGROUND_MAP: &[TileSetting] = #ui_tiles;
pub const LEVELS_MAP: &[&[TileSetting]] = &[#(#levels_tiles),*];
pub static UI_BACKGROUND_MAP: &[TileSetting] = #ui_tiles;
pub static LEVELS_MAP: &[&[TileSetting]] = &[#(#levels_tiles),*];
};
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) {
let ui_tileset = backgrounds::ui.tiles;
let ui_tileset = &backgrounds::ui.tiles;
for y in 0..20u16 {
for x in 0..30u16 {
let tile_pos = y * 30 + x;
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_tileset = backgrounds::level.tiles;
let level_tileset = &backgrounds::level.tiles;
for y in 0..20u16 {
for x in 0..22u16 {
let tile_pos = y * 22 + x;
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 {
Direction::Up => resources::ARROW_UP,
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]
}
pub const fn num_levels() -> usize {
pub fn num_levels() -> usize {
levels::LEVELS.len()
}
}

View file

@ -3,7 +3,7 @@ use agb::{
include_aseprite, include_font,
};
const SPRITES: &Graphics = include_aseprite!(
static SPRITES: &Graphics = include_aseprite!(
"gfx/sprites16x16.aseprite",
"gfx/sprites8x8.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};
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");
const SELECT: &[u8] = include_wav!("sfx/select.wav");
const PLACE: &[u8] = include_wav!("sfx/place.wav");
static BAD_SELECTION: &[u8] = include_wav!("sfx/bad.wav");
static SELECT: &[u8] = include_wav!("sfx/select.wav");
static PLACE: &[u8] = include_wav!("sfx/place.wav");
const SLIME_DEATH: &[u8] = include_wav!("sfx/slime_death.wav");
const SWORD_PICKUP: &[u8] = include_wav!("sfx/sword_pickup.wav");
const WALL_HIT: &[u8] = include_wav!("sfx/wall_hit.wav");
const DOOR_OPEN: &[u8] = include_wav!("sfx/door_open.wav");
static SLIME_DEATH: &[u8] = include_wav!("sfx/slime_death.wav");
static SWORD_PICKUP: &[u8] = include_wav!("sfx/sword_pickup.wav");
static WALL_HIT: &[u8] = include_wav!("sfx/wall_hit.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> {
mixer: &'a mut Mixer<'a>,

View file

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

View file

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

View file

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

View file

@ -7,9 +7,9 @@ mod music_data {
// 1. Play the intro.
// 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.
pub const INTRO_MUSIC: &[u8] =
pub static INTRO_MUSIC: &[u8] =
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
pub const TRIGGER_MUSIC_POINT: i32 = 662;
@ -17,24 +17,24 @@ mod music_data {
}
mod effects {
const WOOSH1: &[u8] = agb::include_wav!("sfx/woosh1.wav");
const WOOSH2: &[u8] = agb::include_wav!("sfx/woosh2.wav");
const WOOSH3: &[u8] = agb::include_wav!("sfx/woosh3.wav");
static WOOSH1: &[u8] = agb::include_wav!("sfx/woosh1.wav");
static WOOSH2: &[u8] = agb::include_wav!("sfx/woosh2.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 const LAND: &[u8] = agb::include_wav!("sfx/land.wav");
pub static JUMP: &[u8] = agb::include_wav!("sfx/jump.wav");
pub static LAND: &[u8] = agb::include_wav!("sfx/land.wav");
pub const 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_JUMP: &[u8] = agb::include_wav!("sfx/slime-jump.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 const 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 const SNAIL_DEATH: &[u8] = agb::include_wav!("sfx/snail-death.wav");
pub static SNAIL_EMERGE: &[u8] = agb::include_wav!("sfx/snail-emerge.wav");
pub static SNAIL_RETREAT: &[u8] = agb::include_wav!("sfx/snail-retreat.wav");
pub static SNAIL_HAT_BOUNCE: &[u8] = agb::include_wav!("sfx/snail-hat-bounce.wav");
pub static SNAIL_DEATH: &[u8] = agb::include_wav!("sfx/snail-death.wav");
}
pub struct SfxPlayer<'a> {

View file

@ -19,8 +19,8 @@ pub fn show_splash_screen(
) {
map.set_scroll_pos((0i16, 0i16));
let tile_data = match which {
SplashScreen::Start => splash_screens::splash,
SplashScreen::End => splash_screens::thanks_for_playing,
SplashScreen::Start => &splash_screens::splash,
SplashScreen::End => &splash_screens::thanks_for_playing,
};
let vblank = agb::interrupt::VBlank::get();
@ -30,7 +30,7 @@ pub fn show_splash_screen(
sfx.frame();
vblank.wait_for_vblank();
map.fill_with(vram, &tile_data);
map.fill_with(vram, tile_data);
map.commit(vram);
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));
let output = quote! {
pub const CLOUD_MAP: &[u16] = &[#(#cloud_tiles),*];
pub const BACKGROUND_MAP: &[u16] = &[#(#background_tiles),*];
pub const FOREGROUND_MAP: &[u16] = &[#(#foreground_tiles),*];
pub static CLOUD_MAP: &[u16] = &[#(#cloud_tiles),*];
pub static BACKGROUND_MAP: &[u16] = &[#(#background_tiles),*];
pub static FOREGROUND_MAP: &[u16] = &[#(#foreground_tiles),*];
pub const WIDTH: i32 = #width as i32;
pub const HEIGHT: i32 = #height as i32;
pub const SLIME_SPAWNS_X: &[u16] = &[#(#slimes_x),*];
pub const SLIME_SPAWNS_Y: &[u16] = &[#(#slimes_y),*];
pub static SLIME_SPAWNS_X: &[u16] = &[#(#slimes_x),*];
pub static SLIME_SPAWNS_Y: &[u16] = &[#(#slimes_y),*];
pub const BAT_SPAWNS_X: &[u16] = &[#(#bats_x),*];
pub const BAT_SPAWNS_Y: &[u16] = &[#(#bats_y),*];
pub static BAT_SPAWNS_X: &[u16] = &[#(#bats_x),*];
pub static BAT_SPAWNS_Y: &[u16] = &[#(#bats_y),*];
pub const EMU_SPAWNS_X: &[u16] = &[#(#emus_x),*];
pub const EMU_SPAWNS_Y: &[u16] = &[#(#emus_y),*];
pub static EMU_SPAWNS_X: &[u16] = &[#(#emus_x),*];
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"))

View file

@ -27,32 +27,32 @@ use agb::{
use generational_arena::Arena;
use sfx::Sfx;
const GRAPHICS: &Graphics = agb::include_aseprite!("gfx/objects.aseprite", "gfx/boss.aseprite");
const TAG_MAP: &TagMap = GRAPHICS.tags();
static GRAPHICS: &Graphics = agb::include_aseprite!("gfx/objects.aseprite", "gfx/boss.aseprite");
static TAG_MAP: &TagMap = GRAPHICS.tags();
const LONG_SWORD_IDLE: &Tag = TAG_MAP.get("Idle - longsword");
const LONG_SWORD_WALK: &Tag = TAG_MAP.get("Walk - longsword");
const LONG_SWORD_JUMP: &Tag = TAG_MAP.get("Jump - longsword");
const LONG_SWORD_ATTACK: &Tag = TAG_MAP.get("Attack - longsword");
const LONG_SWORD_JUMP_ATTACK: &Tag = TAG_MAP.get("Jump attack - longsword");
static LONG_SWORD_IDLE: &Tag = TAG_MAP.get("Idle - longsword");
static LONG_SWORD_WALK: &Tag = TAG_MAP.get("Walk - longsword");
static LONG_SWORD_JUMP: &Tag = TAG_MAP.get("Jump - longsword");
static LONG_SWORD_ATTACK: &Tag = TAG_MAP.get("Attack - longsword");
static LONG_SWORD_JUMP_ATTACK: &Tag = TAG_MAP.get("Jump attack - longsword");
const SHORT_SWORD_IDLE: &Tag = TAG_MAP.get("Idle - shortsword");
const SHORT_SWORD_WALK: &Tag = TAG_MAP.get("Walk - shortsword");
const SHORT_SWORD_JUMP: &Tag = TAG_MAP.get("jump - shortsword");
const SHORT_SWORD_ATTACK: &Tag = TAG_MAP.get("attack - shortsword");
const SHORT_SWORD_JUMP_ATTACK: &Tag = TAG_MAP.get("jump attack - shortsword");
static SHORT_SWORD_IDLE: &Tag = TAG_MAP.get("Idle - shortsword");
static SHORT_SWORD_WALK: &Tag = TAG_MAP.get("Walk - shortsword");
static SHORT_SWORD_JUMP: &Tag = TAG_MAP.get("jump - shortsword");
static SHORT_SWORD_ATTACK: &Tag = TAG_MAP.get("attack - shortsword");
static SHORT_SWORD_JUMP_ATTACK: &Tag = TAG_MAP.get("jump attack - shortsword");
const KNIFE_IDLE: &Tag = TAG_MAP.get("idle - knife");
const KNIFE_WALK: &Tag = TAG_MAP.get("walk - knife");
const KNIFE_JUMP: &Tag = TAG_MAP.get("jump - knife");
const KNIFE_ATTACK: &Tag = TAG_MAP.get("attack - knife");
const KNIFE_JUMP_ATTACK: &Tag = TAG_MAP.get("jump attack - knife");
static KNIFE_IDLE: &Tag = TAG_MAP.get("idle - knife");
static KNIFE_WALK: &Tag = TAG_MAP.get("walk - knife");
static KNIFE_JUMP: &Tag = TAG_MAP.get("jump - knife");
static KNIFE_ATTACK: &Tag = TAG_MAP.get("attack - knife");
static KNIFE_JUMP_ATTACK: &Tag = TAG_MAP.get("jump attack - knife");
const SWORDLESS_IDLE: &Tag = TAG_MAP.get("idle swordless");
const SWORDLESS_WALK: &Tag = TAG_MAP.get("walk swordless");
const SWORDLESS_JUMP: &Tag = TAG_MAP.get("jump swordless");
const SWORDLESS_ATTACK: &Tag = KNIFE_ATTACK;
const SWORDLESS_JUMP_ATTACK: &Tag = KNIFE_JUMP_ATTACK;
static SWORDLESS_IDLE: &Tag = TAG_MAP.get("idle swordless");
static SWORDLESS_WALK: &Tag = TAG_MAP.get("walk swordless");
static SWORDLESS_JUMP: &Tag = TAG_MAP.get("jump swordless");
static SWORDLESS_ATTACK: &Tag = KNIFE_ATTACK;
static SWORDLESS_JUMP_ATTACK: &Tag = KNIFE_JUMP_ATTACK;
agb::include_background_gfx!(background, "53269a", background => deduplicate "gfx/background.aseprite");
@ -809,7 +809,7 @@ impl BatData {
.unwrap_or(false);
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 {
BatState::Idle => {
@ -883,7 +883,7 @@ impl BatData {
}
}
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 = controller.sprite(sprite);
@ -950,7 +950,7 @@ impl SlimeData {
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 = controller.sprite(sprite);
@ -990,7 +990,7 @@ impl SlimeData {
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 = controller.sprite(sprite);
@ -1021,7 +1021,7 @@ impl SlimeData {
}
SlimeState::Dead(count) => {
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 = controller.sprite(sprite);
@ -1074,7 +1074,7 @@ impl MiniFlameData {
self.sprite_offset += 1;
const ANGRY: &Tag = TAG_MAP.get("angry boss");
static ANGRY: &Tag = TAG_MAP.get("angry boss");
match &mut self.state {
MiniFlameState::Idle(frames) => {
@ -1148,7 +1148,7 @@ impl MiniFlameData {
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 = controller.sprite(sprite);
@ -1209,7 +1209,7 @@ impl EmuData {
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 = controller.sprite(sprite);
@ -1256,7 +1256,7 @@ impl EmuData {
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 = controller.sprite(sprite);
@ -1311,7 +1311,7 @@ impl EmuData {
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 = controller.sprite(sprite);
@ -1345,10 +1345,10 @@ impl EnemyData {
}
fn sprite(&self) -> &'static Sprite {
const SLIME: &Tag = TAG_MAP.get("slime idle");
const BAT: &Tag = TAG_MAP.get("bat");
const MINI_FLAME: &Tag = TAG_MAP.get("angry boss");
const EMU: &Tag = TAG_MAP.get("emu - idle");
static SLIME: &Tag = TAG_MAP.get("slime idle");
static BAT: &Tag = TAG_MAP.get("bat");
static MINI_FLAME: &Tag = TAG_MAP.get("angry boss");
static EMU: &Tag = TAG_MAP.get("emu - idle");
match self {
EnemyData::Slime(_) => SLIME.sprite(0),
EnemyData::Bat(_) => BAT.sprite(0),
@ -1436,7 +1436,7 @@ impl ParticleData {
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 = controller.sprite(sprite);
@ -1450,7 +1450,7 @@ impl ParticleData {
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 = controller.sprite(sprite);
@ -1476,7 +1476,7 @@ impl ParticleData {
UpdateInstruction::None
}
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 = controller.sprite(sprite);
@ -1633,7 +1633,7 @@ impl<'a> FollowingBoss<'a> {
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 = controller.sprite(sprite);
@ -1766,7 +1766,7 @@ impl<'a> Boss<'a> {
self.timer += 1;
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 = object_controller.sprite(sprite);
@ -2192,7 +2192,7 @@ fn game_with_level(gba: &mut agb::Gba) {
let (background, mut vram) = gba.display.video.tiled0();
vram.set_background_palettes(background::PALETTES);
let tileset = background::background.tiles;
let tileset = &background::background.tiles;
let object = gba.display.object.get_managed();
loop {
@ -2204,7 +2204,7 @@ fn game_with_level(gba: &mut agb::Gba) {
),
Box::new(|pos| {
(
&tileset,
tileset,
background::background.tile_settings[*tilemap::BACKGROUND_MAP
.get((pos.x + tilemap::WIDTH * pos.y) as usize)
.unwrap_or(&0)
@ -2221,7 +2221,7 @@ fn game_with_level(gba: &mut agb::Gba) {
),
Box::new(|pos| {
(
&tileset,
tileset,
background::background.tile_settings[*tilemap::FOREGROUND_MAP
.get((pos.x + tilemap::WIDTH * pos.y) as usize)
.unwrap_or(&0)
@ -2238,7 +2238,7 @@ fn game_with_level(gba: &mut agb::Gba) {
),
Box::new(|pos| {
(
&tileset,
tileset,
background::background.tile_settings[*tilemap::CLOUD_MAP
.get((pos.x + tilemap::WIDTH * pos.y) as usize)
.unwrap_or(&0)

View file

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

View file

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

View file

@ -6,7 +6,7 @@ use agb::Gba;
use agb_tracker::{include_xm, Track, Tracker};
// 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]
fn main(mut gba: Gba) -> ! {

View file

@ -6,7 +6,7 @@ use agb::Gba;
use agb_tracker::{include_xm, Track, Tracker};
// 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]
fn main(mut gba: Gba) -> ! {

View file

@ -29,7 +29,7 @@
//! use agb::{Gba, sound::mixer::Frequency};
//! 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]
//! 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
}
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,
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,