Browse Source

Publish TheZZAAZZGlitch's Fools 2022 event notes (a bit late)

master
mid-kid 2 years ago
commit
a3fe883d76
  1. 38
      braille.txt
  2. 211
      calc_hash.py
  3. 236
      calc_hash_fast.py
  4. 10
      cave3.txt
  5. 9
      cave4.txt
  6. 28
      cave5.txt
  7. 463
      client.py
  8. BIN
      definitely-not-suspicious.mp4
  9. BIN
      definitely-not-suspicious.png
  10. 158
      disasm_script.py
  11. 7
      dumpallfun.sh
  12. 73
      forward.py
  13. 3
      gbasio.txt
  14. 1
      gold.cert
  15. 31
      map.py
  16. 3
      mapnames.sh
  17. 36352
      mapnames.txt
  18. 56
      protocol.txt
  19. 362
      script.txt
  20. 19
      script_main.txt
  21. 289
      script_raw.txt
  22. 3
      uniquemaps.sh
  23. 30
      wholesome_reward.txt

38
braille.txt

@ -0,0 +1,38 @@
ster
disa
less
hope
lettuce
once entered walk twenty steps total
finally you will become femboy
go to hole in the fence five times
east east north north - done
east north south south - done
north south east east - done
north east south east - done
braille in Tiny Cavner in Southern Glitchland
YEET:
SLIDE FREELY EVERYWHERE
eastern camp:
cracker cavern
southern camp:
femboy prime
fun value resetter
northern camp:
fun value checker
casino
altering cave
northern retreat:
trendy phrase
western camp:
balls guy
western relic

211
calc_hash.py

@ -0,0 +1,211 @@
#!/usr/bin/python3
charmap = {
' ': 0x00,
'0': 0xA1,
'1': 0xA2,
'2': 0xA3,
'3': 0xA4,
'4': 0xA5,
'5': 0xA6,
'6': 0xA7,
'7': 0xA8,
'8': 0xA9,
'9': 0xAA,
'!': 0xAB,
'?': 0xAC,
'.': 0xAD,
'-': 0xAE,
'': 0xB0,
'': 0xB1,
'': 0xB2,
'': 0xB3,
'': 0xB4,
'': 0xB5,
'': 0xB6,
',': 0xB8,
'/': 0xBA,
'A': 0xBB,
'B': 0xBC,
'C': 0xBD,
'D': 0xBE,
'E': 0xBF,
'F': 0xC0,
'G': 0xC1,
'H': 0xC2,
'I': 0xC3,
'J': 0xC4,
'K': 0xC5,
'L': 0xC6,
'M': 0xC7,
'N': 0xC8,
'O': 0xC9,
'P': 0xCA,
'Q': 0xCB,
'R': 0xCC,
'S': 0xCD,
'T': 0xCE,
'U': 0xCF,
'V': 0xD0,
'W': 0xD1,
'X': 0xD2,
'Y': 0xD3,
'Z': 0xD4,
'a': 0xD5,
'b': 0xD6,
'c': 0xD7,
'd': 0xD8,
'e': 0xD9,
'f': 0xDA,
'g': 0xDB,
'h': 0xDC,
'i': 0xDD,
'j': 0xDE,
'k': 0xDF,
'l': 0xE0,
'm': 0xE1,
'n': 0xE2,
'o': 0xE3,
'p': 0xE4,
'q': 0xE5,
'r': 0xE6,
's': 0xE7,
't': 0xE8,
'u': 0xE9,
'v': 0xEA,
'w': 0xEB,
'x': 0xEC,
'y': 0xED,
'z': 0xEE,
'$': 0xFF,
}
chars = [
' ',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'!',
'?',
'.',
'-',
'',
'',
'',
'',
'',
'',
'',
',',
'/',
'A',
'B',
'C',
'D',
'E',
'F',
'G',
'H',
'I',
'J',
'K',
'L',
'M',
'N',
'O',
'P',
'Q',
'R',
'S',
'T',
'U',
'V',
'W',
'X',
'Y',
'Z',
'a',
'b',
'c',
'd',
'e',
'f',
'g',
'h',
'i',
'j',
'k',
'l',
'm',
'n',
'o',
'p',
'q',
'r',
's',
't',
'u',
'v',
'w',
'x',
'y',
'z',
'$',
]
round1 = ([73, 97, 13, 41, 67, 101, 89, 139, 71, 83], [6969, 6367, 5099, 4591, 4421, 4831, 3581, 5039, 5279, 4079, 4021])
round2 = ([59, 181, 127, 163, 103, 163, 149, 193, 211, 151], [1337, 3701, 4603, 4663, 4703, 4219, 6481, 6983, 5407, 5297, 5099])
def one_round(string, coeffs, addends):
assert(len(coeffs) == 10)
assert(len(string) == 10)
var32769 = addends[0]
for c,n,x in zip(string,coeffs,addends[1:]):
var32769 = (var32769 + charmap[c]) % 65536
var32769 = (var32769 * n) % 65536
var32769 = (var32769 + x) % 65536
return var32769
def get_hash_for(string):
var32771 = one_round(string, *round1)
var32769 = one_round(string, *round2)
return hex(var32771),hex(var32769)
all = len(chars) ** 10
for x in range(all):
s = ""
while x:
s += chars[x % len(chars)]
x //= len(chars)
while len(s) < 10:
s += "$"
hash = get_hash_for(s)
if hash == (0xB0EF, 0xD4B9):
print(s)
final = 0x828E - round1[1][-1]
for x in range(10):
for i, c in reversed(charmap.items()):
if c == 0:
continue
if c % round1[0][-x] == 0:
c //= round1[0][-x]
print(c)
break
else:
print("nope")
exit()
c -= round1[1][-1 - x]
# 0123456789 =
print(get_hash_for("0123456789"))
print(get_hash_for("$$$$$$$$$$"))
print(get_hash_for("ABABABABAB"))
print(get_hash_for("6969696969"))

236
calc_hash_fast.py

@ -0,0 +1,236 @@
#!/usr/bin/python3
charmap = {
' ': 0x00,
'0': 0xA1,
'1': 0xA2,
'2': 0xA3,
'3': 0xA4,
'4': 0xA5,
'5': 0xA6,
'6': 0xA7,
'7': 0xA8,
'8': 0xA9,
'9': 0xAA,
'!': 0xAB,
'?': 0xAC,
'.': 0xAD,
'-': 0xAE,
'': 0xB0,
'': 0xB1,
'': 0xB2,
'': 0xB3,
'': 0xB4,
'': 0xB5,
'': 0xB6,
',': 0xB8,
'/': 0xBA,
'A': 0xBB,
'B': 0xBC,
'C': 0xBD,
'D': 0xBE,
'E': 0xBF,
'F': 0xC0,
'G': 0xC1,
'H': 0xC2,
'I': 0xC3,
'J': 0xC4,
'K': 0xC5,
'L': 0xC6,
'M': 0xC7,
'N': 0xC8,
'O': 0xC9,
'P': 0xCA,
'Q': 0xCB,
'R': 0xCC,
'S': 0xCD,
'T': 0xCE,
'U': 0xCF,
'V': 0xD0,
'W': 0xD1,
'X': 0xD2,
'Y': 0xD3,
'Z': 0xD4,
'a': 0xD5,
'b': 0xD6,
'c': 0xD7,
'd': 0xD8,
'e': 0xD9,
'f': 0xDA,
'g': 0xDB,
'h': 0xDC,
'i': 0xDD,
'j': 0xDE,
'k': 0xDF,
'l': 0xE0,
'm': 0xE1,
'n': 0xE2,
'o': 0xE3,
'p': 0xE4,
'q': 0xE5,
'r': 0xE6,
's': 0xE7,
't': 0xE8,
'u': 0xE9,
'v': 0xEA,
'w': 0xEB,
'x': 0xEC,
'y': 0xED,
'z': 0xEE,
'$': 0xFF,
}
chars = [
' ',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'!',
'?',
'.',
'-',
'',
'',
'',
'',
'',
'',
'',
',',
'/',
'A',
'B',
'C',
'D',
'E',
'F',
'G',
'H',
'I',
'J',
'K',
'L',
'M',
'N',
'O',
'P',
'Q',
'R',
'S',
'T',
'U',
'V',
'W',
'X',
'Y',
'Z',
'a',
'b',
'c',
'd',
'e',
'f',
'g',
'h',
'i',
'j',
'k',
'l',
'm',
'n',
'o',
'p',
'q',
'r',
's',
't',
'u',
'v',
'w',
'x',
'y',
'z',
'$',
]
# Script vars are u16
def one_round(string, starting_val, coeffs, addends):
assert(len(coeffs) == 10)
assert(len(string) == 10)
var32769 = starting_val
for c,n,x in zip(string,coeffs,addends):
var32769 = (var32769 + charmap[c]) % 65536
var32769 = (var32769 * n) % 65536
var32769 = (var32769 + x) % 65536
return var32769
round1 = (6969, [73, 97, 13, 41, 67, 101, 89, 139, 71, 83], [6367, 5099, 4591, 4421, 4831, 3581, 5039, 5279, 4079, 4021])
round2 = (1337, [59, 181, 127, 163, 103, 163, 149, 193, 211, 151], [3701, 4603, 4663, 4703, 4219, 6481, 6983, 5407, 5297, 5099])
def get_hash_for(string):
var32771 = one_round(string, *round1)
var32769 = one_round(string, *round2)
return hex(var32771),hex(var32769)
def get_unk_coeffs(round):
constant = one_round(" ", *round)
coeffs = []
for c in round[1]:
for i in range(len(coeffs)):
coeffs[i] = (coeffs[i] * c) % 65536
coeffs.append(c)
return constant,coeffs
simple_round1 = get_unk_coeffs(round1)
simple_round2 = get_unk_coeffs(round2)
print(simple_round1)
print(simple_round2)
def simple_round(string, starting_val, coeffs):
return (starting_val + sum([ (charmap[char] * coeff) % 65536 for (char,coeff) in zip(string,coeffs) ])) % 65536
def simple_hash(string):
var32771 = simple_round(string, *simple_round1)
var32769 = simple_round(string, *simple_round2)
return hex(var32771),hex(var32769)
# all = len(chars) ** 10
# for x in range(all):
# s = ""
# while x:
# s += chars[x % len(chars)]
# x //= len(chars)
# while len(s) < 10:
# s += "$"
# hash = simple_hash(s)
# if hash == 0xB0EF:
# print(s)
print(get_hash_for("0123456789"), simple_hash("0123456789"))
print(get_hash_for("$$$$$$$$$$"), simple_hash("$$$$$$$$$$"))
print(get_hash_for("ABABABABAB"), simple_hash("ABABABABAB"))
print(get_hash_for("6969696969"), simple_hash("6969696969"))
def print_simple(starting_val, coeffs, target):
print(coeffs, hex((target - starting_val) % 65536))
print_simple(*simple_round1, 45295)
print_simple(*simple_round2, 54457)
for char in charmap:
print("0x%04X" % ((charmap[char] * 39437) & 0xffff))
# a1 * x1 + a2 * x2 + C = <>
# (a1 + a2) * (x1 + x2) + C

10
cave3.txt

@ -0,0 +1,10 @@
"0123456789" = 0AEE 828E
" " = 78D3 FC47
"ABABABABAB" = 5266 9722
"6969696969" = 9B24 F0E0
32769 32771
D4B9 B0EF
Password: "…n….,"

9
cave4.txt

@ -0,0 +1,9 @@
Request cert:
07000000686f6c6465723d41656c6974612f747970653d73696c766572ffc04600000000
Response:
4954496e702b6863537766503243357276544179796e3355496a5a3974584d3368664d634470346b677672515438724d755645367954686652556a397a2b516d45564353564d4a6a393070526f464a355959525257413d3dff
Verify cert:
080000004954496e702b6863537766503243357276544179796e3355496a5a3974584d3368664d634470346b677672515438724d755645367954686652556a397a2b516d45564353564d4a6a393070526f464a355959525257413d3dff0000000217018037121200c71d020213006587010217018000001200da75030213008c8701021200db75030213008d8701021601800000160280a3001701800000180280010021028000000605898701021701805f121200c81d02021300b287010217018000001200da7503021300d98701021200db7503021300da870102160180000016028067001701800000180280010021028000000605d68701021701807b101200c91d
Response:
53000000617574686f726974793d437261636b6572466f75722f73657269616c3d343636343135342f686f6c6465723d41656c6974612f747970653d73696c766572ff

28
cave5.txt

@ -0,0 +1,28 @@
02018213: lock
02018214: faceplayer
02018215: checkflag 1070
02018218: goto_if 1, loc_0201825b
0201821e: loadword 0, 0x02018265
02018224: callstd 4
02018226: waitmessage
02018227: closemessage
02018228: delay 60
0201822b: playse 209
0201822e: delay 20
02018231: setvar 32781, 3
02018236: playse 107
02018239: callnative 0x080b0535
0201823e: delay 150
02018241: callnative 0x080b058d
02018246: waitstate
02018247: delay 10
0201824a: message 0x02018321
0201824f: setflag 1070
02018252: playfanfare 389
02018255: waitfanfare
02018256: call 0x0203e14c
loc_0201825b:
0201825b: loadword 0, 0x0201835a
02018261: callstd 4
02018263: release
02018264: end

463
client.py

@ -0,0 +1,463 @@
#!/usr/bin/env python3
import json
from urllib.request import Request, urlopen
from base64 import b64encode, b64decode
from binascii import hexlify, unhexlify
from random import randrange
from os.path import isfile, isdir
from os import mkdir
from time import time
charmap = {
' ': 0x00,
'é': 0x1B,
'0': 0xA1,
'1': 0xA2,
'2': 0xA3,
'3': 0xA4,
'4': 0xA5,
'5': 0xA6,
'6': 0xA7,
'7': 0xA8,
'8': 0xA9,
'9': 0xAA,
'!': 0xAB,
'?': 0xAC,
'.': 0xAD,
'-': 0xAE,
'': 0xB0,
'': 0xB1,
'': 0xB2,
'': 0xB3,
'': 0xB4,
'': 0xB5,
'': 0xB6,
',': 0xB8,
'/': 0xBA,
'A': 0xBB,
'B': 0xBC,
'C': 0xBD,
'D': 0xBE,
'E': 0xBF,
'F': 0xC0,
'G': 0xC1,
'H': 0xC2,
'I': 0xC3,
'J': 0xC4,
'K': 0xC5,
'L': 0xC6,
'M': 0xC7,
'N': 0xC8,
'O': 0xC9,
'P': 0xCA,
'Q': 0xCB,
'R': 0xCC,
'S': 0xCD,
'T': 0xCE,
'U': 0xCF,
'V': 0xD0,
'W': 0xD1,
'X': 0xD2,
'Y': 0xD3,
'Z': 0xD4,
'a': 0xD5,
'b': 0xD6,
'c': 0xD7,
'd': 0xD8,
'e': 0xD9,
'f': 0xDA,
'g': 0xDB,
'h': 0xDC,
'i': 0xDD,
'j': 0xDE,
'k': 0xDF,
'l': 0xE0,
'm': 0xE1,
'n': 0xE2,
'o': 0xE3,
'p': 0xE4,
'q': 0xE5,
'r': 0xE6,
's': 0xE7,
't': 0xE8,
'u': 0xE9,
'v': 0xEA,
'w': 0xEB,
'x': 0xEC,
'y': 0xED,
'z': 0xEE,
'$': 0xFF,
}
charmap_rev = {}
for x, y in charmap.items():
charmap_rev[y] = x
def translate(str):
d = bytearray()
for x in str:
d.append(charmap[x])
d.append(0xff)
return d
def translate_rev(bytes):
s = ""
for c in bytes:
if c == 0xff:
break
s += charmap_rev[c]
return s
class BitstreamReader():
def __init__(self, bytes, bytesize=8):
self.bytes = bytes
self.bytesize = bytesize
self.pos = 0
self.bits = 0
self.value = 0
def remaining(self):
if self.pos < len(self.bytes):
return True
if self.bits > 0:
return True
return False
def read(self, count):
while self.bits < count:
if self.pos >= len(self.bytes):
break
self.value |= (self.bytes[self.pos] & ((1 << self.bytesize) - 1)) << self.bits
self.bits += self.bytesize
self.pos += 1
ret = self.value & ((1 << count) - 1)
self.value >>= count
self.bits -= count
return ret
def bitpack(code, origbits, destbits):
newcode = []
reader = BitstreamReader(code, origbits)
while reader.remaining():
newcode.append(reader.read(destbits))
return newcode
def ror(val, bits):
return val >> bits | ((val << (32 - bits)) & (2 ** 32 - 1))
class Client:
def __init__(self, user, pwd):
self.token = None
self.uid = None
self.login(user, pwd)
def makereq(self, endpoint, *args, **kwargs):
req = Request("https://fools2022.online/%s" % endpoint, *args, **kwargs)
req.add_header("User-Agent", "fools2022-client/1.1.0")
req.add_header("Content-Type", "application/x-www-form-urlencoded")
req.add_header("Accept-Encoding", "identity")
if self.token:
req.add_header("X-Foolssessiontoken", self.token)
return req
def makepkt(self, cmd, data):
data = bitpack(data, 8, 32)
rnd = randrange(256)
pkt = [rnd << 8 | cmd] + data
magic = 0xf0dbeb15
for x in pkt:
magic = ror(magic, 5)
magic ^= x
magic += x * 2
pkt[0] = (magic & (2**16-1)) << 16 | pkt[0]
pkt = b64encode(bytes(bitpack(pkt, 32, 8)))
return self.makereq("packet/%s" % self.uid, data=pkt)
def login(self, user, pwd):
data = {"u": user, "p": pwd}
data = json.dumps(data).encode()
req = self.makereq("login", data=data)
res = json.loads(urlopen(req).read().decode())
self.token = res["data"]["session"]
self.uid = res["data"]["uid"]
def getmap(self, mapid, pos=(0,0)):
data = [mapid >> 0, mapid >> 8, pos[0], pos[1]]
req = self.makepkt(0x01, data)
rev = b64decode(urlopen(req).read().decode())
print(hexlify(rev).decode())
return rev
def trendset(self, text):
data = bytearray()
for i, x in enumerate(text):
data.append(x)
data.append(0xff)
req = self.makepkt(0x04, data)
rev = b64decode(urlopen(req).read().decode()).decode()
print(rev)
def cave3(self, text):
data = bytearray(unhexlify("ffffffffffffffffffff"))
for i, x in enumerate(text):
data[i] = x
req = self.makepkt(0x06, data)
print(urlopen(req).read().decode())
def cave4gen(self, text):
data = bytearray()
for i, x in enumerate(text):
data.append(ord(x))
data.append(0xff)
req = self.makepkt(0x07, data)
rev = b64decode(urlopen(req).read().decode())[:-1].decode()
print(rev)
def cave4chk(self, cert):
data = cert.encode() + b"\xff"
req = self.makepkt(0x08, data)
rev = b64decode(urlopen(req).read().decode())
print(rev)
rev = rev[4:-1]
for x in range(0, len(rev), 16):
print(rev[x:x+16])
def lotto(self):
data = b""
req = self.makepkt(0x05, data)
rev = b64decode(urlopen(req).read().decode())
print(hexlify(rev).decode())
def complete(self):
data = bytearray(unhexlify("ef7fffff7fe0ffff000000000000000000000000000000000000000000000000"))
data = bytearray(unhexlify("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"))
req = self.makepkt(0x02, data)
rev = b64decode(urlopen(req).read().decode()).decode()
print(rev)
maps = [
0x0000,
0x0100,
0x0110,
0x0210,
0x0327,
0x0364,
0x043A,
0x0523,
0x0565,
0x0566,
0x062F,
0x0667,
0x0668,
0x0669,
0x066A,
0x0734,
0x0824,
0x0932,
0x096B,
0x098A,
0x0A32,
0x0B2D,
0x0C2C,
0x0D3E,
0x0E3C,
0x0E6C,
0x0F3B,
0x103B,
0x106D,
0x113D,
0x116E,
0x123D,
0x1321,
0x1337,
0x1432,
0x146F,
0x152D,
0x1631,
0x1639,
0x1670,
0x1671,
0x1672,
0x1720,
0x1730,
0x1731,
0x1732,
0x182A,
0x1927,
0x1A3C,
0x1A73,
0x1B37,
0x1C2C,
0x1D3B,
0x1E33,
0x1E92,
0x1F3A,
0x1F79,
0x1F7A,
0x2001,
0x202F,
0x207B,
0x2125,
0x2174,
0x223A,
0x2275,
0x2276,
0x2277,
0x232D,
0x2435,
0x2478,
0x2536,
0x2632,
0x2725,
0x2731,
0x2791,
0x2833,
0x2939,
0x2B29,
0x2B7C,
0x2B7D,
0x2B7E,
0x2C29,
0x2D27,
0x2E2B,
0x2F38,
0x2F7F,
0x2F80,
0x2F81,
0x302C,
0x3120,
0x318B,
0x318C,
0x318D,
0x318E,
0x318F,
0x3190,
0x3191,
0x323F,
0x3336,
0x3420,
0x3482,
0x353C,
0x3621,
0x3724,
0x3828,
0x3920,
0x3A3E,
0x3B22,
0x3B30,
0x3B31,
0x3B32,
0x3C36,
0x3D20,
0x3D83,
0x3E31,
0x3E90,
0x3F3D,
0x4026,
0x412E,
0x423A,
0x432A,
0x4384,
0x4430,
0x4528,
0x4530,
0x4585,
0x472B,
0x4786,
0x4787,
0x4788,
0x482B,
0x4889,
0x4933,
0x4A34,
0x4B3A,
0x4C21,
0x4C93,
0x4D3A,
0x4E22,
0x4F21,
0x506F,
0x5133,
0x5134,
0x5135,
0x5136,
0x5137,
0x5160,
0x5211,
]
maps_skip = [
# YEET maps (not always accessible)
0x5133,
0x5134,
0x5135,
0x5136,
0x5137,
0x5160
]
if __name__ == "__main__":
from time import sleep
from sys import argv
c = Client(open(".user").read().strip(), open(".pass").read().strip())
sleep(1)
if argv[1] == "map":
c.getmap(int(argv[2], 0))
if argv[1] == "maps":
fun_map = c.getmap(0x1670)
fun_value = int(translate_rev(fun_map[0x25b:0x260]))
print("Fun value:", fun_value)
fdir = "maps_%03d" % fun_value
if not isdir(fdir):
mkdir(fdir)
sleep(1)
# fdir = "maps"
# for x in range(0x10000):
for x in maps:
fname = "%s/%04X.map" % (fdir, x)
if isfile(fname):
continue
if x in maps_skip:
continue
print("Getting map %s..." % fname)
m = c.getmap(x)
open(fname, "wb").write(m)
sleep(1)
if argv[1] == "trend":
c.trendset(translate(argv[2]))
if argv[1] == "cave3":
c.cave3(translate(argv[2]))
if argv[1] == "cave4gen":
c.cave4gen(argv[2])
if argv[1] == "cave4chk":
c.cave4chk(argv[2])
if argv[1] == "complete":
c.getmap(int(argv[2], 0))
sleep(1)
c.complete()
if argv[1] == "lotto":
c.lotto()
if argv[1] == "yeet":
game_corner_map = c.getmap(0x1A73)
sleep(1)
yeet_map_id = game_corner_map[0x8B0] << 0
yeet_map_id |= game_corner_map[0x8B1] << 8
yeet_map = c.getmap(yeet_map_id)
game_corner_map_fname = "maps_changing/1A73_%04X.map" % yeet_map_id
if not isfile(game_corner_map_fname):
open(game_corner_map_fname, "wb").write(game_corner_map)
yeet_map_fname = "maps/%04X.map" % yeet_map_id
if not isfile(yeet_map_fname):
open(yeet_map_fname, "wb").write(yeet_map)
sleep(1)
results_map = c.getmap(0x5160)
results_map_fname = "maps_changing/5160_%d.map" % time()
open(results_map_fname, "wb").write(results_map)
if argv[1] == "funroll":
fun_map = c.getmap(0x472b, (15, 10))
if argv[1] == "funcheck":
fun_map = c.getmap(0x1670)
fun_value = int(translate_rev(fun_map[0x25b:0x260]))
print(fun_value)

BIN
definitely-not-suspicious.mp4

Binary file not shown.

BIN
definitely-not-suspicious.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 MiB

158
disasm_script.py

@ -0,0 +1,158 @@
#!/usr/bin/env python3
file = open("cave5.map", "rb").read()
def read_byte():
global offset
val = file[offset + 0]
offset += 1
return val
def read_half():
global offset
val = file[offset + 0] << 0
val |= file[offset + 1] << 8
offset += 2
return val
def read_word():
global offset
val = file[offset + 0] << 0
val |= file[offset + 1] << 8
val |= file[offset + 2] << 16
val |= file[offset + 3] << 24
offset += 4
return val
def dump_loadword():
dest = read_byte()
value = read_word()
print("loadword %d, 0x%08x" % (dest, value))
def dump_callstd():
func = read_byte()
print("callstd %d" % func)
def dump_call():
dest = read_word()
print("call 0x%08x" % dest)
def dump_callnative():
dest = read_word()
print("callnative 0x%08x" % dest)
def dump_compare_var_to_value():
var = read_half()
value = read_half()
print("compare_var_to_value %d, %d" % (var, value))
def dump_goto_if():
cond = read_byte()
dest = read_word()
print("goto_if %d, 0x%08x" % (cond, dest))
def dump_playse():
song = read_half()
print("playse %d" % song)
def dump_setvar():
var = read_half()
val = read_half()
print("setvar %d, %d" % (var, val))
def dump_loadbytefromptr():
var = read_byte()
source = read_word()
print("loadbytefromptr %d, 0x%08x" % (var, source))
def dump_setptrbyte():
var = read_byte()
dest = read_word()
print("setptrbyte %d, 0x%08x" % (var, dest))
def dump_addvar():
var = read_half()
val = read_half()
print("addvar %d, %d" % (var, val))
def dump_subvar():
var = read_half()
val = read_half()
print("subvar %d, %d" % (var, val))
def dump_copyvar():
var = read_half()
val = read_half()
print("copyvar %d, %d" % (var, val))
def dump_checkflag():
flag = read_half()
print("checkflag %d" % flag)
def dump_delay():
frames = read_half()
print("delay %d" % frames)
def dump_message():
text = read_word()
print("message 0x%08x" % text)
def dump_setflag():
flag = read_half()
print("setflag %d" % flag)
def dump_playfanfare():
song = read_half()
print("playfanfare %d" % song)
cmds = {
0x02: "end",
0x03: "return",
0x04: dump_call,
0x06: dump_goto_if,
0x09: dump_callstd,
0x0f: dump_loadword,
0x12: dump_loadbytefromptr,
0x13: dump_setptrbyte,
0x16: dump_setvar,
0x17: dump_addvar,
0x18: dump_subvar,
0x19: dump_copyvar,
0x21: dump_compare_var_to_value,
0x23: dump_callnative,
0x27: "waitstate",
0x28: dump_delay,
0x29: dump_setflag,
0x2b: dump_checkflag,
0x2f: dump_playse,
0x31: dump_playfanfare,
0x32: "waitfanfare",
0x5a: "faceplayer",
0x66: "waitmessage",
0x67: dump_message,
0x68: "closemessage",
0x6a: "lock",
0x6c: "release"
}
def dump():
global offset
while True:
cmd = file[offset]
if cmd not in cmds:
print("Unknown cmd: %02x" % cmd)
return
print("%08x: " % (offset - base_rel + base), end="")
offset += 1
ex = cmds[cmd]
if isinstance(ex, str):
print(ex)
else:
ex()
if cmd == 0x02 or cmd == 0x03:
return
base = 0x02018213
base_rel = 0x213
offset = (0x02018213 - base) + base_rel
dump()

7
dumpallfun.sh

@ -0,0 +1,7 @@
#!/bin/sh
while sleep 1; do
while sleep 1; do
./client.py maps && break
done
./client.py funroll
done

73
forward.py

@ -0,0 +1,73 @@
#!/usr/bin/env python3
from urllib.request import urlopen, build_opener, install_opener, Request, BaseHandler
from http.server import BaseHTTPRequestHandler, HTTPServer
from base64 import b64decode, b64encode
from binascii import hexlify, unhexlify
host = "localhost"
port = 80
class HTTPErrorIgnore(BaseHandler):
def http_response(self, request, response):
return response
install_opener(build_opener(HTTPErrorIgnore))
class Server(BaseHTTPRequestHandler):
def do_GET(self):
print(self.path)
print(self.headers)
self.send_response(200)
self.end_headers()
def do_POST(self):
path = self.path
if path.startswith("////////"):
path = path[8:]
print(path)
print(self.headers)
body = self.rfile.read(int(self.headers.get("Content-Length")))
if path != "/login":
data = bytearray(b64decode(body))
# if data[0] == 4:
# text = unhexlify("C8BFD0BFCC00C1C9C8C8BB00C1C3D0BF00D3C9CF00CFCAFF")
# for i, x in enumerate(text):
# data[4+i] = x
# new = bytearray(unhexlify("02fad7c9ef7ffff76fa0ffff000000000000000000000000000000000000000000000000"))
# new[1] = data[1]
# new[2] = data[2]
# new[3] = data[3]
# data = new
# data[4] = 0x00
# data[5] = 0x00
# data[6] = 0x00
# data[7] = 0x00
print(hexlify(data).decode())
body = b64encode(data)
print(body)
print("====")
r = Request("https://fools2022.online" + path, data=body)
for header in self.headers:
r.add_header(header, self.headers.get(header))
req = urlopen(r)
res = req.read()
# print(req.code)
print(req.headers)
print(res)
print()
self.send_response(req.code)
for header in req.headers:
if header == "Transfer-Encoding":
continue
self.send_header(header, req.headers.get(header))
self.end_headers()
self.wfile.write(res)
if __name__ == "__main__":
server = HTTPServer((host, port), Server)
server.serve_forever()

3
gbasio.txt

@ -0,0 +1,3 @@
Port:
Clock: 49420
Data: 54970

1
gold.cert

@ -0,0 +1 @@
!2'§è\KÏØ.k½02ÊÜÏê(ûp«t@ëQ6§vc&—IÁ@$PB¿§™yLƇŽYbÒrZO�=¬ÀE‘ãÌDœúÏh)ðÔ¡ð®Å

31
map.py

@ -0,0 +1,31 @@
#!/usr/bin/env python3
from client import translate_rev
from struct import unpack_from
class Map:
def __init__(self, fname):
self.map = open(fname, "rb").read()
self.baseaddr = 0x02018000
def getoffs(self, pos):
return unpack_from("<I", self.map, pos)[0] - self.baseaddr
def readstr(self, pos):
b = bytearray()
while self.map[pos] != 0xff:
b.append(self.map[pos])
pos += 1
return translate_rev(b)
def getname(self):
ptr = self.getoffs(0x28)
return self.readstr(ptr)
if __name__ == "__main__":
from sys import argv
if argv[1] == "name":
for file in argv[2:]:
m = Map(file)
print(file + ":", m.getname())

3
mapnames.sh

@ -0,0 +1,3 @@
#!/bin/bash
#./uniquemaps.sh | xargs ./map.py name | tee mapnames.txt
find maps_???/ -type f | sort | xargs ./map.py name | tee mapnames.txt

36352
mapnames.txt

File diff suppressed because it is too large

56
protocol.txt

@ -0,0 +1,56 @@
Login:
/login
Content-Type: application/x-www-form-urlencoded
User-Agent: fools2022-client/1.1.0
b'{"u": "pfero", "p": "<pass>"}'
Response:
b'{"error": 0, "data": {"session": "1648943817-6223807-598062-014fd637cbe966350fa894f93652b9c526227c6d19cea7e8439749dd5cb9228a", "uid": 6223807, "scope": "fools2022"}}'
Trend setter:
/packet/6223807
Content-Type: application/x-www-form-urlencoded
X-Foolssessiontoken: 1648943649-6223807-953493-063b14ace81e435d7f4a5e16331444165258c1253ff3a6b197c13b1f425e7f35
User-Agent: fools2022-client/1.1.0
04f18b97c8bfd0bfcc00c1c9c8c8bb00c1c3d0bf00d3c9cf00cfcaff0000c04600000000
Ball collection:
/packet/6223807
024bccccef7ffff76da0ffff000000000000000000000000000000000000000000000000
02849dccef7fffff6fa0ffff000000000000000000000000000000000000000000000000
Response:
b'CLPD'
Ball delivery:
/packet/6223807
02fad7c9ef7ffff76fa0ffff000000000000000000000000000000000000000000000000
0202dfccef7fffff7fa0ffff000000000000000000000000000000000000000000000000
Response:
b'CLPD'
Mystery zone:
01097339e700d9e2
Challenge 3:
062b4f5dffffffffffffffffffffc046
0699162dbbbbbbbbbbbbbbbbbbbbc046
Getting exploitation expert title:
02d7b0cdef7fffff7fe0ffff000000000000000000000000000000000000000000000000
YEET:
Play maps:
0x5133
0x5134
0x5135
0x5136
0x5137
End map:
0x5160
Fun value roll:
0150080e86470408
01be17082b470f0a
Fun value check:
014a1a5c70160408

362
script.txt

@ -0,0 +1,362 @@
setvar 32769, 6969
; *32769 += str[0]
loadbytefromptr 0, 0x02021dc4 ; str[0]
setptrbyte 0, 0x02018372
addvar 32769, 0
; *32769 *= 73
loadbytefromptr 0, 0x020375da
setptrbyte 0, 0x02018399
loadbytefromptr 0, 0x020375db
setptrbyte 0, 0x0201839a
setvar 32769, 0
setvar 32770, 73
loc_02018396:
addvar 32769, 0 ; 0x020375da
subvar 32770, 1
compare_var_to_value 32770, 0
goto_if 5, loc_02018396
; *32769 += 6367
addvar 32769, 6367
; *32769 += str[1]
loadbytefromptr 0, 0x02021dc5 ; str[1]
setptrbyte 0, 0x020183bf
addvar 32769, 0
; *32769 *= 97
loadbytefromptr 0, 0x020375da
setptrbyte 0, 0x020183e6
loadbytefromptr 0, 0x020375db
setptrbyte 0, 0x020183e7
setvar 32769, 0
setvar 32770, 97
loc_020183e3:
addvar 32769, 0
subvar 32770, 1
compare_var_to_value 32770, 0
goto_if 5, loc_020183e3
; *32769 += 5099
addvar 32769, 5099
loadbytefromptr 0, 0x02021dc6 ; str[2]
setptrbyte 0, 0x0201840c
addvar 32769, 0
loadbytefromptr 0, 0x020375da
setptrbyte 0, 0x02018433
loadbytefromptr 0, 0x020375db
setptrbyte 0, 0x02018434
setvar 32769, 0
setvar 32770, 13
loc_02018430:
addvar 32769, 0
subvar 32770, 1
compare_var_to_value 32770, 0
goto_if 5, loc_02018430
addvar 32769, 4591
loadbytefromptr 0, 0x02021dc7 ; str[3]
setptrbyte 0, 0x02018459
addvar 32769, 0
loadbytefromptr 0, 0x020375da
setptrbyte 0, 0x02018480
loadbytefromptr 0, 0x020375db
setptrbyte 0, 0x02018481
setvar 32769, 0
setvar 32770, 41
loc_0201847d:
addvar 32769, 0
subvar 32770, 1
compare_var_to_value 32770, 0
goto_if 5, loc_0201847d
addvar 32769, 4421
loadbytefromptr 0, 0x02021dc8 ; str[4]
setptrbyte 0, 0x020184a6
addvar 32769, 0
loadbytefromptr 0, 0x020375da
setptrbyte 0, 0x020184cd
loadbytefromptr 0, 0x020375db
setptrbyte 0, 0x020184ce
setvar 32769, 0
setvar 32770, 67
loc_020184ca:
addvar 32769, 0
subvar 32770, 1
compare_var_to_value 32770, 0
goto_if 5, loc_020184ca
addvar 32769, 4831
loadbytefromptr 0, 0x02021dc9 ; str[5]
setptrbyte 0, 0x020184f3
addvar 32769, 0
loadbytefromptr 0, 0x020375da
setptrbyte 0, 0x0201851a
loadbytefromptr 0, 0x020375db
setptrbyte 0, 0x0201851b
setvar 32769, 0
setvar 32770, 101
loc_02018517:
addvar 32769, 0
subvar 32770, 1
compare_var_to_value 32770, 0
goto_if 5, loc_02018517
addvar 32769, 3581
loadbytefromptr 0, 0x02021dca ; str[6]
setptrbyte 0, 0x02018540
addvar 32769, 0
loadbytefromptr 0, 0x020375da
setptrbyte 0, 0x02018567
loadbytefromptr 0, 0x020375db
setptrbyte 0, 0x02018568
setvar 32769, 0
setvar 32770, 89
loc_0201856:
addvar 32769, 0
subvar 32770, 1
compare_var_to_value 32770, 0
goto_if 5, loc_02018564
addvar 32769, 5039
loadbytefromptr 0, 0x02021dcb ; str[7]
setptrbyte 0, 0x0201858d
addvar 32769, 0
loadbytefromptr 0, 0x020375da
setptrbyte 0, 0x020185b4
loadbytefromptr 0, 0x020375db
setptrbyte 0, 0x020185b5
setvar 32769, 0
setvar 32770, 139
loc_020185b1:
addvar 32769, 0
subvar 32770, 1
compare_var_to_value 32770, 0
goto_if 5, loc_020185b1
addvar 32769, 5279
loadbytefromptr 0, 0x02021dcc ; str[8]
setptrbyte 0, 0x020185da
addvar 32769, 0
loadbytefromptr 0, 0x020375da
setptrbyte 0, 0x02018601
loadbytefromptr 0, 0x020375db
setptrbyte 0, 0x02018602
setvar 32769, 0
setvar 32770, 71
loc_020185fe:
addvar 32769, 0
subvar 32770, 1
compare_var_to_value 32770, 0
goto_if 5, loc_020185fe
addvar 32769, 4079
loadbytefromptr 0, 0x02021dcd ; str[9]
setptrbyte 0, 0x02018627
addvar 32769, 0
loadbytefromptr 0, 0x020375da
setptrbyte 0, 0x0201864e
loadbytefromptr 0, 0x020375db
setptrbyte 0, 0x0201864f
setvar 32769, 0
setvar 32770, 83
loc_0201864b:
addvar 32769, 0
subvar 32770, 1
compare_var_to_value 32770, 0
goto_if 5, loc_0201864b
addvar 32769, 4021
copyvar 32771, 32769
setvar 32769, 1337
loadbytefromptr 0, 0x02021dc4
setptrbyte 0, 0x0201867e
addvar 32769, 0
loadbytefromptr 0, 0x020375da
setptrbyte 0, 0x020186a5
loadbytefromptr 0, 0x020375db
setptrbyte 0, 0x020186a6
setvar 32769, 0
setvar 32770, 59
loc_020186a2:
addvar 32769, 0
subvar 32770, 1
compare_var_to_value 32770, 0
goto_if 5, loc_020186a2
addvar 32769, 3701
loadbytefromptr 0, 0x02021dc5
setptrbyte 0, 0x020186cb
addvar 32769, 0
loadbytefromptr 0, 0x020375da
setptrbyte 0, 0x020186f2
loadbytefromptr 0, 0x020375db
setptrbyte 0, 0x020186f3
setvar 32769, 0
setvar 32770, 181
loc_020186ef:
addvar 32769, 0
subvar 32770, 1
compare_var_to_value 32770, 0
goto_if 5, loc_020186ef
addvar 32769, 4603
loadbytefromptr 0, 0x02021dc6
setptrbyte 0, 0x02018718
addvar 32769, 0
loadbytefromptr 0, 0x020375da
setptrbyte 0, 0x0201873f
loadbytefromptr 0, 0x020375db
setptrbyte 0, 0x02018740
setvar 32769, 0
setvar 32770, 127
loc_0201873c:
addvar 32769, 0
subvar 32770, 1
compare_var_to_value 32770, 0
goto_if 5, loc_0201873c
addvar 32769, 4663
loadbytefromptr 0, 0x02021dc7
setptrbyte 0, 0x02018765
addvar 32769, 0
loadbytefromptr 0, 0x020375da
setptrbyte 0, 0x0201878c
loadbytefromptr 0, 0x020375db
setptrbyte 0, 0x0201878d
setvar 32769, 0
setvar 32770, 163
loc_02018789:
addvar 32769, 0
subvar 32770, 1
compare_var_to_value 32770, 0
goto_if 5, loc_02018789
addvar 32769, 4703
loadbytefromptr 0, 0x02021dc8
setptrbyte 0, 0x020187b2
addvar 32769, 0
loadbytefromptr 0, 0x020375da
setptrbyte 0, 0x020187d9
loadbytefromptr 0, 0x020375db
setptrbyte 0, 0x020187da
setvar 32769, 0
setvar 32770, 103
loc_020187d6:
addvar 32769, 0
subvar 32770, 1
compare_var_to_value 32770, 0
goto_if 5, loc_020187d6
addvar 32769, 4219
loadbytefromptr 0, 0x02021dc9
setptrbyte 0, 0x020187ff
addvar 32769, 0
loadbytefromptr 0, 0x020375da
setptrbyte 0, 0x02018826
loadbytefromptr 0, 0x020375db
setptrbyte 0, 0x02018827
setvar 32769, 0
setvar 32770, 163
loc_02018823:
addvar 32769, 0
subvar 32770, 1
compare_var_to_value 32770, 0
goto_if 5, loc_02018823
addvar 32769, 6481
loadbytefromptr 0, 0x02021dca
setptrbyte 0, 0x0201884c
addvar 32769, 0
loadbytefromptr 0, 0x020375da
setptrbyte 0, 0x02018873
loadbytefromptr 0, 0x020375db
setptrbyte 0, 0x02018874
setvar 32769, 0
setvar 32770, 149
loc_02018870:
addvar 32769, 0
subvar 32770, 1
compare_var_to_value 32770, 0
goto_if 5, loc_02018870
addvar 32769, 6983
loadbytefromptr 0, 0x02021dcb
setptrbyte 0, 0x02018899
addvar 32769, 0
loadbytefromptr 0, 0x020375da
setptrbyte 0, 0x020188c0
loadbytefromptr 0, 0x020375db
setptrbyte 0, 0x020188c1
setvar 32769, 0
setvar 32770, 193
loc_020188bd:
addvar 32769, 0
subvar 32770, 1
compare_var_to_value 32770, 0
goto_if 5, loc_020188bd
addvar 32769, 5407
loadbytefromptr 0, 0x02021dcc
setptrbyte 0, 0x020188e6
addvar 32769, 0
loadbytefromptr 0, 0x020375da
setptrbyte 0, 0x0201890d
loadbytefromptr 0, 0x020375db
setptrbyte 0, 0x0201890e
setvar 32769, 0
setvar 32770, 211
loc_0201890a:
addvar 32769, 0
subvar 32770, 1
compare_var_to_value 32770, 0
goto_if 5, loc_0201890a
addvar 32769, 5297
loadbytefromptr 0, 0x02021dcd
setptrbyte 0, 0x02018933
addvar 32769, 0
loadbytefromptr 0, 0x020375da
setptrbyte 0, 0x0201895a
loadbytefromptr 0, 0x020375db
setptrbyte 0, 0x0201895b
setvar 32769, 0
setvar 32770, 151
loc_02018957:
addvar 32769, 0
subvar 32770, 1
compare_var_to_value 32770, 0
goto_if 5, loc_02018957
addvar 32769, 5099
compare_var_to_value 32771, 45295
goto_if 5, loc_0201898d
compare_var_to_value 32769, 54457
goto_if 5, loc_0201898d
setvar 32781, 1
return
loc_0201898d:
setvar 32781, 0
return

19
script_main.txt

@ -0,0 +1,19 @@
020182ad: lock
020182ae: faceplayer
020182af: loadword 0, 0x02018993
020182b5: callstd 4
020182b7: call 0x020182fd
020182bc: callnative 0x0203d075
020182c1: waitstate
020182c2: call 0x0201835e
020182c7: compare_var_to_value 32781, 0
020182cc: goto_if 1, 0x020182f3
020182d2: loadword 0, 0x020189b6
020182d8: callstd 4
020182da: callnative 0x02018233
020182df: call 0x0203e17c
020182e4: playse 40
020182e7: callnative 0x02018263
020182ec: callnative 0x08089c35
020182f1: release
020182f2: end

289
script_raw.txt

@ -0,0 +1,289 @@
0201835e: setvar 32769, 6969
02018363: loadbytefromptr 0, 0x02021dc4
02018369: setptrbyte 0, 0x02018372
0201836f: addvar 32769, 0
02018374: loadbytefromptr 0, 0x020375da
0201837a: setptrbyte 0, 0x02018399
02018380: loadbytefromptr 0, 0x020375db
02018386: setptrbyte 0, 0x0201839a
0201838c: setvar 32769, 0
02018391: setvar 32770, 73
02018396: addvar 32769, 0
0201839b: subvar 32770, 1
020183a0: compare_var_to_value 32770, 0
020183a5: goto_if 5, 0x02018396
020183ab: addvar 32769, 6367
020183b0: loadbytefromptr 0, 0x02021dc5
020183b6: setptrbyte 0, 0x020183bf
020183bc: addvar 32769, 0
020183c1: loadbytefromptr 0, 0x020375da
020183c7: setptrbyte 0, 0x020183e6
020183cd: loadbytefromptr 0, 0x020375db
020183d3: setptrbyte 0, 0x020183e7
020183d9: setvar 32769, 0
020183de: setvar 32770, 97
020183e3: addvar 32769, 0
020183e8: subvar 32770, 1
020183ed: compare_var_to_value 32770, 0
020183f2: goto_if 5, 0x020183e3
020183f8: addvar 32769, 5099
020183fd: loadbytefromptr 0, 0x02021dc6
02018403: setptrbyte 0, 0x0201840c
02018409: addvar 32769, 0
0201840e: loadbytefromptr 0, 0x020375da
02018414: setptrbyte 0, 0x02018433
0201841a: loadbytefromptr 0, 0x020375db
02018420: setptrbyte 0, 0x02018434
02018426: setvar 32769, 0
0201842b: setvar 32770, 13
02018430: addvar 32769, 0
02018435: subvar 32770, 1
0201843a: compare_var_to_value 32770, 0
0201843f: goto_if 5, 0x02018430
02018445: addvar 32769, 4591
0201844a: loadbytefromptr 0, 0x02021dc7
02018450: setptrbyte 0, 0x02018459
02018456: addvar 32769, 0
0201845b: loadbytefromptr 0, 0x020375da
02018461: setptrbyte 0, 0x02018480
02018467: loadbytefromptr 0, 0x020375db
0201846d: setptrbyte 0, 0x02018481
02018473: setvar 32769, 0
02018478: setvar 32770, 41
0201847d: addvar 32769, 0
02018482: subvar 32770, 1
02018487: compare_var_to_value 32770, 0
0201848c: goto_if 5, 0x0201847d
02018492: addvar 32769, 4421
02018497: loadbytefromptr 0, 0x02021dc8
0201849d: setptrbyte 0, 0x020184a6
020184a3: addvar 32769, 0
020184a8: loadbytefromptr 0, 0x020375da
020184ae: setptrbyte 0, 0x020184cd
020184b4: loadbytefromptr 0, 0x020375db
020184ba: setptrbyte 0, 0x020184ce
020184c0: setvar 32769, 0
020184c5: setvar 32770, 67
020184ca: addvar 32769, 0
020184cf: subvar 32770, 1
020184d4: compare_var_to_value 32770, 0
020184d9: goto_if 5, 0x020184ca
020184df: addvar 32769, 4831
020184e4: loadbytefromptr 0, 0x02021dc9
020184ea: setptrbyte 0, 0x020184f3
020184f0: addvar 32769, 0
020184f5: loadbytefromptr 0, 0x020375da
020184fb: setptrbyte 0, 0x0201851a
02018501: loadbytefromptr 0, 0x020375db
02018507: setptrbyte 0, 0x0201851b
0201850d: setvar 32769, 0
02018512: setvar 32770, 101
02018517: addvar 32769, 0
0201851c: subvar 32770, 1
02018521: compare_var_to_value 32770, 0
02018526: goto_if 5, 0x02018517
0201852c: addvar 32769, 3581
02018531: loadbytefromptr 0, 0x02021dca
02018537: setptrbyte 0, 0x02018540
0201853d: addvar 32769, 0
02018542: loadbytefromptr 0, 0x020375da
02018548: setptrbyte 0, 0x02018567
0201854e: loadbytefromptr 0, 0x020375db
02018554: setptrbyte 0, 0x02018568
0201855a: setvar 32769, 0
0201855f: setvar 32770, 89
02018564: addvar 32769, 0
02018569: subvar 32770, 1
0201856e: compare_var_to_value 32770, 0
02018573: goto_if 5, 0x02018564
02018579: addvar 32769, 5039
0201857e: loadbytefromptr 0, 0x02021dcb
02018584: setptrbyte 0, 0x0201858d
0201858a: addvar 32769, 0
0201858f: loadbytefromptr 0, 0x020375da
02018595: setptrbyte 0, 0x020185b4
0201859b: loadbytefromptr 0, 0x020375db
020185a1: setptrbyte 0, 0x020185b5
020185a7: setvar 32769, 0
020185ac: setvar 32770, 139
020185b1: addvar 32769, 0
020185b6: subvar 32770, 1
020185bb: compare_var_to_value 32770, 0
020185c0: goto_if 5, 0x020185b1
020185c6: addvar 32769, 5279
020185cb: loadbytefromptr 0, 0x02021dcc
020185d1: setptrbyte 0, 0x020185da
020185d7: addvar 32769, 0
020185dc: loadbytefromptr 0, 0x020375da
020185e2: setptrbyte 0, 0x02018601
020185e8: loadbytefromptr 0, 0x020375db
020185ee: setptrbyte 0, 0x02018602
020185f4: setvar 32769, 0
020185f9: setvar 32770, 71
020185fe: addvar 32769, 0
02018603: subvar 32770, 1
02018608: compare_var_to_value 32770, 0
0201860d: goto_if 5, 0x020185fe
02018613: addvar 32769, 4079
02018618: loadbytefromptr 0, 0x02021dcd
0201861e: setptrbyte 0, 0x02018627
02018624: addvar 32769, 0
02018629: loadbytefromptr 0, 0x020375da
0201862f: setptrbyte 0, 0x0201864e
02018635: loadbytefromptr 0, 0x020375db
0201863b: setptrbyte 0, 0x0201864f
02018641: setvar 32769, 0
02018646: setvar 32770, 83
0201864b: addvar 32769, 0
02018650: subvar 32770, 1
02018655: compare_var_to_value 32770, 0
0201865a: goto_if 5, 0x0201864b
02018660: addvar 32769, 4021
02018665: copyvar 32771, 32769
0201866a: setvar 32769, 1337
0201866f: loadbytefromptr 0, 0x02021dc4
02018675: setptrbyte 0, 0x0201867e
0201867b: addvar 32769, 0
02018680: loadbytefromptr 0, 0x020375da
02018686: setptrbyte 0, 0x020186a5
0201868c: loadbytefromptr 0, 0x020375db
02018692: setptrbyte 0, 0x020186a6
02018698: setvar 32769, 0
0201869d: setvar 32770, 59
020186a2: addvar 32769, 0
020186a7: subvar 32770, 1
020186ac: compare_var_to_value 32770, 0
020186b1: goto_if 5, 0x020186a2
020186b7: addvar 32769, 3701
020186bc: loadbytefromptr 0, 0x02021dc5
020186c2: setptrbyte 0, 0x020186cb
020186c8: addvar 32769, 0
020186cd: loadbytefromptr 0, 0x020375da
020186d3: setptrbyte 0, 0x020186f2
020186d9: loadbytefromptr 0, 0x020375db
020186df: setptrbyte 0, 0x020186f3
020186e5: setvar 32769, 0
020186ea: setvar 32770, 181
020186ef: addvar 32769, 0
020186f4: subvar 32770, 1
020186f9: compare_var_to_value 32770, 0
020186fe: goto_if 5, 0x020186ef
02018704: addvar 32769, 4603
02018709: loadbytefromptr 0, 0x02021dc6
0201870f: setptrbyte 0, 0x02018718
02018715: addvar 32769, 0
0201871a: loadbytefromptr 0, 0x020375da
02018720: setptrbyte 0, 0x0201873f
02018726: loadbytefromptr 0, 0x020375db
0201872c: setptrbyte 0, 0x02018740
02018732: setvar 32769, 0
02018737: setvar 32770, 127
0201873c: addvar 32769, 0
02018741: subvar 32770, 1
02018746: compare_var_to_value 32770, 0
0201874b: goto_if 5, 0x0201873c
02018751: addvar 32769, 4663
02018756: loadbytefromptr 0, 0x02021dc7
0201875c: setptrbyte 0, 0x02018765
02018762: addvar 32769, 0
02018767: loadbytefromptr 0, 0x020375da
0201876d: setptrbyte 0, 0x0201878c
02018773: loadbytefromptr 0, 0x020375db
02018779: setptrbyte 0, 0x0201878d
0201877f: setvar 32769, 0
02018784: setvar 32770, 163
02018789: addvar 32769, 0
0201878e: subvar 32770, 1
02018793: compare_var_to_value 32770, 0
02018798: goto_if 5, 0x02018789
0201879e: addvar 32769, 4703
020187a3: loadbytefromptr 0, 0x02021dc8
020187a9: setptrbyte 0, 0x020187b2
020187af: addvar 32769, 0
020187b4: loadbytefromptr 0, 0x020375da
020187ba: setptrbyte 0, 0x020187d9
020187c0: loadbytefromptr 0, 0x020375db
020187c6: setptrbyte 0, 0x020187da
020187cc: setvar 32769, 0
020187d1: setvar 32770, 103
020187d6: addvar 32769, 0
020187db: subvar 32770, 1
020187e0: compare_var_to_value 32770, 0
020187e5: goto_if 5, 0x020187d6
020187eb: addvar 32769, 4219
020187f0: loadbytefromptr 0, 0x02021dc9
020187f6: setptrbyte 0, 0x020187ff
020187fc: addvar 32769, 0
02018801: loadbytefromptr 0, 0x020375da
02018807: setptrbyte 0, 0x02018826
0201880d: loadbytefromptr 0, 0x020375db
02018813: setptrbyte 0, 0x02018827
02018819: setvar 32769, 0
0201881e: setvar 32770, 163
02018823: addvar 32769, 0
02018828: subvar 32770, 1
0201882d: compare_var_to_value 32770, 0
02018832: goto_if 5, 0x02018823
02018838: addvar 32769, 6481
0201883d: loadbytefromptr 0, 0x02021dca
02018843: setptrbyte 0, 0x0201884c
02018849: addvar 32769, 0
0201884e: loadbytefromptr 0, 0x020375da
02018854: setptrbyte 0, 0x02018873
0201885a: loadbytefromptr 0, 0x020375db
02018860: setptrbyte 0, 0x02018874
02018866: setvar 32769, 0
0201886b: setvar 32770, 149
02018870: addvar 32769, 0
02018875: subvar 32770, 1
0201887a: compare_var_to_value 32770, 0
0201887f: goto_if 5, 0x02018870
02018885: addvar 32769, 6983
0201888a: loadbytefromptr 0, 0x02021dcb
02018890: setptrbyte 0, 0x02018899
02018896: addvar 32769, 0
0201889b: loadbytefromptr 0, 0x020375da
020188a1: setptrbyte 0, 0x020188c0
020188a7: loadbytefromptr 0, 0x020375db
020188ad: setptrbyte 0, 0x020188c1
020188b3: setvar 32769, 0
020188b8: setvar 32770, 193
020188bd: addvar 32769, 0
020188c2: subvar 32770, 1
020188c7: compare_var_to_value 32770, 0
020188cc: goto_if 5, 0x020188bd
020188d2: addvar 32769, 5407
020188d7: loadbytefromptr 0, 0x02021dcc
020188dd: setptrbyte 0, 0x020188e6
020188e3: addvar 32769, 0
020188e8: loadbytefromptr 0, 0x020375da
020188ee: setptrbyte 0, 0x0201890d
020188f4: loadbytefromptr 0, 0x020375db
020188fa: setptrbyte 0, 0x0201890e
02018900: setvar 32769, 0
02018905: setvar 32770, 211
0201890a: addvar 32769, 0
0201890f: subvar 32770, 1
02018914: compare_var_to_value 32770, 0
02018919: goto_if 5, 0x0201890a
0201891f: addvar 32769, 5297
02018924: loadbytefromptr 0, 0x02021dcd
0201892a: setptrbyte 0, 0x02018933
02018930: addvar 32769, 0
02018935: loadbytefromptr 0, 0x020375da
0201893b: setptrbyte 0, 0x0201895a
02018941: loadbytefromptr 0, 0x020375db
02018947: setptrbyte 0, 0x0201895b
0201894d: setvar 32769, 0
02018952: setvar 32770, 151
02018957: addvar 32769, 0
0201895c: subvar 32770, 1
02018961: compare_var_to_value 32770, 0
02018966: goto_if 5, 0x02018957
0201896c: addvar 32769, 5099
02018971: compare_var_to_value 32771, 45295
02018976: goto_if 5, 0x0201898d
0201897c: compare_var_to_value 32769, 54457
02018981: goto_if 5, 0x0201898d
02018987: setvar 32781, 1
0201898c: return

3
uniquemaps.sh

@ -0,0 +1,3 @@
#!/bin/sh
sha256sum maps/*.map | grep -v '^81974fba47083477159db7fc4ad40fda4adc0bde504f3d9a911cc61cf76ed5e9 ' | awk '{print $2}'

30
wholesome_reward.txt

@ -0,0 +1,30 @@
===============================================================================
THEZZAZZGLITCH'S FOOLS2022 - WHOLESOME REWARD
===============================================================================
Thank you for donating. You might not realize it, but it's been 7 years since
the first April Fools Event. Despite being a grown-ass man with a job and many
other responsibilities, I still do my best to keep this silly tradition going.
Did you know that I took a two week unpaid leave, just to work on Fools2022?
This was possible only because of your support last year. Thanks to this,
I was able to create a fully-online event, akin to 2018 one, while also taking
a leap to newer generation of games.
That being said, the Fools Events are possible only because of your continued
support. Whether you donate, or just enjoy the gameplay - you're playing a big
role in the Fools Event legacy. Thank you for being part of this wonderful
community and helping keep this long-living tradition alive!
Use the following code to unlock your Wholesome Reward perks:
0mG-y0Ur3-s0-AMaZ1nG-I-wAn7-T0-G1v3-U-M1lL10n5-0f-hUg5
Want to claim your reward?
- Go to the event site: https://zzazzdzz.github.io/fools2022
- Log in, or register if you haven't already
- Go to Settings
- Enter the code at the very bottom of the page
Hope you're having a nice day. Have fun exploring Glitchland!
~ TheZZAZZGlitch
Loading…
Cancel
Save