.
This commit is contained in:
parent
f8cc5a50db
commit
8ebad01de8
1 changed files with 14 additions and 26 deletions
40
bwmap.py
40
bwmap.py
|
@ -21,8 +21,10 @@ scmdraft_req = b"ERA ~DIM ~TILE~UNIT~PUNI~IOWN~THG2~SPRP~WAV ~MASK~STR ~OWNR~SID
|
||||||
# STR kinda (can be empty for melee)
|
# STR kinda (can be empty for melee)
|
||||||
melee_req = b"VER ~TYPE~VCOD~OWNR~SIDE~COLR~ERA ~DIM ~MTXM~UNIT~THG2~STR ~SPRP~FORC".split(b"~")
|
melee_req = b"VER ~TYPE~VCOD~OWNR~SIDE~COLR~ERA ~DIM ~MTXM~UNIT~THG2~STR ~SPRP~FORC".split(b"~")
|
||||||
|
|
||||||
#both_req = set(melee_req + scmdraft_req)
|
# TODO: try more things to add to this list.
|
||||||
#print(b"~".join(both_req))
|
ums_req = melee_req + b"MRGN~PTEx~PUPx~TECx~TRIG~UNIx~UPGx~UPRP".split(b"~")
|
||||||
|
|
||||||
|
both_req = set(melee_req + scmdraft_req)
|
||||||
|
|
||||||
known_keys = [ # in the order we want to write them.
|
known_keys = [ # in the order we want to write them.
|
||||||
# boring filetype stuff
|
# boring filetype stuff
|
||||||
|
@ -79,15 +81,7 @@ known_keys = [ # in the order we want to write them.
|
||||||
b"STR ", # string data
|
b"STR ", # string data
|
||||||
]
|
]
|
||||||
|
|
||||||
skippable_keys = [
|
skippable_keys = set(known_keys).symmetric_difference(both_req)
|
||||||
b"ISOM",
|
|
||||||
b"PTEC",
|
|
||||||
b"SWNM",
|
|
||||||
b"TECS",
|
|
||||||
b"UNIS",
|
|
||||||
b"UPGR",
|
|
||||||
b"UPGS",
|
|
||||||
]
|
|
||||||
|
|
||||||
vcod_valid = b"\
|
vcod_valid = b"\
|
||||||
\x34\x19\xCA\x77\x99\xDC\x68\x71\x0A\x60\xBF\xC3\xA7\xE7\x75\xA7\
|
\x34\x19\xCA\x77\x99\xDC\x68\x71\x0A\x60\xBF\xC3\xA7\xE7\x75\xA7\
|
||||||
|
@ -175,7 +169,7 @@ def readit(f):
|
||||||
k = f.read(4)
|
k = f.read(4)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
name = k.decode('utf-8')#, errors="replace")
|
name = k.decode('ascii')
|
||||||
except UnicodeDecodeError:
|
except UnicodeDecodeError:
|
||||||
print("! skipping invalid section name:", k)
|
print("! skipping invalid section name:", k)
|
||||||
size = U("<l", f.read(4))[0]
|
size = U("<l", f.read(4))[0]
|
||||||
|
@ -194,7 +188,6 @@ def readit(f):
|
||||||
print("expected:", size)
|
print("expected:", size)
|
||||||
return
|
return
|
||||||
|
|
||||||
#print("heresay: {:X}".format(f.tell()))
|
|
||||||
#if k not in b"ERA ~DIM ~MTXM~THG2~UNIT".split(b"~"): continue
|
#if k not in b"ERA ~DIM ~MTXM~THG2~UNIT".split(b"~"): continue
|
||||||
|
|
||||||
if k not in src:
|
if k not in src:
|
||||||
|
@ -215,7 +208,6 @@ def makestringtable(strings):
|
||||||
o = count * 2 + 3
|
o = count * 2 + 3
|
||||||
for s in strings:
|
for s in strings:
|
||||||
offsets += [o]
|
offsets += [o]
|
||||||
# FIXME: offsets are still broken.
|
|
||||||
o += len(s) + 1
|
o += len(s) + 1
|
||||||
|
|
||||||
out = P("<H", count)
|
out = P("<H", count)
|
||||||
|
@ -229,8 +221,7 @@ def rewrite(src):
|
||||||
if b"STR " not in src:
|
if b"STR " not in src:
|
||||||
return
|
return
|
||||||
|
|
||||||
ok = b"MRGN~MBRF~TRIG~SPRP~FORC~WAV ~UNIx~SWNM"
|
ok = b"MRGN~MBRF~TRIG~SPRP~FORC~WAV ~UNIx~SWNM".split(b"~")
|
||||||
ok = ok.split(b"~")
|
|
||||||
|
|
||||||
refs = []
|
refs = []
|
||||||
|
|
||||||
|
@ -414,17 +405,16 @@ def writeit(f, src):
|
||||||
assert b"DIM " in src # TODO: try to guess map dimensions.
|
assert b"DIM " in src # TODO: try to guess map dimensions.
|
||||||
|
|
||||||
if b"COLR" not in src:
|
if b"COLR" not in src:
|
||||||
#src[b"COLR"] = [b"\0\1\2\3\4\5\6\7\13\13\13\13"]
|
|
||||||
src[b"COLR"] = [b"\0\1\2\3\4\5\6\7"]
|
src[b"COLR"] = [b"\0\1\2\3\4\5\6\7"]
|
||||||
|
|
||||||
if b"MASK" not in src:
|
# SCMDraft 2 seems to require this to be the correct length.
|
||||||
# SCMDraft 2 seems to require this to exist and be the correct length.
|
if b"MASK" not in src or len(src[b"MASK"][0]) != w * h:
|
||||||
src[b"MASK"] = [b"\xFF" * (w * h)]
|
src[b"MASK"] = [b"\xFF" * (w * h)]
|
||||||
|
|
||||||
if b"STR " not in src:
|
if b"STR " not in src:
|
||||||
src[b"STR "] = [b""]
|
src[b"STR "] = [b""]
|
||||||
|
|
||||||
# SCMDraft 2 calls these both "player settings", so i'm grouping then.
|
# SCMDraft 2 calls this "player settings" in its errors.
|
||||||
if b"OWNR" not in src:
|
if b"OWNR" not in src:
|
||||||
b = b""
|
b = b""
|
||||||
for i in range(12):
|
for i in range(12):
|
||||||
|
@ -432,13 +422,8 @@ def writeit(f, src):
|
||||||
src[b"OWNR"] = [b]
|
src[b"OWNR"] = [b]
|
||||||
assert len(b) == 12, b
|
assert len(b) == 12, b
|
||||||
|
|
||||||
|
# SCMDraft 2 calls this "player settings" in its errors.
|
||||||
if b"SIDE" not in src:
|
if b"SIDE" not in src:
|
||||||
# b = b""
|
|
||||||
# for i in range(8):
|
|
||||||
# b += b"\5" if placed_starts[i] else b"\6"
|
|
||||||
# b += b"\7\7\7\4"
|
|
||||||
# src[b"SIDE"] = [b]
|
|
||||||
# assert len(b) == 12, b
|
|
||||||
src[b"SIDE"] = [b"\5\5\5\5\5\5\5\5\7\7\7\4"]
|
src[b"SIDE"] = [b"\5\5\5\5\5\5\5\5\7\7\7\4"]
|
||||||
|
|
||||||
if b"FORC" not in src:
|
if b"FORC" not in src:
|
||||||
|
@ -500,6 +485,9 @@ def writeit(f, src):
|
||||||
for k in melee_req:
|
for k in melee_req:
|
||||||
if k not in wroteonce:
|
if k not in wroteonce:
|
||||||
print("# map might not open in StarCraft (Melee). missing", k)
|
print("# map might not open in StarCraft (Melee). missing", k)
|
||||||
|
for k in ums_req:
|
||||||
|
if k not in wroteonce:
|
||||||
|
print("# map might not open in StarCraft (Use Map Settings). missing", k)
|
||||||
|
|
||||||
def run(args):
|
def run(args):
|
||||||
for fn in args:
|
for fn in args:
|
||||||
|
|
Loading…
Reference in a new issue