shorter share code if allowed; flickering teleporter beams

This commit is contained in:
minjaesong
2023-09-08 02:14:29 +09:00
parent fbc700508f
commit 64ef30e445
8 changed files with 86 additions and 25 deletions

View File

@@ -34,6 +34,10 @@ abstract class SpriteAnimation(@Transient val parentActor: ActorWithBody) : Disp
/** /**
* This class should not be serialised; save its Animation Description Language instead. * This class should not be serialised; save its Animation Description Language instead.
*
* Maximum rows: 64
*
* Maximum frames: unlimited
*/ */
class SheetSpriteAnimation(parentActor: ActorWithBody) : SpriteAnimation(parentActor) { class SheetSpriteAnimation(parentActor: ActorWithBody) : SpriteAnimation(parentActor) {

View File

@@ -1,6 +1,8 @@
package net.torvald.terrarum.modulebasegame.gameactors package net.torvald.terrarum.modulebasegame.gameactors
import com.badlogic.gdx.graphics.g2d.SpriteBatch
import net.torvald.random.XXHash64 import net.torvald.random.XXHash64
import net.torvald.spriteanimation.SheetSpriteAnimation
import net.torvald.terrarum.* import net.torvald.terrarum.*
import net.torvald.terrarum.App.printdbg import net.torvald.terrarum.App.printdbg
import net.torvald.terrarum.gameactors.AVKey import net.torvald.terrarum.gameactors.AVKey
@@ -48,7 +50,7 @@ class FixtureWorldPortal : Electric {
density = 2900.0 density = 2900.0
setHitboxDimension(80, 32, 0, 0) setHitboxDimension(80, 32, 0, 0)
makeNewSprite(TextureRegionPack(itemImage.texture, 80, 32)).let { makeNewSprite(TextureRegionPack(itemImage.texture, 80, 32)).let {
it.setRowsAndFrames(1,1) it.setRowsAndFrames(1,3)
} }
actorValue[AVKey.BASEMASS] = FixtureLogicSignalEmitter.MASS actorValue[AVKey.BASEMASS] = FixtureLogicSignalEmitter.MASS
@@ -58,8 +60,9 @@ class FixtureWorldPortal : Electric {
@Transient internal var teleportRequest: TeleportRequest? = null @Transient internal var teleportRequest: TeleportRequest? = null
override fun update(delta: Float) { override fun drawBody(batch: SpriteBatch) {
super.update(delta) (sprite as SheetSpriteAnimation).currentFrame = (Math.random() * 3).toInt()
super.drawBody(batch)
} }
override fun onRisingEdge(readFrom: BlockBoxIndex) { override fun onRisingEdge(readFrom: BlockBoxIndex) {

View File

@@ -7,7 +7,9 @@ import net.torvald.terrarum.App
import net.torvald.terrarum.INGAME import net.torvald.terrarum.INGAME
import net.torvald.terrarum.imagefont.BigAlphNum import net.torvald.terrarum.imagefont.BigAlphNum
import net.torvald.terrarum.langpack.Lang import net.torvald.terrarum.langpack.Lang
import net.torvald.terrarum.serialise.Common
import net.torvald.terrarum.serialise.toBig64 import net.torvald.terrarum.serialise.toBig64
import net.torvald.terrarum.serialise.toUint
import net.torvald.terrarum.ui.Toolkit import net.torvald.terrarum.ui.Toolkit
import net.torvald.terrarum.ui.UICanvas import net.torvald.terrarum.ui.UICanvas
import net.torvald.terrarum.utils.PasswordBase32 import net.torvald.terrarum.utils.PasswordBase32
@@ -28,15 +30,9 @@ class UIShare : UICanvas() {
} }
private var shareCode = "" private var shareCode = ""
private var dash = ' '
override fun show() { override fun show() {
shareCode = PasswordBase32.encode( shareCode = Common.encodeUUID(INGAME.world.worldIndex)
INGAME.world.worldIndex.mostSignificantBits.toBig64() +
INGAME.world.worldIndex.leastSignificantBits.toBig64()
).let {
"${it.substring(0..3)}$dash${it.substring(4..5)}$dash${it.substring(6..10)}$dash${it.substring(11..15)}$dash${it.substring(16..20)}$dash${it.substring(21)}"
}
App.printdbg(this, shareCode) App.printdbg(this, shareCode)
App.printdbg(this, INGAME.world.worldIndex) App.printdbg(this, INGAME.world.worldIndex)

View File

@@ -9,6 +9,7 @@ import net.torvald.terrarum.INGAME
import net.torvald.terrarum.gamecontroller.TerrarumKeyboardEvent import net.torvald.terrarum.gamecontroller.TerrarumKeyboardEvent
import net.torvald.terrarum.imagefont.BigAlphNum import net.torvald.terrarum.imagefont.BigAlphNum
import net.torvald.terrarum.langpack.Lang import net.torvald.terrarum.langpack.Lang
import net.torvald.terrarum.serialise.Common
import net.torvald.terrarum.serialise.toBig64 import net.torvald.terrarum.serialise.toBig64
import net.torvald.terrarum.ui.Toolkit import net.torvald.terrarum.ui.Toolkit
import net.torvald.terrarum.ui.UICanvas import net.torvald.terrarum.ui.UICanvas
@@ -47,15 +48,10 @@ class UIWorldPortalShare(private val full: UIWorldPortal) : UICanvas() {
} }
private var shareCode = "" private var shareCode = ""
private var dash = ' '
override fun show() { override fun show() {
shareCode = PasswordBase32.encode( shareCode = Common.encodeUUID(INGAME.world.worldIndex)
INGAME.world.worldIndex.mostSignificantBits.toBig64() +
INGAME.world.worldIndex.leastSignificantBits.toBig64()
).let {
"${it.substring(0..3)}$dash${it.substring(4..5)}$dash${it.substring(6..10)}$dash${it.substring(11..15)}$dash${it.substring(16..20)}$dash${it.substring(21)}"
}
printdbg(this, shareCode) printdbg(this, shareCode)

View File

@@ -9,6 +9,7 @@ import net.torvald.terrarum.gamecontroller.TerrarumKeyboardEvent
import net.torvald.terrarum.langpack.Lang import net.torvald.terrarum.langpack.Lang
import net.torvald.terrarum.printStackTrace import net.torvald.terrarum.printStackTrace
import net.torvald.terrarum.savegame.VirtualDisk import net.torvald.terrarum.savegame.VirtualDisk
import net.torvald.terrarum.serialise.Common
import net.torvald.terrarum.serialise.toBigInt64 import net.torvald.terrarum.serialise.toBigInt64
import net.torvald.terrarum.ui.* import net.torvald.terrarum.ui.*
import net.torvald.terrarum.utils.PasswordBase32 import net.torvald.terrarum.utils.PasswordBase32
@@ -68,10 +69,7 @@ class UIWorldPortalUseInvitation(val full: UIWorldPortal) : UICanvas() {
{ Lang["MENU_LABEL_CONFIRM_BUTTON"] }, buttonBaseX + (goButtonWidth + gridGap) * 2, buttonY, goButtonWidth, alignment = UIItemTextButton.Companion.Alignment.CENTRE, hasBorder = true).also { { Lang["MENU_LABEL_CONFIRM_BUTTON"] }, buttonBaseX + (goButtonWidth + gridGap) * 2, buttonY, goButtonWidth, alignment = UIItemTextButton.Companion.Alignment.CENTRE, hasBorder = true).also {
it.clickOnceListener = { _, _ -> it.clickOnceListener = { _, _ ->
val code = codeInput.getText().replace(" ", "") val uuid = Common.decodeToUUID(codeInput.getText())
val uuid = PasswordBase32.decode(code, 16).let {
UUID(it.toBigInt64(0), it.toBigInt64(8))
}
val world = App.savegameWorlds[uuid] val world = App.savegameWorlds[uuid]
App.printdbg(this, "Decoded UUID=$uuid") App.printdbg(this, "Decoded UUID=$uuid")

View File

@@ -503,6 +503,70 @@ object Common {
return ByteArray64Reader(strToBytes(StringReader(s)), CHARSET).readText() return ByteArray64Reader(strToBytes(StringReader(s)), CHARSET).readText()
} }
fun encodeUUID(uuid: UUID): String {
val dash = ' '
val useShort = (uuid.mostSignificantBits.and(0xF000L) == 0x4000L && uuid.leastSignificantBits.ushr(62) == 0b10L)
/*(uuid.mostSignificantBits.toBig64() + uuid.leastSignificantBits.toBig64()).forEach {
print("${it.toUint().toString(2).padStart(8,'0')} ")
}
println()*/
val bytes = if (useShort) {
(uuid.mostSignificantBits.toBig64() +
uuid.leastSignificantBits.toBig64()).let {
it.sliceArray(0..5) +
(it[6].toUint().and(15).shl(4) or it[8].toUint().and(0x0F)).toByte() +
it[7] +
it.sliceArray(9..15) +
(it[8].toUint().and(0x30).shl(2)).toByte()
}
}
else {
uuid.mostSignificantBits.toBig64() +
uuid.leastSignificantBits.toBig64()
}
/*bytes.forEach {
print("${it.toUint().toString(2).padStart(8,'0')} ")
}
println()*/
return PasswordBase32.encode(bytes).let {
if (useShort)
"${it.substring(0..4)} ${it.substring(5..9)} ${it.substring(10..14)} ${it.substring(15..19)} ${it.substring(20..24)}"
else
"${it.substring(0..3)}$dash${it.substring(4..5)}$dash${it.substring(6..10)}$dash${it.substring(11..15)}$dash${it.substring(16..20)}$dash${it.substring(21)}"
}
}
fun decodeToUUID(str: String): UUID {
val code = str.replace(" ", "").trim()
val b = PasswordBase32.decode(code + (if (code.length == 25) "Y" else ""), 16)
/*b.forEach {
print("${it.toUint().toString(2).padStart(8,'0')} ")
}
println()*/
val bytes = if (code.length == 25) {
val b6 = b[6].toUint()
val jh = b[15].toUint().ushr(2) // 0b JJ00 0000 -> 0b 00JJ 0000
b.sliceArray(0..5) +
(b6.and(0xF0).ushr(4) or 0x40).toByte() +
b[7] +
(b6.and(0x0F) or jh or 0x80).toByte() +
b.sliceArray(8..14)
}
else b
/*bytes.forEach {
print("${it.toUint().toString(2).padStart(8,'0')} ")
}
println()*/
return UUID(bytes.toBigInt64(0), bytes.toBigInt64(8))
}
} }
class SaveLoadError(file: File?, cause: Throwable) : RuntimeException("An error occured while loading save file '${file?.absolutePath}'", cause) class SaveLoadError(file: File?, cause: Throwable) : RuntimeException("An error occured while loading save file '${file?.absolutePath}'", cause)