pico-8 cartridge // http://www.pico-8.com version 42 __lua__ -- grawitacja 2025 -- dinosaur + spider -- copyrights: krzycho ---------------------- cartdata("dino_hunt") -- disable repetead btnp triggers poke(0x5f5c,255) -- enble inverted fills, add +6144 to color to use it poke(0x5f34, 0x2) dt = 1/30 cam = nil debug = "" printdebug = false draw = nil update = nil start_timestamp = -1 start_movetime = 2 function _init() actors = {} draw = draw_menu make_bonfire(50, 64) update = update_menu music(0) end function _update() if update then update() end end function _draw() cls(3) camera(-64,-64) fillp(0b11101111101111111110.1) circfill(0,0,129*0.5,5+6144) fillp(0b10101011100111110110.1) circfill(0,0,155*0.5,5+6144) fillp() draw() end function init_menu() end function init_gameplay() make_egg(64+rnd_symetrical(20),70+rnd(20)) make_egg(64+rnd_symetrical(50),90+rnd(20)) make_dino(64+rnd_symetrical(40),120+rnd(15)) make_player(64, 90) make_camera(player) end function draw_menu() local move_factor = 0 if start_timestamp > 0 then move_factor = (time()-start_timestamp)/start_movetime move_factor *= move_factor camera(0,move_factor*180) else camera(0,0) end pal(9,2) pal(10,1) draw_logo(30, 30+2+sin(time()*0.2)*5) pal() draw_logo(30, 30+sin(time()*0.2)*5) print("press start", 41, 81, 1) print("press start", 41, 80, (sin(time()*3)*0.5+1)*3+8) print("krzycho 2025", 40, 4, 5) if player then camera(0,lerp(-70,player.y-64,move_factor)) else camera(0,-70) end foreach(actors, draw_actor) for bonfire in all(bonfires) do draw_bonfire_smoke(bonfire) end end function draw_game() update_camera(cam) foreach(actors, draw_actor) for bonfire in all(bonfires) do draw_bonfire_smoke(bonfire) end --draw_camera(cam) camera(0,0) rectfill(0,0,128,8,8) line(0,8,128,8,2) print("score: " .. player.score, 1,1, 15) if printdebug then camera(0,1) print(debug) end end function update_menu() if (btnp(4) or btnp(5)) and start_timestamp < 0 then start_timestamp = time() init_gameplay() sfx(5) end if start_timestamp > 0 then if time() - start_timestamp > start_movetime then update = update_game draw = draw_game end end end function update_game() --debug = "" foreach(actors, update_actor) player_solve_dinos_collision(player) end --> 8 -- utils -------- function deepcopy(orig) local orig_type = type(orig) local copy if orig_type == 'table' then copy = {} for orig_key, orig_value in next, orig, nil do copy[deepcopy(orig_key)] = deepcopy(orig_value) end else -- number, string, boolean, etc copy = orig end return copy end function lerp(x,y,t) return y*t+x*(1.0-t) end function rnd_symetrical(x) return rnd(x*2)-x end function vector_len(x, y) return sqrt(x*x+y*y) end function vector_normalize(x, y, size) size = size or 1 local v_len = vector_len(x,y) x = x/v_len * size y = y/v_len * size return x, y end function actors_dist(a1, a2) return vector_len(a1.x-a2.x, a1.y-a2.y) end -- left top corner and full height and width function aabb(x1,y1,w1,h1,x2,y2,w2,h2) x1 += w1*0.5 y1 -= h1*0.5 x2 += w2*0.5 y2 -= h2*0.5 local dx = x1 - x2 local dy = y1 - y2 if (abs(dx) < (w1+w2)*0.5 ) then if (abs(dy) < (h1+h2)*0.5 ) then return true end end return false end function actor_collides_type(a, col_type) for a2 in all(actors) do if a2.col_type == col_type then if actor_collides_actor(a, a2) then return true, a2 end end end return false end function actor_collides_actor(a1, a2) if a1.col_shape == col_shape_rect and a2.col_shape == col_shape_rect then if aabb(a1.x, a1.y, a1.w, a1.h, a2.x, a2.y, a2.w, a2.h) then return true end end end -->8 -- commons ---------- actors = {} cam = nil col_shape_circle = 1 col_shape_rect = 2 col_type_player = 1 col_type_spider = 2 col_type_egg = 3 col_type_bonfire = 4 col_type_dino = 5 -- positioned bottom left corner function make_actor(x, y, col_type, w, h) local a = {} a.x=x a.y=y a.dx=0.0 a.dy=0.0 a.x_loc=0 a.y_loc=0 a.xr=0.0 a.yr=0.0 a.t = t -- type a.w = w or 8 a.h = h or 8 -- half-width a.sprite = nil -- sprite a.s_flip_x = false a.s_flip_y = false a.col_type = col_type a.col_shape = col_shape_rect a.update = nil a.child_actors = {} -- [{a, dx, dy}] add(actors, a) return a end function draw_actor(a) if a.draw then a.draw(a) elseif a.sprite then draw_actor_sprite(a) else rectfill(a.x, a.y-a.h, a.x+a.w, a.y, a.color) end end function draw_actor_sprite(a, ox, oy) ox = ox or 0 oy = oy or 0 --rectfill(a.x, a.y-a.h, a.x+a.w, a.y, a.col_type) spr(a.sprite.s, a.x+a.w*0.5-a.sprite.w*8*0.5+ox, a.y-a.h*0.5-a.sprite.h*8*0.5+oy, a.sprite.w, a.sprite.h, a.s_flip_x, a.s_flip_y) end function update_actor(a) if a.update then a.update(a) end for child in all(a.child_actors) do child.x = a.x + child.x_loc child.y = a.y + child.y_loc end end function set_parent(a, parent) local dx = a.x - parent.x local dy = a.y - parent.y a.x_loc = flr(dx) a.y_loc = flr(dy) add(parent.child_actors, a) end function make_camera(a) local c = {} c.x = a.x - 64 c.y = a.y - 64 c.dx = 0 c.dy = 0 c.dump = 0.8 c.w = 15 c.h = 15 c.target_x = c.x c.target_y = c.y c.forwarding = false c.follow_actor = a cam = c return c end function update_camera(cam) if cam.follow_actor == nil then return end local fa_corrected_x = cam.follow_actor.x + cam.follow_actor.w*0.5 local fa_corrected_y = cam.follow_actor.y - cam.follow_actor.h*0.5 local dx = cam.x - fa_corrected_x + 64 local dy = cam.y - fa_corrected_y + 64 local forward_factor = 1 if cam.follow_actor.dash_timestamp > 0 and time() - cam.follow_actor.dash_timestamp < 0.1 then forward_factor = -0.5 end cam.target_x = fa_corrected_x + cam.follow_actor.dx - 64 cam.target_y = fa_corrected_y + cam.follow_actor.dy - 64 cam.dx *= cam.dump*(1-dt) cam.dy *= cam.dump*(1-dt) if not (btn(0) or btn(1) or btn(2) or btn(3)) then cam.forwarding = false end if abs(dx) > cam.w or cam.forwarding then cam.forwarding = true cam.dx += cam.follow_actor.dx * 0.5 * forward_factor end if abs(dy) > cam.h or cam.forwarding then cam.forwarding = true cam.dy += cam.follow_actor.dy * 0.5 * forward_factor end cam.x += cam.dx*dt cam.y += cam.dy*dt cam.x = min(max(cam.x, fa_corrected_x - cam.w - 64), fa_corrected_x + cam.w - 64) cam.y = min(max(cam.y, fa_corrected_y - cam.h - 64), fa_corrected_y + cam.h - 64) camera(cam.x, cam.y) --debug = tostr(flr(dx)) .. " " .. tostr(flr(dy)) .. " t: " .. tostr(flr(cam.target_x)) .. " " .. tostr(flr(cam.target_y)) end function draw_camera(cam) rect(cam.x-cam.w+64, cam.y-cam.h+64, cam.x+cam.w+64, cam.y+cam.h+64, 9) pset(cam.target_x+64, cam.target_y+64, 9) end -->8 -- player --------- player = nil function make_player(x, y) local p = make_actor(x, y, col_type_player) p.a = 300 -- acceleration p.a_dash = 1000 p.dash_timestamp = -1 p.dash_time = 0.3 p.dash_delay = 0.6 p.dash_max_speed = 70 p.max_speed = 30 p.dump = 0.8 p.egg_min_dist = 20 p.egg_carried = nil p.draw = draw_player p.update = update_player p.score = 0 p.is_alive = true p.death_timestamp = -1 p.death_delay = 4 p.is_safe = false p.dir_x = 0 p.dir_y = -1 p.color = 2 p.body_part1_offset = -2 p.body_part2_offset = 8 -- in local coords p.legs = {{x=-12, y=2},{x=-12, y=-3},{x=-10, y=9},{x=-6, y=-8}, {x=12, y=2},{x=12, y=-3},{x=10, y=9},{x=6, y=-8}} -- in world coords p.legs_current = player_calculate_legs(p) p.legs_t = {-1,-1,-1,-1,-1,-1,-1,-1} p.leg_move_speed = 12 p.leg_max_dist = 8 player = p return p end function player_calculate_legs(p) local px, py px = p.x + p.w*0.5 py = p.y - p.h*0.5 + p.body_part1_offset local dir_x, dir_y = vector_normalize(p.dir_x, p.dir_y, p.body_part2_offset) local px2, py2 = px-flr(dir_x), py-flr(dir_y) local angle = atan2(dir_y, dir_x) local sin_a = -sin(angle) local cos_a = cos(angle) local legs = {} for leg in all(p.legs) do local lx = cos_a*leg.x - sin_a*leg.y local ly = sin_a*leg.x + cos_a*leg.y add(legs,{x=lx+px2, y=ly+py2}) end return legs end function player_moving_legs(p) local legs_org_rotated = player_calculate_legs(p) for i = 1,#legs_org_rotated do local leg_org_rotated = legs_org_rotated[i] local leg_current = p.legs_current[i] local leg_t = p.legs_t[i] if leg_t < 0 then local leg_dist = vector_len(leg_org_rotated.x-leg_current.x, leg_org_rotated.y-leg_current.y) if leg_dist > p.leg_max_dist + rnd_symetrical(5) then leg_t = 0 p.legs_t[i] = leg_t end else leg_t += p.leg_move_speed*dt p.legs_t[i] = leg_t end if leg_t >= 0 then local reset = false if leg_t >= 0.9 then leg_t = 1 reset = true end leg_current.x = lerp(leg_current.x, leg_org_rotated.x, leg_t) leg_current.y = lerp(leg_current.y, leg_org_rotated.y, leg_t) p.legs_current[i] = leg_current if reset then p.legs_t[i] = -1 end end end end function draw_player(p) --rectfill(p.x, p.y-p.h, p.x+p.w, p.y, p.color) local px, py px = p.x + p.w*0.5 py = p.y - p.h*0.5 + p.body_part1_offset local dir_x, dir_y = vector_normalize(p.dir_x, p.dir_y, p.body_part2_offset) local px2, py2 = px-flr(dir_x), py-flr(dir_y) circfill(px, py, p.w*0.5, p.color) circfill(px2, py2, p.w*0.5+2, p.color) fillp(0b10100101101001011010.1) local extra_color = 8 if p.is_safe then extra_color = 9 end circfill(px2+1, py2+1, p.w*0.5, extra_color) fillp() for leg in all(p.legs_current) do line(leg.x, leg.y, px2, py2, p.color) end end function update_player(p) if not p.is_alive then return end move_player(p) player_moving_legs(p) egg_grab(p) end function move_player(p) local x_input = 0 local y_input = 0 if btn(0) then --left x_input -= 1 end if btn(1) then --right x_input += 1 end if btn(2) then --up y_input -= 1 end if btn(3) then --down y_input += 1 end p.dx *= p.dump*(1-dt) p.dy *= p.dump*(1-dt) local acceleration local max_speed if btnp(5) and time() - p.dash_timestamp > p.dash_delay then p.dash_timestamp = time() acceleration = p.a_dash else acceleration = p.a end if time() - p.dash_timestamp > p.dash_time then max_speed = p.max_speed acceleration = p.a --debug = "no dash" else --debug = "dash" max_speed = p.dash_max_speed acceleration = p.a_dash end p.dx += x_input*acceleration*dt p.dy += y_input*acceleration*dt if vector_len(p.dx, p.dy) > 0.5 then p.dir_x = p.dx p.dir_y = p.dy end local speed = vector_len(p.dx, p.dy) --debug = tostr(speed) if speed > max_speed then p.dx /= speed p.dy /= speed p.dx *= max_speed p.dy *= max_speed end if x_input == 0 and abs(p.dx) < 0 then p.dx = 0 end if y_input == 0 and abs(p.dy) < 0 then p.dy = 0 end p.x += p.dx*dt p.y += p.dy*dt p.is_safe = actor_collides_type(p, col_type_bonfire) end function egg_grab(p) if not btnp(4) then return end -- drop if p.egg_carried then if actor_collides_type(p.egg_carried, col_type_bonfire) then burn_egg(p.egg_carried, p) end del(player.child_actors, p.egg_carried) player.egg_carried = nil -- grab else local closest_egg = nil local closest_dist = -1 local collides, colliding_egg collides, colliding_egg = actor_collides_type(p,col_type_egg) if colliding_egg then sfx(3) player.egg_carried = colliding_egg colliding_egg.is_grabbed = true set_parent(colliding_egg, player) end end end function player_add_score(p, score) p.score += score --dset(0, ) end function player_die(p) p.is_alive = false p.death_timestamp = time() make_death_actor(p) sfx(4) end function player_solve_dinos_collision(p) if p.is_safe or not p.is_alive then return end for dino in all(dinos) do if actor_collides_actor(p, dino) then player_die(p) return end end end function make_death_actor(p) local d = make_actor(p.x, p.y) d.update = update_death d.draw = draw_death d.death_timestamp = p.death_timestamp d.death_delay = p.death_delay d.player_x = p.x d.player_y = p.y d.game_reinitialized = false return d end function update_death(d) if time() - d.death_timestamp > d.death_delay*0.5 and not d.game_reinitialized then actors = {} player = nil bonfires = {} dinos = {} eggs = {} make_bonfire(50, 64) init_gameplay() add(actors,d) --update = nil d.game_reinitialized = true end if time() - d.death_timestamp > d.death_delay then del(actors, d) end end function draw_death(d) local death_dt = time() - d.death_timestamp local factor = 0 if death_dt < d.death_delay*0.25 then factor=1-death_dt/(d.death_delay*0.25) factor = min(factor, 1) circfill(d.player_x,d.player_y,150*factor, 1+6144) else factor=(death_dt-d.death_delay*0.5)/(d.death_delay*0.5) factor=max(factor,0) circfill(64,90,150*factor, 1+6144) end for i=0,40*(1-death_dt/(d.death_delay-1)) do local dest = flr(rnd(0x1f00)) + 0x6040 local src = dest + flr(rnd(0x4)-0x2) local len = flr(rnd(0x80)+0x40) memcpy(dest,src,len) end end -->8 -- egg ------ eggs = {} max_eggs = 4 function make_egg(x, y) if #eggs >= 4 then return nil end local e = make_actor(x, y, col_type_egg, 10, 10) e.burning = false e.time_updated = time() e.egg_resize_interval = 3+rnd(2) e.size = 1 e.size_max = 4 e.is_grabbed = false e.color = 15 e.update = update_egg e.sprites = {} add(e.sprites, {s=3, w=1, h=1}) add(e.sprites, {s=4, w=1, h=2}) add(e.sprites, {s=5, w=2, h=2}) add(e.sprites, {s=7, w=2, h=2}) e.sprite = e.sprites[1] add(eggs, e) sfx(6) return e end function update_egg(e) if e.is_grabbed then return end local dt_update = time() - e.time_updated if dt_update > e.egg_resize_interval then e.size += 1 e.sprite = e.sprites[e.size] if e.size > e.size_max then sfx(7) make_dino(e.x+e.w*0.5-2, e.y-e.h*0.5) del(eggs, e) del(actors, e) return end e.time_updated = time() e.w += 2 e.h += 2 e.x -= 1 e.y += 1 end end function burn_egg(e, p) sfx(2) e.burning = true if p then player_add_score(p, e.size) end del(actors,e) del(eggs,e) end -->8 -- bonfire ---------- bonfires = {} function make_bonfire(x, y) local f = make_actor(x, y, col_type_bonfire, 20, 20) f.sprite = {s=1, w=2, h=1} f.draw = draw_bonfire add(bonfires, f) return f end function draw_bonfire(b) local bx, by = b.x+b.w*0.5, b.y-b.h*0.5 fillp(0b1111111110111110.1) circfill(bx, by, b.h*0.5+(sin(time()*0.3)*0.5+1)*10,9) fillp(0b10100101101001011010.1) circfill(bx, by, b.h*0.5+(sin(time()*0.3)*0.5+1)*3,9) fillp() draw_actor_sprite(b) --draw_bonfire_smoke(b) end function draw_bonfire_smoke(b) local bx, by = b.x+b.w*0.5, b.y-b.h*0.5 for i=1,20 do local factor = (time()*30+sin(i*0.13)*20)%50 circfill(bx+sin(i*0.1)*6+sin(factor/50+(time()+i)*0.1)*3,by-factor, 3+2*(-sin(factor/50)), 6) end end -->8 -- dino ------- dinos = {} function make_dino(x, y) local d = make_actor(x, y, col_type_dino, 8, 10) d.dx, d.dy = 0, 0 d.attach_speed = 33 d.wander_speed = 15 d.update = update_dino_wandering d.draw = draw_dino d.sprites = {} add(d.sprites, {s=9, w=2, h=2}) add(d.sprites, {s=11, w=2, h=2}) add(d.sprites, {s=13, w=2, h=2}) add(d.sprites, {s=41, w=2, h=2}) d.sprite = d.sprites[1] d.attack_timestamp = -1 d.attack_delay = 0.7 d.attack_min_dist = 50 d.attack_max_dist = 65 d.attack_last_contact_timestamp = -1 d.attack_max_wating_time = 3 d.jump_offset = 0 d.jump_size = 10 d.wander_target = {} d.wander_target.x = d.x d.wander_target.y = d.y d.wander_target_distance = 40 d.wander_target_reached_dist = 2 d.wander_target_reached_timestamp = -1 d.wander_target_wait = 2 d.wander_target_max_dist_to_player = 110 d.new_egg_probability = 0.4 d.targets = 0 dino_generate_target(d) add(dinos, d) return d end function draw_dino(d) local y_offseted = d.y + d.jump_offset --rectfill(d.x, y_offseted-d.h, d.x+d.w, y_offseted, d.col_type) --pset(d.wander_target.x, d.wander_target.y, d.col_type) d.s_flip_x = d.dx > 0 local index = flr((time()*8)%4+1) if abs(d.dx) > 0.5 or abs(d.dy) > 0.5 then d.sprite = d.sprites[index] end draw_actor_sprite(d, 0, d.jump_offset) if d.jump_offset < 0 then line(d.x+2, d.y, d.x+d.w-2, d.y, 5) end end function update_dino_wandering(d) local target_dist = vector_len(d.x-d.wander_target.x, d.y-d.wander_target.y) -- target reached if target_dist < d.wander_target_reached_dist then dino_generate_target(d) if rnd(100)/100 <= d.new_egg_probability or #eggs == 0 or (#eggs<3 and #dinos<3) then make_egg(d.x, d.y) end else update_dino_check_attach(d) -- chilling before going for next target if time() - d.wander_target_reached_timestamp < d.wander_target_wait then return end -- walk towards next target local t_dx = d.wander_target.x - d.x local t_dy = d.wander_target.y - d.y t_dx, t_dy = vector_normalize(t_dx, t_dy, d.wander_speed) d.dx = t_dx*dt d.dy = t_dy*dt d.x += d.dx d.y += d.dy end end function dino_generate_target(d) d.wander_target_reached_timestamp = time() local angle = rnd(360)/360 local new_wander_target_x = d.wander_target.x + sin(angle)*d.wander_target_distance local new_wander_target_y = d.wander_target.y + cos(angle)*d.wander_target_distance if player then local target_player_dist = vector_len(new_wander_target_x-player.x, new_wander_target_y-player.y) -- generate target closer to player if new one is too far if target_player_dist > d.wander_target_max_dist_to_player then local to_player_dx = player.x - d.x + rnd_symetrical(20) local to_player_dy = player.y - d.y + rnd_symetrical(20) to_player_dx, to_player_dy = vector_normalize(to_player_dx, to_player_dy, d.wander_target_distance) d.wander_target.x += to_player_dx d.wander_target.y += to_player_dy return end end d.wander_target.x = new_wander_target_x d.wander_target.y = new_wander_target_y end function update_dino_check_attach(d) if d.attack_timestamp < 0 then if not player.is_safe and actors_dist(d,player) < d.attack_min_dist then --d.h += 5 d.attack_timestamp = time() d.update = update_dino_attack_player_start end end end function update_dino_attack_player_start(d) local dt_attack_timestamp = time() - d.attack_timestamp if dt_attack_timestamp >= d.attack_delay then d.jump_offset = 0 d.update = update_dino_attack_player d.attack_timestamp = -1 else d.jump_offset = sin(dt_attack_timestamp/d.attack_delay*0.5) * d.jump_size end end function update_dino_attack_player(d) local dist_to_player = actors_dist(d, player) if not player.is_alive or player.is_safe or dist_to_player >= d.attack_max_dist then if d.attack_last_contact_timestamp < 0 then d.attack_last_contact_timestamp = time() elseif time() - d.attack_last_contact_timestamp > d.attack_max_wating_time then d.update = update_dino_wandering d.attack_last_contact_timestamp = -1 --d.h -= 5 end return end local p_dx = player.x - d.x local p_dy = player.y - d.y p_dx, p_dy = vector_normalize(p_dx, p_dy, d.attach_speed) d.dx = p_dx*dt d.dy = p_dy*dt d.x += d.dx d.y += d.dy end -->8 -- home ------- function draw_logo(x,y) spr(48, x, y, 8, 6) end __gfx__ 0000000000098aa8aaaaa90000ffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000099aaa9aaa88aa900ffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 007007009aaa9a98a8a88aaaffffffff0000000000000ffffff0000000000ffffff0000000000000000000000011110000000000000000000000000000000000 000770009998aaaaa8aa8999ffffff6f000000000000fffff6ff00000000fffff6ff000000011000000000000111112000000000000110000000000000000000 00077000099aa8aaaa8aa9a0ffffffff00000000000ffffffffff000000ffffffffff00000111120000000000911911200000000001111200000000000000000 0070070009a99999aaaa9a90fffff6ff00000000000ffffffffff000000ff222fffff00009119112000000000111111200000000091191120000000000000000 0000000000999999999999900ffffff000ffff0000fffffffff6ff0000ff22fffff6ff0001111112000000000111111200000010011111120000000000000000 000000000000a9aaaa99000000f66f000fff6ff000ffffffffffff0000f22fffffffff0005555112000000000555511120000010055551120000000000000000 012300000000000000000000000000000ffffff000ffffffffffff000022ffffffff220000111111200000100000111120000210001111112000001000000000 45670000000000000000000000000000ffffffff00ffffffff6fff00002f22ff2f62220000001111100002100000111112021200000011111000021000000000 89ab0000000000000000000000000000ffffff6f00fffff6ffffff00002ffff6f2222f0000001111120212100002111111111000000011111202121000000000 cdef0000000000000000000000000000ffffffff00f6ffffff6f6f0000f6fffff26f6f0000021111111211000000221111111000000211111112110000000000 00000000000000000000000000000000fff6ffff00ffffffffffff0000ffffff2fffff0000000211111110000000001111110000000002111111100000000000 00000000000000000000000000000000fffff6ff000fff6ff6fff000000fff62f6fff00000002011111100000000002211200000000020111111000000000000 0000000000000000000000000000000006fffff00000ffff666f00000000ffff666f000000000002112000000000000000200000000000021120000000000000 0000000000000000000000000000000000f66f0000000f6666f0000000000f6666f0000000000022022000000000000002000000000000220220000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000111100000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000001111120000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000009119112000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000001111112000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000001111112000000100000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000005555111200000100000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000900000000000000001111200002100000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000a999999000000000000001111120212000000000000000000000000000000000000000000 000000000000000000000000000000000000000000009a9000000099a99999900000000000021111111110000000000000000000000000000000000000000000 0a9900099999000000000000000000a090000000000a9990000009a9999999990000000000002211111110000000000000000000000000000000000000000000 9a9a99999999990000000a99000009aa999000000009a99000009999999999990000000000000011111100000000000000000000000000000000000000000000 a9a99999999999990000a9a90000aaa99a990000000999900009a999000099990000000000000012112000000000000000000000000000000000000000000000 0a9a9999999999999000a99900000a9a999990000009999000099999000099990000000000000002002000000000000000000000000000000000000000000000 0999999900009999900099a990000099999a990000099990009a9990000099990000000000000020000000000000000000000000000000000000000000000000 0999990000000999990009999000009a99999990009999900999a900000099990000000000000000000000000000000000000000000000000000000000000000 00a999000000099999000a999000009a99999999009999900a999900000099990000000000000000000000000000000000000000000000000000000000000000 00999900000000999900099990000099990999990099990009999000000099990000000000000000000000000000000000000000000000000000000000000000 009a999000000099999009a990000099990099999099990009999000000099990000000000000000000000000000000000000000000000000000000000000000 000999900000000999900a9990000099990099999099990009999000000099990000000000000000000000000000000000000000000000000000000000000000 000a999000000009999009a9990000a9990009999999990009999000000099990000000000000000000000000000000000000000000000000000000000000000 0009a999000000099990099999000099990009999999990009999000000099990000000000000000000000000000000000000000000000000000000000000000 0000999900000009999000999900009999000099999999000999900000009a990000000000000000000000000000000000000000000000000000000000000000 0000999900000099999000999900009a999000999999990009999000000a99990000000000000000000000000000000000000000000000000000000000000000 00009a99000a9a999990009999000099999000099999990009999000000a99990000000000000000000000000000000000000000000000000000000000000000 00009999009a99999900000999000009a9900000999999000999900000aa99900000000000000000000000000000000000000000000000000000000000000000 000099990aa999999000000000000000a9900000999990000999990000a999900000000000000000000000000000000000000000000000000000000000000000 00009999aa99999000000000000000000000000009999000099999000a99a9000000000000000000000000000000000000000000000000000000000000000000 00009999a99990000000000000000000000000000099900000999999999990000000000000000000000000000000000000000000000000000000000000000000 00009999999000000000000000000000000000000000000000999999999990000000000000000000000000000000000000000000000000000000000000000000 000099990900000000000000000000099900000000000000000999a99a9900000000000000000000000000000000000000000000000000000000000000000000 000009990000000000000009990000a9990000000000000000009999999000000000000000000000000000000000000000000000000000000000000000000000 00000000000000009990009aa900009a990009000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000aa99009a99900009999009a9900000a9900000000000a9a000000000000000000000000000000000000000000000000000000000000000000 000000000000000999900a9a990000a9990aa99990009999000a9a999aa999990000000000000000000000000000000000000000000000000000000000000000 000099900000000aa99009a99000009a99009aa99900a9a9009a9aa9a99a99a90000000000000000000000000000000000000000000000000000000000000000 000a9a900000000a9a900999900000a9a900a9999900999909a9a999999999990000000000000000000000000000000000000000000000000000000000000000 000a999000000009a9900a99900000999900aa999990999900999999999990000000000000000000000000000000000000000000000000000000000000000000 0009a99000000009999009999000009a990099999990a99900000099999000000000000000000000000000000000000000000000000000000000000000000000 00099990000a990999900a9990000099990099a99999a99900000099999000000000000000000000000000000000000000000000000000000000000000000000 000aa990a9a9999a9990099990000a999900a9999999999900000009999000000000000000000000000000000000000000000000000000000000000000000000 00099999a999999999900999900009a9900099999999999900000009999000000000000000000000000000000000000000000000000000000000000000000000 000a999a9999999a999009999000999990009a990999999000000009999000000000000000000000000000000000000000000000000000000000000000000000 0009a99999999009999009999900aa99900099990999999000000009999000000000000000000000000000000000000000000000000000000000000000000000 00099999990000099990099999a99999000099990099999000000009999000000000000000000000000000000000000000000000000000000000000000000000 000099990000000999900099999999990000a9990099999000000009999000000000000000000000000000000000000000000000000000000000000000000000 00009999000000099990000999999990000099990009999000000009999000000000000000000000000000000000000000000000000000000000000000000000 000a9999000000009990000099999900000009990000999000000009999000000000000000000000000000000000000000000000000000000000000000000000 00099999000000000000000000000000000000000000000000000000999000000000000000000000000000000000000000000000000000000000000000000000 009a9990000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00099990000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 __sfx__ 0110001f0054313703007030e7030055313703007030e7030054313703007030e7030055313703007030e7030054313703007030e7030055313703007030e7030054313703007030e70300553137030000000000 011000200043500425004150041500405004350042500415004350042500415004150040500435004250041500435004250041500415004050043500425004150043500425004150041500405004350042500415 0109000024037290372d037240370261002610026100261002610026100261002610197001b7001a7001e7001f7002070021700237002770029700247001d7001b70019700187001770017700000000000000000 4d0200000655508545095350b5250c5150d5150050000500005000050000500005000050000500005000050000500005000050000500005000050000500005000050000500005000050000500005000050000500 01030000362302b230192300f23009230032300223000230362302b230192300f23009230032300223000230362202b220192200f22009220032200222000220362102b210192100f21009210032100221000210 011000002453632536285360030000300003000030000300003000030000300003000030000300003000030000300003000030000300003000030000300003000030000300003000030000300003000030000300 010200000775007750067400573005720127100070000700007000070000700007000070000700007000070000700007000070000700007000070000700007000070000700007000070000700007000070000700 010300000c6500c6400c3400c6300c2200c1100021500615000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 011000001a0000000000000000001c0000000500005000051d0000000000005000050000500005000050000500005000050000500005000050000500005000050000500005000050000500005000050000500005 __music__ 00 00014344 00 00014344 02 00014944