From ea1e90b035187d21d8686a839639207ff642c929 Mon Sep 17 00:00:00 2001 From: Song Minjae Date: Sun, 18 Dec 2016 16:18:41 +0900 Subject: [PATCH] working platform rendering Former-commit-id: ec50eeb7f6fbf5799d197a88b036f60e51693336 Former-commit-id: 4172ffc733b8df89bc839b59476c57ac6bf3572d --- src/net/torvald/terrarum/Terrarum.kt | 8 +- .../torvald/terrarum/mapdrawer/MapCamera.kt | 345 ++++++++++-------- .../terrarum/tileproperties/TilePropCSV.kt | 2 +- 3 files changed, 198 insertions(+), 157 deletions(-) diff --git a/src/net/torvald/terrarum/Terrarum.kt b/src/net/torvald/terrarum/Terrarum.kt index e45139890..651008b1f 100644 --- a/src/net/torvald/terrarum/Terrarum.kt +++ b/src/net/torvald/terrarum/Terrarum.kt @@ -9,6 +9,7 @@ import net.torvald.JsonWriter import net.torvald.imagefont.TinyAlphNum import org.lwjgl.input.Controllers import org.lwjgl.opengl.GL11 +import org.lwjgl.opengl.GL20 import org.newdawn.slick.* import org.newdawn.slick.state.StateBasedGame import java.io.File @@ -316,12 +317,7 @@ constructor(gamename: String) : StateBasedGame(gamename) { private fun createDirs() { val dirs = arrayOf(File(defaultSaveDir)) - - for (d in dirs) { - if (!d.exists()) { - d.mkdirs() - } - } + dirs.forEach { if (!it.exists()) it.mkdirs() } } @Throws(IOException::class) diff --git a/src/net/torvald/terrarum/mapdrawer/MapCamera.kt b/src/net/torvald/terrarum/mapdrawer/MapCamera.kt index 4a4359aae..42a445c6a 100644 --- a/src/net/torvald/terrarum/mapdrawer/MapCamera.kt +++ b/src/net/torvald/terrarum/mapdrawer/MapCamera.kt @@ -64,48 +64,48 @@ object MapCamera { * These are the tiles that only connects to itself, will not connect to colour variants */ val TILES_CONNECT_SELF = arrayOf( - Tile.ICE_MAGICAL - , Tile.GLASS_CRUDE - , Tile.GLASS_CLEAN - , Tile.ILLUMINATOR_BLACK - , Tile.ILLUMINATOR_BLUE - , Tile.ILLUMINATOR_BROWN - , Tile.ILLUMINATOR_CYAN - , Tile.ILLUMINATOR_FUCHSIA - , Tile.ILLUMINATOR_GREEN - , Tile.ILLUMINATOR_GREEN_DARK - , Tile.ILLUMINATOR_GREY_DARK - , Tile.ILLUMINATOR_GREY_LIGHT - , Tile.ILLUMINATOR_GREY_MED - , Tile.ILLUMINATOR_ORANGE - , Tile.ILLUMINATOR_PURPLE - , Tile.ILLUMINATOR_RED - , Tile.ILLUMINATOR_TAN - , Tile.ILLUMINATOR_WHITE - , Tile.ILLUMINATOR_YELLOW - , Tile.ILLUMINATOR_BLACK_OFF - , Tile.ILLUMINATOR_BLUE_OFF - , Tile.ILLUMINATOR_BROWN_OFF - , Tile.ILLUMINATOR_CYAN_OFF - , Tile.ILLUMINATOR_FUCHSIA_OFF - , Tile.ILLUMINATOR_GREEN_OFF - , Tile.ILLUMINATOR_GREEN_DARK_OFF - , Tile.ILLUMINATOR_GREY_DARK_OFF - , Tile.ILLUMINATOR_GREY_LIGHT_OFF - , Tile.ILLUMINATOR_GREY_MED_OFF - , Tile.ILLUMINATOR_ORANGE_OFF - , Tile.ILLUMINATOR_PURPLE_OFF - , Tile.ILLUMINATOR_RED_OFF - , Tile.ILLUMINATOR_TAN_OFF - , Tile.ILLUMINATOR_WHITE_OFF - , Tile.ILLUMINATOR_YELLOW - , Tile.SANDSTONE - , Tile.SANDSTONE_BLACK - , Tile.SANDSTONE_DESERT - , Tile.SANDSTONE_RED - , Tile.SANDSTONE_WHITE - , Tile.SANDSTONE_GREEN - , Tile.DAYLIGHT_CAPACITOR + Tile.ICE_MAGICAL, + Tile.GLASS_CRUDE, + Tile.GLASS_CLEAN, + Tile.ILLUMINATOR_BLACK, + Tile.ILLUMINATOR_BLUE, + Tile.ILLUMINATOR_BROWN, + Tile.ILLUMINATOR_CYAN, + Tile.ILLUMINATOR_FUCHSIA, + Tile.ILLUMINATOR_GREEN, + Tile.ILLUMINATOR_GREEN_DARK, + Tile.ILLUMINATOR_GREY_DARK, + Tile.ILLUMINATOR_GREY_LIGHT, + Tile.ILLUMINATOR_GREY_MED, + Tile.ILLUMINATOR_ORANGE, + Tile.ILLUMINATOR_PURPLE, + Tile.ILLUMINATOR_RED, + Tile.ILLUMINATOR_TAN, + Tile.ILLUMINATOR_WHITE, + Tile.ILLUMINATOR_YELLOW, + Tile.ILLUMINATOR_BLACK_OFF, + Tile.ILLUMINATOR_BLUE_OFF, + Tile.ILLUMINATOR_BROWN_OFF, + Tile.ILLUMINATOR_CYAN_OFF, + Tile.ILLUMINATOR_FUCHSIA_OFF, + Tile.ILLUMINATOR_GREEN_OFF, + Tile.ILLUMINATOR_GREEN_DARK_OFF, + Tile.ILLUMINATOR_GREY_DARK_OFF, + Tile.ILLUMINATOR_GREY_LIGHT_OFF, + Tile.ILLUMINATOR_GREY_MED_OFF, + Tile.ILLUMINATOR_ORANGE_OFF, + Tile.ILLUMINATOR_PURPLE_OFF, + Tile.ILLUMINATOR_RED_OFF, + Tile.ILLUMINATOR_TAN_OFF, + Tile.ILLUMINATOR_WHITE_OFF, + Tile.ILLUMINATOR_YELLOW, + Tile.SANDSTONE, + Tile.SANDSTONE_BLACK, + Tile.SANDSTONE_DESERT, + Tile.SANDSTONE_RED, + Tile.SANDSTONE_WHITE, + Tile.SANDSTONE_GREEN, + Tile.DAYLIGHT_CAPACITOR ) /** @@ -113,82 +113,86 @@ object MapCamera { * It holds different shading rule to discriminate with group 01, index 0 is middle tile. */ val TILES_CONNECT_MUTUAL = arrayOf( - Tile.STONE - , Tile.STONE_QUARRIED - , Tile.STONE_TILE_WHITE - , Tile.STONE_BRICKS - , Tile.DIRT - , Tile.GRASS - , Tile.PLANK_BIRCH - , Tile.PLANK_BLOODROSE - , Tile.PLANK_EBONY - , Tile.PLANK_NORMAL - , Tile.SAND - , Tile.SAND_WHITE - , Tile.SAND_RED - , Tile.SAND_DESERT - , Tile.SAND_BLACK - , Tile.SAND_GREEN - , Tile.GRAVEL - , Tile.GRAVEL_GREY - , Tile.SNOW - , Tile.ICE_NATURAL - , Tile.ORE_COPPER - , Tile.ORE_IRON - , Tile.ORE_GOLD - , Tile.ORE_SILVER - , Tile.ORE_ILMENITE - , Tile.ORE_AURICHALCUM + Tile.STONE, + Tile.STONE_QUARRIED, + Tile.STONE_TILE_WHITE, + Tile.STONE_BRICKS, + Tile.DIRT, + Tile.GRASS, + Tile.PLANK_BIRCH, + Tile.PLANK_BLOODROSE, + Tile.PLANK_EBONY, + Tile.PLANK_NORMAL, + Tile.SAND, + Tile.SAND_WHITE, + Tile.SAND_RED, + Tile.SAND_DESERT, + Tile.SAND_BLACK, + Tile.SAND_GREEN, + Tile.GRAVEL, + Tile.GRAVEL_GREY, + Tile.SNOW, + Tile.ICE_NATURAL, + Tile.ORE_COPPER, + Tile.ORE_IRON, + Tile.ORE_GOLD, + Tile.ORE_SILVER, + Tile.ORE_ILMENITE, + Tile.ORE_AURICHALCUM, - , Tile.WATER - , Tile.WATER_1 - , Tile.WATER_2 - , Tile.WATER_3 - , Tile.WATER_4 - , Tile.WATER_5 - , Tile.WATER_6 - , Tile.WATER_7 - , Tile.WATER_8 - , Tile.WATER_9 - , Tile.WATER_10 - , Tile.WATER_11 - , Tile.WATER_12 - , Tile.WATER_13 - , Tile.WATER_14 - , Tile.WATER_15 - , Tile.LAVA - , Tile.LAVA_1 - , Tile.LAVA_2 - , Tile.LAVA_3 - , Tile.LAVA_4 - , Tile.LAVA_5 - , Tile.LAVA_6 - , Tile.LAVA_7 - , Tile.LAVA_8 - , Tile.LAVA_9 - , Tile.LAVA_10 - , Tile.LAVA_11 - , Tile.LAVA_12 - , Tile.LAVA_13 - , Tile.LAVA_14 - , Tile.LAVA_15 + Tile.WATER, + Tile.WATER_1, + Tile.WATER_2, + Tile.WATER_3, + Tile.WATER_4, + Tile.WATER_5, + Tile.WATER_6, + Tile.WATER_7, + Tile.WATER_8, + Tile.WATER_9, + Tile.WATER_10, + Tile.WATER_11, + Tile.WATER_12, + Tile.WATER_13, + Tile.WATER_14, + Tile.WATER_15, + Tile.LAVA, + Tile.LAVA_1, + Tile.LAVA_2, + Tile.LAVA_3, + Tile.LAVA_4, + Tile.LAVA_5, + Tile.LAVA_6, + Tile.LAVA_7, + Tile.LAVA_8, + Tile.LAVA_9, + Tile.LAVA_10, + Tile.LAVA_11, + Tile.LAVA_12, + Tile.LAVA_13, + Tile.LAVA_14, + Tile.LAVA_15 ) /** * Torches, levers, switches, ... */ val TILES_WALL_STICKER = arrayOf( - Tile.TORCH - , Tile.TORCH_FROST - , Tile.TORCH_OFF - , Tile.TORCH_FROST_OFF + Tile.TORCH, + Tile.TORCH_FROST, + Tile.TORCH_OFF, + Tile.TORCH_FROST_OFF ) /** * platforms, ... */ - val TILES_WALL_STICKER_CONNECT_SELF = arrayOf( - + val TILES_WALL_STICKER_CONNECT_SELF = arrayOf( + Tile.PLATFORM_BIRCH, + Tile.PLATFORM_BLOODROSE, + Tile.PLATFORM_EBONY, + Tile.PLATFORM_STONE, + Tile.PLATFORM_WOODEN ) /** @@ -197,38 +201,38 @@ object MapCamera { * i.e. red hues get lost if you dive into the water */ val TILES_BLEND_MUL = arrayOf( - Tile.WATER - , Tile.WATER_1 - , Tile.WATER_2 - , Tile.WATER_3 - , Tile.WATER_4 - , Tile.WATER_5 - , Tile.WATER_6 - , Tile.WATER_7 - , Tile.WATER_8 - , Tile.WATER_9 - , Tile.WATER_10 - , Tile.WATER_11 - , Tile.WATER_12 - , Tile.WATER_13 - , Tile.WATER_14 - , Tile.WATER_15 - , Tile.LAVA - , Tile.LAVA_1 - , Tile.LAVA_2 - , Tile.LAVA_3 - , Tile.LAVA_4 - , Tile.LAVA_5 - , Tile.LAVA_6 - , Tile.LAVA_7 - , Tile.LAVA_8 - , Tile.LAVA_9 - , Tile.LAVA_10 - , Tile.LAVA_11 - , Tile.LAVA_12 - , Tile.LAVA_13 - , Tile.LAVA_14 - , Tile.LAVA_15 + Tile.WATER, + Tile.WATER_1, + Tile.WATER_2, + Tile.WATER_3, + Tile.WATER_4, + Tile.WATER_5, + Tile.WATER_6, + Tile.WATER_7, + Tile.WATER_8, + Tile.WATER_9, + Tile.WATER_10, + Tile.WATER_11, + Tile.WATER_12, + Tile.WATER_13, + Tile.WATER_14, + Tile.WATER_15, + Tile.LAVA, + Tile.LAVA_1, + Tile.LAVA_2, + Tile.LAVA_3, + Tile.LAVA_4, + Tile.LAVA_5, + Tile.LAVA_6, + Tile.LAVA_7, + Tile.LAVA_8, + Tile.LAVA_9, + Tile.LAVA_10, + Tile.LAVA_11, + Tile.LAVA_12, + Tile.LAVA_13, + Tile.LAVA_14, + Tile.LAVA_15 ) fun update(gc: GameContainer, delta_t: Int) { @@ -238,11 +242,6 @@ object MapCamera { renderHeight = FastMath.ceil(Terrarum.HEIGHT / Terrarum.ingame.screenZoom) // position - (WH / 2) - /*cameraX = Math.round(FastMath.clamp( - player.hitbox.centeredX.toFloat() - renderWidth / 2, TILE_SIZE.toFloat(), world.width * TILE_SIZE - renderWidth - TILE_SIZE.toFloat())) - cameraY = Math.round(FastMath.clamp( - player.hitbox.centeredY.toFloat() - renderHeight / 2, TILE_SIZE.toFloat(), world.height * TILE_SIZE - renderHeight - TILE_SIZE.toFloat())) -*/ cameraX = Math.round( // X only: ROUNDWORLD implementation player.hitbox.centeredX.toFloat() - renderWidth / 2) cameraY = Math.round(FastMath.clamp( @@ -313,13 +312,19 @@ object MapCamera { ) { val nearbyTilesInfo: Int - if (MapCamera.isWallSticker(thisTile)) { - nearbyTilesInfo = MapCamera.getNearbyTilesInfoWallSticker(x, y) - } else if (MapCamera.isConnectMutual(thisTile)) { - nearbyTilesInfo = MapCamera.getNearbyTilesInfoNonSolid(x, y, mode) - } else if (MapCamera.isConnectSelf(thisTile)) { - nearbyTilesInfo = MapCamera.getNearbyTilesInfo(x, y, mode, thisTile) - } else { + if (isPlatform(thisTile)) { + nearbyTilesInfo = getNearbyTilesInfoPlatform(x, y) + } + else if (isWallSticker(thisTile)) { + nearbyTilesInfo = getNearbyTilesInfoWallSticker(x, y) + } + else if (isConnectMutual(thisTile)) { + nearbyTilesInfo = getNearbyTilesInfoNonSolid(x, y, mode) + } + else if (isConnectSelf(thisTile)) { + nearbyTilesInfo = getNearbyTilesInfo(x, y, mode, thisTile) + } + else { nearbyTilesInfo = 0 } @@ -435,6 +440,46 @@ object MapCamera { } } + fun getNearbyTilesInfoPlatform(x: Int, y: Int): Int { + val nearbyTiles = IntArray(4) + nearbyTiles[NEARBY_TILE_KEY_LEFT] = world.getTileFrom(TERRAIN, x - 1, y) ?: 4096 + nearbyTiles[NEARBY_TILE_KEY_RIGHT] = world.getTileFrom(TERRAIN, x + 1, y) ?: 4096 + + if ((TileCodex[nearbyTiles[NEARBY_TILE_KEY_LEFT]].isSolid && + TileCodex[nearbyTiles[NEARBY_TILE_KEY_RIGHT]].isSolid) || + isPlatform(nearbyTiles[NEARBY_TILE_KEY_LEFT]) && + isPlatform(nearbyTiles[NEARBY_TILE_KEY_RIGHT])) // LR solid || LR platform + return 0 + else if (TileCodex[nearbyTiles[NEARBY_TILE_KEY_LEFT]].isSolid && + !isPlatform(nearbyTiles[NEARBY_TILE_KEY_LEFT]) && + !TileCodex[nearbyTiles[NEARBY_TILE_KEY_RIGHT]].isSolid && + !isPlatform(nearbyTiles[NEARBY_TILE_KEY_RIGHT])) // L solid and not platform && R not solid and not platform + return 4 + else if (TileCodex[nearbyTiles[NEARBY_TILE_KEY_RIGHT]].isSolid && + !isPlatform(nearbyTiles[NEARBY_TILE_KEY_RIGHT]) && + !TileCodex[nearbyTiles[NEARBY_TILE_KEY_LEFT]].isSolid && + !isPlatform(nearbyTiles[NEARBY_TILE_KEY_LEFT])) // R solid and not platform && L not solid and nto platform + return 6 + else if (TileCodex[nearbyTiles[NEARBY_TILE_KEY_LEFT]].isSolid && + !isPlatform(nearbyTiles[NEARBY_TILE_KEY_LEFT])) // L solid && L not platform + return 3 + else if (TileCodex[nearbyTiles[NEARBY_TILE_KEY_RIGHT]].isSolid && + !isPlatform(nearbyTiles[NEARBY_TILE_KEY_RIGHT])) // R solid && R not platform + return 5 + else if ((TileCodex[nearbyTiles[NEARBY_TILE_KEY_LEFT]].isSolid || + isPlatform(nearbyTiles[NEARBY_TILE_KEY_LEFT])) && + !TileCodex[nearbyTiles[NEARBY_TILE_KEY_RIGHT]].isSolid && + !isPlatform(nearbyTiles[NEARBY_TILE_KEY_RIGHT])) // L solid or platform && R not solid and not platform + return 1 + else if ((TileCodex[nearbyTiles[NEARBY_TILE_KEY_RIGHT]].isSolid || + isPlatform(nearbyTiles[NEARBY_TILE_KEY_RIGHT])) && + !TileCodex[nearbyTiles[NEARBY_TILE_KEY_LEFT]].isSolid && + !isPlatform(nearbyTiles[NEARBY_TILE_KEY_LEFT])) // R solid or platform && L not solid and not platform + return 2 + else + return 7 + } + private fun drawTile(mode: Int, tilewisePosX: Int, tilewisePosY: Int, sheetX: Int, sheetY: Int) { tilesetBook[mode].renderInUse( FastMath.floor((tilewisePosX * TILE_SIZE).toFloat()), diff --git a/src/net/torvald/terrarum/tileproperties/TilePropCSV.kt b/src/net/torvald/terrarum/tileproperties/TilePropCSV.kt index 0b8cfc41a..c1e30f5ec 100644 --- a/src/net/torvald/terrarum/tileproperties/TilePropCSV.kt +++ b/src/net/torvald/terrarum/tileproperties/TilePropCSV.kt @@ -53,7 +53,7 @@ object TilePropCSV { "9"; "3";"TILE_ICE_CLEAR_MAGICAL" ; "33587232"; "25";"3720";"icex"; "0"; "1"; "1"; "19955770"; "9"; "3"; "0"; "0"; "8" "9"; "4";"TILE_GLASS_CRUDE" ; "3146755"; "1";"2500";"glas"; "0"; "1"; "1"; "0"; "9"; "4"; "0"; "0";"16" "9"; "5";"TILE_GLASS_CLEAN" ; "1049601"; "1";"2203";"glas"; "0"; "1"; "1"; "0"; "9"; "5"; "0"; "0";"16" - "10"; "0";"TILE_PLATFORM_STONE" ; "8396808"; "1"; "N/A";"wood"; "0"; "0"; "0"; "0"; "10"; "0"; "0"; "0";"16" + "10"; "0";"TILE_PLATFORM_STONE" ; "8396808"; "1"; "N/A";"rock"; "0"; "0"; "0"; "0"; "10"; "0"; "0"; "0";"16" "10"; "1";"TILE_PLATFORM_WOODEN" ; "8396808"; "1"; "N/A";"wood"; "0"; "0"; "0"; "0"; "10"; "1"; "0"; "0";"16" "10"; "2";"TILE_PLATFORM_EBONY" ; "8396808"; "1"; "N/A";"wood"; "0"; "0"; "0"; "0"; "10"; "2"; "0"; "0";"16" "10"; "3";"TILE_PLATFORM_BIRCH" ; "8396808"; "1"; "N/A";"wood"; "0"; "0"; "0"; "0"; "10"; "3"; "0"; "0";"16"