diff --git a/src/net/torvald/terrarum/console/Inventory.kt b/src/net/torvald/terrarum/console/Inventory.kt index 44bae1796..2b58c72b2 100644 --- a/src/net/torvald/terrarum/console/Inventory.kt +++ b/src/net/torvald/terrarum/console/Inventory.kt @@ -4,6 +4,7 @@ import net.torvald.terrarum.Terrarum import net.torvald.terrarum.gameactors.ActorInventory import net.torvald.terrarum.gameactors.Player import net.torvald.terrarum.gameactors.Pocketed +import net.torvald.terrarum.gameitem.EquipPosition import net.torvald.terrarum.itemproperties.ItemPropCodex /** @@ -22,7 +23,7 @@ internal object Inventory : ConsoleCommand { "list" -> listInventory() "add" -> addItem(args[2].toInt(), args[3].toInt()) "target" -> setTarget(args[2].toInt()) - "hold" -> holdItem(args[2].toInt()) + "equip" -> equipItem(args[2].toInt()) else -> printUsage() } } @@ -56,19 +57,20 @@ internal object Inventory : ConsoleCommand { target.inventory.add(ItemPropCodex.getProp(refId), amount) } - private fun holdItem(refId: Int) { + private fun equipItem(refId: Int) { + val item = ItemPropCodex.getProp(refId) + // if the item does not exist, add it first - if (!target.inventory.contains(refId)) { - target.inventory.add(refId) + if (!target.inventory.contains(item)) { + target.inventory.add(item) } - target.itemHolding = ItemPropCodex.getProp(refId) + target.itemEquipped[item.equipPosition] = item } override fun printUsage() { Echo("Usage: inventory command arguments") Echo("Available commands:") - Echo("list | assign slot | add itemid [amount] | target [actorid] | hold itemid") - Echo("equip itemid") + Echo("list | assign slot | add itemid [amount] | target [actorid] | equip itemid") } } \ No newline at end of file diff --git a/src/net/torvald/terrarum/gameactors/ActorHumanoid.kt b/src/net/torvald/terrarum/gameactors/ActorHumanoid.kt index 78d6f9980..55cf9ad34 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.gameactors.* import net.torvald.terrarum.gameactors.faction.Faction import net.torvald.terrarum.gamecontroller.EnumKeyFunc import net.torvald.terrarum.gamecontroller.KeyMap +import net.torvald.terrarum.gameitem.EquipPosition import net.torvald.terrarum.gameitem.InventoryItem import net.torvald.terrarum.gameitem.InventoryItemAdapter import net.torvald.terrarum.realestate.RealEstateUtility @@ -27,8 +28,7 @@ open class ActorHumanoid(birth: GameDate, death: GameDate? = null) /** Must be set by PlayerFactory */ override var inventory: ActorInventory = ActorInventory() - override var itemHolding: InventoryItem? = null - override val itemEquipped = ArrayList() + override val itemEquipped = Array(EquipPosition.INDEX_MAX + 1, { null }) /** Must be set by PlayerFactory */ override var faction: HashSet = HashSet() @@ -136,6 +136,7 @@ open class ActorHumanoid(birth: GameDate, death: GameDate? = null) private val nullItem = object : InventoryItemAdapter() { override val itemID: Int = 0 + override val equipPosition: Int = EquipPosition.NULL override var mass: Double = 0.0 override var scale: Double = 1.0 } @@ -211,12 +212,12 @@ open class ActorHumanoid(birth: GameDate, death: GameDate? = null) */ // Left mouse if (isGamer && input.isMouseButtonDown(Input.MOUSE_LEFT_BUTTON)) { - (itemHolding ?: nullItem).primaryUse(gc, delta) + (itemEquipped[EquipPosition.HAND_GRIP] ?: nullItem).primaryUse(gc, delta) } // Right mouse if (isGamer && input.isMouseButtonDown(Input.MOUSE_RIGHT_BUTTON)) { - (itemHolding ?: nullItem).secondaryUse(gc, delta) + (itemEquipped[EquipPosition.HAND_GRIP] ?: nullItem).secondaryUse(gc, delta) } /** diff --git a/src/net/torvald/terrarum/gameactors/DroppedItem.kt b/src/net/torvald/terrarum/gameactors/DroppedItem.kt index 1ee4f0e6c..b5f9a57b4 100644 --- a/src/net/torvald/terrarum/gameactors/DroppedItem.kt +++ b/src/net/torvald/terrarum/gameactors/DroppedItem.kt @@ -26,7 +26,7 @@ class DroppedItem(private val item: InventoryItem) : ActorWithBody() { } override fun update(gc: GameContainer, delta: Int) { - item.effectWhenTakenOut(gc, delta) + item.effectWhenEquipped(gc, delta) } override fun drawBody(gc: GameContainer, g: Graphics) { diff --git a/src/net/torvald/terrarum/gameactors/HumanoidNPC.kt b/src/net/torvald/terrarum/gameactors/HumanoidNPC.kt index 10e2b74fd..2fe4d441e 100644 --- a/src/net/torvald/terrarum/gameactors/HumanoidNPC.kt +++ b/src/net/torvald/terrarum/gameactors/HumanoidNPC.kt @@ -1,6 +1,7 @@ package net.torvald.terrarum.gameactors import net.torvald.terrarum.gameactors.ActorHumanoid +import net.torvald.terrarum.gameitem.EquipPosition import net.torvald.terrarum.gameitem.InventoryItem import net.torvald.terrarum.gameitem.InventoryItemAdapter import org.luaj.vm2.Globals @@ -42,6 +43,7 @@ open class HumanoidNPC(aiFile: String, born: GameDate) : ActorHumanoid(born), AI // we're having InventoryItem data so that this class could be somewhat universal override var itemData: InventoryItem = object : InventoryItemAdapter() { override var itemID = referenceID + override val equipPosition: Int = EquipPosition.HAND_GRIP override var mass: Double get() = actorValue.getAsDouble(AVKey.BASEMASS)!! diff --git a/src/net/torvald/terrarum/gameactors/PlayerBuilderSigrid.kt b/src/net/torvald/terrarum/gameactors/PlayerBuilderSigrid.kt index 2bce11228..408545e1c 100644 --- a/src/net/torvald/terrarum/gameactors/PlayerBuilderSigrid.kt +++ b/src/net/torvald/terrarum/gameactors/PlayerBuilderSigrid.kt @@ -6,6 +6,7 @@ import net.torvald.spriteanimation.SpriteAnimation import com.google.gson.JsonObject import net.torvald.terrarum.gameactors.ActorHumanoid import net.torvald.terrarum.gameactors.faction.FactionFactory +import net.torvald.terrarum.gameitem.EquipPosition import net.torvald.terrarum.itemproperties.ItemPropCodex import net.torvald.terrarum.mapdrawer.MapDrawer import org.newdawn.slick.SlickException @@ -61,7 +62,7 @@ object PlayerBuilderSigrid { p.actorValue[AVKey.BASEDEFENCE] = 141 p.actorValue[AVKey.__PLAYER_QUICKBARSEL] = 0 - p.actorValue["__selectedtile"] = 147 // test code; replace with .primaryUse(gc, delta) + //p.actorValue["__selectedtile"] = 147 // test code; replace with .primaryUse(gc, delta) p.actorValue["__aimhelper"] = true // TODO when you'll gonna implement it? p.setHitboxDimension(15, p.actorValue.getAsInt(AVKey.BASEHEIGHT)!!, 10, 0) @@ -76,7 +77,7 @@ object PlayerBuilderSigrid { // Test fill up inventory p.inventory.add(16) - p.itemHolding = ItemPropCodex.getProp(16) + p.itemEquipped[EquipPosition.HAND_GRIP] = ItemPropCodex.getProp(16) diff --git a/src/net/torvald/terrarum/gameactors/Pocketed.kt b/src/net/torvald/terrarum/gameactors/Pocketed.kt index b9b5709dc..e5de89896 100644 --- a/src/net/torvald/terrarum/gameactors/Pocketed.kt +++ b/src/net/torvald/terrarum/gameactors/Pocketed.kt @@ -10,13 +10,9 @@ interface Pocketed { var inventory: ActorInventory - /** Item currentry holding, like tools/weapons/scrolls/magic/etc. - * Null if not holding anything - */ - var itemHolding: InventoryItem? /** * List of all equipped items (tools, armours, rings, necklaces, etc.) */ - val itemEquipped: ArrayList + val itemEquipped: Array } \ No newline at end of file diff --git a/src/net/torvald/terrarum/gameitem/DynamicItem.kt b/src/net/torvald/terrarum/gameitem/DynamicItem.kt index 281297208..9e8af1267 100644 --- a/src/net/torvald/terrarum/gameitem/DynamicItem.kt +++ b/src/net/torvald/terrarum/gameitem/DynamicItem.kt @@ -12,7 +12,8 @@ import org.newdawn.slick.GameContainer * * Created by minjaesong on 16-09-08. */ -open class DynamicItem(val baseItemID: Int, val newMass: Double? = null, val newScale: Double? = null) : InventoryItem { +open class DynamicItem(val baseItemID: Int?, newMass: Double? = null, newScale: Double? = null) + : InventoryItemAdapter() { /** * Internal ID of an Item, Long @@ -23,6 +24,13 @@ open class DynamicItem(val baseItemID: Int, val newMass: Double? = null, val new */ override val itemID: Int = generateUniqueDynamicItemID() + override val equipPosition: Int = // default to HAND_GRIP if no baseItemID given + if (baseItemID != null) + ItemPropCodex.getProp(baseItemID).equipPosition + else + EquipPosition.HAND_GRIP + + private fun generateUniqueDynamicItemID(): Int { var ret: Int do { @@ -55,38 +63,18 @@ open class DynamicItem(val baseItemID: Int, val newMass: Double? = null, val new init { // set mass to the value from item codex using baseItemID - // if you forget this, the game will throw NullPointerException! - if (newMass != null) mass = newMass - if (newScale != null) scale = newScale + if (baseItemID == null) { + mass = newMass!! + } + else { + mass = newMass ?: ItemPropCodex.getProp(baseItemID).mass + } + + if (baseItemID == null) { + scale = newScale!! + } + else { + scale = newScale ?: ItemPropCodex.getProp(baseItemID).scale + } } - - /** - * Effects applied continuously while in pocket - */ - override fun effectWhileInPocket(gc: GameContainer, delta: Int) { } - - /** - * Effects applied immediately only once if picked up - */ - override fun effectWhenPickedUp(gc: GameContainer, delta: Int) { } - - /** - * Effects applied (continuously or not) while primary button (usually left mouse button) is down - */ - override fun primaryUse(gc: GameContainer, delta: Int) { } - - /** - * Effects applied (continuously or not) while secondary button (usually right mouse button) is down - */ - override fun secondaryUse(gc: GameContainer, delta: Int) { } - - /** - * Effects applied immediately only once if thrown from pocket - */ - override fun effectWhenThrown(gc: GameContainer, delta: Int) { } - - /** - * Effects applied (continuously or not) while thrown to the world - */ - override fun effectWhenTakenOut(gc: GameContainer, delta: Int) { } } \ No newline at end of file diff --git a/src/net/torvald/terrarum/gameitem/InventoryItem.kt b/src/net/torvald/terrarum/gameitem/InventoryItem.kt index 832bee707..072bce5e8 100644 --- a/src/net/torvald/terrarum/gameitem/InventoryItem.kt +++ b/src/net/torvald/terrarum/gameitem/InventoryItem.kt @@ -15,6 +15,11 @@ interface InventoryItem { */ val itemID: Int + /** + * Where to equip the item + */ + val equipPosition: Int + /** * Base mass of the item. Real mass must be calculated from * mass * scale^3 @@ -55,7 +60,39 @@ interface InventoryItem { fun effectWhenThrown(gc: GameContainer, delta: Int) /** - * Effects applied (continuously or not) while thrown to the world + * Effects applied (continuously or not) when equipped */ - fun effectWhenTakenOut(gc: GameContainer, delta: Int) + fun effectWhenEquipped(gc: GameContainer, delta: Int) + + /** + * Effects applied only once when unequipped + */ + fun effectWhenUnEquipped(gc: GameContainer, delta: Int) +} + +object EquipPosition { + const val NULL = -1 + + const val ARMOUR = 0 + // you can add alias to address something like LEGGINGS, BREASTPLATE, RINGS, NECKLACES, etc. + const val BODY_BACK = 1 // wings, jetpacks, etc. + const val BODY_BUFF2 = 2 + const val BODY_BUFF3 = 3 + const val BODY_BUFF4 = 4 + const val BODY_BUFF5 = 5 + const val BODY_BUFF6 = 6 + const val BODY_BUFF7 = 7 + const val BODY_BUFF8 = 8 + + const val HAND_GRIP = 9 + const val HAND_GAUNTLET = 10 + const val HAND_BUFF2 = 11 + const val HAND_BUFF3 = 12 + const val HAND_BUFF4 = 13 + + const val FOOTWEAR = 14 + + const val HEADGEAR = 15 + + const val INDEX_MAX = 15 } \ No newline at end of file diff --git a/src/net/torvald/terrarum/gameitem/InventoryItemAdapter.kt b/src/net/torvald/terrarum/gameitem/InventoryItemAdapter.kt index 57bddbeec..ef6114290 100644 --- a/src/net/torvald/terrarum/gameitem/InventoryItemAdapter.kt +++ b/src/net/torvald/terrarum/gameitem/InventoryItemAdapter.kt @@ -7,6 +7,7 @@ import org.newdawn.slick.GameContainer */ abstract class InventoryItemAdapter : InventoryItem { override abstract val itemID: Int + override abstract val equipPosition: Int override abstract var mass: Double override abstract var scale: Double @@ -25,6 +26,9 @@ abstract class InventoryItemAdapter : InventoryItem { override fun effectWhenThrown(gc: GameContainer, delta: Int) { } - override fun effectWhenTakenOut(gc: GameContainer, delta: Int) { + override fun effectWhenEquipped(gc: GameContainer, delta: Int) { + } + + override fun effectWhenUnEquipped(gc: GameContainer, delta: Int) { } } \ No newline at end of file diff --git a/src/net/torvald/terrarum/itemproperties/ItemPropCodex.kt b/src/net/torvald/terrarum/itemproperties/ItemPropCodex.kt index 45184ca87..5fd67dceb 100644 --- a/src/net/torvald/terrarum/itemproperties/ItemPropCodex.kt +++ b/src/net/torvald/terrarum/itemproperties/ItemPropCodex.kt @@ -5,8 +5,10 @@ import net.torvald.terrarum.KVHashMap import net.torvald.terrarum.gameactors.CanBeAnItem import net.torvald.terrarum.gameitem.InventoryItem import net.torvald.terrarum.Terrarum +import net.torvald.terrarum.gameactors.AVKey import net.torvald.terrarum.gamecontroller.mouseTileX import net.torvald.terrarum.gamecontroller.mouseTileY +import net.torvald.terrarum.gameitem.EquipPosition import net.torvald.terrarum.gameitem.InventoryItemAdapter import net.torvald.terrarum.gameworld.GameWorld import net.torvald.terrarum.tileproperties.TileProp @@ -39,6 +41,7 @@ object ItemPropCodex { for (i in 0..ITEM_TILE_MAX) { itemCodex[i] = object : InventoryItemAdapter() { override val itemID: Int = i + override val equipPosition = EquipPosition.HAND_GRIP override var mass: Double = TilePropCodex.getProp(i).density / 1000.0 // no need to set setter as scale would not change override var scale: Double = 1.0