9 Commits

Author SHA1 Message Date
873722b1ac implement emergency exit hook
awakener itself is not implemented but the code to get there is there.
the awakener itself needs the entire text zonk engine first
2024-02-09 23:06:28 -08:00
db7ce90182 consent screen prototype 2024-02-09 22:44:07 -08:00
ebf8c3921e fade out title screen
also reduce min AO splash time from 1sec to 0.5sec
2024-02-09 21:20:08 -08:00
033a71d767 "adults only" splash 2024-02-09 21:11:11 -08:00
ff60db72ad breath signal layer
might want to make it more subtle later but I'm zonking myself with it
for now. can just add a fuzz stage to it if I want. these colors are not
final, but I think I do not want to do anything clever with bitplane
interference at this time -- this effect is good as-is.
2024-02-09 19:50:54 -08:00
ef59dc3f6a way trippier params; skip dolphin game while testing zonk bg 2024-02-09 00:30:45 -08:00
d5647a0328 fix mass and off-by-one errors 2024-02-09 00:30:19 -08:00
a659679b6b also clear_alt_pal_bits in (demo) zonk squencer 2024-02-09 00:19:05 -08:00
cc4b6bffd3 clear_alt_pal_bits to reset what sea setup does 2024-02-09 00:14:31 -08:00

View File

@ -244,16 +244,43 @@ function _init()
-- complex fill API mode
poke(0x5f34, 1)
font_dogica()
mainview = newtitle()
awakener_hold_frames = 0
mainview = ao_splash.new()
end
function _update60()
if awakener_armed then
if btn() & 0x30 > 0 then
awakener_hold_frames += 1
else
awakener_hold_frames = 0
end
if awakener_hold_frames == 90 then
exit_dither = ditherer.new{di=1}
awakener_armed = false
end
end
if exit_dither and exit_dither:update() then
exit_dither = nil
awakener_hold_frames=0
mainview = fast_awakener.new()
end
mainview:update()
end
function _draw()
mainview:draw()
if awakener_hold_frames >= 30 then
local gpx=(awakener_hold_frames-30) * 2 + 7
rectfill(0,0,gpx,9,4)
rectfill(gpx+1,0,128,9,5)
font_default()
print("keep holding for awakener", 1, 1, 7)
font_special()
end
if exit_dither then
exit_dither:draw()
end
end
function font_dogica()
@ -270,6 +297,10 @@ function font_default()
poke(0x5f58, 0x80)
end
function font_special()
poke(0x5f58, 0x81)
end
-->8
-- text rendering
@ -396,7 +427,8 @@ mknew(ditherer, function(x)
end)
function ditherer:update()
self.i += self.di
if (self.i > 0 and self.di < 0) self.i += self.di
if (self.i < #self.pattern + 1 and self.di > 0) self.i += self.di
return self.i < 0 or self.i >= #self.pattern + 1
end
@ -417,8 +449,8 @@ mknew(fuzzy, function(x)
local p = (x.p or fuzzy.p) & 0xffff
x.mass = 0
while p ~= 0 do
x.mass += p & 0x8000
p = p << 1
x.mass += p & 1
p = (p >>> 1) & 0xffff
end
end)
@ -427,7 +459,7 @@ function fuzzy:update()
if (self.n < self.interval) return
self.n = 0
for i=1,self.tries do
local b = 1 << rnd(15)
local b = 1 << rnd(16)
if b & self.p == 0 then
if i == self.tries or not self.weight or self.mass <= self.weight then
self.mass += 1
@ -482,13 +514,188 @@ function fuzzy_stripey:draw()
end
end
--@musurca & @felice
function cminskycirc(r,c)
local j,k,rat=r,0,1/r
poke(0x5f25,c) --set color
for i=1,r*0.785 do
k-=rat*j
j+=rat*k
pset(63.5+j,63.5+k)
pset(63.5+j,63.5-k)
pset(63.5-j,63.5+k)
pset(63.5-j,63.5-k)
pset(63.5+k,63.5+j)
pset(63.5+k,63.5-j)
pset(63.5-k,63.5+j)
pset(63.5-k,63.5-j)
end
pset(63.5,63.5-r)
pset(63.5,63.5+r)
pset(63.5-r,63.5)
pset(63.5+r,63.5)
end
breather = {
colors = {1,2,4,2,1},
sep = 5,
speed=240,
f=0,
}
mknew(breather)
function breather:update()
if (self.freeze) return
local f = self.f + 1
if (not self.on) f = 0
if (f >= self.speed) f = -self.speed
if f == 0 and self.nextspeed then
self.speed = self.nextspeed
self.nextspeed = nil
end
self.f = f
end
function easeinout(t)
if(t<.5) then
return t*t*t*4
else
t-=1
return 1-t*t*t*-4
end
end
function breather:draw()
fillp(0)
local cols, f, spd, sep = self.colors, self.f, self.speed, self.sep
local stall = sep * (#cols - 1)
local cap = spd-stall
if (f >= 0) f += stall
for i,c in ipairs(cols) do
local ef = f - (i-1)*sep
ef = abs(ef) - stall
if ef <= cap and ef > 0 then
cminskycirc(easeinout(ef/cap)<<6,c)
end
end
end
function breather:starting_reverse()
return self.f + self.speed < self.sep * #self.colors
end
-->8
-- awakener
fast_awakener = {}
mknew(fast_awakener)
function fast_awakener:update()
--todo: implement
end
function fast_awakener:draw()
cls()
pal()
clear_alt_pal_bits()
font_default()
print("placeholder", 45, 61, 8)
end
-->8
-- consent screens
ao_splash = {
fwait = 180,
}
mknew(ao_splash, function(self)
self.c = breather.new{
colors={7,15,14,8,2},
sep=3,
f=15,
on=true,
}
font_dogica()
end)
function ao_splash:update()
if self.c.f < self.c.speed/2.5 then
self.c:update()
return
end
self.fwait -= 1
if (self.fwait < ao_splash.fwait-30 and (btnp() & 0xf > 0) and self.fwait > 0) self.fwait = 0
if self.fwait == 0 then
self.d = ditherer.new{di=1}
end
if (self.d) self.d:update()
if self.fwait <= -32 then
-- TODO: consent screen
mainview=consent_splash.new()
mainview:update()
end
end
function ao_splash:draw()
cls()
self.c:draw()
if self.fwait < ao_splash.fwait then
print("18+", 55, 60, 7)
print("aDULTS ONLY", 35, 90, 15)
end
if (self.d) self.d:draw()
end
consent_splash = {
f = 0,
}
mknew(consent_splash, function(self)
self.d = ditherer.new{
di=-1
}
awakener_armed = true
awakener_hold_frames = 0
end)
function consent_splash:update()
if (self.f < 0x7fff) self.f += 1
if (btnp(1) and self.f > 150) self.d.di = 1
if self.d:update() and self.d.di > 0 then
mainview=newtitle()
mainview:update()
end
end
function consent_splash:draw()
cls()
font_special()
print("\^w\^twarning", 20, 2, 10)
font_default()
cursor(1, 25)
color(6)
print("this game will \fchypnotize\f6 you.")
if (self.f < 45) return
print("")
print("hypnotic suggstions include:")
print("relaxation, trance, obedience,")
print("loss of volition, euphoria, joy,")
print("amnesia, identity loss, and the")
print("experience of \fetranformation")
print("into a pooltoy orca.\f6")
if (self.f < 90) return
print("")
print("an awakener that removes all")
print("suggestions is available at")
print("\faany time:\f6 hold ❎ or 🅾️.")
print("gameplay uses only arrows.")
if(self.f < 300) return
print("")
print("")
print(" consent and begin: \f7➡")
self.d:draw()
end
-->8
-- title screen
@ -521,8 +728,8 @@ function title_screen:draw()
end
function title_screen:update()
self.d:update()
if (btnp(1)) start_game()
if (btnp(1)) self.d.di = 1
if(self.d:update() and self.d.di > 0) start_game()
end
-->8
-- dolphin sprite renderer
@ -1017,17 +1224,21 @@ end
function start_game()
seq = sequencer.new{
{
f = arcade_level.new,
params = {{
max_score=2,
}}
},
-- {
-- f = arcade_level.new,
-- params = {{
-- max_score=2,
-- }}
-- },
{
f = function()
pal()
clear_alt_pal_bits()
return view.of{bg.new{c=6}, fuzzy_stripey.new{interval=7, colors={12, 7, 14}, weight=8}}
return view.of{
bg.new(),
fuzzy_stripey.new{interval=7, tries=5},
breather.new{on=true},
}
end,
},
}