diff --git a/res/graphics/fonts/LatinExtA_majuscule.png b/res/graphics/fonts/LatinExtA_fullwidth.png similarity index 100% rename from res/graphics/fonts/LatinExtA_majuscule.png rename to res/graphics/fonts/LatinExtA_fullwidth.png diff --git a/res/graphics/fonts/ascii_majuscule.png b/res/graphics/fonts/ascii_fullwidth.png similarity index 100% rename from res/graphics/fonts/ascii_majuscule.png rename to res/graphics/fonts/ascii_fullwidth.png diff --git a/res/graphics/fonts/cyrilic_majuscule.png b/res/graphics/fonts/cyrilic_fullwidth.png similarity index 100% rename from res/graphics/fonts/cyrilic_majuscule.png rename to res/graphics/fonts/cyrilic_fullwidth.png diff --git a/res/graphics/fonts/greek_majuscule.png b/res/graphics/fonts/greek_fullwidth.png similarity index 100% rename from res/graphics/fonts/greek_majuscule.png rename to res/graphics/fonts/greek_fullwidth.png diff --git a/res/graphics/fonts/romana_majuscule.png b/res/graphics/fonts/romana_fullwidth.png similarity index 100% rename from res/graphics/fonts/romana_majuscule.png rename to res/graphics/fonts/romana_fullwidth.png diff --git a/res/graphics/fonts/thai_fullwidth.png b/res/graphics/fonts/thai_fullwidth.png index 803ac7378..abff042a9 100644 Binary files a/res/graphics/fonts/thai_fullwidth.png and b/res/graphics/fonts/thai_fullwidth.png differ diff --git a/res/graphics/weathers/generic_light 복사본.png b/res/graphics/gui/control_helper_body.png similarity index 84% rename from res/graphics/weathers/generic_light 복사본.png rename to res/graphics/gui/control_helper_body.png index da689f918..eee62b27f 100644 Binary files a/res/graphics/weathers/generic_light 복사본.png and b/res/graphics/gui/control_helper_body.png differ diff --git a/res/graphics/gui/control_helper_left b/res/graphics/gui/control_helper_left new file mode 100644 index 000000000..e377c82d5 Binary files /dev/null and b/res/graphics/gui/control_helper_left differ diff --git a/res/graphics/gui/control_helper_right.png b/res/graphics/gui/control_helper_right.png new file mode 100644 index 000000000..87df8157d Binary files /dev/null and b/res/graphics/gui/control_helper_right.png differ diff --git a/res/graphics/terrain/terrain.png b/res/graphics/terrain/terrain.png index 99e7f0f32..7d4c06439 100644 Binary files a/res/graphics/terrain/terrain.png and b/res/graphics/terrain/terrain.png differ diff --git a/res/graphics/weathers/generic_light.png b/res/graphics/weathers/generic_light.png index 4cc174700..4cff6fc0a 100644 Binary files a/res/graphics/weathers/generic_light.png and b/res/graphics/weathers/generic_light.png differ diff --git a/res/graphics/weathers/generic_skybox.png b/res/graphics/weathers/generic_skybox.png index 84a2ace64..f4beae885 100644 Binary files a/res/graphics/weathers/generic_skybox.png and b/res/graphics/weathers/generic_skybox.png differ diff --git a/res/keylayout.json b/res/keylayout.json new file mode 100644 index 000000000..c1438f8dd --- /dev/null +++ b/res/keylayout.json @@ -0,0 +1,52 @@ +{ + "qwerty": { + "layout": "1234567890-=QWERTYUIOP[]ASDFGHJKL;'ZXCVBNM,./", + "capslock": "Caps", + "name": "QWERTY" + }, + "qwertz": { + "layout": "1234567890-=QWERTZUIOP[]ASDFGHJKL;'YXCVBNM,./", + "capslock": "Caps", + "name": "QWERTZ" + }, + "azerty": { + "layout": "1234567890-=AZERTYUIOP[]QSDFGHJKL;'WXCVBNM,./", + "capslock": "Caps", + "name": "AZERTY" + }, + "colemak": { + "layout": "1234567890-=QWFPGJLUY;[]ARSTDHNEIO'ZXCVBKM,./", + "capslock": "Back", + "name": "Colemak" + }, + "workman": { + "layout": "1234567890-=QDRWBJFUP;[]ASHTGYNEOI'ZXMCVKL,./", + "capslock": "Back", + "name": "Workman" + }, + "dvorak": { + "layout": "1234567890[]',.PYFGCRL/=AOEUIDHTNS-;QJKXBMWVZ", + "capslock": "Caps", + "name": "Dvorak" + }, + "bepo": { + "layout": "1234567890=%BÉPOÈ!VDLJZWAUIE,CTSRNMÀYX.K'QGHF", + "capslock": "Caps", + "name": "Bépo" + }, + "turk-f": { + "layout": "1234567890/-FGĞIODRNHPQWUİEAÜTKMLYŞJÖVCÇZSB.,", + "capslock": "Caps", + "name": "F klavye" + }, + "qwerty-jis-apple": { + "layout": "1234567890-=QWERTYUIOP[]ASDFGHJKL;'ZXCVBNM,./", + "capslock": "Ctrl", + "name": "Apple 日本語" + }, + "hhkb": { + "layout": "1234567890-=QWERTYUIOP[]ASDFGHJKL;'ZXCVBNM,./", + "capslock": "Ctrl", + "name": "HHKB2" + } +} \ No newline at end of file diff --git a/res/locales/koKR/Polyglot-100_koKR.json b/res/locales/koKR/Polyglot-100_koKR.json index 9512bbdd8..e3a753637 100644 --- a/res/locales/koKR/Polyglot-100_koKR.json +++ b/res/locales/koKR/Polyglot-100_koKR.json @@ -349,7 +349,7 @@ }, { "n": "CONTEXT_ITEM_HAMMER", - "s": "철퇴" + "s": "망치" }, { "n": "CONTEXT_ITEM_HELMET", diff --git a/src/net/torvald/CSVFetcher.kt b/src/net/torvald/CSVFetcher.kt index 526e1014d..197aa0ee1 100644 --- a/src/net/torvald/CSVFetcher.kt +++ b/src/net/torvald/CSVFetcher.kt @@ -16,7 +16,7 @@ object CSVFetcher { private var csvString: StringBuffer? = null @Throws(IOException::class) - fun readCSV(csvFilePath: String): List { + operator fun invoke(csvFilePath: String): List { csvString = StringBuffer() // reset buffer every time it called readCSVasString(csvFilePath) diff --git a/src/net/torvald/JsonFetcher.kt b/src/net/torvald/JsonFetcher.kt index 5dd2af719..43fddf9c3 100644 --- a/src/net/torvald/JsonFetcher.kt +++ b/src/net/torvald/JsonFetcher.kt @@ -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) diff --git a/src/net/torvald/gadgets/HistoryArray.kt b/src/net/torvald/gadgets/HistoryArray.kt index 433d2bb3f..62d9b4144 100644 --- a/src/net/torvald/gadgets/HistoryArray.kt +++ b/src/net/torvald/gadgets/HistoryArray.kt @@ -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(val historyMax: Int) { - val history = ArrayList(Math.min(historyMax, 256)) // 256: arbitrary-set upper bound + val history = ArrayList(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 diff --git a/src/net/torvald/imagefont/GameFontWhite.kt b/src/net/torvald/imagefont/GameFontWhite.kt index d91f570d0..232461064 100644 --- a/src/net/torvald/imagefont/GameFontWhite.kt +++ b/src/net/torvald/imagefont/GameFontWhite.kt @@ -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( diff --git a/src/net/torvald/spriteanimation/SpriteAnimation.kt b/src/net/torvald/spriteanimation/SpriteAnimation.kt index 75f5201d6..187dc9da3 100644 --- a/src/net/torvald/spriteanimation/SpriteAnimation.kt +++ b/src/net/torvald/spriteanimation/SpriteAnimation.kt @@ -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() ) diff --git a/src/net/torvald/terrarum/DefaultConfig.kt b/src/net/torvald/terrarum/DefaultConfig.kt index 4c5b2fdd9..26c2645a6 100644 --- a/src/net/torvald/terrarum/DefaultConfig.kt +++ b/src/net/torvald/terrarum/DefaultConfig.kt @@ -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) diff --git a/src/net/torvald/terrarum/StateInGame.kt b/src/net/torvald/terrarum/StateInGame.kt index eb5bb8ce8..73fc3445a 100644 --- a/src/net/torvald/terrarum/StateInGame.kt +++ b/src/net/torvald/terrarum/StateInGame.kt @@ -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) { - (notifier.UI as Notification).sendNotification(Terrarum.appgc, UPDATE_DELTA, msg) - notifier.setAsOpen() + (notifier.UI as Notification).sendNotification(msg) } fun wakeDormantActors() { diff --git a/src/net/torvald/terrarum/StateMonitorCheck.kt b/src/net/torvald/terrarum/StateMonitorCheck.kt index 8596a3680..80610f6ec 100644 --- a/src/net/torvald/terrarum/StateMonitorCheck.kt +++ b/src/net/torvald/terrarum/StateMonitorCheck.kt @@ -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 diff --git a/src/net/torvald/terrarum/Terrarum.kt b/src/net/torvald/terrarum/Terrarum.kt index bb3c2290a..1a0b7d443 100644 --- a/src/net/torvald/terrarum/Terrarum.kt +++ b/src/net/torvald/terrarum/Terrarum.kt @@ -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 } diff --git a/src/net/torvald/terrarum/gameactors/ActorWithBody.kt b/src/net/torvald/terrarum/gameactors/ActorWithBody.kt index b187d22c5..ea5c2bc07 100644 --- a/src/net/torvald/terrarum/gameactors/ActorWithBody.kt +++ b/src/net/torvald/terrarum/gameactors/ActorWithBody.kt @@ -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() diff --git a/src/net/torvald/terrarum/gameactors/CreatureRawInjector.kt b/src/net/torvald/terrarum/gameactors/CreatureRawInjector.kt index ebdbff12d..7f151ba66 100644 --- a/src/net/torvald/terrarum/gameactors/CreatureRawInjector.kt +++ b/src/net/torvald/terrarum/gameactors/CreatureRawInjector.kt @@ -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) diff --git a/src/net/torvald/terrarum/gameactors/Player.kt b/src/net/torvald/terrarum/gameactors/Player.kt index 04ee0530e..6ad9ed100 100644 --- a/src/net/torvald/terrarum/gameactors/Player.kt +++ b/src/net/torvald/terrarum/gameactors/Player.kt @@ -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: diff --git a/src/net/torvald/terrarum/gameactors/faction/FactionFactory.kt b/src/net/torvald/terrarum/gameactors/faction/FactionFactory.kt index f3baeba5f..4ebf42e06 100644 --- a/src/net/torvald/terrarum/gameactors/faction/FactionFactory.kt +++ b/src/net/torvald/terrarum/gameactors/faction/FactionFactory.kt @@ -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) } diff --git a/src/net/torvald/terrarum/gamecontroller/KeyLayout.kt b/src/net/torvald/terrarum/gamecontroller/KeyLayout.kt new file mode 100644 index 000000000..e13875c85 --- /dev/null +++ b/src/net/torvald/terrarum/gamecontroller/KeyLayout.kt @@ -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 + */ + val layouts: HashMap + + init { + layouts = HashMap() + + 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(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())] +} \ No newline at end of file diff --git a/src/net/torvald/terrarum/langpack/Lang.kt b/src/net/torvald/terrarum/langpack/Lang.kt index a99f15757..f3e66ba07 100644 --- a/src/net/torvald/terrarum/langpack/Lang.kt +++ b/src/net/torvald/terrarum/langpack/Lang.kt @@ -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: * diff --git a/src/net/torvald/terrarum/mapdrawer/MapCamera.kt b/src/net/torvald/terrarum/mapdrawer/MapCamera.kt index 3ea02a8ff..c46dfce5b 100644 --- a/src/net/torvald/terrarum/mapdrawer/MapCamera.kt +++ b/src/net/torvald/terrarum/mapdrawer/MapCamera.kt @@ -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 diff --git a/src/net/torvald/terrarum/tileproperties/TileNameCode.kt b/src/net/torvald/terrarum/tileproperties/TileNameCode.kt index 207bc19ea..8f3b06194 100644 --- a/src/net/torvald/terrarum/tileproperties/TileNameCode.kt +++ b/src/net/torvald/terrarum/tileproperties/TileNameCode.kt @@ -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) diff --git a/src/net/torvald/terrarum/tileproperties/TilePropCodex.kt b/src/net/torvald/terrarum/tileproperties/TilePropCodex.kt index 24ac9a9b8..45af892a2 100644 --- a/src/net/torvald/terrarum/tileproperties/TilePropCodex.kt +++ b/src/net/torvald/terrarum/tileproperties/TilePropCodex.kt @@ -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") diff --git a/src/net/torvald/terrarum/tileproperties/tileprop.csv b/src/net/torvald/terrarum/tileproperties/tileprop.csv index 58287ad95..2f04cd5c8 100644 --- a/src/net/torvald/terrarum/tileproperties/tileprop.csv +++ b/src/net/torvald/terrarum/tileproperties/tileprop.csv @@ -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" diff --git a/src/net/torvald/terrarum/ui/BasicDebugInfoWindow.kt b/src/net/torvald/terrarum/ui/BasicDebugInfoWindow.kt index 5e782bf04..f196c0949 100644 --- a/src/net/torvald/terrarum/ui/BasicDebugInfoWindow.kt +++ b/src/net/torvald/terrarum/ui/BasicDebugInfoWindow.kt @@ -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 diff --git a/src/net/torvald/terrarum/ui/ConsoleWindow.kt b/src/net/torvald/terrarum/ui/ConsoleWindow.kt index d25f7848c..2e4fd1890 100644 --- a/src/net/torvald/terrarum/ui/ConsoleWindow.kt +++ b/src/net/torvald/terrarum/ui/ConsoleWindow.kt @@ -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() diff --git a/src/net/torvald/terrarum/ui/MessageWindow.kt b/src/net/torvald/terrarum/ui/MessageWindow.kt index 0c1edbc3b..1d0850b20 100644 --- a/src/net/torvald/terrarum/ui/MessageWindow.kt +++ b/src/net/torvald/terrarum/ui/MessageWindow.kt @@ -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) { @@ -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) { diff --git a/src/net/torvald/terrarum/ui/Notification.kt b/src/net/torvald/terrarum/ui/Notification.kt index 3abaaff40..c28cc9295 100644 --- a/src/net/torvald/terrarum/ui/Notification.kt +++ b/src/net/torvald/terrarum/ui/Notification.kt @@ -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 = 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) { - isShowing = true + fun sendNotification(message: Array) { this.message = message msgUI.setMessage(this.message) - openCloseTimer = 0 + handler!!.openCloseCounter = 0 + handler!!.opacity = 0f + handler!!.setAsOpen() } } diff --git a/src/net/torvald/terrarum/ui/UICanvas.kt b/src/net/torvald/terrarum/ui/UICanvas.kt index fab7feb38..085204df5 100644 --- a/src/net/torvald/terrarum/ui/UICanvas.kt +++ b/src/net/torvald/terrarum/ui/UICanvas.kt @@ -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) } \ No newline at end of file diff --git a/src/net/torvald/terrarum/ui/UIPieMenu.kt b/src/net/torvald/terrarum/ui/UIPieMenu.kt index 16686eba8..245872dbb 100644 --- a/src/net/torvald/terrarum/ui/UIPieMenu.kt +++ b/src/net/torvald/terrarum/ui/UIPieMenu.kt @@ -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) } diff --git a/src/net/torvald/terrarum/ui/UIQuickBar.kt b/src/net/torvald/terrarum/ui/UIQuickBar.kt index 19753a635..799a2e957 100644 --- a/src/net/torvald/terrarum/ui/UIQuickBar.kt +++ b/src/net/torvald/terrarum/ui/UIQuickBar.kt @@ -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) { diff --git a/src/net/torvald/terrarum/weather/WeatherMixer.kt b/src/net/torvald/terrarum/weather/WeatherMixer.kt index 952a48e1e..ef38fedf3 100644 --- a/src/net/torvald/terrarum/weather/WeatherMixer.kt +++ b/src/net/torvald/terrarum/weather/WeatherMixer.kt @@ -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 diff --git a/src/org/dyn4j/geometry/Vector2.kt b/src/org/dyn4j/geometry/Vector2.kt index 4ca532add..95902b369 100644 --- a/src/org/dyn4j/geometry/Vector2.kt +++ b/src/org/dyn4j/geometry/Vector2.kt @@ -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 + - * /. *