From ba785f8525f4043fcc94f51a1be5098701d6a5e5 Mon Sep 17 00:00:00 2001 From: dani <> Date: Mon, 14 Aug 2023 17:43:47 +0000 Subject: [PATCH] refactor --- CHANGLOG.md | 1 + Cargo.toml | 1 + examples/basic/gfx.gif | Bin 29133 -> 29134 bytes examples/hello_world/main.rs | 4 +- src/background.rs | 18 ++- src/gsa.rs | 59 +++++----- src/mapedit.rs | 210 ++++++++++++++++++++++------------- 7 files changed, 181 insertions(+), 112 deletions(-) diff --git a/CHANGLOG.md b/CHANGLOG.md index 0eeb789..80c6ee7 100644 --- a/CHANGLOG.md +++ b/CHANGLOG.md @@ -1,5 +1,6 @@ # 0.3.0 - added size to backgrounds +- refactored api, background functions are now methods to background rather than gsa # 0.2.1 - 2023-07-27 - fixed missing dependency in scaffolding diff --git a/Cargo.toml b/Cargo.toml index d5af3a5..20db143 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -24,6 +24,7 @@ dunce = "1.0.4" path-slash = "0.2.1" serde = {version = "1.0.181", features = ["derive"]} postcard = {version = "1.0.6", features = ["alloc"]} +#rayon = "1.7.0" [profile.release-dani] inherits = "release" diff --git a/examples/basic/gfx.gif b/examples/basic/gfx.gif index cec71effa79fc4abe3d6800eb7b291197ad102d1..e1d5c1052d1f608eeb0891d63e4995c10dcbac70 100644 GIT binary patch delta 11384 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 F06Rppq09gP diff --git a/examples/hello_world/main.rs b/examples/hello_world/main.rs index 720d612..197fc7d 100644 --- a/examples/hello_world/main.rs +++ b/examples/hello_world/main.rs @@ -4,13 +4,13 @@ use gsa::{run, Gsa}; struct Game {} fn init(gsa: &mut Gsa) -> Game { - gsa.sprites[0].tile = 0; + gsa.sprite[0].tile = 0; gsa.write_string(3, IVec2 { x: 10, y: 10 }, "Hello World, nyaa~"); Game {} } fn update(_game: &mut Game, gsa: &mut Gsa) { - gsa.sprites[0].pos += gsa.input_dir(); + gsa.sprite[0].pos += gsa.input_dir(); } run!(init, update); diff --git a/src/background.rs b/src/background.rs index f8bacb5..ed37da0 100644 --- a/src/background.rs +++ b/src/background.rs @@ -1,4 +1,4 @@ -use crate::BACKGROUND_MAX_SIZE; +use crate::{BACKGROUND_MAX_SIZE, EMPTY_TILE}; use glam::IVec2; /// Tilemap which will be rendered on screen @@ -28,3 +28,19 @@ impl Default for Background { } } } + +impl Background { + /// Clears all tiles of given bg + pub fn clear(&mut self) { + self.fill(EMPTY_TILE); + } + + /// Sets all tiles to val + pub fn fill(&mut self, val: u16) { + for x in 0..BACKGROUND_MAX_SIZE { + for y in 0..BACKGROUND_MAX_SIZE { + self.tiles[x][y] = val; + } + } + } +} diff --git a/src/gsa.rs b/src/gsa.rs index d879895..1112322 100644 --- a/src/gsa.rs +++ b/src/gsa.rs @@ -13,19 +13,22 @@ use glam::IVec2; /// Complete state of GSA pub struct Gsa { /// Sprites available - pub sprites: [Sprite; MAX_SPRITES], + pub sprite: [Sprite; MAX_SPRITES], /// Palette used to draw graphics, initially loaded from gfx.gif pub palette: [Rgb; 256], /// Tilemap layers available, layer 0 in the back, layer 3 in front; layer 3 defaults to half-tile mode - pub bgs: [Background; MAX_BACKGROUNDS], + pub bg: [Background; MAX_BACKGROUNDS], /// Currently selected font /// /// Chosen as half-size tile index, extends 16x16 half tiles in x and y pub font: u16, + /// Target BG for string functions, defaults to layer 3 + pub str_bg: usize, + pub(crate) pressed: Buttons, pub(crate) released: Buttons, pub(crate) down: Buttons, @@ -33,47 +36,33 @@ pub struct Gsa { } impl Gsa { - /// Clears all tiles of given bg - pub fn clear_bg(&mut self, bg: usize) { - self.fill_bg(bg, EMPTY_TILE); - } - /// Resets all bg pub fn reset_bgs(&mut self) { for bg in 0..MAX_BACKGROUNDS { - self.clear_bg(bg); - self.bgs[bg].scroll = IVec2::ZERO; - self.bgs[bg].half_tile = false; + self.bg[bg].clear(); + self.bg[bg].scroll = IVec2::ZERO; + self.bg[bg].half_tile = false; } //todo: document ui layer defaulting to half tile - self.bgs[3].half_tile = true; + self.bg[3].half_tile = true; } /// Clears all sprites pub fn reset_sprites(&mut self) { for sprite in 0..MAX_SPRITES { - self.sprites[sprite].pos = IVec2::ZERO; - self.sprites[sprite].tile = EMPTY_TILE; - self.sprites[sprite].priority = 0; - } - } - - /// Sets all tiles of bg to val - pub fn fill_bg(&mut self, bg: usize, val: u16) { - for x in 0..BACKGROUND_MAX_SIZE { - for y in 0..BACKGROUND_MAX_SIZE { - self.bgs[bg].tiles[x][y] = val; - } + self.sprite[sprite].pos = IVec2::ZERO; + self.sprite[sprite].tile = EMPTY_TILE; + self.sprite[sprite].priority = 0; } } /// Loads tilemap into backgrounds from id pub fn load_map(&mut self, map: u16) { for (i, map) in self.maps.maps[&map].iter().enumerate() { - self.bgs[i].size = map.size; + self.bg[i].size = map.size; for y in 0..map.size.y as usize { for x in 0..map.size.x as usize { - self.bgs[i].tiles[x][y] = map.data[x + y * map.size.x as usize] + self.bg[i].tiles[x][y] = map.data[x + y * map.size.x as usize] } } } @@ -84,9 +73,9 @@ impl Gsa { self.maps.maps.insert( map, [ - Tilemap::from_bg(&self.bgs[0]), - Tilemap::from_bg(&self.bgs[1]), - Tilemap::from_bg(&self.bgs[2]), + Tilemap::from_bg(&self.bg[0]), + Tilemap::from_bg(&self.bg[1]), + Tilemap::from_bg(&self.bg[2]), ], ); } @@ -122,10 +111,20 @@ impl Gsa { } /// Write given string on given map, at given position, with font [Gsa::font] - pub fn write_string(&mut self, map: usize, pos: IVec2, str: &str) { + pub fn write_string(&mut self, pos: IVec2, str: &str) { let str = AsciiStr::from_ascii(str).unwrap(); for (i, ch) in str.into_iter().enumerate() { - self.bgs[map].tiles[pos.x as usize + i][pos.y as usize] = self.get_char_tile(*ch); + self.bg[self.str_bg].tiles[pos.x as usize + i][pos.y as usize] = + self.get_char_tile(*ch); + } + } + + /// Write given string vertically on given map, at given position, with font [Gsa::font] + pub fn write_string_vertical(&mut self, pos: IVec2, str: &str) { + let str = AsciiStr::from_ascii(str).unwrap(); + for (i, ch) in str.into_iter().enumerate() { + self.bg[self.str_bg].tiles[pos.x as usize][pos.y as usize + i] = + self.get_char_tile(*ch); } } diff --git a/src/mapedit.rs b/src/mapedit.rs index ed1fa9b..294988e 100644 --- a/src/mapedit.rs +++ b/src/mapedit.rs @@ -125,13 +125,12 @@ impl Background { } fn draw_input_window(gsa: &mut Gsa, pos: IVec2, caption: &str) { - gsa.bgs[2].draw_frame(pos, IVec2 { x: 7, y: 5 }); - gsa.bgs[2].tiles[pos.x as usize + 3][pos.y as usize + 1] = TILE_INPUT; - gsa.bgs[2].tiles[pos.x as usize + 4][pos.y as usize + 1] = TILE_INPUT; - gsa.bgs[2].tiles[pos.x as usize + 1][pos.y as usize + 3] = TILE_BUT_YES; - gsa.bgs[2].tiles[pos.x as usize + 5][pos.y as usize + 3] = TILE_BUT_NO; + gsa.bg[2].draw_frame(pos, IVec2 { x: 7, y: 5 }); + gsa.bg[2].tiles[pos.x as usize + 3][pos.y as usize + 1] = TILE_INPUT; + gsa.bg[2].tiles[pos.x as usize + 4][pos.y as usize + 1] = TILE_INPUT; + gsa.bg[2].tiles[pos.x as usize + 1][pos.y as usize + 3] = TILE_BUT_YES; + gsa.bg[2].tiles[pos.x as usize + 5][pos.y as usize + 3] = TILE_BUT_NO; gsa.write_string( - 3, IVec2 { x: pos.x * 2 + 2, y: pos.y * 2 + 1, @@ -139,7 +138,6 @@ fn draw_input_window(gsa: &mut Gsa, pos: IVec2, caption: &str) { caption, ); gsa.write_string( - 3, IVec2 { x: pos.x * 2 + 3, y: pos.y * 2 + 3, @@ -150,7 +148,6 @@ fn draw_input_window(gsa: &mut Gsa, pos: IVec2, caption: &str) { fn update_input_window(gsa: &mut Gsa, pos: IVec2, val: u16) { gsa.write_string( - 3, IVec2 { x: pos.x * 2 + 6, y: pos.y * 2 + 3, @@ -159,68 +156,105 @@ fn update_input_window(gsa: &mut Gsa, pos: IVec2, val: u16) { ); } -fn set_state(state: State, gsa1: &mut Gsa, gsa2: &mut Gsa, current_layer: usize, all_layers: bool) { +fn set_state( + state: State, + gsa1: &mut Gsa, + gsa2: &mut Gsa, + current_layer: usize, + all_layers: bool, + current_map: u16, +) { match state { State::Edit => { //update editing layers if all_layers { - gsa1.bgs[0].active = true; - gsa1.bgs[1].active = true; - gsa1.bgs[2].active = true; + gsa1.bg[0].active = true; + gsa1.bg[1].active = true; + gsa1.bg[2].active = true; } else { - gsa1.bgs[0].active = current_layer == 0; - gsa1.bgs[1].active = current_layer == 1; - gsa1.bgs[2].active = current_layer == 2; + gsa1.bg[0].active = current_layer == 0; + gsa1.bg[1].active = current_layer == 1; + gsa1.bg[2].active = current_layer == 2; } - gsa2.clear_bg(2); - gsa2.clear_bg(3); - draw_toolbar(gsa1, gsa2, current_layer, all_layers); + gsa2.bg[2].clear(); + gsa2.bg[2].clear(); + draw_toolbar(gsa1, gsa2, current_layer, all_layers, current_map); - gsa2.bgs[0].active = false; - gsa2.bgs[1].active = false; - gsa1.sprites[SPR_CURSOR].priority = 3; - gsa1.sprites[SPR_CURSOR].tile = TILE_CURSOR; - gsa2.sprites[SPR_CURSOR].tile = EMPTY_TILE; + gsa2.bg[0].active = false; + gsa2.bg[1].active = false; + gsa1.sprite[SPR_CURSOR].priority = 3; + gsa1.sprite[SPR_CURSOR].tile = TILE_CURSOR; + gsa2.sprite[SPR_CURSOR].tile = EMPTY_TILE; } State::SelectTile => { - draw_toolbar(gsa1, gsa2, current_layer, all_layers); - gsa1.bgs[0].active = false; - gsa1.bgs[1].active = false; - gsa1.bgs[2].active = false; - gsa2.bgs[0].active = true; - gsa2.bgs[1].active = true; - gsa1.sprites[SPR_CURSOR].tile = EMPTY_TILE; - gsa2.sprites[SPR_CURSOR].tile = TILE_CURSOR; + draw_toolbar(gsa1, gsa2, current_layer, all_layers, current_map); + gsa1.bg[0].active = false; + gsa1.bg[1].active = false; + gsa1.bg[2].active = false; + gsa2.bg[0].active = true; + gsa2.bg[1].active = true; + gsa1.sprite[SPR_CURSOR].tile = EMPTY_TILE; + gsa2.sprite[SPR_CURSOR].tile = TILE_CURSOR; } State::NewMapDialog => { - gsa1.bgs[0].active = false; - gsa1.bgs[1].active = false; - gsa1.bgs[2].active = false; - gsa2.bgs[0].active = false; - gsa2.bgs[1].active = false; - gsa1.sprites[SPR_CURSOR].tile = EMPTY_TILE; - gsa2.sprites[SPR_CURSOR].tile = EMPTY_TILE; + gsa1.bg[0].active = false; + gsa1.bg[1].active = false; + gsa1.bg[2].active = false; + gsa2.bg[0].active = false; + gsa2.bg[1].active = false; + gsa1.sprite[SPR_CURSOR].tile = EMPTY_TILE; + gsa2.sprite[SPR_CURSOR].tile = EMPTY_TILE; draw_input_window(gsa2, IVec2 { x: 15, y: 9 }, "Create Map"); } } } -fn draw_toolbar(gsa1: &mut Gsa, gsa2: &mut Gsa, current_layer: usize, all_layers: bool) { +fn draw_toolbar( + gsa1: &mut Gsa, + gsa2: &mut Gsa, + current_layer: usize, + all_layers: bool, + current_map: u16, +) { for y in 0..BACKGROUND_MAX_SIZE { - gsa2.bgs[2].tiles[0][y] = 0x7010; + gsa2.bg[2].tiles[0][y] = 0x7010; } - gsa2.bgs[2].tiles[0][BUT_SAVE] = 0x7211; - gsa2.bgs[2].tiles[0][BUT_CREATE] = TILE_BUT_CREATE; - gsa2.bgs[2].tiles[0][BUT_EXIT] = 0x7212; + gsa2.bg[2].tiles[0][BUT_SAVE] = 0x7211; + gsa2.bg[2].tiles[0][BUT_CREATE] = TILE_BUT_CREATE; + gsa2.bg[2].tiles[0][BUT_EXIT] = 0x7212; //layer buttons - gsa2.bgs[2].tiles[0][BUT_LAYER1] = if current_layer == 0 { 0x7111 } else { 0x7011 }; - gsa2.bgs[2].tiles[0][BUT_LAYER2] = if current_layer == 1 { 0x7112 } else { 0x7012 }; - gsa2.bgs[2].tiles[0][BUT_LAYER3] = if current_layer == 2 { 0x7113 } else { 0x7013 }; - gsa2.bgs[2].tiles[0][BUT_LAYERS] = if all_layers { 0x7114 } else { 0x7014 }; + gsa2.bg[2].tiles[0][BUT_LAYER1] = if current_layer == 0 { 0x7111 } else { 0x7011 }; + gsa2.bg[2].tiles[0][BUT_LAYER2] = if current_layer == 1 { 0x7112 } else { 0x7012 }; + gsa2.bg[2].tiles[0][BUT_LAYER3] = if current_layer == 2 { 0x7113 } else { 0x7013 }; + gsa2.bg[2].tiles[0][BUT_LAYERS] = if all_layers { 0x7114 } else { 0x7014 }; - gsa2.bgs[2].size = IVec2 { x: 120, y: 68 }; //enough to cover 4k monitors? <_< - gsa2.bgs[3].size = IVec2 { x: 240, y: 136 }; + gsa2.bg[2].size = IVec2 { x: 120, y: 68 }; //enough to cover 4k monitors? <_< + gsa2.bg[3].size = IVec2 { x: 240, y: 136 }; + + gsa2.write_string_vertical( + IVec2 { + x: 0, + y: BUT_EXIT as i32 * 2 + 3, + }, + &format!("MAP-{:04X}", current_map), + ); + + gsa2.write_string_vertical( + IVec2 { + x: 0, + y: BUT_EXIT as i32 * 2 + 12, + }, + &format!("W-{}", gsa1.bg[0].size.x), + ); + + gsa2.write_string_vertical( + IVec2 { + x: 1, + y: BUT_EXIT as i32 * 2 + 12, + }, + &format!("H-{}", gsa1.bg[0].size.y), + ); } pub(crate) fn run_mapedit() { @@ -237,14 +271,15 @@ pub(crate) fn run_mapedit() { }; let mut gsa1 = Gsa { - sprites: [Sprite::default(); MAX_SPRITES], + sprite: [Sprite::default(); MAX_SPRITES], palette, - bgs: Default::default(), + bg: Default::default(), font: FONT_BOLD, pressed: 0, released: 0, down: 0, maps, + str_bg: 3, }; gsa1.reset_bgs(); @@ -255,26 +290,27 @@ pub(crate) fn run_mapedit() { } for i in 0..3 { - gsa1.bgs[i].scroll = IVec2 { + gsa1.bg[i].scroll = IVec2 { x: -16 - 32, y: -32, }; } let mut gsa2 = Gsa { - sprites: [Sprite::default(); MAX_SPRITES], + sprite: [Sprite::default(); MAX_SPRITES], palette, - bgs: Default::default(), + bg: Default::default(), font: FONT_BOLD, pressed: 0, released: 0, down: 0, maps: Maps::default(), + str_bg: 3, }; gsa2.reset_bgs(); gsa2.reset_sprites(); for i in 0..2 { - gsa2.bgs[i].scroll = IVec2 { + gsa2.bg[i].scroll = IVec2 { x: -16 - 32, y: -32, }; @@ -282,7 +318,7 @@ pub(crate) fn run_mapedit() { for y in 0..TILESET_SIZE { for x in 0..TILESET_SIZE { - gsa2.bgs[0].tiles[x][y] = (x + (y << 8)) as u16; + gsa2.bg[0].tiles[x][y] = (x + (y << 8)) as u16; } } //draw_input_window(&mut gsa2, IVec2 { x: 5, y: 3 }, "Create Map"); @@ -308,13 +344,20 @@ pub(crate) fn run_mapedit() { let mut middle_down = false; let mut right_down = false; let mut selected_tile = IVec2::ZERO; - gsa2.bgs[1].tiles[0][0] = TILE_MARKER; + gsa2.bg[1].tiles[0][0] = TILE_MARKER; let mut current_layer = 0usize; let mut all_layers = true; let mut state = State::Edit; let mut input_buf = 0u16; let mut current_map = 0; - set_state(State::Edit, &mut gsa1, &mut gsa2, current_layer, all_layers); + set_state( + State::Edit, + &mut gsa1, + &mut gsa2, + current_layer, + all_layers, + current_map, + ); event_loop.run(move |event, _, control_flow| { let mouse_pos = &mut mouse_pos; @@ -347,6 +390,7 @@ pub(crate) fn run_mapedit() { &mut gsa2, *current_layer, *all_layers, + *current_map, ); } else { *state = State::Edit; @@ -356,6 +400,7 @@ pub(crate) fn run_mapedit() { &mut gsa2, *current_layer, *all_layers, + *current_map, ); } } @@ -409,6 +454,7 @@ pub(crate) fn run_mapedit() { &mut gsa2, *current_layer, *all_layers, + *current_map, ); update_input_window( &mut gsa2, @@ -424,6 +470,7 @@ pub(crate) fn run_mapedit() { &mut gsa2, *current_layer, *all_layers, + *current_map, ); } BUT_LAYER2 => { @@ -434,6 +481,7 @@ pub(crate) fn run_mapedit() { &mut gsa2, *current_layer, *all_layers, + *current_map, ); } BUT_LAYER3 => { @@ -444,6 +492,7 @@ pub(crate) fn run_mapedit() { &mut gsa2, *current_layer, *all_layers, + *current_map, ); } BUT_LAYERS => { @@ -454,6 +503,7 @@ pub(crate) fn run_mapedit() { &mut gsa2, *current_layer, *all_layers, + *current_map, ); } BUT_EXIT => { @@ -484,6 +534,7 @@ pub(crate) fn run_mapedit() { &mut gsa2, *current_layer, *all_layers, + *current_map, ); } else if mouse_pos.x / 16 == 20 { println!("no"); @@ -494,6 +545,7 @@ pub(crate) fn run_mapedit() { &mut gsa2, *current_layer, *all_layers, + *current_map, ); } } @@ -531,14 +583,14 @@ pub(crate) fn run_mapedit() { match *state { State::Edit => { // normal mode - gsa1.bgs[0].scroll -= delta; - gsa1.bgs[1].scroll -= delta; - gsa1.bgs[2].scroll -= delta; + gsa1.bg[0].scroll -= delta; + gsa1.bg[1].scroll -= delta; + gsa1.bg[2].scroll -= delta; } State::SelectTile => { // tile select mode - gsa2.bgs[0].scroll -= delta; - gsa2.bgs[1].scroll -= delta; + gsa2.bg[0].scroll -= delta; + gsa2.bg[1].scroll -= delta; //gsa2.bgs[2].scroll -= delta; } _ => {} @@ -546,17 +598,17 @@ pub(crate) fn run_mapedit() { } *mouse_pos = new_pos; *tile_pos = IVec2 { - x: (new_pos.x + gsa1.bgs[0].scroll.x).div_euclid(TILE_SIZE as i32), - y: (new_pos.y + gsa1.bgs[0].scroll.y).div_euclid(TILE_SIZE as i32), + x: (new_pos.x + gsa1.bg[0].scroll.x).div_euclid(TILE_SIZE as i32), + y: (new_pos.y + gsa1.bg[0].scroll.y).div_euclid(TILE_SIZE as i32), }; *tile_pos2 = IVec2 { - x: (new_pos.x + gsa2.bgs[0].scroll.x).div_euclid(TILE_SIZE as i32), - y: (new_pos.y + gsa2.bgs[0].scroll.y).div_euclid(TILE_SIZE as i32), + x: (new_pos.x + gsa2.bg[0].scroll.x).div_euclid(TILE_SIZE as i32), + y: (new_pos.y + gsa2.bg[0].scroll.y).div_euclid(TILE_SIZE as i32), }; - let cursor_pos = *tile_pos * TILE_SIZE as i32 - gsa1.bgs[0].scroll; - let cursor_pos2 = *tile_pos2 * TILE_SIZE as i32 - gsa2.bgs[0].scroll; - gsa1.sprites[SPR_CURSOR].pos = cursor_pos; - gsa2.sprites[SPR_CURSOR].pos = cursor_pos2; + let cursor_pos = *tile_pos * TILE_SIZE as i32 - gsa1.bg[0].scroll; + let cursor_pos2 = *tile_pos2 * TILE_SIZE as i32 - gsa2.bg[0].scroll; + gsa1.sprite[SPR_CURSOR].pos = cursor_pos; + gsa2.sprite[SPR_CURSOR].pos = cursor_pos2; } _ => {} }, @@ -571,7 +623,7 @@ pub(crate) fn run_mapedit() { && tile_pos.y < BACKGROUND_MAX_SIZE as i32 { let tile = (selected_tile.x + (selected_tile.y << 8)) as u16; - gsa1.bgs[*current_layer].tiles[tile_pos.x as usize] + gsa1.bg[*current_layer].tiles[tile_pos.x as usize] [tile_pos.y as usize] = tile; } } else if *right_down { @@ -580,7 +632,7 @@ pub(crate) fn run_mapedit() { && tile_pos.x < BACKGROUND_MAX_SIZE as i32 && tile_pos.y < BACKGROUND_MAX_SIZE as i32 { - gsa1.bgs[*current_layer].tiles[tile_pos.x as usize] + gsa1.bg[*current_layer].tiles[tile_pos.x as usize] [tile_pos.y as usize] = EMPTY_TILE; } } @@ -592,10 +644,10 @@ pub(crate) fn run_mapedit() { && tile_pos2.x < BACKGROUND_MAX_SIZE as i32 && tile_pos2.y < BACKGROUND_MAX_SIZE as i32 { - gsa2.bgs[1].tiles[selected_tile.x as usize] + gsa2.bg[1].tiles[selected_tile.x as usize] [selected_tile.y as usize] = EMPTY_TILE; *selected_tile = *tile_pos2; - gsa2.bgs[1].tiles[selected_tile.x as usize] + gsa2.bg[1].tiles[selected_tile.x as usize] [selected_tile.y as usize] = TILE_MARKER; } } @@ -626,10 +678,10 @@ pub(crate) fn run_mapedit() { }; match *state { State::Edit => { - let xs = -gsa1.bgs[0].scroll.x - 1; - let ys = -gsa1.bgs[0].scroll.y - 1; - let xe = xs + gsa1.bgs[0].size.x * TILE_SIZE as i32 + 1; - let ye = ys + gsa1.bgs[0].size.y * TILE_SIZE as i32 + 1; + let xs = -gsa1.bg[0].scroll.x - 1; + let ys = -gsa1.bg[0].scroll.y - 1; + let xe = xs + gsa1.bg[0].size.x * TILE_SIZE as i32 + 1; + let ye = ys + gsa1.bg[0].size.y * TILE_SIZE as i32 + 1; if xs >= 16 && xs < screen_size.x { let starty = (ys + 1).max(0); let len = ye.min(screen_size.y) - starty;