inventory UI: quickslot designation

Former-commit-id: b2bddf7c271c678213f8f346d1de4b5c1dc27f60
This commit is contained in:
Song Minjae
2017-03-26 00:42:41 +09:00
parent b6290134a9
commit 816502df3d
29 changed files with 137 additions and 93 deletions

View File

@@ -6,5 +6,12 @@
"APP_ADJUST_YOUR_MONITOR": "", "APP_ADJUST_YOUR_MONITOR": "",
"APP_WARNING_HEALTH_AND_SAFETY": "ВНИМАНИЕ-ЗДРАВЕ И БЕЗОПАСНОСТ", "APP_WARNING_HEALTH_AND_SAFETY": "ВНИМАНИЕ-ЗДРАВЕ И БЕЗОПАСНОСТ",
"MENU_LABEL_PRESS_START_SYMBOL": "атисни >" "MENU_LABEL_PRESS_START_SYMBOL": "атисни >",
"GAME_INVENTORY_INGREDIENTS" : "Съставки",
"GAME_INVENTORY_POTIONS" : "Отвари",
"GAME_INVENTORY_BLOCKS" : "Блокове",
"GAME_INVENTORY_WALLS" : "Стени",
"CONTEXT_ITEM_TOOL_PLURAL" : "Инструменти",
"GAME_INVENTORY_FAVORITES" : "Любими"
} }

View File

@@ -12,6 +12,6 @@
"GAME_INVENTORY_POTIONS" : "Tränke", "GAME_INVENTORY_POTIONS" : "Tränke",
"GAME_INVENTORY_BLOCKS" : "Blöcke", "GAME_INVENTORY_BLOCKS" : "Blöcke",
"GAME_INVENTORY_WALLS" : "Wände", "GAME_INVENTORY_WALLS" : "Wände",
"CONTEXT_ITEM_EQUIPMENT_PLURAL" : "Ausrüstungen", "CONTEXT_ITEM_TOOL_PLURAL" : "Werkzeuge",
"GAME_INVENTORY_FAVORITES" : "Favoriten" "GAME_INVENTORY_FAVORITES" : "Favoriten"
} }

View File

@@ -12,6 +12,6 @@
"GAME_INVENTORY_POTIONS" : "Potions", "GAME_INVENTORY_POTIONS" : "Potions",
"GAME_INVENTORY_BLOCKS" : "Blocks", "GAME_INVENTORY_BLOCKS" : "Blocks",
"GAME_INVENTORY_WALLS" : "Walls", "GAME_INVENTORY_WALLS" : "Walls",
"CONTEXT_ITEM_EQUIPMENT_PLURAL" : "Equipments", "CONTEXT_ITEM_TOOL_PLURAL" : "Tools",
"GAME_INVENTORY_FAVORITES" : "Favorites" "GAME_INVENTORY_FAVORITES" : "Favorites"
} }

View File

@@ -13,6 +13,6 @@
"GAME_INVENTORY_POTIONS" : "Juomat", "GAME_INVENTORY_POTIONS" : "Juomat",
"GAME_INVENTORY_BLOCKS" : "Lohkareet", "GAME_INVENTORY_BLOCKS" : "Lohkareet",
"GAME_INVENTORY_WALLS" : "Seinät", "GAME_INVENTORY_WALLS" : "Seinät",
"CONTEXT_ITEM_EQUIPMENT_PLURAL" : "Varusteet", "CONTEXT_ITEM_TOOL_PLURAL" : "Työkalut",
"GAME_INVENTORY_FAVORITES" : "Suosikit" "GAME_INVENTORY_FAVORITES" : "Suosikit"
} }

View File

@@ -13,6 +13,6 @@
"GAME_INVENTORY_POTIONS" : "Potions", "GAME_INVENTORY_POTIONS" : "Potions",
"GAME_INVENTORY_BLOCKS" : "Blocs", "GAME_INVENTORY_BLOCKS" : "Blocs",
"GAME_INVENTORY_WALLS" : "Murs", "GAME_INVENTORY_WALLS" : "Murs",
"CONTEXT_ITEM_EQUIPMENT_PLURAL" : "Équipements", "CONTEXT_ITEM_TOOL_PLURAL" : "Outils",
"GAME_INVENTORY_FAVORITES" : "Favoris" "GAME_INVENTORY_FAVORITES" : "Favoris"
} }

View File

@@ -295,7 +295,7 @@
}, },
{ {
"n": "CONTEXT_ITEM_COND_MAGICAL", "n": "CONTEXT_ITEM_COND_MAGICAL",
"s": "Fjölkunnugur" "s": "Galdrafullur"
}, },
{ {
"n": "CONTEXT_ITEM_COND_RUSTY", "n": "CONTEXT_ITEM_COND_RUSTY",
@@ -371,7 +371,7 @@
}, },
{ {
"n": "CONTEXT_ITEM_MAGIC", "n": "CONTEXT_ITEM_MAGIC",
"s": "Magic" "s": "Galdur"
}, },
{ {
"n": "CONTEXT_ITEM_PISTOL", "n": "CONTEXT_ITEM_PISTOL",
@@ -1271,7 +1271,7 @@
}, },
{ {
"n": "GAME_GENRE_MISC", "n": "GAME_GENRE_MISC",
"s": "Misc." "s": "Ýmislegt"
}, },
{ {
"n": "GAME_GENRE_MULTIPLAYER", "n": "GAME_GENRE_MULTIPLAYER",
@@ -1403,11 +1403,11 @@
}, },
{ {
"n": "GAME_INVENTORY_WEAPON", "n": "GAME_INVENTORY_WEAPON",
"s": "Weapon" "s": "Vopn"
}, },
{ {
"n": "GAME_INVENTORY_WEAPONS", "n": "GAME_INVENTORY_WEAPONS",
"s": "Weapons" "s": "Vopn"
}, },
{ {
"n": "GAME_INVENTORY_YOU_CANNOT_CARRY", "n": "GAME_INVENTORY_YOU_CANNOT_CARRY",
@@ -1939,7 +1939,7 @@
}, },
{ {
"n": "MENU_LABEL_ALL", "n": "MENU_LABEL_ALL",
"s": "All" "s": "Allur"
}, },
{ {
"n": "MENU_LABEL_ARE_YOU_REALLY_SURE", "n": "MENU_LABEL_ARE_YOU_REALLY_SURE",

View File

@@ -7,6 +7,12 @@
"APP_ADJUST_YOUR_MONITOR": "Best leikmaður reynsla er getur náðist með rétt kvarðaður skjárinn. Ef þú ekki gerðir, gerðu svo vel að kvarða áður en þú leikur.", "APP_ADJUST_YOUR_MONITOR": "Best leikmaður reynsla er getur náðist með rétt kvarðaður skjárinn. Ef þú ekki gerðir, gerðu svo vel að kvarða áður en þú leikur.",
"APP_WARNING_HEALTH_AND_SAFETY": "VIÐVÖRUN-HEILSA OG ÖRYGGI", "APP_WARNING_HEALTH_AND_SAFETY": "VIÐVÖRUN-HEILSA OG ÖRYGGI",
"MENU_LABEL_PRESS_START_SYMBOL": "Ýttu >" "MENU_LABEL_PRESS_START_SYMBOL": "Ýttu >",
"GAME_INVENTORY_INGREDIENTS" : "Innihaldsefni",
"GAME_INVENTORY_POTIONS" : "Drykkir",
"GAME_INVENTORY_BLOCKS" : "Blokkir",
"GAME_INVENTORY_WALLS" : "Veggir",
"CONTEXT_ITEM_TOOL_PLURAL" : "Verkfærar",
"GAME_INVENTORY_FAVORITES" : "Uppáhalds"
} }

View File

@@ -13,6 +13,6 @@
"GAME_INVENTORY_POTIONS" : "水薬", "GAME_INVENTORY_POTIONS" : "水薬",
"GAME_INVENTORY_BLOCKS" : "ブロック", "GAME_INVENTORY_BLOCKS" : "ブロック",
"GAME_INVENTORY_WALLS" : "壁", "GAME_INVENTORY_WALLS" : "壁",
"CONTEXT_ITEM_EQUIPMENT_PLURAL" : "装備", "CONTEXT_ITEM_TOOL_PLURAL" : "道具",
"GAME_INVENTORY_FAVORITES" : "登録" "GAME_INVENTORY_FAVORITES" : "登録"
} }

View File

@@ -257,7 +257,7 @@
}, },
{ {
"n": "CONTEXT_ITEM_ARMOR", "n": "CONTEXT_ITEM_ARMOR",
"s": "" "s": "よろい"
}, },
{ {
"n": "CONTEXT_ITEM_ARROW", "n": "CONTEXT_ITEM_ARROW",
@@ -1277,7 +1277,7 @@
}, },
{ {
"n": "GAME_GENRE_MISC", "n": "GAME_GENRE_MISC",
"s": "その" "s": "そのほか"
}, },
{ {
"n": "GAME_GENRE_MULTIPLAYER", "n": "GAME_GENRE_MULTIPLAYER",
@@ -1409,11 +1409,11 @@
}, },
{ {
"n": "GAME_INVENTORY_WEAPON", "n": "GAME_INVENTORY_WEAPON",
"s": "武器" "s": "ぶき"
}, },
{ {
"n": "GAME_INVENTORY_WEAPONS", "n": "GAME_INVENTORY_WEAPONS",
"s": "武器" "s": "ぶき"
}, },
{ {
"n": "GAME_INVENTORY_YOU_CANNOT_CARRY", "n": "GAME_INVENTORY_YOU_CANNOT_CARRY",

View File

@@ -7,6 +7,12 @@
"APP_ADJUST_YOUR_MONITOR": "このゲームは、てきせつにちょうせいした モニターから さいこうのプレイができます。ちょうせいして いなかったら、プレイするまえに ちょうせいしてください。", "APP_ADJUST_YOUR_MONITOR": "このゲームは、てきせつにちょうせいした モニターから さいこうのプレイができます。ちょうせいして いなかったら、プレイするまえに ちょうせいしてください。",
"APP_WARNING_HEALTH_AND_SAFETY": "けいこくーけんこうと あんぜんの ために", "APP_WARNING_HEALTH_AND_SAFETY": "けいこくーけんこうと あんぜんの ために",
"MENU_LABEL_PRESS_START_SYMBOL": "> ボタンを おす" "MENU_LABEL_PRESS_START_SYMBOL": "> ボタンを おす",
"GAME_INVENTORY_INGREDIENTS" : "ざいりょう",
"GAME_INVENTORY_POTIONS" : "すいやく",
"GAME_INVENTORY_BLOCKS" : "ブロック",
"GAME_INVENTORY_WALLS" : "かべ",
"CONTEXT_ITEM_TOOL_PLURAL" : "どうぐ",
"GAME_INVENTORY_FAVORITES" : "とうろく"
} }

View File

@@ -13,6 +13,6 @@
"GAME_INVENTORY_POTIONS" : "물약", "GAME_INVENTORY_POTIONS" : "물약",
"GAME_INVENTORY_BLOCKS" : "블록", "GAME_INVENTORY_BLOCKS" : "블록",
"GAME_INVENTORY_WALLS" : "벽지", "GAME_INVENTORY_WALLS" : "벽지",
"CONTEXT_ITEM_EQUIPMENT_PLURAL" : "장비", "CONTEXT_ITEM_TOOL_PLURAL" : "도구",
"GAME_INVENTORY_FAVORITES" : "등록" "GAME_INVENTORY_FAVORITES" : "등록"
} }

View File

@@ -6,6 +6,12 @@
"APP_ADJUST_YOUR_MONITOR": "", "APP_ADJUST_YOUR_MONITOR": "",
"APP_WARNING_HEALTH_AND_SAFETY": "ПРЕДУПРЕЖДЕНИЕ-ЗДОРОВЬЕ И БЕЗОПАСНОСТЬ", "APP_WARNING_HEALTH_AND_SAFETY": "ПРЕДУПРЕЖДЕНИЕ-ЗДОРОВЬЕ И БЕЗОПАСНОСТЬ",
"MENU_LABEL_PRESS_START_SYMBOL": "Нажмите >" "MENU_LABEL_PRESS_START_SYMBOL": "Нажмите >",
"GAME_INVENTORY_INGREDIENTS" : "Ингредиенты",
"GAME_INVENTORY_POTIONS" : "Зелья",
"GAME_INVENTORY_BLOCKS" : "Блоки",
"GAME_INVENTORY_WALLS" : "Стены",
"CONTEXT_ITEM_TOOL_PLURAL" : "Инструменты",
"GAME_INVENTORY_FAVORITES" : "Избранное"
} }

View File

@@ -54,26 +54,26 @@ open class GameFontBase : Font {
9 9
} }
private fun isHangul(c: Char) = c.toInt() >= 0xAC00 && c.toInt() < 0xD7A4 private fun isHangul(c: Char) = c.toInt() in 0xAC00..0xD7A3
private fun isAscii(c: Char) = c.toInt() >= 0x20 && c.toInt() <= 0xFF private fun isAscii(c: Char) = c.toInt() in 0x20..0xFF
private fun isRunic(c: Char) = runicList.contains(c) private fun isRunic(c: Char) = runicList.contains(c)
private fun isExtA(c: Char) = c.toInt() >= 0x100 && c.toInt() < 0x180 private fun isExtA(c: Char) = c.toInt() in 0x100..0x17F
private fun isExtB(c: Char) = c.toInt() >= 0x180 && c.toInt() < 0x250 private fun isExtB(c: Char) = c.toInt() in 0x180..0x24F
private fun isKana(c: Char) = c.toInt() >= 0x3040 && c.toInt() < 0x3100 private fun isKana(c: Char) = c.toInt() in 0x3040..0x30FF
private fun isCJKPunct(c: Char) = c.toInt() >= 0x3000 && c.toInt() < 0x3040 private fun isCJKPunct(c: Char) = c.toInt() in 0x3000..0x303F
private fun isUniHan(c: Char) = c.toInt() >= 0x3400 && c.toInt() < 0xA000 private fun isUniHan(c: Char) = c.toInt() in 0x3400..0x9FFF
private fun isCyrilic(c: Char) = c.toInt() >= 0x400 && c.toInt() < 0x460 private fun isCyrilic(c: Char) = c.toInt() in 0x400..0x45F
private fun isFullwidthUni(c: Char) = c.toInt() >= 0xFF00 && c.toInt() < 0xFF20 private fun isFullwidthUni(c: Char) = c.toInt() in 0xFF00..0xFF1F
private fun isUniPunct(c: Char) = c.toInt() >= 0x2000 && c.toInt() < 0x2070 private fun isUniPunct(c: Char) = c.toInt() in 0x2000..0x206F
private fun isWenQuanYi1(c: Char) = c.toInt() >= 0x33F3 && c.toInt() <= 0x69FC private fun isWenQuanYi1(c: Char) = c.toInt() in 0x33F3..0x69FC
private fun isWenQuanYi2(c: Char) = c.toInt() >= 0x69FD && c.toInt() <= 0x9FDC private fun isWenQuanYi2(c: Char) = c.toInt() in 0x69FD..0x9FDC
private fun isGreek(c: Char) = c.toInt() >= 0x370 && c.toInt() <= 0x3CE private fun isGreek(c: Char) = c.toInt() in 0x370..0x3CE
private fun isThai(c: Char) = c.toInt() >= 0xE00 && c.toInt() <= 0xE7F private fun isThai(c: Char) = c.toInt() in 0xE00..0xE7F
private fun isThaiDiacritics(c: Char) = (c.toInt() >= 0xE34 && c.toInt() <= 0xE3A) private fun isThaiDiacritics(c: Char) = c.toInt() in 0xE34..0xE3A
|| (c.toInt() >= 0xE47 && c.toInt() <= 0xE4E) || c.toInt() in 0xE47..0xE4E
|| (c.toInt() == 0xE31) || c.toInt() == 0xE31
private fun isThaiEF(c: Char) = c.toInt() == 0xE40 private fun isThaiEF(c: Char) = c.toInt() == 0xE40
private fun isKeycap(c: Char) = c.toInt() >= 0xE000 && c.toInt() <= 0xE07F private fun isKeycap(c: Char) = c.toInt() in 0xE000..0xE0FF
@@ -147,15 +147,14 @@ open class GameFontBase : Font {
val chr = s[i] val chr = s[i]
val ctype = getSheetType(s[i]) val ctype = getSheetType(s[i])
if (chr.toInt() == 0x21B) // Romanian t; HAX! if (variableWidthSheets.contains(ctype)) {
len += 6 len += try {
else if (variableWidthSheets.contains(ctype)) { asciiWidths[chr.toInt()]!!
try {
len += asciiWidths[chr.toInt()]!!
} }
catch (e: kotlin.KotlinNullPointerException) { catch (e: kotlin.KotlinNullPointerException) {
println("KotlinNullPointerException on glyph number ${Integer.toHexString(chr.toInt()).toUpperCase()}") println("KotlinNullPointerException on glyph number ${Integer.toHexString(chr.toInt()).toUpperCase()}")
System.exit(1) //System.exit(1)
W_LATIN_WIDE // failsafe
} }
} }
else if (zeroWidthSheets.contains(ctype)) else if (zeroWidthSheets.contains(ctype))
@@ -219,17 +218,17 @@ open class GameFontBase : Font {
hangulSheet.getSubImage(indexCho, choRow).drawWithShadow( hangulSheet.getSubImage(indexCho, choRow).drawWithShadow(
Math.round(x + getWidthSubstr(s, i + 1) - glyphW).toFloat(), Math.round(x + getWidthSubstr(s, i + 1) - glyphW).toFloat(),
Math.round(((H - H_HANGUL) / 2).toFloat() + y + 1f).toFloat(), Math.round(y).toFloat(),
scale.toFloat(), thisCol scale.toFloat(), thisCol
) )
hangulSheet.getSubImage(indexJung, jungRow).drawWithShadow( hangulSheet.getSubImage(indexJung, jungRow).drawWithShadow(
Math.round(x + getWidthSubstr(s, i + 1) - glyphW).toFloat(), Math.round(x + getWidthSubstr(s, i + 1) - glyphW).toFloat(),
Math.round(((H - H_HANGUL) / 2).toFloat() + y + 1f).toFloat(), Math.round(y).toFloat(),
scale.toFloat(), thisCol scale.toFloat(), thisCol
) )
hangulSheet.getSubImage(indexJong, jongRow).drawWithShadow( hangulSheet.getSubImage(indexJong, jongRow).drawWithShadow(
Math.round(x + getWidthSubstr(s, i + 1) - glyphW).toFloat(), Math.round(x + getWidthSubstr(s, i + 1) - glyphW).toFloat(),
Math.round(((H - H_HANGUL) / 2).toFloat() + y + 1f).toFloat(), Math.round(y).toFloat(),
scale.toFloat(), thisCol scale.toFloat(), thisCol
) )
} }
@@ -379,9 +378,8 @@ open class GameFontBase : Font {
Math.round(x + getWidthSubstr(s, i + 1) - glyphW).toFloat(), Math.round(x + getWidthSubstr(s, i + 1) - glyphW).toFloat(),
// to deal with the height difference of the sheets // to deal with the height difference of the sheets
Math.round(y).toFloat() + (if (prevInstance == SHEET_CJK_PUNCT) -1 // height hack Math.round(y).toFloat() +
else if (prevInstance == SHEET_FW_UNI) (H - H_HANGUL) / 2 // completely legit height adjustment (if (prevInstance == SHEET_KEYCAP) (H - SIZE_KEYCAP) / 2 // completely legit height adjustment
else if (prevInstance == SHEET_KEYCAP) (H - SIZE_KEYCAP) / 2 // completely legit height adjustment
else 0).toFloat(), else 0).toFloat(),
scale.toFloat(), thisCol scale.toFloat(), thisCol
@@ -525,9 +523,7 @@ open class GameFontBase : Font {
internal val W_LATIN_WIDE = 9 // width of regular letters internal val W_LATIN_WIDE = 9 // width of regular letters
internal val H = 20 internal val H = 20
internal val H_HANGUL = 16
internal val H_UNIHAN = 16 internal val H_UNIHAN = 16
internal val H_KANA = 20
internal val SIZE_KEYCAP = 18 internal val SIZE_KEYCAP = 18
@@ -572,8 +568,8 @@ open class GameFontBase : Font {
*/ */
internal val runicList = arrayOf('ᚠ', 'ᚢ', 'ᚦ', 'ᚬ', 'ᚱ', 'ᚴ', 'ᚼ', 'ᚾ', '', 'ᛅ', 'ᛋ', 'ᛏ', 'ᛒ', 'ᛘ', 'ᛚ', 'ᛦ', 'ᛂ', '', '᛫', '', 'ᛮ', 'ᛯ', 'ᛰ') internal val runicList = arrayOf('ᚠ', 'ᚢ', 'ᚦ', 'ᚬ', 'ᚱ', 'ᚴ', 'ᚼ', 'ᚾ', '', 'ᛅ', 'ᛋ', 'ᛏ', 'ᛒ', 'ᛘ', 'ᛚ', 'ᛦ', 'ᛂ', '', '᛫', '', 'ᛮ', 'ᛯ', 'ᛰ')
internal var interchar = 0 var interchar = 0
internal var scale = 1 var scale = 1
set(value) { set(value) {
if (value > 0) field = value if (value > 0) field = value
else throw IllegalArgumentException("Font scale cannot be zero or negative (input: $value)") else throw IllegalArgumentException("Font scale cannot be zero or negative (input: $value)")

View File

@@ -11,7 +11,7 @@ class GameFontImpl : GameFontBase() {
init { init {
GameFontBase.hangulSheet = SpriteSheet( GameFontBase.hangulSheet = SpriteSheet(
"./assets/graphics/fonts/hangul_johab.tga", GameFontBase.W_HANGUL, GameFontBase.H_HANGUL) "./assets/graphics/fonts/hangul_johab.tga", GameFontBase.W_HANGUL, GameFontBase.H)
GameFontBase.asciiSheet = SpriteSheet( GameFontBase.asciiSheet = SpriteSheet(
"./assets/graphics/fonts/ascii_variable.tga", 15, 19, 1) "./assets/graphics/fonts/ascii_variable.tga", 15, 19, 1)
GameFontBase.runicSheet = SpriteSheet( GameFontBase.runicSheet = SpriteSheet(
@@ -21,9 +21,9 @@ class GameFontImpl : GameFontBase() {
GameFontBase.extBSheet = SpriteSheet( GameFontBase.extBSheet = SpriteSheet(
"./assets/graphics/fonts/LatinExtB_variable.tga", 15, 19, 1) "./assets/graphics/fonts/LatinExtB_variable.tga", 15, 19, 1)
GameFontBase.kanaSheet = SpriteSheet( GameFontBase.kanaSheet = SpriteSheet(
"./assets/graphics/fonts/kana.tga", GameFontBase.W_KANA, GameFontBase.H_KANA) "./assets/graphics/fonts/kana.tga", GameFontBase.W_KANA, GameFontBase.H)
GameFontBase.cjkPunct = SpriteSheet( GameFontBase.cjkPunct = SpriteSheet(
"./assets/graphics/fonts/cjkpunct.tga", GameFontBase.W_ASIAN_PUNCT, GameFontBase.H_KANA) "./assets/graphics/fonts/cjkpunct.tga", GameFontBase.W_ASIAN_PUNCT, GameFontBase.H)
/*uniHan = new SpriteSheet( /*uniHan = new SpriteSheet(
"./assets/graphics/fonts/unifont_unihan" "./assets/graphics/fonts/unifont_unihan"
+ ((!terrarum.gameLocale.contains("zh")) + ((!terrarum.gameLocale.contains("zh"))
@@ -82,6 +82,7 @@ class GameFontImpl : GameFontBase() {
} }
fun reload() { fun reload() {
GameFontBase.cyrilic.destroy()
GameFontBase.cyrilic = SpriteSheet( GameFontBase.cyrilic = SpriteSheet(
when (Terrarum.gameLocale.substring(0..1)) { when (Terrarum.gameLocale.substring(0..1)) {
"bg" -> "./assets/graphics/fonts/cyrilic_bulgarian_variable.tga" "bg" -> "./assets/graphics/fonts/cyrilic_bulgarian_variable.tga"

View File

@@ -10,19 +10,16 @@ import org.newdawn.slick.SpriteSheet
class NewRunes : Font { class NewRunes : Font {
private val runeSize = 12 private val runeSize = 12
private val encPlane = IntArray(128, { // hard-coded encode map
if (it < 0x20) private fun codeToEnc(code: Int): Int? = if (code in 0x21..0x3f)
0x20 + it code - 0x20
else if (it < 0x30) else if (code in 0x3001..0x300f)
0x3000 + (it - 0x20) code - 0x3000 + 0x20
else if (code in 0x3131..0x3163)
code - 0x3130 + 0x30
else else
0x3130 + (it - 0x30) null
})
private fun codeToEnc(c: Char): Int? {
val result = encPlane.binarySearch(c.toInt())
return if (result >= 0) result else null
}
private val runes = SpriteSheet("./assets/graphics/fonts/newrunes.tga", runeSize, runeSize) private val runes = SpriteSheet("./assets/graphics/fonts/newrunes.tga", runeSize, runeSize)
@@ -36,7 +33,7 @@ class NewRunes : Font {
override fun drawString(x: Float, y: Float, text: String, col: Color) { override fun drawString(x: Float, y: Float, text: String, col: Color) {
text.forEachIndexed { index, c -> text.forEachIndexed { index, c ->
val encodePoint = codeToEnc(c) val encodePoint = codeToEnc(c.toInt())
if (encodePoint != null) { if (encodePoint != null) {
runes.getSubImage(encodePoint % 16, encodePoint / 16).draw( runes.getSubImage(encodePoint % 16, encodePoint / 16).draw(

View File

@@ -94,7 +94,7 @@ nopqrstuvwxyz
"Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства", "Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства",
"Pijamalı hasta yağız şoföre çabucak güvendi", "Pijamalı hasta yağız şoföre çabucak güvendi",
"Also supports: Unicode „quotation marks“—dashes…「括弧」‼", "Also supports: Unicode „quotation marks“—dashes…「括弧」‼",
"ASCII Latin-1 Latin_Ext-A Latin_Ext-B Greek Cyrillic CJK-Ideo Kana Hangul_Syllables (More coming!)", "ASCII Latin-1 Latin_Ext-A Latin_Ext-B Greek Cyrillic CJK-Ideo Kana Hangul_Syllables",
"" ""
) )

View File

@@ -13,6 +13,7 @@ import net.torvald.terrarum.ui.UIItemTextButtonList
import org.newdawn.slick.* import org.newdawn.slick.*
import org.newdawn.slick.state.BasicGameState import org.newdawn.slick.state.BasicGameState
import org.newdawn.slick.state.StateBasedGame import org.newdawn.slick.state.StateBasedGame
import java.util.*
/** /**
* Created by SKYHi14 on 2017-03-13. * Created by SKYHi14 on 2017-03-13.
@@ -68,6 +69,8 @@ class StateUITest : BasicGameState() {
} }
override fun update(container: GameContainer, game: StateBasedGame, delta: Int) { override fun update(container: GameContainer, game: StateBasedGame, delta: Int) {
Terrarum.appgc.setTitle("${Terrarum.NAME} — F: ${Terrarum.appgc.fps}")
ui.update(container, delta) ui.update(container, delta)
} }
@@ -92,7 +95,7 @@ private class SimpleUI(val inventory: ActorInventory) : UICanvas {
init { init {
catButtonsToCatIdent.put("GAME_INVENTORY_WEAPONS", InventoryItem.Category.WEAPON) catButtonsToCatIdent.put("GAME_INVENTORY_WEAPONS", InventoryItem.Category.WEAPON)
catButtonsToCatIdent.put("CONTEXT_ITEM_EQUIPMENT_PLURAL", InventoryItem.Category.TOOL) catButtonsToCatIdent.put("CONTEXT_ITEM_TOOL_PLURAL", InventoryItem.Category.TOOL)
catButtonsToCatIdent.put("CONTEXT_ITEM_ARMOR", InventoryItem.Category.ARMOUR) catButtonsToCatIdent.put("CONTEXT_ITEM_ARMOR", InventoryItem.Category.ARMOUR)
catButtonsToCatIdent.put("GAME_INVENTORY_INGREDIENTS", InventoryItem.Category.GENERIC) catButtonsToCatIdent.put("GAME_INVENTORY_INGREDIENTS", InventoryItem.Category.GENERIC)
catButtonsToCatIdent.put("GAME_INVENTORY_POTIONS", InventoryItem.Category.POTION) catButtonsToCatIdent.put("GAME_INVENTORY_POTIONS", InventoryItem.Category.POTION)
@@ -111,7 +114,7 @@ private class SimpleUI(val inventory: ActorInventory) : UICanvas {
arrayOf( arrayOf(
"MENU_LABEL_ALL", "MENU_LABEL_ALL",
"GAME_INVENTORY_WEAPONS", // weapons and tools "GAME_INVENTORY_WEAPONS", // weapons and tools
"CONTEXT_ITEM_EQUIPMENT_PLURAL", "CONTEXT_ITEM_TOOL_PLURAL",
"CONTEXT_ITEM_ARMOR", "CONTEXT_ITEM_ARMOR",
"GAME_INVENTORY_INGREDIENTS", "GAME_INVENTORY_INGREDIENTS",
"GAME_INVENTORY_POTIONS", "GAME_INVENTORY_POTIONS",
@@ -156,7 +159,7 @@ private class SimpleUI(val inventory: ActorInventory) : UICanvas {
private var oldCatSelect = -1 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 = "fiFI" // hot swap this to test
buttons.update(gc, delta) buttons.update(gc, delta)
@@ -191,11 +194,14 @@ private class SimpleUI(val inventory: ActorInventory) : UICanvas {
items[k].item = sortListItem.item items[k].item = sortListItem.item
items[k].amount = sortListItem.amount items[k].amount = sortListItem.amount
items[k].itemImage = itemImagePlaceholder items[k].itemImage = itemImagePlaceholder
items[k].quickslot = Random().nextInt(10) // TODO test
} }
catch (e: IndexOutOfBoundsException) { catch (e: IndexOutOfBoundsException) {
items[k].item = null items[k].item = null
items[k].amount = 0 items[k].amount = 0
items[k].itemImage = null items[k].itemImage = null
items[k].quickslot = null
} }
} }
} }

View File

@@ -279,8 +279,13 @@ object Terrarum : StateBasedGame(GAME_NAME) {
break break
} }
} }
// test acquired controller
controller!!.getAxisValue(0)
} }
catch (e: IndexOutOfBoundsException) { catch (controllerDoesNotHaveAnyAxesException: java.lang.ArrayIndexOutOfBoundsException) {
controller = null
} }
if (controller != null) { if (controller != null) {
@@ -304,6 +309,7 @@ object Terrarum : StateBasedGame(GAME_NAME) {
addState(StateUITest()) addState(StateUITest())
//addState(StateControllerRumbleTest()) //addState(StateControllerRumbleTest())
//addState(StateMidiInputTest()) //addState(StateMidiInputTest())
//addState(StateNewRunesTest())
//ingame = StateInGame(); addState(ingame) //ingame = StateInGame(); addState(ingame)

View File

@@ -24,7 +24,9 @@ class UIItemInventoryElem(
var amount: Int, var amount: Int,
var itemImage: Image?, var itemImage: Image?,
val backCol: Color = Color(0,0,0,0), val backCol: Color = Color(0,0,0,0),
val backColBlendMode: String = BlendMode.NORMAL val backColBlendMode: String = BlendMode.NORMAL,
var quickslot: Int? = null,
var equippedSlot: Int? = null
) : UIItem(parentUI) { ) : UIItem(parentUI) {
companion object { companion object {
@@ -37,10 +39,12 @@ class UIItemInventoryElem(
private val imgOffset: Float private val imgOffset: Float
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 textOffsetY = 8f
private val durabilityCol = Color(0x22ff11) private val durabilityCol = Color(0x22ff11)
private val durabilityBack: Color; get() = durabilityCol.darkerLab(0.4f) private val durabilityBack: Color; get() = durabilityCol.darkerLab(0.4f)
private val durabilityBarOffY = 35f
@@ -71,20 +75,30 @@ class UIItemInventoryElem(
g.drawString( g.drawString(
item!!.name + (if (amount > 0 && !item!!.isUnique) "${0x3000.toChar()}($amount)" else "") item!!.name + (if (amount > 0 && !item!!.isUnique) "${0x3000.toChar()}($amount)" else "")
, posX + textOffsetX , posX + textOffsetX
, posY + 8f , posY + textOffsetY
) )
// durability metre // durability metre
val barFullLen = (width - 20f) - textOffsetX
val barOffset = posX + textOffsetX
if (item!!.maxDurability > 0.0) { if (item!!.maxDurability > 0.0) {
g.color = durabilityBack g.color = durabilityBack
g.lineWidth = 3f g.lineWidth = 3f
val fullLen = (width - 20f) - textOffsetX g.drawLine(barOffset, posY + durabilityBarOffY, barOffset + barFullLen, posY + durabilityBarOffY)
val barOffset = posX + textOffsetX
g.drawLine(barOffset, posY + 35f, barOffset + fullLen, posY + 35f)
g.color = durabilityCol g.color = durabilityCol
g.drawLine(barOffset, posY + 35f, barOffset + fullLen * (item!!.durability / item!!.maxDurability).toFloat(), posY + 35f) g.drawLine(barOffset, posY + durabilityBarOffY, barOffset + barFullLen * (item!!.durability / item!!.maxDurability).toFloat(), posY + durabilityBarOffY)
} }
// quickslot marker (TEMPORARY UNTIL WE GET BETTER DESIGN)
if (quickslot != null) {
val label = quickslot!!.plus(0xE010).toChar()
val labelW = g.font.getWidth("$label")
g.color = Color.white
g.drawString("$label", barOffset + barFullLen - labelW, posY + textOffsetY)
}
} }
} }

View File

@@ -87,5 +87,7 @@ object AVKey {
const val __PLAYER_QUICKBARSEL = "__quickbarselection" const val __PLAYER_QUICKSLOTSEL = "__quickslotselection"
/** Item ID; they are supposed to be unique */
const val __PLAYER_QSPREFIX = "__qsitem" // __qsitem1 .. __qsitem10
} }

View File

@@ -7,8 +7,6 @@ import net.torvald.terrarum.gamecontroller.EnumKeyFunc
import net.torvald.terrarum.gamecontroller.KeyMap import net.torvald.terrarum.gamecontroller.KeyMap
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.lwjgl.input.Controller
import org.newdawn.slick.GameContainer import org.newdawn.slick.GameContainer
import org.newdawn.slick.Input import org.newdawn.slick.Input
import java.util.* import java.util.*
@@ -24,9 +22,9 @@ 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?>(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()
/** /**

View File

@@ -18,7 +18,7 @@ object PlayerBuilder {
// attach sprite // attach sprite
// do etc. // do etc.
p.actorValue[AVKey.__PLAYER_QUICKBARSEL] = 0 p.actorValue[AVKey.__PLAYER_QUICKSLOTSEL] = 0
return p return p
} }

View File

@@ -18,7 +18,7 @@ object PlayerBuilderCynthia {
InjectCreatureRaw(p.actorValue, "CreatureHuman.json") InjectCreatureRaw(p.actorValue, "CreatureHuman.json")
p.actorValue[AVKey.__PLAYER_QUICKBARSEL] = 0 p.actorValue[AVKey.__PLAYER_QUICKSLOTSEL] = 0
p.actorValue[AVKey.NAME] = "Cynthia" p.actorValue[AVKey.NAME] = "Cynthia"

View File

@@ -60,7 +60,7 @@ object PlayerBuilderSigrid {
p.actorValue[AVKey.BASEDEFENCE] = 141 p.actorValue[AVKey.BASEDEFENCE] = 141
p.actorValue[AVKey.__PLAYER_QUICKBARSEL] = 0 p.actorValue[AVKey.__PLAYER_QUICKSLOTSEL] = 0
//p.actorValue["__selectedtile"] = 147 // test code; replace with <tile_item>.primaryUse(gc, delta) //p.actorValue["__selectedtile"] = 147 // test code; replace with <tile_item>.primaryUse(gc, delta)
p.actorValue["__aimhelper"] = true // TODO when you'll gonna implement it? p.actorValue["__aimhelper"] = true // TODO when you'll gonna implement it?

View File

@@ -12,7 +12,7 @@ object PlayerBuilderTestSubject1 {
InjectCreatureRaw(p.actorValue, "CreatureHuman.json") InjectCreatureRaw(p.actorValue, "CreatureHuman.json")
p.actorValue[AVKey.__PLAYER_QUICKBARSEL] = 0 p.actorValue[AVKey.__PLAYER_QUICKSLOTSEL] = 0
p.actorValue[AVKey.NAME] = "Test Subject 1" p.actorValue[AVKey.NAME] = "Test Subject 1"

View File

@@ -24,7 +24,7 @@ class UIInventory : UICanvas {
private val categories = arrayOf( private val categories = arrayOf(
"GAME_INVENTORY_WEAPONS", // weapons and tools "GAME_INVENTORY_WEAPONS", // weapons and tools
"CONTEXT_ITEM_EQUIPMENT_PLURAL", "CONTEXT_ITEM_TOOL_PLURAL",
"CONTEXT_ITEM_ARMOR", "CONTEXT_ITEM_ARMOR",
"GAME_INVENTORY_INGREDIENTS", "GAME_INVENTORY_INGREDIENTS",
"GAME_INVENTORY_POTIONS", "GAME_INVENTORY_POTIONS",

View File

@@ -65,7 +65,6 @@ class UIItemTextButton(
g.fillRect(posX.toFloat(), posY.toFloat(), width.toFloat(), height.toFloat()) g.fillRect(posX.toFloat(), posY.toFloat(), width.toFloat(), height.toFloat())
} }
blendNormal() blendNormal()
g.font = font g.font = font

View File

@@ -35,7 +35,7 @@ class UIPieMenu : UICanvas {
override fun update(gc: GameContainer, delta: Int) { override fun update(gc: GameContainer, delta: Int) {
if (selection >= 0) if (selection >= 0)
Terrarum.ingame!!.player.actorValue[AVKey.__PLAYER_QUICKBARSEL] = Terrarum.ingame!!.player.actorValue[AVKey.__PLAYER_QUICKSLOTSEL] =
selection % slotCount selection % slotCount

View File

@@ -25,8 +25,8 @@ class UIQuickBar : UICanvas, MouseControlled {
override var handler: UIHandler? = null override var handler: UIHandler? = null
private var selection: Int private var selection: Int
get() = Terrarum.ingame!!.player.actorValue.getAsInt(AVKey.__PLAYER_QUICKBARSEL) ?: 0 get() = Terrarum.ingame!!.player.actorValue.getAsInt(AVKey.__PLAYER_QUICKSLOTSEL) ?: 0
set(value) { Terrarum.ingame!!.player.actorValue[AVKey.__PLAYER_QUICKBARSEL] = value } set(value) { Terrarum.ingame!!.player.actorValue[AVKey.__PLAYER_QUICKSLOTSEL] = value }
override fun update(gc: GameContainer, delta: Int) { override fun update(gc: GameContainer, delta: Int) {
} }