#![no_std]
#![allow(non_upper_case_globals)]

//Include the Arduboy Library
#[allow(unused_imports)]
use arduboy_rust::prelude::*;

#[allow(dead_code)]
const arduboy: Arduboy2 = Arduboy2::new();

// Progmem data
// 8x16

progmem!(
    pub static pills: [u8; _] = [
        // width, height,
        8, 8, 0x7e, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x7e, // TILE 00
        0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7e, // TILE 01
        0x7e, 0xd5, 0xab, 0xd5, 0xab, 0xd5, 0xab, 0x7e, // TILE 02
    ];
    pub static enemies: [u8; _] = [
        8, 8, // width, height,
        0xa3, 0x51, 0xa6, 0x51, 0xa1, 0x56, 0xa1, 0x53, // TILE 00
        0x7e, 0xdf, 0xb3, 0xdf, 0xbf, 0xd3, 0xbf, 0x7e, // TILE 01
        0x7e, 0xc1, 0xad, 0xc1, 0xa1, 0xcd, 0xa1, 0x7e, // TILE 02
    ];
);
// dynamic ram variables
struct Player {
    bitmap: *const u8,
    bitmap_frame: u8,
    x: i16,
    y: i16,
}
#[link_section = ".progmem.data"]
static mut p: Player = Player {
    bitmap: get_sprite_addr!(enemies),
    bitmap_frame: 0,
    x: 0,
    y: 0,
};

// The setup() function runs once when you turn your Arduboy on
#[no_mangle]
pub unsafe extern "C" fn setup() {
    // put your setup code here, to run once:
    arduboy.begin();
    arduboy.set_frame_rate(30);
}

// The loop() function repeats forever after setup() is done
#[no_mangle]
#[export_name = "loop"]
pub unsafe extern "C" fn loop_() {
    // put your main code here, to run repeatedly:
    if !arduboy.next_frame() {
        return;
    }
    arduboy.clear();
    sprites::draw_override(p.x, p.y, p.bitmap, p.bitmap_frame);
    arduboy.poll_buttons();
    if arduboy.pressed(UP) {
        p.y -= 1;
    }
    if arduboy.pressed(DOWN) {
        p.y += 1;
    }
    if arduboy.pressed(LEFT) {
        p.x -= 1;
    }
    if arduboy.pressed(RIGHT) {
        p.x += 1;
    }
    if arduboy.just_pressed(A) {
        p.bitmap_frame += 1;
        if p.bitmap_frame > 2 {
            p.bitmap_frame = 0
        }
    }

    arduboy.display();
}
