Sprites are made with D・紅茶's PSD resources.
https://d-koutya.fanbox.cc
===== Shortly about naming
On game load each sprite is initialized under certain category within a multi-level resource dictionary SPRITE_RES. Subcategories are defined via converting filename to path splitted by "-" symbol. I.e. "face-brows-normal" would create a key "face" inside SPRITE_RES and assign another empty dictionary to it, then add "brows" entry in it with another empty dictionary as a value and finally add "normal" item under "brows" under "face".
SPRITE_RES = {"face" : {"brows" : {"normal" : {}}}}
Any subsequent sprites will be added inside existing categories or create a new ones.
Every sprite name must match intended path in order for the game to find it.
===== Instruments and sprite set generation
When preparing a PSD, particular structure must persist as well for an easy batch export: this can be arranged with custom scripts. For photoshop I advise using this one:
https://github.com/antipalindrome/Photoshop-Export-Layers-to-Files-Fast
Download last release, extract .jsm and .json files from there and place them inside your photoshop directory under .
To use it, navigate to File -> Scripts and choose following settings:
・ Export -> Ignore Layers Starting With: !
・ Filenames -> Use layer and parent group names
・ Filenames -> Use custom delimiter: -
・ Export As -> PNG-24 with Transparency checked
・ Modify Layers -> Scale: 50%
Click "Save and Close". Now you just need a PSD with correct layout to prepare entire sprite set with only couple clicks.
===== Steps for creating a formalized PSD
Please follow next steps to minimize possible issues and excessive work. Keep in mind that these PSDs may be used by artists to complete character's sets in the future so everything must be of original size with transparent layout.
▌Open this txt and pin it on top of other windows using Notepad++;
▌Make a copy of PSD file and name it corresponding to character's .tsc file;
▌Open PSD and get rid of the root folder with character name so there are only 4-5 subfolders present on top level;
▌It would be helpful to disable layer thumbnails by clicking RMB on layers panel, there will be a LOT of them;
▌Delete 漫符 folder with stickers, rename other folders to "face", "wear" and "body" accordingly. Put 顔色 under "face" and create new "vanity" group;
▌Inside "face" there must be 4 groups: "emo", "brows", "eyes" and "mouth";
▌You may notice that there are multiple groups for the eyes, name two of them as "!opened" and "!half" accordingly, delete group with winking expressions (make it yourself later), move everything from the group with closed eyes and delete it too;
▌Rename unique expressions like "happy" or "angry" in "eyes" folder right away;
▌Find tears layer inside one of the groups, name it "tears" and move to "emo" group, tears in other groups should be the same so just delete them;
▌Back in "!opened" and "!half" folders, rename eyelashes layer to "lashes", find whites layer and rename to "whites";
▌Rename groups to "big", "big avert", "small", "small avert" like in example below both in "!opened" and "!half" folders;
▌Optionally, rename irises, sparkles and highlights layers inside each group as well for better clarity;
▌Next you're gonna combine these layers but keep the originals intact for future use:
- Select "lashes" and "whites" layers;
- Drag them while holding Alt to duplicate them, do this 12 times for any "big" group and 8 times for "small" groups;
- Duplicate each folder with irises 3 and 2 times accordingly and place it between "lashes" and "whites";
- Inside each copy hide both stars and highlights, only stars and keep both accordingly;
- Combine these sets;
▌Name each set according to the list, i.e. "normal" or "stars-avert-half" and move to "eyes" root folder;
-[eyes]
└ -[!opened] // keep this for reference, won't be exported
└ lashes // duplicate this to combine in a new layer
└ -[big] // duplicate this to combine in a new layer
└ stars // better rename for clarity
└ spec // better rename for clarity
└ iris // better rename for clarity
└ +[big avert] // keep this for reference
└ +[small] // keep this for reference
└ +[small avert] // keep this for reference
└ whites // duplicate this to combine in a new layer
└ +[!half] // keep this for reference, won't be exported
└ closed // these must be already present, just rename
└ happy // these must be already present, just rename
└ normal // place combined layers here
└ stars-avert-half // place combined layers here
▌Once main expressions are ready, hide "!opened" and "!half" folders, hopefully won't need them anymore;
▌Combine existing layers to make "wink" and "drunk" expressions;
▌Now proceed to eyebrows and mouth sprites, that should be much easier;
▌Rename 4 eyebrows layers to "normal", "sad", "angry" and "surprised", duplicate normal one and move few pixels higher, call it "raised";
▌It may be difficult to match all mouths with listed expressions, name every unused layer as "!pending" and place them to the top of "mouth" group;
▌If nothing left for "normal" expression, just duplicate one you think character is more proned to;
▌For wear layers try to split them when possible, i.e. split bikini to "swim-top" and "swim-bot", if set has no underwear - name it "bra" and "panties" instead;
▌[!!!] Now important part: every PSD must be cropped/expanded to a power of 100px with head centered horizontally. You can use the scale from an example to see how much pixels to cut or add from each side. If you set up export script correctly, outcoming layers will have half size with 0 at the end:
1730x1180 -> 1700x1200 -> 850x600
1380x830 -> 1800x900 -> 900x450 (oversized due to head X position)
===== Notes
・ Below is the list of allowed filenames that are recognized by the engine.
・ Mandatory layers are marked with , any other are optional but the more the better.
・ Addition of "-backdrop" to the end of a filename will load that piece along with a base sprite but it will be drawn behind anything else, useful for garments and some hats (wings/tails have negative z-order already).
・ Addition of "-foredrop" will draw the sprite with body z-order, useful for shadows.
・ Some sprites may have a variation number in the end, i.e. pubic hair style/growth stage or clothes deterioration. If a sprite with no number exists, game will consider it as the only one.
face-emo-blush use the most intense one
face-emo-shade [?] face shadow
face-emo-tears [?] for use only with opened eyes
face-emo-tears-closed [?] for use only with closed eyes
face-brows-normal - -
face-brows-sad [?] / \
face-brows-angry [?] \ /
face-brows-surprised [?] - \ might need to make this one yourself
face-brows-raised - - but little higher
face-eyes-normal ( Э)(Э ) regular eyes
face-eyes-empty [?] ( O)(O ) no highlight
face-eyes-stars [?] ( ✧)(✧ ) starred eyes
face-eyes-normal-avert [?] (Э )(Э ) regular eyes, looking aside
face-eyes-stars-avert [?] (✧ )(✧ ) starred eyes, looking aside
face-eyes-empty-avert [?] (O )(O ) no highlight, looking aside
face-eyes-normal-small [?] ( э)(э ) small irises
face-eyes-empty-small [?] ( o)(o ) no highlight
face-eyes-normal-small-avert [?] (э )(э ) small irises, looking aside
face-eyes-empty-small-avert [?] (o )(o ) no highlight, looking aside
face-eyes-normal-half [?] same as above but half-closed
face-eyes-empty-half [?] same as above but half-closed
face-eyes-normal-avert-half [?] same as above but half-closed
face-eyes-empty-avert-half [?] same as above but half-closed
face-eyes-normal-small-half [?] same as above but half-closed
face-eyes-empty-small-half [?] same as above but half-closed
face-eyes-normal-small-avert-half [?] same as above but half-closed
face-eyes-empty-small-avert-half [?] same as above but half-closed
face-eyes-closed - -
face-eyes-wink [?] - o
face-eyes-drunk [?] o O
face-eyes-happy [?] ^ ^
face-eyes-angry [?] > <
face-eyes-funny [?] @ @
face-eyes-goofy [?] σ σ / ● ● - confused or surprised
face-eyes-smirk [?] ● ● / σ σ - incase of smug
face-mouth-normal neutral expression or smile
face-mouth-smile [?] kinda must have too
face-mouth-sad [?] kinda must have too
face-mouth-open [?] any open, better neutral expression
face-mouth-wide [?] wide open
face-mouth-happy [?] open smile
face-mouth-timid [?] little opened (saying o)
face-mouth-shy [?] a "~" like shape
face-mouth-clench [?] teeth visible
face-mouth-grin [?] sinister smile
face-mouth-meh [?] annoyed or tired
face-mouth-tongue [?] tongue out, not present in psds
vanity-headdress [?] persistent head accessory (not a hat)
vanity-hairdress [?] persistent hair accessory (secondary)
vanity-glasses
vanity-ears
vanity-wings
vanity-tail
vanity-vibrator [?] pink egg
vanity-gag [?] mouth gag
vanity-item [?] something else (Satori eye?)
vanity-weapon [?] stopwatch on Sakuya, spear on Remilia etc.
wear-?????-backdrop [?] background addition to any piece, behind everything
wear-?????-foredrop [?] background addition to any piece, behind other wears
wear-?????-torn [?] damaged variation
wear-?????-sleep [?] pajama variant, preferable for "upper" and "lower"
wear-?????-swim [?] swimming gear, preferable for "bra" and "panties"
wear-?????-parade [?] holiday variant
wear-?????-winter [?] warm variant
wear-hat [?] do not confuse with headwear
wear-garment [?] cloak, coat, can cover entire body
wear-uppest
wear-lowest
wear-upper
wear-lower
wear-bra
wear-panties
wear-belt
wear-gloves
wear-pantyhose
wear-socks
wear-boots
wear-towel-full [?] bathing set, full coverage
wear-towel-top [?] bathing set, lifted
wear-towel-bot [?] bathing set, wear on hips (topless)
wear-bandaids-top [?] alternate underwear
wear-bandaids-bot [?] alternate underwear
wear-bondage [?] ropes
body-base just a body+hair with no visible nipples
body-mask [?] bitmap mask for skin only (no hair included)
body-wetness [?] overlay for stat
body-dirtiness [?] overlay for stat
body-genitals-female-0 [WIP] vagina; arousal stage 0 or default
body-genitals-male-0 [WIP] penis + balls; erection stage 0 or default
body-genitals-futa-0 [WIP] penis only; erection stage 0 or default
body-nipples-0 [WIP] pregnancy stage 0 or default
body-hair-pubic-0 [WIP] growth stage 0 or default
body-hair-pubic-16 [WIP] thin lane
body-hair-pubic-32 [WIP] trimmed stage 0
body-hair-pubic-48 [WIP] triangle stage 0
body-hair-pubic-64 [WIP] heart-shaped stage 0
body-hair-armpit-0 [WIP] growth stage 0 or default