Page 7 of 18

Re: cbEnchanted - uudelleenkirjoitettu runtime

Posted: Thu Jun 07, 2012 10:08 am
by valscion
Konstaduck wrote:Milloin olisi seuraava versiota tulossa?
Haluan niin päästä piilottamaan sen komentorivin sieltä takaa... :lol:
Saisinkohan tänään julkaistuksi uutta... siinä on kuitenkin aina oma työnsä kun tekee julkaisupaketin enkä aina ole kotona sopivasti niitä paketteja tekemässä. Julkaisujen välillä tehdyt uudet ominaisuudet myös halutaan mielellään saada toimimaan hyvin etteivät ne jäisi pakettiin keskeneräisinä. Nämäkin osaltaan hidastavat julkaisutahtia.

Ensi versiossa onkin sitten paljon mukavaa tulossa ;). Mm. DLL-ominaisuudet, GetKey() ja GetMouse(), datalistat, CRC32 joka oikeasti toimii sekä se konsoli-ikkunan piilotus :). Sitten tietenkin näitä bugikorjauksia on. Merkistöongelmat kaikkien muiden komentojen paitsi tiedostokomentojen kanssa pitäisi olla jo historiaa (paitsi vahvistusviestin otsikossa ei vielä näy ääkköset oikein, mutta sen korjaus ei ole kauhean isolla prioriteetilla).

Release-version CBCompilerilla tehdyt exet muuten piilottavat automaattisesti nyt sen konsoli-ikkunan, mutta sen voi saada esille uudella erikoisfunktiolla. Kaikki muut versiot näyttävät sen konsoli-ikkunan siellä taustalla oletuksena, sillä se on aika kätevä väline debuggailuun.

EDIT: Tuohon KillBurnin ongelmaan liittyen, en oikein usko että varsinaisesti ongelma on siinä että käytät tyyppejä. Pitää tutkailla jossain vaiheessa, tällä hetkellä on kovat debuggailut käynnissä että NetMatchia saisi pyöriteltyä cbE:llä ;)

EDIT2: Näköjään ObjectOrderissa on bugi, tarkistelen että millainen ja teen bugiraportin kaiken kansan nähtäville...

EDIT3: ObjectOrderin logiikka on viallinen ja se kaatuilee.

Re: cbEnchanted - uudelleenkirjoitettu runtime

Posted: Thu Jun 07, 2012 3:44 pm
by MaGetzUb
Konstaduck wrote:Milloin olisi seuraava versiota tulossa?

<spoileri> Haluan niin päästä piilottamaan sen komentorivin sieltä takaa... :lol: </spoileri>
Mitä se komentorivi sinua häiritsee sielä prosessin takana? Oletko julkistamassa projektia vai? Sen nyt ei pitäisi paljoa häiritä jos testailet omia koodejasi. Mutta kyllä tuo piilotus tulee ominaisuudeksi että älä hätäile.

Re: cbEnchanted - uudelleenkirjoitettu runtime

Posted: Thu Jun 07, 2012 6:31 pm
by Nameless_One
Itselläni cbEnchanted pyörii 59-60 FPS:n lukemissa.

Koneeni käyttöjärjestelmänä on Windows XP Professional Service Pack 3, näytönohjain Radeon 9600 series ja prosessori AMD Sempron 2300+ 1,58 GHz.
FPS vain 59...
FPS vain 59...
screenini.PNG (12.52 KiB) Viewed 14492 times

Re: cbEnchanted - uudelleenkirjoitettu runtime

Posted: Thu Jun 07, 2012 6:53 pm
by Konstaduck
MaGetzUb wrote: Mitä se komentorivi sinua häiritsee sielä prosessin takana? Oletko julkistamassa projektia vai? Sen nyt ei pitäisi paljoa häiritä jos testailet omia koodejasi. Mutta kyllä tuo piilotus tulee ominaisuudeksi että älä hätäile.
No, julkista versiota olen tekemässä lähinnä kavereille päin, joten kyllä se siistimpi olisi ilman sitä komentokehotetta. Onneksi sen saa sitten seuraavassa versiossa pois :)
Nameless_One wrote:Itselläni cbEnchanted pyörii 59-60 FPS:n lukemissa.

Koneeni käyttöjärjestelmänä on Windows XP Professional Service Pack 3, näytönohjain Radeon 9600 series ja prosessori AMD Sempron 2300+ 1,58 GHz.
Erikoista... Minulla on Windows XP Home Edition Service Pack 3, ja näytönohjaimeni on Intel(R) Pentium(R) M processor 1.60GHz... Ja silti minulla on FPS siinä 900-1400, ellei jopa 1700 välillä... Ettet vain olisi unohtanut Framelimit 60:piä sinne jonnekkin...? ;)

Re: cbEnchanted - uudelleenkirjoitettu runtime

Posted: Thu Jun 07, 2012 6:57 pm
by Latexi95
Konstaduck wrote:
Nameless_One wrote:Itselläni cbEnchanted pyörii 59-60 FPS:n lukemissa.
Koneeni käyttöjärjestelmänä on Windows XP Professional Service Pack 3, näytönohjain Radeon 9600 series ja prosessori AMD Sempron 2300+ 1,58 GHz.
Erikoista... Minulla on Windows XP Home Edition Service Pack 3, ja näytönohjaimeni on Intel(R) Pentium(R) M processor 1.60GHz... Ja silti minulla on FPS siinä 900-1400, ellei jopa 1700 välillä... Ettet vain olisi unohtanut Framelimit 60:piä sinne jonnekkin...? ;)
Tai sitten näytönohjaimen asetuksista on vsync pakotettuna käyttöön.

Re: cbEnchanted - uudelleenkirjoitettu runtime

Posted: Thu Jun 07, 2012 7:23 pm
by Nameless_One
Latexi95 wrote:Tai sitten näytönohjaimen asetuksista on vsync pakotettuna käyttöön.
Kiitti avusta. Otin sen nyt pois päältä ja FPS huitelee 1700 lukemissa. :)

Re: cbEnchanted - uudelleenkirjoitettu runtime

Posted: Thu Jun 07, 2012 10:12 pm
by valscion
Kävikin niin että elämä tuli eteen enkä kerkiä tänään käydä koneella kotona. Uusi julkaisu siis jää tulevaisuuteen

Re: cbEnchanted - uudelleenkirjoitettu runtime

Posted: Thu Jun 07, 2012 11:03 pm
by Konstaduck
Joo, huomasin Setwindowsissa bugin. Tai oikeastaan kaksikin. Kuvat selventävät varmasti asiaa.
EDIT:

JA tuo toinen bugihan aiheutuu, jos raahataan ikkunaa

Setwindow - jokin mättää.png
Eli tässä virheilmoitus ei veny teksti mittoihin jättäen tekstistä osan ulkopuolelle :o
Setwindow - huooh!.png
Tässä taas ruutu ei päivity, aiheuttaen ruman jäljen ):

Re: cbEnchanted - uudelleenkirjoitettu runtime

Posted: Fri Jun 08, 2012 9:54 am
by valscion
Konstaduck wrote:Joo, huomasin Setwindowsissa bugin. Tai oikeastaan kaksikin. Kuvat selventävät varmasti asiaa.
Jepjep. Se eka virhe johtuu siitä että vahvistusviesti katkeaa ääkkösten kohdalla, koska ääkköset eivät ole vielä tuossa tuettuina. Toinen virhe johtuu vaan siitä että koneesi on huono. Emme voi tehdä asialle mitään. Ohjelman suoritus katkeaa tuossa virheviestin kohdalla emmekä voi koodissa ruutua päivittää sen aikana, järjestelmäsi pitäisi pitää huolen siitä ettei ikkunalle käy juuri niinkuin sinun kohdallasi käy.

Re: cbEnchanted - uudelleenkirjoitettu runtime

Posted: Fri Jun 08, 2012 11:39 am
by Konstaduck
VesQ wrote:Toinen virhe johtuu vaan siitä että koneesi on huono. Emme voi tehdä asialle mitään. Ohjelman suoritus katkeaa tuossa virheviestin kohdalla emmekä voi koodissa ruutua päivittää sen aikana, järjestelmäsi pitäisi pitää huolen siitä ettei ikkunalle käy juuri niinkuin sinun kohdallasi käy.
Miten tuo sitten toimi täydellisesti ennen cbE:tä, ja ihan yhtä huono se oli silloinkin...?

Re: cbEnchanted - uudelleenkirjoitettu runtime

Posted: Fri Jun 08, 2012 12:05 pm
by valscion
Konstaduck wrote:Miten tuo sitten toimi täydellisesti ennen cbE:tä, ja ihan yhtä huono se oli silloinkin...?
Koska CB käyttää ruudun piirtoon wanhaa DirectX:ää ja cbE käyttää OpenGL:ää. CB:n ja cbE:n kaikki grafiikkaominaisuudet muutenkin eroavat toisistaan sisäisesti sen verran että eroja on turha edes alkaa listaamaan.

Re: cbEnchanted - uudelleenkirjoitettu runtime

Posted: Fri Jun 08, 2012 2:14 pm
by koodaaja
En ole tätä kokeillut, mutta eikö MessageBoxia voisi kutsua omassa threadissaan ja jatkaa samalla ainakin ohjelman grafiikanpiirtolooppia?

Re: cbEnchanted - uudelleenkirjoitettu runtime

Posted: Fri Jun 08, 2012 2:36 pm
by axu
koodaaja wrote:En ole tätä kokeillut, mutta eikö MessageBoxia voisi kutsua omassa threadissaan ja jatkaa samalla ainakin ohjelman grafiikanpiirtolooppia?
Josta tuli mieleen, messageboxi olisi aika kiva lisä *menee lisäämään issue trackeriin*

Re: cbEnchanted - uudelleenkirjoitettu runtime

Posted: Fri Jun 08, 2012 4:17 pm
by valscion
koodaaja wrote:En ole tätä kokeillut, mutta eikö MessageBoxia voisi kutsua omassa threadissaan ja jatkaa samalla ainakin ohjelman grafiikanpiirtolooppia?
Kaipa sitä voisi mutta mielestäni allegron pitäisi hoitaa se ihan itsekin. En ole muilla koneilla törmännyt tuohon ruudun bugisuuteen.

Re: cbEnchanted - uudelleenkirjoitettu runtime

Posted: Fri Jun 08, 2012 4:45 pm
by axu
VesQ wrote:Kaipa sitä voisi mutta mielestäni allegron pitäisi hoitaa se ihan itsekin. En ole muilla koneilla törmännyt tuohon ruudun bugisuuteen.
Luullakseni Win7 (ja ehkä myös Vista) osaavat välttää tämän.

Re: cbEnchanted - uudelleenkirjoitettu runtime

Posted: Fri Jun 08, 2012 9:27 pm
by esa94
axu wrote:
VesQ wrote:Kaipa sitä voisi mutta mielestäni allegron pitäisi hoitaa se ihan itsekin. En ole muilla koneilla törmännyt tuohon ruudun bugisuuteen.
Luullakseni Win7 (ja ehkä myös Vista) osaavat välttää tämän.
Kompositio korjaa tuon, juu.

Re: cbEnchanted - uudelleenkirjoitettu runtime

Posted: Fri Jun 08, 2012 11:28 pm
by valscion
Versio 0.2.0 julkaistu!

Lataa alta itsellesi sopivin paketti: cbEnchantedin Windows-versio vaatii, että Microsoft Visual C++ 2010 Redistributable Package (x86) on asennettuna koneella.
Windows-paketti sisältää kaksi eri 32-bittistä julkaisuversiota cbEnchantedista:
  1. testable kansiossa on exet, joiden avulla voit testata jo käännettyjä CB-exe tiedostoja. Käytä komentoriviä ja kutsu kyseistä exeä niin että ensimmäisenä parametrina on testattavan ohjelman exen tiedostopolku TAI tiputa testattava exe cbEnchantedin exe-tiedostoon. Tiedostopolussa ei saa olla välilyöntejä.
  2. compiler kansiossa on muokatut versiot CBCompiler.exe-tiedostosta, joissa on korvattu wanhan CB:n runtimet cbEnchantedilla. Kun vaihdat tämän CoolBasicin asennuskansiosta löytyvän IDE\CBCompiler.exe tiedoston paikalle, saat heti käännettyä cbEnchanted-ohjelmia.
Lukekaa cbEnchantedin GitHub-wikiä, josta löytyy yleistä tietoa projektista. Katsokaa etenkin sivu Erikoisuuksia ja eroavaisuuksia.

Muutokset edelliseen versioon: Tämän julkaisun tunnetut bugit

Re: cbEnchanted - uudelleenkirjoitettu runtime

Posted: Sun Jun 10, 2012 5:19 pm
by Kumiankka
GetKey tuntuu bugaavan melkolailla raskaasti. Manuaalin GetKey():n kohdalta löytyvällä esimerkilläkin kokeillessa se jätti todella usein huomioimatta näppäimien painalluksia.

Re: cbEnchanted - uudelleenkirjoitettu runtime

Posted: Sun Jun 10, 2012 6:51 pm
by Latexi95
Kumiankka wrote:GetKey tuntuu bugaavan melkolailla raskaasti. Manuaalin GetKey():n kohdalta löytyvällä esimerkilläkin kokeillessa se jätti todella usein huomioimatta näppäimien painalluksia.
Joo. Se ei vielä vaikuta toimivan aivan oikein. Se kaipaa vielä hieman laittoa samoin kuin GetMousekin.

Re: cbEnchanted - uudelleenkirjoitettu runtime

Posted: Mon Jun 11, 2012 7:24 pm
by axu
Tulipa taas päivä hukattua... mutta tervetuloa tulevaisuuteen! (tai ehkä nykyaikaan :D)

Code: Select all

Const SW = 800
Const SH = 600
Const SpyOverlayQ = 32      //Kiikarikuvan laatu, suurempi huonompi (eroa ei juurikaan huomaa, kun Smooth2D on päällä)
Const NightOverlayQ = 2     //Yökiikarikuvan laatu, tässä eron huomaa selvemmin

Const MaxZoom = 2           //Tämä määrää, kuinka kauaksi voidaan zoomata (2 = ruudulla voi näkyä 2x tavalliseen nähden)
Const NormZoom = 1          //Kuinka zoomattu ruutu on tavallisesti
Const SpyZoom = 2           //Kuinka zoomattu ruutu on kiikareilla

Const NormLookForward = 100 //Kuinka kauaksi eteenpäin katsotaan tavallisesti
Const SpyLookForward = 500  //Kuinka kauaksi eteenpäin katsotaan kiikareilla

Const DayLenght = 90000     //Päivän pituus millisekunneissa (90000 = puolitoista minuuttia)

Smooth2D ON
SCREEN SW, SH
SetWindow "cbe Tech Demo by aXu"
Print "Screen size: " + SW + "x" + SH


Font = LoadFont("Arial", 20, True)
SetFont Font

Map = LoadMap("Media/cdm2.til", "Media/tileset.bmp")
PlayObject Map, 0, 0, 0.5
ObjectPickable Map, ON

Guy = LoadObject("Media/soldier.bmp")
TurnObject Guy, 90
SetupCollision Guy, map, 2, 4, 2

GuyImg = LoadImage("Media/soldier.bmp")

Crosshair = LoadImage("Media/target.bmp")

DefaultMask OFF
sx = RoundUp(Float(SW) / SpyOverlayQ)
sy = RoundUp(Float(SH) / SpyOverlayQ)
SpyOverlay = MakeImage(sx, sy)

Print "SpyOverlay size: " + sx + "x" + sy
DrawToImage SpyOverLay
	cbeClsColor(0, 0, 0, 0)
	Cls
	For x = 0 To SW - 1
		For y = 0 To SH - 1
			dst1# = Distance(x, y, SW / 2 - 150 * (SW / 800.0), SH / 2)
			dst2# = Distance(x, y, SW / 2 + 150 * (SW / 800.0), SH / 2)
			gamma = Min(255, Min(dst1, dst2) / (SW / 800.0))
			cbeColor(255 - gamma, 255 - gamma, 255 - gamma, gamma)
			Dot x / SpyOverlayQ, y / SpyOverlayQ
			
			y = Min(SH - 1, y + SpyOverlayQ - 1)
		Next y
		x = Min(SW - 1, x + SpyOverlayQ - 1)
	Next x
DrawToScreen

sx = RoundUp(Float(SW) / NightOverlayQ)
sy = RoundUp(Float(SH) / NightOverlayQ)
NightOverlay = MakeImage(sx, sy)
Print "NightOverlay size: " + sx + "x" + sy
DrawToImage NightOverlay
	cbeClsColor(0, 0, 0, 0)
	Cls
	For x = 0 To SW - 1
		For y = 0 To SH - 1
			gamma = y Mod 10
			ran = Rand(70)
			cbeColor(gamma * 10 + ran, gamma * 25 + ran, gamma * 10 + ran, 40 + gamma * 10 + ran / 2)
			Dot x / NightOverlayQ, y / NightOverlayQ
			
			y = Min(SH - 1, y + NightOverlayQ - 1)
		Next y
		x = Min(SW - 1, x + NightOverlayQ - 1)
	Next x
DrawToScreen


ScreenSize = Sqrt(SW^2 + SH^2) * MaxZoom
Buffer = MakeImage(ScreenSize, ScreenSize)
Print "Image buffer size: " + ScreenSize + "x" + ScreenSize + " (maximum scaling: " + MaxZoom + ")"

Dim NewCamX#, NewCamY#, NewCamA#, NewCamZ#, SpyingOpacity#
Global Zoom#
Zoom = 0.5
DrawRotated = True

CurrentFrame = Timer()
Repeat
	Color 64, 64, 64
	cbeColor(0, 0, 0, 0)
	CenterText SW/2, SH/2, "Use cbEnchanted to see this demo properly"
	Repeat
		//Pelimekaniikka:
		If KeyHit(cbKeyZ) Then OldAngle# = ObjectAngle(Guy)
		If KeyDown(cbKeyZ) Then //Kiikarit
			vx# = Max(-150, Min(150, vx + (KeyDown(cbKeyRight) - KeyDown(cbKeyLeft)) * 2))
			vy# = Max(-150, Min(150, vy + (KeyDown(cbKeyUp) - KeyDown(cbKeyDown)) * 2))
			CamOffSetX = Cos(CameraAngle()) * vx - Sin(CameraAngle()) * vy
			CamOffSetY = Sin(CameraAngle()) * vx + Cos(CameraAngle()) * vy
			
			RotateObject Guy, GetAngle(ObjectX(Guy), -ObjectY(Guy), CameraX(), -CameraY())
			ObjectPick Guy
			If PickedObject() Then
				TargetX = WToSX(PickedX(), PickedY())
				TargetY = WToSY(PickedX(), PickedY())
				ShowLaser = True
			EndIf
			
			SpyingOpacity = CurveValue(255, SpyingOpacity, 30)
			
			NewCamX = ObjectX(Guy) + Cos(OldAngle) * SpyLookForward + CamOffSetX
			NewCamY = ObjectY(Guy) + Sin(OldAngle) * SpyLookForward + CamOffSetY
			NewCamA = OldAngle - 90
			NewCamZ = SpyZoom
		ElseIf KeyDown(cbKeyX) //Uloszoomaaminen
			vx# = (KeyDown(cbKeyRight) - KeyDown(cbKeyLeft))
			vy# = (KeyDown(cbKeyUp) - KeyDown(cbKeyDown))
			an# = GetAngle(0, 0, vx, -vy)
			sp# = Min(0.4, Distance(0, 0, vx, vy))
			TranslateObject guy, Cos(an) * sp, Sin(an) * sp
			
			ObjectPick Guy
			If PickedObject() Then
				TargetX = WToSX(PickedX(), PickedY())
				TargetY = WToSY(PickedX(), PickedY())
				ShowLaser = False
			EndIf
			
			SpyingOpacity = CurveValue(0, SpyingOpacity, 30)
			
			NewCamX = ObjectX(Guy)
			NewCamY = ObjectY(Guy)
			NewCamA = 0
			NewCamZ = 1.0 / MaxZoom
		Else //Tavallinen
			vx# = 0
			vy# = 0
			
			TurnObject guy, (KeyDown(cbKeyLeft) - KeyDown(cbKeyRight)) * 1
			MoveObject guy, KeyDown(cbKeyUp) - KeyDown(cbKeyDown) * 0.7
			
			ObjectPick Guy
			If PickedObject() Then
				TargetX = WToSX(PickedX(), PickedY())
				TargetY = WToSY(PickedX(), PickedY())
				ShowLaser = False
			EndIf
			
			SpyingOpacity = CurveValue(0, SpyingOpacity, 30)
			
			NewCamX = ObjectX(Guy) + Cos(ObjectAngle(Guy)) * NormLookForward
			NewCamY = ObjectY(Guy) + Sin(ObjectAngle(Guy)) * NormLookForward
			NewCamA = ObjectAngle(Guy) - 90
			NewCamZ = NormZoom
		EndIf
		
		
		PositionCamera CurveValue(NewCamX, CameraX(), 40), CurveValue(NewCamY, CameraY(), 40)
		RotateCamera CurveAngle2(NewCamA, CameraAngle(), 20)
		Zoom = CurveValue(NewCamZ, Zoom, 50)
		
		CurrentFrame = CurrentFrame + 5
	Until CurrentFrame > Timer()
	
	TimeOfDay# = Float((Timer() + DayLenght / 2) Mod DayLenght) / DayLenght * 24
	
	DrawToImage Buffer
		ClsColor 0, 0, 0
		Cls
		GhostObject Guy, 0
		DrawGame
		cbeColor(255, 255, 255, 255)
		cbeDrawTintedScaledRotatedImage(GuyImg, ScreenSize/2 + ObjectX(Guy) - CameraX(), ScreenSize/2 + CameraY() - ObjectY(Guy), 1, 1, -ObjectAngle(Guy))
	DrawToScreen
	
	
	//Taustavalaistus, riippuu vuorokaudenajasta:
	AmbiR = 255
	AmbiG = 255
	AmbiB = 255
	AmbiA = 255
	//Yön pimeys (ilta 6 - aamu 6)
	If Abs(TimeOfDay - 12) > 6 Then
		tmp = 100 + Cos((12 - Abs(TimeOfDay - 12)) * 30) * 100
		AmbiR = AmbiR - tmp
		AmbiG = AmbiG - tmp
		AmbiB = AmbiB - tmp / 1.5
	EndIf
	
	//Illankajo (ilta 5 - ilta 11)
	If Abs(TimeOfDay - 20) < 3 Then
		tmp = 50 + Cos(Abs(TimeOfDay - 20) * 60) * 50
		AmbiR = AmbiR + tmp / 4
		AmbiG = AmbiG - tmp / 2
		AmbiB = AmbiB - tmp
	EndIf
	
	//Aamuhämärä (aamu 6 - aamu 12)
	If Abs(TimeOfDay - 9) < 3 Then
		tmp = 20 + Cos(Abs(TimeOfDay - 9) * 60) * 20
		AmbiR = AmbiR - tmp
		AmbiG = AmbiG - tmp
		AmbiB = AmbiB - tmp
		AmbiA = AmbiA - tmp
	EndIf
	
	NightLook# = CurveValue((SpyingOpacity > 200) * Abs(TimeOfDay - 12) > 9, NightLook, 20)
	AmbiG = AmbiG + NightLook * 100
	AmbiA = AmbiA - NightLook * 100
	
	//Piirretään maailma värjättynä ambientilla valolla (läpinäkyvyys aiheuttaa valkoista, tausta on valkoinen
	cbeColor(AmbiR, AmbiG, AmbiB, AmbiA)
	cbeDrawTintedScaledRotatedImage(Buffer, SW/2, SH/2, Zoom, Zoom, CameraAngle())
	
	//Laser
	cbeColor(255, 0, 0, 32)
	FatLine(WToSX(ObjectX(Guy), ObjectY(Guy)), WToSY(ObjectX(Guy), ObjectY(Guy)), TargetX, TargetY, Zoom + .5)
	//Tähtäin
	cbeColor(255, 255, 255, 192)
	cbeDrawTintedScaledRotatedImage(Crosshair, TargetX, TargetY, 1, 1, Timer() / 10)
	
	//Yökiikarin raidat
	cbeColor(0, NightLook * 255, 0, SpyingOpacity * NightLook)
	cbeDrawTintedScaledRotatedImage(NightOverlay, SW/2, SH/2, NightOverlayQ)
	//Kiikari
	cbeColor(0, NightLook * 255, 0, SpyingOpacity)
	cbeDrawTintedScaledRotatedImage(SpyOverlay, SW/2, SH/2, SpyOverlayQ)
	
	
	
	cbeColor(255, 255, 255, 192)
	Text 0, 0, "Use arrows to move around, Z to spy, X to zoom out."
	Text 0, 20, "FPS: " + FPS() + " (max 200)"
	Text 0, 40, "Clock: " + RoundDown(TimeOfDay) + ":" + RoundDown(TimeOfDay Mod 1 * 60)
	ClsColor 255, 255, 255
	Wait CurrentFrame - Timer()
	DrawScreen
Forever

Function WToSX(X#, Y#)
	X = (X - CameraX()) * Zoom
	Y =-(Y - CameraY()) * Zoom
	A# = GetAngle(0, 0, X, Y) - CameraAngle()
	D# = Distance(0, 0, X, Y)
	
	Return Cos(A) * D + SW/2
EndFunction

Function WToSY(X#, Y#)
	X = (X - CameraX()) * Zoom
	Y =-(Y - CameraY()) * Zoom
	A# = GetAngle(0, 0, X, Y) - CameraAngle()
	D# = Distance(0, 0, X, Y)
	
	Return -Sin(A) * D + SH/2
EndFunction

Function CurveAngle2(newA#, oldA#, smooth#)
	newA = WrapAngle(newA + 180)
	ADiff# = oldA - newA + 180
	While ADiff > 180
		ADiff - 360
	Wend
	While ADiff < -180
		ADiff + 360
	Wend
	Return (oldA - ADiff / smooth)
EndFunction

Function FatLine(X1#, Y1#, X2#, Y2#, Thickness#)
	For x = -RoundDown(Thickness / 2) To RoundUp(Thickness / 2)
		For y = -RoundDown(Thickness / 2) To RoundUp(Thickness / 2)
			Line X1 + x, Y1 + y, X2 + x, Y2 + y
		Next y
	Next x
EndFunction


Function cbeColor(r, g, b, a)
    group = 1
    funcId = 2
EndFunction

Function cbeClsColor(r, g, b, a)
    group = 1
    funcId = 3
EndFunction

Function cbeDrawTintedScaledRotatedImage(img, toX#, toY#, scaleX# = 1, scaleY# = 0, angle# = 0)
	If scaleY = 0 Then scaleY = scaleX
	cbeDrawTintedScaledRotatedImageBox(img, 0, 0, ImageWidth(img), ImageHeight(img), toX, toY, scaleX, scaleY, angle)
EndFunction

Function cbeDrawTintedScaledRotatedImageBox(img, startX As Float, startY As Float, width As Float, height As Float, toX As Float, toY As Float, scaleX As Float, scaleY As Float, angle As Float)
    group = 1
    funcId = 6
End Function
EDIT:

Pieni muutos, pyörii sulavammin. Niin ja tässä tosiaan löytyy myös yökiikarit, kun painaa Z:aa yön aikana.