pico-8 cartridge // http://www.pico-8.com version 41 __lua__ -- vacation (18+) -- kistaro windrider and ossie -------------------------------- -- copyright (C) 2024 kistaro windrider -- -- this program is free software; you can redistribute it and/or modify -- it under the terms of the gnu general public license as published by -- the free software foundation; either version 2 of the license, or -- (at your option) any later version. -- -- this program is distributed in the hope that it will be useful, -- but without any warranty; without even the implied warranty of -- merchantability or fitness for a particular purpose. see the -- gnu general public license for more details. -------------------------------- -- monogram font by vincius menezio -- https://datagoblin.itch.io/monogram -- tab 0: library -- tab 1: p8 entry points -- tabs 2...F: actual code function csv(s) local ret = split(s, "\n") for i, v in ipairs(ret) do ret[i] = type(v) == "string" and split(v) or { v } end return ret end function hz(n) return t()*2*n&1~=0 end function mknew(tt, more) local mt, oldnew={__index=tt},tt.new tt.new=function(ret) if (not ret) ret = {} if (more) more(ret) if (oldnew) oldnew(ret) setmetatable(ret, mt) return ret end end event_list = {} mknew(event_list, function(x) x.next=nil x.tail=x end) function event_list:pb(x) self.tail.next = x self.tail = x end function event_list:pf(x) if (not self.next) self.tail = x x.next = self.next self.next = x end function event_list:u() local p, n = self, self.next while n do if n:u() then p.next = n.next else p = n end n = n.next end self.tail = p return p end function event_list:draw() local n = self.next while n do n:draw() n = n.next end end function outer_or_each_opt(t, mname) local fun = t[mname] if fun then fun(t) return end foreach(t, function(o) local f = o[mname] if(f) f(o) end) end function nop() end blank = {} function blank:u() end function blank:draw() end view = { x=0, y=0, w=255, h=128, } mknew(view, function(x) if (not x.views) x.views = {} end) function view.of(subviews) return view.new{views=subviews} end function view:u() outer_or_each_opt(self.views, "u") end function view:draw() local oldcam = $0x5f28 poke2(0x5f28, %0x5f28-self.x) poke2(0x5f2a, %0x5f2a-self.y) outer_or_each_opt(self.views, "draw") poke4(0x5f28, oldcam) end bg = { x=0,y=0,w=128,h=128,fp=0,c=0 } mknew(bg) function bg:draw() local oldfp=fillp(self.fp) rectfill(self.x,self.y,self.x+self.w,self.y+self.h,self.c) fillp(oldfp) end -->8 -- setup and p8 entry points function _init() -- disable btnp repeat poke(0x5f5c, 255) -- complex fill API mode poke(0x5f34, 1) awakener_hold_frames = 0 -- debug mode: skip splahes mainview = ao_splash.new() menuitem(1, "⬅️ music: on ➡️", cycle_music) musicmode = 0 --arm_awakener() --mainview=newtitle() end mlbl={"on", "text", "game", "off"} function cycle_music(b) if b & 1 ~= 0 then -- left musicmode -= 1 if (musicmode < 0) musicmode = 3 elseif b & 34 ~= 0 then musicmode += 1 if (musicmode > 3) musicmode = 0 end if (mainview and mainview.onmchg) mainview:onmchg(musicmode) menuitem(nil, "⬅️ music: "..mlbl[musicmode+1].." ➡️") return true -- stay open end function arm_awakener() awakener_hold_frames=0 awakener_armed=true menuitem(2, "awaken now", awaken_now) end function awaken_now() exit_dither = ditherer.new{di=1} awakener_armed = false menuitem(2) 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 awaken_now() end end if exit_dither and exit_dither:u() then exit_dither = nil awakener_hold_frames=0 awakener_armed=false mainview = fast_awakener() mainview:av() end mainview:u() end function _draw() mainview:draw() if awakener_hold_frames >= 30 then local x=(awakener_hold_frames-30) * 2 + 7 rectfill(0,0,x,9,4) rectfill(x+1,0,128,9,5) font_default() print("keep holding for awakener", 1, 1, 7) end if exit_dither then exit_dither:draw() end end function font_monogram() memcpy(0x5600, 0x2000, 0x800) poke(0x5f58, 0x81) end function font_compact() memcpy(0x5600, 0x2800, 0x800) poke(0x5f58, 0x81) end function font_default() poke(0x5f58, 0x80) end function font_special() poke(0x5f58, 0x81) end -- play sound n on channel 3 iff -- 3 doesn't already have a -- greater index sound going. function psound(n, off, len) if (stat(49) > n) return sfx(n, 3, off, len) end -->8 -- text rendering txtbox = { x=0, y=0, f=0, interval=4, mode=0x81, } mknew(txtbox, function(self) if (not self.cols) self.cols = {14,10,9,8} self.c = deli(self.cols) end) function txtbox:u() if #self.cols > 0 then self.f += 1 if self.f >= self.interval then self.f = 0 self.col = deli(self.cols) end end end function txtbox:draw() poke(0x5f58, self.mode) print(self.text, self.x, self.y, self.col) end function txtbox:xm() return print(self.text, self.x, -9999) end spring = { from = 128, to = 0, frames=120, f = 0, } mknew(spring) function easeoutovershoot(t) t-=1 return 1+2.7*t*t*t+1.7*t*t end function spring:u() local v = self.v self.v:u() if self.f >= self.frames then v.y=self.to return true end local t, range = self.f/self.frames, self.to - self.from v.y = self.from + easeoutovershoot(t)*range self.f += 1 end function spring:draw() self.v:draw() end scoot = { from=0, to=-128, frames=60, f=0, } mknew(scoot) function scoot:u() local v = self.v self.v:u() if self.f >= self.frames then v.y=self.to return true end self.f += 1 if self.f <= 0 then v.y=self.from return end local t, range = self.f/self.frames, self.to - self.from v.y = self.from + range * t * t * t end function scoot:draw() self.v:draw() end scootbox = {} mknew(scootbox, function(x) x.v = view.new{ x=x.x, y=x.from or scoot.from, } x.s = scoot.new{ from=x.from or scoot.from, to=x.to or scoot.to, frames=x.frames or scoot.frames, v=x.v } end) function scootbox:u() if self.go then self.s:u() else self.v:u() end end function scootbox:push(drawable) add(self.v.views, drawable) end function scootbox:done() return self.s.f >= self.s.frames end function scootbox:draw() return self.v:draw() end nrm_txt_pal = split"14,10,9,8" sfd_txt_pal = split"15,10,9,8" hlt_txt_pal = split"13,11,9,8" shd_txt_pal = split"12,12,1,0" function cparr(t) local ret = {} for i,x in ipairs(t) do ret[i]=x end return ret end function zonk_txt(s, x, y, p, md, amt, frms) md = md or 0x80 frms = frms or 0 amt = amt or 0 local itv = (frms>>2)&0x7fff local t1 = txtbox.new{ x=x+1, y=y+1, interval=itv, cols=cparr(shd_txt_pal), mode=md, text=s, } local v = view.of{ t1, txtbox.new{ x=x, y=y, interval=itv, cols=cparr(p), mode=md, text=s, }, } itv=spring.new{ from=amt, frames=frms, v=v, } itv.eff_w=t1:xm()-1 return itv end -->8 -- zonk renderer fadetable = split"0,1.5,1025.5,1029.5,1285.5,1413.5,9605.5,9637.5,-23130.5,-23066.5,-18970.5,-18954.5,-2570.5,-2568.5,-520.5,-8.5,-0.5" ditherer = { i = 0, di = 0.25, c=0, pattern=fadetable, } mknew(ditherer, function(x) if (x.di and x.di < 0 and not x.i) x.i = (x.pattern and #x.pattern or #fadetable) + 0.99 end) function ditherer:u() 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 function ditherer:draw() local idx = min(flr(self.i), #self.pattern) if (idx < 1) idx = 1 fillp(self.pattern[#self.pattern+1-idx]) rectfill(0,0,128,128,self.c) end fuzzy = { p = 0xffff, n = 0, interval = 3, tries = 4, } mknew(fuzzy, function(x) local p = (x.p or fuzzy.p) & 0xffff x.mass = 0 while p ~= 0 do x.mass += p & 1 p = (p >>> 1) & 0xffff end end) function fuzzy:u() self.n += 1 if (self.n < self.interval) return self.n = 0 for i=1,self.tries do 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 self.p |= b return end else if i == self.tries or not self.weight or self.mass >= self.weight then self.mass -= 1 self.p &= ~b return end end end end function fuzzy:set_fillp() fillp(self.p + 0x0.8) end fuzzy_stripey = { y = 0, dy = -0.25, thicc = 3, weight = 12, spacing = 7, gap = 32, colors = split"3,5,2,1", } mknew(fuzzy_stripey, function(f) f.fuzz = fuzzy.new{ weight = f.weight or fuzzy_stripey.weight, interval = f.interval, tries = f.tries, } end) function fuzzy_stripey:u() local fz = self.fuzz fz.weight = self.weight fz.interval = self.interval fz.tries = self.tries self.y += self.dy if (self.y <= -self.gap) self.y += self.gap if (self.y >= 0) self.y -= self.gap fz:u() end function fuzzy_stripey:draw() self.fuzz:set_fillp() for y=self.y,128,self.gap do for i,c in ipairs(self.colors) do local y0 = y + (i-1) * self.spacing rectfill(0, y0, 128, y0 + self.thicc, c) end 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 brth_fg={2,12,4,12,2} brth_bg={1,2,3,2,1} breather = { colors = brth_fg, sep = 8, speed=300, f=0, } mknew(breather) function breather:u() 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 or f == -self.speed then if self.nextspeed then self.speed = self.nextspeed self.nextspeed = nil end if self.off_soon then self.on = false f=0 end if self.nextcolors then self.colors=self.nextcolors end 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:mt(x, awm) if (not self.on) return true if (x==1) return not awm and self:starting_reverse() if (x==2) return not awm and self:starting_forward() if (x==3) return not awm and self:starting_reverse() or self:starting_forward() return true end function breather:starting_reverse() return self.f + self.speed < self.sep * #self.colors end function breather:starting_forward() return self.f > 0 and self.f < self.sep * #self.colors end def_z_pal = { [0]=0,129,1,130,4,5,6,7,1,5,6,140,2,12,7,7 } def_14_fade = split"0,0,0,0,0,128,129,133,141,13,6,15,7" def_15_fade = split"0,0,128,129,133,141,13,13,6,6,15,15,7" def_13_fade = split"0,0,0,0,0,128,129,133,141,140,140,13,12" def_shd_fade = split"0,0,0,128,130,141,2" -- frames between words during -- zonk txt fbw=8 zonk_mode = { files={}, lnh = 9, --space width spc_full=6, --text mode txmd=0x81, --text spring-in distance txd=12, --text spring-in frames txf=30, --exit frames exf=45, --exit magnitude exmg=16, --character wait multiplier cmul=1, p=def_z_pal, fd13 = def_13_fade, fd14 = def_14_fade, fd15 = def_15_fade, fd12 = def_shd_fade, twt=60, expect_cfg_line=true, txt_frame=blank, px=true, cx=0, cy=0, } mknew(zonk_mode, function(self) self.stripes=fuzzy_stripey.new{ colors=self.bg_stripe_cols, dy=self.bg_dy, weight=self.bg_wgt, } self.brth=breather.new{ colors=self.br_cols, sep=self.br_sep, speed=self.br_spd, } self.awm=true end) function zonk_mode:set(_, field,value) self[field]=value end function zonk_mode:unset(_, ...) for n in all(pack(...)) do self[n] = nil end end function zonk_mode:at(_, x, y) self.txt_frame=scootbox.new{ x=x, from=y, to=y-self.exmg, frames=self.exf, } end function zonk_mode:c(_, rows, cols) local w,h = cols*self.spc_full, rows*self.lnh-1 self:at(_, 64-ceil(w/2), 64-ceil(h/2)) end function zonk_mode:bon() self.brth.on=true self.brth.off_soon=false end function zonk_mode:boff() self.brth.off_soon=true end function zonk_mode:bspd(_, spd) self.brth.nextspeed=spd end function zonk_mode:bpal(_, p) self.brth.nextcolors= p == 1 and brth_fg or brth_bg end function zonk_mode:bgdy(_, dy) self.stripes.dy = dy end function zonk_mode:bgwt(_, w) self.stripes.weight = w end function zonk_mode:av() clear_alt_pal_bits() pal() font_monogram() if (type(self.file) == "string") self.file = split(self.file, "\n") if (not self.file) self:nf() assert(self.file) if self.bgm and not self.xbgm and (musicmode & 2 == 0) then music(self.bgm,1000,7) else music(-1, 250) end end function zonk_mode:onmchg() if (musicmode & 2 == 0 and not self.xbgm) then music(self.nextbgm or self.bgm or -1, 500, 7) if self.nextbgm then self.bgm = self.nextbgm self.nextbgm = nil end else music(-1, 250) end end function zonk_mode:nf() if #self.files > 0 then self.file=split(deli(self.files,1), "\n") self.expect_cfg_line=true self.cy=0 self.cx=0 end end -- return char count, item -- or 0, nil: end of page -- or nil (, nil): end of file function zonk_mode:ni() if not self.line then if (not self.file or #self.file == 0) return local line = deli(self.file, 1) if self.expect_cfg_line then self.expect_cfg_line = false for i,cmd in ipairs(split(line, " ")) do if #cmd > 0 then local frags = split(cmd,":") assert(type(self[frags[1]])=="function", tostr(i).." - "..line) self[frags[1]](self, unpack(frags)) end end return self:ni() end if line == "-----" then self.line = nil self.expect_cfg_line = true self.cx = 0 self.cy = 0 return nil end self.line = split(line, " ") end if #self.line==0 then self.line = nil self.cx = 0 self.cy += self.lnh return self:ni() end -- parse token local token = tostr(deli(self.line, 1)) while #token == 0 and #self.line > 0 do -- emit extra spaces self.cx += self.spc_full token = tostr(deli(self.line, 1)) end local pp=nrm_txt_pal,1 if (token[1]==">") token,self.cx=sub(token,2),self.cx+self.spc_full\2 if (token[1]=="!") token,pp=sub(token,2),sfd_txt_pal if (token[1]=="#") token,pp=sub(token,2),hlt_txt_pal local ret = zonk_txt(token,self.cx,self.cy,pp,self.txmd,self.txd,self.txf) self.cx = ret.eff_w+self.spc_full return ret, fbw * twmul(token) end punct = {["."]=2, ["?"]=2, ["!"]=2} -- token wait multiplier function twmul(s) if (punct[s[#s]]) return 2 return 1 end function zonk_mode:ey() if (self.file and #self.file > 0) return false return #self.files == 0 end function fadetbl(col, tbl, frac) pal(col,tbl[1+(frac*#tbl)&0x7fff],1) end function zonk_mode:u() if (not self.brth:mt(self.bwt)) self.awm=false if self.px then self.twt -= 1 if self.twt <= 0 then local item, wt = self:ni() self.cf = self.cf or self.ac if not item then if (not self.file or #self.file == 0) self:nf() self.px=false if (not self.cf) psound(9,8,2) else self.txt_frame:push(item) self.twt = wt*self.cmul psound(self.txf > 1 and 8 or 9,0,4) end end else --waiting to advance or exit if self.twt <= 0 then local justc=false if (btnp(1) and not self.cf) self.cf,justc=true,true if not self.nxp and self.cf and self.brth:mt(self.bwt, self.awm) then self.nxp = true self.txt_frame.go = true self.fpfrm = self.exf self.awm=true if (not self.ac) psound(8, justc and 16 or 18, 8) end if (justc and not self.nxp) psound(8,16,2) else self.twt -= 1 end end if self.nxp and not self.d then if self.fpfrm > 0 then self.fpfrm -= 1 elseif self:ey() then self.txt_frame=blank self.d = ditherer.new{di=0.5} music(-1,533) else self.nxp = false self.cf=false self.txt_frame=blank self.px=true self.fpfrm=nil end end self.stripes:u() self.brth:u() self.txt_frame:u() if (self.d and self.d:u()) seq:next() if not self.d and self.nextbgm and not self.xbgm and (musicmode & 2 == 0) and stat(56) <= 0 then music(self.nextbgm, 500, 7) self.bgm = self.nextbgm self.nextbgm = nil end end function zonk_mode:draw() cls(0) pal(self.p, 1) if (not self.hide_stripes) self.stripes:draw() if (not self.hide_breath) self.brth:draw() if self.fpfrm then local ffrac = self.fpfrm/self.exf fadetbl(12, self.fd12, ffrac) fadetbl(13, self.fd13, ffrac) fadetbl(14, self.fd14, ffrac) fadetbl(15, self.fd15, ffrac) end self.txt_frame:draw() if not self.px and not self.cf and self.twt <= 0 then font_default() print("➡️",121,121,12) print("➡️",120,120,self.brth:mt(self.bwt) and (hz(2) and 7 or 6) or 5) end if(self.d) self.d:draw() -- debug info -- print(tostr(stat(56)), 0, 0, 7) end -->8 -- awakener count_up=[[bgdy:-0.1 bspd:240 c:3:18 >wITH EVERY COUNT FROM 1 !UP TO 5, YOU !WAKE FURTHER. ----- bgdy:0 c:5:19 >aS YOU !WAKE !UP, THE WORLD RETURNS. YOUR MIND IS !NOW RETURNING TO ITS USUAL FLOW. ----- bpal:1 set:bwt:2 c:3:19 !aWAKEN, BECOMING FULLY ALERT AT THE >COUNT OF #5... ----- set:exf:10 set:txf:30 set:txd:45 set:ac:1 bgwt:9 bgdy:0.1 bspd:225 c:1:1 1 ----- bspd:210 bgdy:0.15 bgwt:10 c:1:1 2 ----- bspd:180 bgdy:0.2 bgwt:11 c:1:1 set:nextbgm:21 3 ----- bgdy:0.25 bpal:2 bgwt:12 c:1:1 4 ----- bgdy:0.3 bgwt:13 c:1:1 set:nextbgm:-1 5 ----- set:hide_breath:1 unset:ac set:hide_stripes:1 boff set:txf:1 set:txd:0 set:exd:0 set:exf:1 set:bwt:0 c:1:11 wide awake! ]] function normal_awakener() return zonk_mode.new{ bgm=19, br_cols=brth_bg, file=[[c:2:15 bon yOU'VE LEARNED SO WELL! ----- c:2:14 yOU'RE SUCH A !GOOD !TOY! ----- c:4:19 tAKE A MOMENT TO JUST !ENJOY HOW >IT FEELS, TO BE #VINYL FULL OF #AIR. ----- c:6:20 bgdy:-0.2 bECAUSE, NEXT, IT'S >TIME TO #WAKE #UP. yOU GET TO TAKE YOUR !HAPPY MOOD AND !VIVID !MEMORIES OF THIS EXPERIENCE WITH YOU, ----- c:4:20 bgdy:-0.15 bspd:270 set:nextbgm:20 BUT !ALL THE HYPNOTIC !SUGGESTIONS FROM >THIS GAME WILL !FADE >AS YOU #WAKE #UP. ]], files={count_up}, } end function fast_awakener() seq=sequencer.new{ {f=awakener_lock}, } return zonk_mode.new{ xbgm=true, br_speed=240, br_cols=brth_bg, bg_dy=-0.12, p={ [0]=0,128,133,5,4,5,6,7,133,134,6,140,132,12,7,7 }, file=[[c:3:13 tHIS HYPNOTIC EXPERIENCE IS ENDING !NOW. ----- c:6:20 >aS YOU #WAKE #UP, ALL HYPNOTIC SUGGESTIONS FROM THIS GAME FADE. yOUR MIND IS !NOW !RETURNING !TO ITS !ORDINARY PATTERNS. ----- c:4:19 bon tHE !STORY TOLD BY >THIS SOFTWARE !IS ENDED, WORDS ON A SCREEN IN THE !PAST. ----- c:5:17 >sUGGESTIONS FROM >THIS FICTION ARE LEFT BEHIND. tHEY DO NOT AFFECT YOU OR YOUR MEMORY.]], files={count_up}, } end function awakener_lock() arm_awakener() return { u=nop, av=nop, draw=function() pal() font_default() cls(0) print("session ended",38,7,5) print("to replay awakener,",26,58,6) print("hold ❎",45,65,6) print("kistaro.itch.io",34,116,5) end, } end -->8 -- consent screens ao_splash = {f=180} mknew(ao_splash, function(self) self.c = breather.new{ colors={7,15,14,8,2}, sep=3, f=15, on=true, speed=240, } font_monogram() end) function ao_splash:u() if self.c.f < 96 then self.c:u() return end self.f -= 1 if (self.f < 150 and (btnp() & 0xf > 0) and self.f > 0) self.f = 0 if self.f == 0 then self.d = ditherer.new{di=1} end if (self.d) self.d:u() if self.f <= -32 then mainview=consent_splash.new() mainview:u() end end function ao_splash:draw() cls() self.c:draw() if self.f < 180 then font_special() print("18+", 55, 60, 7) print("aDULTS ONLY", 30, 90, 15) if (self.f == 179) psound(10) end if (self.d) self.d:draw() end consent_splash = { f = 0, } mknew(consent_splash, function(self) self.d = ditherer.new{ di=-1 } arm_awakener() end) function consent_splash:u() local f = self.f + 1 if (f < 0) f = 0x7fff if btnp(1) and f > 150 and self.d.di~=1 then self.d.di = 1 psound(9,16,8) end if self.d:u() and self.d.di > 0 then mainview=newtitle() mainview:u() end if (f == 1 or f==45 or f==90) psound(9,0,4) self.f=f end function consent_splash:draw() self:dtx() self.d:draw() end function consent_splash:dtx() 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➡️") end -->8 -- title screen function newtitle() local ret = title_screen.new() ret:av() return ret end title_screen = {} mknew(title_screen, function(self) self.a = arcade_level.new{ noscore=true, max_score=9999, wordwait=9999, extra_layer={ draw=function() self:m() end, u=nop, }, phin_x = 62, } end) function title_screen:av() self.a:av() font_monogram() end function title_screen:onmchg() self.a:onmchg() end function title_screen:draw() self.a:draw() end function title_screen:m() font_special() print("\^w\^tvACATION", 18, 24, 0) print("\^w\^tvACATION", 17, 23, 3) print("\^w\^tvACATION", 16, 22, 15) if hz(8) or self.a.wordremain ~= 0 then print("pRESS", 43, 96, 3) print("pRESS", 42, 95, 15) font_default() print("➡️", 79, 98, 3) print("➡️", 78, 97, 15) end end function title_screen:u() self.a.wordtimer=9999 if btnp(1) and self.a.wordremain ~= 0 and not self.pp then self.a.wordremain=0 self.pp=true create_game() psound(11,0,16) end self.a:u() end -->8 -->8 -- dolphin sprite renderer phinstate_nrm = { --s={4, 36, 4, 9}, s={4}, ws=3, hs=2, idle=true, xo=-12, yo=-8, } phinstate_jump_full = { s={64}, ws=2, hs=3, xo=-4, yo=-8, } phinstate_jump_wane = { s={69}, ws=3, hs=3, xo=-12, yo=-8, } phinstate_crest = { s={72}, ws=3, hs=2, xo=-12, yo=-8, } phinstate_fall_wax = { s={128}, ws=3, hs=3, xo=-12, yo=-16, } phinstate_fall_full = { s={77}, ws=2, hs=3, xo=-4, yo=-16, } phinstate_dive_full = phinstate_fall_full phinstate_dive_wane = { s={128}, ws=3, hs=3, xo=-12, yo=-16, } phinstate_return = { s={104}, ws=3, hs=2, xo=-12, yo=-8, } phinstate_rise_wax = phinstate_jump_wane phinstate_rise_full = phinstate_jump_full phinstate_error = { s={0}, ws=1, hs=2, } -- coordinates are the notional -- center point of the dolphin. -- many states are off-center. toyphin = { x=-12, xtarget=16, y=64, dy=0, state=phinstate_nrm } mknew(toyphin) function toyphin:u() local x, y, dy, splash = self.x, self.y, self.dy, self.splasher -- entry mode? if not self.entered then x += 1 self.entered = x >= self.xtarget elseif self.exiting then if x + self.state.xo > 128 then self.exited = true else x += 1 end end -- button handling if self.entered and not self.exiting then if y >= 61 and y <= 67 then if (btn(2)) and dy < 1 then splash:surfacing_splash(x, 3.8, true) dy=-3.8 elseif (btn(3)) and dy > -1 then splash:landing_splash(x, 3.8, true) dy=3.8 end else dy += (btn(3) and 0.125 or 0) - (btn(2) and 0.125 or 0) end end if (y > 64) dy -= 0.3 if (y < 64) dy += 0.3 local new_y = y + dy if new_y <= 64 and y > 64 then -- surfacing splash:surfacing_splash(x, -dy, btn(2) and (dy > -3.8)) if btn(2) then -- maybe boost if dy > -3.8 then new_y = 64 + ((dy + y - 64)/dy * -3.8) dy = -3.8 else dy = (dy - 7.6) / 2.5 end else -- brake if dy > -0.75 then --stabilize new_y = 64 dy = 0 else dy /= 1.75 end end elseif new_y >= 64 and y < 64 then -- landing splash:landing_splash(x, dy, btn(3) and (dy < 3.8)) if btn(3) then -- maybe boost if dy < 3.8 then new_y = 64 - ((dy - y + 64)/dy * 3.8) dy = 3.8 else dy = (7.6 + dy) / 2.5 end else --brake if dy < 0.75 then --stabilize new_y = 64 dy = 0 else dy /= 1.75 end end end y=new_y local wet, st = y > 64, phinstate_error if dy < -2.15 then st = wet and phinstate_rise_full or phinstate_jump_full elseif dy <= -1.45 then st = wet and phinstate_rise_wax or phinstate_jump_wane elseif dy < 1.45 then if y > 50 and y < 78 then st = phinstate_nrm else st = wet and phinstate_return or phinstate_crest end elseif dy <= 2.15 then st = wet and phinstate_dive_wane or phinstate_fall_wax else st = wet and phinstate_dive_full or phinstate_fall_full end if (y > 50 and y < 78 and dy > -1.35 and dy <1.35 ) st = phinstate_nrm -- test mode --if (btn(5)) self.exiting = true self.x, self.y, self.dy, self.state = x, y, dy, st end -- hitbox for current state function toyphin:box() local st = self.state return {self.x + st.xo, self.y + st.yo, st.ws * 8, st.hs * 8} end function toyphin:draw() local st, y = self.state, self.y if (st.idle) y += wave() spr(st.s[1+(((t()<<1)&0x0.ffff*#st.s)&0x7fff)], self.x + st.xo, y + st.yo, self.state.ws, self.state.hs) end -->8 -- pyrex's cloud renderer cld_bpl={241,242,244,248} wpal={[0]=7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7} cmgr={ f=0, df=1, bpi=1, -- TODO: bitplane index -- different algorithm sprs=10, step=3, y=12, h=9, oval_h=4, c0 = 8, -- shadow c1 = 7, -- primary } mknew(cmgr, function(self) self.clouds = {} --todo: nonempty spawn end) function cmgr:u() self.f+=self.df if self.f%(self.step*self.sprs) == 0 then self.f=0 local bp=cld_bpl[self.bpi] self.bpi += 1 if (self.bpi > #cld_bpl) self.bpi = 1 add(self.clouds,{x=127,y=rnd()*self.h,w=flr(rnd()*16)+16,plane=bp}) end if self.f%self.step==0 then local clouds2={} for c in all(self.clouds) do c.x-=1 if (c.x+c.w>-6) add(clouds2,c) end self.clouds=clouds2 end end function cmgr:draw() --back up pal01 memcpy(0x8010,0x5f00,32) --back up pal2 memcpy(0x8000,0x5f60,16) fillp(0) local h=self.h+self.oval_h+1 assert(h<=16) -- render to spritesheet poke(0x5f55,0x00) rectfill(0,96,127,96+h,0) -- use bitplanes for c in all(self.clouds) do poke(0x5f5e,c.plane) ovalfill(c.x,96+c.y,c.x+c.w,96+c.y+self.oval_h,15) end poke(0x5f5e,255) -- render from high memory -- to higher memory rectfill(0,112,127,112+h,0) palt(0b1110100010000000) pal(wpal) poke(0x5f5e,0xf1) sspr(0,96,128,h,5,112) poke(0x5f5e,0xf2) sspr(0,96,128,h,4,113) sspr(0,96,128,h,1,113) poke(0x5f5e,255) -- render to screen poke(0x5f55,0x60) pal() pal(1,self.c1) pal(2,self.c0) pal(3,self.c1) sspr(0,112,128,h,0,self.y) -- restore former palettes memcpy(0x5f00,0x8010,32) memcpy(0x5f60,0x8000,16) end -->8 -- arcade mode wordtarget = { x = 129, y = 60, on_hit = nop, } mknew(wordtarget, function(x) poke(0x5f58, 0x81) x.w = print(x.str, 0, -9999)-1 end) function collides(b1, b2) if (b1[1] > b2[1] + b2[3]) return false if (b1[1] + b1[3] < b2[1]) return false if (b1[2] > b2[2] + b2[4]) return false return not (b1[2] + b1[4] < b2[2]) end function wordtarget:u() if collides({self.x, self.y, self.w, 6}, self.phin:box()) then self:on_hit() return true end self.x -= 1 return self.x < -self.w end function wordtarget:draw() poke(0x5f58, 0x81) -- debug: show hitbox --rect(self.x-1, self.y-1, self.x+self.w+1, self.y + 8, 0x10F1.5a5a) print(self.str, self.x+1, self.y+1, 0x100b) print(self.str, self.x, self.y, 0x100a) end function setup_arcade_pal() -- per-line color mode poke(0x5f5f, 0x10) -- rows 72 and lower: sea memset(0x5f79,0xff,7) pal() --game_nrm_pal pal({ [0] = 1, 0, 2, 140, 4, 5, 7, 7, 15, 6, 10, 132, 12, 12, 14, 7 }, 1) --game_uw_pal pal({ [0]=1, 0, 130, 140, 129, 5, 141, 13, 8, 9, 10, 132, 131, 12, 141, 7 }, 2) end function wave() return 2.5 * sin((t())>>1) end function clear_alt_pal_bits() memset(0x5f70,0x0,16) end sea = {} mknew(sea) function sea:draw() local w = wave() rectfill(0, 66+w, 128, 77+w, 0x1000) poke2(0x5f78, 0xffe0.00ff <<> w) rectfill(0, 78+w, 128, 89+w, 0x1040.a842) rectfill(0, 90+w, 128, 97+(w>>1), 0x1004.e169) rectfill(0, 98+(w>>1), 128, 104+(w>>2), 0x1004.a842) rectfill(0, 104+(w>>2), 128, 110+(w>>2), 0x1004) rectfill(0, 111+(w>>2), 128, 118+(w>>3), 0x1041.e169) rectfill(0, 119+(w>>3), 128, 124+(w>>3), 0x1041.a842) rectfill(0, 125+(w>>3), 128, 128, 0x1001) end spark = { x=0, y=0, dx=0, dy=0, f=-1, } mknew(spark) function spark:u() self.f += 1 if (self.f >= 12) return true self.x += self.dx self.y += self.dy end function spark:draw() spr(48+self.f\2, self.x, self.y) end -- other fields: level, item -- level must provide: -- function :pdone(item) -- field .pdx (scrolling parallax dx) -- item must provide: -- drawable api -- .x readwrite (draw coord) -- .w (width) parallax = { dx=0, z=1, } mknew(parallax) function parallax:u() local item = self.item if item:u() then self.level:pdone(self) return true end item.x += self.dx item.x += self.level.pdx * self.z if item.x > 256 or item.x + item.w < -128 then self.level:pdone(self) return true end end function parallax:draw() self.item:draw() end spritem = { s = {0}, sw = 1, sh = 1, i = 1, xf = -1, f = 4, x = 0, y = 0, } mknew(spritem, function(self) self.w = (self.sw or spritem.sw) << 3 self.h = (self.sh or spritem.sh) << 3 end) function spritem:u() self.xf += 1 if self.xf > self.f then self.i += 1 if (self.i > #self.s) self.i = 1 self.xf = 0 end end function spritem:draw() spr(self.s[self.i], self.x, self.y, self.sw, self.sh, self.flipx, self.flipy) end arcade_level = { score=0, wordwait = 90, pdx=0, } mknew(arcade_level, function(x) x.phin = toyphin.new{ splasher=x, xtarget=x.phin_x, } x.sky = bg.new{c=13} x.sea = sea.new() x.cld1 = cmgr.new{} x.bg = event_list.new() x.fg = event_list.new() x.words = event_list.new() x.t0 = t() x.wordremain = x.max_score or arcade_level.max_score x.wordtimer = x.wordwait or arcade_level.wordwait x.v = view.of{ x.sky, x.cld1, x.sea, x.waves, x.noscore and blank or { draw=function() poke(0x5f58, 0) local s = tostr(x.score) print(s,1,2,3) print(s,2,1,3) print(s,0,1,3) print(s,1,0,3) print(s,1,1,15) end }, x.bg, x.phin, x.fg, x.words, x.extra_layer or blank, } x.d = ditherer.new{ c=1, di = 0.34, } end) function arcade_level:av() if (musicmode & 1 ==0) music(0,1000,7) for _=1,5 do self:gen_fish(-127, 256) end font_compact() end function arcade_level:gen_fish(xmin, xrg) local fishdx = rnd(0.5) - 0.25, rnd(xrg) + xmin local fish = spritem.new{ x = rnd(xrg) + xmin, y = 80 + irnd(44), s = {54, 55, 56, 55}, flipx = fishdx > 0, i = irnd(4) + 1, f = 20, } self.bg:pf(parallax.new{ level=self, item=fish, dx=fishdx, z=0.5 + rnd(0.4), id="fish", }) end function arcade_level:pdone(item) if (item.id == "fish") self:gen_fish(129, 50) end function arcade_level:onmchg() music((musicmode & 0x1 == 0) and 0 or -1, 500, 7) end function arcade_level:u() if self.phin.entered then if self.wordtimer <= 0 and self.wordremain > 0 then self:spawn_word() self.wordtimer = self.wordwait self.wordremain -= 1 end self.wordtimer -= 1 end if self.wordremain <= 0 and self.words.next == nil then self.phin.exiting = true end if self.phin.x > 90 then if not self.mstp then self.mstp = true music(-1,800) end if (self.d:u()) seq:next() end self.pdx = (self.phin.entered and not self.phin.exiting) and -1 or 0 self.v:u() end function arcade_level:spawn_word() -- pick row from pattern if not self.pattern then self.pattern=gen_pattern() self.pattern_idx = 0 self.next_break = 8 + irnd(9) end local i, pbk = (self.pattern_idx&3)+1,0 if self.next_break <= 0 then -- do pattern break local np = gen_pattern() i = np[1]==self.pattern[i] and 2 or 1 self.pattern=np self.next_break = 8 + irnd(9) pbk=3 end self.pattern_idx = i self.next_break -= 1 local row = self.pattern[i] self.words:pb(wordtarget.new{ y=32*row+irnd(13)-6, phin=self.phin, on_hit = function(word) self:word_hit(word) end, str=rnd(self.wordsets[row + pbk]), }) end function irnd(n) return rnd(n) & 0x7fff end function gen_pattern() local x0 = irnd(3) local x1 = irnd(2) if (x1 == x0) x1 = 2 local x2 = irnd(2) if (x2 == x1) x2 = 2 local x3 = irnd(2) if (x3 == x2) x3 = 2 while x3 == x2 or x3 == x0 do x3 = (x3 + 1)%3 end return {x0 + 1, x1 + 1, x2 + 1, x3 + 1} end function arcade_level:word_hit(word) self.score += 1 psound(15) self.bg:pb(spark.new{x=word.x-1, y=word.y-1, dx=-2}) self.bg:pb(spark.new{x=word.x+word.w, y=word.y-1, dx=1}) end function arcade_level:draw() setup_arcade_pal() self.v:draw() self.d:draw() end function arcade_level:draw_splash(x, force) if (force < 0.5) return local n = (force + rnd(force)) & 0x7FF for i=0,n do local d = droplet.new{x=x, force=force, y=72+wave(), f=i/n-0.5} if rnd() < 0.5 then self.bg:pb(d) else self.fg:pb(d) end end end function arcade_level:landing_splash(x, force, harder) -- TODO: sfx, vfx for surfacing from a dive if (force > 1) psound(harder and 13 or 12, harder and 16 or 0, 16) self:draw_splash(x, force) end function arcade_level:surfacing_splash(x, force, harder) -- TODO: sfx, vfx for landing from a jump if (force > 1) psound(harder and 13 or 12, 0, 16) self:draw_splash(x, force) end splashcols = {0x1003, 0x103d.a5a5} droplet = {} mknew(droplet, function(d) d.dx = (d.f * d.force >> 2) - 0.75 d.x += 16 * d.f d.dy = -rnd(d.force*0.66) d.r = 1 + rnd(0.75 + (d.force >> 4)) d.c = rnd(splashcols) end) function droplet:u() self.x += self.dx self.y += self.dy self.dy += 0.3 return self.y >72 + wave() end function droplet:draw() circfill(self.x, self.y, self.r, self.c) local r2 = self.r >> 1 pset(self.x+r2, self.y-r2, 0x100F) end -->8 -- end of game ggwp = { frem = 60 } mknew(ggwp) function ggwp:av() font_monogram() if (musicmode & 1 == 0) music(0,500,7) local score_pct = 100 if seq.max_score ~= 0 then score_pct = seq.score/seq.max_score*100\1 end if (score_pct == 0 and seq.score > 0) score_pct = 1 self.score_pct = "\^w\^t"..tostr(score_pct).."%" self.score_str = tostr(seq.score).." / "..tostr(seq.max_score) self.col = irnd(8)+8 if score_pct == 100 then self.final_text=[[perfect! remarkable! you hit each and every target. good toy!]] elseif score_pct > 90 then self.final_text=[[ so close! going to go for them all next time?]] elseif score_pct > 20 then self.final_text=[[ hope you had fun! come play again some time!]] elseif score_pct > 5 then self.final_text=[[ wow! it is harder to miss the words than to hit them. this is a great try! think you can miss all of them next time?]] elseif score_pct > 0 then self.final_text=[[ you're so close! just a tiny bit more and you will miss every target! this is a phenomenal accomplishment already. will you miss them all next time?]] else self.final_text=[[unbelieveable! i didn't think this was even possible! spectacular work. good toy!!]] end end function ggwp:onmchg() music((musicmode & 0x1 == 0) and 0 or -1, 500, 7) end function ggwp:u() if (hz(2) ~= self.lasthz) self.col = irnd(8)+8 self.lasthz = hz(2) if (self.frem <= 0 and btnp(1) and not self.d) self.d = ditherer.new{di=0.5} if (self.frem > 0) self.frem -= 1 if (self.d and self.d:u()) seq:next() end sunset_pal=split"12,13,14,8,137,9,10,129,1,130,2,140,5,6,7" function ggwp:draw() pal() camera() clear_alt_pal_bits() pal(sunset_pal,1) for i=0,5 do local col, y0 = 0x1000 + i+1 + (i+2 << 4),20*i for j,p in ipairs{0, 0x5050>>>16,0x5a5a>>>16, 0xafaf>>>16} do rectfill(0, y0 + 5*j, 128, y0+4+5*j,col+p) end end rectfill(0, 120, 128, 128, 0x1007) font_special() print("\^w\^tgreat job!",5,8,0) print("fINAL SCORE:", 5, 26, 0) --0, 8, 9, 12 local xpos = 123-6*#self.score_str print(self.score_str, xpos+3, 35, 15) print(self.score_str, xpos+2, 34, 14) print(self.score_str, xpos+1, 33, 12) print(self.score_str, xpos, 32, 0) print(self.score_pct,64-print(self.score_pct,0,-9999)/2,59,self.col) font_default() local xoff = print(self.final_text, 0, -999, 0) - 1 print(self.final_text, 64-xoff/2, 90, 0) if self.frem <= 0 and not self.d then print("➡️", 117, 120, 15) print("➡️", 116, 119, hz(2) and 0 or 9) end if (self.d) self.d:draw() end -->8 -- game sequencer sequencer = { idx = 0, score = 0, max_score = 0, } mknew(sequencer) basic_breathe=[[c:1:13 bon set:ac:1 set:bwt:1 bREATHE IN... ----- c:1:14 set:bwt:2 bREATHE OUT...]] crescendo_breathe=[[c:1:13 set:bwt:1 set:nextbgm:19 bREATHE IN... ----- c:1:14 set:bwt:2 bREATHE OUT...]] function sequencer:next() if (mainview.score) self.score += mainview.score if (mainview.max_score) self.max_score += mainview.max_score self.idx += 1 local rec = self[self.idx] if rec == nil then mainview = newtitle() return end if rec.params then mainview = rec.f(unpack(rec.params)) else mainview = rec.f() end mainview:av() mainview:u() end function create_game() seq = sequencer.new{ { f=zonk_mode.new, params={{ txd=0, txf=1, exf=30, cmul=0.25, hide_stripes=true, file=[[c:6:20 wELCOME TO !vACATION! tHIS GAME USES #ONLY #THE #ARROW #KEYS FOR GAMEPLAY, SO PRESS !RIGHT TO CONTINUE. ----- c:9:20 >vACATION IS A #HYPNOTIC #EXPERIENCE. iF YOU WOULD LIKE TO >#STOP AT ANY TIME, FOR ANY REASON, HOLD #x OR #z. tHIS HALTS >THE GAME AND STARTS AN AWAKENER. ----- c:10:20 >aT THE END OF THIS >GAME, THE HYPNOTIC SUGGESTIONS WILL END >AND YOU'LL BE WOKEN BACK UP. >sO DURING THE GAME, FEEL FREE TO !SINK AS !DEEP INTO TRANCE AS >YOU LIKE! ----- c:2:20 iN THIS GAME, YOU'RE AN #ORCA #POOLTOY. ----- c:3:16 >tHAT'S ALSO THE CHARACTER IN THE ARCADE PART. ----- c:10:20 lET'S TRY THE ARCADE PART! #jUMP AND #DIVE >TO CATCH !THE WORDS. yOU DON'T HAVE TO PAY ATTENTION TO THE >!WORDS THEMSELVES; THEY'RE JUST HERE TO !SHAPE THE EXPERIENCE FOR !YOU. ----- c:2:10 UP: JUMP DOWN: !DIVE]], }}, }, { f = arcade_level.new, params = {{ max_score=10, wordsets=csv[[JUMP,PLAY,AIR,SUN DRIFT,SURF,FLOAT,WAVES DIVE,WATER,OCEAN,SEA DRIFT,SOAR,IMAGINE,BE RELAX,CHILL,TOY,POOLTOY SINK,DEEP,TRANCE,FOLLOW]], }}, }, { f = zonk_mode.new, params={{ txd=8, txf=15, exf=30, bgm=16, br_spd = 240, files={[[c:3:18 hEY, WELCOME BACK! >sTARTING TO GET >THE HANG OF IT? ----- c:3:14 nOW, THIS GAME PROMISED TO BE >#HYPNOTIC. ----- c:6:18 aND YOU MIGHT BE !ZONING !OUT TO IT ALREADY! bUT THESE >TEXT SEGMENTS ARE MORE TRADITIONALLY >#HYPNOTIC. ----- c:8:20 nOW, YOU MIGHT NOT THINK !HYPNOSIS !WORKS ON YOU. tHAT'S ALL >RIGHT! yOU CAN JUST #ZONE #OUT AND ENJOY >THE GAME. yOU DON'T HAVE TO !FOLLOW THE TEXT TOO CLOSELY. ----- c:9:20 >tHIS IS A #vACATION! yOU DON'T HAVE TO DO >MUCH OF #ANYTHING. >yOU DON'T HAVE TO >DO ANYTHING COMPLEX >TO !RELAX. yOU DON'T >HAVE TO !IMAGINE A >STAIRCASE AND COUNT BACKWARDS. ----- c:4:20 tHAT ALL SOUNDS LIKE TOO MUCH WORK. aLL YOU NEED TO DO RIGHT !NOW IS TO #BREATHE. ----- c:1:13 bon bpal:1 set:ac:1 set:bwt:1 set:txf:4 set:txd:0 set:exd:0 set:exf:10 set:nextbgm:17 bREATHE IN... ----- c:1:14 set:bwt:2 bspd:270 bREATHE OUT... ----- c:1:13 bpal:1 set:bwt:1 bREATHE IN... ----- c:1:14 set:bwt:2 bspd:300 bREATHE OUT...]], basic_breathe, [[set:bwt:0 bpal:2 unset:txd:txf:exf:exd:ac c:4:19 gREAT! iT FEELS >NICE TO !SINK INTO RELAXATION SO EASILY, DOESN'T IT? ----- c:4:19 >iT HELPS YOUR MIND >FLOAT AND !DRIFT, LIKE A #POOLTOY #ORCA ON THE WAVES... ----- c:3:18 iT'S A FUN IDEA TO JUST BE A #TOY LIKE >THAT, ISN'T IT? ----- c:7:20 !iMAGINE IT! #fLOATING >FREE ON A WARM DAY, !COOL WATER #SPLASHING >AT YOUR !VINYL FINS, YOUR AIR-FILLED BODY >#BOBBING BUOYANTLY ON THE SURF... ----- c:8:20 nOW, !YOUR !MIND CAN >#DO #WHATEVER #FEELS >#RIGHT -- IT !FOLLOWS ONLY !SUGGESTIONS THAT ARE FUN FOR YOU, IDEAS !YOU WOULD >ENJOY AND !WANT TO >EXPERIENCE. ----- c:4:19 aNYTHING ELSE CAN >JUST ROLL OFF YOUR MIND LIKE WATER OFF A POOLTOY'S BACK. ----- c:6:19 bUT WON'T IT BE !FUN !TO FEEL YOUR MIND >!REALLY #DIVE #DEEP INTO A FANTASY >WHERE YOU GET TO !BE A #POOLTOY? ----- c:6:20 >wHEN WILL IT !BECOME >SO #VIVID THAT YOU FEEL THE WAVES UNDER >YOU, FEEL THE WATER AGAINST YOUR !PLASTIC >#EVERY #ARCADE #ROUND? ----- c:4:20 bpal:1 tHESE !WORDS MIGHT >!SINK #DEEP !INTO YOUR MIND SOONER THAN !YOU >EXPECT!]], }, }}, }, { f = arcade_level.new, params = {{ max_score=30, wordsets=csv[[JUMP,PLAY,AIR,SUN,SQUEAKY DRIFT,SURF,FLOAT,WAVES,FUN DIVE,WATER,OCEAN,SEA,SPLASH DRIFT,SOAR,IMAGINE,POOLTOY RELAX,CHILL,TOY,ORCA,VIVID SINK,DEEP,TRANCE,FOLLOW,FANTASIZE]], }}, }, { f=zonk_mode.new, params={{ bgm=17, files={ [[c:4:19 >dON'T THOSE LEVELS >JUST #FLY BY WHEN >YOU'RE FEELING SO !RELAXED? ----- c:7:20 bpal:1 hAVE YOU YET NOTICED HOW !DIFFERENT IT >FEELS !NOW, YOUR >RHYTHMIC MOTIONS ON >THE #WAVES PULLING YOUR MIND TO !GREATER >DEPTHS OF #HYPNOSIS? ----- c:4:20 bpal:2 sTRANGE HOW !THAT !BODY !CAN !BE !SO !HEAVY >WHILE YOU'RE SO >#LIGHT AND #FLOATY! ----- c:4:20 oR PERHAPS !IT !CAN !BE >VERY !FAMILIAR, IF YOU'VE EXPERIENCED #HYPNOSIS BEFORE. ----- c:7:20 set:bwt:2 bpal:1 iT CAN BECOME VERY FAMILIAR, !THAT SENSE OF #FOCUS AND #QUIET IN THAT !MIND AS IT >!FINDS #AUTOMATIC #RESPONSES TO THESE WORDS IN !TRANCE.]], basic_breathe, crescendo_breathe, [[set:bwt:0 bpal:2 unset:ac c:8:20 sO #RELAXED NOW, !THAT !BODY BARELY WANTS TO >MOVE, !DOESN'T IT? >tHAT FEELING WHEN THOSE HANDS ONLY >!RESPOND TO TURN THE >PAGE, EVERYTHING IS SO #CALM AND #HEAVY. ----- c:9:20 >iF YOU NEEDED TO, >YOU COULD LOOK AWAY AND MOVE FREELY, BUT >RIGHT NOW YOUR EYES ARE #FIXED TO THE SCREEN, AREN'T THEY? >tHEY'RE #STAYING >#RIGHT #HERE WHEN YOU TRY TO TURN AWAY. ----- c:6:20 bECAUSE EVERY WORD IS TAKING YOU !DEEPER INTO !TRANCE !NOW, LET'S PLANT SOME >#HYPNOTIC #SAFETIES DEEP IN YOUR MIND. ----- c:9:20 tHE !SUGGESTIONS IN >THIS GAME ARE #PLAY. tHEY CAN !FEEL AS >INTENSE, !IMMERSIVE, AND IMMEDIATE AS YOU LIKE, !BUT WHEN THE PLAY IS OVER AND THE >CURTAIN FALLS, !THEY >!END AND YOUR MIND WILL BE AS IT WAS. ----- c:9:20 >eVEN WHEN YOU ARE FULLY !ENGAGED IN THIS EXPERIENCE, A QUIET PART OF YOUR >MIND IS MONITORING. >iT ONLY ACCEPTS THE SUGGESTIONS THAT ARE #FUN FOR YOU, AND THE >OTHERS #DRIFT PAST >WITH NO EFFECT. ----- c:9:20 >iF YOU NEED OR WANT >TO END THIS GAME AT >ANY TIME, FOR ANY REASON OR NO REASON, HOLD #x OR #z UNTIL AN AWAKENER STARTS. aNY >PART OF YOUR MIND >KEEPING YOU SAFE IS >INVITED TO DO THIS. ----- c:8:20 bpal:1 >bECAUSE ALL THESE SAFETIES ARE HERE, THE SUGGESTIONS IN THIS GAME WILL #TWIST >#YOUR #MIND #UP LIKE !A BALLOON ANIMAL UNTIL IT'S THE !PERFECT SHAPE FOR A !TOY! ----- c:9:20 >a !PERFECT MATCH FOR THOSE !SMOOTH PUFFY !VINYL #FLIPPERS NOW >OPERATING THE KEYS! >tHE PARTS OF YOUR MIND ACCUSTOMED TO #DREAMING GET TO TELL YOU STORIES WITH #EVERY #SENSE NOW. ----- c:9:20 >wHAT DOES IT !FEEL LIKE, TO WEAR THAT !CETACEAN #SHAPE, SO >LIGHTWEIGHT DESPITE ALL ITS BULK? wHAT DOES IT FEEL LIKE, TO HAVE INTERNAL #AIR #PRESSURE RESISTING MOVEMENTS? ----- c:7:20 >bECAUSE WHEN !YOUR >PAINTED-ON EYES CAN >SEE YOUR INFLATABLE !TOY #ORCA SHAPE RIGHT IN FRONT OF YOU, >THAT !EXPERIENCE !CAN ONLY !GET !STRONGER!]], }}}, }, { f = arcade_level.new, params = {{ max_score=40, wordsets=csv[[JUMP,PLAY,AIR,FIN,BOUNCE,SQUEAKY SURF,FLOAT,WAVES,TAIL,VINYL,DRIFT DIVE,WATER,SEA,FLUKES,FLIPPERS,CETACEAN DRIFT,IMAGINE,INFLATED,BULGING,SWELL RELAX,TOY,SEAMS,ORCA,DROP DEEP,TRANCE,PLASTIC,HYPNOSIS,SENSE]], }}, }, { f=zonk_mode.new, params={{ bgm=17, files={ [[c:3:19 >yOU'RE DEFINITELY GETTING A !FEEL FOR >THIS !NOW! ----- c:7:20 iT'S NOT #JUST YOUR >!PLASTIC SURFACE, OR >YOUR AIR-FILLED >FLIPPERS, OR YOUR >PUFFY !INFLATED TAIL FLUKES THAT MAKE YOU >A !TOY, OF COURSE. ----- c:5:20 set:bwt:2 bpal:1 >iT'S THE ENTIRE >#MINDSET! oF COURSE, #HYPNOSIS CAN BE !VERY !GOOD AT #SHIFTING A >PERSON'S !MINDSET.]], basic_breathe, crescendo_breathe, [[unset:ac set:bwt:0 bpal:2 c:7:18 a TOY IS AN #OBJECT TO BE #PLAYED #WITH. tHINK ABOUT THAT PAINTED-ON !HAPPY >EXPRESSION! a TOY >#DOESN'T #NEED #MUCH #GOING #ON IN THAT !AIR-FILLED !HEAD. ----- c:5:20 >tHAT TOY'S SHAPE IS SIMPLIFIED AND SOFT. >sMOOTH VINYL YIELDS EASILY; IT'S PLIABLE >AND FLEXIBLE. ----- c:7:19 >jUST BEING A TOY FEELS GREAT! yOUR MIND CAN !BE FULL OF GIDDY, PLAYFUL #JOY, >BECAUSE THAT'S ALL IT NEEDS TO BE !AN >!INFLATABLE !OBJECT! ----- c:9:20 !sMOOTH #VINYL, AN >#INFLATABLE !ORCA #BOBBING ABOUT UPON >THE #WAVES -- THERE ARE SO MANY THINGS >ABOUT BEING A !TOY THAT IMMERSE IT IN ITS #NATURAL #STATE OF >CAREFREE #EUPHORIA. ----- c:7:20 oF COURSE, THESE !TOY >THOUGHTS MIGHT FEEL >SO #NATURAL THAT THE !ORCA TOY DOESN'T YET REALIZE HOW MUCH ITS >!THOUGHTS ARE SHAPED BY #HYPNOSIS !NOW! ----- c:7:20 bUT A !TOY THAT !LIKES THE IDEA OF BEING #SO #PLIANT #AND #SIMPLE MIGHT NOTICE HOW ITS IMAGINATION IS PURSUING THESE !WORDS >SO EAGERLY... ----- c:9:20 >a TOY THAT WANTS TO >FEEL ITS MIND #SWIRL #AWAY IN A GIDDY HAZE MIGHT DEEPLY !ENJOY >HOW !AUTOMATIC ITS >OWN !RESPONSES FEEL, PLAYING A SIMPLE >ARCADE GAME #WITHOUT >#A #SINGLE #THOUGHT IN ITS AIR-FILLED HEAD! ----- c:10:20 iT'S SO FUN TO #DRIFT AND #FLOAT AND #FEEL #YOUR #PLASTIC #BODY ON >THE WAVES THAT !IT >!CAN !FEEL MORE AND >MORE #AUTOMATIC TO PRESS THE BUTTONS, BECAUSE IT'S !GREAT >TO BE A PLAYFUL INFLATABLE OBJECT!]], }}}, }, { f = arcade_level.new, params = {{ max_score=50, wordsets=csv[[JUMP,PLAY,AIR,FIN,GIDDY,HIGH,SQUEAKY SURF,FLOAT,WAVES,VINYL,TAIL,JOY,HAPPY DIVE,WATER,SEA,FLUKES,FLIPPERS,SIMPLE,ORCA INFLATED,HYPNOTIZED,EUPHORIA,VACANT,INFLATABLE RELAX,TOY,THING,SWIRL,HAZE DEEP,SINK,PLIANT,AUTOMATIC,HOLLOW]] }}, }, { f=zonk_mode.new, params={{ bgm=19, files={ [[c:1:16 bon bpal:1 sUCH A #GOOD #TOY!]], basic_breathe, basic_breathe, [[c:5:19 bpal:2 rEMINDING A !SQUASHY !VINYL !THING THAT IT IS A #"GOOD #TOY" CAN BE SUCH A RUSH OF >#EUPHORIA FOR IT! ----- c:9:20 tOYS DON'T HAVE TO !LET !THAT WAVE OF GOOD FEELINGS #WASH #AWAY #EVERYTHING ELSE IN THAT HOLLOW !HEAD, >BUT MANY DO BECAUSE >#IT #FEELS #SO #GOOD TO >!SINK !DEEPER INTO TOYMINDEDNESS... ----- c:3:20 aND BECAUSE IT FEELS >SO !GOOD TO BE A >#GOOD #TOY! ----- c:7:20 aND BECAUSE IT FEELS >SO GOOD TO !BE A #SIMPLE #HOLLOW #OBJECT >OF !VINYL AND AIR, !AND LET EVERYTHING >ELSE !DRIFT AWAY FOR >THE TIME BEING... ----- c:6:20 >dOES A !TOY NOTICE >WHEN SO MUCH OF ITS #IDENTITY HAS SWIRLED AWAY INTO THAT #GIDDY #HAZE THAT THE ONLY !THING LEFT IS #"TOY"? ----- c:8:20 >yOU COULD IMAGINE A TOY THAT LIKES THE IDEA WOULD FEEL SO #EUPHORIC WHEN IT >TRIES !HARD !TO !THINK >ABOUT WHO IT IS YET EVERY CONCEPT SWIRLS >AWAY BUT #"TOY"... ----- c:7:19 bpal:1 >sOME !TOYS !LIKE THE IDEA SO MUCH THEY >#LET #GO OF THEIR >MEMORY! #tHEY #DON'T #HAVE #TO, BUT IT CAN BE SO MUCH FUN !TO FEEL IT !DRIFT AWAY. ----- c:10:20 >a !TOY THAT WANTS TO LET GO OF ITS MEMORY FOR NOW CAN TRY TO >RECALL ANYTHING BUT >WATER AND !PLASTIC AND !AIR YET ONLY GET A VAGUE #SWIRL, A CUP OF !WATER POURED IN >THE SEA AND LOST TO THE WAVES... ----- c:8:20 >iF IT FEELS !GOOD TO FIND ONLY #AIR WITHIN THAT !HOLLOW CETACEAN >HEAD, THAT !MIND CAN GET EVEN #BETTER AT >FINDING NOTHING BUT >#GIDDY #EUPHORIA WHEN IT TRIES FOR MEMORY! ----- c:9:20 iMAGINE A TOY'S !MIND #WASHED #AWAY BY THE >WAVES, EVERY JUMP AND DIVE MAKING IT >#SIMPLER, WAVES OF #EUPHORIA !LEAVING >ONLY #"TOY", #"ORCA", >#"INFLATED", #"PLAY", >#"OBJECT"... ----- c:1:9 bpal:2 !gOOD !TOY! ----- c:8:20 >!a TOY ONLY NEEDS TO PLAY, AND FLOAT, AND #ENJOY ITS OWN #SMOOTH >#PLASTIC TEXTURE AND ITS !HOLLOW, BULGING, >#INFLATED !CETACEAN >SHAPE! a !TOY CAN BE SUCH A #SIMPLE THING. ----- c:7:20 >iMAGINE HOW !EAGER THAT !TOY IS TO #FLOAT >AND #DRIFT AND #PLAY! eVERY TIME IT GOES OUT ON THE WAVES, IT FINDS THE !EXPERIENCE EVEN MORE #VIVID. ----- c:8:20 a !TOY MIGHT BE READY TO PLAY ON THE WAVES FOR #QUITE #A #WHILE, NOW THAT ITS !MIND !IS >SO WELL-VERSED IN THE !SIMPLE, EUPHORIC >#JOYS OF BEING A #HOLLOW #VINYL #ORCA! ----- c:8:20 bpal:1 >aFTER ALL, IT CAN >!FEEL EVERY #JUMP AND >#SPLASH NOW, AND !THE >!WAVES CAN WASH AWAY >EVERYTHING A #SIMPLE #MINDLESS #TOY DOESN'T NEED, LEAVING ONLY GIDDY VINYL #JOY... ----- c:4:20 set:cmul:2 sMOOTH PLASTIC... #COOL #WATER... SOLAR WARMTH... #SPRINGY #BUOYANCY! ----- c:1:9 !gOOD !TOY!]], }}}, }, { f = arcade_level.new, params = {{ max_score=100, wordsets=csv[[JUMP,PLAY,AIR,FIN,GIDDY,HIGH,SQUEAKY,BREEZE,SUN,WARM,PLASTIC,BUOYANT SURF,FLOAT,WAVES,VINYL,TAIL,JOY,HAPPY,SWIM,WET,ORCA,COOL,pvc,DRIFT DIVE,WATER,SEA,FLUKES,FLIPPERS,SIMPLE,SPLASH,DREAM,IMAGINE,POOLTOY,DREAM INFLATED,HYPNOTIZED,EUPHORIA,VACANT,gOOD TOY!,gOOD TOY!,gOOD TOY! RELAX,TOY,THING,SWIRL,HAZE,EMPTY,BLANK,DROP DEEP,SINK,PLIANT,AUTOMATIC,MINDLESS,BULGING,gOOD TOY!,gOOD TOY!,gOOD TOY!]], }}, }, {f=normal_awakener}, {f=ggwp.new}, } end __gfx__ 00888800777777777777777777777777000000000000000000000000777777777777777700000000000000000000000000000000000000000000000000000000 0888e780700000000000000000000007000000000000000000000000700000000000000700000000000000000000000000000000000000000000000000000000 88888878700000000000000000000007000000000000000000000000700002222220000700000000000000000000000000000000000000000000000000000000 88a8a8e8700000000000000000000007000000000000000000000000700002eeee2000070000000000ee00000000000000000000000000000000000000000000 888a888870000000000000000000000700000000022260000000000070000222e22000070000000000e7e00000000000000000000eee70000000000000000000 88a8a888700000000000000000000007000000000022260000000000700002eeee20000700000000002e7e00000000000000000000eee7000000000000000000 08888880700000000000000000000007000000000002222600000000700002222220000700000000000ee7ee0000000000000000000eeee70000000000000000 008888007000000000000000000000070220000000266222662000007000022e2200000700000000e7eee7e77ee000000ee0000000ee7eee77e0000000000000 00000000700000000000000000000007226200002662222222222000700002e2e22000070e00000eee7eeeeeeeeee000ee7e0000e77eeeeeeeeee00000000000 00000000702222022222222222222207022626622222222227772620700002eeee200007e77e0e7eeeee77eee777e7e00e77eeeeeeeeeeeee777e7e000000000 00000000702ee222e22e22ee22e2e2070e2622222222222227c122627000022222200007eee7eee7e222eeeee7c1ee7e02e7ee77eeeeeeeee7c1ee7e00000000 00000000702e2e2e2e2e22e2e2e2e207222222eee222222222eee262700002222e20000702eeeee2222222eeee222e7eeeeeee222eeeeeeeee222e7e00000000 00000000702e2e2e2e2e22ee22eee207222eeeeeeeeee2222eeeeee0700002eeee2000072e7ee20000022eeee2222220eee2222222222eeee222222000000000 00000000702eee22e22ee2e222e2e2072eee0000eeee22262eeee0007000022222200007eeee20000000ee7e22222000e22200002222ee7e2222200000000000 00000000702222222222222202222207ee00000000022262000000007000022ee2200007ee220000000eeee70000000022000000000eeee70000000000000000 00000000700000000000000000000007000000000022220000000000700002e22e200007020000000eee220000000000000000000eee22000000000000000000 000000007000000000000000000000070000000000000000000000007000022ee220000700000000000000000000000000000000000000000000000000000000 00000000700000000000000000000007000000000000000000000000700000222220000700000000000000000000000000000000000000000000000000000000 000000007000000000000000000000070000000000000000000000007000022eee20000700000000000000000000000000000000000000000000000000000000 00000000700000000000000000000007000000000000000000000000700002e22e20000700000000000000000000000000000000000000000000000000000000 00000000700000000000000000000007000000000000000000000000700002eeee200007000000000222e0000000000000000000022270000000000000000000 0000000070000000000000000000000700000000000000000000000070000222222000070000000000222e000000000000000000002227000000000000000000 000000007000000000000000000000070000000000000000000000007000000000000007000000000002222e0000000000000000000222270000000000000000 000000007777777777777777777777770000000000000000000000007777777777777777022000000022e222ee20000002200000002272227720000000000000 000000000000000000000000a00aa00a000aa00000a00a0000000001000000000000000022e200002ee222222222200022720000277222222222200000000000 00000000000aa0000f0aa0f0000ff00000a00a000000000000010001000100010000100002ee22222222222227772e2002772222222222222777272000000000 000aa0000000000000affa0000a00a000a0000a0a000000a011110110111101101111001022e22ee2222222227c122e20e2722772222222227c1227200000000 00aaaa000a0ff0a00afaafa0af0000faa000000a000000001111111111111111111111112222227772222222227772e2222222eee222222222eee27200000000 00aaaa000a0ff0a00afaafa0af0000faa000000a00000000111111111111111111111111222777777777722227777770222eeeeeeeeee2222eeeeee000000000 000aa0000000000000affa0000a00a000a0000a0a000000a01111001011110110111101127770000777722e2777770002eee0000eeee2272eeeee00000000000 00000000000aa0000f0aa0f0000ff00000a00a0000000000000010000001000100010001770000000002222e00000000ee000000000222270000000000000000 000000000000000000000000a00aa00a000aa00000a00a00000000000000000000000001000000000222770000000000000000000222ee000000000000000000 00000000000066000000000000000000000002200000000000000000000002200000000000000000000000000000000000000000000000000000000000000000 0000000000022260000000000000000000222662000000000000000000222662000000000000000000000000000070220000000000220e220000000000000000 00000000002222e000000000000000006227222e00000000000000002227222e0000000000000000000000000222026200000000022262220000000000000000 0000000002712ee00000000000060026227c1eee0000000000006622227c1eee0000000000220000000000000e22e262000000000e2226220000000000000000 00000000627ceee00000000000222222227ceee000000000006622266272eee000000000002620000000000000ee26220000000000ee22260000000000000000 000000022277eee000000000022226222222eee000000000022222622222eee0000000000022620000000000000ee22600000000000ee2220000000000000000 000000222222ee0000000000000062222222ee0000000000000022222222ee000000000000022622000000000000e226000000000000e2220000000000000000 000066226622ee000000000000006222222220000000000000002222222220000000000026222626622000000000eee2200002000000ee222000000000000000 0006222622226e0000000000000622222226000000000000000222222226000002000002622222222222200000000ee22200020000000ee26200000000000000 00022222222226000000000000022222e22600000000000000022222e226000026620222222222222777262000000ee22266022000000ee22620002000000000 0022002222222200000000000062222ee000000000000000002222eee22e0000222622222eee222227c1226200000ee22226226000000ee22222022000000000 0000002226ee2600000000000662eeee000000000000000002222eee022e00000e22222eeeeeee2222eee26200000ee22222226000020ee22226262000000000 0000002226ee2260000000222222eee000000000000000662222ee0002e00000e2622e00000ee2222eeeeee2000022ee22222200000266ee2222622000000000 000000222ee0022000000226622ee0000000000000000222622ee000000000002222e00000002262eeeeee000000222222222600000222226222260000000000 00000022eee0022000000222222e00000000000000000222222e00000000000022ee000000022226000000000000222222222600000022222622220000000000 0000022eee0000200000000e22e00000000000000000000e22e00000000000000e00000002222200000000000000006622222260000000222222220000000000 0000022ee00000000000000222e00000000000000000000226e000000000000000000000000000000000000000000002222772200000000ee227720000000000 0000022e00000000000000002ee0000000000000000000002ee000000000000000000000000000000000000000000000eeec720000000000eeec720000000000 0006622e00000000000000000ee0000000000000000000000ee000000000000000000000000000000000000000000000eeee1200000000000ee1720000000000 0022226e00000000000000000000000000000000000000000000000000000000000000000022000000000000000000000eee2600000000000ee2220000000000 02222226000000000000000000000000000000000000000000000000000000000000000000262000000000000000000000ee26000000000000ee220000000000 022e022e0000000000000000000000000000000000000000000000000000000000200000002262000000000000000000000e620000000000000e200000000000 0200022e000000000000000000000000000000000000000000000000000000000222000000022622000000000000000000002200000000000000000000000000 00000020000000000000000000000000000000000000000000000000000000000262000000222626622000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000e26220002226222222220000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000002222262222666222277726200000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000222ee2662222222227c122620000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000ee00eeeee222222222eee2620000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000eeeeeee2222eeeeee00000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000eeee2262eeeee0000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000022226000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000222ee00000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000ee00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000e7e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000026000000000000000e00000002e7e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000002260000000000000eee0000000ee7ee0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000002e2260000000000000e7e0000002ee7e77ee0000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000022222200000000000002e7ee0002ee7eeeeeeee00000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000ee66222200000200000eeeee7eeee777eeee777e7e000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000eeee222260000260000eee22e77eeeeeeeee7c1ee7e00000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000ee6226200260000220022222eeeeeeeee222e7e00000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000ee2222222260000000002222222eeee222222000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000ee22222222000000000002222ee7e2222200000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000ee222266200000000000000eeee70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000ee2226222000000000000eee22000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000ee22222660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000222662222220000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000e22222227722000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000eee22222c72000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000002eee122000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000eeee26200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000eee22600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000ee2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 __label__ cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccc77cccccc77cccccccccccccccccccccccccccccccccccccccc77cccccccccccc77cccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccc77sccccc77sccccccccccccccccccccccccccccccccccccccc77sccccccccccc77sccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccc77s1cccc77s1cccccccccccccccccccccccccccccccccccccc77s1cccccccccccss1cccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccc77s1cccc77s1cccccccccccccccccccccccccccccccccccccc77s1cccccccccccc11cccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccc77s1cccc77s1cc77777777cccc777777cccccc77777777cc77777777cccccc7777cccccccc777777cccc77777777cccccccccccccccccccc cccccccccccccccc77s1cccc77s1cc77777777sccc777777sccccc77777777sc77777777sccccc7777sccccccc777777sccc77777777sccccccccccccccccccc cccccccccccccccc77s1cccc77s177csssss77s177csssss77cc77csssss77s1cs77sssss1cccccs77s1cccc77csssss77cc77ssssss77cccccccccccccccccc cccccccccccccccc77s1cccc77s177sc111177s177sc111177sc77sc111177s1cc77s11111cccccc77s1cccc77sc111177sc77s1111177sccccccccccccccccc cccccccccccccccc77s1cccc77s177s1cccc77s177s1cccccss177s1cccc77s1cc77s1cccccccccc77s1cccc77s1cccc77s177s1cccc77s1cccccccccccccccc cccccccccccccccc77s1cccc77s177s1cccc77s177s1cccccc1177s1cccc77s1cc77s1cccccccccc77s1cccc77s1cccc77s177s1cccc77s1cccccccccccccccc cccccccccccccccccs77cc77css177s1cccc77s177s1cccc77cc77s1cccc77s1cc77s1cccccccccc77s1cccc77s1cccc77s177s1cccc77s1cccccccccccccccc cccccccccccccccccc77sc77sc1177s1cccc77s177s1cccc77sc77s1cccc77s1cc77s1cccccccccc77s1cccc77s1cccc77s177s1cccc77s1cccccccccccccccc cccccccccccccccccccs77css1cccs77777777s1cs777777css1cs77777777s1cccs777777cc7777777777cccs777777css177s1cccc77s1cccccccccccccccc cccccccccccccccccccc77sc11cccc77777777s1cc777777sc11cc77777777s1cccc777777sc7777777777sccc777777sc1177s1cccc77s1cccccccccccccccc cccccccccccccccccccccss1cccccccssssssss1cccssssss1cccccssssssss1cccccssssss1cssssssssss1cccssssss1cccss1cccccss1cccccccccccccccc cccccccccccccccccccccc11cccccccc11111111cccc111111cccccc11111111cccccc111111cc1111111111cccc111111cccc11cccccc11cccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc2227ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc2227cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc22227cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc ccccccccccccccccccccccccccccccccccccccccccccccccccc22ccccccc277222772ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccc2272cccc2772222222222ccccccccccccccccccccccccccccccccccccccccccccccccccccccccc ccccccccccccccccccccccccccccccccccccccccccccccccccc2272772222222222777272ccccccccccccccccccccccccccccccccccccccccccccccccccccccc 111111111111111111111111111111111111111111111111111e2722222222222227c02272111111111111111111111111111111111111111111111111111111 11111111111111111111111111111111111111111111111111222222eee222222222eee272111111111111111111111111111111111111111111111111111111 11111111111111111111111111111111111111111111111111222eeeeeeeeee2222eeeeee1111111111111111111111111111111111111111111111111111111 11111111111111111111111111111111111111111111111111ittt1111ttttiiititttt111111111111111111111111111111111111111111111111111111111 11111111111111111111111111111111111111111111111111tt111111111iiiti11111111111111111111111111111111111111111111111111111111111111 111111111111111111111111111111111111111111111111111111111111iiii1111111111111111111111111111111111111111111111111111111111111111 11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 11h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h1 h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1 h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111 1h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h11 11h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h1 h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1 h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111 1h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h11 11h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h1 h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1 h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111 1h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h11 1hh11hh11hh11hh11hh11hh11hh11hh11hh11hh11hh11hh11hh11hh11hh11hh11hh11hh11hh11hh11hh11hh11hh11hh11hh11hh11hh11hh11hh11hh11hh11hh1 111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1 h11hh11hh11hh11hh11hh11hh11hh11hh11hh11hh11hh11hh11hh11hh11hh11hh11hh11hh11hh11hh11hh11hh11hh11hh11hh11hh11hh11hh11hh11hh11hh11h 1hh11hh11hh11hh11hh11hh11hh11hh11hh11hh11hh11hh11hh11hh11hh11hh11hh11hh11hh11hh11hh11hh11hh11hh11hh11hh11hh11hh11hh11hh11hh11hh1 111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h111h hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1 h1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hh hh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1h 1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h 1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh h1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hh hh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1hhh1h hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh h00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00h hhh0hhh0hhh0hhh0hhh0hhh0hhh0hhh0hhh0hhh0hhh0hhh0hhh0hhh0hhh0hhh0hhh0hhh0hhh0hhh0hhh0hhh0hhh0hhh0hhh0hhh0hhh0hhh0hhh0hhh0hhh0hhh0 000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h 0hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh0 h00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00h hhh0hhh0hhh0hhh0hhh0hhh0hhh0hhh0hhh0hhh0hhh0hhh0hhh0hhh0hhh0hhh0hhh0hhh0hhh0hhh0hhh0hhh0hhh0hhh0hhh0hhh0hhh0hhh0hhh0hhh0hhh0hhh0 000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h 0hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh00hh0 00h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h0 h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0 h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000 0h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h00 00h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h000h0 h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 __map__ 0606090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 1f1f1f1f1f1f1f0000001f1f1f00000000001f1b1f00000000001b041b00000000001b001b00000000001b1b1b00000000080c0e0c0800000002060e060200000f010101010000000000101010101e00110a041f041f04000000000e000000000000000000060c0000000000000c0c0000000a0a0000000000040a0400000000 000000000000000004040404040004000a0a000000000000000a1f0a0a1f0a00083e0b3e683e08000033180c063300000609091e090916000804000000000000080404040404080002040404040402000004150e150400000004041f0404000000000000000404020000001f0000000000000000000404001010080402010100 0e11191513110e000406040404041f000e11100804021f000e11100c10110e001212111f101010001f01010f10100f000e01010f11110e001f101008040404000e11110e11110e000e11111e10100e0000040400000404000004040000040402001806010618000000001f001f00000000030c100c0300000e11100804000400 0e19151519010e0000001e1111111e0001010f1111110f0000000e1101110e0010101e1111111e0000000e111f010e000c12020f0202020000001e11111e100e01010f11111111000400060404041f00100018101010110e01011109070911000302020202021c0000000f151515150000000f111111110000000e1111110e00 00000f11110f010100001e11111e101000000d130101010000001e010e100f0002020f0202021c000000111111111e0000001111110a04000000111115150a000000110a040a110000001111111e100e00001f0804021f000c04040404040c0001010204081010000c08080808080c00040a1100000000000000000000001f00 02040000000000000e1111111f1111000f11110f11110f000e11010101110e000f11111111110f001f01010f01011f001f01010f010101000e11011d11110e001111111f111111001f04040404041f001010101011110e0011090503050911000101010101011f00111b15111111110011111315191111000e11111111110e00 0f11110f010101000e111111150916000f11110f111111000e11010e10110e001f040404040404001111111111110e0011111111110a040011111111151b110011110a040a11110011110a04040404001f10080402011f000804040204040800040404000404040004080810080804000000120d000000000000000000000000 1f1f1f1f1f1f1f00150a150a150a150000111f15150e00000e1f111b0e110e00110411041104110002061e0e0f0c0800000e13131f170e00001b1f1f0e04000004110e1b1b0e1104000e0e001f0e0a0000040e1f151d00000e1b191b0e110e00000e1f151f110e00040c1414040703000e1115110e110e0000040e1b0e040000 00000015000000000e1b131b0e110e000000041f0e1b00001f110a040a111f000e1b111f0e110e00000502001408000008150200081502000e151b150e110e001f001f001f001f001515151515151500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 1e083c1106000000100c020c10000000227a2222120000001e2000023c000000083c10020c000000020202221c000000083e080c08000000123f12021c0000003c107e043800000002073202320000000f020e101c0000003e404020180000003e10080810000000083804023c00000032071278180000007a42020a72000000 093e4b6d660000001a272273320000003c4a494946000000123a123a1a000000236222221c0000000c00082a4d000000000c1221400000007d79113d5d0000003e3c081e2e00000006247e2610000000244e04463c0000000a3c5a46300000001e041e4438000000143e2408080000003a56523008000000041c041e06000000 08023e201c00000022222620180000003e1824723000000004362c26640000003e182442300000001a272223120000000e641c28780000000402062b1900000000000e1008000000000a1f120400000000040f150d00000000040c060e0000003e2014040200000030080e0808000000083e2220180000003e0808083e000000 107e181412000000043e242232000000083e083e080000003c24221008000000047c1210080000003e2020203e000000247e242010000000062026100c0000003e20101826000000043e240438000000222420100c0000003e222d300c0000001c083e08040000002a2a20100c0000001c003e080400000004041c2404000000 083e080804000000001c00003e0000003e2028102c000000083e305e08000000202020100e0000001024244442000000021e02021c0000003e2020100c0000000c12214000000000083e082a2a0000003e201408100000003c003e001e000000080424427e00000040281068060000001e041e043c000000043e240404000000 1c1010103e0000001e101e101e0000003e003e201800000024242420100000001414145432000000020222120e0000003e2222223e0000003e2220100c0000003e203c2018000000062020100e000000001510080600000000041e140400000000000c081e000000001c18101c00000008046310080000000810630408000000 04050700000100000000000000607700672000617700060600000000006677070100000060072700000010200070700000000110600020111000102100000671333313111333121333103333117766007600f1758f17677f7788767086182273ff8fff01ffffedff81ff8f7f8188f800ff8fff01ffffeeff88888808818888f0 0007070707070000000007070700000000000705070000000000050205000000000005000500000000000505050000000004060706040000000103070301000000070101010000000000040404070000000507020702000000000001000000000000000001020000000000000303000000050500000000000002050200000000 000000000000000000010101000100000005050000000000000a1f0a1f0a0000000207030607020000050402010500000002050e050e0000000101000000000000020101010200000001020202010000000502070205000000000207020000000000000000010100000000070000000000000000000100000004040201010000 0002050505020000000203020207000000030402010700000003040204030000000505070404000000070103040300000006010305020000000704040202000000020502050200000002050604030000000001000100000000000001000101000000020102000000000003000300000000000102010000000003040200020000 0006090d0106000000000306050700000001030505030000000006010106000000040605050600000000020503060000000402070202000000000605060403000001010305050000000100010101000000020002020201000001050305050000000101010102000000000f151515000000000305050500000000020505020000 000003050503010000000605050604000000030501010000000006030603000000020702020600000000090909060000000005050503000000001111150a000000000502050500000000050505060300000007060307000000030101010300000001020202040000000302020203000000020500000000000000000000070000 0002040000000000000205070505000000030503050300000006010101060000000709090907000000070103010700000007010301010000000e010d090600000005050705050000000101010101000000040404040502000005050305050000000101010107000000111b151111000000090b0f0d0900000006090909060000 0003050301010000000609090d06080000030503050500000006010204030000000702020202000000090909090600000009090905030000001111151b1100000005050205050000000505020202000000070402010700000006020102060000000101000101000000030204020300000000000a050000000003030000000000 007f7f7f7f7f7f0000752a752a752a0000617f5d5d3e0000003e6363773e0000001164116411640000021e0e0f080000000e171f1f0e0000001b1f1f0e040000001c3677361c0000000e0e1f0e0a0000001c3e7f2a3a0000003e6763673e0000003f2d3f213f0000001c040407070000003e636b633e000000040e1f0e040000 0000007500000000003e7363733e000000081c7f3e220000001f0e040e1f0000003e7763633e000000000572200000000000112a64000000003e6b776b3e0000001f001f001f00000015151515150000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000100010101000000040e050e0400000c0207020f000000110e0a0e11000000050502070200000001010001010000000603050603000000050000000000000006090d09060000000306050700000000001209120000000000000704000000000000000000000000030503050000000007000000000000 000205020000000000020702000700000003020103000000000103020100000000020100000000000000000505030100000f0b0b0a0a000000000001000000000000000000020300000203020200000000020502000000000000091209000000001109052a3920000011091d120918000021130a757240000000020002010600 000204030605070000020103060507000002050306050700000a0503060507000005000306050700000200030605070000000b160d1f00000000000e010e040000020402050306000002010205030600000205020503060000050002050306000001020000020200000201000001010000020500000202000005000000020200 000e1217120e0000000a050007090900000102000205020000040200020502000002050002050200000a0500060906000005000002050200000005020500000000100e15120d0000000204000909060000040200090906000006090009090600000900000909060000040200050506030001050b0b0501000006090509050000 000204020507050000020102050705000002050205070500000a0506090f090000050002050705000002000205070500001e050f051d0000000e0101010e040000020407030107000002010703010700000205070301070000050007030107000001020002020200000201000101010000020500020202000005000002020200 0002050e09090600000a05090b0d0900000204060909060000040206090906000002050609090600000a0506090906000009000609090600000200070002000000160915120d00000002040909090600000402090909060000020508090906000009000909090600000402050502020000010709090701000005000505020200 __sfx__ 950100003565035650356503565035610356103561035610356103561035610356100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0c0100003065030610306103061000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0e1000010d21000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0f1000010c21000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 310800002b5452b5002b5002b500005000050000500275001c535245351a50001500005000050000500005003055024555187301f730137301373013720137100750007500075000750000500005000050000500 010800002b545000000000000000000000000000000000001c535245350000000000000000000000000000003055024555187301f730137301373013720137100000000000000000000000000000000000000000 480c00002b53518045305503054030530305203051000500005000050000500005000050000500005000050000500005000050000500005000050000500005000050000500005000050000500005000050000500 290800000c5751f575245750c5551f555245550c5351f535245350c5151f515245150050500505005050050500505005050050500505005050050500505005050050500505005050050500505005050050500505 00030000016300d6311c6213162121621166310d63108631046250262101614006240000400004000040000400004000040000400004000040000400004000040000400004000040000400004000040000400000 00030000016400d0411d0413104114620186311b6211c6351c6151a6111a6141a61400004000040000400004016401e0411004106041126311362117631186111861515611156141561400004000040000400004 010300003163029620236101e6101961014610106100d6100b6100961007610066100561004613036130361300605006050060500605006050060500605006050060500605006050060500000000000000000000 10030000285502b55030550285102b510305100050000500005000050000500005000050000500005000050000500005000050000500005000050000500005000050000500005000050000500005000050000500 0014001024850189201992024850189201992024850189201992018920248500c9201992024850189201992000000000000000000000000000000000000000000000000000000000000000000000000000000000 010a0020067500675000700007000a7500a7500475004750007000070000700007000070000700087500875002750027500070000700067500675001750017500070000700007000070000700007000070000700 010a00000575005750057500575005750057500575005750057500575005750057500000000000000000000005750057500575005750057500575005750057500575005750057500575000000000000000000000 010a00000675006750067500675006750067500675006750067500675006750067500000000000000000000006750067500675006750067500675006750067500675006750067500675000000000000000000000 010a00000675006750067500675006750067500675006750067500675006750067500000000000097500975009750097500975009750097500975009750097500000000000000000000000000000000000000000 010a000006750067500675006750067500675006750067500675006750067500675000000000000a7500a75000000000000a7500a75000000000000a7500a75000000000000a7500a75000000000000a7500a750 010a00000575005750057500575005750057500575005750057500575005750057500000000000087500875000000000000875008750000000000008750087500000000000087500875000000000000875008750 010a00002a0502a05000000000002e0502e05031050310500000000000000000000000000000002e0502e05031050310500000000000330503305031050310500000000000000000000000000000000000000000 010a0000330503305031050310502e0502e0502a0502a0502e0502e05031050310500000000000330503305000000000003105031050310403104031030310303102031020310103101000000000000000000000 010a0000330503305031050310502e0502e0502a0502a0502e0502e050310503105000000000002c0502c05000000000002a0502a0502a0402a0402a0302a0302a0202a0202a0102a01000000000000000000000 010a00002a0502a05000000000002e0502e05031050310500000000000000000000000000000002e0502e05036051360503300033000330503305031050310500000000000000000000000000000000000000000 010a0000360503605000000000002e0502e0502a0512a0502e0512e05031050310500000000000360503605000000000003305033050310503105000000000002e0502e050000000000025050250502705027050 010a000027054270502e0502e05025050250502e0502e0502c0502c0502e0502e0502c0502c05029050290502a0502a0502a0402a0402a0302a0302a0202a0100000000000000000000025050250502705027050 010a00002905029050290502905029050290502c0502c05000000000002c0502c05000000000002c0502c05000000000002c0502c05000000000002c0502c05000000000002c0502c05000000000002c0502c050 010a00002a0502a0502a0502a0502a0502a0502e0502e05000000000002e0502e05000000000002e0502e05000000000002e0502e05000000000002e0502e05000000000002e0502e05000000000002e0502e050 010a00002a0502a0502a0502a0502a0502a0502e0502e05000000000002e0502e05000000000002d0502d0502d0502d0502d0502d050000000000000000000000000000000000000000025050250502705027050 010a00002a0502a0502a0502a0502a0502a0502e0502e05000000000002e0502e050000000000031050310503105031050310503105000000000000000000000000000000000000000002e0502e0502c0502c050 010a00000675006750067500675006750067500675006750067500675006750067500000000000017500175001750017500175001750017500175001750017500000000000000000000000000000000000000000 a9120020060400604000700007000a0400a0400404004040007000070000700007000070000700080400804002040020400070000700060400604001040010400070000700007000070000700007000070000700 0f1000010db4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0f1000010cb4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0f1000010db7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0f1000010cb7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 __music__ 01 10111744 00 10111844 00 10111744 00 10111944 00 10111a44 00 10111844 00 10111b44 00 10111c44 00 10121d44 00 10131e44 00 10121d44 00 10141f44 00 10161d44 00 10151e44 00 10161d44 02 10212044 03 22636444 03 22232444 03 22252544 03 22252644 03 41252644 03 41232444