积分4544
UID37848
M币 个
M金 ¥
回帖0
主题
经验 点
祝福 消耗值
金币 个
阅读权限90
精华
注册时间2010-10-5
最后登录1970-1-1
|
HF上总结的AA存档格式
// ==================================================================
// Illusion Artificial Academy Savefile
// Written by:
// MrHands
// ==================================================================
//
// This document explains in clear language the savefile as used by
// Illusion in their latest game, Artificial Academy.
//
// It is intended for modders who want to write external tools.
//
// Save data
// ==================================================================
//
// The PNG standard is a flexible standard. There are a couple of
// tags you have to include to be considered a PNG (IHDR, IDAT and
// IEND), but you can add your own as you like. Image parsers that
// can't recognize simply skip it and move on to the next.
//
// Illusion decided not to use this extension and has instead tacked
// their data at the end of the file. Image parsers read up to the
// IEND tag in the image, while the game knows there is still data
// at the end.
//
// This document is an attempt to reverse engineer the sava data.
//
// To do this, I loaded the PNG image of a character into a hex
// editor and started editing files. Every value I post is in
// hexadecimal, so you can start playing with it on your own. Mod
// makers: I hope this will help you to understand the save file
// format Illusion uses.
//
// I use the free PSPad Editor for my haxxing. Try it, it has all
// kinds of cool stuff built in.
//
// Concepts
// ==================================================================
//
// Byte: a single chunk of data, contains a value between 0 and 255
//
// Hexadecimal: a system of numbering that has 16 as a base
//
// Decimal | Hexadecimal
// ---------------------
// 0 | 0x00
// 10 | 0x0A
// 16 | 0x10
// 120 | 0x78
// 255 | 0xFF
//
// String: a collection of printable characters
//
// Colors
// ==================================================================
//
// There are only a few valid colors for everything. For completion
// sake I have made a list. This is called a "look up table", because
// each data value is an index in a table of colors.
//
// Value | Looks like
// -------------------------
// 0x00 | Black
// 0x01 | Black
// 0x02 | Dark red
// 0x03 | Orange
// 0x04 | Dark green
// 0x05 | Dark blue
// 0x06 | Dark purple
// 0x07 | Dark gray
// 0x08 | Dark brown
// 0x09 | Red
// 0x10 | Orange
// 0x11 | Green
// 0x12 | Blue
// 0x13 | Pink
// 0x14 | Gray
// 0x15 | Brown
// 0x16 | Dark pink
// 0x17 | Yellow
// 0x18 | Yellow-green
// 0x19 | Light blue
// 0x20 | Darkish purple
// 0x21 | White
// 0x22 | Light brown
// 0x23 | Salmon
// 0x24 | Light yellow
// 0x25 | Light green
// 0x26 | Purple-blue
// 0x27 | Purple
//
// Strings
// ==================================================================
//
// They're encoded in a weird way. They seem to be in
// the exact opposite order you would expect. A is a high value while
// Z is a lower value. Here are the boundaries:
//
// a = 0x9E
// z = 0x85
// A = 0xBE
// Z = 0xA5
//
// This is the page I used to reverse engineer these codes:
//
// http://www.rikai.com/library/kan ... codes.unicode.shtml
//
// As you can see, the codes on the page are in reverse order.
//
// 0xFF is the end of string character. Here's an example string:
//
// B28D B79E 919B 8CFF = MrHands
//
// Format
// ==================================================================
//
// Enough talking! On to the actual bytes. Keep in mind this savedata
// starts at the first byte AFTER the IEND tag in the save image.
byte header[25]; // not sure what this does
// however, if you change it, the game
// complains about corrupted data
// so don't touch it
byte lastname[260]; // utf-8 or utf-16
// so the size can be 260 ascii
// or 130 japanese chars
byte firstname[260];
byte personality; // 0x00 - 0x14
byte unknown1[7];
byte extracurricular; // 0x00 - 0x05
byte unknown2;
byte height; // 0x01 - 0x02
byte figure; // 0x01 - 0x02
byte headsize; // 0x00 - 0xFF
byte breastsize; // 0x00 - 0xFF
byte areolasize; // 0x00 - 0xFF
byte nipplecolor; // 0x00 = pink
// 0x01 = red
// 0x02 = orange
// 0x03 = brown
byte nippleopacity; // 0x00 = transparant, 0xFF = opaque
byte waist; // 0x00 = thin, 0xFF = large
byte skincolor; // 0x00 = white
// 0x01 = white bikini
// 0x02 = white swimsuit
// 0x03 = white cover swimsuit
// 0x04 = brown
// 0x05 = brown bikini
// 0x06 = brown swimsuit
// 0x07 = brown cover swimsuit
// 0x08 = dark
// 0x09 = dark bikini
// 0x0A = dark swimsuit
// 0x0B = dark cover swimsuit
byte unknown3; // doesn't affect any of the tabs
// on any of the pages
// verified with screenshots
byte eyesize; // 0x00 = small
// 0x01 = medium
// 0x02 = large
byte eyebrowshape; // 0x00 - 0x10
byte eyebrowthickness; // 0x00 - 0x64
byte eyebrowcolor; // 0x00 - 0x1B
byte eyeposition; // 0x00 = low
// 0x01 = medium
// 0x02 = high
byte eyeinnercornerposition; // 0x00 - 0x02
byte eyenarrowness; // 0x00 - 0x02
byte eyeoutercornerposition; // 0x00 - 0x02
byte pupilshape; // 0x00 - 0x01
byte pupilsize; // 0x00 - 0x01
byte eyecolorleft; // 0x00 - 0x1B
byte eyecolorright; // 0x00 - 0x1B
byte glasses; // 0x00 = none
// 0x01 = thin
// 0x02 = thick
byte glassescolor; // 0x00 - 0x1B
byte hairfront; // 0x00 - 0x04
byte hairfrontmirrored; // 0x00 = false
// 0x01 = true
byte hairunknown1; // possibly connected to hair style
byte hairback; // 0x00 - 0x04
// it's quite possible that this is
// not a byte to indicate the back hair
// style, but a word (2 bytes)
// we can't know for sure until we get
// our greasy hands on the full product
byte hairunknown2; // possibly connected to hair style
byte hairsprout; // 0x00 = off
// 0x01 = on
byte haircolor; // 0x00 - 0x1B
byte voicepitch; // 0x00 - 0x04
byte scholasticachievements; // 0x00 - 0x05
byte agility; // 0x00 - 0x05
byte sexualexperience; // 0x00 = false
// 0x01 = true
// now follow a bunch of untranslated properties
// i don't know what they are in english, so i can't give proper labels :(
// sorry guys |
|