0 \L?@QkPrb0L @2TvͫgE#2Tv2Tv}wwwpww07y0wwzwy8<< > wwwpww07y0wwzwy8<< > wwwpww07y0wwzwy8<< > www0wy0wwzw8773w3|<www0wy0wwzw8773w3|<www0wy0wwzw8773w3|<zߧ_ee ٪ zzVVpz]ee <z ov _ Чgo <zzVV }}`U99 0zUp U99z V }P99 zz ee   " "   "  " ppzp37333s3|wwzwy73www0ss03s03w0wwzww9<<www0ss03s03w0wwzww9<<MDDODDODDDDM߈߈߻߻ߙߙ""//""(ffooffk090wP z  \epܧ e ]U ЭVV zDD DDDDDD Ј Ј л л    Й Й //""(""ooffkffwww0ww0ss033033wwzwww773333www0ww0ss033033wwzwww773333www0ww0ss033033wwzwww773333 ̈̈""" "" "r"""r"""""'"""'"33:7ܧzee 33s zzVV33:7zo 33s V 33:7}yle 33szz_  ̌ȌȌ ̈ ̌ȌȌ "r"" "r """""'"""'""""""" """""("" "" ""("((" " """" """(""((( " "((((("" """("""" " " "((("" "" "" "((("("""" "(((((""""""!""21!!""S$"1DEB#$2DB"3$B26$"c8"":2"BDBT%2"#"#"6"c#h#b662fhf8b26hfqq!"1E"CT$B"C1$2C!$cC!2#1b#""B$"BTE$"""$2"22b#2b6"bh#c6""&&cc61!#""!""1E""CT$$B"C$$2C2$cCb2#bb#c"D4DU"2"22b#2&6"&h#c6cc66&#caa#c#c#hfh&j6xfwxfwfywh6fhhhzgjygvwwwwfhffifwqc8:faaagvgvwhjffwwwwwwc6c6ffffjjja212161aaffb8:fbgvgvwwwhcjfifvxwwww66119zfwayazaff}a&.͈xhab&."'"+"&bafyۡw{mfff{f&a҈wxhf{k"&"-.&affaywwww_UwfxyW&mw&w&w&wbw`bb.f.f"f"b"b&"&"f{a~&~&r"r!"v!"vab{.f.wbwbw+bw+"wk"b{k"bۑۨU8wy0U_?3::USZ3_a!,--afm"ff--,qwfֽ,,!,,af&b,,l,,,,qwf?8_?U?3xwwwwyUafafafw{"afafaqww.afafafw{"aaaqffww.  " """" "" "  """"  """  "" """ " " " "  """""" " """"" """""""""""""""" @DD@@@@@@@DD@@@@@@DDD@DDDDDDDDD@@D@D@DDDDDDDDDDDDDx """'w'""p''"""w'wp {      ""   """" "" """""""""""""""""      """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""x@@DD@DD@D@DDDD@D@DDDD@D@DDDD@D@DDDDD@@DDD@@DDDDDDD@D@D@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@DDDD@@@DDD@D@D@DDDD@D@D@@DD@@@@@@DD@@@@@D@@DDD@DDD@DDDDD@DDDDDDDDDDDDD@DDDDDDDDD@@D@D@D@D@DD@DDDD@DDDD@@DDD@D@D@D@D@@DDDDDD@D@D@DDDDD@DDD@D@D@D@DDD@DDDDD@D@DDDDD@DDD@DDDD@DD@D@@DD@DD@@@@@@D@D@D@D@D@D@@DDD@D@D@D@@DD@D@D@D@@DDDDDDDDD@D@DD@DDD@DDDDD@@@@@@@DD@@@DDDD@DD@DDDDDDDDDDDDDDDDD@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD ; ? FHJLNOOOOOOOOOOOOOOOOOOOOOOOOO778899::;;<<==>>??????????????  2p2`3P3@404 556789:;???????????????? `P0   P1p2`4P6@801 479;????????????????????    . / ? ? O _ o     a a a a a aa aa aa aaa aaaa a a a a a a a a aa aa aa aaa aaaa a a a```````````````````` " B " B " B " B " B " B " B " B"B"B"B"B " B " B " B " B " B " B " B " B " B " B " B " B"B"B"B"B " B " B " B " B3@ @ @ @ @ @ @ @?  P 3333333333333333333333333333333333333333 3333333333333333333333333333333333333333""03333333333333333333333333333333333333333@wwww pwww3333333333333333333333333333333333333333wwww pwww3333333333333333333333333333333333333333 wwwwwwpzwwwz3333333333333333333333333333333333333333wwwwwwpzwwwz3333333333333333333333333333333333333333wwwwwpwzzw3333333333333333333333333333333333333333wwwwwpwzzw3333333333333333333333333333333333333333wwwwwww3pwwwwyw83333333333333333333333333333333333333333wwwwwww3 pwwwwyw83333#"233""3#""3"""3"""233333333333333333w3w̙330s7yǜ833333"3"3#2#2"3#2"3#2"33333333333333333333w3w̙330s7yǜ83"3333"333"333"3#2"3#2"3333333333333333333p3333303<<< "3333#""3"333"3#2"3"2"""333333333333333333333303<<< 333333#2"333"3#2""23"3333333333333333333330> 3333"3#2#2#2"3#2"#"3"333333333333333333333 0> 3333#""33""3#""3"3"2"""2333333333333333333w0 DO03333333333333333333333333333333333333333<߈0s3333333333333333333333333333333333333333ɜ̩ 3333333333333333333333333333333333333333Чz} 3333333333333333333333333333333333333333gzyf_`3333333333333333333333333333333333333333oVV Pfe 3333333333333333333333333333333333333333 P3333CDD4CDD4D3C4DDD43333333333?33333߈33333C433C43D4D4D333333333333?33333333333C433C43DDD4D333333333333?3?333333333C433C43DDD4DDD333333333?3?3333`33333C433C43DCC4D3333333333333?3?333333333C433C43D3C4D33333333333333?33333`߈ D33333C43CDD4D3C4DDD433333333?33?333333MD3333333333333333333333333333333333333333`3DDD3333333333333333333333333333333333333333߈ pDDD3333333333333333333333333333333333333333 MD3333333333333333333333333333333333333333   D3333333333333333333333333333333333333333 ߈ 3333333333333333333333333333333333333333 ""3333333333333333333333333333333333333333 33333333333333333333333333333333333333333333333333333333333333333333333333333333߈3333333333333333333333333333333333333333 333333333333333333333333333333333333333333331113133333333333?33333 33333133133331133333333333333330߈3333313313333133333333?33?3333߈033333133133133333333333?3333Mԏ3333313313333133333333?3?3333DD_33333133133333133333333333?33333ODD33331313131333333333333?33333ODD3333333333333333333333333333333333333333DD ߈3333333333333333333333333333333333333333PM 3333333333333333333333333333333333333333333333333333"32333333#233333"3#"3#"33333333333333333"22#"3"#2""2333#"3"#2"#23333333333333333""2"#2#"3#233333"3"22"223333߈333333333333"#2"23#"3#233333"3"32"323333333333333333"32#"3"#23"2333#"2#"3#"33333 3333333333333333333333333333333333333333 @3333333333333333333333333333333333333333P333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333 p3333333333333333333333333333333333333333M333333333333333333sw73333333333333333333DD 33333333333333333szw7333333333333333333ODD""33333333333333333sz7333333333333333333 ODD 3333333333333333337wy7333333333333333333DD  33333333333333333333333333333333333333M pwp333333333333333333s3333333333333333333pzw`P333333333333333333|33333333333333333330pzz33333333333333333393333333333333333333swww7 333333333333333333ݪ7333333333333333333337ws333333333333333333s33333333333333333333333333333333333333333yz<3333333333333333333333333333333333333333ieU<33333333333333;3 033333333333333333333?:333333333333333; s37 333333333333333333333333333333333333;ߧ 333333333333333333333333333333333333;z 3333333333333333333333333333333333337 `Vf 3333333333333333333333333333333333333{33333333333333333333333333333333333333733333333333333333333333333333333333333333o-- title: ProNama-Chan shooter! -- version: 1.06 (2022/06/18) -- author: ZAP -- desc: Tiny shoot'em up featuring "ProNama-chan" -- script: lua local InitEndFlag=0 -- Const local SCENE_TITLE=0 local PHASE_TitleInit=0 local PHASE_TitleMain=1 local PHASE_TitleGameStart=2 local SCENE_GAME=1 local PHASE_GameInit=0 local PHASE_GameWaveStart=1 local PHASE_GameMain=2 local PHASE_GameOver=3 local PHASE_GameEnding=4 local Scene=SCENE_TITLE local Phase=PHASE_TitleInit local HiScore=0 local Counter=0 local GameoverFlag=0 local Score=0 local Life=0 local GetItemCount=0 local GetItemNorma=0 local Round=0 local Wave=0 local WaveDispTime=0 local WaveClearFlag=0 local WaveTimer=0 local TimeBonus=0 local ExHeartColor=0 local ExHeartFlag=0 local ExHeartX=0 local ExHeartY=0 local OsanpoK_Time=0 local OsanpoK_X=0 local OsanpoK_Dir=0 local OsanpoK_Spd=0 local MyX=0 local MyY=0 local MySpeed=0 local MyFlashFlag=0 local MyFlashTime=0 local Muteki=0 local MyShotMax=7 local MyShotInterval=0 local MyShotFlag={} local MyShotX={} local MyShotY={} local MyShotDir={} local MyShotSpd={} local EnemyMax=12 local EnemyFlag={} local EnemyX={} local EnemyY={} local EnemyDir={} local EnemySpd={} local EnemyScale={} local EnemyHP={} local EnemyExpandTime=0 local EneTamaSeqNum={} local EneTamaSeqWait={} local EneTamaSeqPointer={} local EneTamaSeq={ --tim ofs dir spd way pch col No.1 { 120, 0, -1,115, 1, 0, 0, -255 }, --tim ofs dir spd way pch col No.2 { 150, 0, -1,100, 3, 16, 1, 60, 0, -1,120, 4, 16, 3, -255 }, --tim ofs dir spd way pch col No.3 { 120, 0, -1,120, 5, 24, 0, 60, 0, -1,140, 7, 16, 4, 120, 0,192,178, 9, 14, 2, -255 }, --tim ofs dir spd way pch col No.4 { 110, 0, -1, 80, 23, 11, 4, 16, 0, -1,140, 1, 0, 0, 16, 0, -1,150, 1, 0, 0, 16, 0, -1,160, 1, 0, 0, 16, 0, -1,170, 1, 0, 0, 1, 0, -1, 60, 23, 11, 2, 16, 0, -1,180, 1, 0, 0, 16, 0, -1,190, 1, 0, 0, 16, 0, -1,200, 1, 0, 0, 16, 0, -1,210, 1, 0, 0, 1, 0, -1, 70, 23, 11, 4, 16, 0, -1,180, 1, 0, 0, 16, 0, -1,190, 1, 0, 0, 90, 0, -1,200, 15, 16, 1, 30, 0,192,220, 16, 16, 3, 20, 0, -1,240, 15, 16, 1, 15, 0,192,260, 16, 16, 3, -255 }, --tim ofs dir spd way pch col No.5 { 140, 0, -1,100, 1, 0, 2, 6, 0, -1,100, 1, 0, 2, 6, 0, -1,100, 1, 0, 2, 6, 0, -1,100, 1, 0, 2, 6, 0, -1,100, 1, 0, 2, 6, 0, -1,100, 1, 0, 2, -255 }, --tim ofs dir spd way pch col No.6 { 120, 0,192,165, 2, 16, 3, 4, 0,184,165, 2, 16, 3, 4, 0,176,165, 2, 16, 3, 4, 0,168,165, 2, 16, 3, 4, 0,160,165, 2, 16, 3, 4, 0,152,165, 2, 16, 3, 4, 0,144,165, 2, 16, 3, 4, 0,136,165, 2, 16, 3, 4, 0,128,165, 2, 16, 3, 4, 0,120,165, 2, 16, 3, 4, 0,112,165, 2, 16, 3, 4, 0,104,165, 2, 16, 3, 4, 0, 96,165, 2, 16, 3, 8, 0, 88,165, 2, 16, 3, 4, 0, 80,165, 2, 16, 3, 4, 0, 72,165, 2, 16, 3, 4, 0, 64,165, 2, 16, 3, 4, 0, 56,165, 2, 16, 3, 4, 0, 48,165, 2, 16, 3, 4, 0, 40,165, 2, 16, 3, 4, 0, 32,165, 2, 16, 3, 4, 0, 24,165, 2, 16, 3, 4, 0, 16,165, 2, 16, 3, 4, 0, 8,165, 2, 16, 3, 4, 0, 0,165, 2, 16, 3, 4, 0,248,165, 2, 16, 3, 4, 0,240,165, 2, 16, 3, 4, 0,232,165, 2, 16, 3, 4, 0,224,165, 2, 16, 3, 4, 0,216,165, 2, 16, 3, 4, 0,208,165, 2, 16, 3, 4, 0,200,165, 2, 16, 3, 40, 0,192,165, 2, 16, 0, 4, 0,200,165, 2, 16, 0, 4, 0,208,165, 2, 16, 0, 4, 0,216,165, 2, 16, 0, 4, 0,224,165, 2, 16, 0, 4, 0,232,165, 2, 16, 0, 4, 0,240,165, 2, 16, 0, 4, 0,248,165, 2, 16, 0, 4, 0, 0,165, 2, 16, 0, 4, 0, 8,165, 2, 16, 0, 4, 0, 16,165, 2, 16, 0, 4, 0, 24,165, 2, 16, 0, 4, 0, 32,165, 2, 16, 0, 4, 0, 40,165, 2, 16, 0, 4, 0, 48,165, 2, 16, 0, 4, 0, 56,165, 2, 16, 0, 4, 0, 64,165, 2, 16, 0, 4, 0, 72,165, 2, 16, 0, 4, 0, 80,165, 2, 16, 0, 4, 0, 88,165, 2, 16, 0, 4, 0, 96,165, 2, 16, 0, 4, 0,104,165, 2, 16, 0, 4, 0,112,165, 2, 16, 0, 4, 0,120,165, 2, 16, 0, 4, 0,128,165, 2, 16, 0, 4, 0,136,165, 2, 16, 0, 4, 0,144,165, 2, 16, 0, 4, 0,152,165, 2, 16, 0, 4, 0,160,165, 2, 16, 0, 4, 0,168,165, 2, 16, 0, 4, 0,176,165, 2, 16, 0, 4, 0,184,165, 2, 16, 0, 70, 0, -1,180, 3, 8, 1, -255 } } -- "Tama" means bullet. local TamaMax=64 local TamaFlag={} local TamaX={} local TamaY={} local TamaDir={} local TamaSpd={} local TamaColor={} -- "Baku" means explosion. local BakuMax=48 local BakuTime=15 local BakuFlag={} local BakuX={} local BakuY={} local BakuScale={} local ItemMax=128 local ItemFlag={} local ItemX={} local ItemY={} local ItemVX={} local ItemVY={} local StarMax=256 local StarX={} local StarY={} local StarCol={} local StarSpd={} local PalData1={ 0,0,0,240,32,240,240,240,0,92,76,63,64,128,255,81,135,107,80,178,127,135,114,98,240,16,48,219,127,76,150,145,129,128,240,128,249,189,156,211,211,211,255,230,202,246,246,246 } local PalData2={ 128,128,192,28,26,24,114,99,84,91,72,52,178,145,132,189,217,156,70,47,37,252,237,220,170,73,37,246,187,154,234,144,94,167,206,211,50,68,58,114,158,158,147,142,125,110,156,89 } InitEndFlag=1 function save(_s,_d) pmem(_s,_d) end function load(_s) return(pmem(_s)) end function GetSin(_dir) -- Dir takes a value from 0 to 255 local var=math.sin(math.rad(_dir*360/256))*10000 if var>0 then return -math.floor(var)/10000 else return -math.ceil(var)/10000 end end function GetCos(_dir) -- Dir takes a value from 0 to 255 local var=math.cos(math.rad(_dir*360/256))*10000 if var>0 then return math.floor(var)/10000 else return math.ceil(var)/10000 end end function GetDir(_x1,_y1,_x2,_y2) local d=math.deg(math.atan(-(_y2-_y1),_x2-_x1)) if d<0 then d=360+d end return math.floor(d*256/360+0.5) end function CheckHit(_x1,_y1,_x2,_y2,_Depth) local x1=_x1//1 local x2=_x2//1 local y1=_y1//1 local y2=_y2//1 if (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2) < _Depth*_Depth then return true else return false end end function SprEx(_id,_x,_y,_color,_scale,_flip,_rot,_w,_h) local x1=_x local y1=_y local x2=x1+8*_w*_scale-1 local y2=y1+8*_h*_scale-1 local u1=(_id%16)*8 local v1=(_id//16)*8 local u2=u1+8*_w-1 local v2=v1+8*_h-1 textri(x1,y1,x2,y1,x1,y2, u1,v1,u2,v1,u1,v2, false,_color) textri(x2,y1,x1,y2,x2,y2, u2,v1,u1,v2,u2,v2, false,_color) end function MyMove() local dir=-1 if btn(0) and btn(3) then dir=32 elseif btn(0) and btn(2) then dir=96 elseif btn(1) and btn(2) then dir=160 elseif btn(1) and btn(3) then dir=224 elseif btn(3) then dir=0 elseif btn(0) then dir=64 elseif btn(2) then dir=128 elseif btn(1) then dir=192 end if dir>-1 then local tmpV=MySpeed if btn(5) then tmpV=tmpV*0.43 end MyY=MyY+GetSin(dir)*tmpV MyX=MyX+GetCos(dir)*tmpV end -- Border check if MyY<10 then MyY=10 end if MyY>128 then MyY=128 end if MyX<8 then MyX=8 end if MyX>152 then MyX=152 end if MyFlashFlag>0 then MyFlashTime=MyFlashTime-1 if MyFlashTime==0 then MyFlashFlag=0 end end end function MyShotCheck() if btn(4) then if MyShotInterval<1 then MyShotAppear() else MyShotInterval=MyShotInterval-1 end elseif MyShotInterval<3 then MyShotInterval=0 end end function MyShotAppear() MyShotInterval=4 for i=1,MyShotMax do if MyShotFlag[i]==-1 then if btn(5) then MyShotFlag[i]=1 else MyShotFlag[i]=0 end MyShotX[i]=MyX MyShotY[i]=MyY MyShotDir[i]=56+math.random(0,16) MyShotSpd[i]=6 break end end end function MyShotMove() for i=1,MyShotMax do if MyShotFlag[i]~=-1 then MyShotX[i]=MyShotX[i]+GetCos(MyShotDir[i])*MyShotSpd[i] MyShotY[i]=MyShotY[i]+GetSin(MyShotDir[i])*MyShotSpd[i] if (MyShotY[i]<-15) or (MyShotY[i]>144) or (MyShotX[i]<-15) or (MyShotX[i]>168) then MyShotFlag[i]=-1 end end end end function EnemyMove() if EnemyExpandTime>0 then EnemyExpandTime=EnemyExpandTime-1 return end local EnemyAppearNum=CheckEnemyNum() for i=1,EnemyMax do if EnemyFlag[i]~=-1 then EnemyX[i]=EnemyX[i]+GetCos(EnemyDir[i])*EnemySpd[i] EnemyY[i]=EnemyY[i]+GetSin(EnemyDir[i])*EnemySpd[i] if (Counter%120)==0 then EnemyDir[i]=(EnemyDir[i]+128)&255 end if EnemyFlag[i]~=-1 then -- Enemy Tama sequence check local tmp=0 if EnemyAppearNum<5 then tmp=(5-EnemyAppearNum)*0.4 end EneTamaSeqWait[i]=EneTamaSeqWait[i]-1-tmp if EneTamaSeqWait[i]<0 then -- Enemy Tama data set local p=EneTamaSeqPointer[i]*7 -- TamaOffsetIndex=EneTamaSeq[EneTamaSeqNum[i]][p+2] local TD=EneTamaSeq[EneTamaSeqNum[i]][p+3] local TS=EneTamaSeq[EneTamaSeqNum[i]][p+4]/100 local TW=EneTamaSeq[EneTamaSeqNum[i]][p+5] local TP=EneTamaSeq[EneTamaSeqNum[i]][p+6] local TC=EneTamaSeq[EneTamaSeqNum[i]][p+7] TamaAppear(EnemyX[i],EnemyY[i],TD,TS,TW,TP,TC) EneTamaSeqPointer[i]=EneTamaSeqPointer[i]+1 EneTamaSeqWait[i]=EneTamaSeq[EneTamaSeqNum[i]][EneTamaSeqPointer[i]*7+1] end -- Enemy Tama sequence loop check if EneTamaSeqWait[i]==-255 then EneTamaSeqPointer[i]=0 EneTamaSeqWait[i]=EneTamaSeq[EneTamaSeqNum[i]][1] end end end end end function CheckEnemyNum() local EnemyNum=0 for i=1,EnemyMax do if EnemyFlag[i]~=-1 then EnemyNum=EnemyNum+EnemyScale[i] end end return EnemyNum end function EnemyAllDelete() for i=1,EnemyMax do if EnemyFlag[i]~=-1 then EnemyFlag[i]=-1 for k=1,4 do local tmp=math.random(0,255) local tmp2=k*EnemyScale[i]*1.25 local BakuX=EnemyX[i]+tmp2*GetCos(tmp) local BakuY=EnemyY[i]+tmp2*GetSin(tmp) BakuAppear(BakuX,BakuY,EnemyScale[i],k*3) end BakuAppear(EnemyX[i],EnemyY[i],EnemyScale[i],0) end end end function TamaAppear(_tX,_tY,_tDir,_tSpd,_tWay,_tPitch,_tColor) if _tDir==-1 then _tDir=GetDir(_tX,_tY,MyX,MyY) -- Aim player end if (_tWay & 1)==1 then _tDir=(_tDir-(_tWay//2*_tPitch)) & 255 -- Odd else _tDir=(_tDir-_tPitch//2-(_tWay//2-1)*_tPitch) & 255 -- Even end for j=1,_tWay do for i=1,TamaMax do if TamaFlag[i]==-1 then TamaFlag[i]=1 TamaX[i]=_tX TamaY[i]=_tY TamaDir[i]=_tDir TamaSpd[i]=_tSpd*(0.95+0.5*Round) TamaColor[i]=_tColor break end end _tDir=(_tDir+_tPitch) & 255 end end function TamaMove() for i=1,TamaMax do if TamaFlag[i]==1 then TamaX[i]=TamaX[i]+GetCos(TamaDir[i])*TamaSpd[i] TamaY[i]=TamaY[i]+GetSin(TamaDir[i])*TamaSpd[i] if (TamaY[i]<-15) or (TamaY[i]>144) or (TamaX[i]<-15) or (TamaX[i]>168) then TamaFlag[i]=-1 end end end end function TamaAllDelete() for i=1,TamaMax do TamaFlag[i]=-1 end end function ItemAppear(_x,_y) for i=1,ItemMax do if ItemFlag[i]<0 then ItemFlag[i]=1 ItemX[i]=_x ItemY[i]=_y ItemVX[i]=math.random(0,80)/80-0.4 ItemVY[i]=math.random(0,100)/100-2.0 break end end end function ItemMove() for i=1,ItemMax do if ItemFlag[i]==1 then ItemX[i]=ItemX[i]+ItemVX[i] ItemY[i]=ItemY[i]+ItemVY[i] ItemVY[i]=ItemVY[i]+0.04 if (ItemY[i]>144) or (ItemX[i]<-15) or (ItemX[i]>168) then ItemFlag[i]=-1 end end end end function BakuAppear(_x,_y,_s,_w) for i=1,BakuMax do if BakuFlag[i]<0 then BakuFlag[i]=BakuTime+_w BakuX[i]=_x BakuY[i]=_y BakuScale[i]=_s break end end end function BakuCheck() for i=1,BakuMax do if BakuFlag[i]>-1 then BakuFlag[i]=BakuFlag[i]-1 if BakuFlag[i]==BakuTime-1 then sfx(3) end end end end function HitCheck_MyShot_Enemy() if EnemyExpandTime>0 then return end for i=1,MyShotMax do for j=1,EnemyMax do if (MyShotFlag[i]~=-1) and (EnemyFlag[j]~=-1) then if CheckHit(MyShotX[i],MyShotY[i],EnemyX[j],EnemyY[j],EnemyScale[j]*9)==true then -- sfx(5) Score=Score+1 EnemyHP[j]=EnemyHP[j]-10-MyShotFlag[i]*3 MyShotFlag[i]=-1 if EnemyHP[j]<1 then EnemyFlag[j]=-1 for k=1,12 do local tmp=math.random(0,255) local tmp2=k*EnemyScale[j]*1.5 local BakuX=EnemyX[j]+tmp2*GetCos(tmp) local BakuY=EnemyY[j]+tmp2*GetSin(tmp) BakuAppear(BakuX,BakuY,EnemyScale[j],k*3) end for k=1,EnemyScale[j]*18 do ItemAppear(EnemyX[j],EnemyY[j]) end Score=Score+EnemyScale[j]*EnemyScale[j]*1000 if EnemyScale[j]>1 then Score=Score+1000 end end end end end end end function HitCheck_Tama_MyChr() -- Invincible check if Muteki>0 then Muteki=Muteki-1 return 0 end for i=1,TamaMax do if TamaFlag[i]==1 then if CheckHit(TamaX[i],TamaY[i],MyX,MyY,2)==true then TamaFlag[i]=-1 if Life>0 then sfx(6) Life=Life-1 if Life==0 then for k=1,48 do local tmp=math.random(0,255) local tmp2=k*1.05 local BakuX=MyX+tmp2*GetCos(tmp) local BakuY=MyY+tmp2*GetSin(tmp) BakuAppear(BakuX,BakuY,1,k*2) end GameoverFlag=300 end end MyFlashFlag=2 MyFlashTime=15 Muteki=120 break end end end end function HitCheck_Item_MyChr() if MyFlashFlag==2 then return 0 end for i=1,ItemMax do if ItemFlag[i]==1 then if CheckHit(ItemX[i],ItemY[i],MyX,MyY,14)==true then ItemFlag[i]=-1 GetItemCount=GetItemCount+1 if GetItemCount==GetItemNorma then if Life<5 then Life=Life+1 ExHeartColor=0 else Score=Score+GetItemNorma*1000 ExHeartColor=1 end GetItemCount=0 if GetItemNorma<451 then GetItemNorma=GetItemNorma+50 end ExHeartFlag=60 ExHeartX=MyX-3 ExHeartY=MyY end Score=Score+500 MyFlashFlag=1 MyFlashTime=15 Muteki=30 sfx(4) break end end end end function ClearCheck() if WaveClearFlag==0 then WaveTimer=WaveTimer-1 if WaveTimer<1 then EnemyAllDelete() end if CheckEnemyNum()==0 then WaveClearFlag=180 TimeBonus=WaveTimer*2 Score=Score+TimeBonus TamaAllDelete() end else WaveClearFlag=WaveClearFlag-1 if WaveClearFlag==0 then Wave=Wave+1 if Wave<10 then Phase=PHASE_GameWaveStart else Phase=PHASE_GameEnding EndingTime=0 end end end end function OsanpoK() -- Mascot character OsanpoK_Time=OsanpoK_Time-1 if OsanpoK_Time<1 then OsanpoK_Time=math.random(120,480) OsanpoK_Dir=math.random(1,3)-2 end OsanpoK_X=OsanpoK_X+OsanpoK_Dir*OsanpoK_Spd if OsanpoK_X<0 then OsanpoK_X=0 OsanpoK_Dir=-OsanpoK_Dir end if OsanpoK_X>60 then OsanpoK_X=60 OsanpoK_Dir=-OsanpoK_Dir end end function Title_Init() -- Palette change for i=1,48 do poke(0x3FC0+i-1,PalData2[i]) end HiScore=load(0) if HiScore<10000 then HiScore=10000 end cls(0) spr(128,166,-8,0,2,0,0,4,4) spr(192,166,56,0,2,0,0,4,4) print("Pro-Nama Chan",12,40,9,false,2) print("SHOOTER!",72,64,9,false,2) print("Push Z key To Start!!",28,96,7,false,1) print(string.format("High Score %8d",HiScore),70,0,7,false,1) print("Programmed by ZAP",0,131,7,false,1) print("Version 1.06",178,131,7,false,1) Phase=PHASE_TitleMain end function Title_Main() local YesNoflag if btnp(4) then cls(0) rect(166,32,32,64,0) spr(132,166,-8,0,2,0,0,4,4) spr(196,166,56,0,2,0,0,4,4) print("OK, Good Luck!",12,64,9,false,2) TitleWait=120 Phase=PHASE_TitleGameStart end if keyp(18) then -- R key pushed print("Reset High Score OK? [y/n]",52,10,1,false,1) YesNoflag=1 else YesNoflag=0 end if YesNoflag then if keyp(25) then -- Y key pushed HiScore=10000 save(0,HiScore) rect(0,0,240,18,0) print(string.format("High Score %8d",HiScore),70,0,7,false,1) YesNoflag=0 end if keyp(14) then -- N key pushed rect(0,10,240,8,0) YesNoflag=0 end end end function Title_GameStart() TitleWait=TitleWait-1 if TitleWait==0 then -- Palette change for i=1,48 do poke(0x3FC0+i-1,PalData1[i]) end Scene=SCENE_GAME Phase=PHASE_GameInit end end function Game_Init() GameoverFlag=0 Score=0 Life=5 GetItemCount=0 GetItemNorma=50 Round=0 Wave=1 -- WaveDispTime=180 -- WaveClearFlag=0 -- WaveTimer=100*60-1 -- TimeBonus=0 MyX=80 MyY=120 MySpeed=1.9 MyFlashFlag=0 MyFlashTime=0 Muteki=60 for i=1,MyShotMax do MyShotFlag[i]=-1 MyShotX[i]=0 MyShotY[i]=0 MyShotDir[i]=0 MyShotSpd[i]=0 end for i=1,EnemyMax do EnemyFlag[i]=-1 EnemyX[i]=0 EnemyY[i]=0 EnemyDir[i]=0 EnemySpd[i]=0 EnemyScale[i]=0 EnemyHP[i]=0 EneTamaSeqNum[i]=0 EneTamaSeqWait[i]=-1 EneTamaSeqPointer[i]=0 end -- EnemyExpandTime=0 for i=1,TamaMax do TamaFlag[i]=-1 TamaX[i]=0 TamaY[i]=0 TamaDir[i]=0 TamaSpd[i]=0 TamaColor[i]=0 end for i=1,BakuMax do BakuFlag[i]=-1 BakuX[i]=0 BakuY[i]=0 BakuScale[i]=1 end for i=1,ItemMax do ItemFlag[i]=-1 ItemX[i]=0 ItemY[i]=0 ItemVX[i]=0.0 ItemVY[i]=0.0 end for i=1,StarMax do StarX[i]=math.random(0,160) StarY[i]=math.random(0,1350000) StarSpd[i]=math.random(0,20000)+5000 StarCol[i]=math.random(1,15) end OsanpoK_Time=math.random(300,1000) OsanpoK_X=math.random(1,56) OsanpoK_Dir=math.random(1,3)-2 OsanpoK_Spd=0.3 -- Debug value -- tmpy=0 -- tmpx=0 music(0) Phase=PHASE_GameWaveStart end function Game_WaveStart() for i=1,EnemyMax do EnemyFlag[i]=-1 end if Wave==1 then EnemyData={ --ID X Y dir spd HP seq { 2, 80, 32,192, 25, 75, 2}, -- 1 { 1, 40, 64, 0, 25, 25, 1}, -- 2 { 1,120, 64,128, 25, 25, 1}, -- 3 {-1, 0, 0, 0, 0, 0, 0}, -- 4 {-1, 0, 0, 0, 0, 0, 0}, -- 5 {-1, 0, 0, 0, 0, 0, 0}, -- 6 {-1, 0, 0, 0, 0, 0, 0}, -- 7 {-1, 0, 0, 0, 0, 0, 0}, -- 8 {-1, 0, 0, 0, 0, 0, 0}, -- 9 {-1, 0, 0, 0, 0, 0, 0}, --10 {-1, 0, 0, 0, 0, 0, 0}, --11 {-1, 0, 0, 0, 0, 0, 0} --12 } elseif Wave==2 then EnemyData={ --ID X Y dir spd HP seq { 1, 24, 48, 64, 25, 25, 1}, -- 1 { 1, 80, 36, 64, 25, 25, 1}, -- 2 { 1,136, 48, 64, 25, 25, 1}, -- 3 { 2, 60, 56,128, 20, 75, 2}, -- 4 { 2,100, 56, 0, 20, 75, 2}, -- 5 {-1, 0, 0, 0, 0, 0, 0}, -- 6 {-1, 0, 0, 0, 0, 0, 0}, -- 7 {-1, 0, 0, 0, 0, 0, 0}, -- 8 {-1, 0, 0, 0, 0, 0, 0}, -- 9 {-1, 0, 0, 0, 0, 0, 0}, --10 {-1, 0, 0, 0, 0, 0, 0}, --11 {-1, 0, 0, 0, 0, 0, 0} --12 } elseif Wave==3 then EnemyData={ --ID X Y dir spd HP seq { 2, 32, 16, 0, 30, 75, 2}, -- 1 { 1, 32, 48,128, 30, 25, 1}, -- 2 { 1, 32, 72, 0, 30, 25, 1}, -- 3 { 2,128, 16,128, 30, 75, 2}, -- 4 { 1,128, 48, 0, 30, 25, 1}, -- 5 { 1,128, 72,128, 30, 25, 1}, -- 6 {-1, 0, 0, 0, 0, 0, 0}, -- 7 {-1, 0, 0, 0, 0, 0, 0}, -- 8 {-1, 0, 0, 0, 0, 0, 0}, -- 9 {-1, 0, 0, 0, 0, 0, 0}, --10 {-1, 0, 0, 0, 0, 0, 0}, --11 {-1, 0, 0, 0, 0, 0, 0} --12 } elseif Wave==4 then EnemyData={ --ID X Y dir spd HP seq { 1, 32, 60, 0, 30, 25, 1}, -- 1 { 1, 32, 80, 0, 30, 25, 1}, -- 2 { 1, 80, 60, 0, 30, 25, 1}, -- 3 { 1, 80, 80, 0, 30, 25, 1}, -- 4 { 1,128, 60, 0, 30, 25, 1}, -- 5 { 1,128, 80, 0, 30, 25, 1}, -- 6 { 3, 80, 24, 0, 10,120, 3}, -- 7 {-1, 0, 0, 0, 0, 0, 0}, -- 8 {-1, 0, 0, 0, 0, 0, 0}, -- 9 {-1, 0, 0, 0, 0, 0, 0}, --10 {-1, 0, 0, 0, 0, 0, 0}, --11 {-1, 0, 0, 0, 0, 0, 0} --12 } elseif Wave==5 then EnemyData={ --ID X Y dir spd HP seq { 2, 60, 32, 96, 20, 75, 2}, -- 1 { 2, 60, 64,160, 20, 75, 5}, -- 2 { 2, 84, 32, 32, 20, 75, 2}, -- 3 { 2, 84, 64,224, 20, 75, 5}, -- 4 { 1, 48, 16, 96, 25, 25, 1}, -- 5 { 1, 48, 80,160, 25, 25, 1}, -- 6 { 1,100, 16, 32, 25, 25, 1}, -- 7 { 1,100, 80,224, 25, 25, 1}, -- 8 {-1, 0, 0, 0, 0, 0, 0}, -- 9 {-1, 0, 0, 0, 0, 0, 0}, --10 {-1, 0, 0, 0, 0, 0, 0}, --11 {-1, 0, 0, 0, 0, 0, 0} --12 } elseif Wave==6 then EnemyData={ --ID X Y dir spd HP seq { 1, 32, 60, 0, 30, 25, 1}, -- 1 { 1, 32, 80, 0, 30, 25, 1}, -- 2 { 2, 80, 60, 0, 30, 75, 5}, -- 3 { 1, 80, 80, 0, 30, 25, 1}, -- 4 { 1,128, 60, 0, 30, 25, 1}, -- 5 { 1,128, 80, 0, 30, 25, 1}, -- 6 { 3, 48, 24, 0, 10,125, 3}, -- 7 { 3,112, 24, 0, 10,125, 3}, -- 8 {-1, 0, 0, 0, 0, 0, 0}, -- 9 {-1, 0, 0, 0, 0, 0, 0}, --10 {-1, 0, 0, 0, 0, 0, 0}, --11 {-1, 0, 0, 0, 0, 0, 0} --12 } elseif Wave==7 then EnemyData={ --ID X Y dir spd HP seq { 3, 80, 40,192, 20,125, 6}, -- 1 { 3, 32, 56, 0, 15,125, 3}, -- 2 { 3,128, 56,128, 15,125, 3}, -- 3 {-1, 0, 0, 0, 0, 0, 0}, -- 4 {-1, 0, 0, 0, 0, 0, 0}, -- 5 {-1, 0, 0, 0, 0, 0, 0}, -- 6 {-1, 0, 0, 0, 0, 0, 0}, -- 7 {-1, 0, 0, 0, 0, 0, 0}, -- 8 {-1, 0, 0, 0, 0, 0, 0}, -- 9 {-1, 0, 0, 0, 0, 0, 0}, --10 {-1, 0, 0, 0, 0, 0, 0}, --11 {-1, 0, 0, 0, 0, 0, 0} --12 } elseif Wave==8 then EnemyData={ --ID X Y dir spd HP seq { 2, 32, 16, 0, 30, 75, 2}, -- 1 { 2, 32, 44,128, 30, 75, 2}, -- 2 {-1, 32, 72, 0, 30, 25, 1}, -- 3 { 1, 56, 64,192, 30, 25, 1}, -- 4 { 1, 56, 80,192, 30, 25, 1}, -- 5 { 2,128, 16,128, 30, 75, 2}, -- 6 { 2,128, 44, 0, 30, 75, 2}, -- 7 {-1,128, 72,128, 30, 25, 1}, -- 8 { 1,104, 64,192, 30, 25, 1}, -- 9 { 1,104, 80,192, 30, 25, 1}, --10 { 3, 80, 32,192, 10,125, 3}, --11 { 2, 80, 64,192, 10, 75, 5}, --12 } elseif Wave==9 then EnemyData={ --ID X Y dir spd HP seq { 5, 80, 48, 64, 15,300, 4}, -- 1 {-1, 0, 0, 0, 0, 0, 0}, -- 2 {-1, 0, 0, 0, 0, 0, 0}, -- 3 {-1, 0, 0, 0, 0, 0, 0}, -- 4 {-1, 0, 0, 0, 0, 0, 0}, -- 5 {-1, 0, 0, 0, 0, 0, 0}, -- 6 {-1, 0, 0, 0, 0, 0, 0}, -- 7 {-1, 0, 0, 0, 0, 0, 0}, -- 8 {-1, 0, 0, 0, 0, 0, 0}, -- 9 {-1, 0, 0, 0, 0, 0, 0}, --10 {-1, 0, 0, 0, 0, 0, 0}, --11 {-1, 0, 0, 0, 0, 0, 0} --12 } end for i=1,EnemyMax do EnemyFlag[i]=EnemyData[i][1] if EnemyData[i][1]~=-1 then EnemyScale[i]=EnemyData[i][1] EnemyX[i]=EnemyData[i][2] EnemyY[i]=EnemyData[i][3] EnemyDir[i]=EnemyData[i][4] EnemySpd[i]=EnemyData[i][5]/100 EnemyHP[i]=EnemyData[i][6]*10 EneTamaSeqNum[i]=EnemyData[i][7] EneTamaSeqWait[i]=60+math.random(0,120) EneTamaSeqPointer[i]=0 end end EnemyExpandTime=120 WaveDispTime=180 WaveClearFlag=0 WaveTimer=100*60-1 TimeBonus=0 Counter=60 Phase=PHASE_GameMain end function Game_Main() if GameoverFlag==0 then HitCheck_MyShot_Enemy() HitCheck_Tama_MyChr() HitCheck_Item_MyChr() MyMove() MyShotCheck() else GameoverFlag=GameoverFlag-1 if GameoverFlag==1 then GameoverDispTime=420 music() Phase=PHASE_GameOver end end MyShotMove() EnemyMove() TamaMove() ItemMove() BakuCheck() ClearCheck() -- Osanpo mascot Kei OsanpoK() -- Count up Counter=Counter+1 end function Game_Over() GameoverDispTime=GameoverDispTime-1 if GameoverDispTime==0 then Scene=SCENE_TITLE Phase=PHASE_TitleInit end if HiScore180 then print("You defeated all Waves!!",16,42,7,false,1) end if EndingTime>360 then LifeBonus=Life*20000 print("LIFE BONUS "..LifeBonus,24,55,7,false,1) end if EndingTime>540 then print("We present you next Waves!!",16,95,7,false,1) end if EndingTime>720 then print("Push Button!",80,120,7,false,1) if btnp(4) then -- Palette change for i=1,48 do poke(0x3FC0+i-1,PalData1[i]) end Score=Score+LifeBonus Wave=1 Round=Round+1 Phase=PHASE_GameWaveStart end end end function TIC() if InitEndFlag==0 then return end if Scene==SCENE_TITLE then if Phase==PHASE_TitleInit then Title_Init() elseif Phase==PHASE_TitleMain then Title_Main() elseif Phase==PHASE_TitleGameStart then Title_GameStart() end elseif Scene==SCENE_GAME then cls(0) if Phase==PHASE_GameInit then Game_Init() elseif Phase==PHASE_GameWaveStart then Game_WaveStart() PutStars() PutBG() elseif Phase==PHASE_GameMain then Game_Main() PutStars() PutSprite() PutBG() elseif Phase==PHASE_GameOver then Game_Over() PutStars() PutBG() elseif Phase==PHASE_GameEnding then Game_Ending() end end end function PutStars() -- Stars for i=1,StarMax do StarY[i]=StarY[i]+StarSpd[i] if StarY[i]>1350000 then StarX[i]=math.random(0,160) StarY[i]=0 StarSpd[i]=math.random(0,20000)+5000 StarCol[i]=math.random(1,15) end pix(StarX[i],StarY[i]//10000,StarCol[i]) if StarSpd[i]>22500 then pix(StarX[i]+1,StarY[i]//10000,StarCol[i]) pix(StarX[i] ,StarY[i]//10000+1,StarCol[i]) pix(StarX[i]+1,StarY[i]//10000+1,StarCol[i]) end end end function PutSprite() -- Explosion for i=1,BakuMax do if (BakuFlag[i]>-1) and (BakuFlag[i]0 then tmpX=EnemyX[i]-EnemyScale[i]*8*(120-EnemyExpandTime)/120+1 tmpY=EnemyY[i]-EnemyScale[i]*8*(120-EnemyExpandTime)/120+1 tmpScale=EnemyScale[i]*(120-EnemyExpandTime)/120 SprEx(2+Counter%60//30*2,tmpX,tmpY,0,tmpScale,0,0,2,2) else tmpX=EnemyX[i]-EnemyScale[i]*8+1 tmpY=EnemyY[i]-EnemyScale[i]*8+1 tmpScale=EnemyScale[i] spr(2+Counter%60//30*2,tmpX,tmpY,0,tmpScale,0,0,2,2) end end end -- Item (Candy) for i=1,ItemMax do if ItemFlag[i]==1 then if ItemVY[i]>=0 then spr(78,ItemX[i]-7,ItemY[i]-7,0,1,0,0,2,2) else local scale=1+ItemVY[i]/4 SprEx(78,ItemX[i]-7*scale,ItemY[i]-7*scale,0,scale,0,0,2,2) end end end if ExHeartFlag>0 then spr(342+ExHeartColor,ExHeartX,ExHeartY-(30-ExHeartFlag/2),0,1,0,0,1,1) ExHeartFlag=ExHeartFlag-1 end -- MyChr if (GameoverFlag==0) and (Phase~=PHASE_GameOver) then local tmp=0 if MyFlashFlag==1 then tmp=4 elseif MyFlashFlag==2 then tmp=8 end spr(66+Counter%60//30*2+tmp,MyX-7,MyY-7,0,1,0,0,2,2) end -- EnemyTama for i=1,TamaMax do if TamaFlag[i]==1 then spr(38+TamaColor[i],TamaX[i]-3,TamaY[i]-3,0,1,0,0,1,1) end end if WaveDispTime>0 then font("JKLM "..string.format("%2d",Wave),52,64,0,8,8,true,1) WaveDispTime=WaveDispTime-1 end end function PutBG() -- Side wallPaper rect(160,0,80,136,3) -- Status font("ABCDE",168,10,0,8,8,true,1) font(string.format("%8d",Score),168,20,0,8,8,true,1) font("FGHI",168,34,0,8,8,true,1) if Life>0 then for i=1,Life do font("V",232-8*i,44,0,8,8,true,1) end end font("JKLM",168,60,0,8,8,true,1) font(string.format("%2d",Wave),168+8*6,60,0,8,8,true,1) font("NOPQ",168,78,0,8,8,true,1) font(string.format("%3d",WaveTimer//60),168+8*5,78,0,8,8,true,1) font("RSTU",168,96,0,8,8,true,1) font(string.format("%3d",GetItemCount),168+8*5,96,0,8,8,true,1) print(string.format("Next %3d",GetItemNorma),168+8*2,106,2,true) for i=1,Round+1 do font("X",240-8*i,128,0,8,8,true,1) end if WaveClearFlag>0 then if TimeBonus>0 then print(string.format("TIME BONUS %5d",TimeBonus),32,124,2,true) else print("TIME UP!",56,124,2,true) end end if Phase==PHASE_GameOver then print("GAME",70,60,2,true) print("OVER",70,68,2,true) print("Try Again!",50,96,15,true) else -- Osanpo Kei mascot draw local tmp=2 if OsanpoK_Dir<0 then tmp=8 elseif OsanpoK_Dir>0 then tmp=34 end spr(tmp+Counter%60//30*2,OsanpoK_X+162,116,0,1,0,0,2,2) end -- Debug info --[[ print("MyX "..MyX,160,128,15) ]] end