diff --git a/data/gfx/tileset01.bmp b/data/gfx/tileset01.bmp index 15bbaff..0e9b8b8 100644 Binary files a/data/gfx/tileset01.bmp and b/data/gfx/tileset01.bmp differ diff --git a/src/Draw.pbi b/src/Draw.pbi index 20555e8..359d319 100644 --- a/src/Draw.pbi +++ b/src/Draw.pbi @@ -43,4 +43,4 @@ Procedure DrawRunningGame() DrawPlayer() DrawHUD() -EndProcedure \ No newline at end of file +EndProcedure diff --git a/src/Events.pbi b/src/Events.pbi index 0b3a216..b9b5521 100644 --- a/src/Events.pbi +++ b/src/Events.pbi @@ -99,4 +99,42 @@ Procedure HandleEventRunningGame() Cam\Y + 1 EndIf EndIf + + + ; Digging! + If KeyboardReleased(#PB_Key_Escape) + Define TargetX.i, TargetY.i + + ; Determine the pixel to destroy + If Player\Direction = #PLAYER_DIR_LEFT And Player\X < #MAP_WIDTH + TargetX = Player\X + 1 + TargetY = Player\Y + EndIf + + If Player\Direction = #PLAYER_DIR_RIGHT And Player\X > 0 + TargetX = Player\X - 1 + TargetY = Player\Y + EndIf + + If Player\Direction = #PLAYER_DIR_UP And Player\Y > 0 + TargetX = Player\X + TargetY = Player\Y -1 + EndIf + + If Player\Direction = #PLAYER_DIR_DOWN And Player\X < #MAP_HEIGHT + TargetX = Player\X + TargetY = Player\Y + 1 + EndIf + + ; Do something with the block + If TileIsType(#TILESET_TYPE_WALL, TargetX, TargetY) + TileMap(TargetX, TargetY)\Health - 1 + + If TileMap(TargetX, TargetY)\Health = -1 + TileMap(TargetX, TargetY)\TileNumber = #TILESET_TYPE_FLOOR + EndIf + + DrawNoiseWave(TargetX, TargetY) + EndIf + EndIf EndProcedure \ No newline at end of file diff --git a/src/Functions.pbi b/src/Functions.pbi index eede4ee..08ff1d8 100644 --- a/src/Functions.pbi +++ b/src/Functions.pbi @@ -1 +1 @@ -; 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 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) DisplaySprite(Tileset(number)\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 ; and .. ; ***************************************************************************** ; * 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 \ No newline at end of file +; 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 DrawNoiseWave(X.i, Y.i) 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 \ No newline at end of file diff --git a/src/Structs.pbi b/src/Structs.pbi index 34084eb..679ab85 100644 --- a/src/Structs.pbi +++ b/src/Structs.pbi @@ -50,6 +50,8 @@ Structure Player Direction.i EndStructure + + Structure Shadow X.i Y.i