ld21-ESCape/src/Functions.pbi
2011-08-22 10:10:20 +02:00

1 line
5.8 KiB
Plaintext

; This file holds all the functions If it gets too big,
; we can split it in categories
; *****************************************************************************
; * Tileset
Procedure InitGraphics()
GFXLogo = LoadSprite(#PB_Any, "../data/gfx/logo.bmp")
GFXTileset = LoadSprite(#PB_Any, "../data/gfx/tileset01.bmp")
EndProcedure
; TODO: Make this dynamic
Procedure InitTileset()
Define i.i, j.i, count.i
count = 0
For i=0 To 5
For j=0 To 5
Tileset(count)\ID = CopySprite(GFXTileset, #PB_Any)
ClipSprite(Tileset(count)\ID, #TILE_SIZE*j, #TILE_SIZE*i, #TILE_SIZE, #TILE_SIZE)
Tileset(count)\Type = #TILESET_TYPE_FLOOR
Select count
Case 0
Tileset(count)\Type = #TILESET_TYPE_PLAYER
Case 2
Tileset(count)\Type = #TILESET_TYPE_WALL
Case 3
Tileset(count)\Type = #TILESET_TYPE_SOLID
Case 4
Tileset(count)\Type = #TILESET_TYPE_GRASS
EndSelect
count+1
Next
Next
EndProcedure
Procedure LoadMap(Filename.s)
; Extract the map data from the XML file
If LoadXML(0, Filename) And XMLStatus(0) = #PB_XML_Success
Define *Node.i = XMLNodeFromPath(MainXMLNode(0), "/map/layer/data")
Define MapData.s = GetXMLNodeText(*Node)
If CreateRegularExpression(0, "\d{1,2},?")
Dim Tiles.s(0)
Define NumFound.i = ExtractRegularExpression(0, MapData, Tiles())
Define i.i, X.i, Y.i
X = 0
Y = 0
CreateFile(0, "mapcheck.txt") ; File stuff for checking the map loader
For i=0 To NumFound-1
TileMap(X, Y)\TileNumber = Val(RTrim(Tiles(i), ","))-1
TileMap(X, Y)\X = X
TileMap(X, Y)\Y = Y
; Walls get 4 health
If TileMap(X, Y)\TileNumber = 2
TileMap(X, Y)\Health = 4
EndIf
WriteString(0, StrU(TileMap(X, Y)\TileNumber+1)+",")
If X = #MAP_WIDTH-1
X = 0
Y+1
WriteStringN(0, "") ; do new line
Else
X+1
EndIf
Next
CloseFile(0)
EndIf
EndIf
EndProcedure
; Shadowmap
Procedure CalculateShadow()
Define X.i, Y.i
Define MapX.i, MapY.i, Strength.i, Centercheck.i, CentercheckX.i, CentercheckY.i
For X.i=-#SHADOW_RADIUS To #SHADOW_RADIUS*2
For Y.i=-#SHADOW_RADIUS To #SHADOW_RADIUS*2
MapX = Player\X + X
MapY = Player\Y + Y
CentercheckX = X
If CentercheckX < 0
CentercheckX * -1
EndIf
CentercheckY = Y
If CentercheckY < 0
CentercheckY * -1
EndIf
If CentercheckX > CentercheckY
Centercheck = CentercheckX
Else
Centercheck = CentercheckY
EndIf
Centercheck = #SHADOW_RADIUS - Centercheck;
Strength = (255 / #SHADOW_RADIUS) * (Centercheck)
If MapX >= 0 And MapY >= 0
If ShadowMap(MapX, MapY)\Strength < Strength
ShadowMap(MapX, MapY)\Strength = Strength
EndIf
EndIf
Next
Next
EndProcedure
Procedure DrawShadowtile(strength.i, x.i, y.i)
Box(#TILE_SIZE*x, #TILE_SIZE*y, #TILE_SIZE, #TILE_SIZE, RGBA(0, 0, 0, 255-strength))
EndProcedure
Procedure GenerateShadowLayer()
Define X.i ,Y.i
CompilerSelect #PB_Compiler_OS
CompilerCase #PB_OS_Linux
ShadowOfDarkness = CreateImage(#PB_Any, 800, 600, 32|#PB_Image_Transparent)
StartDrawing(ImageOutput(ShadowOfDarkness))
CompilerDefault
StartDrawing(ScreenOutput())
CompilerEndSelect
DrawingMode(#PB_2DDrawing_AlphaBlend)
For X.i=0 To Cam\Width
For Y.i=0 To Cam\Height
DrawShadowtile(ShadowMap(X+Cam\X, Y+Cam\Y)\Strength, X, Y)
Next
Next
StopDrawing()
EndProcedure
Procedure DrawShadow()
CompilerSelect #PB_Compiler_OS
CompilerCase #PB_OS_Linux
StartDrawing(ScreenOutput())
DrawImage(ImageID(ShadowOfDarkness), 0, 0)
StopDrawing()
CompilerDefault
GenerateShadowLayer()
CompilerEndSelect
EndProcedure
; Map itself
Procedure DrawTile(number.i, x.i, y.i)
Define id.i
If number = #TILESET_TYPE_WALL And TileMap(x, y)\Health < 4
id = (17+4)-TileMap(x, y)\Health
Else
id = number
EndIf
DisplaySprite(Tileset(id)\ID, #TILE_SIZE*x, #TILE_SIZE*y)
EndProcedure
Procedure DrawMap()
Define X.i ,Y.i
For X.i=0 To Cam\Width
For Y.i=0 To Cam\Height
DrawTile(TileMap(X+Cam\X, Y+Cam\Y)\TileNumber, X, Y)
Next
Next
EndProcedure
Procedure TileIsType(type.i, X.i, Y.i)
Define istype.b
istype = #False
If Tileset(TileMap(X, Y)\TileNumber)\Type = type
istype = #True
EndIf
ProcedureReturn istype
EndProcedure
; The player
Procedure DrawPlayer()
DrawTile(Player\TileNumber, Player\X-Cam\X, Player\Y-Cam\Y)
EndProcedure
; We need a HUD, hell yeah!
Procedure DrawHUD()
EndProcedure
; If the player starts diffin, some noise wave will be generated
Procedure CalculateNoiseWave(*Noise.NoiseWave)
Define Size.i
Define MaxSize.i = *Noise\Size
For Size=0 To MaxSize
*Noise\Size = Size
Delay(30)
Next
*Noise\Size = 0
EndProcedure
Procedure DrawPlayerNoise()
Define Visibility.i = 255
Select *PlayerNoise\Size
Case 1,2,3
Visibility = 80
Case 4,5,6
Visibility = 40
Case 7,8
Visibility = 20
Case 9
Visibility = 10
Case 10
Visibility = 0
EndSelect
DrawingMode(#PB_2DDrawing_Outlined)
Ellipse(*PlayerNoise\X*#TILE_SIZE+10, *PlayerNoise\Y*#TILE_SIZE+10, *PlayerNoise\Size*10, *PlayerNoise\Size*10, RGBA(255, 0, 0, Visibility))
EndProcedure
; *****************************************************************************
; * Menu
Procedure Menu_GotoCurrent()
If *ActiveMenu\Entries()\Selected <> #True
FirstElement(*ActiveMenu\Entries())
ForEach *ActiveMenu\Entries()
If *ActiveMenu\Entries()\Selected = #True
Break
EndIf
Next
EndIf
EndProcedure