Global nopeus, vihunopeus#, hyppypower, painovoima#, maxPV#, pisteet, raha_alue, gamebgmfile$, loser, plop, pling, taso Type vihut Field obj EndType Type vihurajat Field obj EndType Type rahat Field obj EndType Function game(lvl, score, spd) //Asetetaan perusarvot nopeus = 2 * spd // Hahmon liikkumisnopeus vihunopeus = 1 * spd // Vihujen liikkumisnopeus hyppypower = 16 // Ponnistusvoima painovoima = 1.5 // Puoamiskiihtyvyys maxPV = 10 // Suurin putoamisnopeus pisteet = score taso = lvl raha_alue = 15 //Ladataan resurssit kenttä = LoadMap("lvl" + Str(taso) + ".til", "lvl" + Str(taso) + ".bmp") ukko = LoadAnimObject("ukko.bmp", 30, 25, 0, 4) vihu_kuva = LoadAnimObject("vihu.bmp", 32, 32, 0, 11) ShowObject vihu_kuva, OFF raha_kuva = LoadObject("score.bmp") ShowObject raha_kuva, OFF goal = LoadObject("maali.bmp") plop = LoadSound("plop.wav") pling = LoadSound("pling.wav") loser = LoadSound("lost.wav") //Kartan läpikäynti For x = 1 To MapWidth() For y = 1 To MapHeight() Select GetMap2(3, x, y) Case 1 //Pelaaja löytyi ObjectToMap(ukko, kenttä, x, y) CloneCameraPosition ukko SetupCollision ukko, kenttä, 1, 4, 2 ObjectFloat ukko, 0 //Putoamisvauhti 0 ObjectInteger ukko, False //Jalat irti maasta Case 2 //Vihu löytyi vihu.vihut = New(vihut) vihu\obj = CloneObject(vihu_kuva) ObjectString vihu\obj, Str(-1) //Suunta vasemmalle ObjectFloat vihu\obj, 0 //Putoamisvauhti 0 ObjectInteger vihu\obj, False //Jalat irti maasta LoopObject vihu\obj, 0, 10, 0.1 * spd, OFF ObjectRange vihu\obj, ObjectSizeX(kenttä) / MapWidth(), ObjectSizeY(kenttä) / MapHeight() SetupCollision vihu\obj, kenttä, 1, 4, 2 SetupCollision vihu\obj, ukko, 1, 1, 2 SetupCollision ukko, vihu\obj, 1, 1, 2 ObjectToMap(vihu\obj, kenttä, x, y) Case 3 //Piste löytyi raha.rahat = New(rahat) raha\obj = CloneObject(raha_kuva) SetupCollision ukko, raha\obj, 1, 1, 2 ObjectRange raha\obj, raha_alue, raha_alue ObjectToMap(raha\obj, kenttä, x, y) Case 4 //Vihollisen alueen raja löytyi vihuraja.vihurajat = New(vihurajat) vihuraja\obj = MakeObject() ObjectRange vihuraja\obj, ObjectSizeX(kenttä) / MapWidth(), ObjectSizeY(kenttä) / MapHeight() ObjectToMap(vihuraja\obj, kenttä, x, y) Case 5 //Maali löytyi SetupCollision ukko, goal, 1, 1, 2 objecttomap(goal, kenttä, x, y) EndSelect Next y Next x For vihu.vihut = Each vihut For vihuraja.vihurajat = Each vihurajat SetupCollision vihu\obj, vihuraja\obj, 1, 1, 2 SetupCollision vihuraja\obj, vihu\obj, 1, 1, 2 Next vihuraja Next vihu CameraFollow ukko, 1, 5 Color 255, 255, 255 ClsColor 0, 0, 0 // Säälittävä ruutunopeus, koska optimointi omalle heikolle koneelleni... FrameLimit 30 ///Pääsilmukka Repeat //Nollataan maassa-muuttujat ObjectInteger ukko, False For vihu.vihut = Each vihut ObjectInteger vihu\obj, False Next vihu //Tarkistetaan ja käsitellään törmäykset //Pelaaja: törmäykset = CountCollisions(ukko) For i = 1 To törmäykset //Tarkistetaan pelaajan ja kentän törmäykset If GetCollision(ukko, i) = kenttä Then If CollisionAngle(ukko, i) = 90 And (Not jumped) Then // Maa? ObjectInteger ukko, True ObjectFloat ukko, 0 ElseIf CollisionAngle(ukko, i) = 270 Then // Katto? ObjectFloat ukko, 0 EndIf EndIf //Tarkistetaan pelaajan ja vihujen törmäykset For vihu.vihut = Each vihut If GetCollision(ukko, i) = vihu\obj Then If CollisionAngle(ukko, i) > 45 And CollisionAngle(ukko, i) < 135 Then ObjectFloat ukko, hyppypower DeleteObject vihu\obj Delete vihu PlaySound plop pisteet = pisteet + 10 Else lost() Return False EndIf EndIf Next vihu //Tarkistetaan pelaajan ja rahojen törmäykset For raha.rahat = Each rahat If GetCollision(ukko, i) = raha\obj Then PlaySound pling DeleteObject raha\obj pisteet = pisteet + 1 Delete raha EndIf Next raha Next i //Tarkistetaan pelaajan maaliin saapuminen If GetCollision(ukko, i) = goal Then won() Return False EndIf //Vihut: For vihu.vihut = Each vihut törmäykset = CountCollisions(vihu\obj) For i = 1 To törmäykset //Tarkistetaan vihun ja kentän törmäykset If GetCollision(vihu\obj, i) = kenttä Then If CollisionAngle(vihu\obj, i) = 90 Then //Maa ObjectInteger vihu\obj, True ObjectFloat vihu\obj, 0 ElseIf CollisionAngle(vihu\obj, i) = 270 Then //Katto ObjectFloat vihu\obj, 0 ElseIf CollisionAngle(vihu\obj, i) = 180 Then //Vasen? ObjectString vihu\obj, Str(-1) ElseIf CollisionAngle(vihu\obj,i) = 0 Then //Oikea? ObjectString vihu\obj, Str(1) EndIf EndIf //Tarkistetaan vihujen ja vihurajojen törmäykset For vihuraja.vihurajat = Each vihurajat If GetCollision(vihu\obj, i) = vihuraja\obj Then If CollisionAngle(vihu\obj, i) >= 90 And CollisionAngle(vihu\obj, i) < 270 Then //Vasen? ObjectString vihu\obj, Str(-1) Else //Oikea? ObjectString vihu\obj, Str(1) EndIf EndIf Next vihuraja //Tarkistetaan vihujen ja pelaajan törmäykset If GetCollision(vihu\obj, i) = ukko Then If CollisionAngle(ukko, i) < 45 And CollisionAngle(ukko, i) > 135 Then ObjectFloat ukko, hyppypower DeleteObject vihu\obj Delete vihu PlaySound plop pisteet = pisteet + 10 Else lost() Return False EndIf EndIf Next i Next vihu //Näppäinten tarkistukset If LeftKey() Or KeyDown(cbkeya) Then PlayObject ukko, 2, 3, 0.1 * spd, OFF MoveObject ukko, -nopeus ElseIf RightKey() or KeyDown(cbkeyd) Then PlayObject ukko, 0, 1, 0.1 * spd, OFF MoveObject ukko, nopeus EndIf If Keyhit(cbKeyQ) Then ' won() ' Return False Else FrameLimit 30 EndIf If ObjectInteger(ukko) And (UpKey() Or KeyHit(cbkeyspace) Or Keyhit(cbkeyw)) Then ObjectFloat ukko, hyppypower 'jumped = True EndIf //Käsitellään painovoima ObjectFloat ukko, ObjectFloat(ukko) - painovoima If ObjectFloat(ukko) < -maxPV Then ObjectFloat ukko, -maxPV TranslateObject ukko, 0, ObjectFloat(ukko) For vihu.vihut = Each vihut ObjectFloat vihu\obj, ObjectFloat(vihu\obj) - painovoima If ObjectFloat(vihu\obj) < -maxPV Then ObjectFloat vihu\obj, -maxPV TranslateObject vihu\obj, vihunopeus * Int(ObjectString(vihu\obj)), ObjectFloat(vihu\obj) Next vihu //Tarkistetaan, ettei pudottu liikaa If ObjectY(ukko) < ObjectY(kenttä) - ObjectSizeY(kenttä) / 2 Then lost() Return False EndIf ///Kaikki itsestään selvä, mikä nyt kuitenkin ON täällä AddText "Scr: " + Str(pisteet) DrawScreen ClearText Forever ClearObjects EndFunction Function lost() PlaySound loser Color 10, 10, 10 ClsColor 255, 0, 0 //Poistetaan objektit ClearObjects //Tyhjennetään tyypit For vihu.vihut = Each vihut Delete vihu Next vihu For raha.rahat = Each rahat Delete raha Next raha For vihuraja.vihurajat = Each vihurajat Delete vihuraja Next vihuraja //Poistetaan napit Nappi_Poista() //Lopetuskysymys AddText "Hävisit. Pisteesi: " + Str(pisteet) Nappi_Lisaa(mainmargin, ScreenHeight() / 2 - 10, ScreenWidth() - mainmargin * 2, 20, "Poistu") ClearKeys Repeat nimi$ = Input("Anna nimesi: ") Nappi_Piirra() If Nappi_Paivita() = "Poistu" Or KeyHit(cbkeyreturn) Then CloseInput If nimi = "" Then nimi = "Nimetön" lisaahs(nimi, pisteet) sound = PlaySound("buttonhit.wav") ClsColor bgrr, bgrg, bgrb Return False EndIf DrawScreen Forever EndFunction Function won() Color 10, 10, 10 ClsColor 0, 255, 0 //Poistetaan objektit ClearObjects //Tyhjennetään Type-jutut For vihu.vihut = Each vihut Delete vihu Next vihu For raha.rahat = Each rahat Delete raha Next raha For vihuraja.vihurajat = Each vihurajat Delete vihuraja Next vihuraja //Poistetaan napit Nappi_Poista() //Lopetuskysymys AddText "Voitit. Pisteesi: " + Str(pisteet) Nappi_Lisaa(mainmargin, ScreenHeight() / 2 - 10, ScreenWidth() - mainmargin * 2, 20, "Poistu") ClearKeys Repeat nimi$ = Input("Anna nimesi: ") Nappi_Piirra() If Nappi_Paivita() = "Poistu" Or KeyHit(cbkeyreturn) Then CloseInput If nimi = "" Then nimi = "Nimetön" lisaahs(nimi, pisteet) sound = PlaySound("buttonhit.wav") ClsColor bgrr, bgrg, bgrb nextlvl = taso + 1 If FileExists("lvl" + nextlvl + ".til") Then game(taso + 1, pisteet, 3) Return False EndIf DrawScreen Forever EndFunction