Internal Viewport 270p (480x270)
This commit is contained in:
parent
6a681ba4bc
commit
1ab2898f5e
@ -26,6 +26,13 @@ use std::path::PathBuf;
|
||||
|
||||
const STRESS_GLYPH_ASSET_ID: AssetId = 100;
|
||||
const STRESS_SCENE_ASSET_ID: AssetId = 1;
|
||||
const STRESS_VIEWPORT_W: i32 = 480;
|
||||
const STRESS_VIEWPORT_H: i32 = 270;
|
||||
const STRESS_SPRITE_COLS: i32 = 48;
|
||||
const STRESS_SPRITE_ROWS: i32 = 24;
|
||||
const STRESS_SPRITE_SPACING_PX: i32 = 10;
|
||||
const STRESS_SCENE_TILE_W: usize = 96;
|
||||
const STRESS_SCENE_TILE_H: usize = 64;
|
||||
|
||||
fn asm(s: &str) -> Vec<u8> {
|
||||
assemble(s).expect("assemble")
|
||||
@ -141,34 +148,38 @@ fn heavy_load(rom: &mut Vec<u8>) {
|
||||
|
||||
rom.extend(asm("PUSH_I32 0\nHOSTCALL 0"));
|
||||
|
||||
rom.extend(asm(
|
||||
"GET_GLOBAL 0\nPUSH_I32 2\nMUL\nPUSH_I32 192\nMOD\nGET_GLOBAL 0\nPUSH_I32 76\nMOD\nHOSTCALL 4",
|
||||
));
|
||||
let scene_width_px = (STRESS_SCENE_TILE_W * 8) as i32;
|
||||
let scene_height_px = (STRESS_SCENE_TILE_H * 8) as i32;
|
||||
let camera_x_span = scene_width_px - STRESS_VIEWPORT_W;
|
||||
let camera_y_span = scene_height_px - STRESS_VIEWPORT_H;
|
||||
rom.extend(asm(&format!(
|
||||
"GET_GLOBAL 0\nPUSH_I32 2\nMUL\nPUSH_I32 {camera_x_span}\nMOD\nGET_GLOBAL 0\nPUSH_I32 {camera_y_span}\nMOD\nHOSTCALL 4"
|
||||
)));
|
||||
|
||||
rom.extend(asm("PUSH_I32 0\nSET_LOCAL 0"));
|
||||
let row_loop_start = rom.len() as u32;
|
||||
rom.extend(asm("GET_LOCAL 0\nPUSH_I32 16\nLT"));
|
||||
rom.extend(asm(&format!("GET_LOCAL 0\nPUSH_I32 {STRESS_SPRITE_ROWS}\nLT")));
|
||||
let jif_row_end_offset = rom.len() + 2;
|
||||
rom.extend(asm("JMP_IF_FALSE 0"));
|
||||
|
||||
rom.extend(asm("PUSH_I32 0\nSET_LOCAL 1"));
|
||||
let col_loop_start = rom.len() as u32;
|
||||
rom.extend(asm("GET_LOCAL 1\nPUSH_I32 32\nLT"));
|
||||
rom.extend(asm(&format!("GET_LOCAL 1\nPUSH_I32 {STRESS_SPRITE_COLS}\nLT")));
|
||||
let jif_col_end_offset = rom.len() + 2;
|
||||
rom.extend(asm("JMP_IF_FALSE 0"));
|
||||
|
||||
rom.extend(asm(
|
||||
rom.extend(asm(&format!(
|
||||
"PUSH_I32 0\n\
|
||||
GET_LOCAL 0\nPUSH_I32 32\nMUL\nGET_LOCAL 1\nADD\nGET_GLOBAL 0\nADD\nPUSH_I32 15\nMOD\nPUSH_I32 1\nADD\n\
|
||||
GET_LOCAL 1\nPUSH_I32 10\nMUL\nGET_GLOBAL 0\nPUSH_I32 10\nMOD\nADD\nPUSH_I32 320\nMOD\n\
|
||||
GET_LOCAL 0\nPUSH_I32 10\nMUL\nGET_GLOBAL 0\nPUSH_I32 2\nMUL\nPUSH_I32 10\nMOD\nADD\nPUSH_I32 180\nMOD\n\
|
||||
GET_LOCAL 0\nPUSH_I32 {STRESS_SPRITE_COLS}\nMUL\nGET_LOCAL 1\nADD\nGET_GLOBAL 0\nADD\nPUSH_I32 15\nMOD\nPUSH_I32 1\nADD\n\
|
||||
GET_LOCAL 1\nPUSH_I32 {STRESS_SPRITE_SPACING_PX}\nMUL\nGET_GLOBAL 0\nPUSH_I32 10\nMOD\nADD\nPUSH_I32 {STRESS_VIEWPORT_W}\nMOD\n\
|
||||
GET_LOCAL 0\nPUSH_I32 {STRESS_SPRITE_SPACING_PX}\nMUL\nGET_GLOBAL 0\nPUSH_I32 2\nMUL\nPUSH_I32 10\nMOD\nADD\nPUSH_I32 {STRESS_VIEWPORT_H}\nMOD\n\
|
||||
GET_LOCAL 0\nGET_LOCAL 1\nADD\nGET_GLOBAL 0\nADD\nPUSH_I32 4\nMOD\n\
|
||||
PUSH_I32 0\n\
|
||||
GET_LOCAL 1\nGET_GLOBAL 0\nADD\nPUSH_I32 1\nBIT_AND\nPUSH_I32 0\nNEQ\n\
|
||||
GET_LOCAL 0\nGET_GLOBAL 0\nADD\nPUSH_I32 1\nBIT_AND\nPUSH_I32 0\nNEQ\n\
|
||||
GET_LOCAL 0\nGET_LOCAL 1\nADD\nPUSH_I32 4\nMOD\n\
|
||||
HOSTCALL 5\nPOP_N 1",
|
||||
));
|
||||
HOSTCALL 5\nPOP_N 1"
|
||||
)));
|
||||
|
||||
rom.extend(asm("GET_LOCAL 1\nPUSH_I32 1\nADD\nSET_LOCAL 1"));
|
||||
let jmp_col_loop_offset = rom.len() + 2;
|
||||
@ -180,23 +191,23 @@ fn heavy_load(rom: &mut Vec<u8>) {
|
||||
rom.extend(asm("JMP 0"));
|
||||
let row_loop_end = rom.len() as u32;
|
||||
|
||||
rom.extend(asm("GET_GLOBAL 0\nPUSH_I32 3\nMUL\nPUSH_I32 220\nMOD\n\
|
||||
rom.extend(asm("GET_GLOBAL 0\nPUSH_I32 3\nMUL\nPUSH_I32 380\nMOD\n\
|
||||
PUSH_I32 8\n\
|
||||
PUSH_CONST 0\n\
|
||||
GET_GLOBAL 0\nPUSH_I32 2047\nMUL\nPUSH_I32 65535\nBIT_AND\n\
|
||||
HOSTCALL 1"));
|
||||
rom.extend(asm("PUSH_I32 12\n\
|
||||
GET_GLOBAL 0\nPUSH_I32 2\nMUL\nPUSH_I32 120\nMOD\nPUSH_I32 24\nADD\n\
|
||||
rom.extend(asm("PUSH_I32 16\n\
|
||||
GET_GLOBAL 0\nPUSH_I32 2\nMUL\nPUSH_I32 186\nMOD\nPUSH_I32 32\nADD\n\
|
||||
PUSH_CONST 1\n\
|
||||
GET_GLOBAL 0\nPUSH_I32 4093\nMUL\nPUSH_I32 65535\nBIT_AND\n\
|
||||
HOSTCALL 1"));
|
||||
rom.extend(asm("PUSH_I32 220\n\
|
||||
GET_GLOBAL 0\nPUSH_I32 5\nMUL\nPUSH_I32 140\nMOD\n\
|
||||
rom.extend(asm("PUSH_I32 336\n\
|
||||
GET_GLOBAL 0\nPUSH_I32 5\nMUL\nPUSH_I32 194\nMOD\n\
|
||||
PUSH_CONST 2\n\
|
||||
GET_GLOBAL 0\nPUSH_I32 1237\nMUL\nPUSH_I32 65535\nBIT_AND\n\
|
||||
HOSTCALL 1"));
|
||||
rom.extend(asm("GET_GLOBAL 0\nPUSH_I32 4\nMUL\nPUSH_I32 180\nMOD\nPUSH_I32 80\nADD\n\
|
||||
GET_GLOBAL 0\nPUSH_I32 3\nMUL\nPUSH_I32 90\nMOD\nPUSH_I32 70\nADD\n\
|
||||
rom.extend(asm("GET_GLOBAL 0\nPUSH_I32 4\nMUL\nPUSH_I32 240\nMOD\nPUSH_I32 112\nADD\n\
|
||||
GET_GLOBAL 0\nPUSH_I32 3\nMUL\nPUSH_I32 120\nMOD\nPUSH_I32 88\nADD\n\
|
||||
PUSH_CONST 3\n\
|
||||
GET_GLOBAL 0\nPUSH_I32 3001\nMUL\nPUSH_I32 65535\nBIT_AND\n\
|
||||
HOSTCALL 1"));
|
||||
@ -326,19 +337,23 @@ fn build_scene_bank() -> SceneBank {
|
||||
flip_x: false,
|
||||
flip_y: false,
|
||||
};
|
||||
64 * 32
|
||||
STRESS_SCENE_TILE_W * STRESS_SCENE_TILE_H
|
||||
];
|
||||
|
||||
for step in 0..8 {
|
||||
let x = 4 + step * 7 + layer_index * 2;
|
||||
let y = 2 + step * 3 + layer_index * 2;
|
||||
let index = y * 64 + x;
|
||||
tiles[index] = Tile {
|
||||
active: true,
|
||||
glyph: Glyph { glyph_id: 0, palette_id: layer_index as u8 + 1 },
|
||||
flip_x: false,
|
||||
flip_y: false,
|
||||
};
|
||||
for y in 0..STRESS_SCENE_TILE_H {
|
||||
for x in 0..STRESS_SCENE_TILE_W {
|
||||
let diagonal = (x + layer_index * 2) % 11 == (y * 2) % 11;
|
||||
let stripe = (x / 6 + y / 5 + layer_index) % 5 == 0;
|
||||
if diagonal || stripe {
|
||||
let index = y * STRESS_SCENE_TILE_W + x;
|
||||
tiles[index] = Tile {
|
||||
active: true,
|
||||
glyph: Glyph { glyph_id: 0, palette_id: layer_index as u8 + 1 },
|
||||
flip_x: false,
|
||||
flip_y: false,
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
SceneLayer {
|
||||
@ -351,15 +366,19 @@ fn build_scene_bank() -> SceneBank {
|
||||
2 => ParallaxFactor { x: 0.5, y: 0.5 },
|
||||
_ => ParallaxFactor { x: 0.25, y: 0.25 },
|
||||
},
|
||||
tilemap: TileMap { width: 64, height: 32, tiles },
|
||||
tilemap: TileMap {
|
||||
width: STRESS_SCENE_TILE_W,
|
||||
height: STRESS_SCENE_TILE_H,
|
||||
tiles,
|
||||
},
|
||||
}
|
||||
});
|
||||
|
||||
// Keep the farthest layer a bit sparser so the diagonal remains visually readable.
|
||||
for step in 0..4 {
|
||||
let x = 10 + step * 12;
|
||||
let y = 4 + step * 5;
|
||||
let index = y * 64 + x;
|
||||
for step in 0..12 {
|
||||
let x = 10 + step * 7;
|
||||
let y = 4 + step * 3;
|
||||
let index = y * STRESS_SCENE_TILE_W + x;
|
||||
layers[3].tilemap.tiles[index].active = false;
|
||||
}
|
||||
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user