a simple deserializer / serializer for Koikatu / EmotionCreators / Honeycome / SummerVacationScramble data.
Project description
KoikatuCharaLoader
A simple deserializer and serializer for character and scene data from Koikatu, EmotionCreators, Honeycome, SummerVacationScramble and Aicomi.
Installation
You can install the module from PyPI.
$ pip install kkloader
If this doesn't work, try the following command (this is typically needed for Windows users).
$ python -m pip install kkloader
If you just want to quickly try out this module, you can click the "Open In Colab" button above to run it directly on Colab.
Basic Usage
$ python
>>> from kkloader import KoikatuCharaData # Import the module.
>>> kc = KoikatuCharaData.load("./data/kk_chara.png") # Load character data.
>>> kc["Parameter"]["nickname"] # Print the character's nickname.
'かずのん'
>>> kc["Parameter"]["nickname"] = "chikarin" # Change the nickname.
>>> kc.save("./kk_chara_modified.png") # Save to `kk_chara_modified.png`.
That's it! :)
List of Classes
- Supports saving and loading:
KoikatuCharaDataKoikatuSceneDataEmocreCharaDataHoneycomeCharaDataSummerVacationCharaDataSummerVacationSaveDataAicomiCharaDataHoneycomeSceneData(also compatible with DigitalCraft)
- Supports loading only:
KoikatuSaveDataEmocreMapDataEmocreSceneData
Any class can be imported with from kkloader import KoikatuCharaData and data can be loaded using the .load(filename) method.
How Block Data Works
Koikatu character data consists of several block data sections. Each block data contains various character parameters. A typical Koikatu character data includes the following block data:
| name of blockdata | description |
|---|---|
| Custom | Values for the character's face, body, and hairstyle. |
| Coordinate | Values for clothes and accessories worn by characters. |
| Parameter | Values for character's name, birthday, preferences, etc. |
| Status | Values for clothed states, etc. (Usage in the game is unclear) |
| About | userID & dataID (added from Koikatu Sunshine) |
| KKEx | Data used by mods |
You can check which block data is present in blockdata from the KoikatuCharaData object:
>>> kc.blockdata
['Custom', 'Coordinate', 'Parameter', 'Status']
If there is block data in an unknown format, it can be found using unknown_blockdata.
Accessing Block Data
The block data can be accessed either as a member variable of the KoikatuCharaData class or as a dictionary.
>>> kc.Custom
<kkloader.KoikatuCharaData.Custom object at 0x7f406bf18460>
>>> kc["Custom"]
<kkloader.KoikatuCharaData.Custom object at 0x7f406bf18460>
As shown, both lines access the same kc.Custom.
Find Variables
You can try out the character information display from this program in your browser on this site. If you are looking to identify which variables to modify, this interface can serve as a useful starting point for narrowing down potential candidates.
By using the prettify method, the contents of the variables within the data block will be displayed in a more readable format.
This is useful for identifying which variables exist.
>>> kc["Custom"].prettify()
{
"face": {
"version": "0.0.2",
"shapeValueFace": [
...
],
"headId": 0,
"skinId": 0,
"detailId": 0,
"detailPower": 0.41674190759658813,
...
KKEx MessagePack Handling
The KKEx in blockdata sometimes contains fields encoded as raw bytes that are themselves MessagePack payloads.
kkloader automatically deserializes and reserializes such fields for known plugins listed in KKEx.NESTED_KEYS.
Export to JSON file
from kkloader import KoikatuCharaData
k = KoikatuCharaData.load("./data/kk_chara.png")
k.save_json("data.json")
data.json
{
"product_no": 100,
"header": "\u3010KoiKatuChara\u3011",
"version": "0.0.0",
"Custom": {
"face": {
"version": "0.0.2",
"shapeValueFace": [
0.5403226017951965,
1.0,
0.2016129046678543,
0.0,
0.22580644488334656,
0.0,
0.0,
0.1794193685054779,
0.0,
...
If you add include_image=True to the save_json function's arguments, base64-encoded images will be included in the JSON output.
Recipes
Change Character Name
from kkloader import KoikatuCharaData
k = KoikatuCharaData.load("./data/kk_chara.png")
k["Parameter"]["lastname"] = "春野"
k["Parameter"]["firstname"] = "千佳"
k["Parameter"]["nickname"] = "ちかりん"
k.save("./data/kk_chara_modified")
Set Character Height to 50
from kkloader import KoikatuCharaData
k = KoikatuCharaData.load("./data/kk_chara.png")
k["Custom"]["body"]["shapeValueBody"][0] = 0.5
k.save("./data/kk_chara_modified.png")
Convert Character Cards from EmotionCreators to Koikatu
ec_to_kk.py in the sample directory might be helpful.
Using this web app, you can easily perform the conversion directly from your browser.
Load Scene Data
The walk() method recursively traverses all objects including nested children (e.g., items attached to characters, objects inside folders).
from kkloader import KoikatuSceneData
scene = KoikatuSceneData.load("./data/kk_scene.png")
# Simple iteration over all objects
for key, obj in scene.walk():
obj_type = obj["type"]
print(f"Key: {key}, Type: {obj_type}")
# With depth information (useful for visualizing hierarchy)
for key, obj, depth in scene.walk(include_depth=True):
indent = " " * depth
obj_type = obj["type"]
print(f"{indent}[depth={depth}] Key: {key}, Type: {obj_type}")
Object types: 0=Character, 1=Item, 2=Light, 3=Folder, 4=Route, 5=Camera, 7=Text
Extract Character Data from Scene
You can easily extract character data using the walk() method above.
import copy
from kkloader import KoikatuSceneData
# Load scene data
scene = KoikatuSceneData.load("./data/kk_scene.png")
# Iterate over all objects in the scene
for _, obj_info in scene.walk():
# Type 0 represents character data
if obj_info["type"] == 0:
chara = obj_info["data"]["character"]
# Use face thumbnail as the character card image
chara.image = copy.deepcopy(chara.face_image)
# Save the character data
chara.save("./data/{}.png".format(name))
Others
Various examples using this module can be found in this repository, and you can also use it on this site.
Contributing
You'll need Python 3.11 and poetry command (you can install with pip install poetry).
- Fork the repository and pull the latest changes.
- Run
make installto install the dependencies. - Create a new branch and make changes to the code.
- Run
make formatandmake check - Once
make checkpasses, push the code and open a pull request on the repository.
Acknowledgements
Contact
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file kkloader-0.1.19.tar.gz.
File metadata
- Download URL: kkloader-0.1.19.tar.gz
- Upload date:
- Size: 47.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.3.2 CPython/3.11.14 Linux/6.11.0-1018-azure
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b70df78fc47fe7c67d451f3490bba0f62542e5e5d609cb83660760905af10dea
|
|
| MD5 |
dc10b23fba6d253d6fe6f8194bbac092
|
|
| BLAKE2b-256 |
f2ebd978d33908ff3d2e2a524b2110a45403116bd84db15e5702021446dd519e
|
File details
Details for the file kkloader-0.1.19-py3-none-any.whl.
File metadata
- Download URL: kkloader-0.1.19-py3-none-any.whl
- Upload date:
- Size: 52.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.3.2 CPython/3.11.14 Linux/6.11.0-1018-azure
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
08c7b76f5be577a2f7664850f8849ac843b448e1ae756f5eea1af25cc9fca5ef
|
|
| MD5 |
2dc4eede1645060a4bf78b0344d156e1
|
|
| BLAKE2b-256 |
50ea78382bb14ee71f4b9b2cb34a5a0dcdb50ff3382e7173355f56f41dd87a44
|