Liquid() - cbruudun aaltoilua ja väreilyä

Oletko tehnyt jotain, mistä muut voisivat hyötyä. Postita vinkit tänne.
Post Reply
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Liquid() - cbruudun aaltoilua ja väreilyä

Post by MaGetzUb »

Eli niin, tein tämmöisen vesi/tuli tehosteen Ruuttu:n fluidize tehosteesta inspiroituna. :) Löytyy myös CB Repositorystä
Tällä saa todella tehokasta jälkeä aikaan, riippuu vain tietokoneesta.. :o

Code: Select all

//effect by: MaGetzUb 2011

SCREEN 640, 480
SCREEN 640, 480, 32, 2

Const LIQ_WATER = 0
Const LIQ_FIRE = 1
Const LIQ_HORWAVE = 2
Const LIQ_VERWAVE = 3
Const LIQ_HORRIPPLE = 4
Const LIQ_VERRIPPLE = 5 

Global SW
Global SH
SW = ScreenWidth()
SH = ScreenHeight()

Global Liq_Quality      : Liq_Quality = 5 //(paras laatu on 1 [koska 1 pikseli per aalto])
Global Liq_Freq          : Liq_Freq = 20
Global Liq_Ang          : Liq_Ang = 0
Global Liq_AngSpeed     : Liq_AngSpeed = 2

Dim Liq(1) As Integer 
Dim EFFNAMES(5) As String 
EFFNAMES(LIQ_WATER) = "Vesi"
EFFNAMES(LIQ_FIRE) = "Lämpöväreily"
EFFNAMES(LIQ_HORWAVE) = "Horisontaaliset aallot"
EFFNAMES(LIQ_VERWAVE) = "Vertikaaliset aallot"
EFFNAMES(LIQ_HORRIPPLE) = "Horisontaalinen väreily"
EFFNAMES(LIQ_VERRIPPLE) = "Vertikaalinen väreily"

Liq(0) = MakeImage(SW, SH)
Liq(1) = CloneImage(Liq(0))


kartta = LoadMap("Media\cdm2.til","Media\tileset.bmp")
PlayObject kartta,0,0,1

ukko = LoadObject ("Media\guy.bmp",72)

SetupCollision ukko, kartta, 1, 4, 2

Freq = 2
LiquidSettings(1, Freq, 10)
Repeat
    ClearText
    AddText "FPS: "+FPS()
    AddText EFFNAMES(efekti)+" käytössä."
    AddText "Säädä aallon taajuutta hiiren rullasta."
    AddText "Säädä laatua näppäimillä W/S"
    AddText "Vaihda efektiä Enterillä"
    AddText "Nykyinen taajuus: "+Freq
    AddText "Nykyinen laatu: "+koko+"px"
    If LeftKey() Then TurnObject ukko,5
    If RightKey() Then TurnObject ukko,-5
    If UpKey() Then MoveObject ukko,2
    If DownKey() Then MoveObject ukko,-2

    UpdateGame

    CloneCameraPosition ukko

    DrawGame 
    
    Freq = Freq + MouseMoveZ()
    koko = koko + KeyHit(cbkeyW) - KeyHit(cbkeys)
    If koko < 1 Then koko = 1 
    LiquidSettings(koko, Freq, 10)
    
    efekti = efekti + KeyHit(28)
    If efekti > 5 Then efekti = 0 
    Liquid(efekti, True)

    Color cbwhite
    
     
    DrawScreen True
Forever
//------------------------------------------------//
//FUNKTIOT
//------------------------------------------------//

Function LiquidSettings(quality, Freq, angspeed)
    Liq_Quality = quality
    Liq_Freq = Freq
    Liq_AngSpeed = angspeed  
EndFunction 


Function Liquid(tyyli = 0, mask = 1)
    pixrgb = getRGB(3) + getRGB(1) Shl 16 + getRGB(2) Shl 8
    For i = 0 To 1
        DrawToImage Liq(i)
        Cls 
        DrawToScreen 
    Next i
    
    Select tyyli
    Case 0
    
        Liq_Ang = Liq_Ang + Liq_AngSpeed
        
        For x# = 0 To SW / Liq_Quality
            CopyBox Int(x) * Liq_Quality, 0, Liq_Quality, SH, Int(x)*Liq_Quality, Int(Sin(x+Liq_Ang)*Liq_Freq), SCREEN(), Image(Liq(0))
        Next x#
    
        For y# = 0 To SH / Liq_Quality
            CopyBox 0, Int(y) * Liq_Quality, SW, Liq_Quality,  Int(Sin(y+Liq_Ang)*Liq_Freq), Int(y)*Liq_Quality , Image(Liq(0)), Image(Liq(1))
        Next y#
        
    Case 1
    
        For x# = 0 To SW / Liq_Quality
            CopyBox Int(x) * Liq_Quality, 0, Liq_Quality, SH, Int(x)*Liq_Quality, Int(Rnd(-Liq_Freq, Liq_Freq)), SCREEN(), Image(Liq(0))
        Next x#
    
        For y# = 0 To SH / Liq_Quality
            CopyBox 0, Int(y) * Liq_Quality, SW, Liq_Quality,  Int(Rnd(-Liq_Freq, Liq_Freq)), Int(y)*Liq_Quality , Image(Liq(0)), Image(Liq(1))
        Next y#    
    
    Case 2

        Liq_Ang = Liq_Ang + Liq_AngSpeed
        
        For x# = 0 To SW / Liq_Quality
            CopyBox Int(x) * Liq_Quality, 0, Liq_Quality, SH, Int(x)*Liq_Quality, Int(Sin(x+Liq_Ang)*Liq_Freq), SCREEN(), Image(Liq(1))
        Next x#    
    
    Case 3
    
        Liq_Ang = Liq_Ang + Liq_AngSpeed
        
        For y# = 0 To SH / Liq_Quality
            CopyBox 0, Int(y) * Liq_Quality, SW, Liq_Quality,  Int(Sin(y+Liq_Ang)*Liq_Freq), Int(y)*Liq_Quality , SCREEN() , Image(Liq(1))
        Next y#
        
    Case 4
    
        For x# = 0 To SW / Liq_Quality
            CopyBox Int(x) * Liq_Quality, 0, Liq_Quality, SH, Int(x)*Liq_Quality, Int(Rnd(-Liq_Freq, Liq_Freq)), SCREEN(), Image(Liq(1))
        Next x#

    Case 5

        For y# = 0 To SH / Liq_Quality
            CopyBox 0, Int(y) * Liq_Quality, SW, Liq_Quality,  Int(Rnd(-Liq_Freq, Liq_Freq)), Int(y)*Liq_Quality , SCREEN(), Image(Liq(1))
        Next y#      
        
    EndSelect 

    If mask Then 
        Color cbblack
        Box 0, 0, SW, SH
    EndIf 
    
    DrawImage Liq(1), 0, 0

    Color 0, 0, pixrgb
    
EndFunction
Image
EDIT:

Koodia muokattu, tehoisteita tein lisää. :)

EDIT:

2. Mielelläni ottaisin FPS nopeuksia sekä kommentteja vastaan. :)

EDIT:

3. Koodia olen tässä päivitellyt typerästi kokoajan uudestaan ja uudestaan. -.-

EDIT:

4. Noniin nyt on vaaka että pystyttäis väreilytkin mukana! :)

Last edited by MaGetzUb on Thu Apr 14, 2011 7:35 pm, edited 2 times in total.
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.
User avatar
Ruuttu
Devoted Member
Posts: 688
Joined: Thu Aug 30, 2007 5:11 pm
Location: Finland, Sipoo

Re: Liquid() - Vesitehoste

Post by Ruuttu »

Suorituskyky tosiaan kasvaa melkoisesti kun kopioidaan vähän reilumpia slaisseja kerralla. Hieno oivallus. En usko että kenelläkään on suorituskykyongelmia enää tässä versiossa.
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: Liquid() - Vesitehoste

Post by MaGetzUb »

Joo, elikkä kun on vierekkäiset silmukat niin nopeus kasvaa. Mutta huomasin jännän jutun uusimmassa päivitetyssä koodissa ei efekti vaihdu entteristä vaikka siihen on edellytykset..
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.
User avatar
Ruuttu
Devoted Member
Posts: 688
Joined: Thu Aug 30, 2007 5:11 pm
Location: Finland, Sipoo

Re: Liquid() - Vesitehoste

Post by Ruuttu »

Toimii:

Code: Select all

Function Liquid(tyyli=0, mask=1)
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: Liquid() - Vesitehoste

Post by MaGetzUb »

Ohoh kiitos, hajamielisyys taas iski.. (Ei saisi käyttää vakioita funktioiden oletusarvojen kanssa) -.- Onko mitään efektiehdotuksia?
EDIT:

Ja niille jotka nyt haluavat esittää jälkineroa, että miksei käytetä copyboxeja ilman välikuvia, heille sanoisin että testattu on, toimihan se mutta ei se ole niin hieno kun tämä nykyinen. ;P

Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.
User avatar
MetalRain
Active Member
Posts: 188
Joined: Sun Mar 21, 2010 11:17 am
Location: Espoo

Re: Liquid() - cbruudun aaltoilua ja väreilyä

Post by MetalRain »

Mitä tähän nyt enää kaipaisi niin mahdollisuutta käyttää efektiä vain tietyllä alueella/tietyssä kuvassa, kenties ihan laatikko tai sitten maskikuvan avulla minkä tahansa muotoinen alue. Näitä kun vielä saisi helposti kiinnitettyä pelimaailmaan niin aijai, meillähän taitaa olla nättejä jokia ja laavavirtoja.

Tässä huono esimerkki, mutta ymmärtänet idean.

Code: Select all

//effect by: MaGetzUb 2011

SCREEN 640, 480
SCREEN 640, 480, 32, 2

Const LIQ_WATER = 0
Const LIQ_FIRE = 1
Const LIQ_HORWAVE = 2
Const LIQ_VERWAVE = 3
Const LIQ_HORRIPPLE = 4
Const LIQ_VERRIPPLE = 5 

Global SW
Global SH
SW = ScreenWidth()
SH = ScreenHeight()

Global Liq_Quality      : Liq_Quality = 5 //(paras laatu on 1 [koska 1 pikseli per aalto])
Global Liq_Freq          : Liq_Freq = 20
Global Liq_Ang          : Liq_Ang = 0
Global Liq_AngSpeed     : Liq_AngSpeed = 2

Dim Liq(2) As Integer 
Dim EFFNAMES(5) As String 
EFFNAMES(LIQ_WATER) = "Vesi"
EFFNAMES(LIQ_FIRE) = "Lämpöväreily"
EFFNAMES(LIQ_HORWAVE) = "Horisontaaliset aallot"
EFFNAMES(LIQ_VERWAVE) = "Vertikaaliset aallot"
EFFNAMES(LIQ_HORRIPPLE) = "Horisontaalinen väreily"
EFFNAMES(LIQ_VERRIPPLE) = "Vertikaalinen väreily"

Liq(0) = MakeImage(SW, SH)
Liq(1) = CloneImage(Liq(0))
Liq(2) = MakeImage(SW, SH)

MaskImage liq(2),255,0,255

DrawToImage liq(2)
    Color 0,0,0
    Box 0,0,sw,sh,1
    Color 255,0,255
    Circle 0,0,sh,1
DrawToScreen 


kartta = LoadMap("Media\cdm2.til","Media\tileset.bmp")
PlayObject kartta,0,0,1

ukko = LoadObject ("Media\guy.bmp",72)

SetupCollision ukko, kartta, 1, 4, 2

Freq = 2
LiquidSettings(1, Freq, 10)
Repeat
    ClearText
    AddText "FPS: "+FPS()
    AddText EFFNAMES(efekti)+" käytössä."
    AddText "Säädä aallon taajuutta hiiren rullasta."
    AddText "Säädä laatua näppäimillä W/S"
    AddText "Vaihda efektiä Enterillä"
    AddText "Nykyinen taajuus: "+Freq
    AddText "Nykyinen laatu: "+koko+"px"
    If LeftKey() Then TurnObject ukko,5
    If RightKey() Then TurnObject ukko,-5
    If UpKey() Then MoveObject ukko,2
    If DownKey() Then MoveObject ukko,-2

    UpdateGame

    CloneCameraPosition ukko

    DrawGame 
    
    Freq = Freq + MouseMoveZ()
    koko = koko + KeyHit(cbkeyW) - KeyHit(cbkeys)
    If koko < 1 Then koko = 1 
    LiquidSettings(koko, Freq, 10)
    
    efekti = efekti + KeyHit(28)
    If efekti > 5 Then efekti = 0 
    Liquid(efekti, True)

    Color cbwhite
    
     
    DrawScreen True
Forever
//------------------------------------------------//
//FUNKTIOT
//------------------------------------------------//

Function LiquidSettings(quality, Freq, angspeed)
    Liq_Quality = quality
    Liq_Freq = Freq
    Liq_AngSpeed = angspeed  
EndFunction 


Function Liquid(tyyli = 0, mask = 1)
    pixrgb = getRGB(3) + getRGB(1) Shl 16 + getRGB(2) Shl 8
    For i = 0 To 1
        DrawToImage Liq(i)
        Cls 
        DrawToScreen 
    Next i
    
    Select tyyli
    Case 0
    
        Liq_Ang = Liq_Ang + Liq_AngSpeed
        
        For x# = 0 To SW / Liq_Quality
            CopyBox Int(x) * Liq_Quality, 0, Liq_Quality, SH, Int(x)*Liq_Quality, Int(Sin(x+Liq_Ang)*Liq_Freq), SCREEN(), Image(Liq(0))
        Next x#
    
        For y# = 0 To SH / Liq_Quality
            CopyBox 0, Int(y) * Liq_Quality, SW, Liq_Quality,  Int(Sin(y+Liq_Ang)*Liq_Freq), Int(y)*Liq_Quality , Image(Liq(0)), Image(Liq(1))
        Next y#
        
    Case 1
    
        For x# = 0 To SW / Liq_Quality
            CopyBox Int(x) * Liq_Quality, 0, Liq_Quality, SH, Int(x)*Liq_Quality, Int(Rnd(-Liq_Freq, Liq_Freq)), SCREEN(), Image(Liq(0))
        Next x#
    
        For y# = 0 To SH / Liq_Quality
            CopyBox 0, Int(y) * Liq_Quality, SW, Liq_Quality,  Int(Rnd(-Liq_Freq, Liq_Freq)), Int(y)*Liq_Quality , Image(Liq(0)), Image(Liq(1))
        Next y#    
    
    Case 2

        Liq_Ang = Liq_Ang + Liq_AngSpeed
        
        For x# = 0 To SW / Liq_Quality
            CopyBox Int(x) * Liq_Quality, 0, Liq_Quality, SH, Int(x)*Liq_Quality, Int(Sin(x+Liq_Ang)*Liq_Freq), SCREEN(), Image(Liq(1))
        Next x#    
    
    Case 3
    
        Liq_Ang = Liq_Ang + Liq_AngSpeed
        
        For y# = 0 To SH / Liq_Quality
            CopyBox 0, Int(y) * Liq_Quality, SW, Liq_Quality,  Int(Sin(y+Liq_Ang)*Liq_Freq), Int(y)*Liq_Quality , SCREEN() , Image(Liq(1))
        Next y#
        
    Case 4
    
        For x# = 0 To SW / Liq_Quality
            CopyBox Int(x) * Liq_Quality, 0, Liq_Quality, SH, Int(x)*Liq_Quality, Int(Rnd(-Liq_Freq, Liq_Freq)), SCREEN(), Image(Liq(1))
        Next x#

    Case 5

        For y# = 0 To SH / Liq_Quality
            CopyBox 0, Int(y) * Liq_Quality, SW, Liq_Quality,  Int(Rnd(-Liq_Freq, Liq_Freq)), Int(y)*Liq_Quality , SCREEN(), Image(Liq(1))
        Next y#      
        
    EndSelect 

    If mask Then 
        DrawToImage Liq(1)
        DrawImage liq(2),0,0
        DrawToScreen 
    EndIf 
    
    DrawImage Liq(1), 0, 0

    Color 0, 0, pixrgb
    
EndFunction
EDIT: naputtelija, lähinnä vain se ettei ollut kovin kekseliäs tai käyttänyt hyvin ominaisuutta hyväkseen.
Last edited by MetalRain on Thu Apr 14, 2011 10:08 pm, edited 1 time in total.
naputtelija
Devoted Member
Posts: 718
Joined: Wed Nov 03, 2010 7:56 pm
Location: Joku piste pohjoisessa.

Re: Liquid() - cbruudun aaltoilua ja väreilyä

Post by naputtelija »

MetalRain wrote:Mitä tähän nyt enää kaipaisi niin mahdollisuutta käyttää efektiä vain tietyllä alueella/tietyssä kuvassa, kenties ihan laatikko tai sitten maskikuvan avulla minkä tahansa muotoinen alue. Näitä kun vielä saisi helposti kiinnitettyä pelimaailmaan niin aijai, meillähän taitaa olla nättejä jokia ja laavavirtoja.

Tässä huono esimerkki, mutta ymmärtänet idean.

Code: Select all

//effect by: MaGetzUb 2011

SCREEN 640, 480
SCREEN 640, 480, 32, 2

Const LIQ_WATER = 0
Const LIQ_FIRE = 1
Const LIQ_HORWAVE = 2
Const LIQ_VERWAVE = 3
Const LIQ_HORRIPPLE = 4
Const LIQ_VERRIPPLE = 5 

Global SW
Global SH
SW = ScreenWidth()
SH = ScreenHeight()

Global Liq_Quality      : Liq_Quality = 5 //(paras laatu on 1 [koska 1 pikseli per aalto])
Global Liq_Freq          : Liq_Freq = 20
Global Liq_Ang          : Liq_Ang = 0
Global Liq_AngSpeed     : Liq_AngSpeed = 2

Dim Liq(2) As Integer 
Dim EFFNAMES(5) As String 
EFFNAMES(LIQ_WATER) = "Vesi"
EFFNAMES(LIQ_FIRE) = "Lämpöväreily"
EFFNAMES(LIQ_HORWAVE) = "Horisontaaliset aallot"
EFFNAMES(LIQ_VERWAVE) = "Vertikaaliset aallot"
EFFNAMES(LIQ_HORRIPPLE) = "Horisontaalinen väreily"
EFFNAMES(LIQ_VERRIPPLE) = "Vertikaalinen väreily"

Liq(0) = MakeImage(SW, SH)
Liq(1) = CloneImage(Liq(0))
Liq(2) = MakeImage(SW, SH)

MaskImage liq(2),255,0,255

DrawToImage liq(2)
    Color 0,0,0
    Box 0,0,sw,sh,1
    Color 255,0,255
    Circle 0,0,sh,1
DrawToScreen 


kartta = LoadMap("Media\cdm2.til","Media\tileset.bmp")
PlayObject kartta,0,0,1

ukko = LoadObject ("Media\guy.bmp",72)

SetupCollision ukko, kartta, 1, 4, 2

Freq = 2
LiquidSettings(1, Freq, 10)
Repeat
    ClearText
    AddText "FPS: "+FPS()
    AddText EFFNAMES(efekti)+" käytössä."
    AddText "Säädä aallon taajuutta hiiren rullasta."
    AddText "Säädä laatua näppäimillä W/S"
    AddText "Vaihda efektiä Enterillä"
    AddText "Nykyinen taajuus: "+Freq
    AddText "Nykyinen laatu: "+koko+"px"
    If LeftKey() Then TurnObject ukko,5
    If RightKey() Then TurnObject ukko,-5
    If UpKey() Then MoveObject ukko,2
    If DownKey() Then MoveObject ukko,-2

    UpdateGame

    CloneCameraPosition ukko

    DrawGame 
    
    Freq = Freq + MouseMoveZ()
    koko = koko + KeyHit(cbkeyW) - KeyHit(cbkeys)
    If koko < 1 Then koko = 1 
    LiquidSettings(koko, Freq, 10)
    
    efekti = efekti + KeyHit(28)
    If efekti > 5 Then efekti = 0 
    Liquid(efekti, True)

    Color cbwhite
    
     
    DrawScreen True
Forever
//------------------------------------------------//
//FUNKTIOT
//------------------------------------------------//

Function LiquidSettings(quality, Freq, angspeed)
    Liq_Quality = quality
    Liq_Freq = Freq
    Liq_AngSpeed = angspeed  
EndFunction 


Function Liquid(tyyli = 0, mask = 1)
    pixrgb = getRGB(3) + getRGB(1) Shl 16 + getRGB(2) Shl 8
    For i = 0 To 1
        DrawToImage Liq(i)
        Cls 
        DrawToScreen 
    Next i
    
    Select tyyli
    Case 0
    
        Liq_Ang = Liq_Ang + Liq_AngSpeed
        
        For x# = 0 To SW / Liq_Quality
            CopyBox Int(x) * Liq_Quality, 0, Liq_Quality, SH, Int(x)*Liq_Quality, Int(Sin(x+Liq_Ang)*Liq_Freq), SCREEN(), Image(Liq(0))
        Next x#
    
        For y# = 0 To SH / Liq_Quality
            CopyBox 0, Int(y) * Liq_Quality, SW, Liq_Quality,  Int(Sin(y+Liq_Ang)*Liq_Freq), Int(y)*Liq_Quality , Image(Liq(0)), Image(Liq(1))
        Next y#
        
    Case 1
    
        For x# = 0 To SW / Liq_Quality
            CopyBox Int(x) * Liq_Quality, 0, Liq_Quality, SH, Int(x)*Liq_Quality, Int(Rnd(-Liq_Freq, Liq_Freq)), SCREEN(), Image(Liq(0))
        Next x#
    
        For y# = 0 To SH / Liq_Quality
            CopyBox 0, Int(y) * Liq_Quality, SW, Liq_Quality,  Int(Rnd(-Liq_Freq, Liq_Freq)), Int(y)*Liq_Quality , Image(Liq(0)), Image(Liq(1))
        Next y#    
    
    Case 2

        Liq_Ang = Liq_Ang + Liq_AngSpeed
        
        For x# = 0 To SW / Liq_Quality
            CopyBox Int(x) * Liq_Quality, 0, Liq_Quality, SH, Int(x)*Liq_Quality, Int(Sin(x+Liq_Ang)*Liq_Freq), SCREEN(), Image(Liq(1))
        Next x#    
    
    Case 3
    
        Liq_Ang = Liq_Ang + Liq_AngSpeed
        
        For y# = 0 To SH / Liq_Quality
            CopyBox 0, Int(y) * Liq_Quality, SW, Liq_Quality,  Int(Sin(y+Liq_Ang)*Liq_Freq), Int(y)*Liq_Quality , SCREEN() , Image(Liq(1))
        Next y#
        
    Case 4
    
        For x# = 0 To SW / Liq_Quality
            CopyBox Int(x) * Liq_Quality, 0, Liq_Quality, SH, Int(x)*Liq_Quality, Int(Rnd(-Liq_Freq, Liq_Freq)), SCREEN(), Image(Liq(1))
        Next x#

    Case 5

        For y# = 0 To SH / Liq_Quality
            CopyBox 0, Int(y) * Liq_Quality, SW, Liq_Quality,  Int(Rnd(-Liq_Freq, Liq_Freq)), Int(y)*Liq_Quality , SCREEN(), Image(Liq(1))
        Next y#      
        
    EndSelect 

    If mask Then 
        DrawToImage Liq(1)
        DrawImage liq(2),0,0
        DrawToScreen 
    EndIf 
    
    DrawImage Liq(1), 0, 0

    Color 0, 0, pixrgb
    
EndFunction
Mitä pahaa tuossa oli, paitsi että aika raskas..?
<Ize> Pitäs tehä allekirjotus..
<Ize> Vois keksiä jonkin nasahtavan sanonnan..
<Ize> Siitä tulis upea legenda ja kaikki vaihtaisivat allekirjoituksensa siihen.
<Ize> Ehkä ei kuitenkaa...
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: Liquid() - cbruudun aaltoilua ja väreilyä

Post by MaGetzUb »

Minulla toimi FPS 60 tuon maskin kanssa. :) Olihan tuo kätevä. ;)
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.
Post Reply