-- title: Alter Ego (WIP) -- author: ORIGINAL ZX SPECTRUM GAME BY DENIS GRACHEV -- NES CONVERSION BY SHIRU -- NES MUSIC BY RICHARD "KULOR" ARMIJO -- TIC-80 CONVERSION BY KYUCHUMIMO AND PIXELBATH -- desc: My first TIC-80 program --WARNING: Saved on TIC-80 0.80.xxxx beta. Music doesn't work on previous versions. --CHANGELOG: --201120 - pixelbath joined the project. Code optimization: 26473 to 21757 bytes. Changelog moved to tic80.com/play?cart=1420 --INFO: --https://tic80.com/play?cart=1420 --https://www.youtube.com/watch?v=O3uOHAvlsN8 --http://www.retrosouls.net/?page_id=614 -- script: lua --VARIABLES --climb c=0 --sprite flip f=0 --lives l=5 --LEVEL (DEFAULT=0) m=0 --pixels (KEEP AWAY FROM 0) px=0 aepx=0 --swap s=0 --EVENT TIMER et=nil --GLOBAL TIMER t=0 --bridge animation trigger btrig=0 --FALL TRIGGER ftrig=0 --PAUSE TRIGGER ptrig=0 --SWAP TRIGGER strig=0 --ALTER EGO mirroring (0=H,1=V) aeo=0 --HERO animation ticks anix=0 aniy=0 --HERO X position animx=0 --HERO Y position animy=0 --ALTER EGO X position aex=0 --ALTER EGO Y position aey=0 --palette RGB value v=0 options = { music = true, debug = true, } leveldata = { { name='title' }, { name='hello world', s=2, px=3, aepx=0, aeo=0, animx=21, animy=3 }, { name='promenade', s=2, px=8, aepx=0, aeo=0, animx=5, animy=3 }, { name='broken bridge', s=0, px=8, aepx=0, aeo=0, animx=11, animy=3 }, { name='phantom pixels', s=3, px=2, aepx=4, aeo=0, animx=14, animy=3 }, { name='another phantom', s=4, px=13, aepx=0, aeo=1, animx=3, animy=10 }, { name='skulls lair', s=2, px=14, aepx=0, aeo=0, animx=17, animy=13 }, { name='abracadabra', s=2, px=6, aepx=6, aeo=0, animx=9, animy=10 }, { name='vertical illusions', s=8, px=10, aepx=0, aeo=1, animx=4, animy=9 }, { name='mirrors', s=2, px=4, aepx=3, aeo=0, animx=26, animy=11 }, { name='16 pixels', s=4, px=16, aepx=0, aeo=0, animx=5, animy=9 }, { name='perfect reflect', s=1, px=16, aepx=0, aeo=0, animx=15, animy=10 }, { name='icelands', s=3, px=5, aepx=3, aeo=0, animx=15, animy=9 }, { name='midnight', s=2, px=5, aepx=0, aeo=0, animx=23, animy=12 }, { name='alone skull', s=3, px=3, aepx=2, aeo=0, animx=15, animy=2 }, { name='made in heaven', s=5, px=9, aepx=6, aeo=1, animx=4, animy=4 }, { name='underwater', s=2, px=3, aepx=5, aeo=0, animx=2, animy=9 }, { name='zupapixels', s=9, px=8, aepx=1, aeo=0, animx=3, animy=2 }, { name='skullopedia', s=4, px=12, aepx=0, aeo=0, animx=7, animy=12 }, { name='after the war', s=3, px=8, aepx=0, aeo=1, animx=3, animy=2 }, { name='vuris knvartirus', s=6, px=11, aepx=0, aeo=0, animx=24, animy=13 }, { name='the end', s=143, px=-255, aepx=-255, aeo=0, animx=-1, animy=-2 }, } cls() map() --PALETTE STUFF local basepalette = { 0x1a1c2c, 0x29366f, 0x3b5dc9, 0x1a1c2c, 0x5d275d, 0x38b764, 0xb13e53, 0x333c57, 0x41a6f6, 0xef7d57, 0x94b0c2, 0xa7f070, 0xe06f8b, 0x73eff7, 0xffcd75, 0xf4f4f4 } function pal(v) for i = 1, #basepalette do local offset, color = i-1, basepalette[i] poke(0x3fc0+(offset*3), ((color//65536) * v)) poke(0x3fc1+(offset*3), ((color//256)%256) * v) poke(0x3fc2+(offset*3), (color%256) * v) end end function fade_out(et) if t==(et+(2.1*60)) then if mget((30*m%240)+(animx*8+(anix//10))//8,(17*(m//8))+(animy*8+(aniy//10)+8)//8)==6 or mget((30*m%240)+(animx*8+(anix//10))//8,(17*(m//8))+(animy*8+(aniy//10)+16)//8)==151 or mget((30*m%240)+(animx*8+(anix//10))//8,(17*(m//8))+(animy*8+(aniy//10)+16)//8)==152 or mget((30*m%240)+(animx*8+(anix//10))//8,(17*(m//8))+(animy*8+(aniy//10)+16)//8)==153 then music() end return pal(1) end if t==(et+(2.2*60)) then return pal(0.75) end if t==(et+(2.3*60)) then return pal(0.5) end if t==(et+(2.4*60)) then return pal(0.25) end if t==(et+(2.5*60)) then return pal(0) end end function fade_in(et) if t==(et+(0*60)+1) then return pal(0) end if t==(et+(0.1*60)) then return pal(0.25) end if t==(et+(0.2*60)) then return pal(0.5) end if t==(et+(0.3*60)) then return pal(0.75) end if t==(et+(0.4*60)) then return pal(1) end end -- PARTICLE/VFX STUFF particles = {} particletype = 'stars' local starcolors = { 1, 2, 13, 15} -- numparticles = number of particles to show -- particletype = rain|snow|stars function particleinit(numparticles, type) -- initialize particles = {} particletype = type for i = 0, numparticles do table.insert(particles, { x = math.random() * 240, y = math.random() * 136, lastx = 0, lasty = 0, color = 2, t = 0, vel = 0, }) end if particletype == 'stars' then for i = 1, #particles do particles[i].twinkle = math.random() > 0.49 -- randomly pick true/false particles[i].color = starcolors[math.random(#starcolors)] end end if particletype == 'rain' then for i = 1, #particles do particles[i].vel = math.random(3) + 1 if particles[i].vel > 2.5 then particles[i].color = 8 end end end if particletype == 'snow' then for i = 1, #particles do particles[i].color = 15 particles[i].vel = math.random() + 0.2 end end end function particleupdate() if particletype == 'stars' then for i = 1,#particles do local p = particles[i] if not p.twinkle then goto continueTwinkle end ::continueTwinkle:: if t % 15 == 0 and math.random() > 0.1 then p.color = starcolors[math.random(#starcolors)] end end end if particletype == 'rain' then for i = 1,#particles do local p = particles[i] if p.lasty and p.lasty > 136 then p.y = 0 p.lasty = 0 p.x = math.random() * 240 end p.lasty = p.y p.lastx = p.x p.x = p.x - p.vel / 5 p.y = p.y + p.vel * 1.5 end end if particletype == 'snow' then for i = 1,#particles do local p = particles[i] if p.y and p.y > 136 then p.y = 0 p.lasty = 0 p.x = math.random() * 240 end p.x = p.x - (math.random() - 0.4) p.y = p.y + p.vel end end end function particledraw() if (particletype == 'rain') then for i = 1,#particles do local p = particles[i] line(p.x, p.y, p.lastx, p.lasty, p.color) end return end for i = 1,#particles do local p = particles[i] pix(p.x, p.y, p.color) end end -- init here for title screen particleinit(150, 'stars') --(shx: Xpos, shy: Ypos, shf: flip, sht: timer) CHECK THIS function skullh(shx,shy,shf,sht) --local shx --local shy --local sht --local shf if mget((30*m%240)+((shx-8)//8),(17*(m//8))+((shy+8)//8))==0 or mget((30*m%240)+((shx+8)//8),(17*(m//8))+((shy+8)//8))==0 then if shf==0 then shf=1 else shf=0 end --sht=0 spr(288+t%16//4,(shx*8)+(sht//8),(shy*8),0,1,shf,0,1,2) else --sht=sht+1 spr(288+t%16//4,(shx*8)-(sht//8),(shy*8),0,1,shf,0,1,2) end if (animx*8+(anix//10))==shx*8 and ((animy*8+(aniy//10))+8)==(shy*8)+8 then ftrig=0 l=l-1 sfx(56,45,-2,0) t=0 level(m) end --SCREEN SKULL SPR POSITION DEBUG --print(shx*8,22,24) --print((shy*8)+8,22,30) end --LEVEL PROPERTIES (ANIMX/Y LIMITS(1-28,1-14)) function level(m) -- reset level data sync (0,0, false) c=0 f=0 px=nil aepx=nil anix=0 aniy=0 et=-255 strig=0 ftrig=0 t=0 -- switch particles if m==1 then particleinit(150, 'stars') end if m>=2 and m<12 then particleinit(120, 'rain') end if m>=12 then particleinit(180, 'snow') end if m==22 then particleinit(150, 'stars') end if m > 0 then local data = leveldata[m] s = data.s px = data.px aepx = data.aepx aeo = data.aeo animx = data.animx animy = data.animy end --END if m==22 then l=143 s=143 mset((30*m%240)+(animx*8+(anix//10))//8,(17*(m//8))+((animy*8+(aniy//10))//8),1) mset(((30*m%240)+(animx*8+(anix//10))//8)-1,(17*(m//8))+((animy*8+(aniy//10))//8)+1,1) mset((30*m%240)+(animx*8+(anix//10))//8,(17*(m//8))+((animy*8+(aniy//10))//8)+2,1) mset(((30*m%240)+(animx*8+(anix//10))//8)+1,(17*(m//8))+((animy*8+(aniy//10))//8)+1,1) end end level(m) function TIC() --MUSIC (For loop use t%(spd*rows*#patterns used)==0) if options.music then --TITLE SCREEN if m==1 and t==0 then music(0,-1,-1,false) end --LEVELS 1-10 if m>=2 and m<=11 and t==0 then music(1,-1,-1,false) end --LEVELS 11-21 if m>=12 and m<=21 and t==0 then music(2,-1,-1,false) end --LEVELS 21-??? if m>=22 and t==0 then music(3) end end --TIMER if ptrig==0 then t=t+1 end --CREDITS if m==0 then map(0,0,30,17) if options.debug then print(t,0,0,15,true,1,true) print(et,0,6,15,true,1,true) end fade_in(0) if t==(3*60) or keyp(50) then et=t t=180 end if t>(et+(3*60)) and et>=0 then m=m+1 t=0 et=-255 else fade_out(et) return end end --TITLE SCREEN if m==1 then l=5 --REMAP cls() particleupdate() particledraw() map(30*m%270,17*((m-1)//8),30,17,0,0,0,1) fade_in(0) if t<0.4*60 then return end if options.debug then print("DEBUG: Press X/A and Y/S to switch levels",8,131) print(et,0,0,15,true,1,true) end if keyp(50) and et<=0 then music() sfx(51,43,-1,0,15) et=t end if t>(et+(3*60)) and et>=0 then m=m+1 level(m) else fade_out(et) return end end --LEVEL DISPLAY if m>1 then fade_in(0) --REMAP cls() if ptrig==0 then particleupdate() end particledraw() rect(0,0,240,8,0) map(30*m%240,17*(m//8),30,17,0,0,0,1, function(tile) if tile>=80 and tile<=111 and anix==0 and aniy==0 and px==0 and aepx==0 then return tile*(t%38//19) end if tile==6 or tile==22 or tile==38 or tile==54 then return tile+(t%38//19) else if tile~=6 and tile~=22 and tile~=38 and tile~=54 and not (tile>=64 and tile<=79) then return tile end end end ) --PIXELS DISPLAY map(30*m%240,17*(m//8),30,17,0,0,0,1, function(tile) if tile==64 or tile==72 then return tile+(t%20//2.5) end if tile==65 or tile==73 then return tile+(((t+2.5)%20//2.5)-1) end if tile==66 or tile==74 then return tile+(((t+5)%20//2.5)-2) end if tile==67 or tile==75 then return tile+(((t+7.5)%20//2.5)-3) end if tile==68 or tile==76 then return tile+(((t+10)%20//2.5)-4) end if tile==69 or tile==77 then return tile+(((t+12.5)%20//2.5)-5) end if tile==70 or tile==78 then return tile+(((t+15)%20//2.5)-6) end if tile==71 or tile==79 then return tile+(((t+17.5)%20//2.5)-7) end end ) --SKULLH LIMITS(1-28,1-14) --skullh(12,10,0,0) --if btn(5) then skullh(25,3,0,0) end --skullh(20,6,0,0) --LEVEL CLEAR if px==0 and aepx==0 and anix==0 and aniy==0 then if et<0 then sfx(52,36,90,0) for i=0,29 do mset((30*m%240)+i,(17*(m//8)),0) end mset((30*m%240)+10,(17*(m//8)),91) mset((30*m%240)+11,(17*(m//8)),84) mset((30*m%240)+12,(17*(m//8)),101) mset((30*m%240)+13,(17*(m//8)),84) mset((30*m%240)+14,(17*(m//8)),91) mset((30*m%240)+16,(17*(m//8)),82) mset((30*m%240)+17,(17*(m//8)),91) mset((30*m%240)+18,(17*(m//8)),84) mset((30*m%240)+19,(17*(m//8)),80) mset((30*m%240)+20,(17*(m//8)),97) et=t end if et>0 then spr(257+(f*3),animx*8+(anix//10),animy*8+(aniy//10),0,1,f,0,1,2) spr(265,aex,aey,0,1,0,0,1,2) fade_out(et) end if t0 then spr(331+t%8//4,animx*8+(anix//10),animy*8+(aniy//10),0,1,0,0,1,2) spr(329+t%8//4,aex,aey,0,1,0,0,1,2) fade_out(et) end if t0 then sfx(57,82,-1,0) end ftrig=1 animy=animy+1 aniy=-80 spr(263+t%8//4,animx*8+(anix//10),animy*8+(aniy//10),0,1,0,0,1,2) end --NOTHING if anix==0 and aniy==0 and t>(2*60) then if ftrig==1 and strig==0 then sfx(58,24,-1,0) end if strig==0 then spr(256+c,animx*8+(anix//10),animy*8+(aniy//10),0,1,f,0,1,2) else spr(301+t%8//4,animx*8+(anix//10),animy*8+(aniy//10),0,1,f,0,1,2) end ftrig=0 btrig=0 end if t<(2*60) then spr((256+c)+((t%20//10)*15),animx*8+(anix//10),animy*8+(aniy//10),0,1,f,0,1,2) end if m>1 then --CONTROLS, COLLISION and SFX --UP(0),DOWN(1),LEFT(2),RIGHT(3) if strig==0 and t>(2*60) and ptrig==0 then if btn(0) and (mget((30*m%240)+(animx*8+(anix//10))//8,(17*(m//8))+(animy*8+(aniy//10))//8)==5 or mget((30*m%240)+(animx*8+(anix//10))//8,(17*(m//8))+(animy*8+(aniy//10))//8)==37) and anix==0 and aniy==0 then ftrig=0 sfx(63,84,-1,3) animy=animy-1 aniy=80 end if btn(1) and (mget((30*m%240)+(animx*8+(anix//10))//8,(17*(m//8))+(animy*8+(aniy//10)+16)//8)==0 or mget((30*m%240)+(animx*8+(anix//10))//8,(17*(m//8))+(animy*8+(aniy//10)+16)//8)==5 or mget((30*m%240)+(animx*8+(anix//10))//8,(17*(m//8))+(animy*8+(aniy//10)+16)//8)==37) and anix==0 and aniy==0 then ftrig=0 sfx(63,84,-1,3) animy=animy+1 aniy=-80 end if btn(2) and anix==0 and aniy==0 and not ((mget((30*m%240)+(animx*8+(anix//10)-8)//8,(17*(m//8))+(animy*8+(aniy//10)+8)//8))==1 or (mget((30*m%240)+(animx*8+(anix//10)-8)//8,(17*(m//8))+(animy*8+(aniy//10)+8)//8))==2 or (mget((30*m%240)+(animx*8+(anix//10)-8)//8,(17*(m//8))+(animy*8+(aniy//10)+8)//8))==17 or (mget((30*m%240)+(animx*8+(anix//10)-8)//8,(17*(m//8))+(animy*8+(aniy//10)+8)//8))==18 or (mget((30*m%240)+(animx*8+(anix//10)-8)//8,(17*(m//8))+(animy*8+(aniy//10)+8)//8))==10 or (mget((30*m%240)+(animx*8+(anix//10)-8)//8,(17*(m//8))+(animy*8+(aniy//10)+8)//8))==11 or (mget((30*m%240)+(animx*8+(anix//10)-8)//8,(17*(m//8))+(animy*8+(aniy//10)+8)//8))==26 or (mget((30*m%240)+(animx*8+(anix//10)-8)//8,(17*(m//8))+(animy*8+(aniy//10)+8)//8))==27) then ftrig=0 --BRIDGE if mget((30*m%240)+(animx*8+(anix//10))//8,(17*(m//8))+(animy*8+(aniy//10)+16)//8)==48 or mget((30*m%240)+(animx*8+(anix//10))//8,(17*(m//8))+(animy*8+(aniy//10)+16)//8)==49 then sfx(61,0,-1,3) mset((30*m%240)+(animx*8+(anix//10))//8,(17*(m//8))+((animy*8+(aniy//10))//8)+2,0) btrig=1 else sfx(62,0,-1,3) end animx=animx-1 anix=80 end if btn(3) and anix==0 and aniy==0 and not ((mget((30*m%240)+(animx*8+(anix//10)+8)//8,(17*(m//8))+(animy*8+(aniy//10)+8)//8))==1 or (mget((30*m%240)+(animx*8+(anix//10)+8)//8,(17*(m//8))+(animy*8+(aniy//10)+8)//8))==2 or (mget((30*m%240)+(animx*8+(anix//10)+8)//8,(17*(m//8))+(animy*8+(aniy//10)+8)//8))==17 or (mget((30*m%240)+(animx*8+(anix//10)+8)//8,(17*(m//8))+(animy*8+(aniy//10)+8)//8))==18 or (mget((30*m%240)+(animx*8+(anix//10)+8)//8,(17*(m//8))+(animy*8+(aniy//10)+8)//8))==10 or (mget((30*m%240)+(animx*8+(anix//10)+8)//8,(17*(m//8))+(animy*8+(aniy//10)+8)//8))==11 or (mget((30*m%240)+(animx*8+(anix//10)+8)//8,(17*(m//8))+(animy*8+(aniy//10)+8)//8))==26 or (mget((30*m%240)+(animx*8+(anix//10)+8)//8,(17*(m//8))+(animy*8+(aniy//10)+8)//8))==27) then ftrig=0 --BRIDGE if mget((30*m%240)+(animx*8+(anix//10))//8,(17*(m//8))+(animy*8+(aniy//10)+16)//8)==48 or mget((30*m%240)+(animx*8+(anix//10))//8,(17*(m//8))+(animy*8+(aniy//10)+16)//8)==49 then sfx(61,0,-1,3) mset((30*m%240)+(animx*8+(anix//10))//8,(17*(m//8))+((animy*8+(aniy//10))//8)+2,0) btrig=1 else sfx(62,0,-1,3) end animx=animx+1 anix=-80 end --A/Z(4),B/X(5),X/A(6),Y/S(7) if (btnp(4) or btnp(5)) and m>=2 then if s>0 and not (mget((30*m%240)+aex//8,(17*(m//8))+((aey+8)//8))==1 or mget((30*m%240)+aex//8,(17*(m//8))+((aey+8)//8))==2 or mget((30*m%240)+aex//8,(17*(m//8))+((aey+8)//8))==16 or mget((30*m%240)+aex//8,(17*(m//8))+((aey+8)//8))==17 or mget((30*m%240)+aex//8,(17*(m//8))+((aey+8)//8))==18 or mget((30*m%240)+aex//8,(17*(m//8))+((aey+8)//8))==10 or mget((30*m%240)+aex//8,(17*(m//8))+((aey+8)//8))==11 or mget((30*m%240)+aex//8,(17*(m//8))+((aey+8)//8))==26 or mget((30*m%240)+aex//8,(17*(m//8))+((aey+8)//8))==27) then sfx(53,72,-1,3) s=s-1 strig=1 else if s==0 then sfx(55,31,-1,2) else sfx(59,60,-1,3) end end end if btnp(6) and m<=21 then m=m+1 level(m) end if btnp(7) and m>=3 and m<=21 then m=m-1 level(m) end end if t>=2*60 then if keyp(50) then if ptrig==0 then sfx(51,43,-1,0,15) ptrig=1 pal(0.5) must=peek(0x13ffc) musf=peek(0x13ffd) musr=peek(0x13ffe) musl=peek(0x13fff) music() else sfx(51,43,-1,0,15) ptrig=0 pal(1) music(must,musf,musr,musl) end end end --MOVEMENT PROPERTIES if strig==1 and anix==0 and aniy==0 then if aeo==0 then strig=(aex)-(animx*8+(anix//10)) end if aeo==1 then strig=(aey)-(animy*8+(aniy//10)) end end if strig~=1 then if strig<0 and ptrig==0 then if aeo==0 then animx=animx-0.5 end if aeo==1 then animy=animy-0.5 end strig=strig+4 end if strig>0 and ptrig==0 then if aeo==0 then animx=animx+0.5 end if aeo==1 then animy=animy+0.5 end strig=strig-4 end end if anix>0 then if btrig==1 then if m<=11 then spr(48,(animx*8)+8,(animy*8+(aniy//10))+16+(8-(math.abs(anix//10))),0) end if m>=12 then spr(49,(animx*8)+8,(animy*8+(aniy//10))+16+(8-(math.abs(anix//10))),0) end end c=0 f=0 if ptrig==0 then anix=anix-8 end spr(257+t%8//2,animx*8+(anix//10),animy*8+(aniy//10),0,1,f,0,1,2) end if anix<0 then if btrig==1 then if m<=11 then spr(48,(animx*8)-8,(animy*8+(aniy//10))+16+(8-(math.abs(anix//10))),0) end if m>=12 then spr(49,(animx*8)-8,(animy*8+(aniy//10))+16+(8-(math.abs(anix//10))),0) end end c=0 f=1 if ptrig==0 then anix=anix+8 end spr(257+t%8//2,animx*8+(anix//10),animy*8+(aniy//10),0,1,f,0,1,2) end if aniy>0 then c=5 if ptrig==0 then aniy=aniy-8 end spr(261+t%6//3,animx*8+(anix//10),animy*8+(aniy//10),0,1,0,0,1,2) end if aniy<0 then c=5 if ptrig==0 then aniy=aniy+8 end if not ((mget((30*m%240)+(animx*8+(anix/10))//8,(17*(m//8))+(animy*8+(aniy//10)+16)//8))==1 or (mget((30*m%240)+(animx*8+(anix/10))//8,(17*(m//8))+(animy*8+(aniy//10)+16)//8))==2 or (mget((30*m%240)+(animx*8+(anix/10))//8,(17*(m//8))+(animy*8+(aniy//10)+16)//8))==17 or (mget((30*m%240)+(animx*8+(anix/10))//8,(17*(m//8))+(animy*8+(aniy//10)+16)//8))==18 or (mget((30*m%240)+(animx*8+(anix/10))//8,(17*(m//8))+(animy*8+(aniy//10)+16)//8))==10 or (mget((30*m%240)+(animx*8+(anix/10))//8,(17*(m//8))+(animy*8+(aniy//10)+16)//8))==11 or (mget((30*m%240)+(animx*8+(anix/10))//8,(17*(m//8))+(animy*8+(aniy//10)+16)//8))==26 or (mget((30*m%240)+(animx*8+(anix/10))//8,(17*(m//8))+(animy*8+(aniy//10)+16)//8))==27 or (mget((30*m%240)+(animx*8+(anix/10))//8,(17*(m//8))+(animy*8+(aniy//10)+16)//8))==5 or (mget((30*m%240)+(animx*8+(anix/10))//8,(17*(m//8))+(animy*8+(aniy//10)+16)//8))==37 or (mget((30*m%240)+(animx*8+(anix/10))//8,(17*(m//8))+(animy*8+(aniy//10)+16)//8))==48 or (mget((30*m%240)+(animx*8+(anix/10))//8,(17*(m//8))+(animy*8+(aniy//10)+16)//8))==49 or (mget((30*m%240)+(animx*8+(anix/10))//8,(17*(m//8))+(animy*8+(aniy//10)+16)//8))==16 or (mget((30*m%240)+(animx*8+(anix/10))//8,(17*(m//8))+(animy*8+(aniy//10)+16)//8))==32) then spr(263+t%8//4,animx*8+(anix//10),animy*8+(aniy//10),0,1,0,0,1,2) else if ftrig==1 then c=0 end spr(261+t%14//7,animx*8+(anix//10),animy*8+(aniy//10),0,1,0,0,1,2) end end --PIXEL COLLISION if mget((30*m%240)+(animx*8+(anix//10))//8,(17*(m//8))+(animy*8+(aniy//10)+8)//8)>=64 and mget((30*m%240)+(animx*8+(anix//10))//8,(17*(m//8))+(animy*8+(aniy//10)+8)//8)<=71 and strig==0 then px=px-1 sfx(54,72,-1,0) mset((30*m%240)+(animx*8+(anix//10))//8,(17*(m//8))+((animy*8+(aniy//10))//8)+1,0) end --PHANTOM PIXEL COLLISION if mget((30*m%240)+aex//8,(17*(m//8))+((aey+8)//8))>=72 and mget((30*m%240)+aex//8,(17*(m//8))+((aey+8)//8))<=79 and strig==0 then aepx=aepx-1 sfx(54,69,-1,0) mset((30*m%240)+aex//8,(17*(m//8))+((aey+8)//8),0) end --HERO DISPLAY --ALTER EGO DISPLAY if aeo==0 then --120=ZX spectrum Mirrored, 116=NES Mirrored aex=120-((animx*8+(anix//10))-120) aey=animy*8+(aniy//10) end if aeo==1 then aex=animx*8+(anix//10) aey=64-((animy*8+(aniy//10))-64) end if t>(2*60) then if strig==0 then spr(265+t%8//2,aex,aey,0,1,0,0,1,2) else spr(297+t%16//4,aex,aey,0,1,0,0,1,2) end else spr(265+((t%20//10)*6),aex,aey,0,1,0,0,1,2) end end if options.debug then print("DEBUG",0,0,15,true,1,true) --TIMER DEBUG print(t,0,6,15,true,1,true) --SWAP ACTION INPUT DEBUG if btn(4)==true or btn(5)==true then print("true",0,12,15,true,1,true) else print("false",0,12,15,true,1,true) end --MAP SCREEN DEBUG print(m,0,18,15,true,1,true) --SWAP TRIGGER DEBUG print(strig,22,18,15,true,1,true) --SCREEN HERO SPR POSITION DEBUG print((animx*8+(anix//10)),0,24,15,true,1,true) print((animy*8+(aniy//10))+8,0,30,15,true,1,true) --SCREEN ALTER EGO SPR POSITION DEBUG print(aex,22,24,15,true,1,true) print(aey+8,22,30,15,true,1,true) --MAP HERO SPR POSITION DEBUG print((30*m%240)+(animx*8+(anix//10))//8,0,42,15,true,1,true) print((17*(m//8))+((animy*8+(aniy//10))//8)+1,0,48,15,true,1,true) --MAP ALTER EGO SPR POSITION DEBUG print((30*m%240)+aex//8,22,42,15,true,1,true) print((17*(m//8))+((aey+8)//8),22,48,15,true,1,true) --MOVEMENT DEBUG print(anix//10,0,60,15,true,1,true) print(aniy//10,0,66,15,true,1,true) --PIXEL AND PHANTOM PIXEL DEBUG print(px,22,60,15,true,1,true) print(aepx,22,66,15,true,1,true) --MGET DEBUG print(mget((30*m%240)+(animx*8+(anix//10))//8,(17*(m//8))+(animy*8+(aniy//10))//8),22,78,15,true,1,true) print(mget((30*m%240)+(animx*8+(anix//10)-8)//8,(17*(m//8))+(animy*8+(aniy//10)+8)//8),0,84,15,true,1,true) print(mget((30*m%240)+(animx*8+(anix//10))//8,(17*(m//8))+(animy*8+(aniy//10)+8)//8),22,84,15,true,1,true) print(mget((30*m%240)+(animx*8+(anix//10)+8)//8,(17*(m//8))+(animy*8+(aniy//10)+8)//8),44,84,15,true,1,true) print(mget((30*m%240)+(animx*8+(anix//10))//8,(17*(m//8))+(animy*8+(aniy//10)+16)//8),22,90,15,true,1,true) --MUSIC SPEED DEBUG (0-7) --print(peek(0x13e96),0,102) --print(peek(0x13ec9),22,102) --print(peek(0x13efc),0,108) --print(peek(0x13f2f),22,108) --print(peek(0x13f62),0,114) --print(peek(0x13f95),22,114) --print(peek(0x13fc8),0,120) --print(peek(0x13ffb),22,120) --MUSIC POSITION DEBUG print("track:",44,102,15,true,1,true) print(peek(0x13ffc),88,102,15,true,1,true) print("frame:",44,108,15,true,1,true) print(peek(0x13ffd),88,108,15,true,1,true) print("row :",44,114,15,true,1,true) print(peek(0x13ffe),88,114,15,true,1,true) print("loop :",44,120,15,true,1,true) print(peek(0x13fff),88,120,15,true,1,true) --wait: Time event (2 sec) --if t<2*60 then return end --stuff to do --spr command: spr(id+t%nf//f,x,y,z,s,f,r,w,h) --id=sprite id --t=timer --f=frames to wait for switch sprites --n=number of sprites to switch --Compare between f and n variables for speed --x=x position --y=y position --z=colorkey id to set alpha --s=scale --f=flip(Hflip(1),Vflip(2),HVflip(3)) --r=rotate(90 deg(1),180 deg(2),270 deg(3)) --w=width of composite sprite --h=height of composite sprite end --if options.debug --end of function TIC() end