'----------------------------------------------------------------------------------------- 'To-Do '----------------------------------------------------------------------------------------- '----------------------------------------------------------------------------------------- 'initialize the window first '----------------------------------------------------------------------------------------- GraphicsWindow.Hide() GraphicsWindow.CanResize = "false" GraphicsWindow.Width = 1024 GraphicsWindow.Height = 768 GraphicsWindow.Title = "SOkoCUTE GraphicsWindow.Left = (Desktop.Width - 1024) / 2 GraphicsWindow.Top = (Desktop.Height - 768) / 2 '----------------------------------------------------------------------------------------- 'preload some gfx '----------------------------------------------------------------------------------------- Path = "http://smallbasic.com/drop/soko" background = ImageList.LoadImage( Path + "/sokocuteff.png") image["A"] = ImageList.LoadImage( Path + "/sokocute0a.png") image["B"] = ImageList.LoadImage( Path + "/sokocute0b.png") image["7"] = ImageList.LoadImage( Path + "/sokocute07.png") image["6"] = ImageList.LoadImage( Path + "/sokocute06.png") image["5"] = ImageList.LoadImage( Path + "/sokocute05.png") image["4"] = ImageList.LoadImage( Path + "/sokocute04.png") image["3"] = ImageList.LoadImage( Path + "/sokocute03.png") image["2"] = ImageList.LoadImage( Path + "/sokocutegg.png") image["1"] = ImageList.LoadImage( Path + "/sokocutess.png") image["0"] = ImageList.LoadImage( Path + "/sokocute00.png") star = ImageList.LoadImage( Path + "/sokocutels.png") heart = ImageList.LoadImage( Path + "/sokocutelh.png") 'GraphicsWindow.DrawText(100,100, Program.Directory) GraphicsWindow.DrawImage(background, 0, 0) '----------------------------------------------------------------------------------------- 'init the keys '----------------------------------------------------------------------------------------- leftKey = "Left" rightKey = "Right" forwardKey = "Up" backKey = "Down" fireKey = "Space" returnKey = "Return" escapeKey = "Escape" pauseKey = "P" resetKey = "R" pluskey = "F1" minusKey = "F2" 'important var for moving the crystals korrx = 36 'init any other var animtime = 1500 status = "start" game="gamearray" block = "blockArray" true = 1 false = 0 stage = 0 'init level data InitLevels() 'init stars and hearts InitStars() ResetStars() ' animate title at first titleshape = Shapes.AddImage(Path + "/sokocute.png") Shapes.Move(titleshape, 140,-350) Shapes.Animate(titleshape, 140,170, 2500) txtstart = Shapes.AddImage(Path + "/sokocutetx.png") Shapes.Move(txtstart, 305,1800) Shapes.Animate(txtstart, 305,420, 3000) 'calculate delay (higher number means more precision) timestart = Clock.ElapsedMilliseconds i = 0 while (i < 500000) i = i + 1 Endwhile timeloop = Clock.ElapsedMilliseconds - timestart mssec = timeloop / 500000 loopmssec = 1 / mssec KeyUp() Main() Sub Main GraphicsWindow.Show() GraphicsWindow.KeyDown = KeyDown GraphicsWindow.KeyUp = KeyUp endtime = Clock.ElapsedMilliseconds starttime = Clock.ElapsedMilliseconds blinktime = Clock.ElapsedMilliseconds gamestarttime = Clock.ElapsedMilliseconds gemfall = false freecells = 1 blink = 0 fps = 0 looptime = 0 play = 1 pause = 0 rot = 0 While(play = 1) fps = fps + 1 Input() if status = "game" then 'try fixed fps - 60 might be enough loopdelay = (1000/60) * loopmssec num = 0 While(num < loopdelay) num = num + 1 endwhile If gemfall = false and gemwater <> 99 and Clock.ElapsedMilliseconds - watertime > 550 then Shapes.Animate(crystalimg[gemwater],Shapes.GetLeft(crystalimg[gemwater]), Shapes.GetTop(crystalimg[gemwater]) + 35, 650) gemfall = true EndIf If gemfall = true and gemwater <> 99 and Clock.ElapsedMilliseconds - watertime > 550 and Clock.ElapsedMilliseconds - watertime < 1400 then gemzoom = gemzoom - gemmove gemmove = gemmove + 0.001 Sound.Stop(Path + "/sokocute02.wav") Sound.Play(Path + "/sokocute02.wav") Shapes.Zoom(crystalimg[gemwater], gemzoom, gemzoom) EndIf If gemwater <> 99 and Clock.ElapsedMilliseconds - watertime > 1400 then Shapes.move(crystalimg[gemwater], 1000, 1000) Shapes.move(crystalbnk[gemwater], 1000, 1000) gemwater = 99 gemmove = 0 gemfall = false EndIf If (gemchng <> 99) And (Clock.ElapsedMilliseconds - gemtime > 400) Then if ground[gemy][gemx] = 1 then Shapes.Move(crystalbnk[gemchng], Shapes.GetLeft(crystalimg[gemchng]), Shapes.GetTop(crystalimg[gemchng])) Shapes.Move(crystalimg[gemchng], gemchng * 52, -100) freecells = 0 For y = 0 To 15 For x = 0 To 19 if level[y][x] = 1 then freecells = freecells + 1 EndIF EndFor EndFor If freecells = 0 then Sound.Stop(Path + "/sokocute03.wav") Sound.Play(Path + "/sokocute03.wav") EndIf else Shapes.Move(crystalimg[gemchng], Shapes.GetLeft(crystalbnk[gemchng]), Shapes.GetTop(crystalbnk[gemchng])) Shapes.Move(crystalbnk[gemchng], gemchng * 52, -100) endif gemchng = 99 EndIf 'move the player If newmove < 25 Then newmove = newmove + 1 xplayer = xplayer + movex yplayer = yplayer + movey Shapes.Move(player1, xplayer, yplayer) Shapes.Move(player2, xplayer, yplayer) EndIf 'blinking crystals when level is done If freecells = 0 And Clock.ElapsedMilliseconds - blinktime > 350 then For i = 0 to (cryst - 1) x1 = Shapes.GetLeft(crystalimg[i]) y1 = Shapes.GetTop(crystalimg[i]) x2 = Shapes.GetLeft(crystalbnk[i]) y2 = Shapes.GetTop(crystalbnk[i]) Shapes.Move(crystalimg[i], x2, y2) Shapes.Move(crystalbnk[i], x1, y1) EndFor blink = blink + 1 blinktime = Clock.ElapsedMilliseconds EndIf ' end level if crystals changed color 10 times If blink = 10 then LevelExplosion() stage = stage + 1 if stage <> 10 then status = "reset" resettime = Clock.ElapsedMilliseconds GraphicsWindow.BrushColor = "#3975e5" GraphicsWindow.FillRectangle(70,690,170,80) GraphicsWindow.FillRectangle(800,690,224,85) endif 'load title sceen when finished level 10 If stage = 10 then LevelExplosion() stage = 0 Shapes.Animate(titleshape, 140,170, 2500) Shapes.Animate(txtstart, 305,420, 3000) GraphicsWindow.BrushColor = "#3975e5" GraphicsWindow.FillRectangle(70,690,170,80) GraphicsWindow.FillRectangle(800,690,224,85) status = "start" ResetStars() resettime = Clock.ElapsedMilliseconds endif EndIf ' show time and fps If Clock.ElapsedMilliseconds - endtime > 1000 And status = "game" Then gametime = Clock.ElapsedMilliseconds - starttime GraphicsWindow.BrushColor = "#3975e5" GraphicsWindow.FontName = "COMIC SANS MS" GraphicsWindow.FontSize = 25 GraphicsWindow.FillRectangle(800,690,224,85) GraphicsWindow.BrushColor = "white" tsecgesamt = Math.Round(gametime/ 1000) tsec = Math.Remainder(tsecgesamt , 60) tmingesamt = Math.Floor(tsecgesamt/ 60) tmin = Math.Remainder(tmingesamt , 60) thour = Math.Floor(tmingesamt / 60) If tsec < 10 then strSec = Text.Append( ":0", tsec) Else strSec = Text.Append( ":", tsec) EndIf If tmin < 10 then strMin = Text.Append( "0", tmin) Else strMin = Text.Append( "", tmin) EndIf GraphicsWindow.DrawText(800, 690, " time "+ thour + ":" + Text.Append( strMin, strSec)) GraphicsWindow.DrawText(800, 725, " fps "+ fps ) GraphicsWindow.FontSize = 10 endtime = Clock.ElapsedMilliseconds fps = 0 EndIf EndIf 'of Status = game 'reset level after a short delay If status ="reset" And (Clock.ElapsedMilliseconds - resettime > 2500) Then GraphicsWindow.BrushColor = "#3975e5" GraphicsWindow.FillRectangle(70,690,170,80) GraphicsWindow.FillRectangle(800,690,224,80) freecells = 1 blink = 0 LevelRelease() LevelLoad() wait1 = Clock.ElapsedMilliseconds While Clock.ElapsedMilliseconds - wait1 < 3000 EndWhile starttime = Clock.ElapsedMilliseconds status = "game" GraphicsWindow.BrushColor = "#3975e5" GraphicsWindow.FontName = "COMIC SANS MS" GraphicsWindow.FontSize = 25 GraphicsWindow.FillRectangle(70,690,170,80) GraphicsWindow.BrushColor = "white" GraphicsWindow.DrawText(70, 690, "moves "+ moves) GraphicsWindow.DrawText(70, 725, " level "+ (stage + 1) ) EndIf If status = "start" then MoveStars() endif EndWhile EndSub Sub KeyDown bleftKey = false brightKey = false bforwardKey = false bbackKey = false bescapeKey = false If GraphicsWindow.LastKey = leftKey then bleftKey = true elseif GraphicsWindow.LastKey = rightKey then brightKey = true elseif GraphicsWindow.LastKey = forwardKey then bforwardKey = true elseif GraphicsWindow.LastKey = backKey then bbackKey = true elseif GraphicsWindow.LastKey = returnKey then breturnKey = true elseif GraphicsWindow.LastKey = escapeKey then bescapeKey = true endif endSub Sub KeyUp ' reset every key first bleftKey = false brightKey = false bforwardKey = false bbackKey = false breturnKey = false If GraphicsWindow.LastKey = pauseKey then LevelExplosion() EndIf If GraphicsWindow.LastKey = escapeKey and status = "start" then Program.End() EndIf If GraphicsWindow.LastKey = escapeKey And status = "game" then LevelExplosion() stage = 0 Shapes.Animate(titleshape, 140,170, 2500) Shapes.Animate(txtstart, 305,420, 3000) GraphicsWindow.BrushColor = "#3975e5" GraphicsWindow.FillRectangle(70,690,170,80) GraphicsWindow.FillRectangle(800,690,224,85) status = "start" ResetStars() resettime = Clock.ElapsedMilliseconds EndIf If GraphicsWindow.LastKey = resetKey then LevelExplosion() status = "reset" resettime = Clock.ElapsedMilliseconds EndIf If GraphicsWindow.LastKey = pluskey then LevelExplosion() 'stage = stage + 1 'uncomment this line to cheat with F1 status = "reset" resettime = Clock.ElapsedMilliseconds EndIf If GraphicsWindow.LastKey = minuskey then 'KeyUp() LevelExplosion() 'stage = stage - 1 'uncomment this line to cheat with F2 status = "reset" resettime = Clock.ElapsedMilliseconds EndIf 'reload title after If GraphicsWindow.LastKey = returnKey and status = "start" then Shapes.Animate(titleshape, 140,-350, 2000) Shapes.Animate(txtstart, 305, 1220, 1600) status = "reset" resettime = Clock.ElapsedMilliseconds EndIf EndSub Sub Input If newmove >= 25 and blink = 0 then 'move right If(brightKey = true) and (level[posy][posx+1] <= 2) Then 'move crystal if level[posy][posx+1] = 2 and ground[posy][posx+1] <= 1 And (level[posy][posx+2] <= 1 or ground[posy][posx+2] = 3) Then chestarray[posy][posx+2] = chestarray[posy][posx+1] chestarray[posy][posx+1] = 99 level[posy][posx+1] = ground[posy][posx+1] level[posy][posx+2] = 2 Sound.Stop(Path + "/sokocute01.wav") Sound.Play(Path + "/sokocute01.wav") 'move crystal into water If ground[posy][posx+2] = 3 then watertime = Clock.ElapsedMilliseconds gemwater = chestarray[posy][posx+2] gemzoom = 1 EndIf If (ground[posy][posx+2] = 1 and ground[posy][posx+1] <= 0) Or (ground[posy][posx+2] <= 0 and ground[posy][posx+1] = 1) then gemtime = Clock.ElapsedMilliseconds gemchng = chestarray[posy][posx+2] gemy = posy gemx = posx+2 EndIf 'animate crystal if ground[posy][posx+1] = 1 then Shapes.Animate(crystalbnk[chestarray[posy][posx+2]] , (posx+2) * 50 + korrx, (posy) * 40 - 0, 400) elseif ground[posy][posx+2] = 3 then Shapes.Animate(crystalimg[chestarray[posy][posx+2]] , (posx+2) * 50 + korrx, (posy) * 40 - 0, 400) else Shapes.Animate(crystalimg[chestarray[posy][posx+2]] , (posx+2) * 50 + korrx, (posy) * 40 - 0, 400) endif EndIf 'move player right If level[posy][posx+1] <= 1 then moves = moves + 1 newmove = 0 movex = 2 movey = 0 posx = posx + 1 gametime = Clock.ElapsedMilliseconds GraphicsWindow.BrushColor = "#3975e5" GraphicsWindow.FontName = "COMIC SANS MS" GraphicsWindow.FontSize = 25 GraphicsWindow.FillRectangle(70,690,170,40) GraphicsWindow.BrushColor = "white" GraphicsWindow.DrawText(70, 690, "moves "+ moves) Endif 'move left ElseIf( bleftKey = true) and (level[posy][posx-1]<= 2) Then 'move crystal if level[posy][posx-1] = 2 And ground[posy][posx-1] <= 1 and (level[posy][posx-2] <= 1 or ground[posy][posx-2] = 3) Then chestarray[posy][posx-2] = chestarray[posy][posx-1] chestarray[posy][posx-1] = 99 level[posy][posx-1] = ground[posy][posx-1] level[posy][posx-2] = 2 Sound.Stop(Path + "/sokocute01.wav") Sound.Play(Path + "/sokocute01.wav") 'move crystal into water If ground[posy][posx-2] = 3 then watertime = Clock.ElapsedMilliseconds gemwater = chestarray[posy][posx-2] gemzoom = 1 EndIf If (ground[posy][posx-2] = 1 and ground[posy][posx-1] <= 0) Or (ground[posy][posx-2] <= 0 and ground[posy][posx-1] = 1) then gemtime = Clock.ElapsedMilliseconds gemchng = chestarray[posy][posx-2] gemy = posy gemx = posx-2 EndIf 'animate crystal If ground[posy][posx-1] = 1 then Shapes.Animate(crystalbnk[chestarray[posy][posx-2]] , (posx-2) * 50 + korrx, (posy) * 40 - 0, 400) elseif ground[posy][posx-2] = 3 then Shapes.Animate(crystalimg[chestarray[posy][posx-2]] , (posx-2) * 50 + korrx, (posy) * 40 + 0, 400) else Shapes.Animate(crystalimg[chestarray[posy][posx-2]] , (posx-2) * 50 + korrx, (posy) * 40 - 0, 400) endif EndIf 'move player left If level[posy][posx-1] <= 1 then moves = moves + 1 newmove = 0 movex =-2 movey = 0 posx = posx - 1 gametime = Clock.ElapsedMilliseconds GraphicsWindow.BrushColor = "#3975e5" GraphicsWindow.FontName = "COMIC SANS MS" GraphicsWindow.FontSize = 25 GraphicsWindow.FillRectangle(70,690,170,40) GraphicsWindow.BrushColor = "white" GraphicsWindow.DrawText(70, 690, "moves "+ moves) Endif 'move down ElseIf(bbackKey = true) and (level[posy+1][posx]<= 2) Then 'move crystal if level[posy+1][posx] = 2 And ground[posy+1][posx] <= 1 and (level[posy+2][posx] <= 1 or ground[posy+2][posx] = 3) Then chestarray[posy+2][posx] = chestarray[posy+1][posx] chestarray[posy+1][posx] = 99 level[posy+1][posx] = ground[posy+1][posx] level[posy+2][posx] = 2 Sound.Stop(Path + "/sokocute01.wav") Sound.Play(Path + "/sokocute01.wav") 'move crystal into water If ground[posy+2][posx] = 3 then watertime = Clock.ElapsedMilliseconds gemwater = chestarray[posy+2][posx] gemzoom = 1 EndIf If (ground[posy+2][posx] = 1 and ground[posy+1][posx] <= 0) Or (ground[posy+2][posx] <= 0 and ground[posy+1][posx] = 1) then gemtime = Clock.ElapsedMilliseconds gemchng = chestarray[posy+2][posx] gemy = posy+2 gemx = posx EndIf 'animate crystal if ground[posy+1][posx] = 1 then Shapes.Animate(crystalbnk[chestarray[posy+2][posx]] , (posx) * 50 + korrx, (posy+2) * 40 - 0, 400) elseif ground[posy+2][posx] = 3 then Shapes.Animate(crystalimg[chestarray[posy+2][posx]] , (posx) * 50 + korrx, (posy+2) * 40 + 0, 400) else Shapes.Animate(crystalimg[chestarray[posy+2][posx]] , (posx) * 50 + korrx, (posy+2) * 40 - 0, 400) endif EndIf 'move player down If level[posy+1][posx] <= 1 then moves = moves + 1 newmove = 0 movex = 0 movey = 1.6 posy = posy + 1 gametime = Clock.ElapsedMilliseconds GraphicsWindow.BrushColor = "#3975e5" GraphicsWindow.FontName = "COMIC SANS MS" GraphicsWindow.FontSize = 25 GraphicsWindow.FillRectangle(70,690,170,40) GraphicsWindow.BrushColor = "white" GraphicsWindow.DrawText(70, 690, "moves "+ moves) Endif 'move up ElseIf(bforwardKey = true) and (level[posy-1][posx]<= 2) Then 'move crystal if level[posy-1][posx] = 2 And ground[posy-1][posx] <= 1 And (level[posy-2][posx] <= 1 or ground[posy-2][posx] = 3) Then chestarray[posy-2][posx] = chestarray[posy-1][posx] chestarray[posy-1][posx] = 99 level[posy-1][posx] = ground[posy-1][posx] level[posy-2][posx] = 2 Sound.Stop(Path + "/sokocute01.wav") Sound.Play(Path + "/sokocute01.wav") 'move crystal into water If ground[posy-2][posx] = 3 then watertime = Clock.ElapsedMilliseconds gemwater = chestarray[posy-2][posx] gemzoom = 1 EndIf If (ground[posy-2][posx] = 1 and ground[posy-1][posx] <= 0) Or (ground[posy-2][posx] <= 0 and ground[posy-1][posx] = 1) then gemtime = Clock.ElapsedMilliseconds gemchng = chestarray[posy-2][posx] gemy = posy-2 gemx = posx EndIf 'animate crystal if ground[posy-1][posx] = 1 then Shapes.Animate(crystalbnk[chestarray[posy-2][posx]] , (posx) * 50 + korrx, (posy-2) * 40 - 0, 400) elseif ground[posy-2][posx] = 3 then Shapes.Animate(crystalimg[chestarray[posy-2][posx]] , (posx) * 50 + korrx, (posy-2) * 40 + 0, 400) else Shapes.Animate(crystalimg[chestarray[posy-2][posx]] , (posx) * 50 + korrx, (posy-2) * 40 - 0, 400) endif EndIf 'move player up if level[posy-1][posx] <= 1 then moves = moves + 1 newmove = 0 movex = 0 movey =-1.6 posy = posy - 1 gametime = Clock.ElapsedMilliseconds GraphicsWindow.BrushColor = "#3975e5" GraphicsWindow.FontName = "COMIC SANS MS" GraphicsWindow.FontSize = 25 GraphicsWindow.FillRectangle(70,690,170,40) GraphicsWindow.BrushColor = "white" GraphicsWindow.DrawText(70, 690, "moves "+ moves) EndIf EndIf EndIf EndSub Sub Sort For y = 0 To 15 For x = 0 To 15 If level[y][x] = 3 Then Shapes.Remove(levelshapes[y][x]) levelshapes[y][x] = Shapes.AddImage(image["3"]) Shapes.Move(levelshapes[y][x], (x) * 50 + korrx, (y) * 40 - 0) endif 'GraphicsWindow.DrawText(11*i+520,11*p+30,level[p][i]) EndFor EndFor EndSub Sub LevelExplosion Shapes.Animate(player1, Shapes.GetLeft(player1), 1500, 4000) Shapes.Animate(player2, Shapes.GetLeft(player2), 1500, 4000) For i = 0 To shade angle = Math.GetRandomNumber(360) xv = Math.Cos(angle * 0.0174) * 1200 yv = Math.Sin(angle * 0.0174) * 600 Shapes.Animate(Shadow[i], xv + 512, yv + 350, 1500) EndFor For i = 0 To cryst angle = Math.GetRandomNumber(360) xv = Math.Cos(angle * 0.0174) * 1200 yv = Math.Sin(angle * 0.0174) * 600 If Shapes.GetTop(crystalimg[i]) > 0 then Shapes.Animate(crystalimg[i], xv + 512, yv + 350, 1500) EndIf If Shapes.GetTop(crystalbnk[i]) > 0 then Shapes.Animate(crystalbnk[i], xv + 512, yv + 350, 1500) EndIf EndFor For y = 0 To 15 For x = 0 To 19 angle = Math.GetRandomNumber(360) xv = Math.Cos(angle * 0.0174) * 1200 yv = Math.Sin(angle * 0.0174) * 600 Shapes.Animate(levelshapes[y][x], xv + 512, yv + 350, 1500) EndFor EndFor EndSub Sub LevelRelease For y = 0 To 15 For x = 0 To 19 Shapes.Remove(levelshapes[y][x]) EndFor EndFor For i = 0 To shade Shapes.Remove(Shadow[i]) EndFor For i = 0 To cryst Shapes.Remove(crystalimg[i]) Shapes.Remove(crystalbnk[i]) EndFor For i = 0 To 20 Shapes.Remove(star) endFor EndSub Sub LevelLoad cryst = 0 posx = 4 posy = 4 moves = 0 For i = 0 To 15 For p = 1 To Text.GetLength(block[stage][i]) blockcode = Text.GetSubText(block[stage][i], p, 1) If blockcode = "X" then posy = i posx = p-1 blockcode = 0 EndIf if blockcode = 2 then ground[i][p-1] = 0 elseif blockcode = "C" then 'crystal on gras ground[i][p-1] = "A" elseif blockcode = "D" then 'crystal on wood ground[i][p-1] = "B" else ground[i][p-1] = blockcode endif EndFor EndFor 'load the water first For i = 0 To 15 For p = 1 To Text.GetLength(block[stage][i]) blockcode = Text.GetSubText(block[stage][i], p, 1) If blockcode = 3 Then levelshapes[i][p-1] = Shapes.AddImage(image[blockcode]) angle = Math.GetRandomNumber(360) xv = Math.Cos(angle * 0.0174) * 1000 yv = Math.Sin(angle * 0.0174) * 550 Shapes.Move(levelshapes[i][p-1], xv + 512, yv + 350) Shapes.animate(levelshapes[i][p-1], (p-1) * 50 + korrx, (i) * 40 - 0, animtime) Endif EndFor EndFor 'shadows for the water LoadShadowWater() For i = 0 To 15 For p = 1 To Text.GetLength(block[stage][i]) blockcode = Text.GetSubText(block[stage][i], p, 1) If blockcode = "X" then posy = i posx = p-1 blockcode = 0 elseIf blockcode = "Y" then posy = i posx = p-1 blockcode = "A" elseIf blockcode = "Z" then posy = i posx = p-1 blockcode = "B" EndIf if blockcode = 2 then ground[i][p-1] = 0 elseif blockcode = "C" then ground[i][p-1] = "A" elseif blockcode = "D" then ground[i][p-1] = "B" else ground[i][p-1] = blockcode endif if blockcode = "C" then level[i][p-1] = 2 elseif blockcode = "D" then level[i][p-1] = 2 else level[i][p-1] = blockcode endif If blockcode = "C" Then 'crystal on gras levelshapes[i][p-1] = Shapes.AddImage(image["A"]) angle = Math.GetRandomNumber(360) xv = Math.Cos(angle * 0.0174) * 1200 yv = Math.Sin(angle * 0.0174) * 600 Shapes.Move(levelshapes[i][p-1], xv + 512, yv + 350) Shapes.animate(levelshapes[i][p-1], (p-1) * 50 + korrx, (i) * 40 - 0, animtime) elseIf blockcode = "D" Then 'crystal on wood levelshapes[i][p-1] = Shapes.AddImage(image["B"]) angle = Math.GetRandomNumber(360) xv = Math.Cos(angle * 0.0174) * 1200 yv = Math.Sin(angle * 0.0174) * 600 Shapes.Move(levelshapes[i][p-1], xv + 512, yv + 350) Shapes.animate(levelshapes[i][p-1], (p-1) * 50 + korrx, (i) * 40 - 0, animtime) elseIf blockcode < 2 Then levelshapes[i][p-1] = Shapes.AddImage(image[blockcode]) angle = Math.GetRandomNumber(360) xv = Math.Cos(angle * 0.0174) * 1200 yv = Math.Sin(angle * 0.0174) * 600 Shapes.Move(levelshapes[i][p-1], xv + 512, yv + 350) Shapes.Animate(levelshapes[i][p-1], (p-1) * 50 + korrx, (i) * 40 - 0, animtime) ElseIf blockcode = 2 Then levelshapes[i][p-1] = Shapes.AddImage(image["0"]) angle = Math.GetRandomNumber(360) xv = Math.Cos(angle * 0.0174) * 1200 yv = Math.Sin(angle * 0.0174) * 600 Shapes.Move(levelshapes[i][p-1], xv + 512, yv + 350) Shapes.animate(levelshapes[i][p-1], (p-1) * 50 + korrx, (i) * 40 - 0, animtime) endif EndFor EndFor 'tried to fix strange shapes.animate behaviors if there are too many shapes flying around - no real success... loopdelay = (1600) * loopmssec num = 0 While(num < loopdelay) num = num + 1 endwhile 'load blocks f = 0 For i = 0 To 15 For p = 1 To Text.GetLength(block[stage][i]) blockcode = Text.GetSubText(block[stage][i], p, 1) If blockcode = 2 or blockcode = "C" or blockcode = "D" Then crystalimg[cryst] = Shapes.AddImage(image[2]) crystalbnk[cryst] = Shapes.AddImage(Path + "/sokocuteg2.png") chestarray[i][p-1] = cryst angle = Math.GetRandomNumber(360) xv = Math.Cos(angle * 0.0174) * 1200 yv = Math.Sin(angle * 0.0174) * 600 Shapes.Move(crystalimg[cryst], xv + 512, yv + 350) Shapes.animate(crystalimg[cryst] , (p-1) * 50 + korrx, (i) * 40 - 0, animtime*1.5) 'Shapes.Move(crystalimg[cryst] , (p-1) * 50 + korrx, (i) * 40 - 0) Shapes.Move(crystalbnk[cryst] , cryst * 52 , -100) cryst = cryst + 1 Endif EndFor EndFor player1 = Shapes.AddImage(Path + "/sokocutep2.png") 'load lower player shape first. it has to be behind the walls Shapes.Move(player1, (posx) * 50 + korrx, (posy) * 40 - 0) LoadShadow() '------------------------------------------------------------ 'load the walls For i = 0 To 15 For p = 1 To Text.GetLength(block[stage][i]) blockcode = Text.GetSubText(block[stage][i], p, 1) If blockcode >= 4 Then levelshapes[i][p-1] = Shapes.AddImage(image[blockcode]) angle = Math.GetRandomNumber(360) xv = Math.Cos(angle * 0.0174) * 1000 yv = Math.Sin(angle * 0.0174) * 550 Shapes.Move(levelshapes[i][p-1], xv + 512, yv + 350) Shapes.animate(levelshapes[i][p-1], (p-1) * 50 + korrx, (i) * 40 - 0, animtime) Endif EndFor EndFor 'load players face at last. It has always to be in front of the walls player2 = Shapes.AddImage(Path + "/sokocutep1.png") Shapes.Move(player2, (posx) * 50 + korrx, (posy) * 40 - 0) xplayer = Shapes.GetLeft(player1) yplayer = Shapes.GetTop(player1) EndSub sub LoadShadow For y = 0 To 15 For x = 0 To 19 If level[y][x] <= 2 and level[y][x] <> " " Then angle = Math.GetRandomNumber(360) xv = Math.Cos(angle * 0.0174) * 1200 yv = Math.Sin(angle * 0.0174) * 600 If level[y][x-1] >= 6 then Shadow[shade] = Shapes.AddImage(Path + "/SW.png") Shapes.Move(Shadow[shade], xv + 512, yv + 350) Shapes.animate(Shadow[shade], (x) * 50 + korrx, (y) * 40 - 0, animtime*1.2) shade = shade + 1 EndIf If level[y][x+1] >= 6 then Shadow[shade] = Shapes.AddImage(Path + "/SE.png") Shapes.Move(Shadow[shade], xv + 512, yv + 350) Shapes.animate(Shadow[shade], (x) * 50 + korrx, (y) * 40 - 0, animtime*1.2) shade = shade + 1 EndIf If level[y-1][x] >= 6 then Shadow[shade] = Shapes.AddImage(Path + "/SN.png") Shapes.Move(Shadow[shade], xv + 512, yv + 350) Shapes.animate(Shadow[shade], (x) * 50 + korrx, (y) * 40 - 0, animtime*1.2) shade = shade + 1 EndIf If level[y][x-1] <=2 and level[y-1][x] <= 2 and level[y-1][x-1] >= 6 then Shadow[shade] = Shapes.AddImage(Path + "/SNW.png") Shapes.Move(Shadow[shade], xv + 512, yv + 350) Shapes.animate(Shadow[shade], (x) * 50 + korrx, (y) * 40 - 0, animtime*1.2) shade = shade + 1 EndIf If level[y][x+1] <=2 and level[y-1][x] <= 2 and level[y-1][x+1] >= 6 then Shadow[shade] = Shapes.AddImage(Path + "/SNE.png") Shapes.Move(Shadow[shade], xv + 512, yv + 350) Shapes.animate(Shadow[shade], (x) * 50 + korrx, (y) * 40 - 0, animtime*1.2) shade = shade + 1 EndIf If level[y][x-1] <=2 and level[y+1][x] <= 2 and level[y+1][x-1] >= 6 then Shadow[shade] = Shapes.AddImage(Path + "/SSW.png") Shapes.Move(Shadow[shade], xv + 512, yv + 350) Shapes.animate(Shadow[shade], (x) * 50 + korrx, (y) * 40 - 0, animtime*1.2) shade = shade + 1 EndIf If level[y][x+1] <=2 and level[y+1][x] <= 2 and level[y+1][x+1] >= 6 then Shadow[shade] = Shapes.AddImage(Path + "/SSE.png") Shapes.Move(Shadow[shade], xv + 512, yv + 350) Shapes.animate(Shadow[shade], (x) * 50 + korrx, (y) * 40 - 0, animtime*1.2) shade = shade + 1 EndIf endif EndFor EndFor EndSub sub LoadShadowWater shade = 0 ky = 22 For y = 0 To 15 For x = 0 To 19 If ground[y][x] = 3 Then angle = Math.GetRandomNumber(360) xv = Math.Cos(angle * 0.0174) * 1200 yv = Math.Sin(angle * 0.0174) * 600 If ground[y][x-1] <> 3 and ground[y][x-1] >= 0 and ground[y][x-1] <> " " then Shadow[shade] = Shapes.AddImage(Path + "/SW.png") Shapes.Move(Shadow[shade], xv + 512, yv + 350) Shapes.animate(Shadow[shade], (x) * 50 + korrx, (y) * 40 + ky, animtime*1.2) shade = shade + 1 EndIf If ground[y][x+1] <> 3 and ground[y+1][x] >= 0 and ground[y][x+1] <> " " then Shadow[shade] = Shapes.AddImage(Path + "/SE.png") Shapes.Move(Shadow[shade], xv + 512, yv + 350) Shapes.animate(Shadow[shade], (x) * 50 + korrx, (y) * 40 + ky, animtime*1.2) shade = shade + 1 EndIf If ground[y-1][x] <> 3 and ground[y-1][x] >= 0 and ground[y-1][x] <> " " then Shadow[shade] = Shapes.AddImage(Path + "/SN.png") Shapes.Move(Shadow[shade], xv + 512, yv + 350) Shapes.animate(Shadow[shade], (x) * 50 + korrx, (y) * 40 + ky, animtime*1.2) shade = shade + 1 EndIf If ground[y][x-1] = 3 and ground[y-1][x] = 3 and ground[y-1][x-1] <> 3 and ground[y-1][x-1] >= 0 then Shadow[shade] = Shapes.AddImage(Path + "/SNW.png") Shapes.Move(Shadow[shade], xv + 512, yv + 350) Shapes.animate(Shadow[shade], (x) * 50 + korrx, (y) * 40 + ky, animtime*1.2) shade = shade + 1 EndIf If ground[y][x+1] = 3 and ground[y-1][x] = 3 and ground[y-1][x+1] <> 3 and ground[y-1][x+1] >= 0 then Shadow[shade] = Shapes.AddImage(Path + "/SNE.png") Shapes.Move(Shadow[shade], xv + 512, yv + 350) Shapes.animate(Shadow[shade], (x) * 50 + korrx, (y) * 40 + ky, animtime*1.2) shade = shade + 1 EndIf If ground[y][x-1] = 3 and ground[y+1][x] = 3 and ground[y+1][x-1] <> 3 and ground[y+1][x-1] >= 0 then Shadow[shade] = Shapes.AddImage(Path + "/SSW.png") Shapes.Move(Shadow[shade], xv + 512, yv + 350) Shapes.animate(Shadow[shade], (x) * 50 + korrx, (y) * 40 + ky, animtime*1.2) shade = shade + 1 EndIf If ground[y][x+1] = 3 and ground[y+1][x] = 3 and ground[y+1][x+1] <> 3 and ground[y+1][x+1] >= 0 then Shadow[shade] = Shapes.AddImage(Path + "/SSE.png") Shapes.Move(Shadow[shade], xv + 512, yv + 350) Shapes.animate(Shadow[shade], (x) * 50 + korrx, (y) * 40 + ky, animtime*1.2) shade = shade + 1 EndIf endif EndFor EndFor EndSub Sub InitStars For i = 0 To 12 star[i] = Shapes.AddImage(Path + "/sokocutels.png") heart[i] = Shapes.AddImage(Path + "/sokocutelh.png") endFor EndSub Sub ResetStars For i = 0 To 12 angle = Math.GetRandomNumber(360) starxv[i] = Math.Cos(angle * 0.0174) * 0.50 staryv[i] = Math.Sin(angle * 0.0174) * 0.50 starx[i] = 1000 stary[i] = 1000 startime[i] = Math.GetRandomNumber(100) Shapes.Move(star[i], starx[i], stary[i]) endFor For i = 0 To 12 angle = Math.GetRandomNumber(360) heartxv[i] = Math.Cos(angle * 0.0174) * 0.50 heartyv[i] = Math.Sin(angle * 0.0174) * 0.50 heartx[i] = 1000 hearty[i] = 1000 hearttime[i] = Math.GetRandomNumber(100) Shapes.Move(heart[i], heartx[i], hearty[i]) endFor EndSub ' move stars and hearts Sub MoveStars For i = 0 to 12 If startime[i] > 100 then angle = Math.GetRandomNumber(360) starxv[i] = Math.Cos(angle * 0.0174) staryv[i] = Math.Sin(angle * 0.0174) starx[i] = 500 + 20 stary[i] = 150 Shapes.Move(star[i], starx[i] , stary[i]) startime[i] = 0 EndIf startime[i] = startime[i] + 0.20 staryv[i] = staryv[i] + 0.005 starx[i] = starx[i] + starxv[i] stary[i] = stary[i] + staryv[i] Shapes.Rotate(star[i], startime[i] * 15) Shapes.Zoom(star[i], math.sin(startime[i] / 32) , math.sin(startime[i] / 32) ) Shapes.Move(star[i], starx[i], stary[i]) EndFor For i = 0 to 12 If hearttime[i] > 100 then angle = Math.GetRandomNumber(360) heartxv[i] = Math.Cos(angle * 0.0174) heartyv[i] = Math.Sin(angle * 0.0174) heartx[i] = 500 + 20 hearty[i] = 150 Shapes.Move(heart[i], heartx[i] , hearty[i]) hearttime[i] = 0 EndIf hearttime[i] = hearttime[i] + 0.20 heartyv[i] = heartyv[i] + 0.005 heartx[i] = heartx[i] + heartxv[i] hearty[i] = hearty[i] + heartyv[i] Shapes.Rotate(heart[i], hearttime[i] * -10) Shapes.Zoom(heart[i], math.sin(hearttime[i] / 32) , math.sin(hearttime[i] / 32) ) Shapes.Move(heart[i], heartx[i], hearty[i]) EndFor EndSub Sub InitLevels block[0][0] = " " block[0][1] = " " block[0][2] = " " block[0][3] = " 66666 " block[0][4] = " 60006 " block[0][5] = " 62006 " block[0][6] = " 66600266 " block[0][7] = " 60020206 " block[0][8] = " 6660606606AA555555 " block[0][9] = " 600060660666700115 " block[0][10]= " 60200200000X000115 " block[0][11]= " 666660666066700115 " block[0][12]= " 60000066555555 " block[0][13]= " 6666666 " block[0][14]= " " block[0][15]= " " block[1][0] = " " block[1][1] = " " block[1][2] = " " block[1][3] = " 6666666 " block[1][4] = " 76666600000667 " block[1][5] = " 61111602002006 " block[1][6] = " 61100626666006 " block[1][7] = " 6110000X066006 " block[1][8] = " 61100606002076 " block[1][9] = " 76666606620206 " block[1][10]= " 602002020206 " block[1][11]= " 600007000006 " block[1][12]= " 766666666667 " block[1][13]= " " block[1][14]= " " block[1][15]= " " block[2][0] = " " block[2][1] = " " block[2][2] = " " block[2][3] = " 76666667 " block[2][4] = " 600000X6 " block[2][5] = " 60262066 " block[2][6] = " 6020026 " block[2][7] = " 6720206 " block[2][8] = " 7666666 602060667 " block[2][9] = " 61111066602002006 " block[2][10]= " 61110000020020006 " block[2][11]= " 61111066666666667 " block[2][12]= " 7666666 " block[2][13]= " " block[2][14]= " " block[2][15]= " " block[3][0] = " " block[3][1] = " " block[3][2] = "6666663 " block[3][3] = "611166366666 66666 " block[3][4] = "611116360006 60006 " block[3][5] = "6111163607066660706 " block[3][6] = "600X063600200000006 " block[3][7] = "6606663700602260666 " block[3][8] = "5AAAA73A220060006 " block[3][9] = "5ACAABBB002666206 " block[3][10]= "5AA5AA3A700060006 " block[3][11]= "5555553A666060726 " block[3][12]= "AAAAAA3AAA6022006 " block[3][13]= "33333333336000006 " block[3][14]= " 6666666 " block[3][15]= " " block[4][0] = " " block[4][1] = " " block[4][2] = " 66666 " block[4][3] = " 666666600067 " block[4][4] = " 66070X6602206 " block[4][5] = " 6000020000006 " block[4][6] = " 6002006660006 " block[4][7] = " 6660666662666 " block[4][8] = " 602006660116 " block[4][9] = " 602020201116 " block[4][10]= " 600006661116 " block[4][11]= " 602206 61116 " block[4][12]= " 600666 76667 " block[4][13]= " 7667 " block[4][14]= " " block[4][15]= " " block[5][0] = " " block[5][1] = " 4444444 " block[5][2] = " 4AA1114 " block[5][3] = " 66667AA1114 " block[5][4] = " 60000AA1A14 " block[5][5] = " 60067AA1114 " block[5][6] = " 66066AA1114 " block[5][7] = " 666066444444 " block[5][8] = " 60222066AAAA " block[5][9] = " 6666600202066666 " block[5][10]= " 66000720200070006 " block[5][11]= " 6X020020000200206 " block[5][12]= " 66666602202066666 " block[5][13]= " 60000006 " block[5][14]= " 66666666 " block[5][15]= " " block[6][0] = " " block[6][1] = " 7777777777 " block[6][2] = " 7110070007 " block[6][3] = " 7110000007 " block[6][4] = " 711007007777 " block[6][5] = " 77777770070077 " block[6][6] = " 70000000000007 " block[6][7] = " 70070077007007 " block[6][8] = " 7777077007777077 " block[6][9] = " 7002007777707007 " block[6][10]= " 7070200200702007 " block[6][11]= " 70X2002000700077 " block[6][12]= " 777707707777777 " block[6][13]= " 700007 " block[6][14]= " 777777 " block[6][15]= " " block[7][0] = " " block[7][1] = " " block[7][2] = " " block[7][3] = " 4444 " block[7][4] = " 4444444AY4 " block[7][5] = " 4AAAAACAA4 " block[7][6] = " 4AAAC77AC4 " block[7][7] = " 44C71117A4 " block[7][8] = " 4AC111AA4 " block[7][9] = " 4A71A17A44 " block[7][10]= " 4AAA7A7CA4 " block[7][11]= " 4CAACAAAA4 " block[7][12]= " 4AA4444444 " block[7][13]= " 4444 " block[7][14]= " " block[7][15]= " " block[8][0] = " " block[8][1] = " " block[8][2] = " 4444 " block[8][3] = " 444444444AA77 " block[8][4] = " 74AACAAAAAACA75557 " block[8][5] = " 4ABB77B77BBA771115 " block[8][6] = " 4A7DDBDBDD7C771115 " block[8][7] = " 4A7BBBBZBB7AAA1115 " block[8][8] = " 4ABD7B777DDAAA1115 " block[8][9] = " 4ACAACCAACA7711115 " block[8][10]= " 744CAAAAAAA7755557 " block[8][11]= " 4AA4444444 " block[8][12]= " 4444 " block[8][13]= " " block[8][14]= " " block[8][15]= " " block[9][0] = " AAAAA A A AAAA " block[9][1] = " A A A A " block[9][2] = " A AAAAA AAA " block[9][3] = " A A A A " block[9][4] = " A A A AAAA " block[9][5] = " " block[9][6] = " AAAA A A AAA " block[9][7] = " A AA A A A " block[9][8] = " AAA A A A A A " block[9][9]= " A A AA A A " block[9][10]= " AAAA A A AAA " block[9][11]= " " block[9][12]= " " block[9][13]= " 4444444444444444 " block[9][14]= " 40X0020000000104 " block[9][15]= " 4444444444444444 " EndSub