pico-8 cartridge // http://www.pico-8.com version 16 __lua__ --advanced micro platformer --@matthughson --if you make a game with this --starter kit, please consider --linking back to the bbs post --for this cart, so that others --can learn from it too! --enjoy! --@matthughson -- 1-1 features remaing: -- -- [!]lives/game over/press start -- [!]transition to next level -- [!]flag pole -- [!]items in blocks -- [!]mushroom -- [!]flower -- [!]star -- [!]coin blocks -- [!]default coin -- [!]dont smash bricks that contain stuff. -- [!]1up -- [!]flower power -- [!]star -- [!]pipe travel -- [!]turtle enemy -- [!]coins -- checkpoints -- [!]hidden blocks -- [?]points -- [!]palette swap level tiles -- [!]bounce mushrooms -- -- offscreen markers for pits -- offscreen markers for items -- jump height tuning -- [!]prevent movement off edge of map -- [!]prevent walking backwards too far -- 1-2 features remaining: -- -- [!] pipes -- level end -- warp zone (maybe later?) -- [!]turtle should collide at shell level. -- shell should kill other shells -- [!]turtle should turn when walking into other shells. -- elevator -- [!]red turtle -- [!]8x8 collision (landing at feet) for all enemies. -- [!] remember to remove extra logic for stomping bottom half --[[ possible optimizations: * store level data in map * [!]convert player to m_obj --]] --log --printh("\n\n-------\n-start-\n-------") --redefine -------------------------------- -- { tile, flipx, flipy } local map_data = { } _mget=mget function mget(x,y) x=flr(x) y=flr(y) if map_data[x] and map_data[x][y] then return map_data[x][y].tile end return 0 end _mset=mset function mset(x,y,t) if not map_data[x] then map_data[x] = {} end if not map_data[x][y] then map_data[x][y] = {} end --printh("mset: " .. x .. "," .. y .. ", " .. t) map_data[x][y].tile = t --_mset(x,y,t) end _map=map function map( celx, cely, sx, sy, celw, celh, layer ) --local cam_x,cam_y = cam:cam_pos() local cam_x=peek(0x5f29) cam_x=bor(shl(cam_x,8),peek(0x5f28)) local cam_y=peek(0x5f2b) cam_y=bor(shl(cam_y,8),peek(0x5f2a)) --printh("camx/y:" .. cam_x .. "," .. cam_y) --printh(#map_data[1]) local start_x=flr(cam_x/8) local start_y=flr(cam_y/8) local end_x=start_x+16 local end_y=flr(cam_y/8)+16 --30% below --local cell=map_data[26][26] for i=start_x,end_x do local ct=map_data[celx+i] if ct then for j=start_y,end_y do --30% below local cell=ct[cely+j] if cell then if cell.tile!=0 then local dx=sx+(i*8) local dy=sy+(j*8) local pop=false --pal==3% if fget(cell.tile,7) then set_coin_pal() pop=true elseif cell.bgpal!=nil then push_pal(pals[cell.bgpal]) pop=true end spr(cell.tile,dx,dy,1,1,cell.flipx,cell.flipy) --13% if(pop)pop_pal() end end end end end end --config -------------------------------- --level pals pals= { {1,0,4,1,15,13}, --underground --{4,3,15,12,}, {7,11,12,3}, --bush } mus={0,19,28}--overworld,under,castle core_lvls={1,3} --begin lvls lvls={ { w=446, h=30, cls=12, mus=1, bg="ff00d2000101010201030e000101020201031b000101010201030e000101020201031b000101010201030e000101020201031b000101010201030e000101020201030e0001040c0001010102010311000101010201030800010501060107050001010302010304000105020601071000010101020103080001050106010705000101030201030400010502060107100001010102010308000105010601070500010103020103040001050206010710000101010201030800010501060107050001010302010304000105020601070e0001080100010101020103080001050106010705000101030208000105010601071000010503060107180001050106010710000105030601071800010501060107100001050306010718000105010601071000010503060107160001080100010501060107100001050306160001093900080a0300030a01090e0001090b00030a0400010a0209010a3800020b08000108d300030b08000108d200040b08000108d100050b080001081a000109010002090a0001090300010a0109010a0109010a1500010c010d0900010c010d1200010a0109010a0e00010a0500020a0400010902000109020001090500010a0a00020a0600010b0200010b0a00020b0200010b0c00020a0109010a0c00060b080001081a00010e2300010c010d0600010f01100200010e0600010f01102700010e2500020b0200020b0400010e0300030b0200020b1a00070b0400010e030001081900011101120113010a0c00010e0a00010c010d0800010f01100600010f011001000111011201130500010f01100600010e1f000111011201130d00010e1500030b0200030b02000111011201130100040b0200030b0300010e0100010c010d0e00010c010d0100080b0300011101120113020001080a00010e0d0001110112011401150113060001010302010301110112011304000101010201030200010f01100800010f011001000101020201030100010f0110011101120114011501130400010f011001010302010301110112011304000101010201030f00010102020103030001110112011401150113060001010302010301110112011304000101010201030c00040b0202040b0111011201140115050b0200040b0103011101120113010f011002000101010201030900010f0110090b0200011101120114011501130100010b090001110112011304000101010201030500451602000f16030040160200891602000f160300401602004416", lookup="000000000000007b6c6d6b6b00007c0000007575008b00008c8d00007d000000767676766768777863636464696a797a818291928384939400008787a1a2a1a2a3a4a3a4008686a3a385a3a38600a386a3a3a3a385a3a3a361627172", bgflip="98c00598c00698c00798c00898c00998c00a98c00b98c00c98c00d98c00e98c00f98c01098c01198c01298c01398c0148050158650158c501592501598501598c0158060168660168c601692601698601698c0168070178230178670178830178c70178e301792701794301798701798c0179a30178080188240188680188840188c80188e40189440189880189a40188090198250198690198850198c90198e50199450199890199a5019", objs="18b006650a00080c0a40080c0da00a9400a00f2f08001095004012940060129500a0129702a0129409c012940bc012990ca012970100172d0d60172d02c0180c0500180c0660180c0690180c0c20180c0c50180c0e40180c0e70180c0f80180c0fb0180c1000180c1030180c15c0180c15f0180c00e01ab0", pipes={ {116,18,2,4,0,0}, }, bgpal="0171882202f18422053186220771882208f184220b3186220d7188220ef184221141842214f184221af1842213e19112", }, { w=34, h=30, pal=1, mus=2, bg="01000301070004010102010301000301070004010102010301000301070004010102010301000e010102010301000e010102010301000401050405010102010301000e010102010301000301070404010102010301000e010102010301000301070404010102010301000301070504010102010301000301070002010106010701020103010003010700020101080109010201030d0a01080109010201030d0a0108010901020103", lookup="6464646400000000a4a3a4a3a2a1a2a1999aa9aa636364648182919283849394a1a2a1a2a3a4a3a461627172", bgflip="81e00081f00082000082100081e00181f00182000182100181e00281f00282000282100281e00381f00382000382100381e00481f00482000482100481e00581f00582000582100581e00681f00682000682100681e00781f00782000782100781e00881f00882000882100881e00981f00982000982100981e00a81f00a82000a82100a81e00b81f00b82000b82100b81e00c81f00c82000c82100c81e00d81f00d82000d82100d81e00e81f00e82000e82100e81e00f81f00f82000f82100f81e01081f01082001082101081e01181f01182001182101181e01281f01282001282101281e01381f01382001382101381e01481f01482001482101481e01581f01582001582101581e01681f01682001682101681e01781f01782001782101781e01881f01882001882101881e01981f01982001982101981e01a81f01a82001a82101a81e01b81f01b82001b82101b81e01c81f01c82001c82101c81e01d81f01d82001d82101d", objs="", pipes={ {28,22,1,328,22,2}, }, }, { w=384, h=30, pal=1, mus=2, bg="ff00810001010500840117000701010201031101030003013500020102000601020004010600040158000102010307010d0003013500020102000601020004010600040158000102010307010d00030128000404070002010800020103000101040002010a0006044e000102010307010d000301330002010800020103000101040002015e000102010307010d000301260001010100040101000101050002010800020103000101040002010a0006014e000102010307010d0003011c00010109000101010401010200010101040101050002010400040402010300010101040101020002010a000601370006010f00010501060102010307010d0003010900050708000108010001080d0003010200030105000401020006010300030102000201020004011d0001050106190002081c00010201030102010307010d000301030001011000010801000108010001080100010803000108160002012f00010501060400010201030b0002010b00030816000601010201030102010307010100010501060200010501060200010501060200030112000108010001080100010801000108010001080300010801000108140002012f0001020103040001020103040001050106050002010a000408160006010102010301020103070101000102010302000102010302000102010302000301100001080100010801000108010001080100010801000108030001080100010845000102010304000102010304000102010305000201090005081600060101020103010201030701010001020103020001020103020001020103020002015009030025090200020902000c09070008090700060901020103010201036609030025090200020902000c09070008090700060901020103010201031609", lookup="0000000064646464a1a2a1a2a3a4a3a4999aa9aa818291928384939467687778696a797a61627172", bgflip="", objs="0b2004950920080c05c00e9703a0109908a01094092010990980100c09b0100c1110100c12c01094014012940db012b010e0120c0cf014b00220160c0e7016b000c0172d0100172d0580172d05b0172d0760172d1240172f0200180c03a0180c07c0180c0800180c0c60180c0c90180c0cc0180c0e20180c", pipes={ {208,20,4,4,0,0}, }, }, { w=34, h=30, pal=1, mus=2, bg="01000e010102010301000e0101020103010002010c0001020103010002010c0001020103010002010c0001020103010002010c000102010301000c0102000102010301000c010200010201030100030108040101020001020103010002010c000102010301000c0102000102010301000e01010201030100020109040301010201030d0501060107010201030d050108010901020103", lookup="6464646400000000a4a3a4a3a2a1a2a1999aa9aa616271728182919283849394a1a2a1a2a3a4a3a4", bgflip="81e00081f00082000082100081e00181f00182000182100181e00281f00282000282100281e00381f00382000382100381e00481f00482000482100481e00581f00582000582100581e00681f00682000682100681e00781f00782000782100781e00881f00882000882100881e00981f00982000982100981e00a81f00a82000a82100a81e00b81f00b82000b82100b81e00c81f00c82000c82100c81e00d81f00d82000d82100d81e00e81f00e82000e82100e81e00f81f00f82000f82100f81e01081f01082001082101081e01181f01182001182101181e01281f01282001282101281e01381f01382001382101381e01481f01482001482101481e01581f01582001582101581e01681f01682001682101681e01781f01782001782101781e01881f01882001882101881e01981f01982001982101981e01a81f01a82001a82101a81e01b81f01b82001b82101b81e01c81f01c82001c82101c81e01d81f01d82001d82101d", objs="01801299", pipes={ {28,26,3,232,22,2}, }, }, } --end lvls --states s_title=0 s_lvl_intro=1 s_gameplay=2 s_gameover=3 function set2by2(start_x,start_y,t) if type(t)!="table" then t={t,t+1,t+16,t+17} end local count=1 for j=0,1 do for i=0,1 do mset(start_x+i,start_y+j,t[count]) count+=1 end end end function hex_map_load(m) --w3,h2,pal1,clear1,mus1, --[[ for i=1,#m.conf,8 do m.w=parse_hex_num(m.conf,i,2) i+=3 m.h=parse_hex_num(m.conf,i,1) i+=2 m.pal=parse_hex_num(m.conf,i,0) i+=1 m.cls=parse_hex_num(m.conf,i,0) i+=1 m.mus=parse_hex_num(m.conf,i,0) i+=1 end]] for i=1,#m.objs,8 do local x=parse_hex_num(m.objs,i,2) i+=3 local y=parse_hex_num(m.objs,i,2) i+=3 local id=parse_hex_num(m.objs,i,1) local t= { [12]=m_goomba, [176]=m_plant, [45]=m_koopa, [47]=m_koopa_red, [101]=m_flag, [148]=m_hidden_item,--mushroom [149]=m_hidden_item,--1up [151]=m_hidden_item,--star [152]=m_hidden_item,--coin [153]=m_hidden_item,--multi-coin } if t[id]!=nil then local o = t[id](x*8,y*8,id) o.x=x*8+(o:w_half()) o.y=y*8+(o:h_half()) end end local x=0 local y=0 --load background for i=1,#m.bg,4 do local count=parse_hex_num(m.bg,i,1) local lookup=parse_hex_num(m.bg,i+2,1) lookup = (lookup * 8) + 1 --printh(count) for j=0,count-1 do local t={} for k=0,6,2 do local n=parse_hex_num(m.lookup,lookup+k,1) add(t,max(0,n-1)) end --printh(x .. "," .. y) set2by2(x,y,t) if t[1]==102 and find_hidden_item(x*8,y*8)==nil then o = m_hidden_item(x*8+8,y*8+8,152) end x+=2 if x>=m.w then x=0 y+=2 end end end --load flip info for i=1,#m.bgflip,6 do --printh("str: "..sub(m.bgflip,i,i+2)) local xfull=parse_hex_num(m.bgflip,i,2) local yfull=parse_hex_num(m.bgflip,i+3,2) --[0][000 0000 0000] <-position of tile in question. -- ^-flip tile in this direction --right 11 bits are used for position. local x=band(xfull,0x7ff) local y=band(yfull,0x7ff) --left most bit is used for flip on/off. map_data[x][y].flipx = band(xfull,0x800)!=0 map_data[x][y].flipy = band(yfull,0x800)!=0 end --load pal swap data local bgpal=m.bgpal if bgpal then for i=1,#bgpal,8 do --x3,y2,w1,h1,p1 local px=parse_hex_num(bgpal,i,2) local py=parse_hex_num(bgpal,i+3,1) local pw=parse_hex_num(bgpal,i+5,0) local ph=parse_hex_num(bgpal,i+6,0) local pp=parse_hex_num(bgpal,i+7,0) for y=py,py+ph-1 do for x=px,px+pw-1 do map_data[x][y].bgpal=pp end end end end for v in all(m.pipes) do --(x,y,w,h,dest_lvl,dest_x,dest_y,dest_dir) local dir=0 if v[6] == 1 then dir=1 elseif v[6]==2 then dir=-1 end m_pipe(v,dir) end end function parse_hex_num(str,i,l) return tonum("0x"..sub(str,i,i+l)) end --math -------------------------------- function intersects_obj_obj(a, b) --return intersects_box_box(a.x,a.y,a.w,a.h,b.x,b.y,b.w,b.h) local box_x_a,box_y_a,box_w_half_a,box_h_half_a=a:col_box() local box_x_b,box_y_b,box_w_half_b,box_h_half_b=b:col_box() return intersects_box_box( box_x_a,box_y_a,box_w_half_a,box_h_half_a, box_x_b,box_y_b,box_w_half_b,box_h_half_b) end function intersects_obj_box(a, x1, y1, w1, h1) local box_x_a,box_y_a,box_w_half_a,box_h_half_a=a:col_box() return intersects_box_box(box_x_a,box_y_a,box_w_half_a,box_h_half_a,x1,y1,w1,h1) end function intersects_point_obj(px,py,b) local box_x_b,box_y_b,box_w_half_b,box_h_half_b=b:col_box() return intersects_point_box(px,py,box_x_b,box_y_b,box_w_half_b,box_h_half_b) end --point to box intersection. function intersects_point_box(px,py,x,y,w,h) if flr(px)>=flr(x-(w)) and flr(px)=flr(y-(h)) and flr(py)=xs)return false local yd=y1-y2 local ys=h1+h2 if(abs(yd)>=ys)return false return true end --check if pushing into side tile and resolve. --requires self.dx,self.x,self.y, and --assumes tile flag 0 == solid --assumes sprite size of 8x8 function collide_side(self) local box_x,box_y,box_w_half,box_h_half=self:col_box() local offset=box_w_half local finaloffset=0 if self.dx<0 then offset*=-1 finaloffset=8 elseif self.dx==0 then return end local x=(box_x+offset)/8 for yoffset=-(box_h_half)+1,(box_h_half)-1,2 do local y=(box_y+yoffset)/8 --add(debug_points, {x*8,y*8}) if fget(mget(x,y),0) then if self.on_collide_side!=nil then self:on_collide_side() else self.dx=0 self.x=(flr((x))*8)+finaloffset-offset end return true elseif self.dead_time==-1 and self.solid and self.bounces then for v in all(objs) do if v!=self and v.solid and v.bounces and v.is_enemy then --[[(v.dx==0 or self.dx==0 or sgn(v.dx)!=sgn(self.dx)) and]] if intersects_point_obj(x*8,y*8,v) then self.dx*=-1 --v.dx*=-1 --self.x+=self.dx return true end end end end end return false end --check if pushing into floor tile and resolve. --requires self.dx,self.x,self.y,self.grounded,self.airtime and --assumes tile flag 0 or 1 == solid function collide_floor(self) --only check for ground when falling. if self.dy<0 then return false end local box_x,box_y,box_w_half,box_h_half=self:col_box() local y=(box_y+box_h_half)/8 --local landed=false --check for collision at multiple points along the bottom --of the sprite: left, center, and right. for i=-(box_w_half)+2,(box_w_half)-2,2 do --add(debug_points, { (box_x+i),(box_y+(box_h_half)) }) local new_y=nil if fget(mget((box_x+i)/8,y),0) then new_y=(flr(y)*8)-(self:h_half()) else for v in all(objs) do if v!=self and v.platform then --[[(v.dx==0 or self.dx==0 or sgn(v.dx)!=sgn(self.dx)) and]] if intersects_obj_obj(self,v) then new_y=(flr(v.y-v:h_half()))-(self:h_half())+1 break end end end end if new_y then if self.on_collide_floor!=nil then self:on_collide_floor(new_y) else self.dy=0 self.y=new_y self.grounded=true self.airtime=0 end return true end end if self.stay_on then self.dx*=-1 self.x+=self.dx end return false end --check if pushing into roof tile and resolve. --requires self.dy,self.x,self.y, and --assumes tile flag 0 == solid function collide_roof(self) if self.dy>=0 then return end hits={} local y=flr((self.y-(self:h_half()))/8) --check for collision at multiple points along the top --of the sprite: left, center, and right. for i=-(self:w_half())+2,(self:w_half())-2,2 do local x=flr((self.x+i)/8) --add(debug_points, {self.x+i,(self.y-(self:h_half()))}) item=nil if self==p1 then item=find_hidden_item(x*8,y*8) end local map_item=mget(x,y) if fget(map_item,0) or item!=nil then --printh("::adding tile: " ..map_item.."("..(item!=nil and "true" or "false")..")") add(hits,{map_item,x,y,item}) end end if #hits>0 then self.dy=0 self.y=flr(y)*8+8+(self:h_half()) self.jump_hold_time=0 local item = hits[flr(#hits/2)+1] if self==p1 then if item[4]!=nil then item[4]:on_reveal(self) else --return item[1], item[2], item[3] map_item=item[1] x=item[2] y=item[3] if (fget(map_item,1))bounce_tile(x,y,104) if (fget(map_item,2)) then if p1.isbig then --printh("::destroying tile") bounce_tile(x,y,0) else bounce_tile(x,y) end end end end --printh("---") else return nil end end --make 2d vector function m_vec(x,y) local v= { x=x, y=y, --get the length of the vector get_length=function(self) return sqrt(self.x^2+self.y^2) end, --get the normal of the vector get_norm=function(self) local l = self:get_length() return m_vec(self.x / l, self.y / l),l; end, } return v end --square root. function sqr(a) return a*a end --round to the nearest whole number. function round(a) return flr(a+0.5) end --[[ function backinquart(t,b,c,d) t/=d ts=(t)*t tc=ts*t return b+c*(-11.3475*tc*ts + 19.4475*ts*ts + -7.8*tc + 0.8*ts + -0.2*t) end --]] --[[ function easeoutquint(t,b,c,d) t/=d; t-=1; return c*(t*t*t*t*t+1)+b; end --]] --[[ function easeoutelastic(t,b,c,d) t/=d ts=(t)*t; tc=ts*t; return b+c*(33*tc*ts+-106*ts*ts+126*tc+-67*ts+15*t); end --]] --utils -------------------------------- function map_pos_to_16x16(x,y) function temp(a) return (a%2==0) and a or a-1 end return temp(x),temp(y) end function find_hidden_item(x,y) for v in all(objs) do if v.is_hidden_item == true and intersects_point_obj(x,y,v) then return v end end return nil end function bounce_tile(x,y,tile) ----printh("btile a: " ..x..","..y) local start_x,start_y=map_pos_to_16x16(x,y) --printh("btile b: " ..x..","..y) for v in all(objs) do if v.on_bounce!=nil and intersects_obj_box(v,start_x*8+8,start_y*8+8-16,8,8) then v:on_bounce({["x"]=start_x*8+8,["y"]=start_y*8+8 }) end end if fget(mget(start_x,start_y-1),7) then local coin_x,coin_y=map_pos_to_16x16(flr(start_x),flr(start_y-1)) set2by2(coin_x,coin_y,{0,0,0,0}) p1:on_get_coin() m_fx_coin(coin_x*8+8,coin_y*8+8) end --special case for smashing tiles. if tile==0 then for i=0,1 do for j=0,1 do m_part( (start_x+i)*8+4, (start_y+j)*8+4, -1+(i*2),((1-j+1)*-3),mget(start_x+i,start_y+j)) end end set2by2(start_x,start_y,{0,0,0,0}) sfx(55) return end --just bounce the tiles at x,y if tile==nil then tile={} for y=0,1 do for x=0,1 do add(tile,mget(start_x+x,start_y+y)) --tile=mget(start_x,start_y) end end --printh("btile tile[1]: " ..tile[1]) end m_bounce_obj(start_x*8+8,start_y*8+8,tile) sfx(52) set2by2(start_x,start_y,{127,127,127,127}) end --print string with outline. function printo(str,startx, starty,col, col_bg) for y=-1,1 do for x=-1,1 do print(str,startx+x,starty+y,col_bg) end end print(str,startx,starty,col) end --print string centered with --outline. function printc( str,x,y, col,col_bg, special_chars) local len=(#str*4)+(special_chars*3) local startx=x-(len/2) local starty=y-2 printo(str,startx,starty,col,col_bg) end --objects -------------------------------- function m_obj(x,y) local o = { x=x, y=y, dx=0, dy=0, w=16, h=16, w_half=function(self) return self.w*0.5 end, h_half=function(self) return self.h*0.5 end, col_box=function(self) if self.ch and self.cw then return self.x, self.y+self:h_half()-self.ch/2, self.cw/2,self.ch/2 else return self.x,self.y,self.w/2,self.h/2 end end, scaley=1, max_dx=9999,--max x speed max_dy=9999,--max y speed grav=0, flipx=false,--show sprite be flipped. flipy=false, solid=true, squish=false, layer=1, --animation definitions. --use with set_anim() anims= { ["idle"]= { ticks=1,--how long is each frame shown. frames={26},--what frames are shown. }, }, curanim="idle",--currently playing animation curframe=1,--curent frame of animation. animtick=0,--ticks until next frame should show. --request new animation to play. set_anim=function(self,anim) if(anim==self.curanim)return--early out. local a=self.anims[anim] self.animtick=a.ticks--ticks count down. self.curanim=anim self.curframe=1 end, update_anim=function(self) --anim tick self.animtick-=1 if self.animtick<=0 then self.curframe+=1 local a=self.anims[self.curanim] self.animtick=a.ticks--reset timer if self.curframe>#a.frames then if self.on_anim_done!=nil then self:on_anim_done() end self.curframe=1--loop end end end, --call once per tick. update=function(self) --limit walk speed self.dx=mid(-self.max_dx,self.dx,self.max_dx) --move in x self.x+=self.dx if self.solid then local old_dx=self.dx if collide_side(self) then self.dx=-1*old_dx end end --move in y self.dy+=self.grav self.dy=mid(-self.max_dy,self.dy,self.max_dy) self.y+=self.dy if self.solid then collide_floor(self) collide_roof(self) end self:update_anim() end, --draw the obj draw=function(self) local a=self.anims[self.curanim] local frame=a.frames[self.curframe] if(self.pal)push_pal(self.pal) if type(frame)=="table" then local start_x=self.x-(self:w_half()) local start_y=self.y-(self:h_half()) local count=1 local num_vert=flr(self.h/8) local num_horz=flr(self.w/8) local inc_x=8 local inc_y=8 if self.flipx then start_x=start_x+((num_horz-1)*8) inc_x=-8 end if self.flipy then start_y=start_y+((num_vert-1)*8) inc_y=-8 end local y=start_y for v_count=1,num_vert do local x=start_x for h_count=1,num_horz do -- draw in frame order, but from -- right to left. local f=frame[count] local flipx=self.flipx local flipy=self.flipy if f!=nil then if f<0 then f=abs(f) flipx=not flipx end if f>=256 then f-=256 flipy=not flipy end sspr((f*8)%128,flr((f/16))*8,8,8, x,y,8,8, flipx,flipy ) end count+=1 x += inc_x end y += inc_y end else local flipx=self.flipx local flipy=self.flipy if frame<0 then flipx=not flipx frame=abs(frame) end if frame>=256 then frame-=256 flipy=true end sspr((frame*8)%128,flr((frame/16))*8, self.w, self.h, self.x-(self:w_half()), self.y+(self:h_half())-(self.h/self.scaley), ---(self.h/4/2), self.w, self.h/self.scaley, flipx, flipy ) end if(self.pal)pop_pal() --add(debug_points, {self.x,self.y}) local x,y,w,h=self:col_box() --rect(x-w,y-h,x+w,y+h,9) end, ext=function(self,t) for k,v in pairs(t) do self[k]=v end return self end, } add(objs_queue,o) return o end --make the player function m_player(x,y) local p=m_obj(x,y) local ext= { w=16, h=16, max_dx=2,--max x speed max_dy=4,--max y speed ticks_since_run=9999, ticks_since_fire=9999, jump_speed=-4,--jump veloclity acc=0.1,--acceleration dcc=0.8,--decceleration air_dcc=1,--air decceleration grav=0.3, --helper for more complex --button press tracking. --todo: generalize button index. jump_button=m_button(5), fire_button=m_button(4), jump_hold_time=0,--how long jump is held min_jump_press=5,--min time jump can be held max_jump_press=20,--max time jump can be held jump_btn_released=true,--can we jump again? grounded=false,--on ground airtime=0,--time since grounded --animation definitions. --use with set_anim() anims= { ["idle"]= { ticks=1,--how long is each frame shown. frames={10},--what frames are shown. }, ["run"]= { ticks=2, frames={6,4,2}, }, ["jump"]= { ticks=1, frames={0}, }, ["slide"]= { ticks=1, frames={8}, }, ["dead"]= { ticks=1, frames={93}, }, ["size_up"]= { ticks=15, frames={10,10,10,10,10,10,10,10,10}, }, ["fire"]= { ticks=15, frames={{6,7,93,94,109,110,54,55}}, }, }, hit_time=0, size_time=0, pipe_time=0, pipe_dir=0, pipe=nil, lives=3, coins=0, on_flag=false, on_flag_time=0, isbig=false, has_flower=false, star_time=0, offset_anims=function(self,amount) for k,v in pairs(self.anims) do for k2,v2 in pairs(v.frames) do if type(v2)=="table" then for k3,v3 in pairs(v2) do self.anims[k].frames[k2][k3]+=amount end else self.anims[k].frames[k2]+=amount end end end end, go_big=function(self) --printh("gobig: " .. (self.isbig and "true" or "false")) if self.isbig==false then self:offset_anims(32) self.h=32 self.y-=8 self.isbig=true self.size_time=60 elseif self.has_flower==false then self.has_flower=true self.size_time=60 end sfx(58) end, go_small=function(self,instant) if self.isbig==true then self:offset_anims(-32) self.h=16 self.y+=8 self.isbig=false self.has_flower=false if not instant then self.size_time=60 end end end, on_instant_death=function(self) self.hit_time=0 self:go_small(true) self:on_take_hit(nil) end, on_take_hit=function(self,killer) if self.hit_time<=0 then if self.isbig then self:go_small() self.hit_time=120 else --self:go_small() self.is_dead=true self.dx=0 self.dy=-10 self.flipy=false self.grounded=false self.py=self.y self.dead_time=0 self.w=16 self.star_time=0 self:set_anim("dead") music(24) end end end, on_load=function(self,px,py) self.x=px self.y=py-self:h_half() self.dx=0 self.dy=0 self.hit_time=0 self.size_time=0 self.pipe_time=0 self.pipe_dir=0 self.pipe=nil self.is_dead=false self.on_flag=false self.star_time=0 self:set_anim("idle") end, on_reach_flag=function(self,flag) self.dx=0 self.dy=0 self.on_flag=true self.on_flag_time=0 music(-1) end, on_get_star=function(self,star) self.star_time=900 music(23) end, on_get_coin=function(self) self.coins+=1 if self.coins>=100 then self.lives+=1 self.coins=self.coins%100 sfx(59) else sfx(61) end end, } p:ext(ext) p._update_player=p.update p.update=function(self) if self.star_time>0 then self.star_time-=1 if self.star_time==0 then music(mus[lvls[cur_lvl].mus]) end end self.hit_time=max(0, self.hit_time-1) if self.is_dead then self.dead_time+=1 if self.dead_time<30 then return end local len = 120 local lerp = (self.dead_time-30) / len if lerp>0.5 then self.y+=self.dy if (self.y>cam.pos_max.y+256) and self.dead_time>200 then self.lives-=1 if self.lives<=0 then goto_state(s_gameover) else --restart_lvl() goto_state(s_lvl_intro) end end return end --fy=easeoutquint(min(lerp,1),self.py,-16,1) fy=(sin(lerp)*80)+self.py if (lerp>=0.5) then self.dy=fy-self.y end self.y=fy return end if self.pipe!=nil then self.pipe_time-=1 if self.pipe_time==0 then self.pipe:on_use() self.pipe=nil self.pipe_dir=0 else self.y+=1*self.pipe_dir end return end if self.on_flag then if self.on_flag_time==60 then music(30) end self.on_flag_time+=1 if self.on_flag_time>60 then self.y+=1 if collide_floor(self) then if (self.on_flag_time>400) then cur_core_lvl+=1 cur_lvl=core_lvls[cur_core_lvl] goto_state(s_lvl_intro) end elseif ticks%4==0 then p1:on_get_coin() m_fx_coin(self.x+rnd(16)-8,self.y-rnd(8)) end end return end if (self.y>cam.pos_max.y+64) then self:on_instant_death() end if self.size_time>0 then self.size_time-=1 return end --track button presses local bl=btn(0) and not self.is_dead--left local br=btn(1) and not self.is_dead --right --move left/right if bl==true then self.dx-=self.acc br=false--handle double press elseif br==true then self.dx+=self.acc else if self.grounded then self.dx*=self.dcc else self.dx*=self.air_dcc end end --[[ if btn(4) then self.cur_max=min(self.cur_max+0.1,self.max_dx) else self.cur_max=max(self.cur_max-0.01,self.max_dx*0.5) end --]] local cur_max=self.max_dx*0.5 if btn(4) then self.ticks_since_run=0 else self.ticks_since_run=min(999,self.ticks_since_run+1) end if self.ticks_since_run<15 then cur_max=self.max_dx end --limit walk speed self.dx=mid(-cur_max,self.dx,cur_max) --move in x self.x+=self.dx --hit walls collide_side(self) local camx,camy = cam:cam_pos() if self.x-self:w_half() < camx then self.dx=0 self.x=camx+self:w_half() elseif self.x+self:w_half() > camx+128 then self.dx=0 self.x=camx+128-self:w_half() end --[[cam pos min]] --jump buttons self.jump_button:update() --jump is complex. --we allow jump if: -- on ground -- recently on ground -- pressed btn right before landing --also, jump velocity is --not instant. it applies over --multiple frames. if self.jump_button.is_down and not self.is_dead then --is player on ground recently. --allow for jump right after --walking off ledge. local on_ground=(self.grounded or self.airtime<5) --was btn presses recently? --allow for pressing right before --hitting ground. local new_jump_btn=self.jump_button.ticks_down<10 --is player continuing a jump --or starting a new one? if self.jump_hold_time>0 or (on_ground and new_jump_btn) then if(self.jump_hold_time==0)sfx(63) self.jump_hold_time+=1 --keep applying jump velocity --until max jump time. if self.jump_hold_time0) then self:set_anim("slide") elseif bl or br then self:set_anim("run") self.anims["run"].ticks=((self.max_dx-abs(self.dx))+1)*3 else self:set_anim("idle") end end --flip if self.grounded then if(br)self.flipx=false if(bl)self.flipx=true end self.fire_button:update() if self.fire_button.is_pressed and self.has_flower and #fireballs<2 then local dir=1 if(self.flipx)dir=-1 m_fireball(self.x,self.y,dir) self:set_anim("fire") self.ticks_since_fire=0 else self.ticks_since_fire=min(9999,self.ticks_since_fire+1) end self:update_anim() end p._draw_player=p.draw p.draw=function(self) if self.hit_time%2==0 then if self.star_time>0 then local c={{9,7,5,9},{8,1,5,4,9,15},{8,3,5,9,9,7}} local d=self.star_time<120 and 8 or 2 local i=(flr(ticks/d)%4) self.pal=c[i] elseif self.has_flower then self.pal={8,15,5,8} else self.pal=nil end self.scaley=1 if self.size_time%20>10 then if self.isbig then self.scaley=2 else self.scaley=0.5 end end self:_draw_player() end end return p end function m_fx(x,y) local o=m_obj(x,y) o.solid=false o.on_anim_done=function(self) del(objs,self) end return o end function m_fx_explosion(x,y) local o=m_fx(x,y) o.w=16 o.h=16 o.anims= { ["idle"]= { ticks=5,--how long is each frame shown. frames={{135,-135,391,-391}, {136,-136,392,-392}, {137,-137,393,-393}}, }, } --return o end function m_fx_coin(x,y) local o=m_fx(x,y):ext( { w=8, h=16, dy=-6, grav=0.3, anims= { ["idle"]= { ticks=5,--how long is each frame shown. frames={ {252,508}, {253,509}, {254,510}, {255,511}, {252,508}, {253,509}, {254,510}, {255,511}, } }, }, }) --return o end function m_fireball(x,y,dirx) sfx(53) local o=m_obj(x,y) local speed=2 o.w=8 o.h=8 o.grav=0.2 o.dx=dirx*speed*2 o.dy=speed o.anims= { ["idle"]= { ticks=5,--how long is each frame shown. frames={95,111,-351,-367},--what frames are shown. }, } --o.curframe=flr(rnd(#o.anims["idle"].frames)+1) o.on_collide_floor=function(self,y) self.dy=-speed self.y=y end o.on_collide_side=function(self) m_fx_explosion(self.x,self.y) del(fireballs,self) end o.test_hit=function(self,t) for v in all(t) do if v.is_enemy and v.dead_time==-1 then if intersects_obj_obj(self,v) then self:on_collide_side() v:on_bounce(self) break end end end end o._update_fireball=o.update o.update=function(self) self:_update_fireball() self:test_hit(objs) local camx,camy = cam:cam_pos() if self.x+self.w < camx or self.x-self.w > camx+128 or self.y-self.h > camy+128 then del(fireballs,self) end end del(objs_queue,o) add(fireballs,o) --return o end function m_pipe(v,dest_dir) local o = m_obj(v[1]*8,v[2]*8) o.w=10 o.h=32 o.dest_lvl=v[3] o.dest_x=v[4]*8 o.dest_y=v[5]*8 o.dest_dir=dest_dir o.draw=function()end --[[ o.draw=function(self) --debug --rect(o.x-o:w_half(),o.y-o:h_half(),o.x+o:w_half(),o.y+o:h_half(),15) --printc("lvl:" .. self.dest_lvl, self.x, self.y, 15, 1, 0) end --]] o.on_use=function(self) queue_lvl(self.dest_x,self.dest_y,self.dest_lvl,self.dest_dir) end --return o end --[[ function m_platform(x,y) local o=m_obj(x,y):ext({ w=48, h=8, --cw=48, --ch=10, platform=true, }) o.anims["idle"].frames={{114,114,114,114,114,114}} o._update_platform=o.update o.update=function(self) local start_touch=intersects_obj_obj(self,p1) --printh("start_touch: "..(start_touch and "true" or "false")) self.y+=1--sin(ticks*0.01) self:_update_platform() if(start_touch)p1.y+=1--sin(ticks*0.001) if(self.y>128)self.y=0 end --return o end --]] function m_hidden_item(x,y,t) local o=m_obj(x,y) o.t=t o.coin_ticks=-1 o.is_hidden_item=true o.on_reveal=function(self) if self.t==148 or self.t==149 then local o=m_mushroom(self.x,self.y) if self.t==149 then o.pal={4,3} o.is_1up=true elseif p1.isbig then o.flash=true o.anims["idle"]= { ticks=0, frames={ { 150, -150, 166, -166 } }, } o.dx=0 end elseif self.t==151 then m_star(self.x,self.y) elseif self.t==152 or self.t==153 then m_fx_coin(self.x,self.y) p1:on_get_coin() if self.coin_ticks==-1 then --first time self.coin_ticks=60*4 end end local x,y=map_pos_to_16x16(self.x/8,self.y/8) if self.t!=153 or self.coin_ticks<=0 then --printh("::bouncing tile in reveal") bounce_tile(x,y,104) del(objs,self) else bounce_tile(x,y) end end o.update=function(self) if self.coin_ticks>0 then self.coin_ticks-=1 end end o.draw=function(self) end return o end function m_item(x,y) local o=m_obj(x,y) o.ticks=0 o.solid=false o.flash=false o.pal={} o.on_bounce=function(self,block) self.dx=sgn(self.x-block.x)*abs(self.dx) self.dy=-2 end o._update_item=o.update o.update=function(self) self.ticks+=1 if intersects_obj_obj(self,p1) then if self.on_touch then self:on_touch() end del(objs,self) end if self.ticks==32 then self.layer=1 self.solid=true elseif self.ticks<32 then self.y-=0.5 return end self:_update_item() end o._draw_item=o.draw o.draw=function(self) if self.flash then local c={{7,15,9,4,4,2},{7,9,9,3},{4,3}} local i=(flr(ticks/2)%4) self.pal=c[i] end self:_draw_item() end o.layer=0 return o end function set_pal(t) pal() if t then for i=1,#t,2 do pal(t[i],t[i+1]) end end end function push_pal(pal_table) add(pal_stack,pal_table) set_pal(pal_table) end function pop_pal() del(pal_stack, pal_stack[#pal_stack]) set_pal(pal_stack[#pal_stack]) end function set_coin_pal() local c={{9,4},{},{9,10},{}} local i=(flr(ticks/10)%4)+1 if c[i]!=nil then push_pal(c[i]) end end function m_mushroom(x,y) sfx(57) local o=m_item(x,y) o.dx=0.75 o.grav=0.1 o.anims["idle"]= { ticks=0,--how long is each frame shown. frames={148},--what frames are shown. } --[[ o._update_mushroom=o.update o.update=function(self) self:_update_mushroom() if intersects_obj_obj(self,p1) then p1:go_big() del(objs,self) end end --]] o.on_touch=function(self) if o.is_1up then p1.lives+=1 sfx(59) else p1:go_big() end del(objs,self) end return o end function m_star(x,y) sfx(57) local o=m_item(x,y) local ext= { dx=0.75, dy=-3, grav=0.1, flash=true, anims= { ["idle"]= { ticks=0,--how long is each frame shown. frames={{151,-151,167,-167}},--what frames are shown. } }, on_collide_floor=function(self,new_y) self.dy=-3 self.y=new_y end, on_touch=function(self) p1:on_get_star(self) end, } o:ext(ext) --return o end --[[ function m_flower(x,y) local o=m_item(x,y) o.anims["idle"]= { ticks=0, frames={ { 150, -150, 166, -166 } }, } o._update_flower=o.update o.update=function(self) self:_update_flower() if intersects_obj_obj(self,p1) then p1:go_big() del(bg_objs,self) end end return o end --]] function m_bounce_obj(x,y,og_tile) local o = m_obj(x,y) o.t=0 o.py=y o.og=og_tile o.anims["idle"].frames={og_tile} if lvls[cur_lvl].pal!=nil then o.pal=pals[lvls[cur_lvl].pal] end o.update=function(self) self.t+=1 local lerp = self.t / 30 fy=(sin(self.t/30)*4)+self.py self.y=fy if (self.y>=self.py) then del(objs,self) --flip_tile((self.x-8)/8,(self.py-8)/8,self.og) set2by2((self.x-8)/8,(self.py-8)/8,self.og) end end --return o end function m_enemy(x,y) local o = m_obj(x,y) o.dx=-0.5 o.grav=0.1 o.dead_time=-1 o.is_enemy=true o.bounces=true o.ch=10 o.cw=10 --o.walk_speed=-0.5 o.anims["idle"]= { ticks=5,--how long is each frame shown. frames={12, -12},--what frames are shown. } o.on_bounce=function(self,block) if self.dead_time==-1 then self.dead_time=240 --printh(self.x) self.dx=sgn(self.x-block.x)*0.5 --printh(self.dx) self.dy=-3 self.solid=false self.flipy=true sfx(54) end end o.on_stomp=function(self) end o.on_attack=function(self,target) if target.on_take_hit then target:on_take_hit(self) end end o.on_take_hit=function(self,attacker) self:on_bounce(self,attacker) end o._update_enemy=o.update o.update=function(self) self:_update_enemy() if self.dx<0 then self.flipx=true else self.flipx=false end if self.dead_time>=0 then self.dead_time-=1 if self.dead_time<=0 then del(objs,self) end return end --[[flip code]] --if (self.y>cam.pos_max.y+64+(self:h_half())) then -- del(objs,self) --end if self.dead_time==-1 and not p1.is_dead and p1.pipe==nil then -- local gx,gy,gw,gh=self.x,self.y+self.h*0.25,self.w,self.h*0.75 if intersects_obj_obj(p1,self) then if p1.star_time>0 then self:on_bounce(p1) else --feet pos. local mx,my=p1.x,p1.y+(p1:h_half()) local gx,gy,gw,gh=self:col_box() slope = abs((gy-my)/(gx-mx)) if ((--[[gy == mx) or ((slope >= 0) and]] (gy > my))) then if p1.dy>=0 then self:on_stomp() end else self:on_attack(p1) end end end end end o._draw_enemy=o.draw o.draw=function(self) local old_y=self.y local old_x=self.x if self.dead_time==-1 then local camx,camy=cam:cam_pos() local rad=10 if self.y>=camy+128 then local new_y=camy+128---rad circfill(self.x,new_y,rad+1,1) circfill(self.x,new_y,rad,7) self.y=new_y elseif self.y<=camy then local new_y=camy---rad circfill(self.x,new_y,rad+1,1) circfill(self.x,new_y,rad,7) self.y=new_y end end self:_draw_enemy() self.x=old_x self.y=old_y end return o end function m_goomba(x,y) local o= m_enemy(x,y):ext( { on_stomp=function(self) self.scaley=4 self.dead_time=60 self.dx=0 self.dy=0 p1.dy=p1.max_dy*-1 sfx(54) end, }) if lvls[cur_lvl].pal==1 then o.pal={4,13,15,12} end return o end function m_plant(x,y) y+=12 local o = m_enemy(x+8,y):ext( { w=16, h=24, iy=y, dx=0, --o.walk_speed=0 solid=false, grav=0, layer=0, ticks=0, --o.wait=0 anims={ ["idle"]= { ticks=15, frames={{176,-176,192,-192,208,-208},{177,-177,193,-193,209,-209}}, } }, on_bounce=function(self,block) del(objs,self) sfx(54) end, }) o._update_plant=o.update o.update=function(self) if abs(self.x-p1.x)>32 or self.y!=self.iy then self.ticks+=1 self.y=mid(self.iy,self.iy-self:h_half()+cos(self.ticks*0.003)*36,self.iy-self.h) end self:_update_plant() end return o end function m_koopa(x,y) local o = m_enemy(x,y) o.w=16 o.h=24 o.ch=12 o.cw=8 o.anims["idle"]= { ticks=5,--how long is each frame shown. frames={44, 46},--what frames are shown. } o.on_stomp=function(self) m_shell(self.x,self.y+4).pal=self.pal del(objs,self) p1.dy=p1.max_dy*-1 sfx(54) end return o end function m_koopa_red(x,y) --printh("make red") local o=m_koopa(x,y):ext( { pal={3,8}, stay_on=true, }) return o end function m_shell(x,y) local o=m_enemy(x,y) o:ext( { dx=0, dy=0, ch=12, cw=8, bounces=true, hit_time=0, anims= { ["idle"]= { ticks=1, frames={{14,-14,30,-30}}, }, }, on_kick=function(self,kicker) --printh("on kick") self.dx=sgn(self.x-kicker.x)*2.5 self.hit_time=15 self.bounces=false sfx(52) end, on_stomp=function(self) --printh("on stomp") if self.dx==0 then self:on_kick(p1) elseif self.hit_time<=0 then self.dx=0 self.bounces=true p1.dy=p1.max_dy*-1 end sfx(54) end, on_attack=function(self,target) --printh("on attack") if self.dx!=0 and self.hit_time<=0 then target:on_take_hit(self) else self:on_kick(target) end end, _update_shell=o.update, update=function(self) self:_update_shell() self.hit_time=max(0,self.hit_time-1) for v in all(objs) do if v!=self and v.solid and v.is_enemy then if self.dx!=0 and intersects_obj_obj(self,v) then v:on_bounce(self) end end end end, }) return o end function m_flag(x,y) local o = m_obj(x,y) o.w=16 o.h=16 o.reached=false o.anims["idle"]= { ticks=0,--how long is each frame shown. frames={{100, 101, nil, 100}},--what frames are shown. } o.update=function(self) if self.reached then self.y=p1.y elseif p1.x>self.x then p1:on_reach_flag(self) self.reached=true end end return o end function m_button(id) local b = { update=function(self) --start with assumption --that not a new press. self.is_pressed=false if btn(id) then if not self.is_down then self.is_pressed=true end self.is_down=true self.ticks_down+=1 else self.is_down=false self.is_pressed=false self.ticks_down=0 end end, --state is_pressed=false,--pressed this frame is_down=false,--currently down ticks_down=0,--how long down } return b end --make the camera. function m_cam(target) local c= { tar=target,--target to follow. pos=m_vec(target.x+target:w_half(),target.y+target:h_half()), --how far from center of screen target must --be before camera starts following. --allows for movement in center without camera --constantly moving. pull_threshold=16, --min and max positions of camera. --the edges of the level. pos_min=m_vec(64,64), pos_max=m_vec(446*8-64,196-44), -- shake_remaining=0, -- shake_force=0, update=function(self) -- self.shake_remaining=max(0,self.shake_remaining-1) --follow target outside of --pull range. if self:pull_max_x()self.tar.x then self.pos.x+=min((self.tar.x-self:pull_min_x()),4) end if self:pull_max_y()self.tar.y+(self.tar:h_half()) then self.pos.y+=min((self.tar.y+(self.tar:h_half())-self:pull_min_y()),4) end --lock to edge self.pos.x=mid(self.pos_min.x,self.pos.x,self.pos_max.x) self.pos.y=mid(self.pos_min.y,self.pos.y,self.pos_max.y) self:cull_objs() self:activate_objs() end, cam_pos=function(self) --calculate camera shake. -- local shk=m_vec(0,0) -- if self.shake_remaining>0 then -- shk.x=rnd(self.shake_force)-(self.shake_force/2) -- shk.y=rnd(self.shake_force)-(self.shake_force/2) -- end -- return self.pos.x-64+shk.x,self.pos.y-64+shk.y return self.pos.x-64,self.pos.y-64 end, pull_max_x=function(self) return self.pos.x-16--+self.pull_threshold end, pull_min_x=function(self) return self.pos.x-16---64+8 end, pull_max_y=function(self) return self.pos.y+self.pull_threshold end, pull_min_y=function(self) return self.pos.y-self.pull_threshold end, -- shake=function(self,ticks,force) -- self.shake_remaining=ticks -- self.shake_force=force -- end cull_objs=function(self) local cam_min=self.pos_min local back_offset=128 if p1.x-back_offset>cam_min.x then self.pos_min.x = p1.x-128 end for v in all(objs) do if v.x+v.wself.pos_max.y+64 then del(objs,v) end end end, activate_objs=function(self) for v in all(objs_queue) do if v.x <= (flr(self:cam_pos()/256)+1)*256+128+v.w then -- move to active list. add(objs,v) del(objs_queue,v) end end end, } return c end function m_part(_x,_y,_dx,_dy,_s) local o = m_obj(_x,_y) local ext= { dx=_dx, dy=_dy, w=8, h=8, sprite=_s, max_dx=2,--max x speed max_dy=4,--max y speed grav=0.3, --call once per tick. update=function(self) --limit walk speed self.dx=mid(-self.max_dx,self.dx,self.max_dx) --move in x self.x+=self.dx --move in y self.dy+=self.grav self.dy=mid(-self.max_dy,self.dy,self.max_dy) self.y+=self.dy -- if (self.y>cam.pos_max.y+64+(self:h_half())) then -- del(objs,self) -- end end, --draw the player draw=function(self) spr(self.sprite, self.x-(self:w_half()), self.y-(self:h_half()), (self.w/8),self.h/8, self.flipx, false) end, } o:ext(ext) return o end --game flow -------------------------------- --reset the game to its initial --state. use this instead of --_init() function reset() --load_lvl(4*8,-64,lvls[2]) state=0 ticks=0 objs={} objs_queue={} fireballs={} pal_stack={} --[[ menuitem(1, "[cheat] next level", function() cur_core_lvl+=1 cur_lvl=core_lvls[cur_core_lvl] goto_state(s_lvl_intro) end) --]] end function goto_state(new_state) if state==s_title then p1=m_player(0,0) p1:set_anim("idle") cur_core_lvl=1 end state=new_state ticks=0 if state==s_lvl_intro then cur_lvl=core_lvls[cur_core_lvl] load_lvl(24,208,cur_lvl) elseif state==s_gameover then music(26) end end function queue_lvl(px,py,lvl,pipe_dir) lvl_next={px,py,lvl,pipe_dir} end function load_lvl(px,py,lvl_id,pipe_dir) --printh("starting load...") -- cls(0) -- printc("loading...",64,64,6,5,0) -- flip() --[[ for i=0,999 do --for j=0,1 do cls(0) local str="loading" for k=0,i*0.1%3 do str=str.."." end printc(str,64,64,6,5,0) flip() --end end --]] objs={} objs_queue={} fireballs={} --debug_points={} map_data={} pal_stack={} p1:on_load(px,py) if pipe_dir!=nil and pipe_dir!=0 then p1.pipe={on_use=function()end,} p1.pipe_time=60 p1.pipe_dir=-1--pipe_dir p1.y+=60 end cam=m_cam(p1) cur_lvl=lvl_id local lvl=lvls[cur_lvl] cam.pos_max=m_vec((lvl.w*8)-64-8,(lvl.h*8)-64-24), --m_mushroom(48+8,200) --m_flower(96+8,200) --m_platform(96,200-64) --printh("lvl: " .. lvl.bg) hex_map_load(lvl) -- todo: restore later --rom_map_load(rom_lvls[1],lvl) --printh("init complete") music(mus[lvl.mus]) end --p8 functions -------------------------------- function _init() reset() end function _update60() ticks+=1 --printh("update") if state==s_title then if btnp(4) or btnp(5) then goto_state(s_lvl_intro) end elseif state==s_lvl_intro then if ticks>=120 then goto_state(s_gameplay) end elseif state==s_gameplay then if not p1.is_dead and p1.size_time==0 then for o in all(objs) do o:update()--20% end for o in all(fireballs) do o:update() end end p1:update()--25% cam:update()--10% --demo camera shake --if(btnp(4))cam:shake(15,2) if lvl_next!=nil then --printh("queued up level: " ..lvl_next[3].." ["..lvl_next[1]..","..lvl_next[2].."]") load_lvl(lvl_next[1],lvl_next[2],lvl_next[3],lvl_next[4]) lvl_next=nil end elseif state==s_gameover then if btnp(4) or btnp(5) then goto_state(s_title) end end end -- 16x14 local fadetable_w=15 local fadetable= "000000000000000".. "111111100000000".. "222222111000000".. "333333111000000".. "444222221100000".. "555551111100000".. "66dddd555511100".. "76666ddd5551100".. "888822222200000".. "999444444550000".. "aa9994445555000".. "bbb333333300000".. "ccccc3311111100".. "ddd555511111000".. "eeed44222221100".. "ff6ddd555551100" function fade(i) for c=0,15 do if flr(i+1)>=fadetable_w then pal(c,0,1) else local c2=c*fadetable_w+i+1 pal(c,parse_hex_num(fadetable,c2,0),1) --pal(c,fadetable[c+1][flr(i+1)]) end end end function _draw() if state==s_title then cls(0) printc("super mario bros.",64,64,7,1,0) elseif state==s_lvl_intro then if lvls[cur_lvl].cls then cls(lvls[cur_lvl].cls) else cls(0) end camera(512+ticks,(29*8)-128+16) if(lvls[cur_lvl].pal!=nil)push_pal(pals[lvls[cur_lvl].pal]) map(0,0,0,0,32,446) if(lvls[cur_lvl].pal!=nil)pop_pal() camera(0,0) rectfill(0,0,127,32,0) rectfill(0,96,127,127,0) printc("world "..(flr((cur_core_lvl-1)/4)+1).."-"..(flr((cur_core_lvl-1)%4)+1),64,64-48,7,1,0) spr(10,64-32,64-8+48,2,2) printc("x",64,64+48,7,1,0) printc("" .. p1.lives,64+16,64+48,7,1,0) if ticks<=fadetable_w then fade(fadetable_w-flr((ticks/fadetable_w)*fadetable_w)) elseif ticks >= 100-fadetable_w then local lerp=ticks-(100-fadetable_w) lerp=lerp/fadetable_w fade(flr((lerp)*fadetable_w)) end elseif state==s_gameplay then --50% --cam:update() if lvls[cur_lvl].cls then cls(lvls[cur_lvl].cls) else cls(0) end camera(cam:cam_pos()) if p1.pipe!=nil then p1:draw() end if(lvls[cur_lvl].pal!=nil)push_pal(pals[lvls[cur_lvl].pal]) for o in all(objs) do if o.layer==0 then o:draw() --1% end end map(0,0,0,0,32,446) --22% for o in all(objs) do if o.layer==1 then o:draw() --1% end end if(lvls[cur_lvl].pal!=nil)pop_pal() for o in all(fireballs) do o:draw() end if p1.pipe==nil then p1:draw() end --for v in all(debug_points) do -- pset(v[1],v[2],8) --end --debug_points = {} --hud camera(0,0) set_coin_pal() sspr(64, 72, 16, 16, 64-10, 0, 8,8) pop_pal()--coins printo("x "..p1.coins,64,2,7,1) --[[ if lvl_pal!=nil then for i=1,#lvl_pal,2 do pal(lvl_pal[i],lvl_pal[i+1],1) end end --]] --printc("built with",64,4,7,0,0) --printc("adv. micro platformer",64,12,7,0,0) elseif state==s_gameover then cls(0) printc("game over",64,64,7,1,0) end --print("fireballs:"..#fireballs,0,12,7) --mem_high=(stat(0)>mem_high) and stat(0) or mem_high --print("mem:"..flr((stat(0)/2048)*100).."% ^" .. flr((mem_high/2048)*100).."%",0,0,7) --cpu_high=(stat(1)>cpu_high) and stat(1) or cpu_high --print("cpu:"..flr(stat(1)*200).."% ^"..flr(cpu_high*200).."%",0,6,7) --print("#objs:"..#objs,0,12,7) --print("#objs_queue:"..#objs_queue,0,18,7) end --mem_high=0 --cpu_high=0 __gfx__ 00000000000009990000008888800000000000888880000000000000000000000000008888800000000008888800000000000044440000000000000000000000 00000088888009990000088888888800000008888888880000000008888800000000588888888000000088888888800000000444444000000000000000000000 00000888888888990000055599590000000005559959000000000088888888800005555559590000000055599590000000004444444400000000093333900000 00000555995905550000595999599900000059599959990000000055599590000099599599999900000595999599900000044444444440000000339999330000 00005959995995550000595599959990000059559995999000000595999599900099599559955990000595599959990000411444444114000003393333933000 0000595599959995000055999955550000005599995555000000059559995999000995999999550000055999955550000444f144441f44400003933333393000 0000559999555550000000999999900000000099999990000000055999955550000088855589900000000999999900000444f111111f44400039333333339300 0000009999999500000555588550000000000558555000000000000999999900000889995885550000005585550000004444f1f44f1f44440093933333393900 0055555855585000099555588855599900005555885500000000005555850900000859995555550000055585585550004444fff44fff44440933393333933390 05555555855580050999055898885599000055588988900000000955555599900008889955555500005555888855550044444444444444440333339999333330 99555555888880050990088888880050000055558888800000009985555599000000888885555000009958988985990004444ffffff444407773393333933777 9990885889889855000088888888855000008559998880000000558888888000000085558888000000999888888999000000ffffffff00007777933333397777 0905888888888855000888888888855000000859988800000000588888888000000005555888000000998888888899000011ffffffff00000007733333377000 005558888888885500558880008885500000008885550000000558880888000000505885558000000000888008880000011111fffff110000000773333770000 0555888888800000005550000000000000000055555550000005000055500000005555580000000000055500005550000111111fff1110000000077777700000 05008888000000000005550000000000000000555500000000000000555500000005555000000000005555000055550000111110011100000000007777000000 00000000000099900000008888800000000000000000000000000000000000000000008888888000000000888880000000000000000000000000000000070000 00000000000995990000888888900000000008888800000000000000000000000055888888899000000088888890000000000000000070000000000000777000 00000088888995590008888889900000000888888900000000000008888800000555888888890000000888888990000000000000000777000000000000777900 00008888888999990008888888888800008888889900000000000888888900000995599588888800000888888888880000000000009777000000000009773900 00088888888555550005559959990000008888888888800000008888889900009999599599599880000555995999000000000000099773900000000009773990 00088888888888550059959955999900005559959990000000008888888888809999599599559000005995995599990000000000099773900000000009773990 00055599599955550059955999999990059959955999900000005559959990009959899959999990005995599999999000000000099773900000000009777990 00599599599999550559955999599990059955999999990000059959955999909595889999959999055995599959999000000000099777900000000009979939 00599559999999950559999955555500559955999599990000059955999999999958855995555999055999995555550000000000099979990000000009999999 00599559995999950555999995555500559999955555500000559955999599990008555999955550055599999555550000000000099999390003333309900999 05599999555555500005599999999000055999995555500000559999955555500088555559999900000559999999900000033333009999990039333937900099 05555999955559500000055599000000005599999999000000055999995555500085599955888550000089999950000000393339309909990033939337990000 00055999999995500000888855800090000888899000000000000599999999000085999998885550000058555585000003339393309900990377393333799000 00008888558555500005555885580999005855885500000000005888999000000085999995585550000558555585500003773933337990990373939333799990 05555558858555000055555588585999058555588500000000058555850000000000999995555555005558555585550003739393337990900939333939799900 55555555855855000555555588558999058555588550000000058555585000000088895995555555055558555585555009393339397990000393333393779000 55555555885850000555555588558595058555588850000000558555558899000088889955555555055588555588555003933333937799000939333939379000 55995555885580000555555888558550058555559950000000588555555599990088888885555555555588555588555509393339393790000333939333979000 59999558888590005555558889859500058555599990000000588855555599990008888888555555555588888888555503339393339790000333393333370000 99999588898880005555888888888000088555599998000000088855555559990000555888885550555589888898555503333933333700007773939333770000 99999888888880009999988888888000088855599998800000088885555559990000055555888880999988888888999977739393337700000977733977790000 90998888888880059999988888888005088885599988800000088888855580000055555555888880999988888888999900777339777990000999777779990000 09988888888880559999888888888055088888855888800000088888888880000059999555588800099988888888999009997777799999000999000099900000 00088888888855550999888888855555008888855588000000088888888850000059999995580000099888888888899099990000009999900099900999000000 00058888888855550008588888855555000888555555000055558888888588000000888899500000008888888888880000000000000000000000000000888800 55585588888855550058858888855555000885555550000055558888855888005008888888000000088888800888888000000000000000888880000008899880 555888558888555555588855888555550000885555000000555588885888800055005888800000000888880000888880000000000009988888889900889f9980 55588888008855555555888800055555000058885550000055558880088880005555555880000000088888000088888000000000099959599595999989f99880 55588888000000005555580000000000000055550550000055550000055550000555555500000000005555000055550000000000099559599595599989988800 55588880000000000555000000000000000555550000000055000000055550000055555500000000005555000055550000000000099555999955599988980008 55000000000000000555000000000000000555555500000050000000055555500005555000000000555555000055555500000000000555599555550008880800 50000000000000000055500000000000000005555500000000000000055555500000555000000000555555000055555500000000000059555595500000888080 4ffffffff14ffff4ffffffff44444441777777777777777714444444444444411444444444444441777777770000001111000000000059999995500000888800 f444444441f444414444444144444441077777777333337749999999999999914222222222222221777777770000017777100000000888999988880008899880 f444444441f44441444444414444444100777777337373374919999999999191421222222222212177777777000117777771000000558855558855508899f988 f444444441f444411111111111111111000777773773773749999444449999914222222222222221777777770017777777710100005558855885555088889f98 f444444441f144414441444444414444000077773733373749994411144999914222222222222221777777770017777777771710005558988985555080089998 f444444441411114444144444441444400000777333733374999441994419991422222222222222177777777001777777c777771005558888885555008088988 f444444441fffff144414444444144440000007733333337499944199441999142222222222222217777777701777cc777c77771000558888885550080008880 f444444441f444411111111111111111000000077733377749999119444199914222222222222221777777771777c77777777771000000000000000000800000 f444444441f44441777777770000001111000000b000000049999994411199914222222222222221000001111001000077777100000599559999999900000000 f444444441f4444188888888000001b333100000b000000049999994419999914222222222222221000017771017100077777710005599559995999900000000 114444441f4444419900009900001b3333310000b000000049999999119999914222222222222221000177777177100077777771005599999555555000000000 ff1144441f4444419000008900001b3333310000b000000049999994499999914222222222222221000777777777101077777770000559999955999900000000 f4ff1111f4444441900000890000133333310000b000000049999994419999914222222222222221011777777777717177777110000005995559999000000000 f444fff1f4444441998888990000133333310000b000000049199999119991914212222222222121177777777777777117711000000058855555990000000000 f4444441f4444411999999990000013333100000b000000049999999999999914222222222222221177777777777777101100000000588555555900000000000 41111114f1111114888888880000001111000000b000000011111111111111111111111111111111017777777777771000000000000585555550000000000000 1111111111111111111111111111111133333133000000010000000000000000000000000008008800177c77777777777c777777000585555585000000000000 1bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb1333311130000001300000000000000000000800008008888000177c77c777777c7777777000585555885000000000000 133333bbbbbb333333333333333333313333111300000133000000000000000000000808008888890000177cccc777cccc7777c7000088558885500000000000 1bbb33bbbbbb3bb3333333333b3b3bb13333111300001333000000000000000000008888808898980000177777cccccc7ccccc77000088888888500000000000 1bbb33bbbbbb3bb33333333333b3bbb1311311130001333300000000000000800080898900898999000001117777cc7777ccc777000088888988800000000000 1bbb33bbbbbb3bb3333333333b3b3bb131133133001333330000011100008088000889f908889f9f000000001777777177777777000888888888800000000000 1bbb33bbbbbb3bb33333333333b3bbb131133333013333330011133300000889000899ff88989fff000000000117771011777711000888888888800000000000 1bbb33bbbbbb3bb3333333333b3b3bb131133333133333331133333300008899008889ff88899fff000000000001110000111100000888888888800000000000 1bbb33bbbbbb3bb33333333333b3bbb1000000999900000000007777000000090000000000000000000000000000000000000000000000000000000000000000 1bbb33bbbbbb3bb3333333333b3b3bb1000009999440000000777777000000090000000000000000000000000000000000000000000000000000000000000000 1bbb33bbbbbb3bb33333333333b3bbb1000099994444000007779999000000990000099991100000000000000000000000000000000000000000000000000000 1bbb33bbbbbb3bb3333333333b3b3bb1000999994444400077999444000000990000999999110000000000000000000000000000000000000000000000000000 1bbb33bbbbbb3bb33333333333b3bbb1009999999444990077999444000009990000994499110000000000000000000000000000000000000000000000000000 1bbb33bbbbbb3bb3333333333b3b3bb1099444999999999007779999099999990009949919911000000000000000000000000000000000000000000000000000 11111111111111111111111111111111094444499999999000777777099999490009949919911000000000000000000000000000000000000000000000000000 00111111111111111111111111111100994444499999449900007777009999490009949919911000000000000000000000000000000000000000000000000000 001bbb33bbbbb3bb33333333b3bbb100994444499999444900000003000999490009949919911000000000000000000000000000000000000000000000000000 001bbb33bbbbb3bb333333333b3bb100999444999999944933300003000099990009949919911000000000000000000000000000000000000000000000000000 001bbb33bbbbb3bb33333333b3bbb100999999999999999903330003000099990009949919911000000000000000000000000000000000000000000000000000 001bbb33bbbbb3bb333333333b3bb100094447777774449003333003000999990009949919911000000000000000000000000000000000000000000000000000 001bbb33bbbbb3bb33333333b3bbb100000077777777000000333303000999990009949919911000000000000000000000000000000000000000000000000000 001bbb33bbbbb3bb333333333b3bb100000077777797000000333303000999900000991199110000000000000000000000000000000000000000000000000000 001bbb33bbbbb3bb33333333b3bbb100000077777797000000033333009990000000999999110000000000000000000000000000000000000000000000000000 001bbb33bbbbb3bb333333333b3bb100000007777970000000000033009900000000099991100000000000000000000000000000000000000000000000000000 00000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000370003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00003330037770000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00007330033700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00033370073377000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00033330333770000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00737330733337700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00333330337337000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00333730333330000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00373330373333700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00333370333373700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00373330073333300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00033730033733300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00033330003333700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00007370000373330000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000030000003730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 99000009990000090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 93990009939900090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 09399009093990090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 09939909099399090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00993909009939090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00999399009993990000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00099999000999990000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000099000000990000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000094000000990000007400000009000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000094000009999000007400000009000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000944400099999900077740000009000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000944400099749900077740000009000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000944400997994990077740000009000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000944400997994990077740000009000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000744400997994990077740000007000 __label__ cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc ccccccccccccccccccccccccccccccccccccccccccc000000000000000c00000ccc00000000000000000cccccccccccccccccccccccccccccccccccccccccccc ccccccccccccccccccccccccccccccccccccccccccc077707070777070c07770ccc07070777077707070cccccccccccccccccccccccccccccccccccccccccccc ccccccccccccccccccccccccccccccccccccccccccc070707070070070c00700ccc07070070007007070cccccccccccccccccccccccccccccccccccccccccccc ccccccccccccccccccccccccccccccccccccccccccc077007070070070cc070cccc07070070c07007770cccccccccccccccccccccccccccccccccccccccccccc ccccccccccccccccccccccccccccccccccccccccccc07070707007007000070cccc07770070007007070cccccccccccccccccccccccccccccccccccccccccccc ccccccccccccccccccccccccccccccccccccccccccc07770077077707770070cccc07770777007007070cccccccccccccccccccccccccccccccccccccccccccc ccccccccccccccccccccccccccccccccccccccccccc00000000000000000000cccc00000000000000000cccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc ccccccccccccccccccccc0000000000000ccccccc000000000000000000000ccc0000000c000000000000000000000000000000000cccccccccccccccccccccc ccccccccccccccccccccc0777077007070ccccccc077707770077077700770ccc0777070c077707770777007707770777077707770cccccccccccccccccccccc ccccccccccccccccccccc0707070707070ccccccc077700700700070707070ccc0707070c070700700700070707070777070007070cccccccccccccccccccccc ccccccccccccccccccccc0777070707070ccccccc07070070070c077007070ccc0777070c077700700770070707700707077007700cccccccccccccccccccccc ccccccccccccccccccccc0707070707770000cccc070700700700070707070ccc07000700070700700700070707070707070007070cccccccccccccccccccccc ccccccccccccccccccccc0707077700700070cccc070707770077070707700ccc070c077707070070070c077007070707077707070cccccccccccccccccccccc ccccccccccccccccccccc000000000000c000cccc00000000000000000000cccc000c000000000000000c000000000000000000000cccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 44444444444441ccccccccccccccccccccccccccccccccccccccccccccccccffffffffffffffff1444444444444441ffffffffffffffff1444444444444441ff 99999999999991cccccccccccccccccccccccccccccccccccccccccccccccc444444414444444149999999999999914444444144444441499999999999999144 19999999999191cccccccccccccccccccccccccccccccccccccccccccccccc444444414444444149199999999991914444444144444441491999999999919144 99944444999991cccccccccccccccccccccccccccccccccccccccccccccccc111111111111111149999444449999911111111111111111499994444499999111 99441114499991cccccccccccccccccccccccccccccccccccccccccccccccc444144444441444449994411144999914441444444414444499944111449999144 99441994419991cccccccccccccccccccccccccccccccccccccccccccccccc444144444441444449994419944199914441444444414444499944199441999144 99441994419991cccccccccccccccccccccccccccccccccccccccccccccccc444144444441444449994419944199914441444444414444499944199441999144 99911944419991cccccccccccccccccccccccccccccccccccccccccccccccc111111111111111149999119444199911111111111111111499991194441999111 99999441119991cccccccccccccccccccccccccccccccccccccccccccccccc444444414444444149999994411199914444444144444441499999944111999144 99999441999991cccccccccccccccccccccccccccccccccccccccccccccccc444444414444444149999994419999914444444144444441499999944199999144 99999911999991cccccccccccccccccccccccccccccccccccccccccccccccc444444414444444149999999119999914444444144444441499999991199999144 99999449999991cccccccccccccccccccccccccccccccccccccccccccccccc111111111111111149999994499999911111111111111111499999944999999111 99999441999991cccccccccccccccccccccccccccccccccccccccccccccccc444144444441444449999994419999914441444444414444499999944199999144 19999911999191cccccccccccccccccccccccccccccccccccccccccccccccc444144444441444449199999119991914441444444414444491999991199919144 99999999999991cccccccccccccccccccccccccccccccccccccccccccccccc444144444441444449999999999999914441444444414444499999999999999144 11111111111111cccccccccccccccccccccccccccccccccccccccccccccccc111111111111111111111111111111111111111111111111111111111111111111 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc999ccccccccccccccccccccccccccccccccccccccccc ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc88888cc999ccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc88888888899ccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc5559959c555ccccccccccccccccccccccccccccccccccccccccc ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc595999599555ccccccccccccccccccccccccccccccccccccccccc ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc595599959995ccccccccccccccccccccccccccccccccccccccccc ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc55999955555cccccccccccccccccccccccccccccccccccccccccc ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc99999995ccccccccccccccccccccccccccccccccccccccccccc ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc55555855585cccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc555555585558cc5ccccccccccccccccccccccccccccccccccccccccc ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc9955555588888cc5ccccccccccccccccccccccccccccccccccccccccc ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc999c885889889855ccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc9c5888888888855ccccccccccccccccccccccccccccccccccccccccc ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc55588888888855ccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc5558888888cccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc5cc8888ccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc fffffff14ffff44ffffffff14ffff44ffffffff14ffff44ffffffff14ffff44ffffffff14ffff44ffffffff14ffff44ffffffff14ffff44ffffffff14ffff44f 44444441f44441f444444441f44441f444444441f44441f444444441f44441f444444441f44441f444444441f44441f444444441f44441f444444441f44441f4 44444441f44441f444444441f44441f444444441f44441f444444441f44441f444444441f44441f444444441f44441f444444441f44441f444444441f44441f4 44444441f44441f444444441f44441f444444441f44441f444444441f44441f444444441f44441f444444441f44441f444444441f44441f444444441f44441f4 44444441f14441f444444441f14441f444444441f14441f444444441f14441f444444441f14441f444444441f14441f444444441f14441f444444441f14441f4 44444441411114f444444441411114f444444441411114f444444441411114f444444441411114f444444441411114f444444441411114f444444441411114f4 44444441fffff1f444444441fffff1f444444441fffff1f444444441fffff1f444444441fffff1f444444441fffff1f444444441fffff1f444444441fffff1f4 44444441f44441f444444441f44441f444444441f44441f444444441f44441f444444441f44441f444444441f44441f444444441f44441f444444441f44441f4 44444441f44441f444444441f44441f444444441f44441f444444441f44441f444444441f44441f444444441f44441f444444441f44441f444444441f44441f4 44444441f44441f444444441f44441f4440000000000010000444440000000f4440000000004410000000000004441f444444441f44441f444444441f44441f4 4444441f444441114444441f4444411144070700770701077004440077777001440777007704410777070707700441114444441f444441114444441f44444111 1144441f444441ff1144441f444441ff1107070707070107070444077070770f110070070704410707070707070441ff1144441f444441ff1144441f444441ff ff1111f4444441f4ff1111f4444441f4ff077707070701070701110777077704ff1070070704410770070707070441f4ff1111f4444441f4ff1111f4444441f4 44fff1f4444441f444fff1f4444441f44407070707070007070ff1077070770444f070070704410707070707070441f444fff1f4444441f444fff1f4444441f4 444441f4444411f4444441f4444411f444070707700777077704410077777004444070077004110707007707070411f4444441f4444411f4444441f4444411f4 111114f111111441111114f1111114411100000000000000000114f00000004111100000001114000000000000011441111114f111111441111114f111111441 __gff__ 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002010101010101010101010000000000000000000000000000000000000000000101050500008383010100000000000001010500000083830101000000000001 0101010100000000000000000000000001010101000000008888000000000000010100010000000088880000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 __map__ 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000969700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000969700000000000000009697000096970000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 __sfx__ 011200200a135161450713513145081351414507100071000710013100131000a1000a13516145071351314508135141450810008100141001410014100141001f3001f3001f3000030000300003000030000300 01120020031350f145001350c145011350d1450f1000f10000100001000010000100031350f145001350c145011350d14501100011000d1000d1050d1450c1350b1451f3001f3000030000300003000030000300 010e00000e1000e0050e1000e005021050e1050e1000e00500100001000e1000e0050e1000e005001000010013100131051310500100001000010000100001000710007100071050010000100001000010000100 010a00003c6153c0053c6053c005186103c0053c6153c0053c0053c005186103c0053c6153c0053c0053c0053c6153c0053c0053c0053c0053c0053c0053c0053c6153c0053c6153c0053c615000053c61500005 011300002433500000000001f33500000000001c33500000000002133523305233350000022335213350c0231f33528335283052b3352d33500000293352b335000002833500000243352633523335000000c023 011300001c325000000000018325000000000013325000000000018325000001a3250000019325183250c0030c0231f32500000233253c6150000021325233250c0031f325000001c3253c6151a325000000c003 01130000131353f2150c000101353c6153f2150c1350c0000c023111353f215131353c61512135111353f21510135181353f2151c1351d135180001a1351c1350c023181353f215151351713513135071043f215 010c0000243301a015243301a015243301a0151a015243301a015243301a0151a015243301a015243301a01523330180352333018015233301803518015233301801523330180151803523330180352333018035 01130000000002b3052b3352a33529335273353f215283350c0232033521335243353c61521335243352633500000000002b3352a335293352733528305283350000030335070003033530335000000000000000 001300000c0233f205283252732526325233053f205243050c0031c3051d3251f3253c605183251c3251d3250000000000283252732526325233052430524325000002b325003002b3253c615000000000000000 01130000001353f21500000071353c615233250c13524325051351c3253f2150c1350c1353f215051353f215001353f2153f215041353c61523325071350c1350c023293253f21529325293253f215071353f215 01130000000002b3052b3352a335293352733500000283350c0232033521335243353c6152133524335263350000000000273352a30529305263352830528305243353030507000283053c615000000000000000 001300000000000000283052732526325233053f215243050c0031c3051d3251f3253c605183251c3251d32500000000002032527305263051d32524305243051c3352b305003002b3053c6053f2050000000000 01130000001353f21528325071353c615233250c13524325051351c3253f2150c1350c1353f215051353f215001353f215081353f2153c6150a1353f2150c1050c1350c1053f21507135071353f215001353f215 011300002433524335000002433500000243352633500000283352433500000213351f335000003f2150000024335243350000024335000002433526335283350c023000003f2050c023000003f6153f6153f615 011300000c0232030500000203253c6052032522325000001f3251c305000001c32518325000003f205000000c0232030500000203250000020325223251f3250c003000003f2050c003000003f6053f6053f605 0113000008135203253f2150f1353c6153f2151413500000131351c325000000c1353c6153f615071353f6150813520325336150f135306153f215141351f3251313500000000000c13500000000000713500000 0110000013334183341c3341f33424334283342b3342b3302b33014334183341b3342033424334273342c3342c3302c330163301a3341d3342233426334293342e3342e330163002e3352e3352e3353033030330 0113000008135203253f2150f1353c615203251413500000131350c023000000c1353f6153f605071353f6150e1350e1353f6150e135000000e1350e135000001313500000000000c023071353f6153f6153f615 011300002433524335000002433500000243352633500000283352433500000213351f335000003f2150000028335283350000028335000002433528335000002b3350000000000000001f335000000000000000 011300000c0232030500000203253c6052030522325000001f3251c325000001c32518325000003f205000000c0231e325000001e325000001e3251e325000002332500000000000000013325000000000000000 011300002833524335000001f3353f6150000020335000002133529335000002933521335000003f21500000233352d335000002d3352d3352b3350000029335283352433524305213351f335000003f21500000 011300002432521325000001c3253f605000001d325000001d3252432500000243250c135000003f205000001f3252932500000293253f6152832500000263252432521305000001d3053f615000003f20500000 01130000001353f2153f21506135071350c1050c1353f215051353f215051353f2153f6150c1350513505105021353f2150000005135071353f2150b1353f2150713521325071351d3250c1350c1350713500000 01130000001353f2153f21506135071350c1050c1353f215051353f215051353f2150c1350c135051353f215071353f215000000713507135091353f2150b1350c1353f215071353f215001350c1053f21500000 011300002833524335000001f3353f61500000203350000021335293350000029335213350000000000000002333529335000002933529335283350000026335243351c335243051c33518335000000000000000 011300002432521325000001c3253f605000001d325000001d3252432500000243253f6150000000000000001f3252632500000263253f6152432500000233251f32521305000001d3053f615000000000000000 010c00000e0301d3151d330150303c6101d3151d3151a0300c0331d3301d015150303c6101a3301a0300c0330c0301c3151c330130303c6101c3151c315180300c0331c3301c015130303c6101c015180300c033 0114002028335283352830028335280052433528335280052b3352b3052b305003001f3350030000300003002b3052b3052b305003002b3050030000300003001f3001f3001f3050030000300003000030000300 011400201e3251e3251e3001e3251e0051e3251e325003002332523305230050000013325000000000000000233052330523005000001f3050000000000000001330013300130050000000000000000000000000 011400200e1350e1353c6050e1353c6050e1350e13500100131351310513105001000713500100001000010013105131051310500100131050010000100001000710007100071050010000100001000010000100 010a00003c6053c0053c6053c005186003c0053c6053c0053c0053c005186003c0053c6053c0053c0053c0053c6053c0053c0053c0053c0053c6053c6053c6053c6053c0053c6053c0053c605000053c60500005 011200200a325163250732513325083251432507100071000710013100131000a1000a32516325073251332508325143250810008100141001410014100141001f3001f3001f3000030000300003000030000300 01120020033250f325003250c325013250d3250f1050f10500105001050010500105033250f325003250c325013250d32501105011050d1050d3050d3250c3250b3251f3051f3050030500305003050030500305 010d00000a1450a725001050d1400d725001050c1400c725001050614006725001050514005725001050b1400b725001050a135101450f1350e145141351314512135001000d1450010009145001000814507305 010d00000a3200a7050a0050d3200d100003000c32000300003000632000300003000532000300003000b32000300003000a320103200f3200e320143201332012320003000d3200030009320003000832000305 010e00200714500105061450d10500105001050c10500105001050610500105001050510500105001050b10500105001050a305103050f3050e305143051330512305000000d3050000009305000000830507305 010e00200732000305063200d10500105001050c10500105001050610500105001050510500105001050b10500105001050a305103050f3050e305143051330512305000000d3050000009305000000830507305 01120000030300303003030030300303003030030300303002030020300203002030060300603006030060300503005030050300503005030050300503005030040300403004030040300a0300a0300a0300a030 010900000903009030090300903009030090300903009030040300403004030040300403004030040300403003030030300303003030030300303003030030300403004030040300403004030040300403004030 011200001f317223171f317213171f317203171f317213171f317223171f317233171f317223171f317213171e317213171e317203171e317213171e317223171e317213171e317223171e317213171e31720317 010900002231726317223172731722317263172231725317223172631722317253172231724317223172531722317263172231727317223172631722317253172231726317223172531722317243172231725317 0108000023330233202933029310130151301529330293252933029325293002833028325283002633026325263002433024325243000030000300003000030000300183130c3310030000300003000030000300 0108000013030130251f313133312631312331130301302513030130251d00015030150251c00017030170251a0001f3130a3311c3131333113030130201c313103310c0300c0200c00000000000000000000000 01100000000001032013320183201c3201f320243202432024320283000f32014320183201b320203202432024320243202030011320163201a3201d320223202632026320223001a3251a3251a3251c3201c320 010a00002433424330000000000000000000001f3341f330000000000000000000001c3341c3301c3301c33021334213302132023334233302332021334213302132020334203302032020320223342233022320 010f000022320203342033020320203201f3341f3301f3301f3301f3301f3321f3351f3001f300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 010a00001c3341c33000000000000000000000183341833000000000000000000000133341333013330133301d3341d3301d3301d3301d3301d3301d3301d3301d3301d3341d3301d3301d3301d3301d3301d330 010b00201033020337230172033520330203301133021330213102133524017213171233022330223102233522330223301f030130101f036130361f036130361f036130361f0361300700000000000000000000 010a00001303013030000000000000000000001003010030000000000000000000000c0300c0300c0300c0301103011030110301103011030110301103011030110300d0300d0300d0300d0300d0300d0300d030 011000000d0300d0300d0300d0320d0320c0300c0300c0300c0220c0220c0120c0150000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 010b00201c33026330263102633526330263301d33027330273102733527330273301e33028330283102833528330283302933029310293262332629326233262932623326293262330000000000000000000000 01040000103500c3510e3501035010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 01020000133551f3552b3553735537305003000030000300003000030000300003000030000300003000030000300003000030000300003000030000300003000030000300003000030000300003000030000000 010200002406025051270412f0002b0512c0512d0412e0312f0212f0052f00032000030000000037000370002f0002f0002f0002f000000003300004000000000000000000000000000000000000000000000000 01020000346500513000605396500a130006053365004130006053865009130006053265003130006053765008130006053165002130006053365004130006000060000600006000060000600006000060000600 01030000343502d350343502d35028350213501c35015350103500a35004350343502d350343502d35028350213501c35015350103500a35004350343502d350343502d35028350213501c35015350103500a350 01050000183401f340203401934020340213401a34021340223401b3402234023340003000030000300003000030000300003001a30021300223001b300223002330000300003000030000300003000030000000 01040000244401f44024440284402b440304402b4402044024440274402c440274402c440304403344038440334402244026440294402e440294402e44032440354403a440354400040000400004000040000400 01100000373553c35534c703c3553e35537c700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0104000015320163201732018320193201a3201b3201c3201d3201e3201f320203202132022320233202432025320263202732028320293202a3202c3202d3202f32030320323203332035320363203832039320 010400002f3502f3502f3503435034350343503434034340343403434034340343303433034320343203432034310343103431500300003000030000300003000030000300003000030000300003000030000300 010200001f3601f3602233022330214312133023360233601f450214512130021300233012330023300233001f4001f4001f4001f405214002130523300233051f4002040122401233001f400000000000000000 0103000021360213602135021350213502135022340233302432025320263202732028320293202a3202b3102c3102d3100000000000000000000000000000000000000000000000000000000000000000000000 __music__ 00 1c1d1e03 01 04060547 00 04060547 00 080a0947 00 0b0d0c47 00 08090a47 00 0b0c0d47 00 0e100f51 00 13121451 00 04050647 00 04050647 00 1517165b 00 19181a5b 00 1517165b 00 19181a5b 00 0e100f51 00 13121451 00 1516175b 02 191a185b 01 00204302 00 01214302 00 22234344 02 24254342 03 071b6869 00 3e6d6a67 04 2a2b6c67 00 2d316f67 04 2e327067 01 26285167 02 27296c67 00 3c7b7167 04 112c7044 04 33304344