From 315713efe1687c0862c7cde3b3369b63919c7142 Mon Sep 17 00:00:00 2001 From: Song Minjae Date: Tue, 28 Mar 2017 03:44:43 +0900 Subject: [PATCH] proper way of setting quickslot # Former-commit-id: 5cd21f043def3c7622290df5bf11f0b3f0080d30 --- src/net/torvald/terrarum/StateInGame.kt | 24 +- src/net/torvald/terrarum/StateUITest.kt | 210 ++---------------- src/net/torvald/terrarum/Terrarum.kt | 32 ++- .../torvald/terrarum/UIItemInventoryElem.kt | 3 +- src/net/torvald/terrarum/gameactors/AVKey.kt | 5 +- src/net/torvald/terrarum/gameactors/Actor.kt | 57 ++--- .../terrarum/gameactors/ActorVisible.kt | 4 +- .../terrarum/gameactors/ActorWithSprite.kt | 4 +- .../terrarum/gameactors/CreatureBuilder.kt | 2 +- .../terrarum/gameactors/DroppedItem.kt | 2 +- .../terrarum/gameactors/FixtureBase.kt | 2 +- .../terrarum/gameactors/HistoricalFigure.kt | 2 +- .../terrarum/gameactors/ParticleBase.kt | 2 +- .../terrarum/gameactors/ParticleTestRain.kt | 2 +- .../terrarum/gameactors/PhysTestBall.kt | 2 +- .../terrarum/gameactors/ProjectileSimple.kt | 2 +- .../terrarum/gameactors/WeaponSwung.kt | 2 +- src/net/torvald/terrarum/ui/UIInventory.kt | 200 ++++++++++++++--- .../terrarum/ui/UIItemTextButtonList.kt | 2 +- 19 files changed, 272 insertions(+), 287 deletions(-) diff --git a/src/net/torvald/terrarum/StateInGame.kt b/src/net/torvald/terrarum/StateInGame.kt index fd48cece8..f6494be4c 100644 --- a/src/net/torvald/terrarum/StateInGame.kt +++ b/src/net/torvald/terrarum/StateInGame.kt @@ -689,19 +689,19 @@ class StateInGame : BasicGameState() { // which means we don't need to check if i >= 0 again if (actor is ActorVisible) { when (actor.renderOrder) { - ActorOrder.BEHIND -> { + Actor.RenderOrder.BEHIND -> { val i = actorsRenderBehind.binarySearch(actor.referenceID) actorsRenderBehind.removeAt(i) } - ActorOrder.MIDDLE -> { + Actor.RenderOrder.MIDDLE -> { val i = actorsRenderMiddle.binarySearch(actor.referenceID) actorsRenderMiddle.removeAt(i) } - ActorOrder.MIDTOP -> { + Actor.RenderOrder.MIDTOP -> { val i = actorsRenderMidTop.binarySearch(actor.referenceID) actorsRenderMidTop.removeAt(i) } - ActorOrder.FRONT -> { + Actor.RenderOrder.FRONT -> { val i = actorsRenderFront.binarySearch(actor.referenceID) actorsRenderFront.removeAt(i) } @@ -723,16 +723,16 @@ class StateInGame : BasicGameState() { if (actor is ActorVisible) { when (actor.renderOrder) { - ActorOrder.BEHIND -> { + Actor.RenderOrder.BEHIND -> { actorsRenderBehind.add(actor); insertionSortLastElemAV(actorsRenderBehind) } - ActorOrder.MIDDLE -> { + Actor.RenderOrder.MIDDLE -> { actorsRenderMiddle.add(actor); insertionSortLastElemAV(actorsRenderMiddle) } - ActorOrder.MIDTOP -> { + Actor.RenderOrder.MIDTOP -> { actorsRenderMidTop.add(actor); insertionSortLastElemAV(actorsRenderMidTop) } - ActorOrder.FRONT -> { + Actor.RenderOrder.FRONT -> { actorsRenderFront.add(actor); insertionSortLastElemAV(actorsRenderFront) } } @@ -754,16 +754,16 @@ class StateInGame : BasicGameState() { if (actor is ActorVisible) { when (actor.renderOrder) { - ActorOrder.BEHIND -> { + Actor.RenderOrder.BEHIND -> { actorsRenderBehind.add(actor); insertionSortLastElemAV(actorsRenderBehind) } - ActorOrder.MIDDLE -> { + Actor.RenderOrder.MIDDLE -> { actorsRenderMiddle.add(actor); insertionSortLastElemAV(actorsRenderMiddle) } - ActorOrder.MIDTOP -> { + Actor.RenderOrder.MIDTOP -> { actorsRenderMidTop.add(actor); insertionSortLastElemAV(actorsRenderMidTop) } - ActorOrder.FRONT -> { + Actor.RenderOrder.FRONT -> { actorsRenderFront.add(actor); insertionSortLastElemAV(actorsRenderFront) } } diff --git a/src/net/torvald/terrarum/StateUITest.kt b/src/net/torvald/terrarum/StateUITest.kt index c7c8b0061..bf2575eea 100644 --- a/src/net/torvald/terrarum/StateUITest.kt +++ b/src/net/torvald/terrarum/StateUITest.kt @@ -1,19 +1,14 @@ package net.torvald.terrarum -import net.torvald.terrarum.gameactors.ActorInventory -import net.torvald.terrarum.gameactors.InventoryPair +import net.torvald.terrarum.gameactors.* import net.torvald.terrarum.gameitem.IVKey import net.torvald.terrarum.gameitem.InventoryItem import net.torvald.terrarum.itemproperties.ItemCodex -import net.torvald.terrarum.mapdrawer.MapCamera -import net.torvald.terrarum.ui.UICanvas -import net.torvald.terrarum.ui.UIHandler -import net.torvald.terrarum.ui.UIItemTextButton -import net.torvald.terrarum.ui.UIItemTextButtonList +import net.torvald.terrarum.tileproperties.Tile +import net.torvald.terrarum.ui.* import org.newdawn.slick.* import org.newdawn.slick.state.BasicGameState import org.newdawn.slick.state.StateBasedGame -import java.util.* /** * Created by SKYHi14 on 2017-03-13. @@ -22,20 +17,34 @@ class StateUITest : BasicGameState() { val ui: UIHandler - val inventory = ActorInventory() + private val actor = object : Actor(RenderOrder.FRONT), Pocketed { + override fun update(gc: GameContainer, delta: Int) { + TODO("not implemented") + } + + override fun run() { + TODO("not implemented") + } + + override var inventory: ActorInventory = ActorInventory() + override val itemEquipped = Array(InventoryItem.EquipPosition.INDEX_MAX + 1, { null }) + } init { - ui = UIHandler(SimpleUI(inventory, 800, Terrarum.HEIGHT - 160)) + ui = UIHandler(UIInventory(actor, 800, Terrarum.HEIGHT - 160)) ui.posX = 0 ui.posY = 60 ui.isVisible = true + // these are the test codes. // Item properties must be pre-composed using CSV/JSON, and read and made into the item instance // using factory/builder pattern. @see ItemCodex - inventory.add(object : InventoryItem() { + actor.actorValue[AVKey.__PLAYER_QSPREFIX + "3"] = Tile.STONE + + actor.inventory.add(object : InventoryItem() { init { itemProperties[IVKey.ITEMTYPE] = IVKey.ItemType.HAMMER } @@ -48,9 +57,9 @@ class StateUITest : BasicGameState() { override var maxDurability: Double = 10.0 override var durability: Double = 6.43 }) - inventory.getByID(5656)!!.item.name = "Test tool" + actor.inventory.getByID(5656)!!.item.name = "Test tool" - inventory.add(object : InventoryItem() { + actor.inventory.add(object : InventoryItem() { init { itemProperties[IVKey.ITEMTYPE] = IVKey.ItemType.ARTEFACT } @@ -62,7 +71,7 @@ class StateUITest : BasicGameState() { override var category: String = InventoryItem.Category.MISC }) - inventory.add(ItemCodex[16], 543) + actor.inventory.add(ItemCodex[16], 543) } override fun init(container: GameContainer?, game: StateBasedGame?) { @@ -80,176 +89,3 @@ class StateUITest : BasicGameState() { ui.render(container, game, g) } } - - - -private class SimpleUI( - val inventory: ActorInventory, - override var width: Int, - override var height: Int -) : UICanvas { - override var handler: UIHandler? = null - override var openCloseTime: Int = UICanvas.OPENCLOSE_GENERIC - - val itemImagePlaceholder = Image("./assets/item_kari_24.tga") - - val catButtonsToCatIdent = HashMap() - - val backgroundColour = Color(0x1c1c1c) - - init { - catButtonsToCatIdent.put("GAME_INVENTORY_WEAPONS", InventoryItem.Category.WEAPON) - catButtonsToCatIdent.put("CONTEXT_ITEM_TOOL_PLURAL", InventoryItem.Category.TOOL) - catButtonsToCatIdent.put("CONTEXT_ITEM_ARMOR", InventoryItem.Category.ARMOUR) - catButtonsToCatIdent.put("GAME_INVENTORY_INGREDIENTS", InventoryItem.Category.GENERIC) - catButtonsToCatIdent.put("GAME_INVENTORY_POTIONS", InventoryItem.Category.POTION) - catButtonsToCatIdent.put("CONTEXT_ITEM_MAGIC", InventoryItem.Category.MAGIC) - catButtonsToCatIdent.put("GAME_INVENTORY_BLOCKS", InventoryItem.Category.BLOCK) - catButtonsToCatIdent.put("GAME_INVENTORY_WALLS", InventoryItem.Category.WALL) - catButtonsToCatIdent.put("GAME_GENRE_MISC", InventoryItem.Category.MISC) - - // special filter - catButtonsToCatIdent.put("MENU_LABEL_ALL", "__all__") - - } - - val itemStripGutterV = 6 - val itemStripGutterH = 8 - val itemInterColGutter = 8 - - val catButtons = UIItemTextButtonList( - this, - arrayOf( - "MENU_LABEL_ALL", - "GAME_INVENTORY_WEAPONS", // weapons and tools - "CONTEXT_ITEM_TOOL_PLURAL", - "CONTEXT_ITEM_ARMOR", - "GAME_INVENTORY_INGREDIENTS", - "GAME_INVENTORY_POTIONS", - "CONTEXT_ITEM_MAGIC", - "GAME_INVENTORY_BLOCKS", - "GAME_INVENTORY_WALLS", - "GAME_GENRE_MISC" - //"GAME_INVENTORY_FAVORITES", - ), - width = (width / 3 / 100) * 100, // chop to hundreds unit (100, 200, 300, ...) with the black magic of integer division - height = height, - verticalGutter = itemStripGutterH, - readFromLang = true, - textAreaWidth = 100, - defaultSelection = 0, - iconSpriteSheet = SpriteSheet("./assets/graphics/gui/inventory/category.tga", 20, 20), - iconSpriteSheetIndices = intArrayOf(9,0,1,2,3,4,5,6,7,8), - highlightBackCol = backgroundColour screen Color(0x0c0c0c), - highlightBackBlendMode = BlendMode.NORMAL, - backgroundCol = Color(0x383838), - kinematic = true - ) - - val itemsStripWidth = ((width - catButtons.width) - (2 * itemStripGutterH + itemInterColGutter)) / 2 - val items = Array( - 2 + height / (UIItemInventoryElem.height + itemStripGutterV) * 2, { - UIItemInventoryElem( - parentUI = this, - posX = catButtons.width + if (it % 2 == 0) itemStripGutterH else (itemStripGutterH + itemsStripWidth + itemInterColGutter), - posY = itemStripGutterH + it / 2 * (UIItemInventoryElem.height + itemStripGutterV), - width = itemsStripWidth, - item = null, - amount = UIItemInventoryElem.UNIQUE_ITEM_HAS_NO_AMOUNT, - itemImage = null, - mouseoverBackCol = Color(0x282828), - mouseoverBackBlendMode = BlendMode.SCREEN, - drawBackOnNull = false - //backCol = Color(0x101010), - //backBlendMode = BlendMode.SCREEN - ) }) - val itemsScrollOffset = 0 - - var inventorySortList = ArrayList() - var rebuildList = true - - private var oldCatSelect = -1 - - override fun update(gc: GameContainer, delta: Int) { - Terrarum.gameLocale = "koKR" // hot swap this to test - - catButtons.update(gc, delta) - - - // monitor and check if category selection has been changed - if (oldCatSelect != catButtons.selectedIndex) { - rebuildList = true - } - - - if (rebuildList) { - val filter = catButtonsToCatIdent[catButtons.selectedButton.labelText] - - inventorySortList = ArrayList() - - // filter items - inventory.forEach { - if (it.item.category == filter || filter == "__all__") - inventorySortList.add(it) - } - - rebuildList = false - - // sort if needed - // test sort by name - inventorySortList.sortBy { it.item.name } - - // map sortList to item list - for (k in 0..items.size - 1) { - try { - val sortListItem = inventorySortList[k + itemsScrollOffset] - items[k].item = sortListItem.item - items[k].amount = sortListItem.amount - items[k].itemImage = itemImagePlaceholder - - items[k].quickslot = Random().nextInt(10) // TODO test - } - catch (e: IndexOutOfBoundsException) { - items[k].item = null - items[k].amount = 0 - items[k].itemImage = null - items[k].quickslot = null - } - } - } - - - oldCatSelect = catButtons.selectedIndex - } - - override fun render(gc: GameContainer, g: Graphics) { - g.color = backgroundColour - g.fillRect(0f, 0f, width.toFloat(), height.toFloat()) - - catButtons.render(gc, g) - - - items.forEach { - it.render(gc, g) - } - } - - override fun processInput(gc: GameContainer, delta: Int, input: Input) { - } - - override fun doOpening(gc: GameContainer, delta: Int) { - UICanvas.doOpeningFade(handler, openCloseTime) - } - - override fun doClosing(gc: GameContainer, delta: Int) { - UICanvas.doClosingFade(handler, openCloseTime) - } - - override fun endOpening(gc: GameContainer, delta: Int) { - UICanvas.endOpeningFade(handler) - } - - override fun endClosing(gc: GameContainer, delta: Int) { - UICanvas.endClosingFade(handler) - } -} diff --git a/src/net/torvald/terrarum/Terrarum.kt b/src/net/torvald/terrarum/Terrarum.kt index fc1eb026c..1b23ef1c2 100644 --- a/src/net/torvald/terrarum/Terrarum.kt +++ b/src/net/torvald/terrarum/Terrarum.kt @@ -33,13 +33,10 @@ typealias Millisec = Int */ object Terrarum : StateBasedGame(GAME_NAME) { - - val sysLang: String - get() { - val lan = System.getProperty("user.language") - val country = System.getProperty("user.country") - return lan + country - } + ////////////////////////////// + // GLOBAL IMMUTABLE CONFIGS // + ////////////////////////////// + val QUICKSLOT_MAX = 10 /** * To be used with physics simulator @@ -55,6 +52,19 @@ object Terrarum : StateBasedGame(GAME_NAME) { */ val TARGET_INTERNAL_FPS = 100 + + + + + + val sysLang: String + get() { + val lan = System.getProperty("user.language") + val country = System.getProperty("user.country") + return lan + country + } + + lateinit var appgc: AppGameContainer var WIDTH = 1072 @@ -89,7 +99,7 @@ object Terrarum : StateBasedGame(GAME_NAME) { val memXmx: Long get() = Runtime.getRuntime().maxMemory() shr 20 - lateinit var environment: RunningEnvironment + val environment: RunningEnvironment private val localeSimple = arrayOf("de", "en", "es", "it") var gameLocale = "####" // lateinit placeholder @@ -228,15 +238,15 @@ object Terrarum : StateBasedGame(GAME_NAME) { val readFromDisk = readConfigJson() if (!readFromDisk) readConfigJson() - try { + environment = try { Controllers.getController(0) - environment = if (getConfigString("pcgamepadenv") == "console") + if (getConfigString("pcgamepadenv") == "console") RunningEnvironment.CONSOLE else RunningEnvironment.PC } catch (e: IndexOutOfBoundsException) { - environment = RunningEnvironment.PC + RunningEnvironment.PC } } diff --git a/src/net/torvald/terrarum/UIItemInventoryElem.kt b/src/net/torvald/terrarum/UIItemInventoryElem.kt index 90cb239b8..ad41c26a3 100644 --- a/src/net/torvald/terrarum/UIItemInventoryElem.kt +++ b/src/net/torvald/terrarum/UIItemInventoryElem.kt @@ -23,6 +23,7 @@ class UIItemInventoryElem( var item: InventoryItem?, var amount: Int, var itemImage: Image?, + val mouseOverTextCol: Color = Color(0xfff066), val mouseoverBackCol: Color = Color(0,0,0,0), val mouseoverBackBlendMode: String = BlendMode.NORMAL, val backCol: Color = Color(0,0,0,0), @@ -80,7 +81,7 @@ class UIItemInventoryElem( g.drawImage(itemImage!!, posX + imgOffset, posY + imgOffset) // if mouse is over, text lights up - g.color = item!!.nameColour * if (mouseUp) Color(0xffffff) else UIItemTextButton.defaultInactiveCol + g.color = item!!.nameColour * if (mouseUp) mouseOverTextCol else UIItemTextButton.defaultInactiveCol g.drawString( item!!.name + (if (amount > 0 && !item!!.isUnique) "${0x3000.toChar()}($amount)" else "") , posX + textOffsetX diff --git a/src/net/torvald/terrarum/gameactors/AVKey.kt b/src/net/torvald/terrarum/gameactors/AVKey.kt index 75062645a..1798d0000 100644 --- a/src/net/torvald/terrarum/gameactors/AVKey.kt +++ b/src/net/torvald/terrarum/gameactors/AVKey.kt @@ -88,6 +88,7 @@ object AVKey { const val __PLAYER_QUICKSLOTSEL = "__quickslotselection" - /** Item ID; they are supposed to be unique */ - const val __PLAYER_QSPREFIX = "__qsitem" // __qsitem1 .. __qsitem10 + /** SYNOPSIS: __qsitem1 .. __qsitem10 + * contains tem ID; they are supposed to be unique. Indices must be ONE-BASED! */ + const val __PLAYER_QSPREFIX = "__qsitem" // __qsitem1 .. __qsitem10 (NOT ZERO BASED!) } \ No newline at end of file diff --git a/src/net/torvald/terrarum/gameactors/Actor.kt b/src/net/torvald/terrarum/gameactors/Actor.kt index 57437aec1..121baa0f4 100644 --- a/src/net/torvald/terrarum/gameactors/Actor.kt +++ b/src/net/torvald/terrarum/gameactors/Actor.kt @@ -7,11 +7,18 @@ import net.torvald.terrarum.itemproperties.ItemCodex import org.newdawn.slick.GameContainer /** - * @param renderOrder invisible/technical -> ActorOrder.MIDDLE + * @param renderOrder invisible/technical must use "Actor.RenderOrder.MIDDLE" * * Created by minjaesong on 15-12-31. */ -abstract class Actor(val renderOrder: ActorOrder) : Comparable, Runnable { +abstract class Actor(val renderOrder: RenderOrder) : Comparable, Runnable { + + enum class RenderOrder { + BEHIND, // tapestries, some particles (obstructed by terrain) + MIDDLE, // actors + MIDTOP, // bullets, thrown items + FRONT // fake tiles + } abstract fun update(gc: GameContainer, delta: Int) @@ -20,8 +27,8 @@ abstract class Actor(val renderOrder: ActorOrder) : Comparable, Runnable * @return Reference ID. (16777216-0x7FFF_FFFF) */ open var referenceID: Int = generateUniqueReferenceID() - abstract var actorValue: ActorValue - abstract var flagDespawn: Boolean + var actorValue = ActorValue() + @Volatile var flagDespawn = false override fun equals(other: Any?) = referenceID == (other as Actor).referenceID override fun hashCode() = referenceID @@ -40,34 +47,32 @@ abstract class Actor(val renderOrder: ActorOrder) : Comparable, Runnable * override var referenceID: Int = generateUniqueReferenceID() */ fun generateUniqueReferenceID(): Int { - fun checkForCollision(value: Int) = - Terrarum.ingame!!.theGameHasActor(value) || - value < ItemCodex.ITEM_COUNT_MAX || - value < when (renderOrder) { - ActorOrder.BEHIND -> ItemCodex.ITEM_COUNT_MAX - ActorOrder.MIDDLE -> 0x10000000 - ActorOrder.MIDTOP -> 0x60000000 - ActorOrder.FRONT -> 0x70000000 - } || - value > when (renderOrder) { - ActorOrder.BEHIND -> 0x0FFFFFFF - ActorOrder.MIDDLE -> 0x5FFFFFFF - ActorOrder.MIDTOP -> 0x6FFFFFFF - ActorOrder.FRONT -> 0x7FFFFFFF + fun hasCollision(value: Int) = + try { + Terrarum.ingame!!.theGameHasActor(value) || + value < ItemCodex.ITEM_COUNT_MAX || + value < when (renderOrder) { + RenderOrder.BEHIND -> ItemCodex.ITEM_COUNT_MAX + RenderOrder.MIDDLE -> 0x10000000 + RenderOrder.MIDTOP -> 0x60000000 + RenderOrder.FRONT -> 0x70000000 + } || + value > when (renderOrder) { + RenderOrder.BEHIND -> 0x0FFFFFFF + RenderOrder.MIDDLE -> 0x5FFFFFFF + RenderOrder.MIDTOP -> 0x6FFFFFFF + RenderOrder.FRONT -> 0x7FFFFFFF + } + } + catch (gameNotInitialisedException: KotlinNullPointerException) { + false } var ret: Int do { ret = HQRNG().nextInt().and(0x7FFFFFFF) // set new ID - } while (checkForCollision(ret)) // check for collision + } while (hasCollision(ret)) // check for collision return ret } -} - -enum class ActorOrder { - BEHIND, // tapestries, some particles (obstructed by terrain) - MIDDLE, // actors - MIDTOP, // bullets, thrown items - FRONT // fake tiles } \ No newline at end of file diff --git a/src/net/torvald/terrarum/gameactors/ActorVisible.kt b/src/net/torvald/terrarum/gameactors/ActorVisible.kt index 7d39cbd5b..995109903 100644 --- a/src/net/torvald/terrarum/gameactors/ActorVisible.kt +++ b/src/net/torvald/terrarum/gameactors/ActorVisible.kt @@ -4,9 +4,11 @@ import org.newdawn.slick.GameContainer import org.newdawn.slick.Graphics /** + * Actor with visible body + * * Created by minjaesong on 2017-01-21. */ -abstract class ActorVisible(renderOrder: ActorOrder) : Actor(renderOrder) { +abstract class ActorVisible(renderOrder: RenderOrder) : Actor(renderOrder) { open val hitbox = Hitbox(0.0, 0.0, 0.0, 0.0) override abstract fun update(gc: GameContainer, delta: Int) abstract fun drawBody(g: Graphics) diff --git a/src/net/torvald/terrarum/gameactors/ActorWithSprite.kt b/src/net/torvald/terrarum/gameactors/ActorWithSprite.kt index 2e2cef9d3..c13de5c39 100644 --- a/src/net/torvald/terrarum/gameactors/ActorWithSprite.kt +++ b/src/net/torvald/terrarum/gameactors/ActorWithSprite.kt @@ -26,11 +26,10 @@ import java.util.* * * Created by minjaesong on 16-01-13. */ -open class ActorWithSprite(renderOrder: ActorOrder, val immobileBody: Boolean = false, physics: Boolean = true) : ActorVisible(renderOrder) { +open class ActorWithSprite(renderOrder: RenderOrder, val immobileBody: Boolean = false, physics: Boolean = true) : ActorVisible(renderOrder) { /** !! ActorValue macros are on the very bottom of the source !! **/ - override var actorValue: ActorValue = ActorValue() @Transient internal var sprite: SpriteAnimation? = null @Transient internal var spriteGlow: SpriteAnimation? = null @@ -162,7 +161,6 @@ open class ActorWithSprite(renderOrder: ActorOrder, val immobileBody: Boolean = @Volatile var grounded = false - override @Volatile var flagDespawn = false /** Default to 'true' */ var isVisible = true /** Default to 'true' */ diff --git a/src/net/torvald/terrarum/gameactors/CreatureBuilder.kt b/src/net/torvald/terrarum/gameactors/CreatureBuilder.kt index 3e10f78d3..156d88ef5 100644 --- a/src/net/torvald/terrarum/gameactors/CreatureBuilder.kt +++ b/src/net/torvald/terrarum/gameactors/CreatureBuilder.kt @@ -19,7 +19,7 @@ object CreatureBuilder { */ @Throws(IOException::class, SlickException::class) operator fun invoke(jsonFileName: String): ActorWithSprite { - val actor = ActorWithSprite(ActorOrder.MIDDLE) + val actor = ActorWithSprite(Actor.RenderOrder.MIDDLE) InjectCreatureRaw(actor.actorValue, jsonFileName) return actor diff --git a/src/net/torvald/terrarum/gameactors/DroppedItem.kt b/src/net/torvald/terrarum/gameactors/DroppedItem.kt index 5631d3210..a4f00d899 100644 --- a/src/net/torvald/terrarum/gameactors/DroppedItem.kt +++ b/src/net/torvald/terrarum/gameactors/DroppedItem.kt @@ -9,7 +9,7 @@ import org.newdawn.slick.Graphics /** * Created by minjaesong on 16-03-15. */ -class DroppedItem(private val item: InventoryItem) : ActorWithSprite(ActorOrder.MIDTOP) { +class DroppedItem(private val item: InventoryItem) : ActorWithSprite(Actor.RenderOrder.MIDTOP) { init { if (item.id >= ItemCodex.ITEM_COUNT_MAX) diff --git a/src/net/torvald/terrarum/gameactors/FixtureBase.kt b/src/net/torvald/terrarum/gameactors/FixtureBase.kt index 69815f6ef..be864fc62 100644 --- a/src/net/torvald/terrarum/gameactors/FixtureBase.kt +++ b/src/net/torvald/terrarum/gameactors/FixtureBase.kt @@ -6,7 +6,7 @@ import net.torvald.spriteanimation.SpriteAnimation * Created by minjaesong on 16-06-17. */ open class FixtureBase(physics: Boolean = true) : - ActorWithSprite(ActorOrder.BEHIND, immobileBody = true, physics = physics) { + ActorWithSprite(Actor.RenderOrder.BEHIND, immobileBody = true, physics = physics) { /** * 0: Open * 1: Blocked diff --git a/src/net/torvald/terrarum/gameactors/HistoricalFigure.kt b/src/net/torvald/terrarum/gameactors/HistoricalFigure.kt index 2f4124b97..c6b6f037a 100644 --- a/src/net/torvald/terrarum/gameactors/HistoricalFigure.kt +++ b/src/net/torvald/terrarum/gameactors/HistoricalFigure.kt @@ -11,7 +11,7 @@ import org.newdawn.slick.Input * * Created by minjaesong on 16-10-10. */ -open class HistoricalFigure(val born: GameDate, val dead: GameDate? = null, realAirFriction: Boolean = false) : ActorWithSprite(ActorOrder.MIDDLE, realAirFriction) { +open class HistoricalFigure(val born: GameDate, val dead: GameDate? = null, realAirFriction: Boolean = false) : ActorWithSprite(Actor.RenderOrder.MIDDLE, realAirFriction) { init { this.actorValue["_bornyear"] = born.year diff --git a/src/net/torvald/terrarum/gameactors/ParticleBase.kt b/src/net/torvald/terrarum/gameactors/ParticleBase.kt index ab082ca89..7161dedf7 100644 --- a/src/net/torvald/terrarum/gameactors/ParticleBase.kt +++ b/src/net/torvald/terrarum/gameactors/ParticleBase.kt @@ -15,7 +15,7 @@ import org.newdawn.slick.Image * * Created by minjaesong on 2017-01-20. */ -open class ParticleBase(renderOrder: ActorOrder, maxLifeTime: Int? = null) : Runnable { +open class ParticleBase(renderOrder: Actor.RenderOrder, maxLifeTime: Int? = null) : Runnable { /** Will NOT actually delete from the CircularArray */ @Volatile var flagDespawn = false diff --git a/src/net/torvald/terrarum/gameactors/ParticleTestRain.kt b/src/net/torvald/terrarum/gameactors/ParticleTestRain.kt index 6f9f4520c..917a8d1c0 100644 --- a/src/net/torvald/terrarum/gameactors/ParticleTestRain.kt +++ b/src/net/torvald/terrarum/gameactors/ParticleTestRain.kt @@ -6,7 +6,7 @@ import org.newdawn.slick.Image /** * Created by minjaesong on 2017-01-20. */ -class ParticleTestRain(posX: Double, posY: Double) : ParticleBase(ActorOrder.BEHIND, 6000) { +class ParticleTestRain(posX: Double, posY: Double) : ParticleBase(Actor.RenderOrder.BEHIND, 6000) { init { body = Image("./assets/graphics/weathers/raindrop.tga") diff --git a/src/net/torvald/terrarum/gameactors/PhysTestBall.kt b/src/net/torvald/terrarum/gameactors/PhysTestBall.kt index c77913547..2f13ef9a5 100644 --- a/src/net/torvald/terrarum/gameactors/PhysTestBall.kt +++ b/src/net/torvald/terrarum/gameactors/PhysTestBall.kt @@ -10,7 +10,7 @@ import org.newdawn.slick.Graphics /** * Created by minjaesong on 16-03-05. */ -class PhysTestBall : ActorWithSprite(ActorOrder.MIDDLE, immobileBody = true) { +class PhysTestBall : ActorWithSprite(Actor.RenderOrder.MIDDLE, immobileBody = true) { private var color = Color.orange diff --git a/src/net/torvald/terrarum/gameactors/ProjectileSimple.kt b/src/net/torvald/terrarum/gameactors/ProjectileSimple.kt index 670a673ae..811648378 100644 --- a/src/net/torvald/terrarum/gameactors/ProjectileSimple.kt +++ b/src/net/torvald/terrarum/gameactors/ProjectileSimple.kt @@ -23,7 +23,7 @@ open class ProjectileSimple( private val type: Int, fromPoint: Vector2, // projected coord toPoint: Vector2 // arriving coord - ) : ActorWithSprite(ActorOrder.MIDTOP), Luminous, Projectile { + ) : ActorWithSprite(Actor.RenderOrder.MIDTOP), Luminous, Projectile { val damage: Int val displayColour: Color diff --git a/src/net/torvald/terrarum/gameactors/WeaponSwung.kt b/src/net/torvald/terrarum/gameactors/WeaponSwung.kt index ccf082437..671b3a0d0 100644 --- a/src/net/torvald/terrarum/gameactors/WeaponSwung.kt +++ b/src/net/torvald/terrarum/gameactors/WeaponSwung.kt @@ -3,7 +3,7 @@ package net.torvald.terrarum.gameactors /** * Created by minjaesong on 16-04-26. */ -class WeaponSwung(val itemID: Int) : ActorWithSprite(ActorOrder.MIDTOP), Luminous { +class WeaponSwung(val itemID: Int) : ActorWithSprite(Actor.RenderOrder.MIDTOP), Luminous { // just let the solver use AABB; it's cheap but works just enough /** diff --git a/src/net/torvald/terrarum/ui/UIInventory.kt b/src/net/torvald/terrarum/ui/UIInventory.kt index 8b39b73f6..7ee5310fd 100644 --- a/src/net/torvald/terrarum/ui/UIInventory.kt +++ b/src/net/torvald/terrarum/ui/UIInventory.kt @@ -1,64 +1,196 @@ package net.torvald.terrarum.ui -import org.newdawn.slick.GameContainer -import org.newdawn.slick.Graphics -import org.newdawn.slick.Input +import net.torvald.terrarum.* +import net.torvald.terrarum.Terrarum.QUICKSLOT_MAX +import net.torvald.terrarum.gameactors.* +import net.torvald.terrarum.gameitem.InventoryItem +import org.newdawn.slick.* +import java.util.* /** * Created by SKYHi14 on 2017-03-13. */ -class UIInventory : UICanvas { - override var width: Int - get() = TODO("not implemented") //To change initializer of created properties use File | Settings | File Templates. - set(value) {} - override var height: Int - get() = TODO("not implemented") //To change initializer of created properties use File | Settings | File Templates. - set(value) {} - override var handler: UIHandler? - get() = TODO("not implemented") //To change initializer of created properties use File | Settings | File Templates. - set(value) {} - override var openCloseTime: Int - get() = TODO("not implemented") //To change initializer of created properties use File | Settings | File Templates. - set(value) {} +class UIInventory( + val actor: Pocketed, + override var width: Int, + override var height: Int +) : UICanvas { + val inventory: ActorInventory + get() = actor.inventory + val actorValue: ActorValue + get() = (actor as Actor).actorValue - private val categories = arrayOf( - "GAME_INVENTORY_WEAPONS", // weapons and tools - "CONTEXT_ITEM_TOOL_PLURAL", - "CONTEXT_ITEM_ARMOR", - "GAME_INVENTORY_INGREDIENTS", - "GAME_INVENTORY_POTIONS", - "CONTEXT_ITEM_MAGIC", - "GAME_INVENTORY_BLOCKS", - "GAME_INVENTORY_WALLS", - "MENU_LABEL_ALL" + override var handler: UIHandler? = null + override var openCloseTime: Int = UICanvas.OPENCLOSE_GENERIC + + val itemImagePlaceholder = Image("./assets/item_kari_24.tga") + + val catButtonsToCatIdent = HashMap() + + val backgroundColour = Color(0x1c1c1c) + + init { + catButtonsToCatIdent.put("GAME_INVENTORY_WEAPONS", InventoryItem.Category.WEAPON) + catButtonsToCatIdent.put("CONTEXT_ITEM_TOOL_PLURAL", InventoryItem.Category.TOOL) + catButtonsToCatIdent.put("CONTEXT_ITEM_ARMOR", InventoryItem.Category.ARMOUR) + catButtonsToCatIdent.put("GAME_INVENTORY_INGREDIENTS", InventoryItem.Category.GENERIC) + catButtonsToCatIdent.put("GAME_INVENTORY_POTIONS", InventoryItem.Category.POTION) + catButtonsToCatIdent.put("CONTEXT_ITEM_MAGIC", InventoryItem.Category.MAGIC) + catButtonsToCatIdent.put("GAME_INVENTORY_BLOCKS", InventoryItem.Category.BLOCK) + catButtonsToCatIdent.put("GAME_INVENTORY_WALLS", InventoryItem.Category.WALL) + catButtonsToCatIdent.put("GAME_GENRE_MISC", InventoryItem.Category.MISC) + + // special filter + catButtonsToCatIdent.put("MENU_LABEL_ALL", "__all__") + + } + + val itemStripGutterV = 6 + val itemStripGutterH = 8 + val itemInterColGutter = 8 + + val catButtons = UIItemTextButtonList( + this, + arrayOf( + "MENU_LABEL_ALL", + "GAME_INVENTORY_WEAPONS", // weapons and tools + "CONTEXT_ITEM_TOOL_PLURAL", + "CONTEXT_ITEM_ARMOR", + "GAME_INVENTORY_INGREDIENTS", + "GAME_INVENTORY_POTIONS", + "CONTEXT_ITEM_MAGIC", + "GAME_INVENTORY_BLOCKS", + "GAME_INVENTORY_WALLS", + "GAME_GENRE_MISC" + //"GAME_INVENTORY_FAVORITES", + ), + width = (width / 3 / 100) * 100, // chop to hundreds unit (100, 200, 300, ...) with the black magic of integer division + height = height, + verticalGutter = itemStripGutterH, + readFromLang = true, + textAreaWidth = 100, + defaultSelection = 0, + iconSpriteSheet = SpriteSheet("./assets/graphics/gui/inventory/category.tga", 20, 20), + iconSpriteSheetIndices = intArrayOf(9,0,1,2,3,4,5,6,7,8), + highlightBackCol = backgroundColour screen Color(0x0c0c0c), + highlightBackBlendMode = BlendMode.NORMAL, + backgroundCol = Color(0x383838), + kinematic = true ) + val itemsStripWidth = ((width - catButtons.width) - (2 * itemStripGutterH + itemInterColGutter)) / 2 + val items = Array( + 2 + height / (UIItemInventoryElem.height + itemStripGutterV) * 2, { + UIItemInventoryElem( + parentUI = this, + posX = catButtons.width + if (it % 2 == 0) itemStripGutterH else (itemStripGutterH + itemsStripWidth + itemInterColGutter), + posY = itemStripGutterH + it / 2 * (UIItemInventoryElem.height + itemStripGutterV), + width = itemsStripWidth, + item = null, + amount = UIItemInventoryElem.UNIQUE_ITEM_HAS_NO_AMOUNT, + itemImage = null, + mouseoverBackCol = Color(0x282828), + mouseoverBackBlendMode = BlendMode.SCREEN, + drawBackOnNull = false + //backCol = Color(0x101010), + //backBlendMode = BlendMode.SCREEN + ) }) + val itemsScrollOffset = 0 + + var inventorySortList = ArrayList() + var rebuildList = true + + private var oldCatSelect = -1 + override fun update(gc: GameContainer, delta: Int) { - TODO("not implemented") + Terrarum.gameLocale = "koKR" // hot swap this to test + + catButtons.update(gc, delta) + + + // monitor and check if category selection has been changed + if (oldCatSelect != catButtons.selectedIndex) { + rebuildList = true + } + + + if (rebuildList) { + val filter = catButtonsToCatIdent[catButtons.selectedButton.labelText] + + inventorySortList = ArrayList() + + // filter items + inventory.forEach { + if (it.item.category == filter || filter == "__all__") + inventorySortList.add(it) + } + + rebuildList = false + + // sort if needed + // test sort by name + inventorySortList.sortBy { it.item.name } + + // map sortList to item list + for (k in 0..items.size - 1) { + try { + val sortListItem = inventorySortList[k + itemsScrollOffset] + items[k].item = sortListItem.item + items[k].amount = sortListItem.amount + items[k].itemImage = itemImagePlaceholder + + // set quickslot number + for (qs in 1..QUICKSLOT_MAX) { + if (sortListItem.item.id == actorValue.getAsInt(AVKey.__PLAYER_QSPREFIX + qs)) { + items[k].quickslot = qs % 10 // 10 -> 0, 1..9 -> 1..9 + break + } + else + items[k].quickslot = null + } + } + catch (e: IndexOutOfBoundsException) { + items[k].item = null + items[k].amount = 0 + items[k].itemImage = null + items[k].quickslot = null + } + } + } + + + oldCatSelect = catButtons.selectedIndex } override fun render(gc: GameContainer, g: Graphics) { - TODO("not implemented") + g.color = backgroundColour + g.fillRect(0f, 0f, width.toFloat(), height.toFloat()) + + catButtons.render(gc, g) + + + items.forEach { + it.render(gc, g) + } } override fun processInput(gc: GameContainer, delta: Int, input: Input) { - TODO("not implemented") } override fun doOpening(gc: GameContainer, delta: Int) { - TODO("not implemented") + UICanvas.doOpeningFade(handler, openCloseTime) } override fun doClosing(gc: GameContainer, delta: Int) { - TODO("not implemented") + UICanvas.doClosingFade(handler, openCloseTime) } override fun endOpening(gc: GameContainer, delta: Int) { - TODO("not implemented") + UICanvas.endOpeningFade(handler) } override fun endClosing(gc: GameContainer, delta: Int) { - TODO("not implemented") + UICanvas.endClosingFade(handler) } -} \ No newline at end of file +} diff --git a/src/net/torvald/terrarum/ui/UIItemTextButtonList.kt b/src/net/torvald/terrarum/ui/UIItemTextButtonList.kt index e2c7ce013..9c6f8d005 100644 --- a/src/net/torvald/terrarum/ui/UIItemTextButtonList.kt +++ b/src/net/torvald/terrarum/ui/UIItemTextButtonList.kt @@ -28,7 +28,7 @@ class UIItemTextButtonList( val iconSpriteSheetIndices: IntArray? = null, // copied directly from UIItemTextButton - val activeCol: Color = Color(0xffffff), + val activeCol: Color = Color(0xfff066), val activeBackCol: Color = Color(0,0,0,0), val activeBackBlendMode: String = BlendMode.NORMAL, val highlightCol: Color = Color(0x00f8ff),