diff --git a/Known problems.md b/Known problems.md deleted file mode 100644 index 82a285536..000000000 --- a/Known problems.md +++ /dev/null @@ -1,28 +0,0 @@ -# Unresolved # - -### Character ### - -* Arm behind the body seems unnatural - - -### Physics ### - - -### System ### - - - -# Resolved # - -* Cannot fit into single-tile width pit - Cause: Player/NPC looks slim enough to fit, but don't fit in the game - Solution: Player/NPC hitbox now have a width of 15 pixels. - -* Actor stick to wall and not get off - Cause: Unknown - Solution: Changed collision detection method to CCD (continuous collision detection) - -* Actor with mass <2 behaves erratically - Details: Velocity becomes NaN when jumped - Cause: Floating-point precision error? - Solution: Changed every physics variable that uses Float to Double \ No newline at end of file diff --git a/assets/locales/nameset_dwarven.csv b/assets/locales/nameset_dwarven.csv new file mode 100644 index 000000000..99e108812 --- /dev/null +++ b/assets/locales/nameset_dwarven.csv @@ -0,0 +1,132 @@ +# Nameset - Dwarven (DF) +# Picked randomly from its massive 2195 entries + +"HEADER";"LatinAlph";"HangulKoKR";"KanaJaJP";"CyrilRuRU";"AlphElGR";"HanziZhCN";"HanziZhTW";"AksonThTH";"AlefbetHeIL" +"NAMESET_DWARVEN_001";"Asdos"; +"NAMESET_DWARVEN_002";"Ngárak"; +"NAMESET_DWARVEN_003";"Dùstik"; +"NAMESET_DWARVEN_004";"Ish"; +"NAMESET_DWARVEN_005";"Reked"; +"NAMESET_DWARVEN_006";"Noval"; +"NAMESET_DWARVEN_007";"Feb"; +"NAMESET_DWARVEN_008";"Ostar"; +"NAMESET_DWARVEN_009";"Nicat"; +"NAMESET_DWARVEN_010";"Kogan"; +"NAMESET_DWARVEN_011";"Alud"; +"NAMESET_DWARVEN_012";"Bidok"; +"NAMESET_DWARVEN_013";"Thatthil"; +"NAMESET_DWARVEN_014";"Olmul"; +"NAMESET_DWARVEN_015";"Comníth"; +"NAMESET_DWARVEN_016";"Erong"; +"NAMESET_DWARVEN_017";"Rërith"; +"NAMESET_DWARVEN_018";"Äkim"; +"NAMESET_DWARVEN_019";"Öntak"; +"NAMESET_DWARVEN_020";"Kitïg"; +"NAMESET_DWARVEN_021";"Thoth"; +"NAMESET_DWARVEN_022";"Tílgil"; +"NAMESET_DWARVEN_023";"Ingish"; +"NAMESET_DWARVEN_024";"Alak"; +"NAMESET_DWARVEN_025";"Egdoth"; +"NAMESET_DWARVEN_026";"Ùst"; +"NAMESET_DWARVEN_027";"Rimtar"; +"NAMESET_DWARVEN_028";"Bugsud"; +"NAMESET_DWARVEN_029";"Selsten"; +"NAMESET_DWARVEN_030";"Âtrid"; +"NAMESET_DWARVEN_031";"Roder"; +"NAMESET_DWARVEN_032";"Othsin"; +"NAMESET_DWARVEN_033";"Enôr"; +"NAMESET_DWARVEN_034";"Fer"; +"NAMESET_DWARVEN_035";"Dolush"; +"NAMESET_DWARVEN_036";"Ermis"; +"NAMESET_DWARVEN_037";"Åblel"; +"NAMESET_DWARVEN_038";"Agêk"; +"NAMESET_DWARVEN_039";"Ucat"; +"NAMESET_DWARVEN_040";"Ethbesh"; +"NAMESET_DWARVEN_041";"Nïng"; +"NAMESET_DWARVEN_042";"Emär"; +"NAMESET_DWARVEN_043";"Shalig"; +"NAMESET_DWARVEN_044";"Suthmam"; +"NAMESET_DWARVEN_045";"Ugath"; +"NAMESET_DWARVEN_046";"Udir"; +"NAMESET_DWARVEN_047";"Bemòng"; +"NAMESET_DWARVEN_048";"Tegir"; +"NAMESET_DWARVEN_049";"Nug"; +"NAMESET_DWARVEN_050";"Dudgoth"; +"NAMESET_DWARVEN_051";"Ogîk"; +"NAMESET_DWARVEN_052";"Robek"; +"NAMESET_DWARVEN_053";"Ilush"; +"NAMESET_DWARVEN_054";"Berim"; +"NAMESET_DWARVEN_055";"Emuth"; +"NAMESET_DWARVEN_056";"Sedil"; +"NAMESET_DWARVEN_057";"Izeg"; +"NAMESET_DWARVEN_058";"Okab"; +"NAMESET_DWARVEN_059";"Anam"; +"NAMESET_DWARVEN_060";"Girtol"; +"NAMESET_DWARVEN_061";"Etäg"; +"NAMESET_DWARVEN_062";"Stalkòb"; +"NAMESET_DWARVEN_063";"Enir"; +"NAMESET_DWARVEN_064";"Tosid"; +"NAMESET_DWARVEN_065";"Ím"; +"NAMESET_DWARVEN_066";"Lisig"; +"NAMESET_DWARVEN_067";"Stal"; +"NAMESET_DWARVEN_068";"Mafol"; +"NAMESET_DWARVEN_069";"Onshen"; +"NAMESET_DWARVEN_070";"Äs"; +"NAMESET_DWARVEN_071";"Sidos"; +"NAMESET_DWARVEN_072";"Sid"; +"NAMESET_DWARVEN_073";"Thîkut"; +"NAMESET_DWARVEN_074";"Gòstang"; +"NAMESET_DWARVEN_075";"Idek"; +"NAMESET_DWARVEN_076";"Themor"; +"NAMESET_DWARVEN_077";"Lurak"; +"NAMESET_DWARVEN_078";"Gost"; +"NAMESET_DWARVEN_079";"Namàsh"; +"NAMESET_DWARVEN_080";"Alåth"; +"NAMESET_DWARVEN_081";"Libash"; +"NAMESET_DWARVEN_082";"Dënush"; +"NAMESET_DWARVEN_083";"Biban"; +"NAMESET_DWARVEN_084";"Onlìl"; +"NAMESET_DWARVEN_085";"Lokast"; +"NAMESET_DWARVEN_086";"Rozsed"; +"NAMESET_DWARVEN_087";"Utheg"; +"NAMESET_DWARVEN_088";"Shin"; +"NAMESET_DWARVEN_089";"Mokez"; +"NAMESET_DWARVEN_090";"Lanlar"; +"NAMESET_DWARVEN_091";"Ebsas"; +"NAMESET_DWARVEN_092";"Osod"; +"NAMESET_DWARVEN_093";"Mabdug"; +"NAMESET_DWARVEN_094";"Ibruk"; +"NAMESET_DWARVEN_095";"Murak"; +"NAMESET_DWARVEN_096";"Cös"; +"NAMESET_DWARVEN_097";"Olom"; +"NAMESET_DWARVEN_098";"Kiror"; +"NAMESET_DWARVEN_099";"Kâkdal"; +"NAMESET_DWARVEN_100";"Zustash"; +"NAMESET_DWARVEN_101";"Okon"; +"NAMESET_DWARVEN_102";"Gatal"; +"NAMESET_DWARVEN_103";"Nazush"; +"NAMESET_DWARVEN_104";"Kun"; +"NAMESET_DWARVEN_105";"Nokzam"; +"NAMESET_DWARVEN_106";"Ëlot"; +"NAMESET_DWARVEN_107";"Stumäm"; +"NAMESET_DWARVEN_108";"Setnek"; +"NAMESET_DWARVEN_109";"Nural"; +"NAMESET_DWARVEN_110";"Tarmid"; +"NAMESET_DWARVEN_111";"Lek"; +"NAMESET_DWARVEN_112";"Cog"; +"NAMESET_DWARVEN_113";"Sákrith"; +"NAMESET_DWARVEN_114";"Ugog"; +"NAMESET_DWARVEN_115";"Ustos"; +"NAMESET_DWARVEN_116";"Thos"; +"NAMESET_DWARVEN_117";"Kovath"; +"NAMESET_DWARVEN_118";"Idos"; +"NAMESET_DWARVEN_119";"Nel"; +"NAMESET_DWARVEN_120";"Tobul"; +"NAMESET_DWARVEN_121";"Nashon"; +"NAMESET_DWARVEN_122";"Nicol"; +"NAMESET_DWARVEN_123";"Uvel"; +"NAMESET_DWARVEN_124";"Rorul"; +"NAMESET_DWARVEN_125";"Gasol"; +"NAMESET_DWARVEN_126";"Osed"; +"NAMESET_DWARVEN_127";"Lakish"; +"NAMESET_DWARVEN_128";"Okag"; diff --git a/assets/locales/nameset_exotic_deities.csv b/assets/locales/nameset_exotic_deities.csv new file mode 100644 index 000000000..827edd936 --- /dev/null +++ b/assets/locales/nameset_exotic_deities.csv @@ -0,0 +1,6 @@ +# Nameset - Fictional, used for deity names +# Mostly randomly generated, plus: +# References for mass media -- are allowed, as long as it does not impose copyright infringement + +"HEADER";"LatinAlph";"HangulKoKR";"KanaJaJP";"CyrilRuRU";"AlphElGR";"HanziZhCN";"HanziZhTW";"AksonThTH";"AlefbetHeIL";"Reference" +"NAMESET_DEITIES_001";"Armok";;;;;;;;"From game series Slaves to Armok: God of Blood" \ No newline at end of file diff --git a/assets/locales/nameset_scandinavian_f.csv b/assets/locales/nameset_scandinavian_f.csv index 280904d18..d98d2d513 100644 --- a/assets/locales/nameset_scandinavian_f.csv +++ b/assets/locales/nameset_scandinavian_f.csv @@ -1,6 +1,11 @@ # Nameset - Scandinavian # Data taken from www.behindthename.com -# Translator note: this nameset does not contain name that has [ɹ](american english 'r') sound (except '-er'). i.e. for Korean, 'Carl' should be '카를', 'Aleksander' should be '알렉산더'. + +# Each column stands for the writing system: +# LatinAlph - Latin Alphabet; HangulKoKR - Hangul, Korean; CyrilRuRU - Cyrillic, Russian; etc. + +# Translator note: this nameset does not contain name that has [ɹ](american english 'r') sound +# (except '-er'). i.e. for Korean, 'Carl' should be '카를', 'Aleksander' should be '알렉산더'. "HEADER";"LatinAlph";"HangulKoKR";"KanaJaJP";"CyrilRuRU";"AlphElGR";"HanziZhCN";"HanziZhTW";"AksonThTH";"AlefbetHeIL" "NAMESET_SCAN_F_001";"Agnes";"아그네스"; diff --git a/assets/locales/tiles.csv b/assets/locales/tiles.csv index 1e0d36685..403399005 100644 --- a/assets/locales/tiles.csv +++ b/assets/locales/tiles.csv @@ -1,3 +1,8 @@ +THIS IS UNUSED AND SHOULD BE REMOVED + + + + "STRING_ID";"IETF language tag(s) without dash";"enUS";"frFR";"esES";"deDE";"itIT";"ptBR";"ptPT";"ruRU";"elGR";"trTR";"daDK";"noNB";"svSE";"nlNL";"plPL";"fiFI";"jaJP";"zhCN";"zhTW";"koKR";"csCZ";"huHU";"roRO";"thTH";"bgBG";"heIL";"jakanaJP" "TILE_STONE";;"Stone";"Roche";;;;;;;;;;;;;;;;;;"돌"; diff --git a/assets/modules/LoadOrder.csv b/assets/modules/LoadOrder.csv index c7cc161b3..e7eee8dd7 100644 --- a/assets/modules/LoadOrder.csv +++ b/assets/modules/LoadOrder.csv @@ -6,4 +6,4 @@ # module_name,description_in_English_no_comma,(external Jar 1);(external Jar 2); ... basegame,The base game, -dwarventech,Logic gates and machines, +dwarventech,Dwarven technicians are emerged, diff --git a/assets/modules/basegame/materialprop.csv b/assets/modules/basegame/materialprop.csv index 99510e2b3..d0bf2cb1c 100644 --- a/assets/modules/basegame/materialprop.csv +++ b/assets/modules/basegame/materialprop.csv @@ -1,10 +1,15 @@ -"idst";"forcemod";"comments" -"rock"; "1"; -"cupr"; "2"; -"egls"; "4";"elven glass" -"iron"; "5"; -"argn"; "9";"argentum" -"stal"; "14";"steel" -"eaur"; "21";"elven aurichalcum" -"tial"; "33";"titanium alloy" -"admt"; "71";"adamant metal" +"idst";"forcemod";"endurance";"comments" +"rock"; "1"; "0.42"; +"cupr"; "2"; "1.00";"copper" +"egls"; "4"; "0.82";"elven glass" +"iron"; "5"; "1.42"; +"argn"; "9"; "0.91";"argentum/silver" +"stal"; "14"; "1.73";"steel" +"eaur"; "21"; "1.36";"elven aurichalcum" +"tial"; "33"; "2.16";"titanium alloy" +"admt"; "71"; "3.42";"adamant" + +# forcemod: related to attack points +# Attack points = `4 * forcemod.sqrt()` for each strike + +# endurance: multiplier, using copper as reference; determines durability of tools/weapons/armours/etc. diff --git a/src/net/torvald/colourutil/ColourTemp.kt b/src/net/torvald/colourutil/ColourTemp.kt index e97bc9a55..465207490 100644 --- a/src/net/torvald/colourutil/ColourTemp.kt +++ b/src/net/torvald/colourutil/ColourTemp.kt @@ -8,11 +8,11 @@ import net.torvald.colourutil.CIEXYZUtil.toColor import net.torvald.terrarum.ModMgr /** - * RGB-modeled CCT calculator + * RGB- and CIE-Modeled CCT calculator * Created by minjaesong on 16-07-26. */ object ColourTemp { - private var envOverlayColourmap = Image(ModMgr.getPath("basegame", "colourmap/black_body_col_1000_40000_K.tga")) + private var clut = Image(ModMgr.getPath("basegame", "colourmap/black_body_col_1000_40000_K.tga")) private fun colTempToImagePos(K: Int): Int { if (K < 1000 || K >= 40000) throw IllegalArgumentException("K: out of range. ($K)") @@ -21,7 +21,7 @@ object ColourTemp { /** returns sRGB-normalised colour */ operator fun invoke(temp: Int): Color = - envOverlayColourmap.getPixel(colTempToImagePos(temp), 0).toColor() + clut.getPixel(colTempToImagePos(temp), 0).toColor() /** returns CIExyY-based colour converted to slick.color * @param CIE_Y 0.0 - 1.0+ */ diff --git a/src/net/torvald/terrarum/CircularArray.kt b/src/net/torvald/dataclass/CircularArray.kt similarity index 98% rename from src/net/torvald/terrarum/CircularArray.kt rename to src/net/torvald/dataclass/CircularArray.kt index a84ce0777..0f735c2d7 100644 --- a/src/net/torvald/terrarum/CircularArray.kt +++ b/src/net/torvald/dataclass/CircularArray.kt @@ -1,4 +1,4 @@ -package net.torvald.terrarum +package net.torvald.dataclass /** diff --git a/src/net/torvald/terrarum/DefaultConfig.kt b/src/net/torvald/terrarum/DefaultConfig.kt index 7fce50326..51b505beb 100644 --- a/src/net/torvald/terrarum/DefaultConfig.kt +++ b/src/net/torvald/terrarum/DefaultConfig.kt @@ -75,6 +75,10 @@ object DefaultConfig { jsonObject.addProperty("safetywarning", true) + jsonObject.addProperty("maxparticles", 768) + + + return jsonObject } } diff --git a/src/net/torvald/terrarum/StateGraphicComputerTest.kt b/src/net/torvald/terrarum/StateGraphicComputerTest.kt index 7ab287fbb..81af58603 100644 --- a/src/net/torvald/terrarum/StateGraphicComputerTest.kt +++ b/src/net/torvald/terrarum/StateGraphicComputerTest.kt @@ -1,7 +1,7 @@ package net.torvald.terrarum import net.torvald.random.HQRNG -import net.torvald.terrarum.Terrarum.UPDATE_DELTA +import net.torvald.terrarum.Terrarum.delta import net.torvald.terrarum.gameactors.roundInt import net.torvald.terrarum.virtualcomputer.computer.TerrarumComputer import net.torvald.terrarum.virtualcomputer.peripheral.PeripheralVideoCard @@ -90,7 +90,7 @@ class StateGraphicComputerTest : BasicGameState() { var angle = 0.0 override fun update(container: GameContainer, game: StateBasedGame?, delta: Int) { - UPDATE_DELTA = delta + Terrarum.delta = delta Terrarum.appgc.setTitle("VT — F: ${container.fps}" + " — M: ${Terrarum.memInUse}M / ${Terrarum.memTotal}M / ${Terrarum.memXmx}M" + diff --git a/src/net/torvald/terrarum/StateInGame.kt b/src/net/torvald/terrarum/StateInGame.kt index 3ac6e9e1e..1c695e61b 100644 --- a/src/net/torvald/terrarum/StateInGame.kt +++ b/src/net/torvald/terrarum/StateInGame.kt @@ -1,8 +1,9 @@ package net.torvald.terrarum +import net.torvald.dataclass.CircularArray import net.torvald.imagefont.GameFontBase import net.torvald.random.HQRNG -import net.torvald.terrarum.Terrarum.UPDATE_DELTA +import net.torvald.terrarum.Terrarum.delta import net.torvald.terrarum.audio.AudioResourceLibrary import net.torvald.terrarum.concurrent.ThreadParallel import net.torvald.terrarum.console.* @@ -40,6 +41,7 @@ import java.lang.management.ManagementFactory import java.util.* import java.util.concurrent.locks.Lock import java.util.concurrent.locks.ReentrantLock +import javax.swing.JOptionPane import kotlin.collections.HashMap /** @@ -48,15 +50,13 @@ import kotlin.collections.HashMap class StateInGame : BasicGameState() { private val ACTOR_UPDATE_RANGE = 4096 - internal var game_mode = 0 - lateinit var world: GameWorld /** * list of Actors that is sorted by Actors' referenceID */ - val ACTORCONTAINER_INITIAL_SIZE = 128 - val PARTICLES_MAX = 768 + val ACTORCONTAINER_INITIAL_SIZE = 64 + val PARTICLES_MAX = Terrarum.getConfigInt("maxparticles") val actorContainer = ArrayList(ACTORCONTAINER_INITIAL_SIZE) val actorContainerInactive = ArrayList(ACTORCONTAINER_INITIAL_SIZE) val particlesContainer = CircularArray(PARTICLES_MAX) @@ -67,11 +67,6 @@ class StateInGame : BasicGameState() { private val actorsRenderMidTop = ArrayList(ACTORCONTAINER_INITIAL_SIZE) private val actorsRenderFront = ArrayList(ACTORCONTAINER_INITIAL_SIZE) - lateinit var consoleHandler: UIHandler - lateinit var debugWindow: UIHandler - lateinit var notifier: UIHandler - - var playableActorDelegate: PlayableActorDelegate? = null // DO NOT LATEINIT! private set internal val player: ActorHumanoid? // currently POSSESSED actor :) @@ -95,7 +90,12 @@ class StateInGame : BasicGameState() { val KEY_LIGHTMAP_RENDER = Key.F7 val KEY_LIGHTMAP_SMOOTH = Key.F8 - // UI aliases (no pause) + + + lateinit var consoleHandler: UIHandler + lateinit var debugWindow: UIHandler + lateinit var notifier: UIHandler + lateinit var uiPieMenu: UIHandler lateinit var uiQuickBar: UIHandler lateinit var uiInventoryPlayer: UIHandler @@ -103,10 +103,12 @@ class StateInGame : BasicGameState() { lateinit var uiVitalPrimary: UIHandler lateinit var uiVitalSecondary: UIHandler lateinit var uiVitalItem: UIHandler // itemcount/durability of held block or active ammo of held gun. As for the block, max value is 500. - lateinit var uiAliases: Array - // UI aliases (pause) - val uiAlasesPausing = ArrayList() + // UI aliases + lateinit var uiAliases: ArrayList + private set + lateinit var uiAlasesPausing: ArrayList + private set var paused: Boolean = false get() = uiAlasesPausing.map { if (it.isOpened) 1 else 0 }.sum() > 0 @@ -212,7 +214,7 @@ class StateInGame : BasicGameState() { // batch-process uiAliases - uiAliases = arrayOf( + uiAliases = arrayListOf( uiPieMenu, uiQuickBar, uiInventoryPlayer, @@ -221,6 +223,9 @@ class StateInGame : BasicGameState() { uiVitalSecondary, uiVitalItem ) + uiAlasesPausing = arrayListOf( + consoleHandler + ) uiAlasesPausing.forEach { uiContainer.add(it) } // put them all to the UIContainer uiAliases.forEach { uiContainer.add(it) } // put them all to the UIContainer @@ -238,7 +243,7 @@ class StateInGame : BasicGameState() { override fun update(gc: GameContainer, sbg: StateBasedGame, delta: Int) { particlesActive = 0 - UPDATE_DELTA = delta + Terrarum.delta = delta setAppTitle() @@ -337,7 +342,7 @@ class StateInGame : BasicGameState() { } playableActorDelegate = newActor - WorldSimulator(player, UPDATE_DELTA) + WorldSimulator(player, delta) } private fun changePossession(refid: Int) { @@ -352,7 +357,7 @@ class StateInGame : BasicGameState() { // accept new delegate playableActorDelegate = PlayableActorDelegate(getActorByID(refid) as ActorHumanoid) playableActorDelegate!!.actor.collisionType = ActorWithPhysics.COLLISION_KINEMATIC - WorldSimulator(player, UPDATE_DELTA) + WorldSimulator(player, delta) } private fun setAppTitle() { @@ -525,75 +530,15 @@ class StateInGame : BasicGameState() { } GameController.keyPressed(key, c) - - if (canPlayerControl) { - player?.keyPressed(key, c) - } - - if (Terrarum.getConfigIntArray("keyquickselalt").contains(key) - || key == Terrarum.getConfigInt("keyquicksel")) { - uiPieMenu.setAsOpen() - uiQuickBar.setAsClose() - } - - uiContainer.forEach { it.keyPressed(key, c) } // for KeyboardControlled UIcanvases - } - - override fun keyReleased(key: Int, c: Char) { - GameController.keyReleased(key, c) - - if (Terrarum.getConfigIntArray("keyquickselalt").contains(key) - || key == Terrarum.getConfigInt("keyquicksel")) { - uiPieMenu.setAsClose() - uiQuickBar.setAsOpen() - } - - uiContainer.forEach { it.keyReleased(key, c) } // for KeyboardControlled UIcanvases - } - - override fun mouseMoved(oldx: Int, oldy: Int, newx: Int, newy: Int) { - GameController.mouseMoved(oldx, oldy, newx, newy) - - uiContainer.forEach { it.mouseMoved(oldx, oldy, newx, newy) } // for MouseControlled UIcanvases - } - - override fun mouseDragged(oldx: Int, oldy: Int, newx: Int, newy: Int) { - GameController.mouseDragged(oldx, oldy, newx, newy) - - uiContainer.forEach { it.mouseDragged(oldx, oldy, newx, newy) } // for MouseControlled UIcanvases - } - - override fun mousePressed(button: Int, x: Int, y: Int) { - GameController.mousePressed(button, x, y) - - uiContainer.forEach { it.mousePressed(button, x, y) } // for MouseControlled UIcanvases - } - - override fun mouseReleased(button: Int, x: Int, y: Int) { - GameController.mouseReleased(button, x, y) - - uiContainer.forEach { it.mouseReleased(button, x, y) } // for MouseControlled UIcanvases - } - - override fun mouseWheelMoved(change: Int) { - GameController.mouseWheelMoved(change) - - uiContainer.forEach { it.mouseWheelMoved(change) } // for MouseControlled UIcanvases - } - - override fun controllerButtonPressed(controller: Int, button: Int) { - GameController.controllerButtonPressed(controller, button) - - uiContainer.forEach { it.controllerButtonPressed(controller, button) } // for GamepadControlled UIcanvases - - // TODO use item on Player - } - - override fun controllerButtonReleased(controller: Int, button: Int) { - GameController.controllerButtonReleased(controller, button) - - uiContainer.forEach { it.controllerButtonReleased(controller, button) } // for GamepadControlled UIcanvases } + override fun keyReleased(key: Int, c: Char) { GameController.keyReleased(key, c) } + override fun mouseMoved(oldx: Int, oldy: Int, newx: Int, newy: Int) { GameController.mouseMoved(oldx, oldy, newx, newy) } + override fun mouseDragged(oldx: Int, oldy: Int, newx: Int, newy: Int) { GameController.mouseDragged(oldx, oldy, newx, newy) } + override fun mousePressed(button: Int, x: Int, y: Int) { GameController.mousePressed(button, x, y) } + override fun mouseReleased(button: Int, x: Int, y: Int) { GameController.mouseReleased(button, x, y) } + override fun mouseWheelMoved(change: Int) { GameController.mouseWheelMoved(change) } + override fun controllerButtonPressed(controller: Int, button: Int) { GameController.controllerButtonPressed(controller, button) } + override fun controllerButtonReleased(controller: Int, button: Int) { GameController.controllerButtonReleased(controller, button) } override fun getID(): Int = Terrarum.STATE_ID_GAME @@ -858,8 +803,10 @@ class StateInGame : BasicGameState() { if (index < 0) { index = actorContainerInactive.binarySearch(ID) - if (index < 0) + if (index < 0) { + JOptionPane.showMessageDialog(null, "Actor with ID $ID does not exist.", null, JOptionPane.ERROR_MESSAGE) throw IllegalArgumentException("Actor with ID $ID does not exist.") + } else return actorContainerInactive[index] } diff --git a/src/net/torvald/terrarum/StateStutterTest.kt b/src/net/torvald/terrarum/StateStutterTest.kt new file mode 100644 index 000000000..2f962367c --- /dev/null +++ b/src/net/torvald/terrarum/StateStutterTest.kt @@ -0,0 +1,65 @@ +package net.torvald.terrarum + +import net.torvald.terrarum.gamecontroller.Key +import org.newdawn.slick.Color +import org.newdawn.slick.GameContainer +import org.newdawn.slick.Graphics +import org.newdawn.slick.Image +import org.newdawn.slick.state.BasicGameState +import org.newdawn.slick.state.StateBasedGame + +/** + * Created by SKYHi14 on 2017-04-22. + */ +class StateStutterTest : BasicGameState() { + + private val testImage = Image(4096, 1728) + private val testImageG = testImage.graphics + + override fun init(container: GameContainer?, game: StateBasedGame?) { + } + + override fun update(container: GameContainer, game: StateBasedGame, delta: Int) { + Terrarum.appgc.setTitle("${Terrarum.NAME} — F: ${Terrarum.appgc.fps}") + + + if (container.input.isKeyDown(Key.UP)) + dy -= moveDelta + if (container.input.isKeyDown(Key.DOWN)) + dy += moveDelta + if (container.input.isKeyDown(Key.LEFT)) + dx -= moveDelta + if (container.input.isKeyDown(Key.RIGHT)) + dx += moveDelta + } + + override fun getID() = Terrarum.STATE_ID_TEST_REFRESHRATE + + private var imageMade = false + + private var moveDelta = 3 + private var dx = 0 + private var dy = 0 + + override fun render(container: GameContainer, game: StateBasedGame, g: Graphics) { + if (!imageMade) { + testImageG.font = Terrarum.fontGame + testImageG.color = Color.white + + (0x3400..0x9FFF).forEach { + testImageG.drawString( + "${it.toChar()}", + (it - 0x3400) % 256 * 16f, + (it - 0x3400) / 256 * 16f + ) + } + + testImageG.flush() + + imageMade = true + } + + g.translate(-dx.toFloat(), -dy.toFloat()) + g.drawImage(testImage, 0f, 0f) + } +} \ No newline at end of file diff --git a/src/net/torvald/terrarum/StateUITest.kt b/src/net/torvald/terrarum/StateUITest.kt index 51f51383f..f1752a88a 100644 --- a/src/net/torvald/terrarum/StateUITest.kt +++ b/src/net/torvald/terrarum/StateUITest.kt @@ -47,7 +47,7 @@ class StateUITest : BasicGameState() { init { itemProperties[IVKey.ITEMTYPE] = IVKey.ItemType.HAMMER } - override val id: Int = 5656 + override var id: Int = 5656 override val isUnique: Boolean = true override var originalName: String = "Test tool" override var baseMass: Double = 12.0 @@ -63,7 +63,7 @@ class StateUITest : BasicGameState() { init { itemProperties[IVKey.ITEMTYPE] = IVKey.ItemType.ARTEFACT } - override val id: Int = 4633 + override var id: Int = 4633 override val isUnique: Boolean = true override var originalName: String = "CONTEXT_ITEM_QUEST_NOUN" override var baseMass: Double = 1.4 diff --git a/src/net/torvald/terrarum/Terrarum.kt b/src/net/torvald/terrarum/Terrarum.kt index 2b7f86061..ec60703e0 100644 --- a/src/net/torvald/terrarum/Terrarum.kt +++ b/src/net/torvald/terrarum/Terrarum.kt @@ -159,6 +159,7 @@ object Terrarum : StateBasedGame(GAME_NAME) { val STATE_ID_TEST_TTY = 0x102 val STATE_ID_TEST_BLUR = 0x103 val STATE_ID_TEST_SHADER = 0x104 + val STATE_ID_TEST_REFRESHRATE = 0x105 val STATE_ID_TEST_INPUT = 0x106 val STATE_ID_TEST_UI1 = 0x110 @@ -197,7 +198,7 @@ object Terrarum : StateBasedGame(GAME_NAME) { "${VERSION_RAW.ushr(24)}.${VERSION_RAW.and(0xFF0000).ushr(16)}.${VERSION_RAW.and(0xFFFF)}" const val NAME = "Terrarum" - var UPDATE_DELTA: Int = 0 + var delta: Int = 0 // these properties goes into the GameContainer @@ -332,6 +333,8 @@ object Terrarum : StateBasedGame(GAME_NAME) { //addState(StateControllerRumbleTest()) //addState(StateMidiInputTest()) //addState(StateNewRunesTest()) + //addState(StateStutterTest()) + ingame = StateInGame(); addState(ingame) diff --git a/src/net/torvald/terrarum/gameactors/ActorHumanoid.kt b/src/net/torvald/terrarum/gameactors/ActorHumanoid.kt index 87c2909d7..d95f0c088 100644 --- a/src/net/torvald/terrarum/gameactors/ActorHumanoid.kt +++ b/src/net/torvald/terrarum/gameactors/ActorHumanoid.kt @@ -138,7 +138,7 @@ open class ActorHumanoid(birth: GameDate, death: GameDate? = null) private val nullItem = object : InventoryItem() { - override val id: Int = 0 + override var id: Int = 0 override val isUnique: Boolean = false override var baseMass: Double = 0.0 override var baseToolSize: Double? = null diff --git a/src/net/torvald/terrarum/gameactors/ActorInventory.kt b/src/net/torvald/terrarum/gameactors/ActorInventory.kt index d8d23dc57..756206320 100644 --- a/src/net/torvald/terrarum/gameactors/ActorInventory.kt +++ b/src/net/torvald/terrarum/gameactors/ActorInventory.kt @@ -44,12 +44,18 @@ class ActorInventory(val actor: Pocketed, var maxCapacity: Int, var capacityMode // If we already have the item, increment the amount // If not, add item with specified amount val existingItem = getByID(item.id) + if (existingItem != null) { // if the item already exists val newCount = getByID(item.id)!!.amount + count itemList.remove(existingItem) itemList.add(InventoryPair(existingItem.item, newCount)) } - else { + else { // new item + if (item.isDynamic) { + // assign new ID + item.originalID = item.id + item.id = InventoryItem.generateNewDynamicID(this) + } itemList.add(InventoryPair(item, count)) } insertionSortLastElem(itemList) @@ -121,12 +127,18 @@ class ActorInventory(val actor: Pocketed, var maxCapacity: Int, var capacityMode false - fun consumeItem(item: InventoryItem) { + fun consumeItem(actor: Actor, item: InventoryItem) { if (item.consumable) { remove(item, 1) } else { - item.durability -= 1f + val baseDamagePerSwing = if (actor is ActorHumanoid) + actor.avStrength / 1000.0 + else + 1.0 // TODO variable: scale, strength + val swingDmgToFrameDmg = Terrarum.delta.toDouble() / actor.actorValue.getAsDouble(AVKey.ACTION_INTERVAL)!! + + item.durability -= (baseDamagePerSwing * swingDmgToFrameDmg).toFloat() if (item.durability <= 0) remove(item, 1) } diff --git a/src/net/torvald/terrarum/gameactors/ActorWithPhysics.kt b/src/net/torvald/terrarum/gameactors/ActorWithPhysics.kt index a7fff1250..18e605af4 100644 --- a/src/net/torvald/terrarum/gameactors/ActorWithPhysics.kt +++ b/src/net/torvald/terrarum/gameactors/ActorWithPhysics.kt @@ -107,9 +107,9 @@ open class ActorWithPhysics(renderOrder: RenderOrder, val immobileBody: Boolean } @Transient val MASS_LOWEST = 0.1 // Kilograms /** Apparent mass. Use "avBaseMass" for base mass */ - var mass: Double + val mass: Double get() = actorValue.getAsDouble(AVKey.BASEMASS) ?: MASS_DEFAULT * Math.pow(scale, 3.0) - set(value) { + /*set(value) { // use "var avBaseMass: Double" if (value <= 0) throw IllegalArgumentException("mass cannot be less than or equal to zero.") else if (value < MASS_LOWEST) { @@ -118,7 +118,7 @@ open class ActorWithPhysics(renderOrder: RenderOrder, val immobileBody: Boolean } actorValue[AVKey.BASEMASS] = value / Math.pow(scale, 3.0) - } + }*/ @Transient private val MASS_DEFAULT: Double = 60.0 /** Valid range: [0, 1] */ var elasticity: Double = 0.0 @@ -232,7 +232,7 @@ open class ActorWithPhysics(renderOrder: RenderOrder, val immobileBody: Boolean protected val gameContainer: GameContainer get() = Terrarum.appgc protected val updateDelta: Int - get() = Terrarum.UPDATE_DELTA + get() = Terrarum.delta /** * true: This actor had just made collision @@ -1286,15 +1286,12 @@ open class ActorWithPhysics(renderOrder: RenderOrder, val immobileBody: Boolean set(value) { actorValue[AVKey.SCALE] = value } - /** Apparent strength */ - var avStrength: Double - get() = (actorValue.getAsDouble(AVKey.STRENGTH) ?: 0.0) * - (actorValue.getAsDouble(AVKey.STRENGTHBUFF) ?: 0.0) * scale - set(value) { - actorValue[AVKey.STRENGTH] = - value / - ((actorValue.getAsDouble(AVKey.STRENGTHBUFF) ?: 1.0) * (avBaseStrength ?: 1.0)) - } + /** + * Apparent strength. 1 000 is default value + */ + val avStrength: Double + get() = (actorValue.getAsDouble(AVKey.STRENGTH) ?: 1000.0) * + (actorValue.getAsDouble(AVKey.STRENGTHBUFF) ?: 1.0) * scale var avBaseStrength: Double? get() = actorValue.getAsDouble(AVKey.STRENGTH) set(value) { diff --git a/src/net/torvald/terrarum/gameactors/DroppedItem.kt b/src/net/torvald/terrarum/gameactors/DroppedItem.kt index 57f4ae3f2..c6f29a495 100644 --- a/src/net/torvald/terrarum/gameactors/DroppedItem.kt +++ b/src/net/torvald/terrarum/gameactors/DroppedItem.kt @@ -17,7 +17,7 @@ class DroppedItem(private val item: InventoryItem) : ActorWithPhysics(Actor.Rend isVisible = true - mass = if (item.id < TileCodex.TILE_UNIQUE_MAX) + avBaseMass = if (item.id < TileCodex.TILE_UNIQUE_MAX) TileCodex[item.id].density / 1000.0 else ItemCodex[item.id].mass diff --git a/src/net/torvald/terrarum/gameactors/ParticleBase.kt b/src/net/torvald/terrarum/gameactors/ParticleBase.kt index 71208c9d6..b8383095e 100644 --- a/src/net/torvald/terrarum/gameactors/ParticleBase.kt +++ b/src/net/torvald/terrarum/gameactors/ParticleBase.kt @@ -20,7 +20,7 @@ open class ParticleBase(renderOrder: Actor.RenderOrder, maxLifeTime: Int? = null /** Will NOT actually delete from the CircularArray */ @Volatile var flagDespawn = false - override fun run() = update(Terrarum.appgc, Terrarum.UPDATE_DELTA) + override fun run() = update(Terrarum.appgc, Terrarum.delta) var isNoSubjectToGrav = false var dragCoefficient = 3.0 diff --git a/src/net/torvald/terrarum/gameactors/ParticleTestRain.kt b/src/net/torvald/terrarum/gameactors/ParticleTestRain.kt index 917a8d1c0..23661cd16 100644 --- a/src/net/torvald/terrarum/gameactors/ParticleTestRain.kt +++ b/src/net/torvald/terrarum/gameactors/ParticleTestRain.kt @@ -9,7 +9,7 @@ import org.newdawn.slick.Image class ParticleTestRain(posX: Double, posY: Double) : ParticleBase(Actor.RenderOrder.BEHIND, 6000) { init { - body = Image("./assets/graphics/weathers/raindrop.tga") + body = Image("./assets/modules/basegame/weathers/raindrop.tga") val w = body.width.toDouble() val h = body.height.toDouble() hitbox.setFromWidthHeight( diff --git a/src/net/torvald/terrarum/gameactors/PhysTestBall.kt b/src/net/torvald/terrarum/gameactors/PhysTestBall.kt index ef72e0168..144818f38 100644 --- a/src/net/torvald/terrarum/gameactors/PhysTestBall.kt +++ b/src/net/torvald/terrarum/gameactors/PhysTestBall.kt @@ -16,7 +16,7 @@ class PhysTestBall : ActorWithPhysics(Actor.RenderOrder.MIDDLE, immobileBody = t init { setHitboxDimension(16, 16, 0, 0) - mass = 10.0 + avBaseMass = 10.0 density = 200.0 color = RoguelikeRandomiser.composeColourFrom(RoguelikeRandomiser.POTION_PRIMARY_COLSET) diff --git a/src/net/torvald/terrarum/gameactors/Pocketed.kt b/src/net/torvald/terrarum/gameactors/Pocketed.kt index f2c1121c0..fd2a01eb5 100644 --- a/src/net/torvald/terrarum/gameactors/Pocketed.kt +++ b/src/net/torvald/terrarum/gameactors/Pocketed.kt @@ -25,7 +25,7 @@ interface Pocketed { } inventory.itemEquipped[item.equipPosition] = null - item.effectOnUnequip(Terrarum.appgc, Terrarum.UPDATE_DELTA) + item.effectOnUnequip(Terrarum.appgc, Terrarum.delta) } /** @@ -37,7 +37,7 @@ interface Pocketed { if (item.equipPosition >= 0) { inventory.itemEquipped[item.equipPosition] = item - item.effectWhenEquipped(Terrarum.appgc, Terrarum.UPDATE_DELTA) + item.effectWhenEquipped(Terrarum.appgc, Terrarum.delta) } } @@ -55,12 +55,13 @@ interface Pocketed { fun consumePrimary(item: InventoryItem) { - if (item.primaryUse(Terrarum.appgc, Terrarum.UPDATE_DELTA)) - inventory.consumeItem(item) // consume on successful + if (item.primaryUse(Terrarum.appgc, Terrarum.delta)) { + inventory.consumeItem(this as Actor, item) // consume on successful + } } fun consumeSecondary(item: InventoryItem) { - if (item.secondaryUse(Terrarum.appgc, Terrarum.UPDATE_DELTA)) - inventory.consumeItem(item) // consume on successful + if (item.secondaryUse(Terrarum.appgc, Terrarum.delta)) + inventory.consumeItem(this as Actor, item) // consume on successful } } \ No newline at end of file diff --git a/src/net/torvald/terrarum/gamecontroller/GameController.kt b/src/net/torvald/terrarum/gamecontroller/GameController.kt index 89f88dbd8..91cc6256f 100644 --- a/src/net/torvald/terrarum/gamecontroller/GameController.kt +++ b/src/net/torvald/terrarum/gamecontroller/GameController.kt @@ -18,15 +18,17 @@ import org.newdawn.slick.Input */ object GameController { + private val ingame = Terrarum.ingame!! + // these four values can also be accessed with GameContainer. // e.g. gc.mouseTileX /** position of the mouse (pixelwise) relative to the world (also, currently pointing world-wise coordinate, if the world coordinate is pixel-wise) */ val mouseX: Float - get() = (MapCamera.x + Terrarum.appgc.input.mouseX / (Terrarum.ingame?.screenZoom ?: 1f)) + get() = (MapCamera.x + Terrarum.appgc.input.mouseX / (ingame.screenZoom ?: 1f)) /** position of the mouse (pixelwise) relative to the world (also, currently pointing world-wise coordinate, if the world coordinate is pixel-wise)*/ val mouseY: Float - get() = (MapCamera.y + Terrarum.appgc.input.mouseY / (Terrarum.ingame?.screenZoom ?: 1f)) + get() = (MapCamera.y + Terrarum.appgc.input.mouseY / (ingame.screenZoom ?: 1f)) /** currently pointing tile coordinate */ val mouseTileX: Int get() = (mouseX / FeaturesDrawer.TILE_SIZE).floorInt() @@ -35,81 +37,97 @@ object GameController { get() = (mouseY / FeaturesDrawer.TILE_SIZE).floorInt() fun processInput(gc: GameContainer, delta: Int, input: Input) { - if (Terrarum.ingame != null) { - val ingame = Terrarum.ingame!! - - - // actor process input - if (!ingame.consoleHandler.isTakingControl) { - if (ingame.canPlayerControl) { - ingame.actorContainer.forEach { - if (it is Controllable) { - // disable control of actor if the actor is riding something? - if ((it as ActorHumanoid).vehicleRiding != null) { - it.vehicleRiding!!.processInput(gc, delta, input) - } - else { - it.processInput(gc, delta, input) - } + // actor process input + if (!ingame.consoleHandler.isTakingControl) { + if (ingame.canPlayerControl) { + ingame.actorContainer.forEach { + if (it is Controllable) { + // disable control of actor if the actor is riding something? + if ((it as ActorHumanoid).vehicleRiding != null) { + it.vehicleRiding!!.processInput(gc, delta, input) + } + else { + it.processInput(gc, delta, input) } - } - } - else { - ingame.uiContainer.forEach { - it.processInput(gc, delta, input) } } } else { - ingame.consoleHandler.processInput(gc, delta, input) + ingame.uiContainer.forEach { + it.processInput(gc, delta, input) + } } + } + else { + ingame.consoleHandler.processInput(gc, delta, input) + } - /////////////////// - // MOUSE CONTROL // - /////////////////// + /////////////////// + // MOUSE CONTROL // + /////////////////// - // Use item: assuming the player has only one effective grip (EquipPosition.HAND_GRIP) - if (ingame.player != null && ingame.canPlayerControl) { - if (input.isMouseButtonDown(Terrarum.getConfigInt("mouseprimary")) || input.isMouseButtonDown(Terrarum.getConfigInt("mousesecondary"))) { - val itemOnGrip = ingame.player!!.inventory.itemEquipped[InventoryItem.EquipPosition.HAND_GRIP] + // Use item: assuming the player has only one effective grip (EquipPosition.HAND_GRIP) + if (ingame.player != null && ingame.canPlayerControl) { + if (input.isMouseButtonDown(Terrarum.getConfigInt("mouseprimary")) || input.isMouseButtonDown(Terrarum.getConfigInt("mousesecondary"))) { + val itemOnGrip = ingame.player!!.inventory.itemEquipped[InventoryItem.EquipPosition.HAND_GRIP] - if (itemOnGrip != null) { - if (input.isMouseButtonDown(Terrarum.getConfigInt("mouseprimary"))) { - ingame.player!!.consumePrimary(itemOnGrip) - } - if (input.isMouseButtonDown(Terrarum.getConfigInt("mousesecondary"))) { - ingame.player!!.consumeSecondary(itemOnGrip) - } + if (itemOnGrip != null) { + if (input.isMouseButtonDown(Terrarum.getConfigInt("mouseprimary"))) { + ingame.player!!.consumePrimary(itemOnGrip) + } + if (input.isMouseButtonDown(Terrarum.getConfigInt("mousesecondary"))) { + ingame.player!!.consumeSecondary(itemOnGrip) } } } - - - ///////////////////// - // GAMEPAD CONTROL // - ///////////////////// } + + + ///////////////////// + // GAMEPAD CONTROL // + ///////////////////// } fun keyPressed(key: Int, c: Char) { + + + + if (ingame.canPlayerControl) { + ingame.player?.keyPressed(key, c) + } + + if (Terrarum.getConfigIntArray("keyquickselalt").contains(key) + || key == Terrarum.getConfigInt("keyquicksel")) { + ingame.uiPieMenu.setAsOpen() + ingame.uiQuickBar.setAsClose() + } + + ingame.uiContainer.forEach { it.keyPressed(key, c) } // for KeyboardControlled UIcanvases } fun keyReleased(key: Int, c: Char) { + if (Terrarum.getConfigIntArray("keyquickselalt").contains(key) + || key == Terrarum.getConfigInt("keyquicksel")) { + ingame.uiPieMenu.setAsClose() + ingame.uiQuickBar.setAsOpen() + } + + ingame.uiContainer.forEach { it.keyReleased(key, c) } // for KeyboardControlled UIcanvases } fun mouseMoved(oldx: Int, oldy: Int, newx: Int, newy: Int) { - + ingame.uiContainer.forEach { it.mouseMoved(oldx, oldy, newx, newy) } // for MouseControlled UIcanvases } fun mouseDragged(oldx: Int, oldy: Int, newx: Int, newy: Int) { - + ingame.uiContainer.forEach { it.mouseDragged(oldx, oldy, newx, newy) } // for MouseControlled UIcanvases } fun mousePressed(button: Int, x: Int, y: Int) { - + ingame.uiContainer.forEach { it.mousePressed(button, x, y) } // for MouseControlled UIcanvases } fun mouseReleased(button: Int, x: Int, y: Int) { @@ -121,26 +139,29 @@ object GameController { if (itemOnGrip != null) { if (button == Terrarum.getConfigInt("mousePrimary")) { - itemOnGrip.endPrimaryUse(Terrarum.appgc, Terrarum.UPDATE_DELTA) + itemOnGrip.endPrimaryUse(Terrarum.appgc, Terrarum.delta) } if (button == Terrarum.getConfigInt("mouseSecondary")) { - itemOnGrip.endSecondaryUse(Terrarum.appgc, Terrarum.UPDATE_DELTA) + itemOnGrip.endSecondaryUse(Terrarum.appgc, Terrarum.delta) } } } + + + ingame.uiContainer.forEach { it.mouseReleased(button, x, y) } // for MouseControlled UIcanvases } } fun mouseWheelMoved(change: Int) { - + ingame.uiContainer.forEach { it.mouseWheelMoved(change) } // for MouseControlled UIcanvases } fun controllerButtonPressed(controller: Int, button: Int) { - + ingame.uiContainer.forEach { it.controllerButtonPressed(controller, button) } // for GamepadControlled UIcanvases } fun controllerButtonReleased(controller: Int, button: Int) { - + ingame.uiContainer.forEach { it.controllerButtonReleased(controller, button) } // for GamepadControlled UIcanvases } } diff --git a/src/net/torvald/terrarum/gameworld/GameWorld.kt b/src/net/torvald/terrarum/gameworld/GameWorld.kt index e6b1f47fa..2cbfc5300 100644 --- a/src/net/torvald/terrarum/gameworld/GameWorld.kt +++ b/src/net/torvald/terrarum/gameworld/GameWorld.kt @@ -225,6 +225,8 @@ class GameWorld(val width: Int, val height: Int) { fun inflctTerrainDamage(x: Int, y: Int, damage: Float): Boolean { val addr = LandUtil.getTileAddr(x, y) + //println("[GameWorld] ($x, $y) Damage: $damage") + if (terrainDamages[addr] == null) { // add new terrainDamages[addr] = damage } @@ -238,7 +240,7 @@ class GameWorld(val width: Int, val height: Int) { //println("[GameWorld] accumulated damage: ${terrainDamages[addr]}") // remove tile from the world - if (terrainDamages[addr]!! >= TileCodex[getTileFromTerrain(x, y)].strength) { + if (terrainDamages[addr] ?: 0f >= TileCodex[getTileFromTerrain(x, y)].strength) { setTileTerrain(x, y, 0) return true } diff --git a/src/net/torvald/terrarum/itemproperties/Calculate.kt b/src/net/torvald/terrarum/itemproperties/Calculate.kt index cca57367b..900539922 100644 --- a/src/net/torvald/terrarum/itemproperties/Calculate.kt +++ b/src/net/torvald/terrarum/itemproperties/Calculate.kt @@ -1,7 +1,6 @@ package net.torvald.terrarum.itemproperties -import net.torvald.terrarum.gameactors.roundInt -import net.torvald.terrarum.gameactors.sqrt +import net.torvald.terrarum.gameactors.* /** * Created by SKYHi14 on 2017-04-17. @@ -16,8 +15,8 @@ object Calculate { * * TODO Newtons as unit? */ - fun pickaxePower(material: Material): Float { - return 4f * material.forceMod.toFloat().sqrt() + fun pickaxePower(actor: ActorHumanoid, material: Material): Float { + return (4.0 * material.forceMod.toDouble().sqrt() * (actor.avStrength / 1000.0)).toFloat() } diff --git a/src/net/torvald/terrarum/itemproperties/InventoryItem.kt b/src/net/torvald/terrarum/itemproperties/InventoryItem.kt index 6c2e5acf7..d2fbcb161 100644 --- a/src/net/torvald/terrarum/itemproperties/InventoryItem.kt +++ b/src/net/torvald/terrarum/itemproperties/InventoryItem.kt @@ -1,6 +1,8 @@ package net.torvald.terrarum.itemproperties +import net.torvald.random.HQRNG import net.torvald.terrarum.ItemValue +import net.torvald.terrarum.gameactors.ActorInventory import net.torvald.terrarum.gameactors.Pocketed import net.torvald.terrarum.itemproperties.Material import net.torvald.terrarum.langpack.Lang @@ -12,7 +14,7 @@ import org.newdawn.slick.GameContainer */ abstract class InventoryItem : Comparable, Cloneable { - abstract val id: Int + abstract var id: Int /** * @@ -49,12 +51,23 @@ abstract class InventoryItem : Comparable, Cloneable { /** Single-use then destroyed (e.g. Tiles), aka negation of "stackable" */ abstract var consumable: Boolean + /** + * DYNAMIC means the item ID should be generated on the fly whenever the item is created. + * This is to be used with weapons/armours/etc where multiple instances can exist, and + * each of them should be treated as different item. + * + * ID Range: 32768..1048575 (ItemCodex.ITEM_DYNAMIC) + * + * The opposite of this is called STATIC and their example is a Block. + */ + open val isDynamic = false + /** * Where to equip the item */ - open var equipPosition: Int = EquipPosition.NULL + open val equipPosition: Int = EquipPosition.NULL - open var material: Material? = null + open val material: Material? = null /** * Apparent mass of the item. (basemass * scale^3) @@ -77,6 +90,7 @@ abstract class InventoryItem : Comparable, Cloneable { else throw NullPointerException("null input; nullify baseToolSize instead :p") } + var originalID = id /** * Scale of the item. @@ -226,4 +240,14 @@ abstract class InventoryItem : Comparable, Cloneable { return clonedItem } + + companion object { + fun generateNewDynamicID(inventory: ActorInventory): Int { + var ret: Int + do { + ret = HQRNG().nextInt(ItemCodex.ITEM_DYNAMIC.endInclusive + 1 - ItemCodex.ITEM_DYNAMIC.first) + ItemCodex.ITEM_DYNAMIC.first + } while (inventory.contains(ret)) + return ret + } + } } \ No newline at end of file diff --git a/src/net/torvald/terrarum/itemproperties/ItemCodex.kt b/src/net/torvald/terrarum/itemproperties/ItemCodex.kt index 1b41f96a4..bb57a59fa 100644 --- a/src/net/torvald/terrarum/itemproperties/ItemCodex.kt +++ b/src/net/torvald/terrarum/itemproperties/ItemCodex.kt @@ -46,7 +46,7 @@ object ItemCodex { // tile items (blocks and walls are the same thing basically) for (i in ITEM_TILES + ITEM_WALLS) { itemCodex[i] = object : InventoryItem() { - override val id: Int = i + override var id: Int = i override val isUnique: Boolean = false override var baseMass: Double = TileCodex[i].density / 1000.0 override var baseToolSize: Double? = null @@ -54,6 +54,7 @@ object ItemCodex { override val originalName = TileCodex[i % ITEM_WALLS.first].nameKey override var consumable = true override var inventoryCategory = Category.BLOCK + override var isDynamic = true init { itemProperties[IVKey.ITEMTYPE] = if (i in ITEM_TILES) @@ -103,19 +104,19 @@ object ItemCodex { // test copper pickaxe itemCodex[ITEM_STATIC.first] = object : InventoryItem() { - override val id = ITEM_STATIC.first + override var id = ITEM_STATIC.first override val isUnique = false override val originalName = "Test Pick" override var baseMass = 10.0 override var baseToolSize: Double? = 10.0 override var consumable = false - override var maxDurability = 147//606 // this much tiles before breaking + override var maxDurability = 64//606 // this much tiles before breaking override var durability = maxDurability.toFloat() override var equipPosition = EquipPosition.HAND_GRIP override var inventoryCategory = Category.TOOL private val testmaterial = Material( - 0,0,0,0,0,0,0,0,14,0.0 // quick test material Steel + 0,0,0,0,0,0,0,0,1,0.0 // quick test material Stone ) init { @@ -131,6 +132,7 @@ object ItemCodex { using = true // linear search filter (check for intersection with tilewise mouse point and tilewise hitbox) + // return false if hitting actors Terrarum.ingame!!.actorContainer.forEach { if (it is ActorWithPhysics && it.tilewiseHitbox.intersects(mousePoint)) return false @@ -144,11 +146,12 @@ object ItemCodex { // filter passed, do the job val swingDmgToFrameDmg = delta.toDouble() / actorvalue.getAsDouble(AVKey.ACTION_INTERVAL)!! - return Terrarum.ingame!!.world.inflctTerrainDamage( + Terrarum.ingame!!.world.inflctTerrainDamage( gc.mouseTileX, gc.mouseTileY, - Calculate.pickaxePower(testmaterial) * swingDmgToFrameDmg.toFloat() + Calculate.pickaxePower(Terrarum.ingame!!.player!!, testmaterial) * swingDmgToFrameDmg.toFloat() ) + return true } override fun endPrimaryUse(gc: GameContainer, delta: Int): Boolean { @@ -164,6 +167,9 @@ object ItemCodex { // read from save (if applicable) and fill dynamicItemDescription } + /** + * Returns clone of the item in the Codex + */ operator fun get(code: Int): InventoryItem { if (code <= ITEM_STATIC.endInclusive) // generic item return itemCodex[code]!!.clone() // from CSV diff --git a/src/net/torvald/terrarum/virtualcomputer/peripheral/PeripheralVideoCard.kt b/src/net/torvald/terrarum/virtualcomputer/peripheral/PeripheralVideoCard.kt index c501fb308..3c7807f08 100644 --- a/src/net/torvald/terrarum/virtualcomputer/peripheral/PeripheralVideoCard.kt +++ b/src/net/torvald/terrarum/virtualcomputer/peripheral/PeripheralVideoCard.kt @@ -158,7 +158,7 @@ class PeripheralVideoCard(val host: TerrarumComputer, val termW: Int = 80, val t private val spriteBuffer = ImageBuffer(VSprite.width * 2, VSprite.height) fun render(g: Graphics) { - cursorBlinkTimer += Terrarum.UPDATE_DELTA + cursorBlinkTimer += Terrarum.delta if (cursorBlinkTimer > cursorBlinkTime) { cursorBlinkTimer -= cursorBlinkTime cursorBlinkOn = !cursorBlinkOn diff --git a/src/net/torvald/terrarum/weather/WeatherMixer.kt b/src/net/torvald/terrarum/weather/WeatherMixer.kt index 306b66289..75159eaac 100644 --- a/src/net/torvald/terrarum/weather/WeatherMixer.kt +++ b/src/net/torvald/terrarum/weather/WeatherMixer.kt @@ -151,7 +151,7 @@ object WeatherMixer { // interpolate R, G and B val scale = (timeInSec % dataPointDistance).toFloat() / dataPointDistance // [0.0, 1.0] - val newCol = CIELChabUtil.getGradient(scale, colourThis, colourNext) + val newCol = CIELabUtil.getGradient(scale, colourThis, colourNext) /* // very nice monitor code // 65 -> 66 | 300 | 19623 | RGB8(255, 0, 255) -[41%]-> RGB8(193, 97, 23) | * `230`40`160` diff --git a/GAME_SYSTEM.md b/work_files/GameDesign/BACKEND_DESIGN.md similarity index 100% rename from GAME_SYSTEM.md rename to work_files/GameDesign/BACKEND_DESIGN.md diff --git a/work_files/GameDesign/ECONOMY.md b/work_files/GameDesign/ECONOMY.md new file mode 100644 index 000000000..2d18df58f --- /dev/null +++ b/work_files/GameDesign/ECONOMY.md @@ -0,0 +1,14 @@ +## Economy ## + +Ref. How EVE Online's economy works and controlled + +* Mobs/People can be killed, and they drop resources: THEY PRINTS MONEY. +* If players die, some of (50 %?) their items are lost, forcing them to spend their money and resources. +* Items break, also forcing them to spend money (see below:) + +### Resource management ### + +* Tools/Weapons have durability + - And NOTHING IS INDESTRUCTIBLE (just cooldown time if they are "endgame" items, but not the weapon with highest damage -- see how Master Sword works in Zelda BotW) + - Relevant UIs are completed, so no turning back --Torvald, 2017-04-22 + diff --git a/ENVIRON.md b/work_files/GameDesign/ENVIRON.md similarity index 100% rename from ENVIRON.md rename to work_files/GameDesign/ENVIRON.md diff --git a/MISC_FEATURES.md b/work_files/GameDesign/MISC_FEATURES.md similarity index 100% rename from MISC_FEATURES.md rename to work_files/GameDesign/MISC_FEATURES.md diff --git a/MECHNANICS.md b/work_files/GameDesign/MISC_MECHNANICS.md similarity index 89% rename from MECHNANICS.md rename to work_files/GameDesign/MISC_MECHNANICS.md index 2e2403949..31b50eefb 100644 --- a/MECHNANICS.md +++ b/work_files/GameDesign/MISC_MECHNANICS.md @@ -42,13 +42,12 @@ Gemstones go elemental?! (pretty generic but otherwise there are no motivations ## Colouring ## -Natural: Use 4096 -Magical/Surreal: Use 24 Bits +Artificial: Use 4096 * Colouring of potion - Randomised, roguelike fashion - - Choose Col(R40, G40, B40) from set of finite cards: - 39, 39, 19, 19, 0, 0 + - Choose Col(RGB) from set of finite cards: + 255, 255, 128, 128, 0, 0 - MULTIPLY blend chosen colour with white texture @@ -146,15 +145,9 @@ see SAVE_FORMAT.md - Health: Regen per time - Magic: Out power per time - "I somewhat doubt this now..." --Torvald, 2017-03-12 + - "It won't work." --Torvald, 2017-04-22 -## Resource management ## - -* Tools/Weapons have durability - - And NOTHING IS INDESTRUCTIBLE (just cooldown time if they are "endgame" items, but not the weapon with highest damage -- see how Master Sword works in Zelda BotW) - - Hookshots are the exception! - - I was against it, but now I think it would make the game more playable --Torvald, 2017-03-12 - ## Civilisation ## diff --git a/work_files/Pickaxe Power.xlsx b/work_files/Pickaxe Power.xlsx index bc246eca2..6248c94b6 100644 Binary files a/work_files/Pickaxe Power.xlsx and b/work_files/Pickaxe Power.xlsx differ diff --git a/work_files/dwarven_name_selector/dwarvenNameSelector.py b/work_files/dwarven_name_selector/dwarvenNameSelector.py new file mode 100644 index 000000000..221eb8bcc --- /dev/null +++ b/work_files/dwarven_name_selector/dwarvenNameSelector.py @@ -0,0 +1,21 @@ +from random import randint + +size = 128 + +names = [] +keys = range(1, size + 1) + + +with open("language_DWARF.txt") as f: + names = [line.rstrip('\n') for line in f] + + +for i in range(0, size): + r = randint(0, size - 1) + t = keys[i] + keys[i] = keys[r] + keys[r] = t + + +for i in range(0, size): + print('"NAMESET_DWARVEN_%03d";"%s";') % (i + 1, names[keys[i]]) diff --git a/work_files/dwarven_name_selector/language_DWARF.txt b/work_files/dwarven_name_selector/language_DWARF.txt new file mode 100644 index 000000000..29ab159e2 --- /dev/null +++ b/work_files/dwarven_name_selector/language_DWARF.txt @@ -0,0 +1,2195 @@ +Kulet +Alak +Bidok +Nicol +Anam +Gatal +Mabdug +Zustash +Sedil +Ustos +Emär +Izeg +Bemòng +Gost +Öntak +Tosid +Feb +Berim +Ibruk +Ermis +Thoth +Thatthil +Gòstang +Libash +Lakish +Asdos +Roder +Nel +Biban +Ugog +Ish +Robek +Olmul +Nokzam +Emuth +Fer +Uvel +Dolush +Agêk +Ucat +Ngárak +Enir +Ugath +Lisig +Etäg +Erong +Osed +Lanlar +Udir +Tarmid +Sákrith +Nural +Bugsud +Okag +Nazush +Nashon +Âtrid +Enôr +Dùstik +Kogan +Ingish +Dudgoth +Stalkòb +Themor +Murak +Alåth +Osod +Thîkut +Cog +Selsten +Egdoth +Othsin +Idek +Ùst +Suthmam +Ím +Okab +Onlìl +Gasol +Tegir +Namàsh +Noval +Shalig +Shin +Lek +Äkim +Kâkdal +Stumäm +Alud +Olom +Ëlot +Rozsed +Thos +Okon +Nïng +Ostar +Rorul +Kovath +Åblel +Stal +Girtol +Kitïg +Lokast +Reked +Comníth +Sidos +Setnek +Ethbesh +Nug +Mokez +Cös +Idos +Ogîk +Utheg +Tílgil +Ebsas +Lurak +Tobul +Ilush +Dënush +Rimtar +Kun +Äs +Kiror +Nicat +Onshen +Rërith +Mafol +Sid +Ìtdùn +Tilat +Îtat +Egot +Dib +Oril +Bukog +Atot +Imik +Sudir +Odshith +Rag +Dodók +Sinsot +Es +Dostob +Gast +Élmeth +Romlam +Avéd +Darål +Ân +Oddom +Zägel +Og +Shatag +Om +Gisëk +Balad +Nekik +Dakas +Dolek +Sog +Rafar +Laltur +Îkeng +Dan +Ozsit +Dunan +Uling +Dîbesh +Berath +Zangin +Shadkik +Innok +Vukcas +Metul +Than +Gesul +Ustir +Torish +Memrut +Usal +Ôm +Angrir +Cagith +Momuz +Zas +Deshlir +Astesh +Ôfid +Mothram +Rít +Nolthag +Matul +Irtir +Unul +Urist +Umom +Dëm +Lodel +Kodor +Alod +Nökor +Asen +Råsh +Ursas +Vakun +Thol +Kizbiz +Uthgúr +Ônor +Gar +Terstum +Zagith +Noshtath +Ub +Ùk +Amur +Minran +Idar +Rodnul +Nuggad +Okbod +Tun +Måmgoz +Fak +Ogon +Rëmrit +Stidest +Zag +Kosak +Sub +Shegum +Addor +Talin +Zin +Åmmeb +Sakub +Tig +Edir +Tath +Vesh +Etest +Atír +Lorsïth +Rir +Em +Deb +Shuthraz +Èshgor +Rùkal +Acöb +Okir +Arngish +Zilir +Im +Ïssun +Ilus +Gedor +Ramtak +Sombith +Ker +Lînem +Umid +Seth +Sogdol +Shis +Er +Odroz +Urem +Nist +Ódad +Lithrush +Zotir +Zikel +Zikâth +Stagshil +Atöl +Ók +Ziril +Uthar +Tatlosh +Ngitkar +Dur +Keshan +Ned +Eststek +Ar +Ëtul +Låluth +Totmon +Bem +Fenglel +Gigin +Atham +Amug +Cabnul +Nog +Fotthor +Ìltang +Dumed +Geshud +Inglaz +Ézneth +Tiklom +Ïsir +Eshim +Lumash +Gishdist +Thîdas +Enog +Dozeb +Muz +Âst +Dushig +Bakat +Shistat +Goral +Kèbmak +Inod +Zisur +List +Olon +Ërtong +Ngotol +Kolad +Egen +Rúbal +Gintar +Figul +Fikod +Bebmal +Bavast +Kåtdir +Éthes +Igest +Reg +Ubur +Belbez +Nòm +Bunsoth +Limul +Kurig +Ugzol +Erib +Îgam +Mas +Zugob +Mashus +Isin +Mondûl +Siz +Saràm +Dal +Omer +Sumun +Gommuk +Usith +Nerrid +Zágod +Mithmis +Enol +Munèst +Bol +Ûz +Bål +Sitheb +Duthnur +Ilbåd +Rurast +Suton +Nuglush +Ulthush +Razes +Bistök +Èzum +Nil +Ùnil +Otad +Oddet +Thetdel +Golud +Ûd +Kadol +Lur +Dumur +Aknûn +Otel +Ser +Zanor +Ur +Bokbon +Èfim +Shash +Zon +Obur +Banik +Sebïr +Lirlez +Erlin +Inen +Åmât +Goster +Kunon +Tarag +Kiron +Lilum +Oggez +Bom +Stetár +Sikel +Unnos +Kisul +Ikus +Sheget +Famthut +Rorung +Idor +Enur +Kur +Fokásh +Vostaz +Ushil +Gumùr +Ular +Enen +Goshîst +Âzkob +Meb +Likot +Stëtnin +Zarut +Nelzur +Datan +Tabmik +Rinal +Ebgok +Soshosh +Bukshon +Stîgil +Lumen +Maton +Abol +Cim +Egath +Imketh +Ilned +Zuden +Emtan +Edëm +Nosîm +Vagúsh +Alis +Etar +Inshot +Zasit +Arzes +Äbor +Oth +Vakist +Ner +Bul +Ìddor +Onam +Ulol +Toral +Omoth +Erar +Govos +Orab +Dalkam +Subol +Gomath +Cerol +Mingkil +Detthost +Rerik +Lolor +Os +Istam +Giken +Od +Mengmad +Âmid +Bungek +Zedot +Thak +Tetóth +Romek +Utir +Ïlul +Uleng +Sosmil +Aval +Lushòb +Asin +Vunom +Vurtib +Gukil +Dimol +Lelgas +Nethgön +Itur +Avan +Mingus +Aroth +Udos +Imust +Shàmman +Rinmol +Muzish +Kôn +Stul +Thash +Kenis +Fathkal +Inob +Igril +An +Unob +Nalthish +Ostësh +Kel +Eddaz +Ekur +Arâl +Shar +Rimuk +Ottan +Shagul +Ònul +Egeth +Sôd +Dusak +Ovus +Gomòk +Stesok +Vankåb +Ïlon +Odês +Alen +Bobrur +Stoling +Dum +Zagstok +Ol +Gatis +Udler +Adesh +Usân +Kavud +Kirun +Shasad +Shoveth +Lathon +Um +Thubil +Egom +Ugith +Ngutug +Kez +Lärim +Ikûl +Semtom +Kib +Rotik +Ir +Stosêth +Kezol +Anan +Disuth +Rîthol +Tezul +Irol +Otam +Rodïm +Nunok +Umel +Ishlum +Kin +Mebzuth +Usib +Nar +Migrur +Egar +Dakon +Lod +Nir +Anön +Muved +Am +Vabôk +Ág +Ritas +Udril +Shigós +Dáthnes +Âgez +Mörul +Zulash +Logem +Abal +Kulin +Lerom +Gatin +Ul +Monom +Bisól +Ginok +Rumred +Ugeth +Thuveg +Gor +Damol +Elcur +Erok +Tok +Îm +Rèt +Shoner +Inrus +Mistêm +Midor +Nilgin +Merir +Nikuz +Kamuk +Enal +Zèler +Stibbom +Vildang +Arkoth +Lashëd +Kasith +Ngathsesh +Tashem +Besmar +Furgig +Nônub +Rushrul +Megob +Uvir +Ùshrir +Esrel +Bukèt +Nimak +Lestus +Fullut +Arkim +Imsal +Led +Unib +Ron +Udar +Borush +Detes +Umoz +Serkib +Vudthar +Razot +Atem +Ezuk +Vozbel +Toltot +När +Stukos +Ang +Nuden +Ikud +Memad +Eshik +Emgash +Tirist +Athel +Seng +Osdin +Ethram +Kamut +Locun +Selor +Igër +Id +Astås +Âbir +Mosus +Omthel +Odur +Istbar +Zodost +Dumat +Relon +Notlith +Suthån +Ilid +Tithleth +Kezar +Ast +Fath +Tölún +Nabid +Sibrek +Thining +Gasìs +Noglesh +Aroz +Tâmol +Nanul +Urrïth +Kikës +Askak +Kes +Abshoth +Ubas +Angish +Allas +Gembish +Urvad +Fel +Ingul +Nekut +Genlath +Shulmik +Lenod +Abras +Asol +Shethel +Urnût +Zursul +Othsal +Shedim +Arak +Tizöt +Taran +Bithit +Otik +Kerlîg +Lêned +Sodel +Ônam +Zuglar +Keskal +Nåst +Uvóth +Mîvid +Éth +Kafâsh +Ngumrash +Zokun +Eshom +Nesteth +Thebil +Ammesh +Ral +Reksas +Gesis +Osal +Anir +Nabreth +Dakäl +Rungak +Nekol +Anriz +Kosh +Noth +Tharnas +Gansit +Bàgoz +Bim +Themthir +Sakil +Tekmok +Rasuk +Gäzot +Tozör +Tob +Kal +Eshtân +Mezum +Umar +Zeber +Geles +Therleth +Tinan +Zekrim +Magel +Adur +Ezar +Bonun +Bûnem +Egur +Unol +Vod +Lal +Debish +Bushos +Lokum +Thortith +Omât +Sethal +Soshor +Thocit +Esesh +Lûrit +Ubal +Òstob +Lashid +Usur +Kob +Kigok +Bekom +Magak +Vës +Estrith +Gongith +Dugud +Zat +Nomal +Oltud +Savot +Vîr +Dustîk +Shìstsak +Risid +Deler +Aztong +Gïnon +Sholil +Ecut +Mëtin +Lam +Togal +Mot +Nîles +Nefast +Atith +Rêg +Emen +Äkig +Abod +Sat +Timad +Ibas +Othob +Fûbeg +Tunur +Idgag +Eb +Omshit +Ibes +Oceg +Akuth +Isram +Ad +Imgoz +Nis +Stot +Ögred +Sined +Tecàk +Subet +Urmim +Obash +Dastot +Udib +Enkos +Kesh +Kidet +Ob +Thilség +Asteb +Akmesh +Vim +Angzak +Gakit +Rëcus +Kurik +Unkíl +Mez +Erith +Kalur +Arros +Amud +Nobgost +Tan +Lïd +Ashok +Nod +Nin +Rakust +Melbil +Nol +Raz +Dostust +Tat +Stïvut +Sigun +Urdim +Kälán +Shelret +Ïggal +Rëdreg +Idräth +Datlad +Ilral +Borik +Meden +Vafig +Tízen +Dizesh +Kobem +Cavor +Shilràr +Segun +Messog +Bukith +Bufut +Nilim +Ingtak +Damor +Gim +Nob +Eknar +Mengib +Isrir +Ishëm +Ticek +Mer +Othâsh +Kôkdath +Distat +Nirur +Kiret +Thisrid +Vucar +Kizab +Tudrug +Sêgam +Amluth +Nozush +Mirstal +Zamoth +Bomik +Munsog +Razmer +Liruk +Geget +Zenon +Okol +Torir +Stodir +Ôggon +Tikis +Unos +Legon +Alnis +Ïkor +Tathtak +Lidod +Azin +Isden +Uker +Kussad +Nilun +Bamgûs +Adril +Koshmot +Âl +Umgush +Senel +Sital +Kil +Kol +Bomrek +Boket +Atil +Iklist +Volal +Lish +Omrist +Ud +Fesh +Akath +Lim +Damîd +Anur +Kulal +Lolum +Ducim +Vesrul +Urosh +Akith +Lêrush +Ethír +Îd +Budam +Inol +Okang +Ging +Rilem +Kizest +Kebösh +Shesam +Ber +Zan +Zust +Enshal +Nastid +Ultèr +Ag +Zareth +Tislam +Doren +Róth +Nåzom +Akrul +Gusil +Kilrud +Lolok +Lemlor +Ivom +Fikuk +Gulgun +Kast +Usir +Sodzul +Stòkïd +Etas +Otil +Sosad +Nïr +Anban +Dithbish +Ekir +Onol +Godum +Lîlar +Ib +Etur +Rithul +Óboth +Al +Zimkel +Bimmon +Äkil +Tezad +Lâven +Sashas +Sezuk +Saneb +Kik +Dasnast +Itêg +Okil +Esis +Buris +Ecem +Kekath +Nas +Nursher +Limâr +Sostet +Ken +Estil +Oram +Galthor +Nefek +Gabet +Idok +Tetthush +Ukath +Igang +Ushul +Sil +Kar +Thur +Nitom +Azzin +Selen +Gadan +Osor +Thalal +Onesh +Guz +Êsik +Thestar +Astis +Ôtthat +Lisid +Nalish +Ozor +Ceshfot +Dok +Edos +Anzish +Lûk +Semor +Mulåsh +Âm +Kutam +Eges +Fimshel +Egul +Tesum +Cubor +Enseb +Idith +Edim +Vetek +Gérig +Lecad +Sterus +Umåm +Anil +Nobang +Atêsh +Umril +Milol +Rigòth +Èrith +Thazor +Gashcoz +Bor +Fôker +Megid +Elik +Tekkud +Olin +Ìrlom +Stemel +Inem +Lulâr +Zolak +Gärem +Gidur +Aban +Nebïn +Zasgim +Thólthod +Iden +Össek +Amkol +Löbor +Shùrrat +Kêdnath +Titthal +Stisträs +Tetist +Riras +Töras +Gekur +Gudos +Durad +Zêvut +Adil +Ngesgäs +Stettad +Shosêl +Udil +Litast +Arel +Otin +Vel +Avuz +Rithlut +Tomus +Dugan +Kalal +Shoshin +Eser +Îbmat +Kebul +Asiz +Almôsh +Rur +Rutod +Vumom +Orrun +Taron +Sárek +Ugosh +Esmul +Kisat +Il +Rinul +Mukar +Amkin +Mosos +Rith +Tòm +Bugud +Otung +Zoz +Umshad +Dasël +Lames +Lavath +Ozur +Zotthol +Nan +Rorash +Nguteg +Ôsust +Umäm +Instol +Kesting +Ebbus +Bobet +Ong +Zokgen +Räduk +Zunek +Kezat +Kadän +Sar +Êlbem +Ertal +Râmol +Girust +Nabas +Lozlok +Ongos +Shusug +Tongus +Tustzal +Kùgneb +Gamil +Gingim +Arin +Govûl +Vetor +Sharsid +Nakis +Lanir +Ikùl +Nakbab +Nimem +Numol +Urol +Atul +Deg +Onul +Ägash +Bogsosh +Ushang +Emal +Ethzuth +Gathil +Kebon +Sutung +Nizdast +Mimkot +Vir +Tumam +Osstam +Kulsim +Gemis +Êr +Fenok +Igrish +Urus +Rodem +Zengod +Íster +Luskal +Kìrar +Ilas +Anûz +Angen +Desis +Damèl +Assog +Usen +Babin +Tustem +Debben +Kabat +Âtast +Ebal +Lanzil +Belar +Solam +Ór +Nucam +Letom +Mengthul +Thêmnol +Linòn +Vuthil +Rersîr +Oltar +Domas +Asmel +Nish +Mamot +Nakuth +Udist +Ost +Shadust +Morus +Akrel +Kith +Bomel +Orngim +Ngubmul +Mat +Nulom +Ustan +Buzat +Thob +Tilesh +Gecast +Aran +Stëlmith +Dolil +Amem +Kasben +Fashuk +Ûbom +Mostod +Mangròd +Keng +Odkish +Roduk +Eggut +Bumal +Kurel +Kithìn +Nurom +Shomad +Doshet +Lål +Lun +Kugik +Tulon +Zoden +Nangês +Rifot +Kastar +Zefon +Kovest +Madush +Tårem +Shèrel +Goden +Birut +Shorast +Meng +Olthez +Litez +Mizês +Nonshut +Lårul +Tusung +Ullung +Minbaz +Zethruk +Kûbuk +Kivish +Rithog +Rabed +Rusest +Omtug +Stektob +Zimun +Num +Oslan +Mis +Salul +Langgud +Mugshith +Lòr +Mishthem +Sibnir +Zansong +Or +Est +Thistus +Bot +Aned +Absam +Vuzded +Emet +Luzat +Duthal +Cugshil +Shasar +Emdush +Shungmag +Zar +Luror +Manthul +Sholkik +Sankest +Othud +Ngithol +Udesh +Afen +Dast +Nothis +Îmäz +Sosh +Zalud +Geth +Udiz +Nitig +Ziksis +Midrim +Urthaz +Vuknud +Sïsal +Thum +Arösh +Guthstak +Asën +Neshast +Tenshed +Catten +Lêgan +Àlil +Nukad +Rakas +Bibar +Nitem +Vanel +Som +Gutid +Ros +Sestan +Ganad +Ardes +Tobot +Niral +Zavaz +Tellist +Umgan +Kesham +Azmol +Thokdeg +Dolok +Detgash +Zocuk +Gulnas +Arek +Rath +Ngotûn +Zocol +Evost +Lotol +Farash +Ruken +Enas +Isul +Miroth +Mor +Äsrath +Shed +Tabar +Lushût +Åm +Sut +Saruth +Ärged +Aral +Solon +Zulban +Stanïr +Lorbam +Såkzul +Kat +Teskom +Räm +Koshosh +Moldath +Ûlosh +Kúd +Masos +Fastam +Isan +Betan +Thibam +Elol +Uvar +Rul +Zaled +Esar +Kàs +Zìzcun +Vathem +Mïshak +Dubmen +Akam +Osram +Kuthdêng +Assar +Shizek +Mingtuth +Rafum +Omet +Merseth +Ós +Itnet +Gïsstir +Dalem +Ïdath +Gemsit +Ashzos +Enten +Nomes +Birir +Kukon +Âgoth +Ágesh +Dalzat +Tad +Mëlist +Ison +Rokel +Arceth +Rimad +Shigin +Kastol +Ruzos +Sharul +Omtäl +Eren +Sobìr +Noram +Dèg +Neth +Okin +Maskir +Dugal +Shagog +Shazak +Tinöth +Thir +Necak +Ital +Nulral +Ìnal +Gomóm +Vumshar +Borlon +Ngobol +Gireth +Okun +Rovol +Thulom +Kanzud +Lòråm +Rosat +Ottem +Duthtish +Thestkig +Thabost +Vúsh +Cuggán +Obok +Muthir +Rovod +Uzar +Kor +Amas +Ashmôn +Bisek +Zaneg +Gósmer +Zimesh +Bothon +Losis +Ildom +Azuz +Golast +Ednàd +Evon +Arom +Ninur +Conngim +Fongbez +Arrug +Avûsh +Rimís +Thokit +Agseth +Sharast +Bardum +Givel +Åm +Nikot +Arist +Sheced +Stin +Zoluth +Mestthos +Ineth +Amost +Oklit +Deduk +Mûthkat +Kosoth +Îgbit +Oshgât +Tazuk +Imbit +Bërûl +Sarvesh +Zuntîr +Sazir +Ekast +Desgir +Stâkud +Gonggash +Uzol +Moshnún +Urir +Geshak +Lektad +Akir +Zalìs +Teshkad +Kudust +Sastres +Becor +Noböt +Tokthat +Gishgil +Lândar +Karas +Etom +Thomal +Emad +Tangath +Ezost +Vath +Zakgol +Stibmer +Mìshos +Teling +Lased +Rintor +Îstlig +Tîrdug +Bab +Stingbol +Gethust +Maram +Nidòst +Bashnom +Ekzong +Thusest +Bocash +Dedros +Akur +Îcum +Etvuth +Tömud +Datur +Tishis +Lir +Darùd +Nugreth +Zim +Avum +Ishash +Tel +Ilrom +Unâl +Cilob +Ïngiz +Dakost +Kobel +Sheshek +Tolis +Gothum +Adek +Ibel +Lesast +Étol +Adas +Custith +Minkot +Îton +Sholèb +Degël +Uvash +Kumil +Fidgam +Lar +Stinthäd +Kemsor +Onrel +Sefol +Edzul +Nisgak +Dotir +Kàlreth +Alek +Resíl +Umstiz +Kêshshak +Sirab +Shaketh +Tatek +Isos +Ocîg +Atzul +Sebsúr +Odom +Arust +Götom +Sulus +Lensham +Geb +Ozon +Ngegdol +Storlut +Bekar +Gan +Zamnuth +Edtûl +Nolêth +Thabum +Astod +Ruthösh +Lisat +Zagug +Gudas +Sesh +Oshéb +Olil +Ustuth +Tholtig +Medtob +Asob +Gåkïz +Shem +Nadak +Nirmek +Imush +Kogsak +Ïteb +Dîshmab +Atîs +Tôsed +Kikrost +Ngalák +Takùth +Nunùr +Vukrig +Rerras +Arôl +Sosas +Rûl +Tholest +Tishak +Tharith +Vutram +Shotom +Ïlun +Râluk +Vosut +Sûbil +Ifin +Okosh +Zafal +Rulush +Gikut +Rem +Thikthog +Idash +Tathtat +Mesir +Lirér +Îlkeb +Adag +Isak +Kekim +Bâsen +Koman +Imesh +Shetbêth +Ulåb +Dogik +Rodim +Kathil +Öndin +Mekur +Enoz +Satneng +Rotig +Sofûsh +Asrer +Ozleb +Etath +Rumad +Esäst +Suvas +Bal +Oshot +Stelid +Med +Inir +Sîbosh +Lunrud +Olum +Shuk +Ôler +Stizash +Gusgash +Ïtsas +Edan +Ked +Ungèg +Merrang +Gudid +Kashez +Amal +Athnîr +Shithath +Istik +Akmam +Timnär +Elis +Kan +Lelum +Othil +Othôs +Nentuk +Dural +Salir +Kulbet +Fazís +Thikén +Ûlmush +Mishar +Tastrod +Todör +Ostath +Thasdoth +Belal +Ston +Ríbar +Tunom +Kudar +Gébar +Nothok +Libad +Gemur +Elbel +Ennol +Amnek +Soloz +Musöd +Samam +Ethad +Eshon +Etóm +Èrnam +Kethil +Enam +Inush +Atol +Ösir +Vathez +Furàt +Kegeth +Cudïst +Laz +Kåtâk +Thedak +Lumnum +Ôsed +Orshar +Thad +Shan +Ellest +Odgúb +Inash +Stegëth +Zithis +Lerteth +Stistmig +Luslem +Sherik +Zukthist +Artob +Nëlas +Zes +Nêcik +Ûthir +Othlest +Ibesh +Fash +Anist +Òrdir +Rab +Orshet +Uzlir +Ginet +Eral +Ilash +Etnàr +Tomêm +Insél +Riril +Thimshur +Nokgol +Mözir +Igath +Gasir +Bubnus +Ïthod +Uthmik +Uben +Adbok +Ronush +Rikkir +Thiz +Lakàl +Rôber +Egast +Akgos +Zatam +Sholid +Akest +Thun +Gídthur +Immast +Sanreb +Mïkstal +Vudnis +Estun +Ozkak +Åkum +Kacoth +Etost +Arban +Kurol +Agsal +Rethal +Oshur +Vathsith +Bithsêst +Kezkíg +Kir +Shadmal +Ádol +Ablish +Shislug +Zutshosh +Ogtum +Batôk +Izkil +Ireg +Ushlub +Deleth +Thetust +Stigaz +Ethab +Emäth +Konad +Shukar +Idrom +Gubel +Egeb +Astel +Boshut +Uzan +Ranzar +Rîsen +Nakas +Gatiz +Erush +Shameb +Ushesh +Katthir +Íkthag +Rìthar +Sizir +Tost +Alûth +Ator +Kadôl +Istrath +Shos +Ulzest +Kastaz +Kod +Etes +Nosing +Merig +Fushur +Avog +Othör +Midil +Fevil +Ittás +Bakust +Bëmbul +Duz +Zeg +Edól +Kifed +Thet +Ostuk +Endok +Ushat +Ukosh +Lebes +Limúr +Ód +Desor +Amith +Ilir +Ishol +Otsus +Mogshum +Ishen +Kíddir +Meban +Gúr +Rodum +Monang +Thosbut +Atêk +Edod +Astan +Tangak +Sacat +Dôbar +Komut +Dimshas +Olnen +Tathur +Evud +Oshosh +Orstist +Kab +Talul +Sokan +Nanir +Irid +Tögum +Asdûg +Mes +Nasod +Lemis +Stukón +Nanoth +Kokeb +Óruk +Zursùl +Mozib +Gorroth +Egståk +Asàs +Zalstom +Ikal +Esdor +Rilbet +Dezrem +Sebshos +Nebél +Gethor +Ralâth +Baros +Iseth +Cenäth +Leshal +Sanád +Rithzâm +Kordam +Roldeth +Ugut +Arbost +Sedish +Tadar +Azoth +Osresh +Eddud +Artum +Dallith +Siknug +Vashzud +Ngilok +Ilon +Ìlud +Gemesh +Rashgur +Mothdast +Dák +Thukkan +Alron +Ungòb +Útost +Bel +Sanus +Kithäl +Theb +Konos +Neb +Itred +Ecosh +Cegol +Luthoz +Thastith +Remang +Athser +Ngusham +Gingik +Rangab +Kontuth +Letmos +Mishim +Losush +Othbem +Bêngeng +Lasgan +Utal +Sedur +Engig +Sunggor +Thistun +Köshdes +Ngefel +Umer +Uleb +Náshas +Rômab +Sezom +Shashdon +Mëbnith +Kán +Gitnuk +Daros +Nokim +Mostib +Thethrus +Kagmel +Bidnoz +Elbost +Oten +Ushdish +Kitung +Nubam +Onget +Dëngstam +Nimar +Gelut +Nisûn +Tarem +Nam +Kozoth +Tokmek +Ed +Et +Thunen +Shokmug +Vutok +Zanos +Torad +Berdan +Nal +Mosol +Othduk +Kinem +Zatthud +Nabår +Rirnöl +Lised +Danman +Nirkún +Mubun +Lushôn +Kot +Ritan +Nóton +Turel +Cemosh +Dosîm +Musar +Misttar +Obot +Baktus +Tagùz +Mâtzang +Shoduk +Ronstiz +Ubbul +Zutthan +Oshnïl +Ushal +Ograd +Tumos +Korsid \ No newline at end of file