HLVSPL/game.CB
2022-07-23 10:58:34 +03:00

338 lines
8.8 KiB
Text

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