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