-
Notifications
You must be signed in to change notification settings - Fork 1
/
Games.CB
293 lines (213 loc) · 8.81 KB
/
Games.CB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
//Tämä muuttuja sisältää pelien yhteismäärän (täytyy määritellä ennen pelien lataamista)
Global MAIN_GameCount
//Tämä muuttuja pitää sisällään käynnissä olevan pelin ID:n
Global MAIN_RunningGameID As String
//Tämä tyyppikokoelma pitää listaa kaikista peleistä ja niiden tiedoista
Type MAIN_Game
Field ID$ //Pelin ID (sama kuin prefiksi ja kansio)
Field Name$ //Pelin nimi
Field Desc$ //Pelin seloste (tavoite)
Field Controls$ //Pelin kontrolliohjeet
Field PlayerSetup$ //ALLvsALL, 1vsALL tai TEAMvs, useat arvot erotetaan pilkulla
Field MinPlayers //Pelin tukema minimipelaajamäärä
Field MaxPlayers //Pelin tukema maksimipelaajamäärä
Field SupportAI //Voiko peli pelata tietokonevastustajilla? (YES/NO, oletus NO)
Field SupportHandicap //Tukeeko peli helpotuksia? (YES/NO, oletus NO)
Field Difficulty //Pelin vaikeustaso (1, 2 tai 3), 0 jos tukee useita
Field FPSIndependent //Onko FPS-riippumatonta
Field Logo
EndType
//Lisää pelin pelikokoelmaan. Lisätiedot luetaan gamedata.ini tiedostosta
//Koska pelien lisäys on automatisoitu, voidaan muuttaa API -> MAIN
Function MAIN_AddGame(ID$)
If ID = "" Then MakeError "Pelillä ei ole tunnistetta!"
//Tarkistetaan, ettei peliä ole vielä lisätty
For iG.MAIN_Game = Each MAIN_Game
If iG\ID = ID Then MakeError "Pelikokoelmassa on samalla tunnisteella pelejä: " + ID + "!"
Next iG
//Ladataan tiedot
If Not FileExists("Games/" + ID + "/gameinfo.ini") Then MakeError "Peliltä " + ID + " puuttuu asetustiedosto!"
MAIN_ParseSettings("Games/" + ID + "/gameinfo.ini")
//Lisätään tiedot pelikokoelmaan
nG.MAIN_Game = New(MAIN_Game)
nG\ID = ID
nG\Name = MAIN_GetSetting("Name")
nG\Desc = MAIN_GetSetting("Desc")
nG\Controls = MAIN_GetSetting("Controls")
nG\PlayerSetup = Upper(Str(MAIN_GetSetting("PlayerSetup")))
nG\MinPlayers = Int(MAIN_GetSetting("MinPlayers"))
nG\MaxPlayers = Int(MAIN_GetSetting("MaxPlayers"))
nG\SupportAI = (Upper(Str(MAIN_GetSetting("SupportAI"))) = "YES")
nG\SupportHandicap = (Upper(Str(MAIN_GetSetting("SupportHandicap"))) = "YES")
If MAIN_HasSetting("Difficulty") Then
nG\Difficulty = Int(MAIN_GetSetting("Difficulty"))
Else
nG\Difficulty = -1
EndIf
nG\FPSIndependent = (Upper(Str(MAIN_GetSetting("FPSIndependent"))) = "YES")
//Tarkistetaan, ettei samannimistä peliä ole vielä lisätty
For iG.MAIN_Game = Each MAIN_Game
If iG <> nG And iG\Name = nG\Name Then MakeError "Pelikokoelmassa on samannimisiä pelejä: " + Name + "! (" + nG\ID + " ja " + iG\ID + ")"
Next iG
//Tutkitaan puuttuvat tiedot ja aiheutetaan virheilmoitus, jos puuttuu pakollisia tietoja/epäkelpoja arvoja
err$ = "Minipelin " + ID + " tietoja puuttuu: "
If Len(nG\Name) <= 1 Then err = err + "nimi, "
If nG\Desc = "" Then err = err + "selite, "
If nG\Controls = "" Then err = err + "näppäinselite, "
If Not(InStr(nG\PlayerSetup, "ALLVSALL") Or InStr(nG\PlayerSetup, "1VSALL") Or InStr(nG\PlayerSetup, "TEAMVS")) Then err = err + "pelaajien kokoonpano, "
If Not FileExists("Games/" + ID + "/logo.png") Then err = err + "logo.png, "
If err <> "Minipelin " + ID + " tietoja puuttuu: " Then MakeError Left(err, Len(err) - 2) + "!"
//Lisätään oletustiedot, jos puuttuu vapaaehtoisia tietoja tai tiedot epäkelpoja
If nG\MaxPlayers < 1 Or nG\MaxPlayers > MAIN_MAX_PLAYERS Then nG\MaxPlayers = MAIN_MAX_PLAYERS
nG\MinPlayers = Min(nG\MaxPlayers, Max(1, nG\MinPlayers))
If nG\SupportAI <> 1 Then nG\SupportAI = False
If nG\SupportHandicap <> 1 Then nG\SupportHandicap = False
If nG\Difficulty < 0 Then nG\Difficulty = 2
If nG\FPSIndependent <> 1 Then nG\FPSIndependent = False
nG\Logo = LoadImage("Games/" + ID + "/logo.png")
MAIN_GameCount = MAIN_GameCount + 1
EndFunction
//Hakee kokoelmasta pelin ja palauttaa sen osoitteen
Function MAIN_GetGame(ID$)
For iG.MAIN_Game = Each MAIN_Game
If iG\ID = ID Then Return ConvertToInteger(iG)
Next iG
EndFunction
//Pelivalitsin / päävalikko
//näyttää kokoelman pelit ja käynnistää ne niiden logoa klikkaamalla
Function MAIN_SelectGame()
GameData = API_MakeGameData()
API_PlayerCount(GameData, MAIN_PlayerAmount)
API_PlayerSetup(GameData, "ALLvsALL")
API_Difficulty(GameData, 2)
games$ = ""
images$ = ""
For iG.MAIN_Game = Each MAIN_Game
If (MAIN_GameCompatible(ConvertToInteger(iG), GameData)) Then
info$ = "Lisätiedot: "
If iG\SupportAI Then info = info + "tietokonevastustajat, "
If iG\SupportHandicap Then info = info + "tasoitus, "
If iG\Difficulty = 0 Then info = info + "vaikeustason valinta."
If iG\Difficulty = 1 Then info = info + "vaikeustaso helppo."
If iG\Difficulty = 2 Then info = info + "vaikeustaso normaali."
If iG\Difficulty = 3 Then info = info + "vaikeustaso vaikea."
games$ = games$ + iG\ID + " " + iG\Name + "| " + iG\Desc + "| " + iG\Controls + "| " + iG\PlayerSetup + " " + iG\MaxPlayers + "| "+info$+"§"
images$ = images$ + iG\Logo+"§"
EndIf
Next iG
listData = API_WidgetListItemData(games$,images$,"§")
listTemplate = API_WidgetListTemplate(110, 5, 5, 5, API_RenderW, 110)
list = API_WidgetList(listData, listTemplate, API_ORIENTATION_VERTICAL, 0,50)
Repeat
DrawGame
Color cbwhite
Text marginBig,marginBig,"Pelikokoelmassa ON seuraavat pelit: "
i = 0
For iG.MAIN_Game = Each MAIN_Game
If (MAIN_GameCompatible(ConvertToInteger(iG), GameData)) Then
listItem = API_GetListitem(list, i)
If MAIN_MouseOnWidget(listItem) Then
If MouseHit(1) Then Return MAIN_Start(iG\ID, GameData)
EndIf
EndIf
i=i+1
Next iG
mediaCount = 0
For iM.MAIN_Media = Each MAIN_Media
mediaCount = mediaCount + 1
Text 10, 300 + mediaCount * 15, iM\FileName
Next iM
Text 0, 300, "Ladattua mediaa: " + mediaCount
API_DrawScreen()
Forever
EndFunction
//Tarkastaa, voidaanko peliä pelata annetuilla asetuksilla
Function MAIN_GameCompatible(Game, GameData)
iG.MAIN_Game = ConvertToType(Game)
If iG\MinPlayers > API_PlayerCount(GameData) Then Return False
If iG\MaxPlayers < API_PlayerCount(GameData) Then Return False
If Not InStr(Upper(Str(API_PlayerSetup(GameData))), Upper(iG\PlayerSetup)) Then Return False
If iG\Difficulty <> 0 And iG\Difficulty <> API_Difficulty(GameData) Then Return False
If Not iG\SupportAI Then
For i = 0 To API_PlayerCount(GameData) - 1
If API_PlayerNPC(i) > 0 Then Return False
Next i
EndIf
Return True
EndFunction
//GameData-palikkaan offsettejä
Const MAIN_GD_PLAYERCOUNT = 0
Const MAIN_GD_PLAYERSETUP = 4
Const MAIN_GD_DIFFICULTY = 8
//Sisältää GameData-palikan koon
Const MAIN_GD_BLOCKSIZE = 12
Global MAIN_GameData
//Luo GameData-muistipalan
Function API_MakeGameData()
Return MakeMEMBlock(MAIN_GD_BLOCKSIZE)
EndFunction
//Asettaa tai palauttaa pelaajien määrän
Function API_PlayerCount(GameData = 0, playerCount = -1)
If GameData = 0 Then GameData = MAIN_GameData
If playerCount = -1 Then
Return PeekInt(GameData, MAIN_GD_PLAYERCOUNT)
Else
PokeInt GameData, MAIN_GD_PLAYERCOUNT, playerCount
EndIf
EndFunction
//Asettaa tai palauttaa pelaajakokoonpanon
Function API_PlayerSetup(GameData = 0, playerSetup$ = "TOIVOTAANettäEItuleTÖRMÄYKSIÄtämänMERKKIJONONkanssa!!")
If GameData = 0 Then GameData = MAIN_GameData
//Tehdään uusi merkkijono, jos ei ole olemassa
address = PeekInt(GameData, MAIN_GD_PLAYERSETUP)
If address = 0 Then
iS.MAIN_CommonString = New(MAIN_CommonString)
id = ConvertToInteger(iS)
PokeInt GameData, MAIN_GD_PLAYERSETUP, id
Else
iS = ConvertToType(address)
EndIf
If playerSetup = "TOIVOTAANettäEItuleTÖRMÄYKSIÄtämänMERKKIJONONkanssa!!" Then
Return iS\txt
Else
iS\txt = playerSetup
EndIf
EndFunction
//Asettaa tai palauttaa vaikeustason
Function API_Difficulty(GameData = 0, difficulty = -1)
If GameData = 0 Then GameData = MAIN_GameData
If difficulty = -1 Then
Return PeekInt(GameData, MAIN_GD_DIFFICULTY)
Else
PokeInt GameData, MAIN_GD_DIFFICULTY, difficulty
EndIf
EndFunction
//Aloittaa pelin
Function MAIN_Start(ID$, GameData)
Game.MAIN_Game = ConvertToType(MAIN_GetGame(ID))
MAIN_DeleteWidgets()
MAIN_GameData = GameData
API_ResetToDefaults()
MAIN_RunningGameID = ID
MAIN_GameStartTimer = Timer()
API_Timer = 0
If Game\FPSIndependent Then
MAIN_LimitFPS = False
Else
MAIN_LimitFPS = True
EndIf
Include "Games\Start.cb"
MAIN_Stop()
MAIN_SelectGame()
EndFunction
//Lopettaa pelin
Function MAIN_Stop()
Include "Games\Stop.cb"
MAIN_DeleteWidgets()
MAIN_ResetPlayersDataBlocks()
MAIN_ClearMedia("*CLONE")
MAIN_RunningGameID = ""
API_ResetToDefaults()
EndFunction
//Tässä kohtaa ladataan KAIKKI minipelit
Include "Games\Include.cb"