Skip to content

Instantly share code, notes, and snippets.

@UserUnknownFactor
UserUnknownFactor / rpgm_strip.py
Last active September 5, 2024 17:11
Python tool to strip unused assets (images/audio) form RPG Maker MV/MZ games.
import json, io, logging, re, sys
from pathlib import Path
from enum import Enum
# Logging setup
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
handler = logging.StreamHandler(sys.stdout)
handler.setFormatter(logging.Formatter('%(message)s'))
logger.addHandler(handler)
@UserUnknownFactor
UserUnknownFactor / pycryptojs.py
Last active August 27, 2024 15:28
Tool to decrypt/encrypt CryptoJS encrypted files in Python
# Tool to decrypt/encrypt CryptoJS encrypted files in Python
import os, base64, glob
from hashlib import md5
from Crypto.Cipher import AES # requires: pip install pycryptodome
from Crypto import Random
STREAM_PREFIX = b"Salted__"
def pad(s):
@UserUnknownFactor
UserUnknownFactor / animate_pngs.py
Last active August 22, 2024 15:37
Tool to find images named prefix_NN_postfix.png and convert them to APNGs
import os, re, glob
import numpy as np
from PIL import Image, ImageChops
from collections import defaultdict
# Finds sequences of images with common name part+_<frame#>_etc.png
# and merges them into a single animated PNG.
INITIAL_SPEED = 20
TYPE2 = True
@UserUnknownFactor
UserUnknownFactor / diff_pngs.py
Created August 22, 2024 12:00
Python script for automatic diffing of PNGs
# -*- coding: utf-8 -*-
# This script finds all PNGs of similar looks/size in the specified
# folder and produces a base image and a series of diffs with it.
import os
import sys
from PIL import Image
import numpy as np
from collections import defaultdict
DIFF_THRESHOLD = 0 # Adjust this based on diff sensitivity needed
@UserUnknownFactor
UserUnknownFactor / split_by_sig.py
Created July 4, 2024 13:54
Split a file into two by binary signature
import argparse, shutil, os
def find_and_dump(file_path, signature, ext1, ext2):
"""Finds a byte signature in a file and dumps the content before and after that point.
Args:
file_path: Path to the file to search.
signature: Byte signature to search for.
ext: Extension to use for the output files.
@UserUnknownFactor
UserUnknownFactor / apply_texts.py
Last active June 30, 2024 10:21
Tools for mass image translation (text applying tested on PGMMV with images of the same type/size that only differ in text area)
import os, csv, glob, re
from PIL import Image, ImageDraw, ImageFont
"""
This tool can read translations from:
`original→translation→image_without_extension[;text_pos_x,text_pos_y;overlay_path;overlay_x,overlay_y;custom_font;font_size;font_color]`
formatted .csv file and apply it to all images in the specified folder, after replacing
background to a specified image at specified coordinates. Text supports colored borders
and style tags like <b>, <i> (not enabled now) or <color="#ff0000"> in the text.
All stuff is only configurable in the code.
"""
@UserUnknownFactor
UserUnknownFactor / pymd5.py
Last active May 24, 2024 08:18
Pure Python implementation of MD5 algorithm for experiments and custom mods
#!/usr/bin/python3
# RSA Data Security, Inc., MD5 message-digest algorithm
# Copyright (C) 1991-1992, RSA Data Security, Inc.
"""
## pymd5 module
### The MD5 hash implementation in pure Python
The module exposes same methods as hashlib.md5 and a couple of
low-level methods to help with crypto experiments.
@UserUnknownFactor
UserUnknownFactor / pgmmv_dec.py
Last active May 25, 2024 08:16
PGM MV file decryptor with a separate Twofish cryptography library
try:
from twofish import Twofish # use github.com/blazepaws/python-twofish
except:
from pytwofish import Twofish # since the included implementation is slow
import struct
from typing import List
from base64 import b64decode
import os
import json
@UserUnknownFactor
UserUnknownFactor / rpa_unpacker.py
Created March 8, 2024 12:47
Renpy raw .rpyc string extractor and repacker (useful if other tools fail to extract the strings)
#!/usr/bin/env python3
from __future__ import print_function
import sys
import os
import codecs
import errno
import random
try:
import pickle5 as pickle
var commandNames = {
"101":"Show Text",
"102":"Show Choices",
"103":"Input Number",
"104":"Select Item",
"402":"When [**]",
"403":"When Cancel",
"103":"Input Number",
"104":"Select Item",
"105":"Show Scrolling Text",