; 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) = CopySprite(GFXTileset, #PB_Any) ClipSprite(Tileset(count), #TILE_SIZE*j, #TILE_SIZE*i, #TILE_SIZE, #TILE_SIZE) 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 ;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, CentercheckX.i, CentercheckY.i For X.i=0 To #SHADOW_RADIUS*2 For Y.i=0 To #SHADOW_RADIUS*2 MapX = (Player\X-#SHADOW_RADIUS) + X MapY = (Player\Y-#SHADOW_RADIUS) + Y CentercheckX = X - #SHADOW_RADIUS If CentercheckX < 0 CentercheckX * -1 EndIf CentercheckX = 5-CentercheckX CentercheckY = Y - #SHADOW_RADIUS If CentercheckY < 0 CentercheckY * -1 EndIf CentercheckY = 5-CentercheckY If CentercheckX > CentercheckY CentercheckX = CentercheckY EndIf Strength = (255 / #SHADOW_RADIUS) * (CentercheckX+1) 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(Random(0), Random(0), Random(0), 255-strength)) EndProcedure Procedure DrawShadow() Define X.i ,Y.i StartDrawing(ScreenOutput()) ;ImageOutput(0) 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 ; Map itself Procedure DrawTile(number.i, x.i, y.i) DisplaySprite(Tileset(number), #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 ; 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 ; ***************************************************************************** ; * 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