mirror of
https://github.com/curioustorvald/Terrarum.git
synced 2026-06-12 03:24:06 +09:00
redeem code gen wip
This commit is contained in:
@@ -46,7 +46,7 @@ object RedeemCodeMachine {
|
|||||||
"umonataj kunvenauw, sed nature a"
|
"umonataj kunvenauw, sed nature a"
|
||||||
).map { MessageDigest.getInstance("SHA-256").digest(it.toByteArray()) }
|
).map { MessageDigest.getInstance("SHA-256").digest(it.toByteArray()) }
|
||||||
|
|
||||||
fun encode(itemID: ItemID, amountIndex: Int, isUnique: Boolean, receiver: UUID? = null, msgType: Int = 0, arg1: String = "", arg2: String = ""): String {
|
fun encode(itemID: ItemID, amountIndex: Int, isUnique: Boolean, receiver: UUID? = null, msgType: Int = 0, args: String = ""): String {
|
||||||
// filter item ID
|
// filter item ID
|
||||||
val itemType = itemID.substringBefore("@")
|
val itemType = itemID.substringBefore("@")
|
||||||
val (itemModule, itemNumber0) = itemID.substringAfter("@").split(":")
|
val (itemModule, itemNumber0) = itemID.substringAfter("@").split(":")
|
||||||
@@ -72,7 +72,24 @@ object RedeemCodeMachine {
|
|||||||
bytes[3] = itemNumber.toByte() // 0b item number low
|
bytes[3] = itemNumber.toByte() // 0b item number low
|
||||||
bytes[4] = itemNumber.ushr(8).toByte()// 0b item number high
|
bytes[4] = itemNumber.ushr(8).toByte()// 0b item number high
|
||||||
|
|
||||||
// TODO ascii to baudot
|
// convert ascii to baudot
|
||||||
|
val paddedTextBits = (asciiToBaudot(args) + "00000").let { // always end the message with NUL
|
||||||
|
// then fill the remainder with random bits
|
||||||
|
val remaining = (if (isShortCode) 60 else 180) - it.length
|
||||||
|
it + StringBuilder().let { sb ->
|
||||||
|
repeat(remaining) { sb.append((Math.random() < 0.5).toInt()) }
|
||||||
|
}.toString()
|
||||||
|
}
|
||||||
|
|
||||||
|
// fill upper nybble of bytes[5] first
|
||||||
|
// lower nybble will have msgType
|
||||||
|
bytes[5] = ((msgType and 15) or (paddedTextBits.substring(0, 4).toInt(2).shl(4))).toByte()
|
||||||
|
|
||||||
|
var c = 4
|
||||||
|
for (i in 6 until bytes.size - 2) {
|
||||||
|
bytes[i] = paddedTextBits.substring(c, c + 8).toInt(2).toByte()
|
||||||
|
c += 8
|
||||||
|
}
|
||||||
|
|
||||||
val crc16 = Crc16().let {
|
val crc16 = Crc16().let {
|
||||||
for (i in 0 until bytes.size - 2) {
|
for (i in 0 until bytes.size - 2) {
|
||||||
@@ -138,12 +155,19 @@ object RedeemCodeMachine {
|
|||||||
|
|
||||||
val messageTemplateIndex = decoded[5].toUint() and 15
|
val messageTemplateIndex = decoded[5].toUint() and 15
|
||||||
|
|
||||||
// TODO baudot to ascii
|
// baudot to ascii
|
||||||
|
val baudotBits = StringBuilder().let {
|
||||||
|
it.append(decoded[5].toUint().ushr(4).toString(2).padStart(4,'0'))
|
||||||
|
for (i in 6 until decoded.size - 2) {
|
||||||
|
it.append(decoded[i].toUint().toString(2).padStart(8,'0'))
|
||||||
|
}
|
||||||
|
}.toString()
|
||||||
|
val decodedStr = baudotToAscii(baudotBits).substringBefore('\u0000') // remove trailing random bits
|
||||||
|
|
||||||
return RedeemVoucher(itemID, itemAmount, reusable, "", listOf())
|
return RedeemVoucher(itemID, itemAmount, reusable, messageTemplateIndex, decodedStr.split('\n'))
|
||||||
}
|
}
|
||||||
|
|
||||||
data class RedeemVoucher(val itemID: ItemID, val amount: Int, val reusable: Boolean, val msgTemplate: String, val args: List<String>)
|
data class RedeemVoucher(val itemID: ItemID, val amount: Int, val reusable: Boolean, val msgTemplateIndex: Int, val args: List<String>)
|
||||||
|
|
||||||
|
|
||||||
val tableLtrs = "\u0000E\nA SIU\rDRJNFCKTZLWHYPQOBG\u000FMXV\u000E"
|
val tableLtrs = "\u0000E\nA SIU\rDRJNFCKTZLWHYPQOBG\u000FMXV\u000E"
|
||||||
@@ -156,6 +180,7 @@ object RedeemCodeMachine {
|
|||||||
val codeFigs = tableFigs.mapIndexed { index: Int, c: Char -> c to index.toString(2).padStart(5,'0') }.toMap()
|
val codeFigs = tableFigs.mapIndexed { index: Int, c: Char -> c to index.toString(2).padStart(5,'0') }.toMap()
|
||||||
|
|
||||||
val basket = arrayOf(codeLtrs, codeFigs) // think of it as a "type basket" of a typewriter
|
val basket = arrayOf(codeLtrs, codeFigs) // think of it as a "type basket" of a typewriter
|
||||||
|
val basket2 = arrayOf(tableLtrs, tableFigs) // think of it as a "type basket" of a typewriter
|
||||||
|
|
||||||
private fun isInLtrs(char: Char) = char in setLtrs
|
private fun isInLtrs(char: Char) = char in setLtrs
|
||||||
private fun isInFigs(char: Char) = char in setFigs
|
private fun isInFigs(char: Char) = char in setFigs
|
||||||
@@ -192,7 +217,25 @@ object RedeemCodeMachine {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun baudotToAscii(binaryStr: String): String {
|
private fun baudotToAscii(binaryStr: String): String {
|
||||||
TODO()
|
val sb = StringBuilder()
|
||||||
|
|
||||||
|
var currentShift = 0 // initially ltrs
|
||||||
|
var cursor = 0
|
||||||
|
|
||||||
|
while (cursor < binaryStr.length) {
|
||||||
|
val number = binaryStr.substring(cursor, cursor + 5).toInt(2)
|
||||||
|
|
||||||
|
if (number == 0b11011)
|
||||||
|
currentShift = 1
|
||||||
|
else if (number == 0b11111)
|
||||||
|
currentShift = 0
|
||||||
|
else
|
||||||
|
sb.append(basket2[currentShift][number])
|
||||||
|
|
||||||
|
cursor += 5
|
||||||
|
}
|
||||||
|
|
||||||
|
return sb.toString()
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user