mirror of
https://github.com/imjasonh/nescript
synced 2026-07-07 00:22:50 +00:00
113 lines
2 KiB
Text
113 lines
2 KiB
Text
|
|
// 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
|