From 7c3759e6d152c664da055ab3a89bb7e25097bd47 Mon Sep 17 00:00:00 2001 From: minjaesong Date: Sat, 2 Mar 2019 00:28:49 +0900 Subject: [PATCH] new blocksdrawer: works well with masktype 0 and 2 --- .../terrarum/worlddrawer/BlocksDrawerNew.kt | 306 ++++-------------- .../terrarum/worlddrawer/BlocksDrawer_old.kt | 8 +- .../terrarum/worlddrawer/CreateTileAtlas.kt | 14 +- work_files/dynamic_shape_2_0.pdf | 4 +- work_files/dynamic_shape_2_0.psd | 4 +- ...namic_shape_2_0_attachment_bits_array.xlsx | Bin 23788 -> 34219 bytes 6 files changed, 76 insertions(+), 260 deletions(-) diff --git a/src/net/torvald/terrarum/worlddrawer/BlocksDrawerNew.kt b/src/net/torvald/terrarum/worlddrawer/BlocksDrawerNew.kt index be1b7f164..63623e83b 100644 --- a/src/net/torvald/terrarum/worlddrawer/BlocksDrawerNew.kt +++ b/src/net/torvald/terrarum/worlddrawer/BlocksDrawerNew.kt @@ -14,6 +14,7 @@ import net.torvald.terrarum.modulebasegame.gameworld.GameWorldExtension import net.torvald.terrarum.modulebasegame.gameworld.WorldSimulator import net.torvald.terrarum.modulebasegame.gameworld.WorldTime import net.torvald.terrarum.utils.JsonWriter +import net.torvald.terrarum.worlddrawer.CreateTileAtlas.TILES_IN_X import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack import kotlin.math.roundToInt @@ -55,8 +56,6 @@ internal object BlocksDrawer { const val BREAKAGE_STEPS = 10 const val TILES_PER_BLOCK = PairedMapLayer.RANGE - const val BLOCKS_IN_ATLAS_X = 16 // assuming atlas size of 4096x4096 px - const val BLOCKS_IN_ATLAS_Y = 256 // assuming atlas size of 4096x4096 px val WALL = GameWorld.WALL val TERRAIN = GameWorld.TERRAIN @@ -136,13 +135,13 @@ internal object BlocksDrawer { else -> 0 } - val itemTerrainPixmap = Pixmap(16 * TILE_SIZE, 256 * TILE_SIZE, Pixmap.Format.RGBA8888) - val itemWallPixmap = Pixmap(16 * TILE_SIZE, 256 * TILE_SIZE, Pixmap.Format.RGBA8888) + val itemTerrainPixmap = Pixmap(16 * TILE_SIZE, TILES_IN_X * TILE_SIZE, Pixmap.Format.RGBA8888) + val itemWallPixmap = Pixmap(16 * TILE_SIZE, TILES_IN_X * TILE_SIZE, Pixmap.Format.RGBA8888) CreateTileAtlas.tags.toMap().forEach { t, u -> val tilePosFromAtlas = u.atlasStartingPosition + maskTypetoTileIDForItemImage(u.maskType) - val srcX = (tilePosFromAtlas % 256) * TILE_SIZE - val srcY = (tilePosFromAtlas / 256) * TILE_SIZE + val srcX = (tilePosFromAtlas % TILES_IN_X) * TILE_SIZE + val srcY = (tilePosFromAtlas / TILES_IN_X) * TILE_SIZE val destX = (t % 16) * TILE_SIZE val destY = (t / 16) * TILE_SIZE itemTerrainPixmap.drawPixmap(CreateTileAtlas.atlas, srcX, srcY, TILE_SIZE, TILE_SIZE, destX, destY, TILE_SIZE, TILE_SIZE) @@ -186,175 +185,8 @@ internal object BlocksDrawer { * * size of this LUT must be equal to 256. */ - private val connectLut = intArrayOf(17,1,17,1,2,3,2,14,17,1,17,1,2,3,2,14,9,7,9,7,4,5,4,35,9,7,9,7,16,37,16,15,17,1,17,1,2,3,2,14,17,1,17,1,2,3,2,14,9,7,9,7,4,5,4,35,9,7,9,7,16,37,16,15,8,10,8,10,0,12,0,43,8,10,8,10,0,12,0,43,11,13,11,13,6,20,6,34,11,13,11,13,36,33,36,46,8,10,8,10,0,12,0,43,8,10,8,10,0,12,0,43,30,42,30,42,38,26,38,18,30,42,30,42,23,40,23,31,17,1,17,1,2,3,2,14,17,1,17,1,2,3,2,14,9,7,9,7,4,5,4,35,9,7,9,7,16,37,16,15,17,1,17,1,2,3,2,14,17,1,17,1,2,3,2,14,9,7,9,7,4,5,4,35,9,7,9,7,16,37,16,15,8,28,8,28,0,41,0,21,8,28,8,28,0,41,0,21,11,44,11,44,6,27,6,45,11,44,11,44,36,19,36,32,8,28,8,28,0,41,0,21,8,28,8,28,0,41,0,21,30,29,30,29,38,39,38,25,30,29,30,29,23,24,23,22) - - /** - * Connectivity group 01 : artificial tiles - * It holds different shading rule to discriminate with group 02, index 0 is single tile. - * These are the tiles that only connects to itself, will not connect to colour variants - */ - private val TILES_CONNECT_SELF = hashSetOf( - Block.GLASS_CRUDE, - Block.GLASS_CLEAN, - Block.ILLUMINATOR_BLACK, - Block.ILLUMINATOR_BLUE, - Block.ILLUMINATOR_BROWN, - Block.ILLUMINATOR_CYAN, - Block.ILLUMINATOR_FUCHSIA, - Block.ILLUMINATOR_GREEN, - Block.ILLUMINATOR_GREEN_DARK, - Block.ILLUMINATOR_GREY_DARK, - Block.ILLUMINATOR_GREY_LIGHT, - Block.ILLUMINATOR_GREY_MED, - Block.ILLUMINATOR_ORANGE, - Block.ILLUMINATOR_PURPLE, - Block.ILLUMINATOR_RED, - Block.ILLUMINATOR_TAN, - Block.ILLUMINATOR_WHITE, - Block.ILLUMINATOR_YELLOW, - Block.ILLUMINATOR_BLACK_OFF, - Block.ILLUMINATOR_BLUE_OFF, - Block.ILLUMINATOR_BROWN_OFF, - Block.ILLUMINATOR_CYAN_OFF, - Block.ILLUMINATOR_FUCHSIA_OFF, - Block.ILLUMINATOR_GREEN_OFF, - Block.ILLUMINATOR_GREEN_DARK_OFF, - Block.ILLUMINATOR_GREY_DARK_OFF, - Block.ILLUMINATOR_GREY_LIGHT_OFF, - Block.ILLUMINATOR_GREY_MED_OFF, - Block.ILLUMINATOR_ORANGE_OFF, - Block.ILLUMINATOR_PURPLE_OFF, - Block.ILLUMINATOR_RED_OFF, - Block.ILLUMINATOR_TAN_OFF, - Block.ILLUMINATOR_WHITE_OFF, - Block.ILLUMINATOR_YELLOW_OFF, - Block.DAYLIGHT_CAPACITOR, - - Block.ORE_COPPER, - Block.ORE_IRON, - Block.ORE_GOLD, - Block.ORE_SILVER, - Block.ORE_ILMENITE, - Block.ORE_AURICHALCUM - ) - - /** - * To interact with external modules - */ - @JvmStatic fun addConnectSelf(blockID: Int): Boolean { - return TILES_CONNECT_SELF.add(blockID) - } - - /** - * Connectivity group 02 : natural tiles - * It holds different shading rule to discriminate with group 01, index 0 is middle tile. - */ - private val TILES_CONNECT_MUTUAL = hashSetOf( - Block.STONE, - Block.STONE_QUARRIED, - Block.STONE_TILE_WHITE, - Block.STONE_BRICKS, - Block.DIRT, - Block.GRASS, - Block.GRASSWALL, - Block.PLANK_BIRCH, - Block.PLANK_BLOODROSE, - Block.PLANK_EBONY, - Block.PLANK_NORMAL, - Block.SAND, - Block.SAND_WHITE, - Block.SAND_RED, - Block.SAND_DESERT, - Block.SAND_BLACK, - Block.SAND_GREEN, - Block.GRAVEL, - Block.GRAVEL_GREY, - Block.SNOW, - Block.ICE_NATURAL, - Block.ICE_MAGICAL, - - Block.SANDSTONE, - Block.SANDSTONE_BLACK, - Block.SANDSTONE_DESERT, - Block.SANDSTONE_RED, - Block.SANDSTONE_WHITE, - Block.SANDSTONE_GREEN - - /*lock.WATER, - Block.WATER_1, - Block.WATER_2, - Block.WATER_3, - Block.WATER_4, - Block.WATER_5, - Block.WATER_6, - Block.WATER_7, - Block.WATER_8, - Block.WATER_9, - Block.WATER_10, - Block.WATER_11, - Block.WATER_12, - Block.WATER_13, - Block.WATER_14, - Block.WATER_15, - Block.LAVA, - Block.LAVA_1, - Block.LAVA_2, - Block.LAVA_3, - Block.LAVA_4, - Block.LAVA_5, - Block.LAVA_6, - Block.LAVA_7, - Block.LAVA_8, - Block.LAVA_9, - Block.LAVA_10, - Block.LAVA_11, - Block.LAVA_12, - Block.LAVA_13, - Block.LAVA_14, - Block.LAVA_15*/ - ) - - /** - * To interact with external modules - */ - @JvmStatic fun addConnectMutual(blockID: Int): Boolean { - return TILES_CONNECT_MUTUAL.add(blockID) - } - - /** - * Torches, levers, switches, ... - */ - private val TILES_WALL_STICKER = hashSetOf( - Block.TORCH, - Block.TORCH_FROST, - Block.TORCH_OFF, - Block.TORCH_FROST_OFF - ) - - /** - * To interact with external modules - */ - @JvmStatic fun addWallSticker(blockID: Int): Boolean { - return TILES_WALL_STICKER.add(blockID) - } - - /** - * platforms, ... - */ - private val TILES_WALL_STICKER_CONNECT_SELF = hashSetOf( - Block.PLATFORM_BIRCH, - Block.PLATFORM_BLOODROSE, - Block.PLATFORM_EBONY, - Block.PLATFORM_STONE, - Block.PLATFORM_WOODEN - ) - - /** - * To interact with external modules - */ - @JvmStatic fun addWallStickerConnectSelf(blockID: Int): Boolean { - return TILES_WALL_STICKER_CONNECT_SELF.add(blockID) - } + private val connectLut47 = intArrayOf(17,1,17,1,2,3,2,14,17,1,17,1,2,3,2,14,9,7,9,7,4,5,4,35,9,7,9,7,16,37,16,15,17,1,17,1,2,3,2,14,17,1,17,1,2,3,2,14,9,7,9,7,4,5,4,35,9,7,9,7,16,37,16,15,8,10,8,10,0,12,0,43,8,10,8,10,0,12,0,43,11,13,11,13,6,20,6,34,11,13,11,13,36,33,36,46,8,10,8,10,0,12,0,43,8,10,8,10,0,12,0,43,30,42,30,42,38,26,38,18,30,42,30,42,23,45,23,31,17,1,17,1,2,3,2,14,17,1,17,1,2,3,2,14,9,7,9,7,4,5,4,35,9,7,9,7,16,37,16,15,17,1,17,1,2,3,2,14,17,1,17,1,2,3,2,14,9,7,9,7,4,5,4,35,9,7,9,7,16,37,16,15,8,28,8,28,0,41,0,21,8,28,8,28,0,41,0,21,11,44,11,44,6,27,6,40,11,44,11,44,36,19,36,32,8,28,8,28,0,41,0,21,8,28,8,28,0,41,0,21,30,29,30,29,38,39,38,25,30,29,30,29,23,24,23,22) + private val connectLut16 = intArrayOf(0,2,0,2,4,6,4,6,0,2,0,2,4,6,4,6,8,10,8,10,12,14,12,14,8,10,8,10,12,14,12,14,0,2,0,2,4,6,4,6,0,2,0,2,4,6,4,6,8,10,8,10,12,14,12,14,8,10,8,10,12,14,12,14,1,3,1,3,5,7,5,7,1,3,1,3,5,7,5,7,9,11,9,11,13,15,13,15,9,11,9,11,13,15,13,15,1,3,1,3,5,7,5,7,1,3,1,3,5,7,5,7,9,11,9,11,13,15,13,15,9,11,9,11,13,15,13,15,0,2,0,2,4,6,4,6,0,2,0,2,4,6,4,6,8,10,8,10,12,14,12,14,8,10,8,10,12,14,12,14,0,2,0,2,4,6,4,6,0,2,0,2,4,6,4,6,8,10,8,10,12,14,12,14,8,10,8,10,12,14,12,14,1,3,1,3,5,7,5,7,1,3,1,3,5,7,5,7,9,11,9,11,13,15,13,15,9,11,9,11,13,15,13,15,1,3,1,3,5,7,5,7,1,3,1,3,5,7,5,7,9,11,9,11,13,15,13,15,9,11,9,11,13,15,13,15) /** * Tiles that half-transparent and has hue @@ -444,7 +276,7 @@ internal object BlocksDrawer { if (this.amount >= WorldSimulator.FLUID_MIN_MASS) { val fluidLevel = this.amount.coerceIn(0f,1f).times(PairedMapLayer.RANGE - 1).roundToInt() - return fluidLevel * BLOCKS_IN_ATLAS_X + fluidNum + return fluidLevel * 16 + fluidNum } else { return 0 @@ -494,7 +326,7 @@ internal object BlocksDrawer { // draw a tile - try { + if (thisTile != null) try { val nearbyTilesInfo = if (mode == FLUID) { getNearbyTilesInfoFluids(x, y) } @@ -505,18 +337,27 @@ internal object BlocksDrawer { getNearbyTilesInfoWallSticker(x, y) } else if (isConnectMutual(thisTile)) { - getNearbyTilesInfoNonSolid(x, y, mode) + getNearbyTilesInfoConMutual(x, y, mode) } else if (isConnectSelf(thisTile)) { - getNearbyTilesInfo(x, y, mode, thisTile) + getNearbyTilesInfoConSelf(x, y, mode, thisTile) } else { 0 } + val renderTag = CreateTileAtlas.getRenderTag(thisTile) + val tileNumberBase = renderTag.atlasStartingPosition + val tileNumber = tileNumberBase + when (renderTag.maskType) { + CreateTileAtlas.RenderTag.MASK_NA -> 0 + CreateTileAtlas.RenderTag.MASK_16 -> connectLut16[nearbyTilesInfo] + CreateTileAtlas.RenderTag.MASK_47 -> connectLut47[nearbyTilesInfo] + CreateTileAtlas.RenderTag.MASK_TORCH, CreateTileAtlas.RenderTag.MASK_PLATFORM -> nearbyTilesInfo + else -> throw IllegalArgumentException("Unknown mask type: ${renderTag.maskType}") + } - val thisTileX = TILES_PER_BLOCK * ((thisTile ?: 0) % BLOCKS_IN_ATLAS_X) + nearbyTilesInfo - val thisTileY = (thisTile ?: 0) / BLOCKS_IN_ATLAS_X + val thisTileX = tileNumber % TILES_IN_X + val thisTileY = tileNumber / TILES_IN_X val breakage = if (mode == TERRAIN) world.getTerrainDamage(x, y) else world.getWallDamage(x, y) val maxHealth = BlockCodex[world.getTileFromTerrain(x, y)].strength @@ -539,91 +380,63 @@ internal object BlocksDrawer { } } - /** + private fun getNearbyTilesPos(x: Int, y: Int): Array { + return arrayOf( + Point2i(x + 1, y), + Point2i(x + 1, y + 1), + Point2i(x, y + 1), + Point2i(x - 1, y + 1), + Point2i(x - 1, y), + Point2i(x - 1, y - 1), + Point2i(x, y - 1), + Point2i(x + 1, y - 1) + ) + } - * @param x - * * - * @param y - * * - * @return binary [0-15] 1: up, 2: right, 4: down, 8: left - */ - internal fun getNearbyTilesInfo(x: Int, y: Int, mode: Int, mark: Int?): Int { - val nearbyTiles = IntArray(4) - nearbyTiles[NEARBY_TILE_KEY_LEFT] = world.getTileFrom(mode, x - 1, y) ?: Block.NULL - nearbyTiles[NEARBY_TILE_KEY_RIGHT] = world.getTileFrom(mode, x + 1, y) ?: Block.NULL - nearbyTiles[NEARBY_TILE_KEY_UP] = world.getTileFrom(mode, x , y - 1) ?: Block.NULL - nearbyTiles[NEARBY_TILE_KEY_DOWN] = world.getTileFrom(mode, x , y + 1) ?: Block.NULL + private fun getNearbyTilesInfoConSelf(x: Int, y: Int, mode: Int, mark: Int?): Int { + val nearbyTiles = getNearbyTilesPos(x, y).map { world.getTileFrom(mode, it.x, it.y) ?: Block.NULL } - // try for var ret = 0 - for (i in 0..3) { + for (i in 0 until nearbyTiles.size) { if (nearbyTiles[i] == mark) { - ret += 1 shl i // add 1, 2, 4, 8 for i = 0, 1, 2, 3 + ret += (1 shl i) // add 1, 2, 4, 8 for i = 0, 1, 2, 3 } } return ret } - internal fun getNearbyTilesInfoNonSolid(x: Int, y: Int, mode: Int): Int { - val nearbyTiles = IntArray(4) - nearbyTiles[NEARBY_TILE_KEY_LEFT] = world.getTileFrom(mode, x - 1, y) ?: Block.NULL - nearbyTiles[NEARBY_TILE_KEY_RIGHT] = world.getTileFrom(mode, x + 1, y) ?: Block.NULL - nearbyTiles[NEARBY_TILE_KEY_UP] = world.getTileFrom(mode, x , y - 1) ?: Block.NULL - nearbyTiles[NEARBY_TILE_KEY_DOWN] = world.getTileFrom(mode, x , y + 1) ?: Block.NULL + private fun getNearbyTilesInfoConMutual(x: Int, y: Int, mode: Int): Int { + val nearbyTiles = getNearbyTilesPos(x, y).map { world.getTileFrom(mode, it.x, it.y) ?: Block.NULL } - // try for var ret = 0 - for (i in 0..3) { - try { - if (!BlockCodex[nearbyTiles[i]].isSolid) { - ret += (1 shl i) // add 1, 2, 4, 8 for i = 0, 1, 2, 3 - } - } catch (e: ArrayIndexOutOfBoundsException) { + for (i in 0 until nearbyTiles.size) { + if (BlockCodex[nearbyTiles[i]].isSolid) { + ret += (1 shl i) // add 1, 2, 4, 8 for i = 0, 1, 2, 3 } - } - return 15 - ret + return ret } /** - * Basically getNearbyTilesInfoNonSolid() but connects mutually with all the fluids + * Basically getNearbyTilesInfoConMutual() but connects mutually with all the fluids */ - internal fun getNearbyTilesInfoFluids(x: Int, y: Int): Int { - val nearbyTiles = IntArray(4) - nearbyTiles[NEARBY_TILE_KEY_UP] = world.getTileFromTerrain(x , y - 1) ?: Block.NULL - nearbyTiles[NEARBY_TILE_KEY_RIGHT] = world.getTileFromTerrain(x + 1, y) ?: Block.NULL - nearbyTiles[NEARBY_TILE_KEY_DOWN] = world.getTileFromTerrain(x , y + 1) ?: Block.NULL - nearbyTiles[NEARBY_TILE_KEY_LEFT] = world.getTileFromTerrain(x - 1, y) ?: Block.NULL + private fun getNearbyTilesInfoFluids(x: Int, y: Int): Int { + val nearbyPos = getNearbyTilesPos(x, y) + val nearbyTiles = nearbyPos.map { world.getTileFromTerrain(it.x, it.y) ?: Block.NULL } - val nearX = intArrayOf(x, x+1, x, x-1) - val nearY = intArrayOf(y-1, y, y+1, y) - - // try for var ret = 0 - for (i in 0..3) { - try { - if (!world.getFluid(nearX[i], nearY[i]).isFluid() && // is not a fluid and... - !BlockCodex[nearbyTiles[i]].isSolid) { - ret += (1 shl i) // add 1, 2, 4, 8 for i = 0, 1, 2, 3 - } - } catch (e: ArrayIndexOutOfBoundsException) { + for (i in 0 until nearbyTiles.size) { + if (BlockCodex[nearbyTiles[i]].isSolid || world.getFluid(nearbyPos[i].x, nearbyPos[i].y).isFluid()) { + ret += (1 shl i) // add 1, 2, 4, 8 for i = 0, 1, 2, 3 } - } - //return ret - - return if (ret == 15 || ret == 10) - ret - else if (world.getFluid(x, y-1).isFluid()) // if tile above is a fluid - 0 - else - 1 + return ret } - internal fun getNearbyTilesInfoWallSticker(x: Int, y: Int): Int { + private fun getNearbyTilesInfoWallSticker(x: Int, y: Int): Int { val nearbyTiles = IntArray(4) val NEARBY_TILE_KEY_BACK = NEARBY_TILE_KEY_UP nearbyTiles[NEARBY_TILE_KEY_LEFT] = world.getTileFrom(TERRAIN, x - 1, y) ?: Block.NULL @@ -657,7 +470,7 @@ internal object BlocksDrawer { } } - internal fun getNearbyTilesInfoPlatform(x: Int, y: Int): Int { + private fun getNearbyTilesInfoPlatform(x: Int, y: Int): Int { val nearbyTiles = IntArray(4) nearbyTiles[NEARBY_TILE_KEY_LEFT] = world.getTileFrom(TERRAIN, x - 1, y) ?: Block.NULL nearbyTiles[NEARBY_TILE_KEY_RIGHT] = world.getTileFrom(TERRAIN, x + 1, y) ?: Block.NULL @@ -884,6 +697,7 @@ internal object BlocksDrawer { weatherTerrains.forEach { it.dispose() } tilesWire.dispose() + tileItemTerrain.dispose() tileItemWall.dispose() tilesFluid.dispose() tilesBuffer.dispose() @@ -900,11 +714,11 @@ internal object BlocksDrawer { fun getRenderEndX(): Int = clampWTile(getRenderStartX() + (WorldCamera.width / TILE_SIZE) + 2) fun getRenderEndY(): Int = clampHTile(getRenderStartY() + (WorldCamera.height / TILE_SIZE) + 2) - fun isConnectSelf(b: Int?): Boolean = TILES_CONNECT_SELF.contains(b) - fun isConnectMutual(b: Int?): Boolean = TILES_CONNECT_MUTUAL.contains(b) - fun isWallSticker(b: Int?): Boolean = TILES_WALL_STICKER.contains(b) - fun isPlatform(b: Int?): Boolean = TILES_WALL_STICKER_CONNECT_SELF.contains(b) - fun isBlendMul(b: Int?): Boolean = TILES_BLEND_MUL.contains(b) + fun isConnectSelf(b: Int): Boolean = CreateTileAtlas.getRenderTag(b).connectionType == CreateTileAtlas.RenderTag.CONNECT_SELF + fun isConnectMutual(b: Int): Boolean = CreateTileAtlas.getRenderTag(b).connectionType == CreateTileAtlas.RenderTag.CONNECT_MUTUAL + fun isWallSticker(b: Int): Boolean = CreateTileAtlas.getRenderTag(b).connectionType == CreateTileAtlas.RenderTag.CONNECT_WALL_STICKER + fun isPlatform(b: Int): Boolean = CreateTileAtlas.getRenderTag(b).connectionType == CreateTileAtlas.RenderTag.CONNECT_WALL_STICKER_CONNECT_SELF + //fun isBlendMul(b: Int): Boolean = TILES_BLEND_MUL.contains(b) fun tileInCamera(x: Int, y: Int) = x >= WorldCamera.x.div(TILE_SIZE) && y >= WorldCamera.y.div(TILE_SIZE) && diff --git a/src/net/torvald/terrarum/worlddrawer/BlocksDrawer_old.kt b/src/net/torvald/terrarum/worlddrawer/BlocksDrawer_old.kt index 2a5d305a4..7661ef75c 100644 --- a/src/net/torvald/terrarum/worlddrawer/BlocksDrawer_old.kt +++ b/src/net/torvald/terrarum/worlddrawer/BlocksDrawer_old.kt @@ -467,10 +467,10 @@ object BlocksDrawerOLD { nearbyTilesInfo = getNearbyTilesInfoWallSticker(x, y) } else if (isConnectMutual(thisTile)) { - nearbyTilesInfo = getNearbyTilesInfoNonSolid(x, y, mode) + nearbyTilesInfo = getNearbyTilesInfoConMutual(x, y, mode) } else if (isConnectSelf(thisTile)) { - nearbyTilesInfo = getNearbyTilesInfo(x, y, mode, thisTile) + nearbyTilesInfo = getNearbyTilesInfoConSelf(x, y, mode, thisTile) } else { nearbyTilesInfo = 0 @@ -543,7 +543,7 @@ object BlocksDrawerOLD { * * * @return binary [0-15] 1: up, 2: right, 4: down, 8: left */ - fun getNearbyTilesInfo(x: Int, y: Int, mode: Int, mark: Int?): Int { + fun getNearbyTilesInfoConSelf(x: Int, y: Int, mode: Int, mark: Int?): Int { val nearbyTiles = IntArray(4) nearbyTiles[NEARBY_TILE_KEY_LEFT] = world.getTileFrom(mode, x - 1, y) ?: Block.NULL nearbyTiles[NEARBY_TILE_KEY_RIGHT] = world.getTileFrom(mode, x + 1, y) ?: Block.NULL @@ -561,7 +561,7 @@ object BlocksDrawerOLD { return ret } - fun getNearbyTilesInfoNonSolid(x: Int, y: Int, mode: Int): Int { + fun getNearbyTilesInfoConMutual(x: Int, y: Int, mode: Int): Int { val nearbyTiles = IntArray(4) nearbyTiles[NEARBY_TILE_KEY_LEFT] = world.getTileFrom(mode, x - 1, y) ?: Block.NULL nearbyTiles[NEARBY_TILE_KEY_RIGHT] = world.getTileFrom(mode, x + 1, y) ?: Block.NULL diff --git a/src/net/torvald/terrarum/worlddrawer/CreateTileAtlas.kt b/src/net/torvald/terrarum/worlddrawer/CreateTileAtlas.kt index 03456b1cc..5dabcbc3e 100644 --- a/src/net/torvald/terrarum/worlddrawer/CreateTileAtlas.kt +++ b/src/net/torvald/terrarum/worlddrawer/CreateTileAtlas.kt @@ -16,6 +16,8 @@ import net.torvald.terrarum.worlddrawer.FeaturesDrawer.TILE_SIZE */ object CreateTileAtlas { + const val TILES_IN_X = 256 + lateinit var atlas: Pixmap lateinit var atlasAutumn: Pixmap lateinit var atlasWinter: Pixmap @@ -43,10 +45,10 @@ object CreateTileAtlas { tags = HashMap() tags[0] = RenderTag(0, RenderTag.CONNECT_SELF, RenderTag.MASK_NA) - atlas = Pixmap(256 * TILE_SIZE, 256 * TILE_SIZE, Pixmap.Format.RGBA8888) - atlasAutumn = Pixmap(256 * TILE_SIZE, 256 * TILE_SIZE, Pixmap.Format.RGBA8888) - atlasWinter = Pixmap(256 * TILE_SIZE, 256 * TILE_SIZE, Pixmap.Format.RGBA8888) - atlasSpring = Pixmap(256 * TILE_SIZE, 256 * TILE_SIZE, Pixmap.Format.RGBA8888) + atlas = Pixmap(TILES_IN_X * TILE_SIZE, TILES_IN_X * TILE_SIZE, Pixmap.Format.RGBA8888) + atlasAutumn = Pixmap(TILES_IN_X * TILE_SIZE, TILES_IN_X * TILE_SIZE, Pixmap.Format.RGBA8888) + atlasWinter = Pixmap(TILES_IN_X * TILE_SIZE, TILES_IN_X * TILE_SIZE, Pixmap.Format.RGBA8888) + atlasSpring = Pixmap(TILES_IN_X * TILE_SIZE, TILES_IN_X * TILE_SIZE, Pixmap.Format.RGBA8888) val initMap = Pixmap(Gdx.files.internal(atlasInit)) @@ -188,8 +190,8 @@ object CreateTileAtlas { _drawToAtlantes(pixmap, destTileNum, srcTileX, srcTileY, 4) } else { - val atlasX = (destTileNum % 256) * TILE_SIZE - val atlasY = (destTileNum / 256) * TILE_SIZE + val atlasX = (destTileNum % TILES_IN_X) * TILE_SIZE + val atlasY = (destTileNum / TILES_IN_X) * TILE_SIZE val sourceX = srcTileX * TILE_SIZE val sourceY = srcTileY * TILE_SIZE diff --git a/work_files/dynamic_shape_2_0.pdf b/work_files/dynamic_shape_2_0.pdf index e7da7723d..6e2327d9c 100644 --- a/work_files/dynamic_shape_2_0.pdf +++ b/work_files/dynamic_shape_2_0.pdf @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:34bb19ab2e1092662d42b0ce84abb3f162ff54850a25644f1ed33811e1668dc5 -size 2675854 +oid sha256:cf20df22e83ed311b3747c2b0a7b7f2335866abdc839a474924b1a93911187f7 +size 2677315 diff --git a/work_files/dynamic_shape_2_0.psd b/work_files/dynamic_shape_2_0.psd index 56a28dc82..24359d8de 100644 --- a/work_files/dynamic_shape_2_0.psd +++ b/work_files/dynamic_shape_2_0.psd @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f4e4ee1b92bfbaef5f3896e60fe64569a572b7df72bdf4c891deb5254ae088f2 -size 3230751 +oid sha256:bb8770db5cf25fff20ecc3829ceed64fd186062d2b5db0d3b0371e5954e2a37c +size 3235048 diff --git a/work_files/dynamic_shape_2_0_attachment_bits_array.xlsx b/work_files/dynamic_shape_2_0_attachment_bits_array.xlsx index 3c20e55a3fad8e9c880e63bf38216b1dfdd44524..356a17c158edd4a8289f279f2a719b90f6147c7c 100644 GIT binary patch delta 25628 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 delta 15952 zcmZ8|Wmp}{vMBEEF2UX1-7UBVcbDJ{?!JHoCuneY3+_%J!Civ|2o7)M?EBq)-tF~g zW=gxNy1QmpRb?F1uXacRbtPyR90)iF1PBNSN{F=++su4O2nZPXdICx)U{HI?d6gZd z2mMHhpaZXdo-EQVdO>QLY!&K^EI8$}UNke}yH#2jF$0w_GkFUbj=DH2!<{=R#l>IN z3lAr#T175Xv&orJ=3)8cupB~> zT-go}Z6!-g*=i+EhNWK9Bb%O&&2j!|?v^(7exZ}-voYS?SC1kGx4^q$uRxN$#lp#{mtQ9_Nq?e(df|TF4^vEDQbFdB((s_^qSz?yxIp200__*KAgti&@|9U zuXZQ8NMNT;LN`*vGe80$HKjpzjG>FrP0Gpj(&~h)e`<)3!kHj?jxggIB&ZI)xbQ5Jp5D3sn~9L2K{>oWO>2pg}5P%PCfR(pRn6%RFb z^Q{jY*6|3CZaG$v#+O54_5j#u2;*`~2k(w{N`HS@AQ@4gFv$jrYBUb)I#RY<;c@8l z%s((9JpCpbG&{2Ry}8j-K@^s>(dBh?uN=NN8ZoCHMWo-y9~7sLB_WY#GrDYff4MD> zmtvEs@J_(_H_hi?`DS?8KdTTeJRQiYoY&SSsabg3J85C`N$Uc(G1!8wld*jf53IEb z$X0w@7otksUSmGN((&m9K>jrkVE=wfLvJH-~LK&K8W*OK(`Y`tY-6em_T1nOEp}Fd4LYEzPkN&mVGRd z{i1U!0tI2kWhAIuB4KJbMqM9h%mK?6!JEqeBg@#7X+YjtX*dT*f+Vs?9IM7PE;(!2 z^r&zvjfJP0MzaQ%Lm319cr{hGMGADoS+ z(p;Ss+%=SeyM5F5h*M}lYnIkm!vzOUV=+TG8_%e&EaRhe#Yv((xr`}wv{z-0P=<{U zjA5W@FX`uwtYxEbPHEI`(P2O1aPHvtt0xOmH^Lz~>`|&A@7*1u|E?Z?=$yTxDPhK0=cUeoH6lXFPAgwpWD3Es2zIoNN zVg=RGHoAO&nC~Z@TKamQhd{PlB0uH=>uU5RDDt*lG_W>| zB0$CXHE;taoOy%YZk*Bnah8O&k-C-p_M*?PfDP0m^;sTnzLi3}A+hA$C4oqtxhnId zyk-!@L#VUylEmHeFZlngMnEBaLf8QuYOa_N5UBrzn}?^bqm{?sVB6DMcUk4d0Lbg! zBxXB{&^C5hAIJmnq37irQ2=4FP)p%Io{s1h7y5g6<=fhbePew{GNZuR%6%C2L`Ua*oP zCOFgsY)-lUfCsu&E;YszuY$zhgW1`=y}oN{G3Y9`{6{z3@ygK<)$RxVLNN)|HNRzh zhBvo73|Pf2ze=lN2K>ZO)3Dmee)X7BQU_@T#^?>5g49_H6*Qi{y|SOWSkW1@ek+MO zY8BprQlEa5)@M_XP2CRP@hs2i{NTTn@(Ps05CG-810IB9cl#hu>)+PhKPU~FZo42$ zL*raiL9&O>V+YU?m5b}KeBs2!V-CSD(-$MT3)X~FDMrix>1}qWQ(%E1J3vVBfqGfT zak*4*MLYsgST^1&Q}zXe$uE3E`tcao-cl<3J*&HIty4@=Uq@Dx!Fwb6ukR#UgkCD| z$zDs17=R(-`dk{*QQ~9`C^=Na5PzNny zpn{X(`-t$zZP%s14r3^vY^#L0N7&2x5gZ6$00xjVAA#{~+FaN@tWd6(pNw&8B0NE* zG1M^+6c2%nypeH@;IguYTgZLl4$acp{jr2_<86QQEBgCYqa+`6RRD05Bjv^sxg~pw zDLsJp9Mkzxg?w|WFTi@ta>L54uI_rW>ET54%k|pU9-UoXGQn+F1==Bv1B*T=sBN*q zU=6tObso!l9hFAK`^cdI*BY!Px_wV};Z^Xe15#DZ zTA{+c17#1N-7+j_ov=jdC*9*>bYrosT~Yv{wCmcXj0%(1U05UAG&@5c0U0a@MC)f# zQE9`XG!brZuK3JMk=;MF$Nqub`gDswa0+^^s(sOpUIucedtJlrJ&$_T*%d!1PcZyK(Vpo;Jnr;mY@YDR>Z^{drl$C#X-PfVq515(+q`f4>1u{wdb zjdhb5K5qs7tcTXdIm`H>IpL1=_`?n~JNrOPNyV}B)mtHd(CG8+}BAVp4z>GGhCTdoN;UB#t zD&G-fh->Uy&#zZ%yW1W-GXlk<;R2^@WX1@6B3ABO4r8YRQZ|{@ zUYY+8wA4e($0LX?bt#qChDTRG(^-Uw_&m;=x^ij|8DIiW5bqE3b8u~}d}(sH^OC|D zpCdz5EO4sS&q(gMC86{(zrOv*6jkLe3kvh#bo72Hmt4j+x2RHxLfM}zw_o=|aksEL zpZOV~g)KxUb~*hu7&BW7Lp46(HOH6rAXI)Lf|t9`R0w%?@%iKMkbBCMFIQdCrg=sk z5Kg-u(kumR=QQ@cpzeI6H$Kh!1QTy6fhx+bkc3V!@%CX>ao2x|z#I!xF8$)F*e9Rw z56gv~;TP!7ElQqbpZ30)N|&HBMaS}r&kz0FufI)KPQ~&2*)K+DuuIjr_@I9K zsgd2>U72gYHGIuf@u;+_h#0aXqJjUgN7eH9lC}3T*ckLpt2LAl} z_bu}$&(&B+o+QnPEDm*@rxl=e%bPz_QBRl1XmuZiUBpb#UnjbQ4o4RH_E-5Zzr1yCzP>`e0ri_* zZ+1_0-K#EQ;lw;`{AjQ0UCaPaxroi8uTXYNmzt|Irql`Hxin+eUc zOWQZAZm3tFeI@BCTJTe4R*V~ z_W6G6*7**@DE!Stc!S)XLA>pOD#Gv0?Crsi9oVqqj%l?$P=j*(zT{}8?&c_ULmNuUc ziUfF&`1~V#sl=~>o*Le+UW2daHo2!>`+INsGNF(jFrbm%tl>3Jt21rzw>RA#(l&9< zr!srTA`RxGna)i%NjluM z?tq^p9m01j5n?y+?}QQIci#l{MlQlvAF;^hYF%nKjDk>S){R^AsN*2Cn+XK$8`4x| z^RlXnW5~Jq#O!$|XQsw{mN`v6<{BPbj0W8Z4Hf&gqsZ&FL9@fPp)bL=p^JAiND1=1 zn|J24Q0Idu-(&@r-Y&(eGB#PBKY+Pwov&B;2zvritASz5Hod+qY%||_RqzHdUPfBq zx*tcp9o{}&pufG|Ozf29FN?kXzGe)#S?(hb>qUbD7&sD+*nFaTxANbvFTVHoTm#+J zz28(S1VRKnli@z2FX388y4y>ojd;MhKM4j4GmAx+EC3b!RTSjyj|L`z@@zrb%)C715RvVhmg~o?dbd zJ)=*b6Aw+-1F_yy1!CQ+*rRRHCXB1>yr^C2xnP;(6V~qU>tk)wBD;a+0}+?+A2Z5C z!sC+Z(tuq)zjA;eF(>J?ujA8WIjUK1ovP{29<;BC$Q8`Gx`%oN0C&@sYY7oOe0BW>=J&**f>yl_V8Q}bLDD_&tO|C%>l;+>e_vf7 z?0jCeG=s$LZw?`n4S-WeUxL;8_yNBhRU-EqkdOo0LXf4P!LW`Ijp?h8mvvW$u8me; zHgjUg`1~Ge_$p-cxZXyanA>%REFy4gXTVeX9Z&B9fFdF)DU7IeNl&PiZr#`~ z5}^tkPa#7-jw3P=lSVEES9daQHBcLBm*E;;Uf!~BeQ@BY!*Fg)fHjL>L8`C+##Exr zEa2lr7grKPf1U*m^8+_nzoQzB$EK}JR5g9DkP1kxAhYhNIjHXOEHqVORe_LN)Coq% zjr|fjoTa!3c&h4XJ2O%YXMNT2s=<|E-qrc;pk$5(%XZd8@8kB#i5WWLIsN|EPg$gC zof(6UL*!Vs}qXbXQ!4MY&rWPnH!mM zXI6K;>M0|ZX`i0ziiM1UV!=JwEHHZ-12Fr54*64*z}#xZxPx^PofB@+b~rTlD2I~a zYp3+yV56uZqSg<({uDwcwN}KMY*$mb*^TLrb6rAM)773UvhmA{9aG=?6KvKh{G9aT zn*rk14-Oiazgbp4H{53<^V?Kz75eslPRPJ(PZ1ZkoVmghHYHl-M5E2x!RZ5&U|7(M zoGlyRbbX%SE#($9p1vIg+ohcf_WL_NtmxXoXqDTX~o0TKuh{ZvI)k> z4Y2y*4}uu~U|&0F=kkVgz=0JCz3gh5;LU)99d=?8{*Nvt*%$)M%N+*+?+HjK`kks1 zK7D*Z{-Kn-&)c)1bN1!aRtY!?_Adz?oO4b3bykMXM3=)9jF!k_sa0>)2*j31ae^jC z9Jio2YKBN>fHv({DD(Is(!WlN53TM6I}H!;a65DwGUmQWq_cE8ybsh1g%5Aj@y;t* zV+0^6X^}$$SZY?F2fI4{@xl7-pVA){LP=if1Ztx)9NshydMxJwEa$=>GA2GrM{|Jf zTJr~jgYCQ_0dZ$x$Qa$+(Cx6kW@pIQxfm!ipChbP^6bI$&SRU`u1z=}eMkABOcU&f zwh3O^Xf=Fqk!Yu(Trr)seOZIGn0~4MVO>{gLOe(S)B1r)!^dRJiWqy)2FE*hUAtw) zSw7=T4~oT|DHm>sAPo5^KB~EGm!Y-duZxlXx|rZMhfGWTq=xBQ3k{I;rMfNdz{?-z zBEf^n{MQJSh1b5bUZqf;N99SgS$t*GT2QrgpZ*>1s@^cp<$~CX?68!f7yi^lTf&Sx zSV-dPTKKZ}7Swgyl6Qd3G1x!^Y(Q#;T>DGM3g0mCZwVQ&Gp>#wYq*wqxt)ioC#(Y; zNpkCHUJ=Q)EvZ_7L9r^_4fS86X@;B}|D&A-Si74Mg4XItvK7WI+l_VE6hj3-c%Mt+ zKVp2OOm?+vt82dzC9T$`(?{j!i80MHhfaR4*PT`GWiwSS zM6&Bk?oD_rVn~TrjPlZktLggWhOEx&Y|C5&L3m6w8(KFwC#n->ELZmkrs=gY-5eP{ zYeB|mhAzT8n!`Vb!>{;0`A8YY;7@hxGb?q)5NLkI-Kf*?$$8U#h>d2~`494!{_GfT zRaWJ&SQnFC;uS@(;)W5^2|qNHAHr$*ztyyX@n2m=aeYq>+Kcn!a+)u?2iX&VB5p$o zzCnXn7o6z?%SgQ&BzqCQs#}u7M`Ayj9_})u`Rnzu)}NzkU&1x z!clzfb{O>NtOm;lfBj}M)9;qo|-$Yxif|JT(Uqnl)Zqe;VQpC5cgG?sx*y(Vr%v-wSim}P#&!+uuKG~HAK=8mw2YhKRagXjLzz)zj_g!hmjokP9e&d~(^F|KXR z^DT(Rb{%J`j99)0WINfY)*26{%+B2>IOoQcf=+r6hQWZq>_9S0&fHDdnzvedC;Ps4 zh>K2$y1$20?uoNy<#{3C>pe>u*O_T5-`qmnY~jhQ0d|pGKs{^geCId1rG^y2qiEa& ze%3d%8hhA9o$&;D!XdPed$OF&cv@dG+=~px6ZBj>q-sXNwxJQJbplI9oOLnDj#G=? zmgdyQ+YM$MS-vMR=rU1s`$cEJ&1-(_1^od5KJr1*$eD(498fzfHretsg}TYs-I48b zRVrkvE&UR;4)pXsdDSbOP{bY#Qub2|V0PcgO_U=Q7FmTf8O$Zv%kW`It^bDoEQ3E# zX~`8!Hx~4`f3ewp9R<4F&jFFQ5=*1mCi>puYGigX7Cd)7x!*U#g%^%&m_)6~L+s%G z!V(r|Omv9g1$H!RZ;>IA`5kjJUWPFXAV%&kWX;Y)5!KXfeMpC}OHDnDiY?Dae|;1fP?u{3Ln~kp5419#q|K&j?UH-^3jPIh|otp_>yfNBH~k zqciqF8OZ0c=&|3R;S8eg3(h5>n^99o+P;1xa7-aa1SYOL6t*CCtEBeaPT_2GS|kn# z$_^eFb)Bh2+J6W^ld;bVj)${YaI3HKJH}tHLa7U&WyhgtkC^QWqJ>%65|ugmU^fkm zlZjI>mQ}py3E!MR*sO6wt>D`hw;*m_)r*LS+qt%|1LqY+rAt^f6Pz;1brK3Q;+<@~V)jy8~sm#_(%h zOjFh2IroXpG;QC+nFRXm`66(}jy(%TRemYxE2qJl22I*$Cj8JzQJ|sIn<;jCCy<+n z-9F~l*A=rz3%@&&Q^d%p!pPSrOGQNQzHls_k_A)HQ0(;_zvy1*%$Lip@L5%Z8<4OU zB(>Q|7nY%eP^m7aig0sLk8&?yXeU|YimqKLuTVVNEf5_%F+iJE>JxP z6AExEQIfLZ)<&p}|gBzU0 zS5GDkh#wQ@_*K$8KXcgki|q`T>2Q*5+kXLDGgwD4bV`C-9h*iaN#ngUwcBrKKX6v# zrlXkkQAePZRxx(Ti>VTVyB_sS;-Q%6uN`SZsz_lMr4=-bsWHonsR7ZME*N+MYpY_r zsFYG#SunxmV1dD&4yQGi1*U6A2=C8Y)p~9&j`vOH9AF6|^yJH7&DGS< zXq4x|4s=54(rjZ=zQMv75F+9c%Lh#>$KzC=CLB&gw5R`34(P@FE1a$`h=}NG49Ggh zt09AZ6F=P$uq)`ghruVX-KW+ID+FKf zStffrf)v{ef3~2YtE*uA_3R30b+X8XZt6#?3FtRbI$+QVY-nhHD9Y_}r_7TmC_pjV zTy$ZO!~er6P8OO6%*f{Az9vq_na111wlEYKrD-0^@vtx?%hoRMGu>3|mANQiYHFg= zC+0rrVSPKqVo}>1TEHM{wr&!JtCTER2R5lJkBL76j{H^vP%3YTh zPU)Zo8T8`xjvqi`&EJ+IhgmDNLEI-$g2hg1uPl<*$+D}Z;LHIF`n>5$GISg zMB9Y?6r|#t)GbD?(48~3<1F)Swt%(SGi4;fcWZ&NZQ(Qb@5O)1(lB@N^BPx4AMlDo zKR9Qg@QO}6&iO(oNb}8+9($B5^7HqJF7rr2J2~LhB+Nz^bBm=kxyEKS;=f}aQY=_S zK(#E?Z{r0dsZJ)JsT~k>GnsJ?V`9@0S~(0Zj7?eXUx_+6EV)@x@%mM!!siA@F&9%6 zSh*#`O4yKC=TJmniZR>%uVa>pXt9FW?#)BjlI{XE|2atU+|t2m65Z z%E&7du8Nh#8gZC~XVNAk;^-7E%e^l>SM;^LZz(dhxq6yvlvfZsoj z0#UFx1#P+!@yo0E(D4_SA`?OjDH^?MD+7{&#{?bP4# z-mS5csU%^?70S+w6WI*VKxhoXk6w=emjUhV0V^p}#NrmHQ<$+pCxJ~)E^C{htM zsKcqR=a2Q{L~F@Y1nQBLk?I{uS$hb*W3)s9Z9NBmW`Toa8*KyT?1hX2(|GhNtXS_c z4kQZt#8f--0xrPb|H%+otsF0;9eTiZ$*3D`B+u~%r}57it02<*Z(XE(tfz=(ZS=}! z(SO7P*S+tkU6!E*bqDT(@t8igF$Ea)osF5beN{6(P9U?bQ~ZgLESRmPpFG)SgJHGFh`q& zX?pI3#LGzqMToVk<(5+I_)K9Nty4RZB^?Q^fvSkE(bymC#8lqD2ES=>fs=_cvrI49 z=4Z_7?6{;k?y9lTkHK1#eRVu=*wjyT=LjnrjsOhvsx4-Yvm*y+Kntl62pKhgqDrse|Cd0d< z#p|TCq`Bd$fi!@@{5})B*sf4t4M0{Mg+MAo!l>VGV%Bjpg3uvUio(vR6(Y~h*rUD% z+*-e~gfTxN64qFAfqm#1=k64#NJmrwH?hL^-V|P5COCu@G7-@h)`qbvdT2!h((%c>xtlqn~+$yY9L*y zYt^WeerqWR6_d>wg5VWhri^)V=}N?ugymV1h@mjlQuckj@Z<1<8llE125xQP(so3o zTSu{Flzve|o@rDZ6j7vY$~bk4J1{mmuw5To-ScFz)K*otvhCPFI@X0kFm$@C#6`F{ z&hfcs4YOzM{g>7ks#rUMZz6(IpVI|wqnLPEte7^or-`y}afEYJ`l&MUU9HLrRJf4* zX0?SwPa~Z!x-wNp2QX>Se{M5&inU=qVg;I(a5-2mXjOb8tDFEn#nNviW zx7;E*DvMN^%N@$foQw@*dA+cnF{&7Aw7)R7F46>f?a<|#MD}oMXwM<3zOBU^pOE!= zPpp|(;ob61U*LZ2kCN8S>T92`rzEqTtp(3KL19BsB1q z>jww^!lSE(|3EM+Ru+Hx7vO7P_|#c|ZP7$vxV$~<4UCwP))shQ0Dq=B@K5Qg|3o_> z!qjmhckhneDrc(^HGsjYV}oU6g&kex?RlJ3=kir%HQP4coFvlL(CYTK8p_$8_L=EW zrV#?+aMRbKDGw$(E{i16)vZ*6gk}_qe2=0+Phv_o0LgL#p}Guu2PpK3qSULJzE{mp zZd+-{44C$mbug!>DTCW_vZom9qSMzfKx}z#;_C=zWe!;T-7;YFg{1zbZLG^tYfF(W zZeIC1KuB8aXxhwM_EWQAvZ>apIVX!U>&Yne;72_^(5c4389ZI)VdPi82lb+{o$7 z(v`uLjx+e0MPNyW$IRb0Ctw%yhAGbBw||qhHl><`%&`AWS*^I%3Wn-3|)p3KgAf`gJBnq%mS`kBGp8dC1?wOf_ zieW$Wq}XF>IShUwWkYkpWtzrN!Jz(ULoGPK)R~s%+_R3YDfnQFHOQxs91O4-X$BsY zQzPW}158s*A27m8l|sYWbYEd9YXFjsS3!uDPFEY;KoKK6`-1#+vb%>hVU#~ zXhsb6!ML8C{SG5BXwB;xnq;5}BVo+Ea=d~gA*>C9DH2wQurnk}>?zsr#A5)cVGhc9 zC0>&^Gasbf@%$cp*-N-Z31BQHxJvv2mUHjlZpt**kRi7*L))jlG&_iBkFJW)mM|}# zm$n~TEgSbpc}oDZ*}dbzHO=Z8n0HywEJ8!QB5NlifcZI(V!Mbf+IXX+RP9?IbmZm;<{oE+kyszD|TA zxsJ#N8LyRh{MZOgbX|=);i*D{YY+k!b*0fakc=c}LxL-Sf%9%m21Y*CG)c(OacKb> zQEVOV{EARc24gU;vGF(ysV!mJFBI(k0D^Brq?CmtQ|^?O)*qOw%9LWmY_@kZ+H+x> zC=LKi=sW&gyI6`H6!VT!DCZ)s(T{=+F<9hqu1PEf4^{Y*ey}~Or36QQC%-SqC@se!FgHR!R&KvmeGDG`@WOP~~&Ls{&pi=*GnP zm?{{iH_@y8m4y^W5CwWMuHeK#S|T9rh`k^#ptPVe&BnY;ucP$WU=}k%1Jc=Gp>!0b z(OOMyL3Y+yp1T|GPaA!V7CXuSBac=(OCc8V0iRF>SZ##YlBBw|X-TJEjdwjx#-_N0`OiU# z0Pb335%X~lzJ*L;4b4#SD-l(59)EOe3|I^itJrt#EQL0AJT+Z-#1A!N?B^^+KNlqe zmfqwwi;aftHNZeDBW+UZfL58+RXlS|_^Y{Rgf{o=B77HfDLQHZpQ!A1Pah$L;oSHwB~3y3mwa;h?^4K{o%K7=lWaSPnV6JhlYoym#2e=g_nhiA#i=ftDoyF zqYt>q|Buf6u1q z8Q;^>`oitj#JRBVTUYyL6jN8vo2!VA3E&!L+OydO{CM@a?gHA|R$u<$um+B{J=!(? zfj^zFCVRaPynA+dmT`Ie0P&x~8YI}0_{3yzVP-T5NY|PH_$cwrpiqKG=@t@BFC3iy zdHCH&#b4q+{vWL;VSipEGvbQ~5zb8K32?Q1;yVoLz5huza?V~A`&hw#<;z!^=KkRkL&)Qw&@i!trGd?}=RslPL)gk@K%M0*PWWcKOea(6Vdq#;50UigWkdXhMHc zNm$Oj8q>L(VO~9HQ^@s}IBZ>YvjdXo-5yu#@DN+P&2qEv6@V^$bM46+2)LF~@#?f3K6*)t8+Sr+B;KCO#XOk@V!RefL2u3ib>Sz=`x%}C*jZ2L`_?44kh}SY zw71H-%)i27=)+ed3GrXh&ZM^8#Z>vSFpcW#Hba0JqCv6N+DTxmaPte0xT*i{my^w) zAs_@X{FChZ;v~lJbe`@Wefd_E)pb$rM(kQ_#v`5>O0FCCb$9S9E4>)kTT1Jq+97Y; zt+_w;^I<0V%a$fgP)TL3!){t-at*Bk|JfunONNMv36jG_a zta@5FA4c$hU$0suTHWzYJ(<&o@;X^p-QvaAd&ClOrqvVJFgF3 z|I6qOb|rd4D39-xJ4n-7X`y9qP+l`hAnpF?AZ=WfL+GB+^T&0+gNzOrqZ z#(xG%l-oN6Pel9%ZjMWxYEne3N{$6j_{vg}|F!7-)qcni-DsHaywmh1EWYS1HV=bu z;ty6>Q>=fWB21izR-v*e??oiL6n8ux?z*KiH>hjg{;BV43q?|K%FS}JEh0GoN@#${fxzhL`ENRW-p8qg1 zpkCAK26aiH2w6H6N2Z`1^Sv&tpFZ2JA&$UIlWFsudVvUk6Mb#1`-ZwRv#|a`@GX`R zj{J(o29E7%pcKc)0OZ(qYJN`)zF|h-U|>$C&FmSZ9o)#BYX+N#ctCg_?8b#Lhskgs z?AYVD4h=J+9tL$rN{iUnYl5!RF2;5N$;(85#0VjTrJMtv4A!E510e?{?Nz(8-lEc9>qoY5S#M;?R&L?|u(?7Uq zrWhIsGU&Lf_y17}3@BJPI$}r3g&!c^af;@Hs6u&i4 zVA_J(?ik(SUn2S46nT5z%eKAIwFh=*o=y8mSdx@T+CD)Mv?tqKP>s_uZN&&gL}aw~ z-YT_McpafQen=EgiZc>TJfFCE)IoBGq3!Cp?Q(O-$QykZhTC4w8*V~^TKNundLbv+ zby;CI>j!;qHIExqz5e-zY1Ybh>`|Mi_4gGD#@2?k38o+~`FA^E*>kPgnbmFs*1@I? z`jc=)UDt=t8!t>%BU$~J7SwMRrbdCi;?AMp=K{#3U`q`M{}{+=YxY1d5BdB_Rm~f3 zbo0wAe~aYwDoBFn|Jtwml+yxd^Kl!kmN$6D?sVd)D|1Q#wdXq03Q#8CR{ql}Ygbn+;qHOY2829Ji3QcO$a(pIR|j3VxP zhv-#LAo)v0PDHk8zTqXcu5S>-w)~b7J=+cr{qUfdTs|sG*xAEn5D<$}_1!Bzp)vBF z?Uvj|^P9THpKIGM8t$x&rK=%gXqqyOZI8t^W#VuTV9aALL4+$dn316EuL;$zdv_C| z808Q@1!IOscno$I!CksE^Tde0BO{RAz_eMuW;qPNKBh?E_qZ`5M!DLw;ro&>oUiw} zVslz-+juRCSn9Il`1;GrcUpgnzY+7`JYc4O_Ob ztDbrS-9172)urn}{7z*vhs$O;Z@+f~1e|KGYd?MZe&a{jGP4jwP*b+6*jQzdYYlz8 zJHXmrwa{a`u*WWxLOaqcrc2AVxp$F@luDHP^BP#nDC3Q2ZDi=mRoOmsL~OQ~}LR zO$U&_oTQ|*z7iJOepZ>YtA_fPcwSQ-M@xYbdU;+V`~#J1Q!#^J1o&1IElY_S=KnY077_ryptWG-VKRfv0N#K%Ru#5#%?p&+D*pjp;YmH8U0 z@A!Z)zLpVhXsqc0hJrYKkc*NS6C7xfT7CW->_<_Zdk8n#5+uo}R!kF0@6dCNJ{4Le znP9@p0&9uIcWJ14He`2LgF@GKu=uBnl*V63A$4JuVqPLJBf?r>pY3&Qb;*Kz_M?49{ zQ>MEax0aw{4%xmb5oqQYhml6GhMw=R>@y1-Diw73qQ|HgnkI~&$Ug2RZ&0ccfnfpM zewMSU5tQ(-rlB+@@Z^+eudp9}nRpuf&O@IwsZSHgk0g&Loro;Fja&hT*N>8h7TdnA z5x+-*#{JbY2lFcE90Jly-gfFoUYII9HRPS~wtathlv`?nFZX4v9I@5G6*py7v13M` zEAb>zABBuCPa7@_7oV{Wl2RSIB6|vuyqLp$p93SL63p3|^IL*4MjjTmw49{LT)J-< z^&H`D8i8N92XU<(Qf^Xa>&A7(2u2m1FYoW=wm$gsE?4M~6sKl`divebZ1$kTPM5_h zXc>lCmaaDDI`Nja7SWcOu8a0ty~?Bm6d6;l2{wejxvz>iwKuz@+l9&w;P}qi4;-AP zmZ%dBP*lWB-L&it{RccDDeJO-FJFFwp9&56f)PBTmSJRD%mh`KX~2<7J6)_p@)rYl z*rB0oz1+pt5d0L3MwJ6bMJ3BVxz+eHj|1vDUkfYgJ@NdE0og@6F>P5(7s;6Sm#%*6kp)Lj}iH8^@A4&xJ7D5E2jS0S`0hI=05dYf?0|7zsF9G<< z1*8^&2dWIg1tFsRH!lGk5PAp=$-k``|CjKE2&4|Cnh}Quv4vrf{QJHM0k+G34-QdK zMi?!qF_Z}ES`yU9PXsy+#US}lP6$3xt-!si;NHRi8ov}l;t^D!$1ox&8x>G>I5kKx z9GB#8%Hs{juLI-%|NNcRKn~%wjQ@K?gI)CZ6!>@GYd}C)x>%^YySRF=nYp@xD1&jN k|L>vkFZzn+f4XM>zavCl2^Q`z1}69y20m&u_5R-dKUwDuI{*Lx