From 968a1a08880fb3acf3e0f24c2276be64ace7d8e2 Mon Sep 17 00:00:00 2001 From: minjaesong Date: Tue, 19 Mar 2019 13:32:51 +0900 Subject: [PATCH] weponmeleecore --- .gitignore | 1 + src/net/torvald/random/FudgeDice.kt | 12 ++++++-- src/net/torvald/terrarum/AppLoader.java | 10 ++++-- .../terrarum/itemproperties/GameItem.kt | 2 +- .../modulebasegame/items/WeaponMeleeCore.kt | 29 ++++++++++++++++++ src/net/torvald/util/SortedArrayList.kt | 1 + work_files/Attack momentum calculator.xlsx | Bin 30623 -> 17563 bytes 7 files changed, 49 insertions(+), 6 deletions(-) create mode 100644 src/net/torvald/terrarum/modulebasegame/items/WeaponMeleeCore.kt diff --git a/.gitignore b/.gitignore index c7d5284f0..bcec120a9 100644 --- a/.gitignore +++ b/.gitignore @@ -18,6 +18,7 @@ external_resource_packs.zip # IntelliJ workspace.xml +*/workspace.xml # Temporary files .tmp* diff --git a/src/net/torvald/random/FudgeDice.kt b/src/net/torvald/random/FudgeDice.kt index c30752a1e..a72a365a8 100644 --- a/src/net/torvald/random/FudgeDice.kt +++ b/src/net/torvald/random/FudgeDice.kt @@ -1,6 +1,6 @@ package net.torvald.random -import java.util.Random +import java.util.* /** * Created by minjaesong on 2016-02-03. @@ -20,7 +20,7 @@ open class FudgeDice */ fun roll(): Int { var diceResult = 0 - for (c in 0..diceCount - 1) { + for (c in 0 until diceCount) { diceResult += rollSingleDie() } @@ -29,12 +29,18 @@ open class FudgeDice /** * Roll dice and get result, for array index - * @return Normally distributed integer [0 , N] for N = 2 × DiceCounts + 1. 0 is the most frequent return. + * @return Normally distributed integer [0 , N] for N = 2 × DiceCounts + 1. (diceCount) is the most frequent return. */ fun rollForArray(): Int { return roll() + diceCount } + fun rollForArray(array: Array): T = array[rollForArray()] + fun rollForArray(intArray: IntArray): Int = intArray[rollForArray()] + fun rollForArray(longArray: LongArray): Long = longArray[rollForArray()] + fun rollForArray(floatArray: FloatArray): Float = floatArray[rollForArray()] + fun rollForArray(doubleArray: DoubleArray): Double = doubleArray[rollForArray()] + val sizeOfProbabilityRange: Int get() = 2 * diceCount + 1 diff --git a/src/net/torvald/terrarum/AppLoader.java b/src/net/torvald/terrarum/AppLoader.java index 987dfb3dc..eec8e6b2b 100644 --- a/src/net/torvald/terrarum/AppLoader.java +++ b/src/net/torvald/terrarum/AppLoader.java @@ -58,7 +58,7 @@ public class AppLoader implements ApplicationListener { *

* e.g. 0x02010034 will be translated as 2.1.52 */ - public static final int VERSION_RAW = 0x00_02_04B1; + public static final int VERSION_RAW = 0x00_02_0590; public static final String getVERSION_STRING() { return String.format("%d.%d.%d", VERSION_RAW >>> 24, (VERSION_RAW & 0xff0000) >>> 16, VERSION_RAW & 0xFFFF); @@ -596,7 +596,13 @@ public class AppLoader implements ApplicationListener { ); fontSmallNumbers = TinyAlphNum.INSTANCE; - audioDevice = Gdx.audio.newAudioDevice(48000, false); + try { + audioDevice = Gdx.audio.newAudioDevice(48000, false); + } + catch (NullPointerException deviceInUse) { + deviceInUse.printStackTrace(); + System.err.println("[AppLoader] failed to create audio device: Audio device occupied by Exclusive Mode Device? (e.g. ASIO4all)"); + } // if there is a predefined screen, open that screen after my init process if (injectScreen != null) { diff --git a/src/net/torvald/terrarum/itemproperties/GameItem.kt b/src/net/torvald/terrarum/itemproperties/GameItem.kt index 1b682eefe..c8d54f26d 100644 --- a/src/net/torvald/terrarum/itemproperties/GameItem.kt +++ b/src/net/torvald/terrarum/itemproperties/GameItem.kt @@ -48,7 +48,7 @@ abstract class GameItem : Comparable, Cloneable { var nameColour = Color.WHITE - /** In kg */ + /** In kg. Weapon with different material must have different mass. In this case, you MUST use IRON as a reference (or default) material. */ abstract var baseMass: Double /** In kg */ diff --git a/src/net/torvald/terrarum/modulebasegame/items/WeaponMeleeCore.kt b/src/net/torvald/terrarum/modulebasegame/items/WeaponMeleeCore.kt new file mode 100644 index 000000000..260cd4ddc --- /dev/null +++ b/src/net/torvald/terrarum/modulebasegame/items/WeaponMeleeCore.kt @@ -0,0 +1,29 @@ +package net.torvald.terrarum.modulebasegame.items + +import net.torvald.random.Fudge3 +import net.torvald.random.HQRNG +import net.torvald.terrarum.itemproperties.GameItem +import net.torvald.terrarum.modulebasegame.gameactors.ActorHumanoid +import kotlin.math.pow + +/** + * Created by minjaesong on 2019-03-17. + */ +object WeaponMeleeCore { + + val SQRT2 = Math.sqrt(2.0) + + private val dF3 = Fudge3(HQRNG()) + private val randomiser = doubleArrayOf(0.94, 0.96, 0.98, 1.0, 1.02, 1.04, 1.06) + + private fun randomise() = dF3.rollForArray(randomiser) + private fun getAttackMomentum(weapon: WeaponMeleeBase, actor: ActorHumanoid) = + weapon.mass * weapon.material.density * weapon.velocityMod * actor.scale.pow(SQRT2) // TODO multiply racial strength from RaceCodex + fun getAttackPower(weapon: WeaponMeleeBase, actor: ActorHumanoid, actee: ActorHumanoid) = + getAttackMomentum(weapon, actor) * randomise() * maxOf(1.0, (actee.hitbox.endY - actor.hitbox.startY) / actee.hitbox.height) + +} + +abstract class WeaponMeleeBase : GameItem() { + abstract val velocityMod: Double +} \ No newline at end of file diff --git a/src/net/torvald/util/SortedArrayList.kt b/src/net/torvald/util/SortedArrayList.kt index a49c51e0b..28a8df196 100644 --- a/src/net/torvald/util/SortedArrayList.kt +++ b/src/net/torvald/util/SortedArrayList.kt @@ -16,6 +16,7 @@ class SortedArrayList>(initialSize: Int = 10) { */ fun add(elem: T) { // don't append-at-tail-and-sort; just insert at right index + // this is a modified binary search to search the right "spot" where the insert elem fits ReentrantLock().lock { var low = 0 var high = arrayList.size diff --git a/work_files/Attack momentum calculator.xlsx b/work_files/Attack momentum calculator.xlsx index e8cf48424520552033c99c128e80d350e481d2b7..4f0cb8437a8a945e4005e685c4f61daa601cfc45 100644 GIT binary patch delta 6927 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