diff --git a/Terrarum_renewed.iml b/Terrarum_renewed.iml index 95c716382..ed975cde6 100644 --- a/Terrarum_renewed.iml +++ b/Terrarum_renewed.iml @@ -5,39 +5,14 @@ - - - + + + + @@ -55,5 +30,6 @@ + \ No newline at end of file diff --git a/assets/modules/LoadOrder.csv b/assets/modules/LoadOrder.csv index e7eee8dd7..a7eed6d60 100644 --- a/assets/modules/LoadOrder.csv +++ b/assets/modules/LoadOrder.csv @@ -1,9 +1,10 @@ -# Load order +# Load Order # Modules are loaded from top to bottom. -# And yes, you can disable basegame, but we don't recommend. # Acceptable formats: -# module_name,description_in_English_no_comma, -# module_name,description_in_English_no_comma,(external Jar 1);(external Jar 2); ... +# module_name,description_in_English_no_comma,(entry_point.kts),(external Jars sep'd by semicolon)... +# If entry_point is not given, the program will try to run .kts. +# if even that does not exist, an the program will quit with error. +# and yes, you can disable basegame, but we don't recommend. -basegame,The base game, -dwarventech,Dwarven technicians are emerged, +basegame,The base game,basegame.groovy, +dwarventech,Dwarven technicians are emerged from their hiding,, diff --git a/assets/modules/basegame/LuaScriptTest.lua b/assets/modules/basegame/LuaScriptTest.lua new file mode 100644 index 000000000..406f745b9 --- /dev/null +++ b/assets/modules/basegame/LuaScriptTest.lua @@ -0,0 +1 @@ +print "Hello, world!" \ No newline at end of file diff --git a/assets/modules/basegame/basegame.groovy b/assets/modules/basegame/basegame.groovy new file mode 100644 index 000000000..8988ef10f --- /dev/null +++ b/assets/modules/basegame/basegame.groovy @@ -0,0 +1,9 @@ +import net.torvald.terrarum.ModMgr + +/** + * Created by SKYHi14 on 2017-04-26. + */ + +static void invoke(String module) { + ModMgr.GameItemLoader.invoke(module) +} diff --git a/assets/modules/basegame/items/itemid.csv b/assets/modules/basegame/items/itemid.csv index 2bd1034b1..573a15943 100644 --- a/assets/modules/basegame/items/itemid.csv +++ b/assets/modules/basegame/items/itemid.csv @@ -1,2 +1,2 @@ "id";"filename" - "8448";"testpick.lua" \ No newline at end of file + "8448";"testpick.groovy" \ No newline at end of file diff --git a/assets/modules/basegame/items/testpick.groovy b/assets/modules/basegame/items/testpick.groovy new file mode 100644 index 000000000..6bf6a0fdb --- /dev/null +++ b/assets/modules/basegame/items/testpick.groovy @@ -0,0 +1,97 @@ + +/** + * Created by SKYHi14 on 2017-04-26. + */ + + +import net.torvald.point.Point2d +import net.torvald.terrarum.Terrarum +import net.torvald.terrarum.gameactors.AVKey +import net.torvald.terrarum.gameactors.ActorWithPhysics +import net.torvald.terrarum.itemproperties.Calculate +import net.torvald.terrarum.itemproperties.InventoryItem +import net.torvald.terrarum.itemproperties.Material +import net.torvald.terrarum.tileproperties.Tile +import org.jetbrains.annotations.NotNull +import org.newdawn.slick.GameContainer + + + +static InventoryItem invoke(int id) { + return new TestPick(id) +} + + +class TestPick extends InventoryItem { + + int originalID + int dynamicID + String originalName = "GROOVY_PICK" + double baseMass = 10.0 + Double baseToolSize = 10.0 + boolean stackable = true + int maxDurability = 147 + float durability = maxDurability + int equipPosition = 9 //EquipPosition.HAND_GRIP + String inventoryCategory = "tool" //Category.TOOL + + // !! TEST MATERIAL !! + Material material = new Material(0,0,0,0,0,0,0,0,1,0.0) + + TestPick(int id) { + originalID = id + dynamicID = id + name = "Groovy Pickaxe" + } + + @Override + boolean isUnique() { + return false + } + + @Override + boolean isDynamic() { + return true + } + + @Override + boolean primaryUse(@NotNull GameContainer gc, int delta) { + int mouseTileX = Terrarum.getMouseTileX() + int mouseTileY = Terrarum.getMouseTileY() + + def mousePoint = new Point2d(mouseTileX, mouseTileY) + def actorvalue = Terrarum.ingame.player.actorValue + + using = true + + // linear search filter (check for intersection with tilewise mouse point and tilewise hitbox) + // return false if hitting actors + Terrarum.ingame.actorContainer.forEach({ + if (it instanceof ActorWithPhysics && it.tilewiseHitbox.intersects(mousePoint)) + return false + }) + + // return false if here's no tile + if (Tile.AIR == Terrarum.ingame.world.getTileFromTerrain(mouseTileX, mouseTileY)) + return false + + // filter passed, do the job + double swingDmgToFrameDmg = delta.toDouble() / actorvalue.getAsDouble(AVKey.ACTION_INTERVAL) + + Terrarum.ingame.world.inflictTerrainDamage( + mouseTileX, mouseTileY, + Calculate.pickaxePower(Terrarum.ingame.player, material) * swingDmgToFrameDmg + ) + + return true + } + + @Override + boolean endPrimaryUse(@NotNull GameContainer gc, int delta) { + using = false + // reset action timer to zero + Terrarum.ingame.player.actorValue.set(AVKey.__ACTION_TIMER, 0.0) + return true + } +} + diff --git a/assets/modules/basegame/materialprop.csv b/assets/modules/basegame/materialprop.csv index d0bf2cb1c..f36003b1f 100644 --- a/assets/modules/basegame/materialprop.csv +++ b/assets/modules/basegame/materialprop.csv @@ -6,10 +6,14 @@ "argn"; "9"; "0.91";"argentum/silver" "stal"; "14"; "1.73";"steel" "eaur"; "21"; "1.36";"elven aurichalcum" -"tial"; "33"; "2.16";"titanium alloy" +"tial"; "33"; "2.16";"titanium alloy (Ti6Al4V)" "admt"; "71"; "3.42";"adamant" +# idst: ID_STRING + # forcemod: related to attack points # Attack points = `4 * forcemod.sqrt()` for each strike # endurance: multiplier, using copper as reference; determines durability of tools/weapons/armours/etc. + +# Comments: do nothing; do not parse diff --git a/assets/modules/basegame/test.groovy b/assets/modules/basegame/test.groovy new file mode 100644 index 000000000..dcff01b73 --- /dev/null +++ b/assets/modules/basegame/test.groovy @@ -0,0 +1,3 @@ + +println("Hello, world!!") +return 42 \ No newline at end of file diff --git a/lib/kotlin-reflect.jar b/lib/kotlin-reflect.jar index 896a39362..c27a45451 100755 Binary files a/lib/kotlin-reflect.jar and b/lib/kotlin-reflect.jar differ diff --git a/lib/kotlin-runtime-sources.jar b/lib/kotlin-runtime-sources.jar index 31c6f0997..8497bcdee 100755 Binary files a/lib/kotlin-runtime-sources.jar and b/lib/kotlin-runtime-sources.jar differ diff --git a/lib/kotlin-runtime.jar b/lib/kotlin-runtime.jar index 0ec4ec7b3..bde2b4b9c 100755 Binary files a/lib/kotlin-runtime.jar and b/lib/kotlin-runtime.jar differ diff --git a/src/net/torvald/IntArrayStack.kt b/src/net/torvald/dataclass/IntArrayStack.kt similarity index 98% rename from src/net/torvald/IntArrayStack.kt rename to src/net/torvald/dataclass/IntArrayStack.kt index 1c587cb43..40721fdcd 100644 --- a/src/net/torvald/IntArrayStack.kt +++ b/src/net/torvald/dataclass/IntArrayStack.kt @@ -1,4 +1,4 @@ -package net.torvald +package net.torvald.dataclass import java.util.* diff --git a/src/net/torvald/terrarum/AmmoMeterProxy.kt b/src/net/torvald/terrarum/AmmoMeterProxy.kt index e14e97334..0aa20bb5b 100644 --- a/src/net/torvald/terrarum/AmmoMeterProxy.kt +++ b/src/net/torvald/terrarum/AmmoMeterProxy.kt @@ -2,7 +2,6 @@ package net.torvald.terrarum import net.torvald.terrarum.gameactors.ActorHumanoid import net.torvald.terrarum.itemproperties.InventoryItem -import net.torvald.terrarum.itemproperties.ItemCodex import net.torvald.terrarum.ui.UIVitalMetre /** diff --git a/src/net/torvald/terrarum/ModMgr.kt b/src/net/torvald/terrarum/ModMgr.kt index 8e648eb49..e4112e465 100644 --- a/src/net/torvald/terrarum/ModMgr.kt +++ b/src/net/torvald/terrarum/ModMgr.kt @@ -1,21 +1,41 @@ package net.torvald.terrarum +import net.torvald.CSVFetcher +import net.torvald.terrarum.itemproperties.InventoryItem +import net.torvald.terrarum.itemproperties.ItemCodex import org.apache.commons.csv.CSVFormat import org.apache.commons.csv.CSVParser import java.io.File import java.io.FileNotFoundException +import java.io.FileReader import java.nio.file.FileSystems +import javax.script.ScriptEngineManager +import javax.script.Invocable + + /** * Modules Resource Manager * + * + * NOTE!!: Usage of Groovy is only temporary; if Kotlin's "JSR 223" is no longer experimental and + * is readily available, ditch that Groovy. + * + * * Created by SKYHi14 on 2017-04-17. */ object ModMgr { - data class ModuleMetadata(val order: Int, val isDir: Boolean, val desc: String, val libraries: Array) { + data class ModuleMetadata( + val order: Int, + val isDir: Boolean, + val desc: String, + val entryPoint: String, + val libraries: Array + ) { override fun toString() = "\tModule #$order -- $desc\n" + + "\tEntry point: $entryPoint\n" + "\tExternal libraries: ${libraries.joinToString(", ")}" } const val modDir = "./assets/modules" @@ -38,12 +58,46 @@ object ModMgr { println("[ModMgr] Loading module $moduleName") val description = it[1] - val libs = it[2].split(';').toTypedArray() + val entryPoint = it[2] + val libs = it[3].split(';').toTypedArray() val isDir = FileSystems.getDefault().getPath("$modDir/$moduleName").toFile().isDirectory - moduleInfo[moduleName] = ModuleMetadata(index, isDir, description, libs) + moduleInfo[moduleName] = ModuleMetadata(index, isDir, description, entryPoint, libs) println(moduleInfo[moduleName]) + + + // run entry script in entry point + if (entryPoint.isNotBlank()) { + val extension = entryPoint.split('.').last() + val engine = ScriptEngineManager().getEngineByExtension(extension)!! + val invocable = engine as Invocable + engine.eval(FileReader(getFile(moduleName, entryPoint))) + invocable.invokeFunction("invoke", moduleName) + } + + + println("[ModMgr] $moduleName loaded successfully") } + + + /*val manager = ScriptEngineManager() + val factories = manager.engineFactories + for (f in factories) { + println("engine name:" + f.engineName) + println("engine version:" + f.engineVersion) + println("language name:" + f.languageName) + println("language version:" + f.languageVersion) + println("names:" + f.names) + println("mime:" + f.mimeTypes) + println("extension:" + f.extensions) + println("-----------------------------------------------") + }*/ + + + /*val engine = ScriptEngineManager().getEngineByExtension("groovy")!! + engine.eval(FileReader(getFile("basegame", "/items/testpick.groovy"))) + val newPick = (engine as Invocable).invokeFunction("invoke", 8449) as InventoryItem + ItemCodex[8449] = newPick*/ } private fun checkExistence(module: String) { @@ -74,4 +128,27 @@ object ModMgr { return dir.listFiles() } } + + + + object GameItemLoader { + + val itemPath = "items/" + + @JvmStatic operator fun invoke(module: String) { + val engine = ScriptEngineManager().getEngineByExtension("groovy")!! + val invocable = engine as Invocable + + val csv = CSVFetcher.readFromModule(module, itemPath + "itemid.csv") + csv.forEach { + val filename = it["filename"].toString() + val script = getFile(module, itemPath + filename).readText() + val itemID = it["id"].toInt() + + engine.eval(script) + ItemCodex[itemID] = invocable.invokeFunction("invoke", itemID) as InventoryItem + } + } + + } } \ No newline at end of file diff --git a/src/net/torvald/terrarum/StateInGame.kt b/src/net/torvald/terrarum/StateInGame.kt index 81db699e9..c1a819b2f 100644 --- a/src/net/torvald/terrarum/StateInGame.kt +++ b/src/net/torvald/terrarum/StateInGame.kt @@ -69,7 +69,7 @@ class StateInGame : BasicGameState() { var playableActorDelegate: PlayableActorDelegate? = null // DO NOT LATEINIT! private set - internal val player: ActorHumanoid? // currently POSSESSED actor :) + val player: ActorHumanoid? // currently POSSESSED actor :) get() = playableActorDelegate?.actor var screenZoom = 1.0f diff --git a/src/net/torvald/terrarum/StateUITest.kt b/src/net/torvald/terrarum/StateUITest.kt index b2ea10226..73e0b2c26 100644 --- a/src/net/torvald/terrarum/StateUITest.kt +++ b/src/net/torvald/terrarum/StateUITest.kt @@ -4,6 +4,7 @@ import net.torvald.terrarum.gameactors.* import net.torvald.terrarum.itemproperties.IVKey import net.torvald.terrarum.itemproperties.InventoryItem import net.torvald.terrarum.itemproperties.ItemCodex +import net.torvald.terrarum.itemproperties.Material import net.torvald.terrarum.tileproperties.Tile import net.torvald.terrarum.ui.* import org.newdawn.slick.* @@ -58,6 +59,7 @@ class StateUITest : BasicGameState() { override var durability: Float = 64f override var stackable = false override val isDynamic = true + override val material = Material(0,0,0,0,0,0,0,0,0,0.0) }) actor.inventory.getByDynamicID(5656)!!.item.name = "Test tool" @@ -74,6 +76,7 @@ class StateUITest : BasicGameState() { override var inventoryCategory: String = InventoryItem.Category.MISC override var stackable = false override val isDynamic = false + override val material = Material(0,0,0,0,0,0,0,0,0,0.0) }) actor.inventory.add(ItemCodex[16], 543) diff --git a/src/net/torvald/terrarum/Terrarum.kt b/src/net/torvald/terrarum/Terrarum.kt index ec60703e0..d55aac3c2 100644 --- a/src/net/torvald/terrarum/Terrarum.kt +++ b/src/net/torvald/terrarum/Terrarum.kt @@ -7,6 +7,8 @@ import net.torvald.imagefont.GameFontImpl import net.torvald.JsonFetcher import net.torvald.JsonWriter import net.torvald.imagefont.TinyAlphNum +import net.torvald.terrarum.gamecontroller.mouseTileX +import net.torvald.terrarum.gamecontroller.mouseTileY import net.torvald.terrarum.gameworld.toUint import org.lwjgl.input.Controllers import org.lwjgl.opengl.* @@ -500,6 +502,12 @@ object Terrarum : StateBasedGame(GAME_NAME) { return file // TODO TEST CODE } + + + + // for external scripts (e.g. Groovy) + @JvmStatic fun getMouseTileX(): Int = appgc.mouseTileX + @JvmStatic fun getMouseTileY(): Int = appgc.mouseTileY } fun main(args: Array) { diff --git a/src/net/torvald/terrarum/gameactors/ActorHumanoid.kt b/src/net/torvald/terrarum/gameactors/ActorHumanoid.kt index a084213d4..803786765 100644 --- a/src/net/torvald/terrarum/gameactors/ActorHumanoid.kt +++ b/src/net/torvald/terrarum/gameactors/ActorHumanoid.kt @@ -6,6 +6,7 @@ import net.torvald.terrarum.Terrarum import net.torvald.terrarum.gameactors.faction.Faction import net.torvald.terrarum.gamecontroller.EnumKeyFunc import net.torvald.terrarum.itemproperties.InventoryItem +import net.torvald.terrarum.itemproperties.Material import net.torvald.terrarum.realestate.LandUtil import org.newdawn.slick.GameContainer import org.newdawn.slick.Input @@ -147,6 +148,7 @@ open class ActorHumanoid(birth: GameDate, death: GameDate? = null) override val originalName: String = actorValue.getAsString(AVKey.NAME) ?: "(no name)" override var stackable = false override val isDynamic = false + override val material = Material(0,0,0,0,0,0,0,0,0,0.0) } override fun update(gc: GameContainer, delta: Int) { diff --git a/src/net/torvald/terrarum/gameactors/HumanoidNPC.kt b/src/net/torvald/terrarum/gameactors/HumanoidNPC.kt index 73eacede9..e417fb321 100644 --- a/src/net/torvald/terrarum/gameactors/HumanoidNPC.kt +++ b/src/net/torvald/terrarum/gameactors/HumanoidNPC.kt @@ -8,6 +8,7 @@ import net.torvald.terrarum.gameactors.ai.LuaAIWrapper import net.torvald.terrarum.gamecontroller.mouseX import net.torvald.terrarum.gamecontroller.mouseY import net.torvald.terrarum.itemproperties.InventoryItem +import net.torvald.terrarum.itemproperties.Material import org.luaj.vm2.* import org.luaj.vm2.compiler.LuaC import org.luaj.vm2.lib.* @@ -59,6 +60,7 @@ open class HumanoidNPC( override val originalName: String = actorValue.getAsString(AVKey.NAME) ?: "NPC" override var stackable = true override val isDynamic = false + override val material = Material(0,0,0,0,0,0,0,0,0,0.0) override fun secondaryUse(gc: GameContainer, delta: Int): Boolean { try { diff --git a/src/net/torvald/terrarum/gameworld/GameWorld.kt b/src/net/torvald/terrarum/gameworld/GameWorld.kt index 94b81b9ae..0bfc00428 100644 --- a/src/net/torvald/terrarum/gameworld/GameWorld.kt +++ b/src/net/torvald/terrarum/gameworld/GameWorld.kt @@ -230,7 +230,8 @@ class GameWorld(val width: Int, val height: Int) { /** * @return true if block is broken */ - fun inflctTerrainDamage(x: Int, y: Int, damage: Float): Boolean { + fun inflictTerrainDamage(x: Int, y: Int, damage: Double): Boolean { + val damage = damage.toFloat() val addr = LandUtil.getTileAddr(x, y) //println("[GameWorld] ($x, $y) Damage: $damage") @@ -261,7 +262,8 @@ class GameWorld(val width: Int, val height: Int) { /** * @return true if block is broken */ - fun inflctWallDamage(x: Int, y: Int, damage: Float): Boolean { + fun inflictWallDamage(x: Int, y: Int, damage: Double): Boolean { + val damage = damage.toFloat() val addr = LandUtil.getTileAddr(x, y) if (wallDamages[addr] == null) { // add new diff --git a/src/net/torvald/terrarum/itemproperties/Calculate.kt b/src/net/torvald/terrarum/itemproperties/Calculate.kt index 900539922..fc812937f 100644 --- a/src/net/torvald/terrarum/itemproperties/Calculate.kt +++ b/src/net/torvald/terrarum/itemproperties/Calculate.kt @@ -15,7 +15,7 @@ object Calculate { * * TODO Newtons as unit? */ - fun pickaxePower(actor: ActorHumanoid, material: Material): Float { + @JvmStatic fun pickaxePower(actor: ActorHumanoid, material: Material): Float { return (4.0 * material.forceMod.toDouble().sqrt() * (actor.avStrength / 1000.0)).toFloat() } diff --git a/src/net/torvald/terrarum/itemproperties/InventoryItem.kt b/src/net/torvald/terrarum/itemproperties/InventoryItem.kt index 25f7627a9..911865d5b 100644 --- a/src/net/torvald/terrarum/itemproperties/InventoryItem.kt +++ b/src/net/torvald/terrarum/itemproperties/InventoryItem.kt @@ -75,7 +75,7 @@ abstract class InventoryItem : Comparable, Cloneable { */ open val equipPosition: Int = EquipPosition.NULL - open val material: Material? = null + abstract val material: Material /** * Apparent mass of the item. (basemass * scale^3) diff --git a/src/net/torvald/terrarum/itemproperties/ItemCodex.kt b/src/net/torvald/terrarum/itemproperties/ItemCodex.kt index b0a819cc1..da768e779 100644 --- a/src/net/torvald/terrarum/itemproperties/ItemCodex.kt +++ b/src/net/torvald/terrarum/itemproperties/ItemCodex.kt @@ -3,13 +3,11 @@ package net.torvald.terrarum.itemproperties import net.torvald.point.Point2d import net.torvald.terrarum.KVHashMap import net.torvald.terrarum.gameactors.CanBeAnItem -import net.torvald.terrarum.itemproperties.InventoryItem import net.torvald.terrarum.Terrarum import net.torvald.terrarum.gameactors.AVKey import net.torvald.terrarum.gameactors.ActorWithPhysics import net.torvald.terrarum.gamecontroller.mouseTileX import net.torvald.terrarum.gamecontroller.mouseTileY -import net.torvald.terrarum.itemproperties.IVKey import net.torvald.terrarum.gameworld.GameWorld import net.torvald.terrarum.mapdrawer.TilesDrawer import net.torvald.terrarum.mapdrawer.TilesDrawer.wallOverlayColour @@ -56,6 +54,7 @@ object ItemCodex { override var stackable = true override var inventoryCategory = Category.BLOCK override var isDynamic = false + override val material = Material(0,0,0,0,0,0,0,0,0,0.0) init { itemProperties[IVKey.ITEMTYPE] = if (i in ITEM_TILES) @@ -104,7 +103,7 @@ object ItemCodex { } // test copper pickaxe - itemCodex[ITEM_STATIC.first] = object : InventoryItem() { + /*itemCodex[ITEM_STATIC.first] = object : InventoryItem() { override val originalID = ITEM_STATIC.first override var dynamicID = originalID override val isUnique = false @@ -117,11 +116,7 @@ object ItemCodex { override var equipPosition = EquipPosition.HAND_GRIP override var inventoryCategory = Category.TOOL override val isDynamic = true - - - private val testmaterial = Material( - 0,0,0,0,0,0,0,0,1,0.0 // quick test material Stone - ) + override val material = Material(0,0,0,0,0,0,0,0,1,0.0) init { itemProperties[IVKey.ITEMTYPE] = IVKey.ItemType.PICK @@ -150,10 +145,10 @@ object ItemCodex { // filter passed, do the job val swingDmgToFrameDmg = delta.toDouble() / actorvalue.getAsDouble(AVKey.ACTION_INTERVAL)!! - Terrarum.ingame!!.world.inflctTerrainDamage( + Terrarum.ingame!!.world.inflictTerrainDamage( gc.mouseTileX, gc.mouseTileY, - Calculate.pickaxePower(Terrarum.ingame!!.player!!, testmaterial) * swingDmgToFrameDmg.toFloat() + Calculate.pickaxePower(Terrarum.ingame!!.player!!, material) * swingDmgToFrameDmg ) return true } @@ -164,9 +159,8 @@ object ItemCodex { Terrarum.ingame!!.player!!.actorValue[AVKey.__ACTION_TIMER] = 0.0 return true } - } + }*/ - // TODO read prop in Lua and fill itemCodex // read from save (if applicable) and fill dynamicItemDescription } @@ -188,6 +182,13 @@ object ItemCodex { } } + /** + * Mainly used by GameItemLoader + */ + operator fun set(code: Int, item: InventoryItem) { + itemCodex[code] = item + } + fun getItemImage(item: InventoryItem): Image { // terrain if (item.originalID in ITEM_TILES) { diff --git a/src/net/torvald/terrarum/itemproperties/ItemEffectsLuaAPI.kt b/src/net/torvald/terrarum/itemproperties/ItemEffectsLuaAPI.kt index 455ff5a35..dd929d829 100644 --- a/src/net/torvald/terrarum/itemproperties/ItemEffectsLuaAPI.kt +++ b/src/net/torvald/terrarum/itemproperties/ItemEffectsLuaAPI.kt @@ -47,13 +47,13 @@ class ItemEffectsLuaAPI(g: Globals) { class StrikeEarth : ThreeArgFunction() { override fun call(x: LuaValue, y: LuaValue, power: LuaValue): LuaValue { - Terrarum.ingame!!.world.inflctTerrainDamage(x.checkint(), y.checkint(), power.checkdouble().toFloat()) + Terrarum.ingame!!.world.inflictTerrainDamage(x.checkint(), y.checkint(), power.checkdouble()) return LuaValue.NONE } } class StrikeWall : ThreeArgFunction() { override fun call(x: LuaValue, y: LuaValue, power: LuaValue): LuaValue { - Terrarum.ingame!!.world.inflctWallDamage(x.checkint(), y.checkint(), power.checkdouble().toFloat()) + Terrarum.ingame!!.world.inflictWallDamage(x.checkint(), y.checkint(), power.checkdouble()) return LuaValue.NONE } } diff --git a/src/net/torvald/terrarum/mapgenerator/RoguelikeRandomiser.kt b/src/net/torvald/terrarum/mapgenerator/RoguelikeRandomiser.kt index 980ffc48e..b8fd56288 100644 --- a/src/net/torvald/terrarum/mapgenerator/RoguelikeRandomiser.kt +++ b/src/net/torvald/terrarum/mapgenerator/RoguelikeRandomiser.kt @@ -1,6 +1,6 @@ package net.torvald.terrarum.mapgenerator -import net.torvald.IntArrayStack +import net.torvald.dataclass.IntArrayStack import net.torvald.colourutil.Col4096 import net.torvald.random.HQRNG import org.newdawn.slick.Color diff --git a/src/net/torvald/terrarum/ui/MessageWindow.kt b/src/net/torvald/terrarum/ui/MessageWindow.kt index 3f8af2935..0b15b0041 100644 --- a/src/net/torvald/terrarum/ui/MessageWindow.kt +++ b/src/net/torvald/terrarum/ui/MessageWindow.kt @@ -17,7 +17,7 @@ constructor(override var width: Int, isBlackVariant: Boolean) : UICanvas { private var segmentRight: Image? = null private var segmentBody: Image? = null - private lateinit var messagesList: Array + var messagesList: Array override var height: Int = 0 private val messageWindowRadius: Int diff --git a/work_files/GameDesign/ITEMS_REQUIRED.md b/work_files/GameDesign/ITEMS_REQUIRED.md new file mode 100644 index 000000000..2afea7d68 --- /dev/null +++ b/work_files/GameDesign/ITEMS_REQUIRED.md @@ -0,0 +1,39 @@ +# Package BASEGAME + +## Tools +- Pickaxe -- all 9 tool materials +- Hatchet -- all 9 tool materials + + +## Weapons +- Bows + - Longbow + - Hunting bow + -- TODO discriminate two above +- Halberd + - all 8 metals +- Sword + - all 8 metals + - neolithic polished knife + + +## Armour +- Headgear + - all 8 metals +- Body + - all 8 metals +- Boots + - all 8 metals + + +## Misc. +- Dye bottle -- Game will use this master to generate 64 dyes +- Generic tapestry +- Basic loom (16/64 col, print on the fly, no undo, can only use dyes you currently have) + + +# Package DWARVENTECH + +## Misc. +- Loom with computer (16/64 col, internal editor that "prints" when design is completed, undo/redo, save/load + can use all colours, shows how much dyes you need to "print out") \ No newline at end of file