serialised RNG; font update

This commit is contained in:
minjaesong
2018-09-16 03:32:12 +09:00
parent 69eb2d7a3b
commit 967eafe8a3
36 changed files with 192 additions and 71 deletions

View File

@@ -1,5 +1,6 @@
package net.torvald.random
import net.torvald.terrarum.serialise.toLittle
import net.torvald.terrarum.serialise.toLittleLong
import org.apache.commons.codec.digest.DigestUtils
import java.util.Random
@@ -12,6 +13,11 @@ class HQRNG @JvmOverloads constructor(seed: Long = System.nanoTime()) : Random()
private var s0: Long
private var s1: Long
constructor(s0: Long, s1: Long) : this() {
this.s0 = s0
this.s1 = s1
}
init {
if (seed == 0L)
throw IllegalArgumentException("Invalid seed: cannot be zero")
@@ -30,4 +36,11 @@ class HQRNG @JvmOverloads constructor(seed: Long = System.nanoTime()) : Random()
s1 = x xor y xor (x ushr 17) xor (y ushr 26)
return s1 + y
}
fun serialize() = s0.toLittle() + s1.toLittle()
fun reseed(s0: Long, s1: Long) {
this.s0 = s0
this.s1 = s1
}
}

View File

@@ -179,7 +179,7 @@ public class AppLoader implements ApplicationListener {
TextureRegionPack.Companion.setGlobalFlipY(true);
fontGame = new GameFontBase("assets/graphics/fonts/terrarum-sans-bitmap", false, true, Texture.TextureFilter.Nearest, Texture.TextureFilter.Nearest);
fontGame = new GameFontBase("assets/graphics/fonts/terrarum-sans-bitmap", false, true, Texture.TextureFilter.Nearest, Texture.TextureFilter.Nearest, false);
}
@Override

View File

@@ -121,9 +121,9 @@ object Lang {
return ret2.replace('>', Terrarum.joypadLabelStart).capitalize()
return if (key.getEndTag().contains("bg"))
"${AppLoader.fontGame.charsetOverrideBulgarian}${ret2.capitalize()}${AppLoader.fontGame.charsetOverrideNormal}"
"${AppLoader.fontGame.charsetOverrideBulgarian}${ret2.capitalize()}${AppLoader.fontGame.charsetOverrideDefault}"
else if (key.getEndTag().contains("sr"))
"${AppLoader.fontGame.charsetOverrideSerbian}${ret2.capitalize()}${AppLoader.fontGame.charsetOverrideNormal}"
"${AppLoader.fontGame.charsetOverrideSerbian}${ret2.capitalize()}${AppLoader.fontGame.charsetOverrideDefault}"
else
ret2.capitalize()
}

View File

@@ -176,10 +176,10 @@ open class Ingame(batch: SpriteBatch) : IngameInstance(batch) {
val world: GameWorldExtension,
val historicalFigureIDBucket: ArrayList<Int>,
val realGamePlayer: IngamePlayer,
val rogueseed: Long,
val rogueiter: Int,
val weatherseed: Long,
val weatheriter: Int
val rogueS0: Long,
val rogueS1: Long,
val weatherS0: Long,
val weatherS1: Long
)
data class NewWorldParameters(
@@ -209,8 +209,8 @@ open class Ingame(batch: SpriteBatch) : IngameInstance(batch) {
// set the randomisers right
RoguelikeRandomiser.loadFromSave(gameSaveData.rogueseed, gameSaveData.rogueiter)
WeatherMixer.loadFromSave(gameSaveData.weatherseed, gameSaveData.weatheriter)
RoguelikeRandomiser.loadFromSave(gameSaveData.rogueS0, gameSaveData.rogueS1)
WeatherMixer.loadFromSave(gameSaveData.weatherS0, gameSaveData.weatherS1)
//initGame()
@@ -242,8 +242,6 @@ open class Ingame(batch: SpriteBatch) : IngameInstance(batch) {
historicalFigureIDBucket = ArrayList<Int>()
RoguelikeRandomiser.seed = HQRNG().nextLong()
// add new player and put it to actorContainer
//playableActorDelegate = PlayableActorDelegate(PlayerBuilderSigrid())

View File

@@ -1,29 +1,14 @@
package net.torvald.terrarum.modulebasegame
import net.torvald.random.HQRNG
import java.util.*
internal interface RNGConsumer {
val RNG: Random
var seed: Long
var iterations: Int
val RNG: HQRNG
fun loadFromSave(seed: Long, iterations: Int) {
this.seed = seed
this.iterations = iterations
repeat(iterations, { RNG.nextInt() })
}
private fun incIterations() {
iterations++
if (iterations < 0) iterations = 0
}
fun getRandomLong(): Long {
iterations++
return RNG.nextLong()
fun loadFromSave(s0: Long, s1: Long) {
RNG.reseed(s0, s1)
}
}

View File

@@ -0,0 +1,32 @@
package net.torvald.terrarum.modulebasegame.ui
import com.badlogic.gdx.graphics.Camera
import com.badlogic.gdx.graphics.g2d.SpriteBatch
import net.torvald.terrarum.Terrarum
import net.torvald.terrarum.ui.UICanvas
import net.torvald.terrarum.ui.UIItem
import java.io.File
/**
* @param savefile TEVd file
*
* Created by minjaesong on 2018-09-15.
*/
class UIItemSavegameInfoCell(
parent: UICanvas,
savefile: File,
override val width: Int,
override var posX: Int,
override var posY: Int
) : UIItem(parent) {
override val height: Int = Terrarum.fontGame.lineHeight.toInt() * 2
override fun render(batch: SpriteBatch, camera: Camera) {
}
override fun dispose() {
}
}

View File

@@ -0,0 +1,77 @@
package net.torvald.terrarum.modulebasegame.ui
import com.badlogic.gdx.graphics.Camera
import com.badlogic.gdx.graphics.Color
import com.badlogic.gdx.graphics.g2d.SpriteBatch
import net.torvald.terrarum.Second
import net.torvald.terrarum.Terrarum
import net.torvald.terrarum.blendNormal
import net.torvald.terrarum.serialise.SavegameLedger
import net.torvald.terrarum.ui.UICanvas
import net.torvald.terrarum.ui.UIItemList
/**
* Created by minjaesong on 2018-09-15.
*/
class UITitleCharactersList : UICanvas() {
override var openCloseTime: Second = 0f
private val moduleAreaHMargin = 48
private val moduleAreaBorder = 8
override var width = (Terrarum.WIDTH * 0.75).toInt() - moduleAreaHMargin
override var height = Terrarum.HEIGHT - moduleAreaHMargin * 2
private val moduleInfoCells = ArrayList<UIItemSavegameInfoCell>()
// build module list
init {
SavegameLedger.getSavefileList()?.forEachIndexed { index, file ->
}
}
private val mouduleArea = UIItemList<UIItemSavegameInfoCell>(
this,
moduleInfoCells,
(Terrarum.WIDTH * 0.25f).toInt(), moduleAreaHMargin,
width,
height,
inactiveCol = Color.WHITE,
border = moduleAreaBorder
)
init {
uiItems.add(mouduleArea)
}
override fun updateUI(delta: Float) {
mouduleArea.update(delta)
}
override fun renderUI(batch: SpriteBatch, camera: Camera) {
batch.color = Color.WHITE
blendNormal()
mouduleArea.render(batch, camera)
}
override fun doOpening(delta: Float) {
}
override fun doClosing(delta: Float) {
}
override fun endOpening(delta: Float) {
}
override fun endClosing(delta: Float) {
}
override fun dispose() {
}
}

View File

@@ -1,5 +1,6 @@
package net.torvald.terrarum.modulebasegame.ui
import net.torvald.terrarum.AppLoader
import java.util.*
@@ -33,10 +34,14 @@ object UITitleRemoConYaml {
val debugTools = """
- Development Tools $
- Building Maker
- Building Maker
- Start New Random Game
""".trimIndent()
operator fun invoke() = parseYamlList(menus)
operator fun invoke() = if (AppLoader.IS_DEVELOPMENT_BUILD)
parseYamlList(menus + "\n" + debugTools)
else
parseYamlList(menus)
fun parseYamlList(yaml: String): QNDTreeNode<String> {
var currentIndentLevel = -1

View File

@@ -35,8 +35,6 @@ import java.util.*
internal object WeatherMixer : RNGConsumer {
override val RNG = HQRNG()
override var seed = 0L
override var iterations = 0
var weatherList: HashMap<String, ArrayList<BaseModularWeather>>

View File

@@ -20,7 +20,6 @@ object RoguelikeRandomiser : RNGConsumer {
val coloursTaken: ArrayList<Col4096> = ArrayList()
override val RNG = HQRNG()
override var seed = 0L
private val POTION_HEAL_TIER1 = 0x00
private val POTION_HEAL_TIRE2 = 0x01
@@ -29,7 +28,6 @@ object RoguelikeRandomiser : RNGConsumer {
private val POTION_BERSERK_TIER1 = 0x20
override var iterations = 0
fun setupColours() {
@@ -55,13 +53,11 @@ object RoguelikeRandomiser : RNGConsumer {
fun shuffleArrayInt(ar: IntArray, rnd: Random) {
for (i in ar.size - 1 downTo 0) {
val index = rnd.nextInt(i + 1);
val index = rnd.nextInt(i + 1)
// Simple swap
val a = ar[index];
ar[index] = ar[i];
ar[i] = a;
iterations++
val a = ar[index]
ar[index] = ar[i]
ar[i] = a
}
}
}

View File

@@ -1,6 +1,5 @@
package net.torvald.terrarum.modulecomputers.virtualcomputer.terminal
import net.torvald.terrarumsansbitmap.slick2d.GameFontBase
import net.torvald.terrarum.blendMul
import net.torvald.terrarum.blendNormal
import java.util.*

View File

@@ -19,10 +19,7 @@ internal object WriteMeta {
val BYTE_NULL: Byte = 0
val terraseed: Long = WorldGenerator.SEED
val rogueseed: Long = RoguelikeRandomiser.seed
val rogueiter: Int = RoguelikeRandomiser.iterations
val weatherseed: Long = WeatherMixer.seed
val weatheriter: Int = WeatherMixer.iterations
/**
* Write save meta to specified directory. Returns false if something went wrong.