From 552cfd5f06fb2d52203bdf33849910f25830ad0b Mon Sep 17 00:00:00 2001 From: minjaesong Date: Wed, 11 Oct 2023 17:59:10 +0900 Subject: [PATCH] pickaxe to drop ores when they were mined --- assets/mods/basegame/items/items.tga | 2 +- assets/mods/basegame/ores/ores.csv | 5 +- src/net/torvald/terrarum/ModMgr.kt | 11 +++ src/net/torvald/terrarum/Terrarum.kt | 4 + .../terrarum/blockproperties/BlockCodex.kt | 5 +- .../terrarum/blockproperties/FluidCodex.kt | 10 +++ .../terrarum/blockproperties/FluidProp.kt | 17 ---- .../terrarum/blockproperties/OreCodex.kt | 84 +++++++++++++++++++ .../terrarum/modulebasegame/EntryPoint.kt | 4 +- .../modulebasegame/gameitems/OreItemBase.kt | 16 +++- .../gameitems/PickaxeGeneric.kt | 8 +- src/shaders/default.vert | 14 ++-- src/shaders/gl32spritebatch.vert | 14 ++-- work_files/graphics/items/basegame_items.kra | 4 +- 14 files changed, 155 insertions(+), 43 deletions(-) delete mode 100644 src/net/torvald/terrarum/blockproperties/FluidProp.kt create mode 100644 src/net/torvald/terrarum/blockproperties/OreCodex.kt diff --git a/assets/mods/basegame/items/items.tga b/assets/mods/basegame/items/items.tga index 823fcc630..532146b18 100644 --- a/assets/mods/basegame/items/items.tga +++ b/assets/mods/basegame/items/items.tga @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a6ff2a13e285787cd048ac775036964a69b881a727459b63c07db7127a1d4d24 +oid sha256:fd0da327d16240fdf182eae0012b29d9b967635aaeda21e82165e36122571561 size 2408466 diff --git a/assets/mods/basegame/ores/ores.csv b/assets/mods/basegame/ores/ores.csv index c66cdbbd4..e3b7e16bb 100644 --- a/assets/mods/basegame/ores/ores.csv +++ b/assets/mods/basegame/ores/ores.csv @@ -11,4 +11,7 @@ #"10";"item@basegame:137";"GEM,TOPAZ" #"11";"item@basegame:138";"GEM,DIAMOND" #"12";"item@basegame:139";"GEM,SIO2,AMETHYST" -#"13";"item@basegame:140";"GEM,SIO2,QUARTZ" \ No newline at end of file +#"13";"item@basegame:140";"GEM,SIO2,QUARTZ" + +#"256";"macro@BASETILE";"GRASS" +#"257";"macro@BASETILE";"MOSS" \ No newline at end of file diff --git a/src/net/torvald/terrarum/ModMgr.kt b/src/net/torvald/terrarum/ModMgr.kt index a5570feca..2125c3c61 100644 --- a/src/net/torvald/terrarum/ModMgr.kt +++ b/src/net/torvald/terrarum/ModMgr.kt @@ -7,6 +7,7 @@ import com.badlogic.gdx.utils.JsonValue import net.torvald.terrarum.App.* import net.torvald.terrarum.App.setToGameConfig import net.torvald.terrarum.blockproperties.BlockCodex +import net.torvald.terrarum.blockproperties.OreCodex import net.torvald.terrarum.blockproperties.WireCodex import net.torvald.terrarum.gamecontroller.IME import net.torvald.terrarum.gameitems.GameItem @@ -491,6 +492,16 @@ object ModMgr { } } + object GameOreLoader { + init { + Terrarum.oreCodex = OreCodex() + } + + @JvmStatic operator fun invoke(module: String) { + Terrarum.oreCodex.fromModule(module, "ores/ores.csv") + } + } + object GameItemLoader { const val itemPath = "items/" diff --git a/src/net/torvald/terrarum/Terrarum.kt b/src/net/torvald/terrarum/Terrarum.kt index 775cbc2c3..b0f7f623d 100644 --- a/src/net/torvald/terrarum/Terrarum.kt +++ b/src/net/torvald/terrarum/Terrarum.kt @@ -19,6 +19,7 @@ import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZE import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZED import net.torvald.terrarum.blockproperties.BlockCodex import net.torvald.terrarum.blockproperties.FluidCodex +import net.torvald.terrarum.blockproperties.OreCodex import net.torvald.terrarum.blockproperties.WireCodex import net.torvald.terrarum.gameactors.Actor import net.torvald.terrarum.gameactors.ActorID @@ -78,6 +79,7 @@ object Terrarum : Disposable { var craftingCodex = CraftingCodex(); internal set var apocryphas = HashMap(); internal set var fluidCodex = FluidCodex(); internal set + var oreCodex = OreCodex(); internal set ////////////////////////////// @@ -765,6 +767,8 @@ val Apocryphas: HashMap get() = Terrarum.apocryphas val FluidCodex: FluidCodex get() = Terrarum.fluidCodex +val OreCodex: OreCodex + get() = Terrarum.oreCodex class Codex : KVHashMap() { diff --git a/src/net/torvald/terrarum/blockproperties/BlockCodex.kt b/src/net/torvald/terrarum/blockproperties/BlockCodex.kt index 2fa90f683..28b6c8e33 100644 --- a/src/net/torvald/terrarum/blockproperties/BlockCodex.kt +++ b/src/net/torvald/terrarum/blockproperties/BlockCodex.kt @@ -4,6 +4,7 @@ import net.torvald.gdx.graphics.Cvec import net.torvald.terrarum.App.printdbg import net.torvald.terrarum.ReferencingRanges.PREFIX_VIRTUALTILE import net.torvald.terrarum.gameitems.ItemID +import net.torvald.terrarum.gameitems.isWall import net.torvald.terrarum.utils.CSVFetcher import net.torvald.util.SortedArrayList import org.apache.commons.csv.CSVRecord @@ -63,7 +64,7 @@ class BlockCodex { } fun fromCSV(module: String, csvString: String) { - printdbg(this, "Building wire properties table for module $module") + printdbg(this, "Building block properties table for module $module") val csvParser = org.apache.commons.csv.CSVParser.parse( csvString, @@ -144,7 +145,7 @@ class BlockCodex { } try { - return if (blockID.startsWith("wall@")) + return if (blockID.isWall()) blockProps[blockID.substring(5)]!! else blockProps[blockID]!! diff --git a/src/net/torvald/terrarum/blockproperties/FluidCodex.kt b/src/net/torvald/terrarum/blockproperties/FluidCodex.kt index 2888a28c6..19a96d72b 100644 --- a/src/net/torvald/terrarum/blockproperties/FluidCodex.kt +++ b/src/net/torvald/terrarum/blockproperties/FluidCodex.kt @@ -1,5 +1,6 @@ package net.torvald.terrarum.blockproperties +import net.torvald.gdx.graphics.Cvec import net.torvald.terrarum.gameitems.ItemID /** @@ -28,4 +29,13 @@ class FluidCodex { } } +} + + + +class FluidProp { + val opacity: Cvec = Cvec() + val lumCol: Cvec = Cvec() + var id: ItemID = "" + var nameKey: String = "" } \ No newline at end of file diff --git a/src/net/torvald/terrarum/blockproperties/FluidProp.kt b/src/net/torvald/terrarum/blockproperties/FluidProp.kt deleted file mode 100644 index 40e41ad2f..000000000 --- a/src/net/torvald/terrarum/blockproperties/FluidProp.kt +++ /dev/null @@ -1,17 +0,0 @@ -package net.torvald.terrarum.blockproperties - -import net.torvald.gdx.graphics.Cvec -import net.torvald.terrarum.gameitems.ItemID - -/** - * Created by minjaesong on 2023-10-09. - */ -class FluidProp { - - val opacity: Cvec = Cvec() - val lumCol: Cvec = Cvec() - var id: ItemID = "" - var nameKey: String = "" - - -} \ No newline at end of file diff --git a/src/net/torvald/terrarum/blockproperties/OreCodex.kt b/src/net/torvald/terrarum/blockproperties/OreCodex.kt new file mode 100644 index 000000000..568b94d10 --- /dev/null +++ b/src/net/torvald/terrarum/blockproperties/OreCodex.kt @@ -0,0 +1,84 @@ +package net.torvald.terrarum.blockproperties + +import net.torvald.terrarum.App +import net.torvald.terrarum.gameitems.ItemID +import net.torvald.terrarum.utils.CSVFetcher +import org.apache.commons.csv.CSVRecord +import java.io.IOException + +/** + * Created by minjaesong on 2023-10-11. + */ +class OreCodex { + + @Transient val oreProps = HashMap() + @Transient private val nullProp = OreProp() + + internal constructor() + + /** + * Later entry (possible from other modules) will replace older ones + */ + fun fromModule(module: String, path: String) { + App.printdbg(this, "Building ore properties table") + try { + register(module, CSVFetcher.readFromModule(module, path)) + } + catch (e: IOException) { e.printStackTrace() } + } + + fun fromCSV(module: String, csvString: String) { + App.printdbg(this, "Building ore properties table for module $module") + + val csvParser = org.apache.commons.csv.CSVParser.parse( + csvString, + CSVFetcher.terrarumCSVFormat + ) + val csvRecordList = csvParser.records + csvParser.close() + + register(module, csvRecordList) + } + + private fun register(module: String, records: List) { + records.forEach { + setProp(module, it.intVal("id"), it) + } + } + + private fun setProp(modname: String, key: Int, record: CSVRecord) { + val prop = OreProp() + prop.id = "ores@$modname:$key" + prop.tags = record.get("tags").split(',').map { it.trim() }.toHashSet() + prop.item = record.get("item").let { if (it == null) "" else if (it.contains(':')) it else "$modname:$it" } + + oreProps[prop.id] = prop + + App.printdbg(this, "Setting prop ${prop.id}") + } + + fun getAll() = oreProps.values + + operator fun get(oreID: ItemID?): OreProp { + if (oreID == null || oreID == Block.NULL) { + return nullProp + } + + try { + return oreProps[oreID]!! + } + catch (e: NullPointerException) { + throw NullPointerException("Oreprop with id $oreID does not exist.") + } + } +} + + +class OreProp { + var id: String = "" + var item: ItemID = "" + var tags = HashSet() + + fun hasTag(s: String) = tags.contains(s) + +} \ No newline at end of file diff --git a/src/net/torvald/terrarum/modulebasegame/EntryPoint.kt b/src/net/torvald/terrarum/modulebasegame/EntryPoint.kt index 8756f4e58..6f3123b45 100644 --- a/src/net/torvald/terrarum/modulebasegame/EntryPoint.kt +++ b/src/net/torvald/terrarum/modulebasegame/EntryPoint.kt @@ -4,6 +4,7 @@ import net.torvald.terrarum.* import net.torvald.terrarum.App.IS_DEVELOPMENT_BUILD import net.torvald.terrarum.App.printdbg import net.torvald.terrarum.blockproperties.BlockProp +import net.torvald.terrarum.blockproperties.OreProp import net.torvald.terrarum.gameactors.ActorWithBody import net.torvald.terrarum.gameitems.GameItem import net.torvald.terrarum.itemproperties.CraftingCodex @@ -39,6 +40,7 @@ class EntryPoint : ModuleEntryPoint() { ModMgr.GameMaterialLoader.invoke(moduleName) ModMgr.GameItemLoader.invoke(moduleName) ModMgr.GameBlockLoader.invoke(moduleName) + ModMgr.GameOreLoader.invoke(moduleName) ModMgr.GameLanguageLoader.invoke(moduleName) ModMgr.GameCraftingRecipeLoader.invoke(moduleName) @@ -60,7 +62,7 @@ class EntryPoint : ModuleEntryPoint() { printdbg(this, "recording item ID ") // blocks.csvs are loaded by ModMgr beforehand - // block items (blocks and walls are the same thing basically) + // register blocks as items for (tile in BlockCodex.getAll()) { ItemCodex[tile.id] = makeNewItemObj(tile, false) diff --git a/src/net/torvald/terrarum/modulebasegame/gameitems/OreItemBase.kt b/src/net/torvald/terrarum/modulebasegame/gameitems/OreItemBase.kt index c705a1fda..e603ef82e 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameitems/OreItemBase.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameitems/OreItemBase.kt @@ -14,16 +14,24 @@ open class OreItemBase(originalID: ItemID) : GameItem(originalID) { override var inventoryCategory = Category.GENERIC override val isDynamic = false override val materialId = "OORE" + override var equipPosition = EquipPosition.HAND_GRIP } -class OreTimber(originalID: ItemID) : OreItemBase(originalID) { - override var originalName = "ITEM_WOODS" +/* Wooden Log is a block */ +class OreWood(originalID: ItemID) : OreItemBase(originalID) { + override var originalName = "ITEM_WOOD" override val materialId = "WOOD" override val itemImage: TextureRegion get() = CommonResourcePool.getAsItemSheet("basegame.items").get(0,6) } -class OreCopper(originalID: ItemID) : OreItemBase(originalID) { - override var originalName = "ITEM_ORE_MALACHITE" +class OreStick(originalID: ItemID) : OreItemBase(originalID) { + override var originalName = "ITEM_WOOD_STICK" + override val materialId = "WOOD" override val itemImage: TextureRegion get() = CommonResourcePool.getAsItemSheet("basegame.items").get(1,6) } +class OreCopper(originalID: ItemID) : OreItemBase(originalID) { + override var originalName = "ITEM_ORE_MALACHITE" + override val itemImage: TextureRegion + get() = CommonResourcePool.getAsItemSheet("basegame.items").get(2,6) +} diff --git a/src/net/torvald/terrarum/modulebasegame/gameitems/PickaxeGeneric.kt b/src/net/torvald/terrarum/modulebasegame/gameitems/PickaxeGeneric.kt index 6e0f70644..e38f17a49 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameitems/PickaxeGeneric.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameitems/PickaxeGeneric.kt @@ -2,6 +2,7 @@ package net.torvald.terrarum.modulebasegame.gameitems import com.badlogic.gdx.graphics.g2d.TextureRegion import net.torvald.terrarum.* +import net.torvald.terrarum.App.printdbg import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZE import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZED import net.torvald.terrarum.blockproperties.Block @@ -74,13 +75,18 @@ object PickaxeCore { // filter passed, do the job val swingDmgToFrameDmg = delta.toDouble() / actorvalue.getAsDouble(AVKey.ACTION_INTERVAL)!! + val (oreOnTile, _) = INGAME.world.getTileFromOre(x, y) (INGAME.world).inflictTerrainDamage( x, y, Calculate.pickaxePower(actor, item?.material) * swingDmgToFrameDmg )?.let { tileBroken -> if (Math.random() < dropProbability) { - val drop = BlockCodex[tileBroken].drop + val drop = if (oreOnTile != Block.AIR) + OreCodex[oreOnTile].item + else + BlockCodex[tileBroken].drop + if (drop.isNotBlank()) { INGAME.queueActorAddition(DroppedItem(drop, (x + 0.5) * TILE_SIZED, (y + 1.0) * TILE_SIZED)) } diff --git a/src/shaders/default.vert b/src/shaders/default.vert index d36736135..ceefabb4d 100644 --- a/src/shaders/default.vert +++ b/src/shaders/default.vert @@ -1,14 +1,14 @@ -in vec4 a_position; -in vec4 a_color; -in vec4 a_generic; -in vec2 a_texCoord0; +in highp vec4 a_position; +in highp vec4 a_color; +in highp vec4 a_generic; +in highp vec2 a_texCoord0; uniform mat4 u_projTrans; -out vec4 v_color; -out vec2 v_texCoords; -out vec4 v_generic; +out mediump vec4 v_color; +out highp vec2 v_texCoords; +out highp vec4 v_generic; void main() { v_color = a_color; diff --git a/src/shaders/gl32spritebatch.vert b/src/shaders/gl32spritebatch.vert index d36736135..ceefabb4d 100644 --- a/src/shaders/gl32spritebatch.vert +++ b/src/shaders/gl32spritebatch.vert @@ -1,14 +1,14 @@ -in vec4 a_position; -in vec4 a_color; -in vec4 a_generic; -in vec2 a_texCoord0; +in highp vec4 a_position; +in highp vec4 a_color; +in highp vec4 a_generic; +in highp vec2 a_texCoord0; uniform mat4 u_projTrans; -out vec4 v_color; -out vec2 v_texCoords; -out vec4 v_generic; +out mediump vec4 v_color; +out highp vec2 v_texCoords; +out highp vec4 v_generic; void main() { v_color = a_color; diff --git a/work_files/graphics/items/basegame_items.kra b/work_files/graphics/items/basegame_items.kra index e4de19dc3..7388eeb39 100644 --- a/work_files/graphics/items/basegame_items.kra +++ b/work_files/graphics/items/basegame_items.kra @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:04f8eea7cc54d52558f85191ac5e57e1d6d238fb09c84f6f785f6bffa3a57245 -size 333702 +oid sha256:7bf207efb6d6706912105bc60aa2d4fcc980fd1a3ed10f335ab3f60bfdba5eb7 +size 383944