mirror of
https://github.com/KarolS/millfork.git
synced 2024-09-11 02:55:10 +00:00
124 lines
2.4 KiB
Plaintext
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
|
|
}
|
|
}
|