Jump to content

Recommended Posts

  • Donators
Posted
1 hour ago, Franco said:

I asked him in my comment above how he opened the file, but he didn't even answer.
Yes, this is exactly the problem. Some people ask for help when it comes to themselves, but they don't help anyone else.

Hi. The person who created this thread asked me for help, I am currently creating software, at the moment I have unpacked archives and decompressed data from them, I was also able to decrypt and extract the text, that's all for now, it is very difficult for me, that's why there is no news from him, also on the Internet there was a third-party localization that someone made in another language, there they changed both the text and the fonts, and they created a new archive that works in the game, but who these people were I have no data.

Posted
1 hour ago, ponaromixxx said:

Hi. The person who created this thread asked me for help, I am currently creating software, at the moment I have unpacked archives and decompressed data from them, I was also able to decrypt and extract the text, that's all for now, it is very difficult for me, that's why there is no news from him, also on the Internet there was a third-party localization that someone made in another language, there they changed both the text and the fonts, and they created a new archive that works in the game, but who these people were I have no data.

Hello. I don't quite understand. Does that mean you're building a vehicle for this game?

Posted
1 hour ago, ponaromixxx said:

Hi. The person who created this thread asked me for help, I am currently creating software, at the moment I have unpacked archives and decompressed data from them, I was also able to decrypt and extract the text, that's all for now, it is very difficult for me, that's why there is no news from him, also on the Internet there was a third-party localization that someone made in another language, there they changed both the text and the fonts, and they created a new archive that works in the game, but who these people were I have no data.

can you share the tool here, many people need it

Posted (edited)
1 hour ago, ponaromixxx said:

Kamzik123: AnvilToolkit was updated, I'm folding my version, since a working tool already exists, sorry

but you have to donate to him, €10 is too expensive, i think

Edited by Asmodeus
  • Haha 1
Posted
1 hour ago, NoobInCoding said:

I really don't suggest donating that guy (kamzik123)

I really like NoobInCoding tools and I'm still waiting for a tool from you for this game. Could you please take a look when you have time?

Posted
On 2025. 03. 29. at 21:17, ponaromixxx said:

Szia. A szál létrehozója kért tőlem segítséget, jelenleg szoftvert készítek, jelenleg archívumokat bontottam ki és kitömörítettem belőlük az adatokat, a szöveget is sikerült visszafejteni és kicsomagolni, egyelőre ennyi, nagyon nehéz, ezért nincs hír tőle, az interneten is volt egy harmadik féltől származó lokalizáció, hogy valaki megváltoztatta a betűtípust, és egy másik nyelven is létrehozta az új szöveget, és létrehoztak egy újat a játékot, de hogy kik voltak ezek az emberek, nincs adatom.

Here is a working localization:

https://gep.monster/games/assassin-s-creed-shadows

  • Engineers
Posted
On 3/31/2025 at 4:18 PM, Franco said:

I really like NoobInCoding tools and I'm still waiting for a tool from you for this game. Could you please take a look when you have time?

Well I updated my tool for ac shadows but as always (like other games) I will keep it private. Why? Because I don't want idiots to take my tool and sell their garbage translations without even leaving a little credit for me. 

If you need help, you can send me link of your other translations in pm (so I can make sure) and I will help you (I will send the text + put it back into game) to make a patch ( obviously I don't ask for money)

  • Like 2
  • Engineers
Posted

The kamzik123 texted me and I spoke with him and it seems that my view of him was wrong and there was a misunderstanding. He is currently not planning to release his tool until EOL for good reasons.

If you wanna translate this game you can get the texts from attached file and send me the translated version to get a forge patch. (still you must prove that you are a creator by sending the link of your old translations)

acs_texts.zip

  • Like 4
  • Thanks 1
  • Moderators
Posted

There was A LOT of discussion here that was not related to AC Shadows localization. As a moderator I couldn't allow that, so I've removed all off-topic posts.
From now on please post only comments that are directly connected with translation work. Thank you. 🙂 

  • Like 3
  • Thanks 4
  • 4 weeks later...
Posted

Python code to extract the texts:

import struct, codecs

BIN = "/mnt/data/menu_decompress.dat"
OUT = "/mnt/data/menu_decompress_output.txt"

be16 = lambda b, o: struct.unpack_from(">H", b, o)[0]
le32 = lambda b, o: struct.unpack_from("<I", b, o)[0]
be32 = lambda b, o: struct.unpack_from(">I", b, o)[0]

def read_wstr_be(buf, off):
    raw = bytearray()
    while off + 1 < len(buf):
        val = be16(buf, off)
        off += 2
        if val == 0:
            break
        raw += val.to_bytes(2, "big")
    return raw.decode("utf-16-be", errors="replace")

with open(BIN, "rb") as f:
    data = f.read()

p = 8
name_len = le32(data, p)
p += 4 + name_len + 1
p += 1 + 4 + 4 + 20 + 4 + 8
base = p
max_num = be16(data, p)
p += 2
count = be16(data, p)
p += 2
data_pos = p
p += count * 4
num_blocks = be16(data, p)
p += 2
tbl = p

memo, visiting = {}, set()
def tex(idx):
    if idx == 0: return ""
    if idx in memo: return memo[idx]
    if idx in visiting:
        memo[idx] = ""
        return ""
    visiting.add(idx)
    node_off = data_pos + idx * 4
    if node_off + 3 >= len(data):
        visiting.remove(idx)
        memo[idx] = ""
        return ""
    right = be16(data, node_off)
    left = be16(data, node_off + 2)
    s = read_wstr_be(data, node_off) if left == 0 else tex(left) + tex(right)
    visiting.remove(idx)
    memo[idx] = s
    return s

out = []
ptr = tbl
for _ in range(num_blocks):
    if ptr + 12 > len(data):
        break
    data_u = be32(data, ptr + 4) + base
    loc = be32(data, ptr + 8) + base + 2
    ptr += 12

    if loc - 2 >= len(data):
        continue
    rec_cnt = be16(data, loc - 2)
    pos_tmp = data_u

    for r in range(rec_cnt + 1):
        ent_off = loc + r * 4
        if ent_off + 1 >= len(data):
            break
        end = be16(data, ent_off) + data_u
        if end > len(data):
            break
        pos = pos_tmp
        buf = []
        while pos < end:
            b = data[pos]
            if b < max_num:
                buf.append(tex(b + 1))
                pos += 1
            elif b < 255:
                val = be16(data, pos) - 255 * max_num
                buf.append(tex(val + 1))
                pos += 2
            else:  # b == 255
                val = be16(data, pos + 1)
                buf.append(tex(val + 1))
                pos += 3
        out.append("".join(buf))
        pos_tmp = pos

with codecs.open(OUT, "w", "utf-8") as f:
    f.write("\n".join(out))

I can also work on repack if I find spare time.

  • Like 5
  • Supporter
Posted
3 hours ago, qrax said:

Python code to extract the texts:

import struct, codecs

BIN = "/mnt/data/menu_decompress.dat"
OUT = "/mnt/data/menu_decompress_output.txt"

be16 = lambda b, o: struct.unpack_from(">H", b, o)[0]
le32 = lambda b, o: struct.unpack_from("<I", b, o)[0]
be32 = lambda b, o: struct.unpack_from(">I", b, o)[0]

def read_wstr_be(buf, off):
    raw = bytearray()
    while off + 1 < len(buf):
        val = be16(buf, off)
        off += 2
        if val == 0:
            break
        raw += val.to_bytes(2, "big")
    return raw.decode("utf-16-be", errors="replace")

with open(BIN, "rb") as f:
    data = f.read()

p = 8
name_len = le32(data, p)
p += 4 + name_len + 1
p += 1 + 4 + 4 + 20 + 4 + 8
base = p
max_num = be16(data, p)
p += 2
count = be16(data, p)
p += 2
data_pos = p
p += count * 4
num_blocks = be16(data, p)
p += 2
tbl = p

memo, visiting = {}, set()
def tex(idx):
    if idx == 0: return ""
    if idx in memo: return memo[idx]
    if idx in visiting:
        memo[idx] = ""
        return ""
    visiting.add(idx)
    node_off = data_pos + idx * 4
    if node_off + 3 >= len(data):
        visiting.remove(idx)
        memo[idx] = ""
        return ""
    right = be16(data, node_off)
    left = be16(data, node_off + 2)
    s = read_wstr_be(data, node_off) if left == 0 else tex(left) + tex(right)
    visiting.remove(idx)
    memo[idx] = s
    return s

out = []
ptr = tbl
for _ in range(num_blocks):
    if ptr + 12 > len(data):
        break
    data_u = be32(data, ptr + 4) + base
    loc = be32(data, ptr + 8) + base + 2
    ptr += 12

    if loc - 2 >= len(data):
        continue
    rec_cnt = be16(data, loc - 2)
    pos_tmp = data_u

    for r in range(rec_cnt + 1):
        ent_off = loc + r * 4
        if ent_off + 1 >= len(data):
            break
        end = be16(data, ent_off) + data_u
        if end > len(data):
            break
        pos = pos_tmp
        buf = []
        while pos < end:
            b = data[pos]
            if b < max_num:
                buf.append(tex(b + 1))
                pos += 1
            elif b < 255:
                val = be16(data, pos) - 255 * max_num
                buf.append(tex(val + 1))
                pos += 2
            else:  # b == 255
                val = be16(data, pos + 1)
                buf.append(tex(val + 1))
                pos += 3
        out.append("".join(buf))
        pos_tmp = pos

with codecs.open(OUT, "w", "utf-8") as f:
    f.write("\n".join(out))

I can also work on repack if I find spare time.

Congratulations.! Good luck and good work. I wish you lots of free time.! 🙂 I hope you will help the community one day. 🙂

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...