millfork/examples/crossplatform/fire.mfk

124 lines
2.4 KiB
Plaintext

import random
array reverse_palette[256] align(256)
#if CBM
const byte COLUMN_COUNT = 40
const byte ROW_COUNT = 25
array palette align(fast) = [black, red, orange, yellow, white]
void cls() {
byte i
for i,0,paralleluntil,250 {
screen[000+i] = 160
screen[250+i] = 160
screen[500+i] = 160
screen[750+i] = 160
}
for i,0,paralleluntil,250 {
colors[000+i] = black
colors[250+i] = black
colors[500+i] = black
colors[750+i] = black
}
}
#endif
#if CBM_64
array colors[1000] @$d800
array screen[1000] @$400
#elseif CBM_264
array colors[1000] @$800
array screen[1000] @$c00
#endif
#if ZX_SPECTRUM
#pragma zilog_syntax
array palette align(fast) = [black*9, red*9, red*9+$40, yellow*9+$40, white*9+$40]
array colors[$300] @$5800
const byte COLUMN_COUNT = 32
const byte ROW_COUNT = 24
void cls() {
pointer p
for p,$4000,paralleluntil,$5800 {
p[0] = $f7
}
for p,$5800,paralleluntil,$5b00 {
p[0] = black*9
}
}
#endif
void build_reverse_palette () {
byte i
#if CBM_64
byte j
for i,0,paralleluntil,palette.length {
for j,0,parallelto,$f {
reverse_palette[palette[i] | (j<<4)] = i
}
}
#else
for i,0,paralleluntil,palette.length {
reverse_palette[palette[i]] = i
}
#endif
}
void main() {
set_border(black)
init_rand_seed()
build_reverse_palette()
cls()
byte i
const word LAST_ROW_START = COLUMN_COUNT * word(ROW_COUNT-1)
for i,0,paralleluntil,COLUMN_COUNT {
colors[LAST_ROW_START+i] = palette[palette.length - 1]
}
while true {
wait_frame()
fire()
}
}
void wait_frame() {
#if CBM_64
while vic_raster != $ff {}
#elseif CBM_264
while ted_raster_y != $ff {}
#elseif ZX_SPECTRUM
asm { halt }
#else
// TODO
#endif
}
void fire() {
byte noise
byte row
byte column
pointer p
byte heat
byte entropy
entropy = 0
p = colors.addr
for row,0,paralleluntil,ROW_COUNT-1 {
for column,0,paralleluntil,COLUMN_COUNT {
if entropy == 0 {
noise = rand()
entropy = 8
}
heat = reverse_palette[p[column+COLUMN_COUNT]]
if noise & 1 != 0 {
if heat != 0 { heat -= 1 }
}
noise >>= 1
entropy -= 1
p[column] = palette[heat]
}
p += COLUMN_COUNT
}
}