proper way of setting quickslot #

Former-commit-id: 5cd21f043def3c7622290df5bf11f0b3f0080d30
This commit is contained in:
Song Minjae
2017-03-28 03:44:43 +09:00
parent cd710de280
commit 48315daa7d
19 changed files with 272 additions and 287 deletions

View File

@@ -689,19 +689,19 @@ class StateInGame : BasicGameState() {
// which means we don't need to check if i >= 0 again // which means we don't need to check if i >= 0 again
if (actor is ActorVisible) { if (actor is ActorVisible) {
when (actor.renderOrder) { when (actor.renderOrder) {
ActorOrder.BEHIND -> { Actor.RenderOrder.BEHIND -> {
val i = actorsRenderBehind.binarySearch(actor.referenceID) val i = actorsRenderBehind.binarySearch(actor.referenceID)
actorsRenderBehind.removeAt(i) actorsRenderBehind.removeAt(i)
} }
ActorOrder.MIDDLE -> { Actor.RenderOrder.MIDDLE -> {
val i = actorsRenderMiddle.binarySearch(actor.referenceID) val i = actorsRenderMiddle.binarySearch(actor.referenceID)
actorsRenderMiddle.removeAt(i) actorsRenderMiddle.removeAt(i)
} }
ActorOrder.MIDTOP -> { Actor.RenderOrder.MIDTOP -> {
val i = actorsRenderMidTop.binarySearch(actor.referenceID) val i = actorsRenderMidTop.binarySearch(actor.referenceID)
actorsRenderMidTop.removeAt(i) actorsRenderMidTop.removeAt(i)
} }
ActorOrder.FRONT -> { Actor.RenderOrder.FRONT -> {
val i = actorsRenderFront.binarySearch(actor.referenceID) val i = actorsRenderFront.binarySearch(actor.referenceID)
actorsRenderFront.removeAt(i) actorsRenderFront.removeAt(i)
} }
@@ -723,16 +723,16 @@ class StateInGame : BasicGameState() {
if (actor is ActorVisible) { if (actor is ActorVisible) {
when (actor.renderOrder) { when (actor.renderOrder) {
ActorOrder.BEHIND -> { Actor.RenderOrder.BEHIND -> {
actorsRenderBehind.add(actor); insertionSortLastElemAV(actorsRenderBehind) actorsRenderBehind.add(actor); insertionSortLastElemAV(actorsRenderBehind)
} }
ActorOrder.MIDDLE -> { Actor.RenderOrder.MIDDLE -> {
actorsRenderMiddle.add(actor); insertionSortLastElemAV(actorsRenderMiddle) actorsRenderMiddle.add(actor); insertionSortLastElemAV(actorsRenderMiddle)
} }
ActorOrder.MIDTOP -> { Actor.RenderOrder.MIDTOP -> {
actorsRenderMidTop.add(actor); insertionSortLastElemAV(actorsRenderMidTop) actorsRenderMidTop.add(actor); insertionSortLastElemAV(actorsRenderMidTop)
} }
ActorOrder.FRONT -> { Actor.RenderOrder.FRONT -> {
actorsRenderFront.add(actor); insertionSortLastElemAV(actorsRenderFront) actorsRenderFront.add(actor); insertionSortLastElemAV(actorsRenderFront)
} }
} }
@@ -754,16 +754,16 @@ class StateInGame : BasicGameState() {
if (actor is ActorVisible) { if (actor is ActorVisible) {
when (actor.renderOrder) { when (actor.renderOrder) {
ActorOrder.BEHIND -> { Actor.RenderOrder.BEHIND -> {
actorsRenderBehind.add(actor); insertionSortLastElemAV(actorsRenderBehind) actorsRenderBehind.add(actor); insertionSortLastElemAV(actorsRenderBehind)
} }
ActorOrder.MIDDLE -> { Actor.RenderOrder.MIDDLE -> {
actorsRenderMiddle.add(actor); insertionSortLastElemAV(actorsRenderMiddle) actorsRenderMiddle.add(actor); insertionSortLastElemAV(actorsRenderMiddle)
} }
ActorOrder.MIDTOP -> { Actor.RenderOrder.MIDTOP -> {
actorsRenderMidTop.add(actor); insertionSortLastElemAV(actorsRenderMidTop) actorsRenderMidTop.add(actor); insertionSortLastElemAV(actorsRenderMidTop)
} }
ActorOrder.FRONT -> { Actor.RenderOrder.FRONT -> {
actorsRenderFront.add(actor); insertionSortLastElemAV(actorsRenderFront) actorsRenderFront.add(actor); insertionSortLastElemAV(actorsRenderFront)
} }
} }

View File

@@ -1,19 +1,14 @@
package net.torvald.terrarum package net.torvald.terrarum
import net.torvald.terrarum.gameactors.ActorInventory import net.torvald.terrarum.gameactors.*
import net.torvald.terrarum.gameactors.InventoryPair
import net.torvald.terrarum.gameitem.IVKey import net.torvald.terrarum.gameitem.IVKey
import net.torvald.terrarum.gameitem.InventoryItem import net.torvald.terrarum.gameitem.InventoryItem
import net.torvald.terrarum.itemproperties.ItemCodex import net.torvald.terrarum.itemproperties.ItemCodex
import net.torvald.terrarum.mapdrawer.MapCamera import net.torvald.terrarum.tileproperties.Tile
import net.torvald.terrarum.ui.UICanvas import net.torvald.terrarum.ui.*
import net.torvald.terrarum.ui.UIHandler
import net.torvald.terrarum.ui.UIItemTextButton
import net.torvald.terrarum.ui.UIItemTextButtonList
import org.newdawn.slick.* import org.newdawn.slick.*
import org.newdawn.slick.state.BasicGameState import org.newdawn.slick.state.BasicGameState
import org.newdawn.slick.state.StateBasedGame import org.newdawn.slick.state.StateBasedGame
import java.util.*
/** /**
* Created by SKYHi14 on 2017-03-13. * Created by SKYHi14 on 2017-03-13.
@@ -22,20 +17,34 @@ class StateUITest : BasicGameState() {
val ui: UIHandler 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?>(InventoryItem.EquipPosition.INDEX_MAX + 1, { null })
}
init { init {
ui = UIHandler(SimpleUI(inventory, 800, Terrarum.HEIGHT - 160)) ui = UIHandler(UIInventory(actor, 800, Terrarum.HEIGHT - 160))
ui.posX = 0 ui.posX = 0
ui.posY = 60 ui.posY = 60
ui.isVisible = true ui.isVisible = true
// these are the test codes. // these are the test codes.
// Item properties must be pre-composed using CSV/JSON, and read and made into the item instance // Item properties must be pre-composed using CSV/JSON, and read and made into the item instance
// using factory/builder pattern. @see ItemCodex // using factory/builder pattern. @see ItemCodex
inventory.add(object : InventoryItem() { actor.actorValue[AVKey.__PLAYER_QSPREFIX + "3"] = Tile.STONE
actor.inventory.add(object : InventoryItem() {
init { init {
itemProperties[IVKey.ITEMTYPE] = IVKey.ItemType.HAMMER itemProperties[IVKey.ITEMTYPE] = IVKey.ItemType.HAMMER
} }
@@ -48,9 +57,9 @@ class StateUITest : BasicGameState() {
override var maxDurability: Double = 10.0 override var maxDurability: Double = 10.0
override var durability: Double = 6.43 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 { init {
itemProperties[IVKey.ITEMTYPE] = IVKey.ItemType.ARTEFACT itemProperties[IVKey.ITEMTYPE] = IVKey.ItemType.ARTEFACT
} }
@@ -62,7 +71,7 @@ class StateUITest : BasicGameState() {
override var category: String = InventoryItem.Category.MISC 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?) { override fun init(container: GameContainer?, game: StateBasedGame?) {
@@ -80,176 +89,3 @@ class StateUITest : BasicGameState() {
ui.render(container, game, g) 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<String, String>()
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<InventoryPair>()
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<InventoryPair>()
// 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)
}
}

View File

@@ -33,13 +33,10 @@ typealias Millisec = Int
*/ */
object Terrarum : StateBasedGame(GAME_NAME) { object Terrarum : StateBasedGame(GAME_NAME) {
//////////////////////////////
val sysLang: String // GLOBAL IMMUTABLE CONFIGS //
get() { //////////////////////////////
val lan = System.getProperty("user.language") val QUICKSLOT_MAX = 10
val country = System.getProperty("user.country")
return lan + country
}
/** /**
* To be used with physics simulator * To be used with physics simulator
@@ -55,6 +52,19 @@ object Terrarum : StateBasedGame(GAME_NAME) {
*/ */
val TARGET_INTERNAL_FPS = 100 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 lateinit var appgc: AppGameContainer
var WIDTH = 1072 var WIDTH = 1072
@@ -89,7 +99,7 @@ object Terrarum : StateBasedGame(GAME_NAME) {
val memXmx: Long val memXmx: Long
get() = Runtime.getRuntime().maxMemory() shr 20 get() = Runtime.getRuntime().maxMemory() shr 20
lateinit var environment: RunningEnvironment val environment: RunningEnvironment
private val localeSimple = arrayOf("de", "en", "es", "it") private val localeSimple = arrayOf("de", "en", "es", "it")
var gameLocale = "####" // lateinit placeholder var gameLocale = "####" // lateinit placeholder
@@ -228,15 +238,15 @@ object Terrarum : StateBasedGame(GAME_NAME) {
val readFromDisk = readConfigJson() val readFromDisk = readConfigJson()
if (!readFromDisk) readConfigJson() if (!readFromDisk) readConfigJson()
try { environment = try {
Controllers.getController(0) Controllers.getController(0)
environment = if (getConfigString("pcgamepadenv") == "console") if (getConfigString("pcgamepadenv") == "console")
RunningEnvironment.CONSOLE RunningEnvironment.CONSOLE
else else
RunningEnvironment.PC RunningEnvironment.PC
} }
catch (e: IndexOutOfBoundsException) { catch (e: IndexOutOfBoundsException) {
environment = RunningEnvironment.PC RunningEnvironment.PC
} }
} }

View File

@@ -23,6 +23,7 @@ class UIItemInventoryElem(
var item: InventoryItem?, var item: InventoryItem?,
var amount: Int, var amount: Int,
var itemImage: Image?, var itemImage: Image?,
val mouseOverTextCol: Color = Color(0xfff066),
val mouseoverBackCol: Color = Color(0,0,0,0), val mouseoverBackCol: Color = Color(0,0,0,0),
val mouseoverBackBlendMode: String = BlendMode.NORMAL, val mouseoverBackBlendMode: String = BlendMode.NORMAL,
val backCol: Color = Color(0,0,0,0), val backCol: Color = Color(0,0,0,0),
@@ -80,7 +81,7 @@ class UIItemInventoryElem(
g.drawImage(itemImage!!, posX + imgOffset, posY + imgOffset) g.drawImage(itemImage!!, posX + imgOffset, posY + imgOffset)
// if mouse is over, text lights up // 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( g.drawString(
item!!.name + (if (amount > 0 && !item!!.isUnique) "${0x3000.toChar()}($amount)" else "") item!!.name + (if (amount > 0 && !item!!.isUnique) "${0x3000.toChar()}($amount)" else "")
, posX + textOffsetX , posX + textOffsetX

View File

@@ -88,6 +88,7 @@ object AVKey {
const val __PLAYER_QUICKSLOTSEL = "__quickslotselection" const val __PLAYER_QUICKSLOTSEL = "__quickslotselection"
/** Item ID; they are supposed to be unique */ /** SYNOPSIS: __qsitem1 .. __qsitem10
const val __PLAYER_QSPREFIX = "__qsitem" // __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!)
} }

View File

@@ -7,11 +7,18 @@ import net.torvald.terrarum.itemproperties.ItemCodex
import org.newdawn.slick.GameContainer 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. * Created by minjaesong on 15-12-31.
*/ */
abstract class Actor(val renderOrder: ActorOrder) : Comparable<Actor>, Runnable { abstract class Actor(val renderOrder: RenderOrder) : Comparable<Actor>, 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) abstract fun update(gc: GameContainer, delta: Int)
@@ -20,8 +27,8 @@ abstract class Actor(val renderOrder: ActorOrder) : Comparable<Actor>, Runnable
* @return Reference ID. (16777216-0x7FFF_FFFF) * @return Reference ID. (16777216-0x7FFF_FFFF)
*/ */
open var referenceID: Int = generateUniqueReferenceID() open var referenceID: Int = generateUniqueReferenceID()
abstract var actorValue: ActorValue var actorValue = ActorValue()
abstract var flagDespawn: Boolean @Volatile var flagDespawn = false
override fun equals(other: Any?) = referenceID == (other as Actor).referenceID override fun equals(other: Any?) = referenceID == (other as Actor).referenceID
override fun hashCode() = referenceID override fun hashCode() = referenceID
@@ -40,34 +47,32 @@ abstract class Actor(val renderOrder: ActorOrder) : Comparable<Actor>, Runnable
* override var referenceID: Int = generateUniqueReferenceID() * override var referenceID: Int = generateUniqueReferenceID()
*/ */
fun generateUniqueReferenceID(): Int { fun generateUniqueReferenceID(): Int {
fun checkForCollision(value: Int) = fun hasCollision(value: Int) =
Terrarum.ingame!!.theGameHasActor(value) || try {
value < ItemCodex.ITEM_COUNT_MAX || Terrarum.ingame!!.theGameHasActor(value) ||
value < when (renderOrder) { value < ItemCodex.ITEM_COUNT_MAX ||
ActorOrder.BEHIND -> ItemCodex.ITEM_COUNT_MAX value < when (renderOrder) {
ActorOrder.MIDDLE -> 0x10000000 RenderOrder.BEHIND -> ItemCodex.ITEM_COUNT_MAX
ActorOrder.MIDTOP -> 0x60000000 RenderOrder.MIDDLE -> 0x10000000
ActorOrder.FRONT -> 0x70000000 RenderOrder.MIDTOP -> 0x60000000
} || RenderOrder.FRONT -> 0x70000000
value > when (renderOrder) { } ||
ActorOrder.BEHIND -> 0x0FFFFFFF value > when (renderOrder) {
ActorOrder.MIDDLE -> 0x5FFFFFFF RenderOrder.BEHIND -> 0x0FFFFFFF
ActorOrder.MIDTOP -> 0x6FFFFFFF RenderOrder.MIDDLE -> 0x5FFFFFFF
ActorOrder.FRONT -> 0x7FFFFFFF RenderOrder.MIDTOP -> 0x6FFFFFFF
RenderOrder.FRONT -> 0x7FFFFFFF
}
}
catch (gameNotInitialisedException: KotlinNullPointerException) {
false
} }
var ret: Int var ret: Int
do { do {
ret = HQRNG().nextInt().and(0x7FFFFFFF) // set new ID ret = HQRNG().nextInt().and(0x7FFFFFFF) // set new ID
} while (checkForCollision(ret)) // check for collision } while (hasCollision(ret)) // check for collision
return ret return ret
} }
}
enum class ActorOrder {
BEHIND, // tapestries, some particles (obstructed by terrain)
MIDDLE, // actors
MIDTOP, // bullets, thrown items
FRONT // fake tiles
} }

View File

@@ -4,9 +4,11 @@ import org.newdawn.slick.GameContainer
import org.newdawn.slick.Graphics import org.newdawn.slick.Graphics
/** /**
* Actor with visible body
*
* Created by minjaesong on 2017-01-21. * 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) open val hitbox = Hitbox(0.0, 0.0, 0.0, 0.0)
override abstract fun update(gc: GameContainer, delta: Int) override abstract fun update(gc: GameContainer, delta: Int)
abstract fun drawBody(g: Graphics) abstract fun drawBody(g: Graphics)

View File

@@ -26,11 +26,10 @@ import java.util.*
* *
* Created by minjaesong on 16-01-13. * 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 !! **/ /** !! ActorValue macros are on the very bottom of the source !! **/
override var actorValue: ActorValue = ActorValue()
@Transient internal var sprite: SpriteAnimation? = null @Transient internal var sprite: SpriteAnimation? = null
@Transient internal var spriteGlow: SpriteAnimation? = null @Transient internal var spriteGlow: SpriteAnimation? = null
@@ -162,7 +161,6 @@ open class ActorWithSprite(renderOrder: ActorOrder, val immobileBody: Boolean =
@Volatile var grounded = false @Volatile var grounded = false
override @Volatile var flagDespawn = false
/** Default to 'true' */ /** Default to 'true' */
var isVisible = true var isVisible = true
/** Default to 'true' */ /** Default to 'true' */

View File

@@ -19,7 +19,7 @@ object CreatureBuilder {
*/ */
@Throws(IOException::class, SlickException::class) @Throws(IOException::class, SlickException::class)
operator fun invoke(jsonFileName: String): ActorWithSprite { operator fun invoke(jsonFileName: String): ActorWithSprite {
val actor = ActorWithSprite(ActorOrder.MIDDLE) val actor = ActorWithSprite(Actor.RenderOrder.MIDDLE)
InjectCreatureRaw(actor.actorValue, jsonFileName) InjectCreatureRaw(actor.actorValue, jsonFileName)
return actor return actor

View File

@@ -9,7 +9,7 @@ import org.newdawn.slick.Graphics
/** /**
* Created by minjaesong on 16-03-15. * 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 { init {
if (item.id >= ItemCodex.ITEM_COUNT_MAX) if (item.id >= ItemCodex.ITEM_COUNT_MAX)

View File

@@ -6,7 +6,7 @@ import net.torvald.spriteanimation.SpriteAnimation
* Created by minjaesong on 16-06-17. * Created by minjaesong on 16-06-17.
*/ */
open class FixtureBase(physics: Boolean = true) : open class FixtureBase(physics: Boolean = true) :
ActorWithSprite(ActorOrder.BEHIND, immobileBody = true, physics = physics) { ActorWithSprite(Actor.RenderOrder.BEHIND, immobileBody = true, physics = physics) {
/** /**
* 0: Open * 0: Open
* 1: Blocked * 1: Blocked

View File

@@ -11,7 +11,7 @@ import org.newdawn.slick.Input
* *
* Created by minjaesong on 16-10-10. * 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 { init {
this.actorValue["_bornyear"] = born.year this.actorValue["_bornyear"] = born.year

View File

@@ -15,7 +15,7 @@ import org.newdawn.slick.Image
* *
* Created by minjaesong on 2017-01-20. * 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 */ /** Will NOT actually delete from the CircularArray */
@Volatile var flagDespawn = false @Volatile var flagDespawn = false

View File

@@ -6,7 +6,7 @@ import org.newdawn.slick.Image
/** /**
* Created by minjaesong on 2017-01-20. * 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 { init {
body = Image("./assets/graphics/weathers/raindrop.tga") body = Image("./assets/graphics/weathers/raindrop.tga")

View File

@@ -10,7 +10,7 @@ import org.newdawn.slick.Graphics
/** /**
* Created by minjaesong on 16-03-05. * 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 private var color = Color.orange

View File

@@ -23,7 +23,7 @@ open class ProjectileSimple(
private val type: Int, private val type: Int,
fromPoint: Vector2, // projected coord fromPoint: Vector2, // projected coord
toPoint: Vector2 // arriving coord toPoint: Vector2 // arriving coord
) : ActorWithSprite(ActorOrder.MIDTOP), Luminous, Projectile { ) : ActorWithSprite(Actor.RenderOrder.MIDTOP), Luminous, Projectile {
val damage: Int val damage: Int
val displayColour: Color val displayColour: Color

View File

@@ -3,7 +3,7 @@ package net.torvald.terrarum.gameactors
/** /**
* Created by minjaesong on 16-04-26. * 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 // just let the solver use AABB; it's cheap but works just enough
/** /**

View File

@@ -1,64 +1,196 @@
package net.torvald.terrarum.ui package net.torvald.terrarum.ui
import org.newdawn.slick.GameContainer import net.torvald.terrarum.*
import org.newdawn.slick.Graphics import net.torvald.terrarum.Terrarum.QUICKSLOT_MAX
import org.newdawn.slick.Input 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. * Created by SKYHi14 on 2017-03-13.
*/ */
class UIInventory : UICanvas { class UIInventory(
override var width: Int val actor: Pocketed,
get() = TODO("not implemented") //To change initializer of created properties use File | Settings | File Templates. override var width: Int,
set(value) {} override var height: Int
override var height: Int ) : UICanvas {
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) {}
val inventory: ActorInventory
get() = actor.inventory
val actorValue: ActorValue
get() = (actor as Actor).actorValue
private val categories = arrayOf( override var handler: UIHandler? = null
"GAME_INVENTORY_WEAPONS", // weapons and tools override var openCloseTime: Int = UICanvas.OPENCLOSE_GENERIC
"CONTEXT_ITEM_TOOL_PLURAL",
"CONTEXT_ITEM_ARMOR", val itemImagePlaceholder = Image("./assets/item_kari_24.tga")
"GAME_INVENTORY_INGREDIENTS",
"GAME_INVENTORY_POTIONS", val catButtonsToCatIdent = HashMap<String, String>()
"CONTEXT_ITEM_MAGIC",
"GAME_INVENTORY_BLOCKS", val backgroundColour = Color(0x1c1c1c)
"GAME_INVENTORY_WALLS",
"MENU_LABEL_ALL" 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<InventoryPair>()
var rebuildList = true
private var oldCatSelect = -1
override fun update(gc: GameContainer, delta: Int) { 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<InventoryPair>()
// 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) { 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) { override fun processInput(gc: GameContainer, delta: Int, input: Input) {
TODO("not implemented")
} }
override fun doOpening(gc: GameContainer, delta: Int) { override fun doOpening(gc: GameContainer, delta: Int) {
TODO("not implemented") UICanvas.doOpeningFade(handler, openCloseTime)
} }
override fun doClosing(gc: GameContainer, delta: Int) { override fun doClosing(gc: GameContainer, delta: Int) {
TODO("not implemented") UICanvas.doClosingFade(handler, openCloseTime)
} }
override fun endOpening(gc: GameContainer, delta: Int) { override fun endOpening(gc: GameContainer, delta: Int) {
TODO("not implemented") UICanvas.endOpeningFade(handler)
} }
override fun endClosing(gc: GameContainer, delta: Int) { override fun endClosing(gc: GameContainer, delta: Int) {
TODO("not implemented") UICanvas.endClosingFade(handler)
} }
} }

View File

@@ -28,7 +28,7 @@ class UIItemTextButtonList(
val iconSpriteSheetIndices: IntArray? = null, val iconSpriteSheetIndices: IntArray? = null,
// copied directly from UIItemTextButton // copied directly from UIItemTextButton
val activeCol: Color = Color(0xffffff), val activeCol: Color = Color(0xfff066),
val activeBackCol: Color = Color(0,0,0,0), val activeBackCol: Color = Color(0,0,0,0),
val activeBackBlendMode: String = BlendMode.NORMAL, val activeBackBlendMode: String = BlendMode.NORMAL,
val highlightCol: Color = Color(0x00f8ff), val highlightCol: Color = Color(0x00f8ff),