Tower defence

Jaa meneillään olevat projektisi tai valmiit pelit muun yhteisön kanssa täällä.
DatsuniG
Advanced Member
Posts: 367
Joined: Fri Aug 15, 2008 9:57 pm

Tower defence

Post by DatsuniG »

Jotkut saattavat muistaa vanhan Tower defence projektini, joka kuitenkin jäätyi huonon muokattavuutensa takia. Projektia on nyt kuitenkin herätelty ja olen kirjoittanut pelimoottorin kokonaan uudestaan. Tällä hetkelllä pelimoottori kattaa:
- Vihollisaaltojen lisääminen tiedostosta
- Vihollisten lisääminen tiedostosta
- Karttojen luominen tiedostosta
- 4 erilaista puolustustornia (Plain, Double, Laser, Cannon)
- Tornien päivittäminen
- Raha
- Tornit ampuvat vihollisia fiksusti (Torni lukitsee kohteen ja ampuu sitä niin kauan kunnes vihollinen on joko kuollut tai tornin toimintasäteen ulkopuolella)
- Ja kaikkia semmoista mitä en jaksa mainita : )
TD v0.2.rar
(590.14 KiB) Downloaded 436 times
002.PNG
002.PNG (13.69 KiB) Viewed 14595 times
003.PNG
003.PNG (14.92 KiB) Viewed 14428 times
Last edited by DatsuniG on Fri Jan 01, 2010 12:09 pm, edited 7 times in total.
Hengität nyt manuaalisesti.
KilledWhale
Tech Developer
Tech Developer
Posts: 545
Joined: Sun Aug 26, 2007 2:43 pm
Location: Liminka

Re: Tower defence

Post by KilledWhale »

Ohjelma aloitti toimintansa tyylikkäästi MAVilla. Voi toki johtua Winestä, mutta kaikki muut CoolBasic ohjelmat ovat pyörineet täydellisesti, joten en usko tähän. Laitan kommenttia jos saan toimimaan vielä.
CoolBasic henkilökuntaa
Kehittäjä

cbFUN Kello
cbSDL
Whale.dy.fi

<@cce> miltäs tuntuu olla suomen paras
Viltzu
Guru
Posts: 1132
Joined: Sun Aug 26, 2007 5:45 pm
Location: Alavieska
Contact:

Re: Tower defence

Post by Viltzu »

Jep jep, mavia heittää heti. Eli ennenkuin edes näkyy mitään. (<-Siinä sinulle apua, MAV tulee joko drawscreenin yhteydessä tai sitä ennen. :))
DatsuniG
Advanced Member
Posts: 367
Joined: Fri Aug 15, 2008 9:57 pm

Re: Tower defence

Post by DatsuniG »

Jos joku viitsisi ajaa tämän ohjelman ja kertoa mitä otsikkorivillä luki Mavin ilmestyessä.
Attachments
debug.rar
(590.02 KiB) Downloaded 353 times
Hengität nyt manuaalisesti.
ezbe
Tech Developer
Tech Developer
Posts: 93
Joined: Fri May 08, 2009 6:53 pm

Re: Tower defence

Post by ezbe »

Työkoneella (WinXP) pikaisesti testattuna käynnistyy ilman ongelmia. Taustalle jätettynä peli kaatui MAViin jossain vaiheessa, tilannetta en nähnyt. Koitin toistamiseen jättää pelin pyörimään niin, että näen mitä ruudulla tapahtuu, MAV-tilanteessa yksikään torni ei ampunut, eikä ainakaan näkyvillä ollut vihollisia (mahdollisesti aalto vaihtumassa?).

Pikkubugiin törmäsin myös, upgradetut tornit tuntuivat pystyvän ampumaan huomattavasti kauemmas, kuin mitä tornin ympärillä näkyvä ympyrä antaisi ymmärtää (Onko mahdollisesti mennyt säde ja halkaisija sekaisin?). Grafiikka on myös ehkä turhan pientä, tässä koneessa taitaa olla 22"-laajakuvanäyttö 1680x1050-resoluutiolla, kotona samankokoinen fullhd-resolla, jonka kanssa pelin ikkunaa saisi katsoa jo varmaan suurennuslasilla.

EDIT: Testasin debug-versiolla, MAVin kohdalla otsikkopalkissa luki StartWave() (monen aallon jälkeen).
Last edited by ezbe on Tue Dec 29, 2009 1:50 pm, edited 1 time in total.
KilledWhale
Tech Developer
Tech Developer
Posts: 545
Joined: Sun Aug 26, 2007 2:43 pm
Location: Liminka

Re: Tower defence

Post by KilledWhale »

DatsuniG wrote:Jos joku viitsisi ajaa tämän ohjelman ja kertoa mitä otsikkorivillä luki Mavin ilmestyessä.
RestrcitSpots() lukee ainakin itselläni
CoolBasic henkilökuntaa
Kehittäjä

cbFUN Kello
cbSDL
Whale.dy.fi

<@cce> miltäs tuntuu olla suomen paras
Viltzu
Guru
Posts: 1132
Joined: Sun Aug 26, 2007 5:45 pm
Location: Alavieska
Contact:

Re: Tower defence

Post by Viltzu »

KilledWhale wrote:
DatsuniG wrote:Jos joku viitsisi ajaa tämän ohjelman ja kertoa mitä otsikkorivillä luki Mavin ilmestyessä.
RestrcitSpots() lukee ainakin itselläni
Sama tulee minullakin. Win XP ja sp3
tuhoojabotti
Advanced Member
Posts: 485
Joined: Tue Aug 28, 2007 3:53 pm
Location: Suomi, Finland
Contact:

Re: Tower defence

Post by tuhoojabotti »

Viltzu wrote:Sama tulee minullakin. Win XP ja sp3
Imagedev.tuhoojabotti.com — “Programmer (noun): An organism that turns caffeine into code.”
DatsuniG
Advanced Member
Posts: 367
Joined: Fri Aug 15, 2008 9:57 pm

Re: Tower defence

Post by DatsuniG »

Nonniin vika on (luultavasti) korjattu. Korjattua pakettia voi ladata aloitusviestistä.

KillBurn: Keksin jo tuohonkin vastauksen, hetki vain.
Last edited by DatsuniG on Tue Dec 29, 2009 2:44 pm, edited 1 time in total.
Hengität nyt manuaalisesti.
User avatar
KillBurn
Advanced Member
Posts: 339
Joined: Wed Aug 29, 2007 5:02 pm

Re: Tower defence

Post by KillBurn »

Kaatuu vieläkin kun on tappanut kaikki ja odottanut hetken. Johtuu luultavasti siitä startwave():sta. Näyttää kaatuilevan useilla :(
Sumu Games: Sam, Ur eye!
alker(vierailijana)

Re: Tower defence

Post by alker(vierailijana) »

Minulle kaatui siihen kun upragesin 3 laseria, niin että niiden range oli yli .. Then mav :)
alker(vierailijana)

Re: Tower defence

Post by alker(vierailijana) »

alker(vierailijana) wrote:Minulle kaatui siihen kun upragesin 3 laseria, niin että niiden range oli yli .. Then mav :)
Yli 2000 piti kirjottaa :)
User avatar
kaneli2000
Guru
Posts: 1059
Joined: Mon Mar 17, 2008 2:40 pm
Location: Lempäälä

Re: Tower defence

Post by kaneli2000 »

Tulipa tätäkin testattua. Muuten näyttää hyvältä, mutta pelin FPS alkoi olla erittäin alhainen joissain kohdissa - joskus, kun vihollisia ei ollut ruudulla ollenkaan. Sen lisäksi testiversio oli hiukan tylsä, kun tykkejä sai kuinka paljon halusi, eikä rahaa näkynyt missään.
I see the rainbow rising
DatsuniG
Advanced Member
Posts: 367
Joined: Fri Aug 15, 2008 9:57 pm

Re: Tower defence

Post by DatsuniG »

Nyt on korjattu kaikki viat jotka voi aiheuttaa MAVin. Korjattua pakettia saa ladata aloitusviestistä. (taas :lol: )

@kaneli: Viholliset spawnaa ruudun ulkopuolella.
Hengität nyt manuaalisesti.
User avatar
KillBurn
Advanced Member
Posts: 339
Joined: Wed Aug 29, 2007 5:02 pm

Re: Tower defence

Post by KillBurn »

Nyt ei tullut MAV:ia. Tästä on hyvä jatkaa.
Sumu Games: Sam, Ur eye!
Viltzu
Guru
Posts: 1132
Joined: Sun Aug 26, 2007 5:45 pm
Location: Alavieska
Contact:

Re: Tower defence

Post by Viltzu »

Bugi ilmeisesti.
Kuvassa olevaan kohtaan ei voi laittaa laseria. Vieressä olevaan paikkaan voi.
Paikka on siis tyhjä mihin yritän tuota laseria laittaa.
Attachments
Bugi?
Bugi?
bug.PNG (7.35 KiB) Viewed 14507 times
DatsuniG
Advanced Member
Posts: 367
Joined: Fri Aug 15, 2008 9:57 pm

Re: Tower defence

Post by DatsuniG »

Raha on lisätty peliin, joten nyt on aidon tower defencen tuntua. : ) Peli kaipailee enään hienosäätöä ja parempaa karttasuunnittelua. Aloitusviesti päivitetty ja sieltä vaan latailemaan.
ezbe wrote:Pikkubugiin törmäsin myös, upgradetut tornit tuntuivat pystyvän ampumaan huomattavasti kauemmas, kuin mitä tornin ympärillä näkyvä ympyrä antaisi ymmärtää (Onko mahdollisesti mennyt säde ja halkaisija sekaisin?). Grafiikka on myös ehkä turhan pientä, tässä koneessa taitaa olla 22"-laajakuvanäyttö 1680x1050-resoluutiolla, kotona samankokoinen fullhd-resolla, jonka kanssa pelin ikkunaa saisi katsoa jo varmaan suurennuslasilla.
Jep, säde ja halkaisija meni sekaisin. Eikä grafiikka ole omasta mielestäni liian pientä. (Itsehän koodailen tätä 24"-laajakuvanäytöllä 1920x1080 resoluutiolla.)
Hengität nyt manuaalisesti.
User avatar
Knoy
Active Member
Posts: 187
Joined: Fri Feb 12, 2010 10:50 pm

Re: Tower defence

Post by Knoy »

On tämä kyllä aika hauska TD peli, mutta se on turhan lyhyt. Tein itse siihen lisää kenttiä, mutta erilaisten tornien puute rupesi ärsyttämään 20 tason kohdalla.
Hienoa tulee kunhan saat päiviteltyä.
DatsuniG
Advanced Member
Posts: 367
Joined: Fri Aug 15, 2008 9:57 pm

Re: Tower defence

Post by DatsuniG »

Lähdekoodia jakoon taas. Koodasin tämän omasta mielestäni niin tyhmästi, että päätin jättää asian sikseen. : )

Main Functions.cb

Code: Select all

Global gSnap, gAmount, gSpawnX, gSpawnY, gWaveStart, gCurrentWave, gCounter, gEnemyTypeAmount, gSelected, gBuildMode, gMoney, gLives
gSnap = 20
FrameLimit 30
gMoney = 600
gLives = 15
bg = Background()
mp = DrawTDMap()
Type ENEMY
    Field id
    Field char$
    Field MaxHP#
    Field CurHP#
    Field r
    Field g
    Field b
    Field x#
    Field y#
    Field wp
    Field speed#
    Field hp#
    Field tTimer
    Field cash
EndType 

Type TURRET
    Field sort
    Field price
    Field x
    Field y
    Field dmg
    Field target
    Field range
    Field ttime
    Field reload
    Field speed
    Field level
    Field id
    Field splash
EndType 

Type BULLET
    Field x#
    Field y#
    Field splash
    Field angle
    Field speed
    Field dmg
    Field sort
    Field target
EndType 

Type WayPoints
    Field x
    Field y
EndType 

Dim RestrictedSpots(40,30) As integer
Dim Wavelist(500) As String 
Dim Enemies(500,4) As String 
Dim Turrets(4) As String 
Dim Prices(4) As Integer

Turrets(1) = "Plain"
Turrets(2) = "Double"
Turrets(3) = "Laser"
Turrets(4) = "Cannon"

Prices(1) = 250
Prices(2) = 600
Prices(3) = 800
Prices(4) = 1200

ChDir "enemy"
LoadEnemies()
ChDir ".."

Function LoadTDWP(file As String)
    ChDir "Maps"
    If FileExists(file) Then handle = OpenToRead(file) Else ChDir ".." : Return 0
    gSpawnX = ReadInt(handle)
    gSpawnY = ReadInt(handle)
    For add.WAYPOINTS = Each WAYPOINTS
        Delete add
    Next add
    gAmount = 0
    While Not EOF(handle)
        gAmount + 1
        ParseLine As String = Trim(ReadLine(handle))
        add.WAYPOINTS = New(WAYPOINTS)
        add\x = GetWord(ParseLine,1,",") 
        add\y = GetWord(ParseLine,2,",") 
    Wend 
    CloseFile handle
    ChDir ".."
    ChDir "Waves"
    If FileExists(file) Then handle = OpenToRead(file) Else ChDir ".." : Return 0
    While Not EOF(handle)
        num + 1
        Wavelist(num) = ReadLine(handle)
    Wend
    CloseFile handle
    ChDir ".."
EndFunction

Function SaveTDWP(file As String)
    ChDir "Maps"
    If FileExists(file) Then DeleteFile file
    handle = OpenToEdit(file)
    WriteInt handle, gSpawnX
    WriteInt handle, gSpawnY
    For add.WAYPOINTS = Each WAYPOINTS
        WriteLine handle,add\x+","+add\y
    Next add
    CloseFile handle
    ChDir ".."
EndFunction 

Function DrawTDMap()
    img = MakeImage(ScreenWidth(),ScreenHeight())
    DrawToImage img
        Color 44,44,44
        For add.WAYPOINTS = Each WAYPOINTS 
            add = After(add)
            If add <> NULL Then tmpx = add\x : tmpy = add\y : add = Before(add) Else Exit  
            dis = Distance(add\x,add\y,tmpx,tmpy)
            ang = GetAngle(add\x,add\y,tmpx,tmpy)
            For a = 0 To dis
                Circle add\x + Cos(ang) * a,add\y - Sin(ang) * a, gSnap
            Next a
        Next add
    DrawToScreen
    Return img
EndFunction

Function SnapToGridX(x)
    Return X - (X Mod gSnap)
EndFunction   
    
Function SnapToGridY(y)
    Return Y - (Y Mod gSnap)
EndFunction  

Function RestrictSpots()
    ClearArray OFF 
    ReDim RestrictedSpots(ScreenWidth() / gSnap,ScreenHeight() / gSnap)
    Lock SCREEN()
    For a = 0 To ScreenHeight() / gSnap - 1
        For i = 0 To ScreenWidth() / gSnap - 1
            pix = GetPixel2(i * gSnap + gSnap /2,a * gSnap + gSnap/2)
            R = RoundDown(pix Shr 16)
            gb = pix - R Shl 16
            G = RoundDown(gb Shr 8)
            B = gb - G Shl 8
            If r <> 0 And g <> 0 And b <> 0 Then RestrictedSpots(i,a) = 1
        Next i
    Next a
    Unlock SCREEN()
EndFunction     
            
Function Background()
    img = MakeImage(ScreenWidth(),ScreenHeight())
    DrawToImage img
        For a = 0 To ScreenHeight() / gSnap
            For i = 0 To ScreenWidth() / gSnap
                Color 22,22,22
                Box i * gSnap, a * gSnap, gSnap, gSnap, 0
            Next i
        Next a
    DrawToScreen
    Return img
EndFunction 

Function UpdateEnemy()
    For add.WAYPOINTS = Each WAYPOINTS
        tm + 1
        For uusi.ENEMY = Each ENEMY
            If uusi\wp = tm And uusi\ttimer < Timer() Then 
                For i = 1 To uusi\speed
                    uusi\x = uusi\x + Cos(GetAngle(uusi\x,uusi\y,add\x + gSnap / 2,add\y + gSnap / 2))
                    uusi\y = uusi\y - Sin(GetAngle(uusi\x,uusi\y,add\x + gSnap / 2,add\y + gSnap / 2))
                    If Int(uusi\x) = add\x + gSnap / 2 And Int(uusi\y) = add\y + gSnap / 2 Then uusi\WP + 1 : Exit 
                Next i
                Color uusi\r, uusi\g, uusi\b
                Select uusi\char
                    Case "1"
                        Box uusi\x - 1, uusi\y - 1, 3, 3
                    Case "2"
                        Circle uusi\x - 1, uusi\y - 1, 3
                    Case "3"
                        Dot uusi\x , uusi\y
                    Default
                        Text uusi\x - TextWidth(uusi\char) / 2, uusi\y - TextHeight(uusi\char) / 2, uusi\char 
                EndSelect 
                Color cbred
                Box uusi\x - 2, uusi\y - 3, 5 , 1
                Color cbgreen 
                Box uusi\x - 2, uusi\y - 3,Float( 5 * (uusi\CurHP / uusi\MaxHP)) , 1
                If uusi\WP = gAmount + 1 Then gLives - 1 : Delete uusi
            EndIf         
        Next uusi
    Next add
    If gWaveStart = True Then 
        uusi.ENEMY = First(ENEMY)
        If uusi = NULL Then gWaveStart = False 
    EndIf 
EndFunction 

Function StartWave()
    If gWaveStart = False Then 
        If Wavelist(gCurrentWave + 1) <> "" Then 
            gMoney = gMoney * 1.05
            gCurrentWave + 1
            For a = 1 To CountWords(Wavelist(gCurrentWave),";")
                tex$ = GetWord(Wavelist(gCurrentWave),a,";")
                For i = 1 To Int(GetWord(Tex$,2,","))
                    gCounter + 1
                    For u = 0 To gEnemyTypeAmount
                        If Enemies(u,0) = GetWord(tex$,1,",") Then 
                            uusi.ENEMY = New(ENEMY)
                            uusi\id = gCounter
                            uusi\char = Enemies(u,0)
                            uusi\r = GetWord(Enemies(u,2),1,",")
                            uusi\g = GetWord(Enemies(u,2),2,",")
                            uusi\b = GetWord(Enemies(u,2),3,",")
                            uusi\speed = Enemies(u,3)
                            uusi\wp = 1
                            uusi\ttimer = Timer() + 250 * (i + (a - 1) * Int(GetWord(Tex$,2,",")))
                            uusi\cash = Enemies(u,4)
                            uusi\MaxHP = int(Enemies(u,1))
                            uusi\CurHP = int(Enemies(u,1))
                            uusi\x = gSpawnX
                            uusi\y = gSpawnY
                        EndIf 
                    Next u
                Next i
            Next a
            gWaveStart = True
        EndIf 
    EndIf 
EndFunction 

Function UpdateTurrets()
    For i.TURRET = Each TURRET
        shot = False
        For uusi.ENEMY = Each ENEMY
            If i\target = 0 And Distance(i\x,i\y,uusi\x,uusi\y) <= i\range Then i\target = uusi\ID
            If i\target = uusi\ID And Distance(i\x,i\y,uusi\x,uusi\y) <= i\range And Timer() - i\reload > i\ttime Then 
                Select i\sort
                    Case 1
                        CreateBullet(1,i\x,i\y,GetAngle(i\x,i\y,uusi\x,uusi\y),i\speed,i\dmg,i\splash)
                    Case 2
                        CreateBullet(2,i\x,i\y,GetAngle(i\x,i\y,uusi\x,uusi\y),i\speed,i\dmg,i\splash)
                    Case 3
                        CreateBullet(3,i\x,i\y,GetAngle(i\x,i\y,uusi\x,uusi\y),i\speed,i\dmg,i\splash,uusi\id)
                    Case 4
                        CreateBullet(1,i\x,i\y,GetAngle(i\x,i\y,uusi\x,uusi\y),i\speed,i\dmg,i\splash)          
                EndSelect
                i\reload = Timer()
                shot = True
            EndIf
        Next uusi
        Color cbwhite
        If i\id = gSelected Then
            Circle i\x - i\range ,i\y - i\range ,i\range * 2,0
            Box 320,0,80,100,0
            Text 322,2,"Dmg +" + Int((i\dmg * 1.6 - i\dmg))
            Text 322,18,"Speed +" + abs(Int((i\ttime * 0.95 - i\ttime)))
            Text 322,34,"Range +" + Int((i\range * 1.3 - i\range))
            Text 322,52,"Price "+i\price
            Box 322,68,76,20,0
            Text 324,70,"Upgrade"
            If MouseX() >322 And MouseX() < 398 And MouseY() > 68 And MouseY() < 88 And MouseHit(1) And gMoney >= i\price Then 
                gMoney = gMoney - i\Price
                i\dmg = Int(i\dmg * 1.6)
                i\ttime = Int(i\ttime * 0.95)
                i\range = Int(i\range * 1.3)
                i\Price = i\Price * 1.8
            EndIf 
        EndIf 
        If shot = False Then i\target = 0
        Select i\sort
            Case 1
                Color cbgreen 
                Box i\x - gSnap / 4,i\y - gSnap / 4,gSnap / 2,gSnap / 2,0
                Box i\x - gSnap / 8 - 1,i\y - gSnap / 8 - 1,gSnap / 4 + 1,gSnap / 4 + 1
            Case 2
                Color cborange 
                Box i\x - gSnap / 4,i\y - gSnap / 4,gSnap / 2,gSnap / 2,0
                Box i\x - gSnap / 8 - 1,i\y - gSnap / 8 - 1,gSnap / 4 + 1,gSnap / 4 + 1
            Case 3
                Color cbblue
                Box i\x - gSnap / 8 - 1,i\y - gSnap / 8 - 1,gSnap / 4 + 1,gSnap / 4 + 1
                Box i\x - gSnap / 4,i\y - gSnap / 4,gSnap / 2,gSnap / 2,0
            Case 4
                Color cbPurple
                Box i\x - gSnap / 8 - 1,i\y - gSnap / 8 - 1,gSnap / 4 + 1,gSnap / 4 + 1
                Box i\x - gSnap / 4,i\y - gSnap / 4,gSnap / 2,gSnap / 2,0                   
        EndSelect
    Next i
EndFunction 

Function CreateBullet(sort,x,y,angle,speed,dmg,splash,target = 0)
    Select sort
        Case 1
            a.BULLET = New(BULLET)
            a\x = x
            a\y = y
            a\angle = angle
            a\speed = speed
            a\dmg = dmg
            a\splash = splash
            a\sort = 1
        Case 2
            For i = -1 To 1 Step 2
                a.BULLET = New(BULLET)
                a\x = x + Cos(angle + 45 * i) * 2
                a\y = y - Sin(angle + 45 * i) * 2
                a\angle = angle
                a\speed = speed
                a\dmg = dmg
                a\splash = splash
                a\sort = 1
            Next i
        Case 3
            a.BULLET = New(BULLET)
            a\x = x
            a\y = y
            a\angle = angle
            a\speed = speed
            a\dmg = dmg
            a\splash = splash
            a\sort = 0
            a\target = target
    EndSelect
EndFunction 

Function UpdateBullets()
    Color cbwhite
    For a.BULLET = Each BULLET
        hit = 0
        If a\sort Then 
            For i = 1 To a\speed
                a\x = a\x + Cos(a\angle)
                a\y = a\y - Sin(a\angle)
                For uusi.ENEMY = Each ENEMY
                    If Int(uusi\x) - a\splash / 2 < Int(a\x) And Int(uusi\x) + a\splash / 2 > Int(a\x) And Int(uusi\y) - a\splash / 2 < Int(a\y) And Int(uusi\y) + a\splash / 2 > Int(a\y) Then 
                        uusi\CurHP = uusi\CurHP - a\dmg
                        If uusi\CurHP < 0 Then gMoney = gMoney + uusi\cash : Delete uusi
                        If hit = 0 Then 
                            Dot a\x,a\y
                        EndIf 
                        hit = 1
                    EndIf 
                Next uusi 
            Next i
            If hit = 0 Then 
                Dot a\x,a\y
            EndIf 
        Else 
            For uusi.ENEMY = Each ENEMY
                If a\target = uusi\id Then 
                    Line a\x,a\y,uusi\x,uusi\y
                    uusi\CurHP = uusi\CurHP - a\dmg
                    If uusi\CurHP < 0 Then Delete uusi  
                    hit = 1
                EndIf 
            Next uusi
        EndIf 
        If hit = 1 Or outofscreen(a\x,a\y) Then Delete a
    Next a
EndFunction 

Function ReadConfig(tiedosto$, otsikko$)
    otsikko$ = Lower(otsikko$)
    If FileExists(tiedosto$) Then
        f = OpenToRead(tiedosto$)
        While Not EOF(f)
            rivi$ = Lower(ReadLine(f))
            If Left(rivi$, Len(otsikko$)+1) = otsikko$+"=" Then
                arvo$ = Replace(rivi$, otsikko$+"=", "")
                Return arvo$
            EndIf
        Wend
        Return 0
    Else
        MakeError "Config file not found!"
    EndIf
EndFunction

Function LoadEnemies()
    gEnemyTypeAmount = 0
    StartSearch 
        Repeat
            file$ = FindFile()
            If Lower(Right(file$,4))= ".txt" Then 
                Enemies(gEnemyTypeAmount,0) = ReadConfig(file$,"t"+"ype")
                Enemies(gEnemyTypeAmount,1) = ReadConfig(file$,"hp")
                Enemies(gEnemyTypeAmount,2) = ReadConfig(file$,"c"+"olor")
                Enemies(gEnemyTypeAmount,3) = ReadConfig(file$,"speed")
                Enemies(gEnemyTypeAmount,4) = ReadConfig(file$,"cash")
                gEnemyTypeAmount + 1
            EndIf 
        Until file$ = ""
    EndSearch
EndFunction 
                
Function Button(x,y,txt$)
    Color cbblack
    Box x,y,50,20
    Color cbwhite
    Box x,y,50,20,0
    Text x + (50 - TextWidth(txt)) / 2, y + 2,txt
    If MouseX() > x And MouseX() < x + 50 And MouseY() > y And MouseY() < y + 20 And MouseHit(1) Then Return 1
EndFunction 

Function OutOfScreen(x,y)
    If x < 0 Or y < 0 Or x > ScreenWidth() Or y > ScreenHeight() Then Return 1
EndFunction 
Game.cb

Code: Select all

Include "Main Functions.cb"
FrameLimit 30
gSnap = 20
bg = Background()
LoadTDWP("test.txt")
mp = DrawTDMap()
Repeat
    SetWindow "Money: " + gMoney + " - Lives: " + gLives
    DrawImage bg,0,0
    DrawImage mp,0,0
    UpdateEnemy()
    UpdateTurrets()
    UpdateBullets()
    RestrictSpots()
    If gBuildMode = 1 Then 
        If RestrictedSpots(SnapToGridX(MouseX()) / gSnap,SnapToGridY(MouseY()) /gSnap) = 1 Then 
            Color cbred
        Else
            Color 0,170,0
        EndIf 
        Box SnapToGridX(MouseX()),SnapToGridY(MouseY()),gSnap,gSnap,0
        Select BuildType
            Case 1
                Color cbgreen 
                Box SnapToGridX(MouseX()) + gSnap / 4,SnapToGridY(MouseY()) + gSnap / 4,gSnap / 2,gSnap / 2,0
                Box SnapToGridX(MouseX()) + gSnap / 4 + 2,SnapToGridY(MouseY()) + gSnap / 4 + 2,gSnap / 2 - 4,gSnap / 2 - 4
            Case 2
                Color cborange 
                Box SnapToGridX(MouseX()) + gSnap / 4,SnapToGridY(MouseY()) + gSnap / 4,gSnap / 2,gSnap / 2,0
                Box SnapToGridX(MouseX()) + gSnap / 4 + 2,SnapToGridY(MouseY()) + gSnap / 4 + 2,gSnap / 2 - 4,gSnap / 2 - 4
            Case 3
                Color cbblue
                Box SnapToGridX(MouseX()) + gSnap / 4,SnapToGridY(MouseY()) + gSnap / 4,gSnap / 2,gSnap / 2,0
                Box SnapToGridX(MouseX()) + gSnap / 4 + 2,SnapToGridY(MouseY()) + gSnap / 4 + 2,gSnap / 2 - 4,gSnap / 2 - 4
            Case 4
                Color cbpurple
                Box SnapToGridX(MouseX()) + gSnap / 4,SnapToGridY(MouseY()) + gSnap / 4,gSnap / 2,gSnap / 2,0   
                Box SnapToGridX(MouseX()) + gSnap / 4 + 2,SnapToGridY(MouseY()) + gSnap / 4 + 2,gSnap / 2 - 4,gSnap / 2 - 4
        EndSelect 
    EndIf 
    If gSelected = 0 Then 
        If Button(350,0,"Buy") And gBuildMode = 0 Then 
            gBuildmode = 1
            BuildType = 1
            ClearMouse
        EndIf 
    EndIf 
    If MouseHit(2) Then
        if gBuildmode = 1 Then 
            gBuildMode = 0 
            BuildType = 0
        ElseIf gSelected > 0 Then
            gSelected = 0
        EndIf 
    EndIf 
    If gBuildMode = 1 Then 
        For u = 0 To 3
            Color cbblack
            Box 300,u * 20,100,20
            Color cbwhite 
            Box 300,u * 20,100,20,0
            Text 302,u * 20 + 2,Turrets(u + 1)
            Text 398 - TextWidth(Str(Prices(u + 1))), u * 20 + 2, Str(Prices(u + 1))
            If MouseHit(1) And MouseX() > 300 And MouseX() < 400 And MouseY() > u * 20 And MouseY() < u * 20 + 20 Then BuildType = U + 1
        Next u
        Color cbblack
        Box 300,80,100,20
        Color cbwhite 
        Box 300,80,100,20,0
        Text 302,82,"Exit"
        If MouseHit(1) And MouseX() > 300 And MouseX() < 400 And MouseY() > 80 And MouseY() < 100 Then gBuildMode = 0
    EndIf 
    If MouseHit(1) And gBuildmode = 1 Then 
        If RestrictedSpots(SnapToGridX(MouseX()) / gSnap,SnapToGridY(MouseY()) /gSnap) = 0 Then
            If MouseX() > 300 And MouseY() < 100 Then 
            Else 
                If gMoney >= Prices(BuildType)
                    Select BuildType 
                        Case 1
                            i.TURRET = New(TURRET)
                            i\x = SnapToGridX(MouseX()) + gSnap / 2
                            i\y = SnapToGridY(MouseY()) + gSnap / 2
                            i\price = Prices(BuildType)
                            i\ttime = 500
                            i\speed = 20
                            i\range = 25
                            i\dmg = 15
                            gCounter + 1
                            i\id = gCounter
                            i\sort = 1
                            i\splash = 5
                        Case 2
                            i.TURRET = New(TURRET)
                            i\x = SnapToGridX(MouseX()) + gSnap / 2
                            i\y = SnapToGridY(MouseY()) + gSnap / 2
                            i\price = Prices(BuildType)
                            i\ttime = 800
                            i\speed = 20
                            i\range = 35
                            i\dmg = 18
                            gCounter + 1
                            i\id = gCounter
                            i\sort = 2
                            i\splash = 5
                        Case 3
                            i.TURRET = New(TURRET)
                            i\x = SnapToGridX(MouseX()) + gSnap / 2
                            i\y = SnapToGridY(MouseY()) + gSnap / 2
                            i\price = Prices(BuildType)
                            i\ttime = 0
                            i\speed = 1
                            i\range = 25
                            i\dmg = 1
                            gCounter + 1
                            i\id = gCounter
                            i\sort = 3
                            i\splash = 1
                        Case 4
                            i.TURRET = New(TURRET)
                            i\x = SnapToGridX(MouseX()) + gSnap / 2
                            i\y = SnapToGridY(MouseY()) + gSnap / 2
                            i\price = Prices(BuildType)
                            i\ttime = 2000
                            i\speed = 20
                            i\range = 40
                            i\dmg = 40
                            gCounter + 1
                            i\id = gCounter
                            i\sort = 4
                            i\splash = 25
                    EndSelect 
                    RestrictedSpots(SnapToGridX(MouseX()) / gSnap,SnapToGridY(MouseY()) /gSnap) = 1
                    gMoney = gMoney - Prices(BuildType)
                EndIf 
            EndIf 
        EndIf 
    ElseIf MouseHit(1) And RestrictedSpots(SnapToGridX(MouseX()) / gSnap,SnapToGridY(MouseY()) /gSnap) = 1 And gBuildMode = 0 Then 
        For i.TURRET = Each TURRET
            If i\x = SnapToGridX(MouseX()) + gSnap / 2 And i\y = SnapToGridY(MouseY()) + gSnap / 2 Then 
                If gSelected = i\id Then gSelected = 0 Else gSelected = i\id
                Exit
            EndIf 
        Next i            
    EndIf 
    StartWave()
    If gLives < 1 Then End
    DrawScreen
Forever 
EDIT:

Vielä mappieditorin lähdekoodikin löytyi:

Code: Select all

Include "Main Functions.cb"

Repeat
    DrawImage bg,0,0
    DrawImage mp,0,0
    Color cbwhite
    Box SnapToGridX(MouseX()),SnapToGridY(MouseY()),gSnap,gSnap,0
    If MouseHit(1) Then
        gAmount + 1
        add.WAYPOINTS = New(WAYPOINTS)
        add\x = SnapToGridX(MouseX())
        add\y = SnapToGridY(MouseY())
        mp = DrawTDMap()
        RestrictSpots()
    ElseIf MouseHit(2) Then 
        For add.WAYPOINTS = Each WAYPOINTS
            If SnapToGridX(MouseX()) = add\x And add\y = SnapToGridY(MouseY()) Then Delete add : RestrictSpots() : mp = DrawTDMap() : gAmount - 1 : Exit
        Next add
    ElseIf MouseHit(3) Then
        gSpawnX = SnapToGridX(MouseX()) + gSnap / 2
        gSpawnY = SnapToGridY(MouseY()) + gSnap / 2
    EndIf 
    Color cbred
    Circle gSpawnX - 1,gSpawnY - 1,3
    If KeyHit(cbKeyS) Then SaveTDWP("test.txt") : Cls
    If KeyHit(cbKeyL) Then LoadTDWP("test.txt") : mp = DrawTDMap()
    gSpawnX = gSpawnX + RightKey() - LeftKey()
    gSpawny = gSpawnY + DownKey() - UpKey()
    DrawScreen
Forever 
[/edit]
Hengität nyt manuaalisesti.
Herra Siili
Advanced Member
Posts: 308
Joined: Tue Nov 25, 2008 8:06 pm
Contact:

Re: Tower defence

Post by Herra Siili »

Muuten kokeilisin peliä, mutta F-Secure väitti kivenkovaan, että paketissa oli troijalainen ja poisti exen heti, kun purin paketin. :)
a.k.a. Gehock
Post Reply