19 {$INCLUDE "options.inc"} |
19 {$INCLUDE "options.inc"} |
20 {$IF GLunit = GL}{$DEFINE GLunit:=GL,GLext}{$ENDIF} |
20 {$IF GLunit = GL}{$DEFINE GLunit:=GL,GLext}{$ENDIF} |
21 |
21 |
22 unit uStore; |
22 unit uStore; |
23 interface |
23 interface |
24 uses sysutils, uConsts, SDLh, GLunit, uTypes; |
24 uses sysutils, uConsts, SDLh, GLunit, uTypes, uLandTexture; |
25 |
25 |
26 procedure initModule; |
26 procedure initModule; |
27 procedure freeModule; |
27 procedure freeModule; |
28 |
28 |
29 procedure StoreLoad; |
29 procedure StoreLoad(reload: boolean = false); |
30 procedure StoreRelease; |
30 procedure StoreRelease(reload: boolean = false); |
31 procedure RenderHealth(var Hedgehog: THedgehog); |
31 procedure RenderHealth(var Hedgehog: THedgehog); |
32 procedure AddProgress; |
32 procedure AddProgress; |
33 procedure FinishProgress; |
33 procedure FinishProgress; |
34 function LoadImage(const filename: shortstring; imageFlags: LongInt): PSDL_Surface; |
34 function LoadImage(const filename: shortstring; imageFlags: LongInt): PSDL_Surface; |
35 procedure LoadHedgehogHat(HHGear: PGear; newHat: shortstring); |
35 procedure LoadHedgehogHat(HHGear: PGear; newHat: shortstring); |
288 ((vobCount > 0) or (ii <> sprFlake)) then |
288 ((vobCount > 0) or (ii <> sprFlake)) then |
289 begin |
289 begin |
290 if AltPath = ptNone then |
290 if AltPath = ptNone then |
291 if ii in [sprHorizont, sprHorizontL, sprHorizontR, sprSky, sprSkyL, sprSkyR, sprChunk] then // FIXME: hack |
291 if ii in [sprHorizont, sprHorizontL, sprHorizontR, sprSky, sprSkyL, sprSkyR, sprChunk] then // FIXME: hack |
292 begin |
292 begin |
293 tmpsurf:= LoadImage(UserPathz[Path] + '/' + FileName, ifAlpha or ifTransparent); |
293 if not reload then |
294 if tmpsurf = nil then tmpsurf:= LoadImage(Pathz[Path] + '/' + FileName, ifAlpha or ifTransparent) |
294 begin |
|
295 tmpsurf:= LoadImage(UserPathz[Path] + '/' + FileName, ifAlpha or ifTransparent); |
|
296 if tmpsurf = nil then tmpsurf:= LoadImage(Pathz[Path] + '/' + FileName, ifAlpha or ifTransparent) |
|
297 end |
|
298 else tmpsurf:= Surface |
295 end |
299 end |
296 else |
300 else |
297 begin |
301 begin |
298 tmpsurf:= LoadImage(UserPathz[Path] + '/' + FileName, ifAlpha or ifTransparent); |
302 if not reload then |
299 if tmpsurf = nil then tmpsurf:= LoadImage(Pathz[Path] + '/' + FileName, ifAlpha or ifTransparent or ifCritical) |
303 begin |
|
304 tmpsurf:= LoadImage(UserPathz[Path] + '/' + FileName, ifAlpha or ifTransparent); |
|
305 if tmpsurf = nil then tmpsurf:= LoadImage(Pathz[Path] + '/' + FileName, ifAlpha or ifTransparent or ifCritical) |
|
306 end |
|
307 else tmpsurf:= Surface |
300 end |
308 end |
301 else begin |
309 else begin |
302 tmpsurf:= LoadImage(UserPathz[Path] + '/' + FileName, ifAlpha or ifTransparent); |
310 if not reload then |
303 if tmpsurf = nil then tmpsurf:= LoadImage(Pathz[Path] + '/' + FileName, ifAlpha or ifTransparent); |
311 begin |
304 if tmpsurf = nil then tmpsurf:= LoadImage(UserPathz[AltPath] + '/' + FileName, ifAlpha or ifTransparent); |
312 tmpsurf:= LoadImage(UserPathz[Path] + '/' + FileName, ifAlpha or ifTransparent); |
305 if tmpsurf = nil then tmpsurf:= LoadImage(Pathz[AltPath] + '/' + FileName, ifAlpha or ifCritical or ifTransparent); |
313 if tmpsurf = nil then tmpsurf:= LoadImage(Pathz[Path] + '/' + FileName, ifAlpha or ifTransparent); |
|
314 if tmpsurf = nil then tmpsurf:= LoadImage(UserPathz[AltPath] + '/' + FileName, ifAlpha or ifTransparent); |
|
315 if tmpsurf = nil then tmpsurf:= LoadImage(Pathz[AltPath] + '/' + FileName, ifAlpha or ifCritical or ifTransparent) |
|
316 end |
|
317 else tmpsurf:= Surface |
306 end; |
318 end; |
307 |
319 |
308 if tmpsurf <> nil then |
320 if tmpsurf <> nil then |
309 begin |
321 begin |
310 if getImageDimensions then |
322 if getImageDimensions then |
311 begin |
323 begin |
312 imageWidth:= tmpsurf^.w; |
324 imageWidth:= tmpsurf^.w; |
313 imageHeight:= tmpsurf^.h |
325 imageHeight:= tmpsurf^.h |
314 end; |
326 end; |
315 if getDimensions then |
327 if getDimensions then |
316 begin |
328 begin |
317 Width:= tmpsurf^.w; |
329 Width:= tmpsurf^.w; |
318 Height:= tmpsurf^.h |
330 Height:= tmpsurf^.h |
319 end; |
331 end; |
320 if (ii in [sprSky, sprSkyL, sprSkyR, sprHorizont, sprHorizontL, sprHorizontR]) then |
332 if (ii in [sprSky, sprSkyL, sprSkyR, sprHorizont, sprHorizontL, sprHorizontR]) then |
321 begin |
333 begin |
322 Texture:= Surface2Tex(tmpsurf, true); |
334 Texture:= Surface2Tex(tmpsurf, true); |
323 Texture^.Scale:= 2 |
335 Texture^.Scale:= 2 |
324 end |
336 end |
325 else |
337 else |
326 begin |
338 begin |
327 Texture:= Surface2Tex(tmpsurf, false); |
339 Texture:= Surface2Tex(tmpsurf, false); |
328 // HACK: We should include some sprite attribute to define the texture wrap directions |
340 // HACK: We should include some sprite attribute to define the texture wrap directions |
329 if ((ii = sprWater) or (ii = sprSDWater)) and ((cReducedQuality and (rq2DWater or rqClampLess)) = 0) then |
341 if ((ii = sprWater) or (ii = sprSDWater)) and ((cReducedQuality and (rq2DWater or rqClampLess)) = 0) then |
330 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
342 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
331 end; |
343 end; |
332 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_PRIORITY, priority); |
344 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_PRIORITY, priority); |
333 if saveSurf then |
345 // This should maybe be flagged. It wastes quite a bit of memory. |
334 Surface:= tmpsurf else SDL_FreeSurface(tmpsurf) |
346 if not reload then |
|
347 begin |
|
348 {$IFNDEF DARWIN & WIN32} |
|
349 if saveSurf then Surface:= tmpsurf else SDL_FreeSurface(tmpsurf) |
|
350 {$ELSE} |
|
351 Surface:= tmpsurf |
|
352 {$ENDIF} |
|
353 end |
335 end |
354 end |
336 else |
355 else |
337 Surface:= nil |
356 Surface:= nil |
338 end; |
357 end; |
339 |
358 |
382 {$IFDEF SDL_IMAGE_NEWER} |
401 {$IFDEF SDL_IMAGE_NEWER} |
383 IMG_Quit(); |
402 IMG_Quit(); |
384 {$ENDIF} |
403 {$ENDIF} |
385 end; |
404 end; |
386 |
405 |
387 procedure StoreRelease; |
406 procedure StoreRelease(reload: boolean); |
388 var ii: TSprite; |
407 var ii: TSprite; |
389 ai: TAmmoType; |
408 ai: TAmmoType; |
390 i, t: LongInt; |
409 i, t: LongInt; |
391 begin |
410 begin |
392 for ii:= Low(TSprite) to High(TSprite) do |
411 for ii:= Low(TSprite) to High(TSprite) do |
393 begin |
412 begin |
394 FreeTexture(SpritesData[ii].Texture); |
413 FreeTexture(SpritesData[ii].Texture); |
395 SpritesData[ii].Texture:= nil; |
414 SpritesData[ii].Texture:= nil; |
396 if SpritesData[ii].Surface <> nil then |
415 if (SpritesData[ii].Surface <> nil) and not reload then |
|
416 begin |
397 SDL_FreeSurface(SpritesData[ii].Surface); |
417 SDL_FreeSurface(SpritesData[ii].Surface); |
398 SpritesData[ii].Surface:= nil; |
418 SpritesData[ii].Surface:= nil |
|
419 end |
399 end; |
420 end; |
400 SDL_FreeSurface(MissionIcons); |
421 SDL_FreeSurface(MissionIcons); |
401 FreeTexture(ropeIconTex); |
422 FreeTexture(ropeIconTex); |
|
423 ropeIconTex:= nil; |
402 FreeTexture(HHTexture); |
424 FreeTexture(HHTexture); |
|
425 HHTexture:= nil; |
403 FreeTexture(PauseTexture); |
426 FreeTexture(PauseTexture); |
|
427 PauseTexture:= nil; |
404 FreeTexture(ConfirmTexture); |
428 FreeTexture(ConfirmTexture); |
|
429 ConfirmTexture:= nil; |
405 FreeTexture(SyncTexture); |
430 FreeTexture(SyncTexture); |
|
431 SyncTexture:= nil; |
406 // free all ammo name textures |
432 // free all ammo name textures |
407 for ai:= Low(TAmmoType) to High(TAmmoType) do |
433 for ai:= Low(TAmmoType) to High(TAmmoType) do |
|
434 begin |
408 FreeTexture(Ammoz[ai].NameTex); |
435 FreeTexture(Ammoz[ai].NameTex); |
|
436 Ammoz[ai].NameTex:= nil |
|
437 end; |
409 |
438 |
410 // free all count textures |
439 // free all count textures |
411 for i:= Low(CountTexz) to High(CountTexz) do |
440 for i:= Low(CountTexz) to High(CountTexz) do |
|
441 begin |
412 FreeTexture(CountTexz[i]); |
442 FreeTexture(CountTexz[i]); |
|
443 CountTexz[i]:= nil |
|
444 end; |
413 |
445 |
414 // free all team and hedgehog textures |
446 // free all team and hedgehog textures |
415 for t:= 0 to Pred(TeamsCount) do |
447 for t:= 0 to Pred(TeamsCount) do |
416 begin |
448 begin |
417 if TeamsArray[t] <> nil then |
449 if TeamsArray[t] <> nil then |
418 begin |
450 begin |
419 FreeTexture(TeamsArray[t]^.NameTagTex); |
451 FreeTexture(TeamsArray[t]^.NameTagTex); |
|
452 TeamsArray[t]^.NameTagTex:= nil; |
420 FreeTexture(TeamsArray[t]^.CrosshairTex); |
453 FreeTexture(TeamsArray[t]^.CrosshairTex); |
|
454 TeamsArray[t]^.CrosshairTex:= nil; |
421 FreeTexture(TeamsArray[t]^.GraveTex); |
455 FreeTexture(TeamsArray[t]^.GraveTex); |
|
456 TeamsArray[t]^.GraveTex:= nil; |
422 FreeTexture(TeamsArray[t]^.HealthTex); |
457 FreeTexture(TeamsArray[t]^.HealthTex); |
|
458 TeamsArray[t]^.HealthTex:= nil; |
423 FreeTexture(TeamsArray[t]^.AIKillsTex); |
459 FreeTexture(TeamsArray[t]^.AIKillsTex); |
|
460 TeamsArray[t]^.AIKillsTex:= nil; |
424 FreeTexture(TeamsArray[t]^.FlagTex); |
461 FreeTexture(TeamsArray[t]^.FlagTex); |
|
462 TeamsArray[t]^.FlagTex:= nil; |
425 for i:= 0 to cMaxHHIndex do |
463 for i:= 0 to cMaxHHIndex do |
426 begin |
464 begin |
427 FreeTexture(TeamsArray[t]^.Hedgehogs[i].NameTagTex); |
465 FreeTexture(TeamsArray[t]^.Hedgehogs[i].NameTagTex); |
|
466 TeamsArray[t]^.Hedgehogs[i].NameTagTex:= nil; |
428 FreeTexture(TeamsArray[t]^.Hedgehogs[i].HealthTagTex); |
467 FreeTexture(TeamsArray[t]^.Hedgehogs[i].HealthTagTex); |
|
468 TeamsArray[t]^.Hedgehogs[i].HealthTagTex:= nil; |
429 FreeTexture(TeamsArray[t]^.Hedgehogs[i].HatTex); |
469 FreeTexture(TeamsArray[t]^.Hedgehogs[i].HatTex); |
|
470 TeamsArray[t]^.Hedgehogs[i].HatTex:= nil; |
430 end; |
471 end; |
431 end; |
472 end; |
432 end; |
473 end; |
433 {$IFNDEF S3D_DISABLED} |
474 {$IFNDEF S3D_DISABLED} |
434 if (cStereoMode = smHorizontal) or (cStereoMode = smVertical) or (cStereoMode = smAFR) then |
475 if (cStereoMode = smHorizontal) or (cStereoMode = smVertical) or (cStereoMode = smAFR) then |