From 64ef30e445e8f5bf5a3a4a1cd9585d38ff6169ab Mon Sep 17 00:00:00 2001 From: minjaesong Date: Fri, 8 Sep 2023 02:14:29 +0900 Subject: [PATCH] shorter share code if allowed; flickering teleporter beams --- .../sprites/fixtures/portal_device.tga | 4 +- .../spriteanimation/SpriteAnimation.kt | 4 ++ .../gameactors/FixtureWorldPortal.kt | 9 ++- .../terrarum/modulebasegame/ui/UIShare.kt | 10 +-- .../modulebasegame/ui/UIWorldPortalShare.kt | 10 +-- .../ui/UIWorldPortalUseInvitation.kt | 6 +- src/net/torvald/terrarum/serialise/Common.kt | 64 +++++++++++++++++++ .../sprites/fixtures/portal_device.kra | 4 +- 8 files changed, 86 insertions(+), 25 deletions(-) diff --git a/assets/mods/basegame/sprites/fixtures/portal_device.tga b/assets/mods/basegame/sprites/fixtures/portal_device.tga index da81ee798..dfd4683ec 100644 --- a/assets/mods/basegame/sprites/fixtures/portal_device.tga +++ b/assets/mods/basegame/sprites/fixtures/portal_device.tga @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:677d6ebe398b8aee6422fa77c507dabefac17e8ddcd07b4c0e183b4b1718d817 -size 10258 +oid sha256:3f2b92661ac6b6fd2728775be04b873516d6ae86a5720daf9bd16565b6e541fb +size 30738 diff --git a/src/net/torvald/spriteanimation/SpriteAnimation.kt b/src/net/torvald/spriteanimation/SpriteAnimation.kt index 0eecd2db9..005a624cf 100644 --- a/src/net/torvald/spriteanimation/SpriteAnimation.kt +++ b/src/net/torvald/spriteanimation/SpriteAnimation.kt @@ -34,6 +34,10 @@ abstract class SpriteAnimation(@Transient val parentActor: ActorWithBody) : Disp /** * This class should not be serialised; save its Animation Description Language instead. + * + * Maximum rows: 64 + * + * Maximum frames: unlimited */ class SheetSpriteAnimation(parentActor: ActorWithBody) : SpriteAnimation(parentActor) { diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureWorldPortal.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureWorldPortal.kt index 047d5d4ae..7e9f53a1d 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureWorldPortal.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureWorldPortal.kt @@ -1,6 +1,8 @@ package net.torvald.terrarum.modulebasegame.gameactors +import com.badlogic.gdx.graphics.g2d.SpriteBatch import net.torvald.random.XXHash64 +import net.torvald.spriteanimation.SheetSpriteAnimation import net.torvald.terrarum.* import net.torvald.terrarum.App.printdbg import net.torvald.terrarum.gameactors.AVKey @@ -48,7 +50,7 @@ class FixtureWorldPortal : Electric { density = 2900.0 setHitboxDimension(80, 32, 0, 0) makeNewSprite(TextureRegionPack(itemImage.texture, 80, 32)).let { - it.setRowsAndFrames(1,1) + it.setRowsAndFrames(1,3) } actorValue[AVKey.BASEMASS] = FixtureLogicSignalEmitter.MASS @@ -58,8 +60,9 @@ class FixtureWorldPortal : Electric { @Transient internal var teleportRequest: TeleportRequest? = null - override fun update(delta: Float) { - super.update(delta) + override fun drawBody(batch: SpriteBatch) { + (sprite as SheetSpriteAnimation).currentFrame = (Math.random() * 3).toInt() + super.drawBody(batch) } override fun onRisingEdge(readFrom: BlockBoxIndex) { diff --git a/src/net/torvald/terrarum/modulebasegame/ui/UIShare.kt b/src/net/torvald/terrarum/modulebasegame/ui/UIShare.kt index 3b10585ce..56ea9cabe 100644 --- a/src/net/torvald/terrarum/modulebasegame/ui/UIShare.kt +++ b/src/net/torvald/terrarum/modulebasegame/ui/UIShare.kt @@ -7,7 +7,9 @@ import net.torvald.terrarum.App import net.torvald.terrarum.INGAME import net.torvald.terrarum.imagefont.BigAlphNum import net.torvald.terrarum.langpack.Lang +import net.torvald.terrarum.serialise.Common import net.torvald.terrarum.serialise.toBig64 +import net.torvald.terrarum.serialise.toUint import net.torvald.terrarum.ui.Toolkit import net.torvald.terrarum.ui.UICanvas import net.torvald.terrarum.utils.PasswordBase32 @@ -28,15 +30,9 @@ class UIShare : UICanvas() { } private var shareCode = "" - private var dash = ' ' override fun show() { - shareCode = PasswordBase32.encode( - 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)}" - } + shareCode = Common.encodeUUID(INGAME.world.worldIndex) App.printdbg(this, shareCode) App.printdbg(this, INGAME.world.worldIndex) diff --git a/src/net/torvald/terrarum/modulebasegame/ui/UIWorldPortalShare.kt b/src/net/torvald/terrarum/modulebasegame/ui/UIWorldPortalShare.kt index 1deb28515..434ef8e47 100644 --- a/src/net/torvald/terrarum/modulebasegame/ui/UIWorldPortalShare.kt +++ b/src/net/torvald/terrarum/modulebasegame/ui/UIWorldPortalShare.kt @@ -9,6 +9,7 @@ import net.torvald.terrarum.INGAME import net.torvald.terrarum.gamecontroller.TerrarumKeyboardEvent import net.torvald.terrarum.imagefont.BigAlphNum import net.torvald.terrarum.langpack.Lang +import net.torvald.terrarum.serialise.Common import net.torvald.terrarum.serialise.toBig64 import net.torvald.terrarum.ui.Toolkit import net.torvald.terrarum.ui.UICanvas @@ -47,15 +48,10 @@ class UIWorldPortalShare(private val full: UIWorldPortal) : UICanvas() { } private var shareCode = "" - private var dash = ' ' override fun show() { - shareCode = PasswordBase32.encode( - 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)}" - } + shareCode = Common.encodeUUID(INGAME.world.worldIndex) + printdbg(this, shareCode) diff --git a/src/net/torvald/terrarum/modulebasegame/ui/UIWorldPortalUseInvitation.kt b/src/net/torvald/terrarum/modulebasegame/ui/UIWorldPortalUseInvitation.kt index 0563843a9..09d92ab43 100644 --- a/src/net/torvald/terrarum/modulebasegame/ui/UIWorldPortalUseInvitation.kt +++ b/src/net/torvald/terrarum/modulebasegame/ui/UIWorldPortalUseInvitation.kt @@ -9,6 +9,7 @@ import net.torvald.terrarum.gamecontroller.TerrarumKeyboardEvent import net.torvald.terrarum.langpack.Lang import net.torvald.terrarum.printStackTrace import net.torvald.terrarum.savegame.VirtualDisk +import net.torvald.terrarum.serialise.Common import net.torvald.terrarum.serialise.toBigInt64 import net.torvald.terrarum.ui.* 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 { it.clickOnceListener = { _, _ -> - val code = codeInput.getText().replace(" ", "") - val uuid = PasswordBase32.decode(code, 16).let { - UUID(it.toBigInt64(0), it.toBigInt64(8)) - } + val uuid = Common.decodeToUUID(codeInput.getText()) val world = App.savegameWorlds[uuid] App.printdbg(this, "Decoded UUID=$uuid") diff --git a/src/net/torvald/terrarum/serialise/Common.kt b/src/net/torvald/terrarum/serialise/Common.kt index 68bdfe259..726777cef 100644 --- a/src/net/torvald/terrarum/serialise/Common.kt +++ b/src/net/torvald/terrarum/serialise/Common.kt @@ -503,6 +503,70 @@ object Common { 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) \ No newline at end of file diff --git a/work_files/graphics/sprites/fixtures/portal_device.kra b/work_files/graphics/sprites/fixtures/portal_device.kra index b098c0783..aafcb55f0 100644 --- a/work_files/graphics/sprites/fixtures/portal_device.kra +++ b/work_files/graphics/sprites/fixtures/portal_device.kra @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d2a4baab0985714f449a330c2f8c5f9f694b0ed0b286dad82b7c09b648fdf436 -size 239733 +oid sha256:27f71dbef4b5a99010bced865641b9449603a33379d05bd51588d218b92c1389 +size 595677