1
0
Fork 0
mirror of https://github.com/imjasonh/nescript synced 2026-07-07 00:22:50 +00:00
nescript/examples/mmc1_banked.ne

113 lines
2 KiB
Text
Raw Normal View History

// MMC1 Banked — demonstrates M5 mapper and bank features.
//
// Shows: MMC1 mapper selection, bank declarations,
// vertical mirroring, software multiply.
//
// Build: cargo run -- build examples/mmc1_banked.ne
game "Banked Game" {
mapper: MMC1
mirroring: vertical
}
// Declare PRG banks for organizing code/data
bank Level1Data: prg
bank Level2Data: prg
bank TileBank: chr
const GRAVITY: u8 = 1
const JUMP_VEL: u8 = 5
const GROUND_Y: u8 = 200
var px: u8 = 64
var py: u8 = 200
var vy: u8 = 0
var airborne: u8 = 0
var level: u8 = 1
// Multiplication via the language (uses software multiply runtime)
fun scale_speed(base: u8, factor: u8) -> u8 {
return base * factor
}
fun apply_gravity() {
if airborne == 1 {
vy += GRAVITY
py += vy
if py >= GROUND_Y {
py = GROUND_Y
airborne = 0
vy = 0
}
}
}
state Level1 {
on enter {
px = 64
py = GROUND_Y
level = 1
}
on frame {
// Horizontal movement with scaled speed
if button.right {
var spd: u8 = scale_speed(2, level)
px += spd
}
if button.left {
if px > 2 {
px -= 2
}
}
// Jump
if button.a {
if airborne == 0 {
airborne = 1
vy = JUMP_VEL
}
}
apply_gravity()
// Advance to level 2
if px > 230 {
transition Level2
}
draw Player at: (px, py)
}
}
state Level2 {
on enter {
px = 10
py = GROUND_Y
level = 2
}
on frame {
if button.right { px += 3 }
if button.left { px -= 3 }
if button.a {
if airborne == 0 {
airborne = 1
vy = JUMP_VEL
}
}
apply_gravity()
// Loop back
if button.select {
transition Level1
}
draw Player at: (px, py)
}
}
start Level1