inventory ui

icon in list


Former-commit-id: 7182dcda408d9710d77e25e357f3a67bdd42fff9
This commit is contained in:
Song Minjae
2017-03-22 23:58:18 +09:00
parent 23f6f9cf5a
commit d390217ba9
18 changed files with 274 additions and 101 deletions

View File

@@ -5,6 +5,7 @@ import java.util.*
import java.util.function.Consumer import java.util.function.Consumer
typealias ActorValue = KVHashMap typealias ActorValue = KVHashMap
typealias ItemValue = KVHashMap
typealias GameConfig = KVHashMap typealias GameConfig = KVHashMap
/** /**

View File

@@ -69,10 +69,10 @@ nopqrstuvwxyz
"most of them does not support your language, vector fonts takes too much time to be loaded,", "most of them does not support your language, vector fonts takes too much time to be loaded,",
"even then their legibility suffers because fuck built-in antialias.", "even then their legibility suffers because fuck built-in antialias.",
"You somehow found a good font, and it makes your game look like a linux terminal, and you say:", "You somehow found a good font, and it makes your game look like a linux terminal, and you say:",
"\"what the fuck? Is this a game or should I rm -rf this shit‽\"", "what the fuck? Is this a game or should I rm -rf this shit‽",
"You speak Japanese, and you wish to support it, but then このクソなfontは only good for Japanese,", "You speak Japanese, and you wish to support it, but then このクソなfontは only good for Japanese,",
"and it is not multilingual, and you don't have a time for this shenanigan.", "and it is not multilingual, and you don't have a time for this shenanigan.",
"Eventually you give up, saying \"fuck it!\" and just use the fonts that do not match well.", "Eventually you give up, saying fuck it! and just use the fonts that do not match well.",
"", "",
"No more suffering. This font has everything you need.", "No more suffering. This font has everything you need.",
"", "",

View File

@@ -2,7 +2,9 @@ package net.torvald.terrarum
import net.torvald.terrarum.gameactors.ActorInventory import net.torvald.terrarum.gameactors.ActorInventory
import net.torvald.terrarum.gameactors.InventoryPair import net.torvald.terrarum.gameactors.InventoryPair
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.mapdrawer.MapCamera import net.torvald.terrarum.mapdrawer.MapCamera
import net.torvald.terrarum.ui.UICanvas import net.torvald.terrarum.ui.UICanvas
import net.torvald.terrarum.ui.UIHandler import net.torvald.terrarum.ui.UIHandler
@@ -29,24 +31,37 @@ class StateUITest : BasicGameState() {
ui.isVisible = true 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() { inventory.add(object : InventoryItem() {
init {
itemProperties[IVKey.ITEMTYPE] = IVKey.ItemType.HAMMER
}
override val id: Int = 5656 override val id: Int = 5656
override val isUnique: Boolean = true
override var originalName: String = "Test tool" override var originalName: String = "Test tool"
override var baseMass: Double = 12.0 override var baseMass: Double = 12.0
override var baseToolSize: Double? = 8.0 override var baseToolSize: Double? = 8.0
override var category: String = "tool" override var category: String = InventoryItem.Category.TOOL
override var maxDurability: Double = 10.0 override var maxDurability: Double = 10.0
override var durability: Double = 10.0 override var durability: Double = 6.43
}) })
inventory.getByID(5656)!!.item.name = "Test tool" inventory.getByID(5656)!!.item.name = "Test tool"
inventory.add(object : InventoryItem() { inventory.add(object : InventoryItem() {
init {
itemProperties[IVKey.ITEMTYPE] = IVKey.ItemType.ARTEFACT
}
override val id: Int = 4633 override val id: Int = 4633
override val isUnique: Boolean = true
override var originalName: String = "CONTEXT_ITEM_QUEST_NOUN" override var originalName: String = "CONTEXT_ITEM_QUEST_NOUN"
override var baseMass: Double = 1.4 override var baseMass: Double = 1.4
override var baseToolSize: Double? = null override var baseToolSize: Double? = null
override var category: String = "bulk" override var category: String = InventoryItem.Category.MISC
}) })
inventory.add(ItemCodex[16], 543)
} }
override fun init(container: GameContainer?, game: StateBasedGame?) { override fun init(container: GameContainer?, game: StateBasedGame?) {
@@ -65,21 +80,36 @@ class StateUITest : BasicGameState() {
private class SimpleUI(val inventory: ActorInventory) : UICanvas { private class SimpleUI(val inventory: ActorInventory) : UICanvas {
override var width = 700 override var width = 700
override var height = 480 // multiple of 40 (2 * font.lineHeight) override var height = 480 // multiple of 40 (2 * font.lineHeight)
override var handler: UIHandler? = null override var handler: UIHandler? = null
override var openCloseTime: Int = UICanvas.OPENCLOSE_GENERIC override var openCloseTime: Int = UICanvas.OPENCLOSE_GENERIC
val itemImage = Image("./assets/item_kari_24.tga") val itemImagePlaceholder = Image("./assets/item_kari_24.tga")
val catButtonsToCatIdent = HashMap<String, String>()
init {
catButtonsToCatIdent.put("GAME_INVENTORY_WEAPONS", InventoryItem.Category.WEAPON)
catButtonsToCatIdent.put("CONTEXT_ITEM_EQUIPMENT_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 buttons = UIItemTextButtonList( val buttons = UIItemTextButtonList(
this, this,
arrayOf( arrayOf(
"MENU_LABEL_ALL",
"GAME_INVENTORY_WEAPONS", // weapons and tools "GAME_INVENTORY_WEAPONS", // weapons and tools
"CONTEXT_ITEM_EQUIPMENT_PLURAL", "CONTEXT_ITEM_EQUIPMENT_PLURAL",
"CONTEXT_ITEM_ARMOR", "CONTEXT_ITEM_ARMOR",
@@ -88,19 +118,23 @@ private class SimpleUI(val inventory: ActorInventory) : UICanvas {
"CONTEXT_ITEM_MAGIC", "CONTEXT_ITEM_MAGIC",
"GAME_INVENTORY_BLOCKS", "GAME_INVENTORY_BLOCKS",
"GAME_INVENTORY_WALLS", "GAME_INVENTORY_WALLS",
"GAME_INVENTORY_FAVORITES", "GAME_GENRE_MISC"
"MENU_LABEL_ALL" //"GAME_INVENTORY_FAVORITES",
), ),
width = (width / 3 / 100) * 100, // chop to hundreds unit (100, 200, 300, ...) with the black magic of integer division width = (width / 3 / 100) * 100, // chop to hundreds unit (100, 200, 300, ...) with the black magic of integer division
height = height, height = height,
readFromLang = true, 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 = Color(0x202020), highlightBackCol = Color(0x202020),
highlightBackBlendMode = BlendMode.NORMAL, highlightBackBlendMode = BlendMode.NORMAL,
backgroundCol = Color(0x383838), backgroundCol = Color(0x383838),
kinematic = true kinematic = true
) )
val itemStripGutterV = 4 val itemStripGutterV = 10
val itemStripGutterH = 48 val itemStripGutterH = 48
val itemsStripWidth = width - buttons.width - 2 * itemStripGutterH val itemsStripWidth = width - buttons.width - 2 * itemStripGutterH
@@ -119,29 +153,55 @@ private class SimpleUI(val inventory: ActorInventory) : UICanvas {
var inventorySortList = ArrayList<InventoryPair>() var inventorySortList = ArrayList<InventoryPair>()
var rebuildList = true var rebuildList = true
private var oldCatSelect = -1
override fun update(gc: GameContainer, delta: Int) { override fun update(gc: GameContainer, delta: Int) {
Terrarum.gameLocale = "en" // hot swap this to test Terrarum.gameLocale = "en" // hot swap this to test
buttons.update(gc, delta) buttons.update(gc, delta)
// test fill: just copy the inventory, fuck sorting // monitor and check if category selection has been changed
if (oldCatSelect != buttons.selectedIndex) {
rebuildList = true
}
if (rebuildList) { if (rebuildList) {
val filter = catButtonsToCatIdent[buttons.selectedButton.labelText]
inventorySortList = ArrayList<InventoryPair>() inventorySortList = ArrayList<InventoryPair>()
inventory.forEach { inventorySortList.add(it) }
// filter items
inventory.forEach {
if (it.item.category == filter || filter == "__all__")
inventorySortList.add(it)
}
rebuildList = false rebuildList = false
// sort if needed // // sort if needed
// test sort by name
inventorySortList.sortBy { it.item.name }
inventorySortList.forEachIndexed { index, pair -> // map sortList to item list
if (index - itemsScrollOffset >= 0 && index < items.size + itemsScrollOffset) { for (k in 0..items.size - 1) {
items[index - itemsScrollOffset].item = pair.item try {
items[index - itemsScrollOffset].amount = pair.amount val sortListItem = inventorySortList[k + itemsScrollOffset]
items[index - itemsScrollOffset].itemImage = itemImage items[k].item = sortListItem.item
items[k].amount = sortListItem.amount
items[k].itemImage = itemImagePlaceholder
}
catch (e: IndexOutOfBoundsException) {
items[k].item = null
items[k].amount = 0
items[k].itemImage = null
} }
} }
} }
oldCatSelect = buttons.selectedIndex
} }
override fun render(gc: GameContainer, g: Graphics) { override fun render(gc: GameContainer, g: Graphics) {
@@ -171,7 +231,7 @@ private class SimpleUI(val inventory: ActorInventory) : UICanvas {
UICanvas.endOpeningFade(handler) UICanvas.endOpeningFade(handler)
} }
override fun endClosing(gc: GameContainer, delta: Int) {7 override fun endClosing(gc: GameContainer, delta: Int) {
UICanvas.endClosingFade(handler) UICanvas.endClosingFade(handler)
} }
} }

View File

@@ -102,9 +102,23 @@ object Terrarum : StateBasedGame(GAME_NAME) {
if (fontGame != null) (fontGame as GameFontImpl).reload() if (fontGame != null) (fontGame as GameFontImpl).reload()
} }
var fontGame: Font? = null var fontGame: Font = object : Font {
override fun getHeight(str: String?) = 0
override fun drawString(x: Float, y: Float, text: String?) {}
override fun drawString(x: Float, y: Float, text: String?, col: Color?) {}
override fun drawString(x: Float, y: Float, text: String?, col: Color?, startIndex: Int, endIndex: Int) {}
override fun getWidth(str: String?) = 0
override fun getLineHeight() = 0
} // null font
private set private set
lateinit var fontSmallNumbers: Font var fontSmallNumbers: Font = object : Font {
override fun getHeight(str: String?) = 0
override fun drawString(x: Float, y: Float, text: String?) {}
override fun drawString(x: Float, y: Float, text: String?, col: Color?) {}
override fun drawString(x: Float, y: Float, text: String?, col: Color?, startIndex: Int, endIndex: Int) {}
override fun getWidth(str: String?) = 0
override fun getLineHeight() = 0
} // null font
private set private set
var joypadLabelStart: Char = 0xE000.toChar() // lateinit var joypadLabelStart: Char = 0xE000.toChar() // lateinit
@@ -228,6 +242,10 @@ object Terrarum : StateBasedGame(GAME_NAME) {
@Throws(SlickException::class) @Throws(SlickException::class)
override fun initStatesList(gc: GameContainer) { override fun initStatesList(gc: GameContainer) {
fontGame = GameFontImpl()
fontSmallNumbers = TinyAlphNum()
gc.input.enableKeyRepeat() gc.input.enableKeyRepeat()
@@ -243,9 +261,6 @@ object Terrarum : StateBasedGame(GAME_NAME) {
println("[Terrarum] Locale: " + gameLocale) println("[Terrarum] Locale: " + gameLocale)
fontGame = GameFontImpl()
fontSmallNumbers = TinyAlphNum()
// search for real controller // search for real controller
// exclude controllers with name "Mouse", "keyboard" // exclude controllers with name "Mouse", "keyboard"
@@ -286,9 +301,9 @@ object Terrarum : StateBasedGame(GAME_NAME) {
//addState(StateBlurTest()) //addState(StateBlurTest())
//addState(StateShaderTest()) //addState(StateShaderTest())
//addState(StateNoiseTester()) //addState(StateNoiseTester())
//addState(StateUITest()) addState(StateUITest())
//addState(StateControllerRumbleTest()) //addState(StateControllerRumbleTest())
addState(StateMidiInputTest()) //addState(StateMidiInputTest())
//ingame = StateInGame(); addState(ingame) //ingame = StateInGame(); addState(ingame)

View File

@@ -1,5 +1,6 @@
package net.torvald.terrarum package net.torvald.terrarum
import net.torvald.colourutil.CIELabUtil.darkerLab
import net.torvald.terrarum.gameitem.InventoryItem import net.torvald.terrarum.gameitem.InventoryItem
import net.torvald.terrarum.ui.UICanvas import net.torvald.terrarum.ui.UICanvas
import net.torvald.terrarum.ui.UIItem import net.torvald.terrarum.ui.UIItem
@@ -9,9 +10,7 @@ import org.newdawn.slick.GameContainer
import org.newdawn.slick.Graphics import org.newdawn.slick.Graphics
import org.newdawn.slick.Image import org.newdawn.slick.Image
/** /***
* @param amount: set to -1 (UIItemInventoryElem.UNIQUE_ITEM_HAS_NO_AMOUNT) for unique item (does not show item count)
*
* Note that the UI will not render if either item or itemImage is null. * Note that the UI will not render if either item or itemImage is null.
* *
* Created by SKYHi14 on 2017-03-16. * Created by SKYHi14 on 2017-03-16.
@@ -39,6 +38,12 @@ class UIItemInventoryElem(
get() = (this.height - itemImage!!.height).div(2).toFloat() // to snap to the pixel grid get() = (this.height - itemImage!!.height).div(2).toFloat() // to snap to the pixel grid
private val textOffsetX = 52f private val textOffsetX = 52f
private val durabilityCol = Color(0x22ff11)
private val durabilityBack: Color; get() = durabilityCol.darkerLab(0.4f)
override fun update(gc: GameContainer, delta: Int) { override fun update(gc: GameContainer, delta: Int) {
if (item != null) { if (item != null) {
@@ -63,11 +68,22 @@ class UIItemInventoryElem(
// 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) Color(0xffffff) else UIItemTextButton.defaultInactiveCol
g.drawString(item!!.name, posX + textOffsetX, posY + 0f) g.drawString(
item!!.name + (if (amount > 0 && !item!!.isUnique) "${0x3000.toChar()}($amount)" else "")
, posX + textOffsetX
, posY + 8f
)
// durability metre
if (item!!.maxDurability > 0.0) { if (item!!.maxDurability > 0.0) {
// TODO durability gauge g.color = durabilityBack
g.lineWidth = 3f
val fullLen = (width - 20f) - textOffsetX
val barOffset = posX + textOffsetX
g.drawLine(barOffset, posY + 35f, barOffset + fullLen, posY + 35f)
g.color = durabilityCol
g.drawLine(barOffset, posY + 35f, barOffset + fullLen * (item!!.durability / item!!.maxDurability).toFloat(), posY + 35f)
} }
} }
} }

View File

@@ -4,7 +4,6 @@ import net.torvald.terrarum.Terrarum
import net.torvald.terrarum.gameactors.ActorInventory import net.torvald.terrarum.gameactors.ActorInventory
import net.torvald.terrarum.gameactors.Player import net.torvald.terrarum.gameactors.Player
import net.torvald.terrarum.gameactors.Pocketed import net.torvald.terrarum.gameactors.Pocketed
import net.torvald.terrarum.gameitem.EquipPosition
import net.torvald.terrarum.itemproperties.ItemCodex import net.torvald.terrarum.itemproperties.ItemCodex
/** /**

View File

@@ -5,7 +5,6 @@ import net.torvald.terrarum.Terrarum
import net.torvald.terrarum.gameactors.faction.Faction import net.torvald.terrarum.gameactors.faction.Faction
import net.torvald.terrarum.gamecontroller.EnumKeyFunc import net.torvald.terrarum.gamecontroller.EnumKeyFunc
import net.torvald.terrarum.gamecontroller.KeyMap import net.torvald.terrarum.gamecontroller.KeyMap
import net.torvald.terrarum.gameitem.EquipPosition
import net.torvald.terrarum.gameitem.InventoryItem import net.torvald.terrarum.gameitem.InventoryItem
import net.torvald.terrarum.realestate.RealEstateUtility import net.torvald.terrarum.realestate.RealEstateUtility
import org.dyn4j.geometry.Vector2 import org.dyn4j.geometry.Vector2
@@ -26,7 +25,7 @@ open class ActorHumanoid(birth: GameDate, death: GameDate? = null)
/** Must be set by PlayerFactory */ /** Must be set by PlayerFactory */
override var inventory: ActorInventory = ActorInventory() override var inventory: ActorInventory = ActorInventory()
override val itemEquipped = Array<InventoryItem?>(EquipPosition.INDEX_MAX + 1, { null }) override val itemEquipped = Array<InventoryItem?>(InventoryItem.EquipPosition.INDEX_MAX + 1, { null })
/** Must be set by PlayerFactory */ /** Must be set by PlayerFactory */
override var faction: HashSet<Faction> = HashSet() override var faction: HashSet<Faction> = HashSet()
@@ -137,6 +136,7 @@ open class ActorHumanoid(birth: GameDate, death: GameDate? = null)
private val nullItem = object : InventoryItem() { private val nullItem = object : InventoryItem() {
override val id: Int = 0 override val id: Int = 0
override val isUnique: Boolean = false
override var baseMass: Double = 0.0 override var baseMass: Double = 0.0
override var baseToolSize: Double? = null override var baseToolSize: Double? = null
override var category = "should_not_be_seen" override var category = "should_not_be_seen"
@@ -236,12 +236,12 @@ open class ActorHumanoid(birth: GameDate, death: GameDate? = null)
*/ */
// Left mouse // Left mouse
if (isGamer && isFuncDown(input, EnumKeyFunc.HAND_PRIMARY)) { if (isGamer && isFuncDown(input, EnumKeyFunc.HAND_PRIMARY)) {
(itemEquipped[EquipPosition.HAND_GRIP] ?: nullItem).primaryUse(gc, delta) (itemEquipped[InventoryItem.EquipPosition.HAND_GRIP] ?: nullItem).primaryUse(gc, delta)
} }
// Right mouse // Right mouse
if (isGamer && isFuncDown(input, EnumKeyFunc.HAND_SECONDARY)) { if (isGamer && isFuncDown(input, EnumKeyFunc.HAND_SECONDARY)) {
(itemEquipped[EquipPosition.HAND_GRIP] ?: nullItem).secondaryUse(gc, delta) (itemEquipped[InventoryItem.EquipPosition.HAND_GRIP] ?: nullItem).secondaryUse(gc, delta)
} }
/** /**

View File

@@ -4,7 +4,6 @@ import net.torvald.terrarum.gameactors.ActorHumanoid
import net.torvald.terrarum.gameactors.ai.AILuaAPI import net.torvald.terrarum.gameactors.ai.AILuaAPI
import net.torvald.terrarum.gameactors.ai.ActorAI import net.torvald.terrarum.gameactors.ai.ActorAI
import net.torvald.terrarum.gameactors.ai.LuaAIWrapper import net.torvald.terrarum.gameactors.ai.LuaAIWrapper
import net.torvald.terrarum.gameitem.EquipPosition
import net.torvald.terrarum.gameitem.InventoryItem import net.torvald.terrarum.gameitem.InventoryItem
import org.luaj.vm2.* import org.luaj.vm2.*
import org.luaj.vm2.compiler.LuaC import org.luaj.vm2.compiler.LuaC
@@ -42,7 +41,7 @@ open class HumanoidNPC(
// we're having InventoryItem data so that this class could be somewhat universal // we're having InventoryItem data so that this class could be somewhat universal
override var itemData: InventoryItem = object : InventoryItem() { override var itemData: InventoryItem = object : InventoryItem() {
override var id = referenceID override var id = referenceID
override val isUnique: Boolean = true
override var baseMass: Double override var baseMass: Double
get() = actorValue.getAsDouble(AVKey.BASEMASS)!! get() = actorValue.getAsDouble(AVKey.BASEMASS)!!
set(value) { actorValue[AVKey.BASEMASS] = value } set(value) { actorValue[AVKey.BASEMASS] = value }

View File

@@ -7,7 +7,6 @@ import com.google.gson.JsonObject
import net.torvald.terrarum.ActorValue import net.torvald.terrarum.ActorValue
import net.torvald.terrarum.gameactors.ActorHumanoid import net.torvald.terrarum.gameactors.ActorHumanoid
import net.torvald.terrarum.gameactors.faction.FactionFactory import net.torvald.terrarum.gameactors.faction.FactionFactory
import net.torvald.terrarum.gameitem.EquipPosition
import net.torvald.terrarum.itemproperties.ItemCodex import net.torvald.terrarum.itemproperties.ItemCodex
import net.torvald.terrarum.mapdrawer.FeaturesDrawer import net.torvald.terrarum.mapdrawer.FeaturesDrawer
import net.torvald.terrarum.to10bit import net.torvald.terrarum.to10bit

View File

@@ -12,9 +12,10 @@ import org.newdawn.slick.GameContainer
* *
* Created by minjaesong on 16-09-08. * Created by minjaesong on 16-09-08.
*/ */
@Deprecated("Use InventoryItem's ItemProp")
open abstract class DynamicItem(val baseItemID: Int?, newMass: Double? = null, newScale: Double? = null) open abstract class DynamicItem(val baseItemID: Int?, newMass: Double? = null, newScale: Double? = null)
: InventoryItem() { : InventoryItem() {
/*
/** /**
* Internal ID of an Item, Long * Internal ID of an Item, Long
* 0-4096: Tiles * 0-4096: Tiles
@@ -69,5 +70,5 @@ open abstract class DynamicItem(val baseItemID: Int?, newMass: Double? = null, n
else { else {
scale = newScale ?: ItemCodex[baseItemID].scale scale = newScale ?: ItemCodex[baseItemID].scale
} }
} }*/
} }

View File

@@ -0,0 +1,23 @@
package net.torvald.terrarum.gameitem
/**
* Created by minjaesong on 16-09-09.
*/
object IVKey {
const val ITEMTYPE = "itemtype" // "sword1h", "sword2h", "pick", "hammer", "tile", "wall", etc
const val UUID = "uuid" // some items need UUID to be stored
object ItemType {
const val BLOCK = "tile"
const val WALL = "wall"
// tools
const val PICK = "pick"
const val HAMMER= "hammer"
// weapons
const val SWORDJAB = "sword1h"
const val SWORDSWING = "sword2h"
// generic
const val ARTEFACT = "artefact" // or Key Items
}
}

View File

@@ -1,5 +1,6 @@
package net.torvald.terrarum.gameitem package net.torvald.terrarum.gameitem
import net.torvald.terrarum.ItemValue
import net.torvald.terrarum.itemproperties.Material import net.torvald.terrarum.itemproperties.Material
import net.torvald.terrarum.langpack.Lang import net.torvald.terrarum.langpack.Lang
import org.newdawn.slick.Color import org.newdawn.slick.Color
@@ -10,17 +11,25 @@ import org.newdawn.slick.GameContainer
*/ */
abstract class InventoryItem : Comparable<InventoryItem> { abstract class InventoryItem : Comparable<InventoryItem> {
/** /**
* Internal ID of an Item, Long * Internal ID of an Item,
* 0-4095: Tiles * 0-4095: Tiles
* 4096-32767: Static items * 4096-32767: Unique items (isUnique = true), brand-new tools
* 32768-16777215: Dynamic items * 32768-16777215: Dynamic items (e.g. tools with damage)
* >= 16777216: Actor RefID * >= 16777216: Actor RefID
*/ */
abstract val id: Int abstract val id: Int
/**
* e.g. Key Items (in a Pokémon sense), floppies
*/
abstract val isUnique: Boolean
/**
* OriginalName is always read from Language files.
*/
abstract protected val originalName: String abstract protected val originalName: String
private var newName: String = "SET THE NAME!!" private var newName: String = "I AM VITTUN PLACEHOLDER"
var name: String var name: String
set(value) { set(value) {
@@ -39,6 +48,8 @@ abstract class InventoryItem : Comparable<InventoryItem> {
abstract var category: String // "weapon", "tool", "armor", etc. (all smallcaps) abstract var category: String // "weapon", "tool", "armor", etc. (all smallcaps)
var itemProperties = ItemValue()
/** /**
* Where to equip the item * Where to equip the item
*/ */
@@ -140,31 +151,43 @@ abstract class InventoryItem : Comparable<InventoryItem> {
override fun compareTo(other: InventoryItem): Int = (this.id - other.id).sign() override fun compareTo(other: InventoryItem): Int = (this.id - other.id).sign()
fun Int.sign(): Int = if (this > 0) 1 else if (this < 0) -1 else 0 fun Int.sign(): Int = if (this > 0) 1 else if (this < 0) -1 else 0
}
object EquipPosition {
object EquipPosition { const val NULL = -1
const val NULL = -1
const val ARMOUR = 0
const val ARMOUR = 0 // you can add alias to address something like LEGGINGS, BREASTPLATE, RINGS, NECKLACES, etc.
// you can add alias to address something like LEGGINGS, BREASTPLATE, RINGS, NECKLACES, etc. const val BODY_BACK = 1 // wings, jetpacks, etc.
const val BODY_BACK = 1 // wings, jetpacks, etc. const val BODY_BUFF2 = 2
const val BODY_BUFF2 = 2 const val BODY_BUFF3 = 3
const val BODY_BUFF3 = 3 const val BODY_BUFF4 = 4
const val BODY_BUFF4 = 4 const val BODY_BUFF5 = 5
const val BODY_BUFF5 = 5 const val BODY_BUFF6 = 6
const val BODY_BUFF6 = 6 const val BODY_BUFF7 = 7
const val BODY_BUFF7 = 7 const val BODY_BUFF8 = 8
const val BODY_BUFF8 = 8
const val HAND_GRIP = 9
const val HAND_GRIP = 9 const val HAND_GAUNTLET = 10
const val HAND_GAUNTLET = 10 const val HAND_BUFF2 = 11
const val HAND_BUFF2 = 11 const val HAND_BUFF3 = 12
const val HAND_BUFF3 = 12 const val HAND_BUFF4 = 13
const val HAND_BUFF4 = 13
const val FOOTWEAR = 14
const val FOOTWEAR = 14
const val HEADGEAR = 15
const val HEADGEAR = 15
const val INDEX_MAX = 15
const val INDEX_MAX = 15 }
object Category {
const val WEAPON = "weapon"
const val TOOL = "tool"
const val ARMOUR = "armour"
const val GENERIC = "generic"
const val POTION = "potion"
const val MAGIC = "magic"
const val BLOCK = "block"
const val WALL = "wall"
const val MISC = "misc"
}
} }

View File

@@ -1,10 +0,0 @@
package net.torvald.terrarum.gameitem
/**
* Created by minjaesong on 16-09-09.
*/
object ItemInfoKey {
const val SCALE = "scale"
const val MASS = "mass"
const val UUID = "uuid"
}

View File

@@ -8,7 +8,7 @@ import net.torvald.terrarum.Terrarum
import net.torvald.terrarum.gameactors.ActorWithSprite import net.torvald.terrarum.gameactors.ActorWithSprite
import net.torvald.terrarum.gamecontroller.mouseTileX import net.torvald.terrarum.gamecontroller.mouseTileX
import net.torvald.terrarum.gamecontroller.mouseTileY import net.torvald.terrarum.gamecontroller.mouseTileY
import net.torvald.terrarum.gameitem.EquipPosition import net.torvald.terrarum.gameitem.IVKey
import net.torvald.terrarum.gameworld.GameWorld import net.torvald.terrarum.gameworld.GameWorld
import net.torvald.terrarum.tileproperties.TileCodex import net.torvald.terrarum.tileproperties.TileCodex
import org.newdawn.slick.GameContainer import org.newdawn.slick.GameContainer
@@ -34,16 +34,21 @@ object ItemCodex {
val ITEM_STATIC_MIN = ITEM_TILE_MAX + 1 // 4096 val ITEM_STATIC_MIN = ITEM_TILE_MAX + 1 // 4096
init { init {
// tile items // tile items (blocks and walls are the same thing basically)
for (i in 0..ITEM_TILE_MAX) { for (i in 0..ITEM_TILE_MAX) {
itemCodex[i] = object : InventoryItem() { itemCodex[i] = object : InventoryItem() {
override val id: Int = i override val id: Int = i
override val isUnique: Boolean = false
override var baseMass: Double = TileCodex[i].density / 1000.0 override var baseMass: Double = TileCodex[i].density / 1000.0
override var baseToolSize: Double? = null override var baseToolSize: Double? = null
override var equipPosition = EquipPosition.HAND_GRIP override var equipPosition = EquipPosition.HAND_GRIP
override var category = "block" override var category = "block"
override val originalName = TileCodex[i].nameKey override val originalName = TileCodex[i].nameKey
init {
itemProperties[IVKey.ITEMTYPE] = IVKey.ItemType.BLOCK
}
override fun primaryUse(gc: GameContainer, delta: Int) { override fun primaryUse(gc: GameContainer, delta: Int) {
// TODO base punch attack // TODO base punch attack
} }

View File

@@ -23,9 +23,9 @@ abstract class UIItem(var parentUI: UICanvas) { // do not replace parentUI to UI
protected val relativeMouseY: Int protected val relativeMouseY: Int
get() = (Terrarum.appgc.mouseY - (parentUI.handler?.posY ?: 0) - this.posY).roundInt() get() = (Terrarum.appgc.mouseY - (parentUI.handler?.posY ?: 0) - this.posY).roundInt()
val mouseUp: Boolean open val mouseUp: Boolean
get() = relativeMouseX in 0..width - 1 && relativeMouseY in 0..height - 1 get() = relativeMouseX in 0..width - 1 && relativeMouseY in 0..height - 1
val mousePushed: Boolean open val mousePushed: Boolean
get() = mouseUp && Terrarum.appgc.input.isMouseButtonDown(Terrarum.getConfigInt("mouseprimary")!!) get() = mouseUp && Terrarum.appgc.input.isMouseButtonDown(Terrarum.getConfigInt("mouseprimary")!!)
abstract fun update(gc: GameContainer, delta: Int) abstract fun update(gc: GameContainer, delta: Int)

View File

@@ -1,6 +1,8 @@
package net.torvald.terrarum.ui package net.torvald.terrarum.ui
import net.torvald.point.Point2d
import net.torvald.terrarum.* import net.torvald.terrarum.*
import net.torvald.terrarum.gameactors.Hitbox
import net.torvald.terrarum.langpack.Lang import net.torvald.terrarum.langpack.Lang
import org.newdawn.slick.Color import org.newdawn.slick.Color
import org.newdawn.slick.GameContainer import org.newdawn.slick.GameContainer
@@ -24,16 +26,18 @@ class UIItemTextButton(
val highlightCol: Color = Color(0x00f8ff), val highlightCol: Color = Color(0x00f8ff),
val highlightBackCol: Color = Color(0xb0b0b0), val highlightBackCol: Color = Color(0xb0b0b0),
val highlightBackBlendMode: String = BlendMode.MULTIPLY, val highlightBackBlendMode: String = BlendMode.MULTIPLY,
val inactiveCol: Color = UIItemTextButton.defaultInactiveCol val inactiveCol: Color = UIItemTextButton.defaultInactiveCol,
val preGapX: Int = 0,
val postGapX: Int = 0
) : UIItem(parentUI) { ) : UIItem(parentUI) {
companion object { companion object {
val font = Terrarum.fontGame!! val font = Terrarum.fontGame
val height = font.lineHeight * 2 val height = font.lineHeight * 2
val defaultInactiveCol: Color = Color(0xc8c8c8) val defaultInactiveCol: Color = Color(0xc8c8c8)
} }
private val label: String val label: String
get() = if (readFromLang) Lang[labelText] else labelText get() = if (readFromLang) Lang[labelText] else labelText
@@ -70,7 +74,11 @@ class UIItemTextButton(
else if (mouseOver) activeCol else if (mouseOver) activeCol
else inactiveCol else inactiveCol
g.drawString(label, posX.toFloat() + (width.minus(textW).div(2)), posY.toFloat() + height / 4) g.drawString(
label,
posX.toFloat() + width.minus(textW).div(2) + (preGapX - postGapX).div(2),
posY.toFloat() + height / 4
)
} }
override fun keyPressed(key: Int, c: Char) { override fun keyPressed(key: Int, c: Char) {

View File

@@ -4,9 +4,11 @@ import net.torvald.terrarum.BlendMode
import net.torvald.terrarum.gameactors.roundInt import net.torvald.terrarum.gameactors.roundInt
import net.torvald.terrarum.langpack.Lang import net.torvald.terrarum.langpack.Lang
import net.torvald.terrarum.Millisec import net.torvald.terrarum.Millisec
import net.torvald.terrarum.Terrarum
import org.newdawn.slick.Color import org.newdawn.slick.Color
import org.newdawn.slick.GameContainer import org.newdawn.slick.GameContainer
import org.newdawn.slick.Graphics import org.newdawn.slick.Graphics
import org.newdawn.slick.SpriteSheet
/** /**
* Created by SKYHi14 on 2017-03-13. * Created by SKYHi14 on 2017-03-13.
@@ -17,6 +19,12 @@ class UIItemTextButtonList(
override val width: Int, override val width: Int,
override val height: Int, override val height: Int,
val readFromLang: Boolean = false, val readFromLang: Boolean = false,
val defaultSelection: Int = 0,
// icons
val textAreaWidth: Int,
val iconSpriteSheet: SpriteSheet? = null,
val iconSpriteSheetIndices: IntArray? = null,
// copied directly from UIItemTextButton // copied directly from UIItemTextButton
val activeCol: Color = Color.white, val activeCol: Color = Color.white,
@@ -31,6 +39,15 @@ class UIItemTextButtonList(
val kinematic: Boolean = false // more "kinetic" movement of selector val kinematic: Boolean = false // more "kinetic" movement of selector
) : UIItem(parentUI) { ) : UIItem(parentUI) {
val iconToTextGap = 20
val iconCellWidth = (iconSpriteSheet?.width ?: -iconToTextGap) / (iconSpriteSheet?.horizontalCount ?: 1)
val iconCellHeight = (iconSpriteSheet?.height ?: 0) / (iconSpriteSheet?.verticalCount ?: 1)
// zero if iconSpriteSheet is null
val iconsWithGap: Int = iconToTextGap + iconCellWidth
val pregap = (width - textAreaWidth - iconsWithGap) / 2 + iconsWithGap
val postgap = (width - textAreaWidth - iconsWithGap) / 2
val buttons = labelsList.mapIndexed { index, s -> val buttons = labelsList.mapIndexed { index, s ->
val height = this.height - UIItemTextButton.height val height = this.height - UIItemTextButton.height
if (!kinematic) { if (!kinematic) {
@@ -39,14 +56,16 @@ class UIItemTextButtonList(
posX = 0, posX = 0,
posY = (height / labelsList.size.minus(1).toFloat() * index).roundInt(), posY = (height / labelsList.size.minus(1).toFloat() * index).roundInt(),
width = width, width = width,
readFromLang = true, readFromLang = readFromLang,
activeCol = activeCol, activeCol = activeCol,
activeBackCol = activeBackCol, activeBackCol = activeBackCol,
activeBackBlendMode = activeBackBlendMode, activeBackBlendMode = activeBackBlendMode,
highlightCol = highlightCol, highlightCol = highlightCol,
highlightBackCol = highlightBackCol, highlightBackCol = highlightBackCol,
highlightBackBlendMode = highlightBackBlendMode, highlightBackBlendMode = highlightBackBlendMode,
inactiveCol = inactiveCol inactiveCol = inactiveCol,
preGapX = pregap,
postGapX = postgap
) )
} }
else { else {
@@ -55,10 +74,12 @@ class UIItemTextButtonList(
posX = 0, posX = 0,
posY = (height / labelsList.size.minus(1).toFloat() * index).roundInt(), posY = (height / labelsList.size.minus(1).toFloat() * index).roundInt(),
width = width, width = width,
readFromLang = true, readFromLang = readFromLang,
activeBackCol = Color(0,0,0,0), activeBackCol = Color(0,0,0,0),
activeBackBlendMode = BlendMode.NORMAL, activeBackBlendMode = BlendMode.NORMAL,
highlightBackCol = Color(0,0,0,0) highlightBackCol = Color(0,0,0,0),
preGapX = pregap,
postGapX = postgap
) )
} }
} }
@@ -66,8 +87,10 @@ class UIItemTextButtonList(
override var posX = 0 override var posX = 0
override var posY = 0 override var posY = 0
var selected = labelsList.size - 1 // default to "All" var selectedIndex = defaultSelection
private var highlightY = buttons[selected].posY.toDouble() val selectedButton: UIItemTextButton
get() = buttons[selectedIndex]
private var highlightY = buttons[selectedIndex].posY.toDouble()
private val highlighterMoveDuration: Millisec = 100 private val highlighterMoveDuration: Millisec = 100
private var highlighterMoveTimer: Millisec = 0 private var highlighterMoveTimer: Millisec = 0
private var highlighterMoving = false private var highlighterMoving = false
@@ -97,19 +120,19 @@ class UIItemTextButtonList(
btn.update(gc, delta) btn.update(gc, delta)
if (btn.mousePushed && index != selected) { if (btn.mousePushed && index != selectedIndex) {
if (kinematic) { if (kinematic) {
highlighterYStart = buttons[selected].posY.toDouble() highlighterYStart = buttons[selectedIndex].posY.toDouble()
selected = index selectedIndex = index
highlighterMoving = true highlighterMoving = true
highlighterYEnd = buttons[selected].posY.toDouble() highlighterYEnd = buttons[selectedIndex].posY.toDouble()
} }
else { else {
selected = index selectedIndex = index
highlightY = buttons[selected].posY.toDouble() highlightY = buttons[selectedIndex].posY.toDouble()
} }
} }
btn.highlighted = (index == selected) // forcibly highlight if this.highlighted != null btn.highlighted = (index == selectedIndex) // forcibly highlight if this.highlighted != null
} }
} }
@@ -123,6 +146,17 @@ class UIItemTextButtonList(
g.fillRect(posX.toFloat(), highlightY.toFloat(), width.toFloat(), UIItemTextButton.height.toFloat()) g.fillRect(posX.toFloat(), highlightY.toFloat(), width.toFloat(), UIItemTextButton.height.toFloat())
buttons.forEach { it.render(gc, g) } buttons.forEach { it.render(gc, g) }
if (iconSpriteSheet != null) {
val iconY = (buttons[1].height - iconCellHeight) / 2
iconSpriteSheetIndices!!.forEachIndexed { counter, imageIndex ->
iconSpriteSheet.getSubImage(imageIndex, 0).draw(
32f,
buttons[counter].posY + iconY.toFloat()
)
}
}
} }
override fun keyPressed(key: Int, c: Char) { override fun keyPressed(key: Int, c: Char) {

View File

@@ -36,7 +36,7 @@ class UIVitalMetre(
private val theta = 33f private val theta = 33f
private val halfTheta = theta / 2f private val halfTheta = theta / 2f
private val backColor: Color; get() = color?.darkerLab(0.3f) ?: Color.black private val backColor: Color; get() = color?.darkerLab(0.4f) ?: Color.black
override fun update(gc: GameContainer, delta: Int) { override fun update(gc: GameContainer, delta: Int) {