mirror of
https://github.com/curioustorvald/Terrarum.git
synced 2026-03-07 20:31:51 +09:00
FIX: quickbar opacity bug, Notification won't display, remaned majuscule to fullwidth, keyboard layouts for control helper
Former-commit-id: 99c51499131a7cbae1b7345c15d804bd5340e7b6 Former-commit-id: 1326b69cb920d3590fe2cbe33013c85c9eeb1191
This commit is contained in:
@@ -16,7 +16,7 @@ object CSVFetcher {
|
||||
private var csvString: StringBuffer? = null
|
||||
|
||||
@Throws(IOException::class)
|
||||
fun readCSV(csvFilePath: String): List<CSVRecord> {
|
||||
operator fun invoke(csvFilePath: String): List<CSVRecord> {
|
||||
csvString = StringBuffer() // reset buffer every time it called
|
||||
readCSVasString(csvFilePath)
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ object JsonFetcher {
|
||||
private var jsonString: StringBuffer? = null
|
||||
|
||||
@Throws(IOException::class)
|
||||
fun readJson(jsonFilePath: String): JsonObject {
|
||||
operator fun invoke(jsonFilePath: String): JsonObject {
|
||||
jsonString = StringBuffer() // reset buffer every time it called
|
||||
readJsonFileAsString(jsonFilePath)
|
||||
|
||||
@@ -31,7 +31,7 @@ object JsonFetcher {
|
||||
}
|
||||
|
||||
@Throws(IOException::class)
|
||||
fun readJson(jsonFile: File): JsonObject {
|
||||
operator fun invoke(jsonFile: File): JsonObject {
|
||||
jsonString = StringBuffer() // reset buffer every time it called
|
||||
readJsonFileAsString(jsonFile.canonicalPath)
|
||||
|
||||
|
||||
@@ -5,18 +5,19 @@ import java.util.function.Consumer
|
||||
|
||||
/**
|
||||
* Simple ArrayList wrapper that acts as history keeper. You can append any data but cannot delete.
|
||||
*
|
||||
* Created by minjaesong on 16-07-13.
|
||||
*/
|
||||
class HistoryArray<T>(val historyMax: Int) {
|
||||
|
||||
val history = ArrayList<T?>(Math.min(historyMax, 256)) // 256: arbitrary-set upper bound
|
||||
val history = ArrayList<T?>(Math.min(historyMax, 256)) // 256: arbitrary set upper bound
|
||||
|
||||
fun add(value: T) {
|
||||
if (history.size == 0) {
|
||||
history.add(value)
|
||||
return
|
||||
}
|
||||
// push existing values to back 1 index
|
||||
// push existing values to an index
|
||||
else {
|
||||
for (i in history.size - 1 downTo 0) {
|
||||
// if history.size is smaller than historyMax, make room by appending
|
||||
|
||||
@@ -14,13 +14,13 @@ constructor() : GameFontBase() {
|
||||
GameFontBase.hangulSheet = SpriteSheet(
|
||||
"./res/graphics/fonts/han_johab.png", GameFontBase.W_CJK, GameFontBase.H_HANGUL)
|
||||
GameFontBase.asciiSheet = SpriteSheet(
|
||||
"./res/graphics/fonts/ascii_majuscule.png", GameFontBase.W_LATIN_WIDE, GameFontBase.H)
|
||||
"./res/graphics/fonts/ascii_fullwidth.png", GameFontBase.W_LATIN_WIDE, GameFontBase.H)
|
||||
GameFontBase.asciiSheetEF = SpriteSheet(
|
||||
"./res/graphics/fonts/ascii_special_ef.png", GameFontBase.W_LATIN_NARROW, GameFontBase.H)
|
||||
GameFontBase.runicSheet = SpriteSheet(
|
||||
"./res/graphics/fonts/futhark.png", GameFontBase.W_LATIN_WIDE, GameFontBase.H)
|
||||
GameFontBase.extASheet = SpriteSheet(
|
||||
"./res/graphics/fonts/LatinExtA_majuscule.png", GameFontBase.W_LATIN_WIDE, GameFontBase.H)
|
||||
"./res/graphics/fonts/LatinExtA_fullwidth.png", GameFontBase.W_LATIN_WIDE, GameFontBase.H)
|
||||
GameFontBase.extASheetEF = SpriteSheet(
|
||||
"./res/graphics/fonts/LatinExtA_ef.png", GameFontBase.W_LATIN_NARROW, GameFontBase.H)
|
||||
GameFontBase.kanaSheet = SpriteSheet(
|
||||
@@ -35,7 +35,7 @@ constructor() : GameFontBase() {
|
||||
, W_UNIHAN, H_UNIHAN
|
||||
);*/
|
||||
GameFontBase.cyrilic = SpriteSheet(
|
||||
"./res/graphics/fonts/cyrilic_majuscule.png", GameFontBase.W_LATIN_WIDE, GameFontBase.H)
|
||||
"./res/graphics/fonts/cyrilic_fullwidth.png", GameFontBase.W_LATIN_WIDE, GameFontBase.H)
|
||||
GameFontBase.cyrilicEF = SpriteSheet(
|
||||
"./res/graphics/fonts/cyrilic_ef.png", GameFontBase.W_LATIN_NARROW, GameFontBase.H)
|
||||
GameFontBase.fullwidthForms = SpriteSheet(
|
||||
@@ -47,11 +47,11 @@ constructor() : GameFontBase() {
|
||||
GameFontBase.wenQuanYi_2 = SpriteSheet(
|
||||
"./res/graphics/fonts/wenquanyi_11pt_part2.png", 16, 18, 2)
|
||||
GameFontBase.greekSheet = SpriteSheet(
|
||||
"./res/graphics/fonts/greek_majuscule.png", GameFontBase.W_LATIN_WIDE, GameFontBase.H)
|
||||
"./res/graphics/fonts/greek_fullwidth.png", GameFontBase.W_LATIN_WIDE, GameFontBase.H)
|
||||
GameFontBase.greekSheetEF = SpriteSheet(
|
||||
"./res/graphics/fonts/greek_ef.png", GameFontBase.W_LATIN_NARROW, GameFontBase.H)
|
||||
GameFontBase.romanianSheet = SpriteSheet(
|
||||
"./res/graphics/fonts/romana_majuscule.png", GameFontBase.W_LATIN_WIDE, GameFontBase.H)
|
||||
"./res/graphics/fonts/romana_fullwidth.png", GameFontBase.W_LATIN_WIDE, GameFontBase.H)
|
||||
GameFontBase.romanianSheetEF = SpriteSheet(
|
||||
"./res/graphics/fonts/romana_ef.png", GameFontBase.W_LATIN_NARROW, GameFontBase.H)
|
||||
GameFontBase.thaiSheet = SpriteSheet(
|
||||
|
||||
@@ -140,7 +140,7 @@ constructor() {
|
||||
flippedImage.startUse()
|
||||
flippedImage.drawEmbedded(
|
||||
Math.round(posX * Terrarum.ingame.screenZoom).toFloat(),
|
||||
Math.round(posY * Terrarum.ingame.screenZoom).toFloat(),
|
||||
FastMath.floor(posY * Terrarum.ingame.screenZoom).toFloat(),
|
||||
FastMath.floor(width * scale).toFloat(),
|
||||
FastMath.floor(height * scale).toFloat()
|
||||
)
|
||||
|
||||
@@ -48,7 +48,7 @@ object DefaultConfig {
|
||||
jsonObject.addProperty("keygamemenu", Key.TAB)
|
||||
jsonObject.addProperty("keyquicksel", Key.CAPS_LOCK) // pie menu
|
||||
val keyquickselalt = JsonArray(); keyquickselalt.add(Key.BACKSPACE); keyquickselalt.add(Key.L_COMMAND); keyquickselalt.add(Key.L_CONTROL)
|
||||
// some pro typers assign CapsLock to Backspace, LControl, or LCommand (Mac). Honestly, Control (Command for mac) and CapsLock must swap their places!
|
||||
// Colemak, Workman and some typers use CapsLock as Backspace, Apple-JIS and HHKB has Control in place of CapsLock and often re-assigned to Command
|
||||
jsonObject.add("keyquickselalt", keyquickselalt)
|
||||
|
||||
jsonObject.addProperty("keyjump", Key.SPACE)
|
||||
|
||||
@@ -128,9 +128,9 @@ constructor() : BasicGameState() {
|
||||
|
||||
// init notifier
|
||||
notifier = UIHandler(Notification())
|
||||
notifier.UI.handler = notifier
|
||||
notifier.setPosition(
|
||||
(Terrarum.WIDTH - notifier.UI.width) / 2, Terrarum.HEIGHT - notifier.UI.height)
|
||||
notifier.isVisible = true
|
||||
|
||||
// set smooth lighting as in config
|
||||
KeyToggler.forceSet(KEY_LIGHTMAP_SMOOTH, Terrarum.getConfigBoolean("smoothlighting"))
|
||||
@@ -358,8 +358,7 @@ constructor() : BasicGameState() {
|
||||
|
||||
/** Send message to notifier UI and toggle the UI as opened. */
|
||||
fun sendNotification(msg: Array<String>) {
|
||||
(notifier.UI as Notification).sendNotification(Terrarum.appgc, UPDATE_DELTA, msg)
|
||||
notifier.setAsOpen()
|
||||
(notifier.UI as Notification).sendNotification(msg)
|
||||
}
|
||||
|
||||
fun wakeDormantActors() {
|
||||
|
||||
@@ -41,7 +41,6 @@ class StateMonitorCheck : BasicGameState() {
|
||||
override var width = Terrarum.WIDTH
|
||||
override var height = Terrarum.HEIGHT
|
||||
override var openCloseTime = 150
|
||||
override var openCloseTimer: Int = 0
|
||||
|
||||
override var handler: UIHandler? = null
|
||||
|
||||
|
||||
@@ -254,7 +254,7 @@ constructor(gamename: String) : StateBasedGame(gamename) {
|
||||
private fun readConfigJson(): Boolean {
|
||||
try {
|
||||
// read from disk and build config from it
|
||||
val jsonObject = JsonFetcher.readJson(configDir)
|
||||
val jsonObject = JsonFetcher(configDir)
|
||||
|
||||
// make config
|
||||
jsonObject.entrySet().forEach { entry -> gameConfig[entry.key] = entry.value }
|
||||
|
||||
@@ -404,6 +404,7 @@ open class ActorWithBody : Actor(), Visible {
|
||||
grounded = true
|
||||
}
|
||||
else if (isTouchingSide(nextHitbox, COLLIDING_BOTTOM) && !isColliding(nextHitbox)) { // actor hit something on its bottom
|
||||
hitAndReflectY()
|
||||
grounded = true
|
||||
}
|
||||
else { // the actor is not grounded at all
|
||||
@@ -751,11 +752,14 @@ open class ActorWithBody : Actor(), Visible {
|
||||
internal val bodyFriction: Int
|
||||
get() {
|
||||
var friction = 0
|
||||
val frictionCalcHitbox = if (isWalking)
|
||||
Hitbox(nextHitbox.posX + 1.0, nextHitbox.posY + 1.0,
|
||||
nextHitbox.width - 2.0, nextHitbox.height - 2.0)
|
||||
else
|
||||
nextHitbox.clone()
|
||||
val frictionCalcHitbox =
|
||||
if (!isWalking)
|
||||
Hitbox(nextHitbox.posX, nextHitbox.posY,
|
||||
nextHitbox.width + 2.0, nextHitbox.height + 2.0)
|
||||
// when not walking, enlarge the hitbox for calculation so that
|
||||
// feet tiles are to be taken into calculation
|
||||
else
|
||||
nextHitbox.clone()
|
||||
|
||||
// take highest value
|
||||
val tilePosXStart = (frictionCalcHitbox.posX / TSIZE).floorInt()
|
||||
|
||||
@@ -24,7 +24,7 @@ object CreatureRawInjector {
|
||||
*/
|
||||
@Throws(IOException::class, SlickException::class)
|
||||
fun inject(actorValueRef: ActorValue, jsonFileName: String) {
|
||||
val jsonObj = JsonFetcher.readJson(JSONPATH + jsonFileName)
|
||||
val jsonObj = JsonFetcher(JSONPATH + jsonFileName)
|
||||
|
||||
val elementsString = arrayOf(AVKey.RACENAME, AVKey.RACENAMEPLURAL)
|
||||
val elementsDouble = arrayOf(AVKey.BASEHEIGHT, AVKey.BASEMASS, AVKey.ACCEL, AVKey.TOOLSIZE, AVKey.ENCUMBRANCE)
|
||||
|
||||
@@ -277,8 +277,6 @@ class Player : ActorWithBody(), Controllable, Pocketed, Factionable, Luminous, L
|
||||
jumpAcc = -pwr * timedJumpCharge * JUMP_ACCELERATION_MOD * Math.sqrt(scale) // positive value
|
||||
|
||||
applyForce(Vector2(0.0, jumpAcc))
|
||||
|
||||
if (jumpAcc != 0.0) println(jumpAcc)
|
||||
}
|
||||
|
||||
// for mob ai:
|
||||
|
||||
@@ -17,7 +17,7 @@ object FactionFactory {
|
||||
*/
|
||||
@Throws(IOException::class)
|
||||
fun create(filename: String): Faction {
|
||||
val jsonObj = JsonFetcher.readJson(JSONPATH + filename)
|
||||
val jsonObj = JsonFetcher(JSONPATH + filename)
|
||||
val factionObj = Faction(jsonObj.get("factionname").asString)
|
||||
|
||||
jsonObj.get("factionamicable").asJsonArray.forEach { s -> factionObj.addFactionAmicable(s.asString) }
|
||||
|
||||
81
src/net/torvald/terrarum/gamecontroller/KeyLayout.kt
Normal file
81
src/net/torvald/terrarum/gamecontroller/KeyLayout.kt
Normal file
@@ -0,0 +1,81 @@
|
||||
package net.torvald.terrarum.gamecontroller
|
||||
|
||||
import net.torvald.JsonFetcher
|
||||
import java.util.*
|
||||
|
||||
/**
|
||||
* Created by minjaesong on 16-07-28.
|
||||
*/
|
||||
object KeyLayout {
|
||||
|
||||
/**
|
||||
* HashMap<identifier: String, KeyLayoutClass>
|
||||
*/
|
||||
val layouts: HashMap<String, KeyLayoutClass>
|
||||
|
||||
init {
|
||||
layouts = HashMap<String, KeyLayoutClass>()
|
||||
|
||||
val json = JsonFetcher("./res/keylayout.json")
|
||||
json.entrySet().forEach { it ->
|
||||
layouts.put(
|
||||
it.key,
|
||||
KeyLayoutClass(
|
||||
it.value.asJsonObject.get("layout").asString,
|
||||
it.value.asJsonObject.get("name").asString,
|
||||
it.value.asJsonObject.get("capslock").asString
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
class KeyLayoutClass(layoutString: String, val layoutName: String, capsMode: String) {
|
||||
val disposition = intArrayOf(
|
||||
// alphanumeric
|
||||
2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,
|
||||
16,17,18,19,20,21,22,23,24,25,26,27,
|
||||
30,31,32,33,34,35,36,37,38,39,40,
|
||||
44,45,46,47,48,49,50,51,52,53,
|
||||
// control keys
|
||||
14, // back
|
||||
15, // tab
|
||||
58, 28, // capslock, return/enter
|
||||
42, // lshift
|
||||
29, 57 // lcontrol, space
|
||||
)
|
||||
val engraving = ArrayList<String>(disposition.size)
|
||||
|
||||
init {
|
||||
/* ================== *
|
||||
* parse layoutString *
|
||||
* ================== */
|
||||
// zero-fill engraving
|
||||
for (i in 1..disposition.size) engraving.add("")
|
||||
|
||||
// Backspace
|
||||
engraving[disposition.indexOf(14)] = "BACK"
|
||||
// Tab
|
||||
engraving[disposition.indexOf(15)] = "TAB"
|
||||
// Capslock
|
||||
engraving[disposition.indexOf(58)] = "CAPS"
|
||||
// Enter
|
||||
engraving[disposition.indexOf(28)] = "ENTER"
|
||||
// LShift
|
||||
engraving[disposition.indexOf(42)] = "SHIFT"
|
||||
// Control
|
||||
engraving[disposition.indexOf(29)] = "CTRL"
|
||||
// Space
|
||||
engraving[disposition.indexOf(57)] = "SPACE"
|
||||
|
||||
// alphanumeric
|
||||
for (i in 0..layoutString.length - 1) {
|
||||
engraving[disposition.indexOf(i)] = layoutString[i].toString()
|
||||
}
|
||||
}
|
||||
|
||||
fun codeToLabel(code: Int) = engraving[disposition.indexOf(code)]
|
||||
|
||||
fun labelToCode(char: Char) = disposition[engraving.indexOf(char.toUpperCase().toString())]
|
||||
}
|
||||
@@ -55,7 +55,7 @@ object Lang {
|
||||
for (lang in languageList) {
|
||||
// load polyglot first
|
||||
val polyglotFile = File("$PATH_TO_LANG$lang/$PREFIX_POLYGLOT$lang.json")
|
||||
val json = JsonFetcher.readJson(polyglotFile)
|
||||
val json = JsonFetcher(polyglotFile)
|
||||
/*
|
||||
* Polyglot JSON structure is:
|
||||
*
|
||||
@@ -92,7 +92,7 @@ object Lang {
|
||||
|
||||
// --> put json entries in langpack
|
||||
for (langFile in langFileList) {
|
||||
val json = JsonFetcher.readJson(langFile)
|
||||
val json = JsonFetcher(langFile)
|
||||
/*
|
||||
* Terrarum langpack JSON structure is:
|
||||
*
|
||||
|
||||
@@ -64,6 +64,8 @@ object MapCamera {
|
||||
*/
|
||||
val TILES_CONNECT_SELF = arrayOf(
|
||||
TileNameCode.ICE_MAGICAL
|
||||
, TileNameCode.GLASS_CRUDE
|
||||
, TileNameCode.GLASS_CLEAN
|
||||
, TileNameCode.ILLUMINATOR_BLACK
|
||||
, TileNameCode.ILLUMINATOR_BLUE
|
||||
, TileNameCode.ILLUMINATOR_BROWN
|
||||
|
||||
@@ -56,6 +56,9 @@ object TileNameCode {
|
||||
val ICE_NATURAL = TilePropCodex.idDamageToIndex(9, 2)
|
||||
val ICE_MAGICAL = TilePropCodex.idDamageToIndex(9, 3)
|
||||
|
||||
val GLASS_CRUDE = TilePropCodex.idDamageToIndex(9, 4)
|
||||
val GLASS_CLEAN = TilePropCodex.idDamageToIndex(9, 5)
|
||||
|
||||
val PLATFORM_STONE = TilePropCodex.idDamageToIndex(10, 0)
|
||||
val PLATFORM_WOODEN = TilePropCodex.idDamageToIndex(10, 1)
|
||||
val PLATFORM_EBONY = TilePropCodex.idDamageToIndex(10, 2)
|
||||
|
||||
@@ -29,7 +29,7 @@ object TilePropCodex {
|
||||
|
||||
try {
|
||||
// todo verify CSV using pre-calculated SHA256 hash
|
||||
val records = CSVFetcher.readCSV(CSV_PATH)
|
||||
val records = CSVFetcher(CSV_PATH)
|
||||
|
||||
println("[TilePropCodex] Building tile properties table")
|
||||
|
||||
|
||||
@@ -38,6 +38,8 @@
|
||||
"9"; "1";"TILE_ICE_FRAGILE" ; "13644813"; "1"; "930"; "0"; "1"; "0"; "0"; "9"; "1"; "0"; "0";"16"
|
||||
"9"; "2";"TILE_ICE_NATURAL" ; "27289626"; "25"; "930"; "0"; "1"; "1"; "0"; "9"; "2"; "0"; "0"; "8"
|
||||
"9"; "3";"TILE_ICE_CLEAR_MAGICAL" ; "33587232"; "25";"3720"; "0"; "1"; "1"; "19955770"; "9"; "3"; "0"; "0"; "8"
|
||||
"9"; "4";"TILE_GLASS_CRUDE" ; "3146755"; "1";"2500"; "0"; "1"; "1"; "0"; "9"; "4"; "0"; "0";"16"
|
||||
"9"; "5";"TILE_GLASS_CLEAN" ; "1049601"; "1";"2203"; "0"; "1"; "1"; "0"; "9"; "5"; "0"; "0";"16"
|
||||
"10"; "0";"TILE_PLATFORM_STONE" ; "8396808"; "1"; "N/A"; "0"; "0"; "0"; "0"; "10"; "0"; "0"; "0";"16"
|
||||
"10"; "1";"TILE_PLATFORM_WOODEN" ; "8396808"; "1"; "N/A"; "0"; "0"; "0"; "0"; "10"; "1"; "0"; "0";"16"
|
||||
"10"; "2";"TILE_PLATFORM_EBONY" ; "8396808"; "1"; "N/A"; "0"; "0"; "0"; "0"; "10"; "2"; "0"; "0";"16"
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 1 and column 18.
|
@@ -25,7 +25,6 @@ class BasicDebugInfoWindow : UICanvas {
|
||||
override var height: Int = Terrarum.HEIGHT
|
||||
|
||||
override var openCloseTime: Int = 0
|
||||
override var openCloseTimer: Int = 0
|
||||
|
||||
override var handler: UIHandler? = null
|
||||
|
||||
|
||||
@@ -34,7 +34,6 @@ class ConsoleWindow : UICanvas, KeyboardControlled {
|
||||
override var height: Int = LINE_HEIGHT * (MESSAGES_DISPLAY_COUNT + 1)
|
||||
|
||||
override var openCloseTime: Int = 0
|
||||
override var openCloseTimer: Int = 0
|
||||
|
||||
private var drawOffX: Float = 0f
|
||||
private var drawOffY: Float = -height.toFloat()
|
||||
|
||||
@@ -27,13 +27,8 @@ constructor(override var width: Int, isBlackVariant: Boolean) : UICanvas {
|
||||
|
||||
override var openCloseTime: Int = OPEN_CLOSE_TIME
|
||||
|
||||
internal var opacity = 0f
|
||||
override var openCloseTimer = 0
|
||||
|
||||
override var handler: UIHandler? = null
|
||||
|
||||
private lateinit var uidrawCanvas: Image // render all the images and fonts here; will be faded
|
||||
|
||||
init {
|
||||
if (!isBlackVariant) {
|
||||
segmentLeft = Image("./res/graphics/gui/message_twoline_white_left.png");
|
||||
@@ -49,7 +44,6 @@ constructor(override var width: Int, isBlackVariant: Boolean) : UICanvas {
|
||||
height = segmentLeft!!.height
|
||||
messageWindowRadius = segmentLeft!!.width
|
||||
messagesList = arrayOf("", "")
|
||||
uidrawCanvas = Image(FastMath.nearestPowerOfTwo(width), FastMath.nearestPowerOfTwo(height))
|
||||
}
|
||||
|
||||
fun setMessage(messagesList: Array<String>) {
|
||||
@@ -61,25 +55,21 @@ constructor(override var width: Int, isBlackVariant: Boolean) : UICanvas {
|
||||
}
|
||||
|
||||
override fun render(gc: GameContainer, g: Graphics) {
|
||||
val canvasG = uidrawCanvas.graphics
|
||||
|
||||
setBlendDisable()
|
||||
drawSegments(canvasG)
|
||||
canvasG.setDrawMode(Graphics.MODE_ALPHA_MAP)
|
||||
drawSegments(canvasG)
|
||||
|
||||
canvasG.font = uiFont
|
||||
drawSegments(g)
|
||||
g.setDrawMode(Graphics.MODE_ALPHA_MAP)
|
||||
drawSegments(g)
|
||||
|
||||
canvasG.setDrawMode(Graphics.MODE_NORMAL)
|
||||
g.font = uiFont
|
||||
|
||||
g.setDrawMode(Graphics.MODE_NORMAL)
|
||||
for (i in 0..Math.min(messagesList.size, MESSAGES_DISPLAY) - 1) {
|
||||
canvasG.color = fontCol
|
||||
canvasG.drawString(messagesList[i], (messageWindowRadius + 4).toFloat(), (messageWindowRadius + GLYPH_HEIGHT * i).toFloat())
|
||||
g.color = fontCol
|
||||
g.drawString(messagesList[i], (messageWindowRadius + 4).toFloat(), (messageWindowRadius + GLYPH_HEIGHT * i).toFloat())
|
||||
}
|
||||
|
||||
setBlendNormal()
|
||||
g.drawImage(uidrawCanvas, 0f, 0f, Color(1f,1f,1f,opacity))
|
||||
|
||||
canvasG.clear()
|
||||
}
|
||||
|
||||
override fun processInput(input: Input) {
|
||||
@@ -87,27 +77,15 @@ constructor(override var width: Int, isBlackVariant: Boolean) : UICanvas {
|
||||
}
|
||||
|
||||
override fun doOpening(gc: GameContainer, delta: Int) {
|
||||
openCloseTimer += delta
|
||||
opacity = FastMath.interpolateLinear(openCloseTimer.toFloat() / openCloseTime.toFloat(),
|
||||
0f, 1f
|
||||
)
|
||||
}
|
||||
|
||||
override fun doClosing(gc: GameContainer, delta: Int) {
|
||||
openCloseTimer += delta
|
||||
opacity = FastMath.interpolateLinear(openCloseTimer.toFloat() / openCloseTime.toFloat(),
|
||||
1f, 0f
|
||||
)
|
||||
}
|
||||
|
||||
override fun endOpening(gc: GameContainer, delta: Int) {
|
||||
opacity = 1f
|
||||
openCloseTimer = 0
|
||||
}
|
||||
|
||||
override fun endClosing(gc: GameContainer, delta: Int) {
|
||||
opacity = 0f
|
||||
openCloseTimer = 0
|
||||
}
|
||||
|
||||
private fun drawSegments(g: Graphics) {
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package net.torvald.terrarum.ui
|
||||
|
||||
import com.jme3.math.FastMath
|
||||
import net.torvald.terrarum.Terrarum
|
||||
import org.newdawn.slick.GameContainer
|
||||
import org.newdawn.slick.Graphics
|
||||
@@ -12,78 +13,68 @@ import org.newdawn.slick.SlickException
|
||||
class Notification @Throws(SlickException::class)
|
||||
constructor() : UICanvas {
|
||||
|
||||
override var width: Int = 0
|
||||
override var height: Int = 0
|
||||
internal var visibleTime: Int
|
||||
override var openCloseTimer = 0
|
||||
private val SHOWUP_MAX = 15000
|
||||
|
||||
override var width: Int = 500
|
||||
|
||||
internal var msgUI = MessageWindow(width, true)
|
||||
|
||||
override var height: Int = msgUI.height
|
||||
private val visibleTime = Math.min(
|
||||
Terrarum.getConfigInt("notificationshowuptime"),
|
||||
SHOWUP_MAX
|
||||
)
|
||||
private var displayTimer = 0
|
||||
|
||||
internal var isShowing = false
|
||||
internal var message: Array<String> = Array(MessageWindow.MESSAGES_DISPLAY, { i -> ""})
|
||||
|
||||
internal var msgUI: MessageWindow
|
||||
|
||||
override var openCloseTime: Int = MessageWindow.OPEN_CLOSE_TIME
|
||||
|
||||
override var handler: UIHandler? = null
|
||||
|
||||
private val SHOWUP_MAX = 15000
|
||||
|
||||
init {
|
||||
width = 500
|
||||
msgUI = MessageWindow(width, true)
|
||||
height = msgUI.height
|
||||
visibleTime = Math.min(
|
||||
Terrarum.getConfigInt("notificationshowuptime"),
|
||||
SHOWUP_MAX
|
||||
)
|
||||
}
|
||||
|
||||
override fun update(gc: GameContainer, delta: Int) {
|
||||
if (openCloseTimer >= visibleTime && isShowing) {
|
||||
// invoke closing mode
|
||||
doClosing(gc, delta)
|
||||
// check if msgUI is fully fade out
|
||||
if (msgUI.opacity <= 0.001f) {
|
||||
endClosing(gc, delta)
|
||||
isShowing = false
|
||||
}
|
||||
}
|
||||
if (handler!!.isOpened)
|
||||
displayTimer += delta
|
||||
|
||||
if (isShowing) {
|
||||
openCloseTimer += delta
|
||||
}
|
||||
if (displayTimer >= visibleTime)
|
||||
handler!!.setAsClose()
|
||||
}
|
||||
|
||||
override fun render(gc: GameContainer, g: Graphics) {
|
||||
if (isShowing) {
|
||||
msgUI.render(gc, g)
|
||||
}
|
||||
msgUI.render(gc, g)
|
||||
}
|
||||
|
||||
override fun doOpening(gc: GameContainer, delta: Int) {
|
||||
msgUI.doOpening(gc, delta)
|
||||
handler!!.opacity = FastMath.interpolateLinear(handler!!.openCloseCounter.toFloat() / openCloseTime.toFloat(),
|
||||
0f, 1f
|
||||
)
|
||||
}
|
||||
|
||||
override fun doClosing(gc: GameContainer, delta: Int) {
|
||||
msgUI.doClosing(gc, delta)
|
||||
handler!!.opacity = FastMath.interpolateLinear(handler!!.openCloseCounter.toFloat() / openCloseTime.toFloat(),
|
||||
1f, 0f
|
||||
)
|
||||
}
|
||||
|
||||
override fun endOpening(gc: GameContainer, delta: Int) {
|
||||
msgUI.endOpening(gc, delta)
|
||||
handler!!.opacity = 1f
|
||||
}
|
||||
|
||||
override fun endClosing(gc: GameContainer, delta: Int) {
|
||||
msgUI.endClosing(gc, delta)
|
||||
handler!!.opacity = 0f
|
||||
}
|
||||
|
||||
override fun processInput(input: Input) {
|
||||
|
||||
}
|
||||
|
||||
fun sendNotification(gc: GameContainer, delta: Int, message: Array<String>) {
|
||||
isShowing = true
|
||||
fun sendNotification(message: Array<String>) {
|
||||
this.message = message
|
||||
msgUI.setMessage(this.message)
|
||||
openCloseTimer = 0
|
||||
handler!!.openCloseCounter = 0
|
||||
handler!!.opacity = 0f
|
||||
handler!!.setAsOpen()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,16 +12,17 @@ interface UICanvas {
|
||||
var width: Int
|
||||
var height: Int
|
||||
|
||||
/**
|
||||
* Usage: (in StateInGame:) uiHandlerField.ui.handler = uiHandlerField
|
||||
*/
|
||||
var handler: UIHandler?
|
||||
|
||||
/**
|
||||
* In milliseconds
|
||||
*
|
||||
* Timer itself is implemented in the handler.
|
||||
*/
|
||||
var openCloseTime: Int
|
||||
/**
|
||||
* Usage: get() = handler!!.openCloseCounter
|
||||
*/
|
||||
var openCloseTimer: Int
|
||||
|
||||
fun update(gc: GameContainer, delta: Int)
|
||||
|
||||
@@ -29,11 +30,23 @@ interface UICanvas {
|
||||
|
||||
fun processInput(input: Input)
|
||||
|
||||
/**
|
||||
* Do not modify handler!!.openCloseCounter here.
|
||||
*/
|
||||
fun doOpening(gc: GameContainer, delta: Int)
|
||||
|
||||
/**
|
||||
* Do not modify handler!!.openCloseCounter here.
|
||||
*/
|
||||
fun doClosing(gc: GameContainer, delta: Int)
|
||||
|
||||
/**
|
||||
* Do not modify handler!!.openCloseCounter here.
|
||||
*/
|
||||
fun endOpening(gc: GameContainer, delta: Int)
|
||||
|
||||
/**
|
||||
* Do not modify handler!!.openCloseCounter here.
|
||||
*/
|
||||
fun endClosing(gc: GameContainer, delta: Int)
|
||||
}
|
||||
@@ -27,8 +27,6 @@ class UIPieMenu : UICanvas {
|
||||
* In milliseconds
|
||||
*/
|
||||
override var openCloseTime: Int = 160
|
||||
override var openCloseTimer: Int = 0
|
||||
get() = handler!!.openCloseCounter
|
||||
|
||||
private val smallenSize = 0.93f
|
||||
|
||||
@@ -82,12 +80,12 @@ class UIPieMenu : UICanvas {
|
||||
}
|
||||
|
||||
override fun doOpening(gc: GameContainer, delta: Int) {
|
||||
handler!!.opacity = openCloseTimer.toFloat() / openCloseTime
|
||||
handler!!.opacity = handler!!.openCloseCounter.toFloat() / openCloseTime
|
||||
handler!!.scale = smallenSize + (1f.minus(smallenSize) * handler!!.opacity)
|
||||
}
|
||||
|
||||
override fun doClosing(gc: GameContainer, delta: Int) {
|
||||
handler!!.opacity = (openCloseTime - openCloseTimer.toFloat()) / openCloseTime
|
||||
handler!!.opacity = (openCloseTime - handler!!.openCloseCounter.toFloat()) / openCloseTime
|
||||
handler!!.scale = smallenSize + (1f.minus(smallenSize) * handler!!.opacity)
|
||||
}
|
||||
|
||||
|
||||
@@ -17,7 +17,6 @@ class UIQuickBar : UICanvas, MouseControlled {
|
||||
* In milliseconds
|
||||
*/
|
||||
override var openCloseTime: Int = 160
|
||||
override var openCloseTimer: Int = 0
|
||||
|
||||
private val startPointX = ItemSlotImageBuilder.slotLarge.width / 2
|
||||
private val startPointY = ItemSlotImageBuilder.slotLarge.height / 2
|
||||
@@ -56,11 +55,11 @@ class UIQuickBar : UICanvas, MouseControlled {
|
||||
}
|
||||
|
||||
override fun doOpening(gc: GameContainer, delta: Int) {
|
||||
handler!!.opacity = openCloseTimer.toFloat() / openCloseTime
|
||||
handler!!.opacity = handler!!.openCloseCounter.toFloat() / openCloseTime
|
||||
}
|
||||
|
||||
override fun doClosing(gc: GameContainer, delta: Int) {
|
||||
handler!!.opacity = (openCloseTime - openCloseTimer.toFloat()) / openCloseTime
|
||||
handler!!.opacity = (openCloseTime - handler!!.openCloseCounter.toFloat()) / openCloseTime
|
||||
}
|
||||
|
||||
override fun endOpening(gc: GameContainer, delta: Int) {
|
||||
|
||||
@@ -159,7 +159,7 @@ object WeatherMixer {
|
||||
*/
|
||||
val pathToImage = "./res/graphics/weathers"
|
||||
|
||||
val JSON = JsonFetcher.readJson(path)
|
||||
val JSON = JsonFetcher(path)
|
||||
|
||||
val globalLightInJson = JSON.get("globalLight").asJsonPrimitive
|
||||
val skyboxInJson = JSON.get("skyboxGradColourMap").asJsonPrimitive
|
||||
|
||||
@@ -37,8 +37,7 @@ import org.dyn4j.Epsilon
|
||||
* [Vector2.project], and [Vector2.normalize] require the [Vector2]
|
||||
* to be non-zero in length.
|
||||
*
|
||||
*
|
||||
* Chaining is not available.
|
||||
* ===============================================================================
|
||||
*
|
||||
* In this Kotlin code, you can use regular operators like + - * /.
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user