diff --git a/game/characters/astoria/body/front.webp b/game/characters/astoria/bodyparts/frame/default/skin.webp similarity index 100% rename from game/characters/astoria/body/front.webp rename to game/characters/astoria/bodyparts/frame/default/skin.webp diff --git a/game/characters/cho/body/front.webp b/game/characters/cho/bodyparts/frame/default/skin.webp similarity index 100% rename from game/characters/cho/body/front.webp rename to game/characters/cho/bodyparts/frame/default/skin.webp diff --git a/game/characters/hermione/clothes/accessory/potion_expand_breasts1/skin.webp b/game/characters/hermione/bodyparts/chest/big1/skin.webp similarity index 100% rename from game/characters/hermione/clothes/accessory/potion_expand_breasts1/skin.webp rename to game/characters/hermione/bodyparts/chest/big1/skin.webp diff --git a/game/characters/hermione/clothes/accessory/potion_expand_breasts2/skin.webp b/game/characters/hermione/bodyparts/chest/big2/skin.webp similarity index 100% rename from game/characters/hermione/clothes/accessory/potion_expand_breasts2/skin.webp rename to game/characters/hermione/bodyparts/chest/big2/skin.webp diff --git a/game/characters/hermione/clothes/accessory/potion_expand_breasts3/skin.webp b/game/characters/hermione/bodyparts/chest/big3/skin.webp similarity index 100% rename from game/characters/hermione/clothes/accessory/potion_expand_breasts3/skin.webp rename to game/characters/hermione/bodyparts/chest/big3/skin.webp diff --git a/game/characters/hermione/body/front.webp b/game/characters/hermione/bodyparts/frame/default/skin.webp similarity index 100% rename from game/characters/hermione/body/front.webp rename to game/characters/hermione/bodyparts/frame/default/skin.webp diff --git a/game/characters/hermione/clothes/accessory/potion_expand_ass1/skin.webp b/game/characters/hermione/bodyparts/hips/big1/skin.webp similarity index 100% rename from game/characters/hermione/clothes/accessory/potion_expand_ass1/skin.webp rename to game/characters/hermione/bodyparts/hips/big1/skin.webp diff --git a/game/characters/hermione/clothes/accessory/potion_expand_ass2/skin.webp b/game/characters/hermione/bodyparts/hips/big2/skin.webp similarity index 100% rename from game/characters/hermione/clothes/accessory/potion_expand_ass2/skin.webp rename to game/characters/hermione/bodyparts/hips/big2/skin.webp diff --git a/game/characters/hermione/clothes/accessory/potion_expand_ass3/skin.webp b/game/characters/hermione/bodyparts/hips/big3/skin.webp similarity index 100% rename from game/characters/hermione/clothes/accessory/potion_expand_ass3/skin.webp rename to game/characters/hermione/bodyparts/hips/big3/skin.webp diff --git a/game/characters/hermione/clothes/buttplug/buttplug_large_1/0.webp b/game/characters/hermione/clothes/accessory/buttplug_large_1/0.webp similarity index 100% rename from game/characters/hermione/clothes/buttplug/buttplug_large_1/0.webp rename to game/characters/hermione/clothes/accessory/buttplug_large_1/0.webp diff --git a/game/characters/hermione/clothes/buttplug/buttplug_large_1/1.webp b/game/characters/hermione/clothes/accessory/buttplug_large_1/1.webp similarity index 100% rename from game/characters/hermione/clothes/buttplug/buttplug_large_1/1.webp rename to game/characters/hermione/clothes/accessory/buttplug_large_1/1.webp diff --git a/game/characters/hermione/clothes/buttplug/buttplug_large_1/2.webp b/game/characters/hermione/clothes/accessory/buttplug_large_1/2.webp similarity index 100% rename from game/characters/hermione/clothes/buttplug/buttplug_large_1/2.webp rename to game/characters/hermione/clothes/accessory/buttplug_large_1/2.webp diff --git a/game/characters/hermione/clothes/buttplug/buttplug_large_1/outline.webp b/game/characters/hermione/clothes/accessory/buttplug_large_1/outline.webp similarity index 100% rename from game/characters/hermione/clothes/buttplug/buttplug_large_1/outline.webp rename to game/characters/hermione/clothes/accessory/buttplug_large_1/outline.webp diff --git a/game/characters/hermione/clothes/buttplug/buttplug_medium_1/0.webp b/game/characters/hermione/clothes/accessory/buttplug_medium_1/0.webp similarity index 100% rename from game/characters/hermione/clothes/buttplug/buttplug_medium_1/0.webp rename to game/characters/hermione/clothes/accessory/buttplug_medium_1/0.webp diff --git a/game/characters/hermione/clothes/buttplug/buttplug_medium_1/1.webp b/game/characters/hermione/clothes/accessory/buttplug_medium_1/1.webp similarity index 100% rename from game/characters/hermione/clothes/buttplug/buttplug_medium_1/1.webp rename to game/characters/hermione/clothes/accessory/buttplug_medium_1/1.webp diff --git a/game/characters/hermione/clothes/buttplug/buttplug_medium_1/2.webp b/game/characters/hermione/clothes/accessory/buttplug_medium_1/2.webp similarity index 100% rename from game/characters/hermione/clothes/buttplug/buttplug_medium_1/2.webp rename to game/characters/hermione/clothes/accessory/buttplug_medium_1/2.webp diff --git a/game/characters/hermione/clothes/buttplug/buttplug_medium_1/3.webp b/game/characters/hermione/clothes/accessory/buttplug_medium_1/3.webp similarity index 100% rename from game/characters/hermione/clothes/buttplug/buttplug_medium_1/3.webp rename to game/characters/hermione/clothes/accessory/buttplug_medium_1/3.webp diff --git a/game/characters/hermione/clothes/buttplug/buttplug_medium_1/outline.webp b/game/characters/hermione/clothes/accessory/buttplug_medium_1/outline.webp similarity index 100% rename from game/characters/hermione/clothes/buttplug/buttplug_medium_1/outline.webp rename to game/characters/hermione/clothes/accessory/buttplug_medium_1/outline.webp diff --git a/game/characters/hermione/clothes/buttplug/buttplug_small_1/0.webp b/game/characters/hermione/clothes/accessory/buttplug_small_1/0.webp similarity index 100% rename from game/characters/hermione/clothes/buttplug/buttplug_small_1/0.webp rename to game/characters/hermione/clothes/accessory/buttplug_small_1/0.webp diff --git a/game/characters/hermione/clothes/buttplug/buttplug_small_1/1.webp b/game/characters/hermione/clothes/accessory/buttplug_small_1/1.webp similarity index 100% rename from game/characters/hermione/clothes/buttplug/buttplug_small_1/1.webp rename to game/characters/hermione/clothes/accessory/buttplug_small_1/1.webp diff --git a/game/characters/hermione/clothes/buttplug/buttplug_small_1/outline.webp b/game/characters/hermione/clothes/accessory/buttplug_small_1/outline.webp similarity index 100% rename from game/characters/hermione/clothes/buttplug/buttplug_small_1/outline.webp rename to game/characters/hermione/clothes/accessory/buttplug_small_1/outline.webp diff --git a/game/characters/hermione/clothes/tattoo/bunny_tattoo1/0.webp b/game/characters/hermione/clothes/tattoo/bunny_tattoo/0.webp similarity index 100% rename from game/characters/hermione/clothes/tattoo/bunny_tattoo1/0.webp rename to game/characters/hermione/clothes/tattoo/bunny_tattoo/0.webp diff --git a/game/characters/hermione/face/mouth/open_wide/expression.webp b/game/characters/hermione/face/mouth/open_wide_tongue/expression.webp similarity index 100% rename from game/characters/hermione/face/mouth/open_wide/expression.webp rename to game/characters/hermione/face/mouth/open_wide_tongue/expression.webp diff --git a/game/characters/hooch/body/front.webp b/game/characters/hooch/bodyparts/frame/default/skin.webp similarity index 100% rename from game/characters/hooch/body/front.webp rename to game/characters/hooch/bodyparts/frame/default/skin.webp diff --git a/game/characters/luna/body/front.webp b/game/characters/luna/bodyparts/frame/default/skin.webp similarity index 100% rename from game/characters/luna/body/front.webp rename to game/characters/luna/bodyparts/frame/default/skin.webp diff --git a/game/characters/susan/body/front.webp b/game/characters/susan/bodyparts/frame/default/skin.webp similarity index 100% rename from game/characters/susan/body/front.webp rename to game/characters/susan/bodyparts/frame/default/skin.webp diff --git a/game/characters/tonks/body/front.webp b/game/characters/tonks/bodyparts/frame/default/skin.webp similarity index 100% rename from game/characters/tonks/body/front.webp rename to game/characters/tonks/bodyparts/frame/default/skin.webp diff --git a/game/scripts/characters/astoria/wardrobe.rpy b/game/scripts/characters/astoria/wardrobe.rpy index 5ab3ed05..5db16bed 100644 --- a/game/scripts/characters/astoria/wardrobe.rpy +++ b/game/scripts/characters/astoria/wardrobe.rpy @@ -4,6 +4,9 @@ default astoria = Doll(name="astoria") +default ast_frame_default = DollBodypart("astoria", ("hidden", "frame"), "frame", "default") +default ast_body_default = DollOutfit([ast_frame_default], hidden=True) + ########## ## Hair ## ########## diff --git a/game/scripts/characters/cho/summon.rpy b/game/scripts/characters/cho/summon.rpy index 6c24703d..30b66e0a 100644 --- a/game/scripts/characters/cho/summon.rpy +++ b/game/scripts/characters/cho/summon.rpy @@ -146,9 +146,9 @@ label summon_cho: stop music fadeout 3.0 if cho_mood == 0: - cho "Goodbye, [cho_genie_name]." ("base") + cho "Goodbye, [cho_genie_name]." ("base", "base", "base", "mid") else: - cho "Goodbye, [cho_genie_name]." ("annoyed") + cho "Goodbye, [cho_genie_name]." ("annoyed", "base", "base", "L") call play_sound("door") diff --git a/game/scripts/characters/cho/wardrobe.rpy b/game/scripts/characters/cho/wardrobe.rpy index 62650cf6..45a259d3 100644 --- a/game/scripts/characters/cho/wardrobe.rpy +++ b/game/scripts/characters/cho/wardrobe.rpy @@ -4,6 +4,9 @@ default cho = Doll(name="cho") +default cho_frame_default = DollBodypart("cho", ("hidden", "frame"), "frame", "default") +default cho_body_default = DollOutfit([cho_frame_default], hidden=True) + ########## ## Hair ## ########## diff --git a/game/scripts/characters/hermione/events/potions/ass_expand.rpy b/game/scripts/characters/hermione/events/potions/ass_expand.rpy index 8ec5f470..49e0b67a 100644 --- a/game/scripts/characters/hermione/events/potions/ass_expand.rpy +++ b/game/scripts/characters/hermione/events/potions/ass_expand.rpy @@ -330,7 +330,7 @@ label her_potion_ass_give: gen "It appears the potion is working." ("base", xpos="far_left", ypos="head") her "It-- Hold on, is it--" ("angry", "wide", "base", "mid", cheeks="blush") - $ hermione.equip(her_potion_expand_ass1) + $ hermione.equip(her_hips_ass1) $ renpy.sound.play("sounds/boing05.ogg") with d3 @@ -340,8 +340,7 @@ label her_potion_ass_give: gen "I assure you I had no idea [hermione_name], it was only meant to spank you a little." ("base", xpos="far_left", ypos="head") her "Then how come it's--" ("soft", "narrow", "annoyed", "down", cheeks="blush") - $ hermione.unequip("accessory") - $ hermione.equip(her_potion_expand_ass2) + $ hermione.equip(her_hips_ass2) $ renpy.sound.play("sounds/boing05.ogg") with d3 @@ -351,8 +350,7 @@ label her_potion_ass_give: gen "Well, it is an untested potion to be fair... You'll have to expect some side effects." ("base", xpos="far_left", ypos="head") her "Side effects? But you assured me this potion was--" ("clench", "narrow", "worried", "down", cheeks="blush") - $ hermione.unequip("accessory") - $ hermione.equip(her_potion_expand_ass3) + $ hermione.equip(her_hips_ass3) $ renpy.sound.play("sounds/boing04.ogg") with d3 @@ -423,7 +421,7 @@ label her_potion_ass_give: gen "I don't... *Err*.... I brewed it to do that!" ("base", xpos="far_left", ypos="head") her "You brewed it to-- I thought it was meant to make it--" ("disgust", "narrow", "base", "down", cheeks="blush") - $ hermione.equip(her_potion_expand_ass1) + $ hermione.equip(her_hips_ass1) $ renpy.sound.play("sounds/boing05.ogg") with d3 @@ -436,8 +434,7 @@ label her_potion_ass_give: gen "You underestimate me, girl..." ("base", xpos="far_left", ypos="head") her "What do you--" ("soft", "narrow", "base", "down", cheeks="blush") - $ hermione.unequip("accessory") - $ hermione.equip(her_potion_expand_ass2) + $ hermione.equip(her_hips_ass2) $ renpy.sound.play("sounds/boing05.ogg") with d3 @@ -448,8 +445,7 @@ label her_potion_ass_give: gen "Well you expected wrong... We're not done yet, [hermione_name]." ("base", xpos="far_left", ypos="head") her "We're--" ("mad", "base", "base", "mid", cheeks="blush") - $ hermione.unequip("accessory") - $ hermione.equip(her_potion_expand_ass3) + $ hermione.equip(her_hips_ass3) $ renpy.sound.play("sounds/boing04.ogg") with d3 @@ -520,7 +516,7 @@ label her_potion_ass_give: call nar(">You start to notice Hermione's ass increase in size.") - $ hermione.equip(her_potion_expand_ass1) + $ hermione.equip(her_hips_ass1) $ renpy.sound.play("sounds/boing05.ogg") with d3 @@ -529,8 +525,7 @@ label her_potion_ass_give: gen "I think you look great!" ("grin", xpos="far_left", ypos="head") her "If only this was as big as it's going to--" ("annoyed", "narrow", "worried", "down", cheeks="blush") - $ hermione.unequip("accessory") - $ hermione.equip(her_potion_expand_ass2) + $ hermione.equip(her_hips_ass2) $ renpy.sound.play("sounds/boing05.ogg") with d3 @@ -540,8 +535,7 @@ label her_potion_ass_give: gen "As in there's even more of you now." ("grin", xpos="far_left", ypos="head") her "I understood what you--" ("disgust", "narrow", "annoyed", "down", cheeks="blush") - $ hermione.unequip("accessory") - $ hermione.equip(her_potion_expand_ass3) + $ hermione.equip(her_hips_ass3) $ renpy.sound.play("sounds/boing04.ogg") with d3 @@ -558,7 +552,7 @@ label her_potion_ass_give: gen "Perhaps." ("base", xpos="far_left", ypos="head") her "I figured..." ("angry", "narrow", "base", "R", cheeks="blush") - $ hermione.equip(her_potion_expand_ass1) + $ hermione.equip(her_hips_ass1) $ renpy.sound.play("sounds/boing05.ogg") with d3 @@ -567,8 +561,7 @@ label her_potion_ass_give: her "I guess..." ("base", "closed", "base", "mid", cheeks="blush") her "So when is it supposed to start--" ("open", "squint", "base", "mid", cheeks="blush") - $ hermione.unequip("accessory") - $ hermione.equip(her_potion_expand_ass2) + $ hermione.equip(her_hips_ass2) $ renpy.sound.play("sounds/boing05.ogg") with d3 @@ -584,8 +577,7 @@ label her_potion_ass_give: gen "Disappointed, [hermione_name]?" ("base", xpos="far_left", ypos="head") her "No, I was just expecting it to--" ("angry", "base", "base", "mid", cheeks="blush") - $ hermione.unequip("accessory") - $ hermione.equip(her_potion_expand_ass3) + $ hermione.equip(her_hips_ass3) $ renpy.sound.play("sounds/boing04.ogg") with d3 @@ -829,7 +821,7 @@ label her_potion_ass_give: gen "{cps=3}...{/cps}" ("base", xpos="far_left", ypos="head") gen "No buts next time, got it." ("base", xpos="far_left", ypos="head") - $ hermione.unequip("accessory") + $ hermione.unequip("hips") $ her_ass_expand_drank = True $ her_ass_expand_finger = True $ her_ass_expand_no_clothes = False #Took off main clothing check reset @@ -1032,7 +1024,7 @@ label her_potion_ass_give: $ her_ass_expand_drank = True $ her_ass_expand_finger = True $ her_ass_expand_no_clothes = False #Took off main clothing check reset - $ hermione.unequip("accessory") + $ hermione.unequip("hips") jump end_hermione_event "-Let go of her-": @@ -1056,14 +1048,12 @@ label her_potion_ass_give: show screen blkfade with d5 - $ hermione.unequip("accessory") - $ hermione.equip(her_potion_expand_ass2) + $ hermione.equip(her_hips_ass2) call nar(">As Hermione's straightens her back you watch as her ass begins shrinking in size.") call nar(">With a short sigh, she then walk up to the front of your desk.") - $ hermione.unequip("accessory") - $ hermione.equip(her_potion_expand_ass1) + $ hermione.equip(her_hips_ass1) call her_chibi("stand","desk","base", flip=False) call gen_chibi("sit_behind_desk") @@ -1072,7 +1062,7 @@ label her_potion_ass_give: hide screen blkfade with d5 - $ hermione.unequip("accessory") + $ hermione.unequip("hips") her "So, is that it [genie_name]?" ("open", "squint", "base", "R", cheeks="blush", xpos="base", ypos="base", flip=False, trans=d3) if her_whoring < 19: diff --git a/game/scripts/characters/hermione/events/potions/breast_expand.rpy b/game/scripts/characters/hermione/events/potions/breast_expand.rpy index 1afb3071..f826839b 100644 --- a/game/scripts/characters/hermione/events/potions/breast_expand.rpy +++ b/game/scripts/characters/hermione/events/potions/breast_expand.rpy @@ -427,7 +427,7 @@ label her_potion_breasts_give: call ctc - $ hermione.equip(her_potion_expand_breast1) + $ hermione.equip(her_chest_breasts1) $ renpy.sound.play("sounds/boing02.ogg") with d3 @@ -439,8 +439,7 @@ label her_potion_breasts_give: gen "Maybe it takes a while for it to take full effect." ("base", xpos="far_left", ypos="head") her "A lot bigger? How big are they supposed to--" ("clench", "squint", "base", "mid") - $ hermione.unequip("accessory") - $ hermione.equip(her_potion_expand_breast2) + $ hermione.equip(her_chest_breasts1) $ renpy.sound.play("sounds/boing02.ogg") with d3 @@ -489,7 +488,7 @@ label her_potion_breasts_give: call ctc - $ hermione.equip(her_potion_expand_breast1) + $ hermione.equip(her_chest_breasts1) $ renpy.sound.play("sounds/boing02.ogg") with d3 @@ -502,8 +501,7 @@ label her_potion_breasts_give: gen "Can't have too much of a good thing." ("base", xpos="far_left", ypos="head") her "That's not--" ("open", "narrow", "base", "mid", cheeks="blush") - $ hermione.unequip("accessory") - $ hermione.equip(her_potion_expand_breast2) + $ hermione.equip(her_chest_breasts2) $ renpy.sound.play("sounds/boing02.ogg") with d3 @@ -568,7 +566,7 @@ label her_potion_breasts_give: call nar (">Hermione's breasts expand as the potion spreads through her body.") - $ hermione.equip(her_potion_expand_breast1) + $ hermione.equip(her_chest_breasts1) $ renpy.sound.play("sounds/boing02.ogg") with d3 @@ -580,8 +578,7 @@ label her_potion_breasts_give: her "... Oh, thank Merlin..." ("angry", "narrow", "base", "down", cheeks="blush") her "I was readying myself for them to get even--" ("angry", "narrow", "worried", "down", cheeks="blush") - $ hermione.unequip("accessory") - $ hermione.equip(her_potion_expand_breast2) + $ hermione.equip(her_chest_breasts2) $ renpy.sound.play("sounds/boing02.ogg") with d3 pause .5 @@ -628,7 +625,7 @@ label her_potion_breasts_give: her "*Mmm*...{w=0.4} What...{w=0.4} What's that supposed to mean?" ("smile", "narrow", "base", "stare", cheeks="blush") call nar (">Hermione's breasts bounces slightly as the potion spreads through her body.") - $ hermione.equip(her_potion_expand_breast1) + $ hermione.equip(her_chest_breasts1) $ renpy.sound.play("sounds/boing02.ogg") with d3 @@ -638,8 +635,7 @@ label her_potion_breasts_give: her "Although... Are they not supposed to get bigger?" ("open", "narrow", "base", "down", cheeks="blush") gen "Well..." ("base", xpos="far_left", ypos="head") - $ hermione.unequip("accessory") - $ hermione.equip(her_potion_expand_breast2) + $ hermione.equip(her_chest_breasts2) $ renpy.sound.play("sounds/boing02.ogg") with d3 @@ -744,8 +740,7 @@ label her_potion_breasts_give: $ renpy.sound.play("sounds/boing04.ogg") with vpunch - $ hermione.unequip("accessory") - $ hermione.equip(her_potion_expand_breast2) + $ hermione.equip(her_chest_breasts2) with d3 @@ -780,8 +775,7 @@ label her_potion_breasts_give: $ renpy.sound.play("sounds/boing04.ogg") with vpunch - $ hermione.unequip("accessory") - $ hermione.equip(her_potion_expand_breast2) + $ hermione.equip(her_chest_breasts2) her "Aaaah!!!" ("scream", "wide", "base", "stare", cheeks="blush") with d3 @@ -1023,7 +1017,7 @@ label her_potion_breasts_give: $ her_breast_expand_groped = True $ her_breast_expand_drank = True $ her_breast_expand_effects_known = True - $ hermione.unequip("accessory") + $ hermione.unequip("chest") jump end_hermione_event diff --git a/game/scripts/characters/hermione/wardrobe.rpy b/game/scripts/characters/hermione/wardrobe.rpy index d6e2966a..f4ad51cf 100644 --- a/game/scripts/characters/hermione/wardrobe.rpy +++ b/game/scripts/characters/hermione/wardrobe.rpy @@ -4,15 +4,18 @@ default hermione = Doll(name="hermione") -########## -## Hair ## -########## +default her_frame_default = DollBodypart("hermione", ("hidden", "frame"), "frame", "default") +default her_body_default = DollOutfit([her_frame_default], hidden=True) + +############### +## Hair ## +############### default her_hair_base = DollCloth("hermione", ("head", "hair"), "hair", "base", [[152, 89, 48, 255], [195, 137, 89, 255], [230, 141, 32, 255]], unlocked=True) -####################### -## Schoolgirl Outfit ## -####################### +################ +## Schoolgirl ## +################ default her_top_school1 = DollCloth("hermione", ("upper body", "shirts"), "top", "top_school_1", [[183, 183, 184, 255], [109, 105, 121, 255], [167, 77, 42, 255], [237, 179, 14, 255]], unlocked=True) default her_top_school2 = DollCloth("hermione", ("upper body", "shirts"), "top", "top_school_2", [[183, 183, 184, 255], [109, 105, 121, 255], [167, 77, 42, 255], [237, 179, 14, 255]], unlocked=True) @@ -21,41 +24,30 @@ default her_top_school4 = DollCloth("hermione", ("upper body", "shirts"), "top", default her_top_school5 = DollCloth("hermione", ("upper body", "shirts"), "top", "top_school_5", [[183, 183, 184, 255], [167, 77, 42, 255], [237, 179, 14, 255]], unlocked=True, level=10) default her_top_school6 = DollCloth("hermione", ("upper body", "shirts"), "top", "top_school_6", [[109, 105, 121, 255], [167, 77, 42, 255], [237, 179, 14, 255]], unlocked=True, level=10) default her_top_school7 = DollCloth("hermione", ("upper body", "shirts"), "top", "top_school_7", [[183, 183, 184, 255], [167, 77, 42, 255], [237, 179, 14, 255]], unlocked=True, level=13) - default her_bottom_school1 = DollCloth("hermione", ("lower body", "skirts"), "bottom", "school_skirt_1", [[103, 90, 108, 255], [232, 177, 13, 255]], unlocked=True) default her_bottom_school2 = DollCloth("hermione", ("lower body", "skirts"), "bottom", "school_skirt_2", [[103, 90, 108, 255], [232, 177, 13, 255]], unlocked=True, level=4) default her_bottom_school3 = DollCloth("hermione", ("lower body", "skirts"), "bottom", "school_skirt_3", [[103, 90, 108, 255], [232, 177, 13, 255]], unlocked=True, level=10) default her_bottom_school4 = DollCloth("hermione", ("lower body", "skirts"), "bottom", "school_skirt_4", [[103, 90, 108, 255], [232, 177, 13, 255]], unlocked=True, level=19) - default her_stockings_base1 = DollCloth("hermione", ("legwear", "socks"), "stockings", "stockings_1", [[219, 165, 13, 255], [146, 63, 30, 255]], unlocked=True) - default her_panties_base1 = DollCloth("hermione", ("lower undergarment", "panties"), "panties", "basic_panties_1", [[232, 232, 232, 255], [202, 60, 1, 255]], unlocked=True) default her_bra_base1 = DollCloth("hermione", ("upper undergarment", "bras"), "bra", "basic_bra_1", [[232, 232, 232, 255], [202, 60, 1, 255]], unlocked=True) - default her_robe_school_1 = DollCloth("hermione", ("upper body", "robes"), "robe", "robe_school_1", [[96, 96, 96, 255], [206, 206, 209, 255], [167, 77, 42, 255]], unlocked=True, level=0) default her_robe_school_2 = DollCloth("hermione", ("upper body", "robes"), "robe", "robe_school_2", [[96, 96, 96, 255], [206, 206, 209, 255], [167, 77, 42, 255]], unlocked=True, level=4) default her_robe_school_3 = DollCloth("hermione", ("upper body", "robes"), "robe", "robe_school_3", [[96, 96, 96, 255], [206, 206, 209, 255], [167, 77, 42, 255]], unlocked=True, level=10) default her_robe_school_4 = DollCloth("hermione", ("upper body", "robes"), "robe", "robe_school_4", [[96, 96, 96, 255], [206, 206, 209, 255], [167, 77, 42, 255]], unlocked=True, level=13) +default her_accessory_house_emblem = DollCloth("hermione", ("misc", "accessory"), "accessory", "house_emblem", [[167, 77, 42, 255], [237, 179, 14, 255]], zorder=193, unlocked=True) +default her_accessory_reading_glasses = DollCloth("hermione", ("head", "glasses"), "glasses", "reading_glasses", [[240, 240, 241, 255]], unlocked=True) +default her_accessory_vintage_glasses = DollCloth("hermione", ("head", "glasses"), "glasses", "vintage_glasses", [[255, 255, 255, 50], [36, 36, 36, 255], [116, 116, 116, 255]], unlocked=True) + default her_outfit_default = DollOutfit([her_hair_base, her_top_school1, her_bottom_school1, her_panties_base1, her_bra_base1, her_stockings_base1], unlocked=True) default her_outfit_default_no_vest = DollOutfit([her_hair_base, her_top_school3, her_bottom_school1, her_panties_base1, her_bra_base1, her_stockings_base1], hidden=True) default her_outfit_default_no_tie_open_shirt = DollOutfit([her_hair_base, her_top_school5, her_bottom_school1, her_panties_base1, her_bra_base1, her_stockings_base1], hidden=True) default her_outfit_last = DollOutfit([her_hair_base], hidden=True) -####################### -## Slutty Schoolgirl ## -####################### - -default her_top_slutty1 = DollCloth("hermione", ("upper body", "sweaters"), "top", "open_top_1", [[183, 183, 184, 255], [109, 105, 121, 255], [167, 77, 42, 255], [237, 179, 14, 255]], level=19) -default her_bottom_slutty1 = DollCloth("hermione", ("lower body", "skirts"), "bottom", "open_skirt_1", [[103, 90, 108, 255]], level=19) -default her_stockings_slutty = DollCloth("hermione", ("legwear", "stockings"), "stockings", "stockings_2", [[170, 170, 170, 255]], level=4) - -default her_outfit_slutty_schoolgirl = DollOutfit([her_hair_base, her_top_slutty1, her_bottom_slutty1, her_stockings_slutty], price=500, name="Slutty Schoolgirl Outfit", desc="An arguably better version of the regular school outfit.") - ######################## ## Rave Bikini Outfit ## ######################## - default her_panties_bikini1 = DollCloth("hermione", ("lower undergarment", "bikini panties"), "panties", "bikini_panties_1", [[138, 0, 0, 255], [252, 135, 0, 255]], level=18) default her_bra_bikini1 = DollCloth("hermione", ("upper undergarment", "bikini bras"), "bra", "bikini_bra_1", [[138, 0, 0, 255], [252, 135, 0, 255]], level=18) @@ -92,7 +84,7 @@ default her_gloves_maid1 = DollCloth("hermione", ("upper body", "gloves"), "glov default her_outfit_maid = DollOutfit([her_hair_base, her_top_maid1, her_stockings_maid1, her_hat_maid1, her_neckwear_maid1, her_gloves_maid1, her_panties_base1, her_bra_base1], addons=[her_neckwear_maid2], price=450, name="French Maid Costume", desc="A classic Maid Outfit for a classy Witch.") ################## -## Poker Outfit ## # Unlockable with Tokens only +## Poker Outfit ## ################## default her_hat_poker1 = DollClothDynamic("hermione", ("head", "headgear"), "headgear", "poker_hat_1", [[26, 26, 35, 255], [232, 232, 232, 255], [153, 22, 10, 255]], level=4, tracking="?hair") @@ -106,6 +98,7 @@ default her_gloves_poker1 = DollCloth("hermione", ("upper body", "gloves"), "glo default her_earring_poker1 = DollCloth("hermione", ("head", "earrings"), "earrings", "poker_earring_1", [[255, 179, 3, 255]], level=4) default her_piercing_poker1 = DollCloth("hermione", ("piercings & tattoos", "piercings"), "piercing", "poker_belly_1", [[26, 26, 35, 255], [232, 232, 232, 255], [153, 22, 10, 255], [255, 179, 3, 255]]) +# Unlockable with Tokens only default her_outfit_poker = DollOutfit([her_hair_base, her_hat_poker1, her_hat_poker2, her_neckwear_poker1, her_stockings_poker1, her_stockings_poker2, her_panties_poker1, her_bra_poker1, her_gloves_poker1, her_earring_poker1, her_piercing_poker1], name="Poke-her-nips Costume", desc="An outfit that doesn't leave much for the mind's desire, perfect for a lewd card loving girl.") ################## @@ -124,7 +117,7 @@ default her_neckwear_bunny1 = DollCloth("hermione", ("head", "neckwear"), "neckw default her_outfit_bunny = DollOutfit([her_hair_base, her_top_bunny2, her_stockings_bunny1, her_tattoo_bunny1, her_hat_bunny2, her_gloves_bunny1, her_neckwear_bunny1], addons=[her_top_bunny1, her_hat_bunny1], price=350, name="Sexy Bunny Costume", desc="What's up doc?") ###################### -## Reindeer Costume ## #unlocked in genies_christmas_wish mirror story +## Reindeer Costume ## ###################### default her_hat_antlers2 = DollClothDynamic("hermione", ("head", "headgear"), "headgear", "antlers_2", [[153, 76, 48, 255], [255, 255, 255, 255], [198, 159, 101, 255]], level=12, tracking="?hair") @@ -164,11 +157,11 @@ default her_gloves_yen1 = DollCloth("hermione", ("upper body", "gloves"), "glove default her_outfit_yennefer = DollOutfit([her_hair_base, her_top_yen1, her_bottom_yen_skirt1, her_accessory_yen_sash1, her_stockings_yen1, her_accessory_yen_feathers1, her_accessory_yen_scarf1, her_neckwear_yen_choker1, her_gloves_yen1, her_accessory_yen_corset1, her_accessory_yen_belt1], price=400, name="Yennefer Costume", desc="An outfit that smells of lilac and gooseberries.") ####################### -## Pizza Slut Outfit ## #Unlocked in eating_for_pleasure mirror story +## Pizza Slut Outfit ## ####################### -default her_top_pizza = DollCloth("hermione", ("upper body", "other"), "top", "pizza_top", [[180, 50, 10, 255]], level=19) default her_bottom_pizza = DollCloth("hermione", ("lower body", "skirts"), "bottom", "pizza_skirt", [[180, 50, 10, 255], [235, 199, 44, 255]], level=4) +default her_top_pizza = DollCloth("hermione", ("upper body", "other"), "top", "pizza_top", [[180, 50, 10, 255]], level=19) default her_panties_pizza = DollCloth("hermione", ("lower undergarment", "other"), "panties", "pizza_panties", [[180, 50, 10, 255]], level=19) default her_outfit_pizza = DollOutfit([her_hair_base, her_bottom_pizza, her_top_pizza, her_panties_pizza], price=0) @@ -178,9 +171,9 @@ default her_outfit_pizza = DollOutfit([her_hair_base, her_bottom_pizza, her_top_ ##################### default her_hair_bioshock = DollCloth("hermione", ("head", "hair"), "hair", "bio_hair", [[31, 29, 27, 255], [54, 50, 48, 255]], level=4) -default her_neckwear_bioshock = DollCloth("hermione", ("head", "neckwear"), "neckwear", "bioshock_choker", [[12, 1, 72, 255]], level=4) -default her_top_bioshock = DollCloth("hermione", ("upper body", "other"), "top", "bioshock_corset", [[225, 224, 232, 255], [46, 46, 48, 255], [232, 232, 232, 255]], level=4) default her_bottom_bioshock = DollCloth("hermione", ("lower body", "skirts"), "bottom", "bioshock_skirt", [[12, 1, 72, 255]], level=4) +default her_top_bioshock = DollCloth("hermione", ("upper body", "other"), "top", "bioshock_corset", [[225, 224, 232, 255], [46, 46, 48, 255], [232, 232, 232, 255]], level=4) +default her_neckwear_bioshock = DollCloth("hermione", ("head", "neckwear"), "neckwear", "bioshock_choker", [[12, 1, 72, 255]], level=4) default her_robe_bioshock = DollCloth("hermione", ("upper body", "robes"), "robe", "bioshock_robe", [[12, 1, 72, 255], [232, 232, 232, 255]], level=4) default her_outfit_bioshock = DollOutfit([her_hair_bioshock, her_robe_bioshock, her_bottom_bioshock, her_top_bioshock, her_neckwear_bioshock, her_panties_base1], price=400, name="Elizabeth Costume", desc="Flick some coins for this shockingly inspirational outfit.") @@ -204,23 +197,23 @@ default her_neckwear_egypt = DollCloth("hermione", ("head", "neckwear"), "neckwe default her_outfit_egypt = DollOutfit([her_hair_base, her_neckwear_egypt, her_top_egypt, her_bottom_egypt, her_gloves_egypt], price=400, name="Cleopatra Costume", desc="Become the Cleopatra of your times!") -######################## +####################### ## Latex dress Outfit ## -######################## +####################### default her_top_latex_dress_1 = DollCloth("hermione", ("upper body", "one-piece suits"), "top", "latex_dress_1", [[250, 139, 241, 255], [255, 173, 22, 255]], blacklist=["bra"], level=19) default her_outfit_latex_dress = DollOutfit([her_hair_base, her_top_latex_dress_1], price=350, name="Latex Dress", desc="Something you wouldn't normally find in a regular clothing store.") ################### -## Pajama Outfit ## #Unlocked in Luna Intro +## Pajama Outfit ## ################### default her_top_pajama = DollCloth("hermione", ("upper body", "shirts"), "top", "pajama_1", [[228, 216, 193, 255]]) default her_bottom_pajama = DollCloth("hermione", ("lower body", "trousers"), "bottom", "pajama_1", [[156, 138, 116, 255], [228, 203, 153, 255], [228, 216, 193, 255]]) default her_bottom_pajama2 = DollCloth("hermione", ("lower body", "trousers"), "bottom", "pajama_2", [[156, 138, 116, 255], [228, 203, 153, 255]]) -default her_outfit_pajama = DollOutfit([her_hair_base, her_top_pajama, her_bottom_pajama], addons=[her_bottom_pajama2]) +default her_outfit_pajama = DollOutfit([her_hair_base, her_top_pajama, her_bottom_pajama], addons=[her_bottom_pajama2]) # Event Outfit #################### ## Nightie Outfit ## @@ -265,26 +258,25 @@ default her_outfit_msmarv = DollOutfit([her_hair_base, her_top_msmarv, her_acces ## Heart Slut Outfit ## ####################### -default her_earring_hslut = DollCloth("hermione", ("head", "earrings"), "earrings", "hslut_earring", [[226, 95, 95, 255]], level=4) -default her_neckwear_hslut = DollCloth("hermione", ("head", "neckwear"), "neckwear", "hslut_choker", [[242, 242, 242, 255], [226, 95, 95, 255]], level=10) default her_top_hslut = DollCloth("hermione", ("upper body", "other"), "top", "hslut_top", [[226, 95, 95, 255], [242, 242, 242, 255]], level=19) default her_gloves_hslut = DollCloth("hermione", ("upper body", "gloves"), "gloves", "hslut_gloves", [[242, 242, 242, 255]], level=10) default her_stockings_hslut = DollCloth("hermione", ("legwear", "stockings"), "stockings", "hslut_socks", [[242, 242, 242, 255]], level=10) -default her_bra_hslut = DollCloth("hermione", ("upper undergarment", "other"), "bra", "hslut_pasties", [[226, 95, 95, 255], [226, 95, 95, 255]], level=19) default her_panties_hslut = DollCloth("hermione", ("lower undergarment", "other"), "panties", "hslut_panties", [[226, 95, 95, 255]], level=19) +default her_bra_hslut = DollCloth("hermione", ("upper undergarment", "other"), "bra", "hslut_pasties", [[226, 95, 95, 255], [226, 95, 95, 255]], level=19) +default her_earring_hslut = DollCloth("hermione", ("head", "earrings"), "earrings", "hslut_earring", [[226, 95, 95, 255]], level=4) +default her_neckwear_hslut = DollCloth("hermione", ("head", "neckwear"), "neckwear", "hslut_choker", [[242, 242, 242, 255], [226, 95, 95, 255]], level=10) default her_garterbelt_hslut = DollCloth("hermione", ("legwear", "garterbelts"), "garterbelt", "hslut_garter", [[226, 95, 95, 255], [249, 148, 148, 255]], level=10) default her_outfit_hslut = DollOutfit([her_hair_base, her_top_hslut, her_gloves_hslut, her_stockings_hslut, her_panties_hslut, her_bra_hslut, her_earring_hslut, her_neckwear_hslut, her_garterbelt_hslut], price=450, name="Hearty Harlot", desc="A sexy dancers outfit with heart-shaped nipple tassels.") ####################### -## Lora Craft Outfit ## +## Lara Croft Outfit ## ####################### -default her_accessory_croft_belt = DollCloth("hermione", ("misc", "accessory"), "accessory", "croft_belt", [[111, 86, 66, 255], [116, 123, 114, 255], [252, 192, 4, 255]], level=4) -default her_accessory_croft_suspenders = DollCloth("hermione", ("misc", "accessory"), "accessory", "croft_suspenders", [[111, 86, 66, 255], [116, 123, 114, 255]], zorder=213, level=4) - default her_top_croft = DollCloth("hermione", ("upper body", "shirts"), "top", "croft_top", [[163, 201, 152, 255]], level=10) default her_bottom_croft = DollCloth("hermione", ("lower body", "shorts"), "bottom", "croft_shorts", [[147, 114, 61, 255], [137, 136, 120, 255], [252, 192, 4, 255]],level=10) +default her_accessory_croft_belt = DollCloth("hermione", ("misc", "accessory"), "accessory", "croft_belt", [[111, 86, 66, 255], [116, 123, 114, 255], [252, 192, 4, 255]], level=4) +default her_accessory_croft_suspenders = DollCloth("hermione", ("misc", "accessory"), "accessory", "croft_suspenders", [[111, 86, 66, 255], [116, 123, 114, 255]], zorder=213, level=4) default her_outfit_croft = DollOutfit([her_hair_base, her_top_croft, her_bottom_croft, her_accessory_croft_belt, her_accessory_croft_suspenders, her_panties_base1], price=400, name="Lora Craft Costume", desc="An outfit perfectly suited for exploring deep, dark and moist caverns.\n{size=-4}Disclaimer: This outfit has no association with a character known as Lara Croft. Totally.{/size}") @@ -298,43 +290,55 @@ default her_robe_witch = DollCloth("hermione", ("upper body", "robes"), "robe", default her_outfit_witch = DollOutfit([her_hair_base, her_top_witch, her_stockings_witch, her_robe_witch], price=400, name="16th Century Witch Costume", desc="An ancient witch costume coming straight from 16th century. Stay away from the burning stakes!") +####################### +## Slutty Schoolgirl ## +####################### + +default her_top_slutty1 = DollCloth("hermione", ("upper body", "sweaters"), "top", "open_top_1", [[183, 183, 184, 255], [109, 105, 121, 255], [167, 77, 42, 255], [237, 179, 14, 255]], level=19) +default her_bottom_slutty1 = DollCloth("hermione", ("lower body", "skirts"), "bottom", "open_skirt_1", [[103, 90, 108, 255]], level=19) +default her_stockings_slutty = DollCloth("hermione", ("legwear", "stockings"), "stockings", "stockings_2", [[170, 170, 170, 255]], level=4) + +default her_outfit_slutty_schoolgirl = DollOutfit([her_hair_base, her_top_slutty1, her_bottom_slutty1, her_stockings_slutty], price=500, name="Slutty Schoolgirl outfit", desc="An arguably better version of the regular school outfit.") + ################## ## Latex Outfit ## ################## default her_top_latex = DollCloth("hermione", ("upper body", "shirts"), "top", "latex_top", [[55, 55, 55, 255]], level=19) -default her_neckwear_latex = DollCloth("hermione", ("head", "neckwear"), "neckwear", "latex_choker", [[55, 55, 55, 255]], level=13) default her_gloves_latex = DollCloth("hermione", ("upper body", "gloves"), "gloves", "latex_gloves", [[55, 55, 55, 255]], level=13) default her_stockings_latex = DollCloth("hermione", ("legwear", "stockings"), "stockings", "latex_stockings", [[55, 55, 55, 255]], level=13) default her_panties_latex = DollCloth("hermione", ("lower undergarment", "bikini panties"), "panties", "latex_panties", [[55, 55, 55, 255]], level=19) +default her_neckwear_latex = DollCloth("hermione", ("head", "neckwear"), "neckwear", "latex_choker", [[55, 55, 55, 255]], level=13) default her_outfit_latex = DollOutfit([her_hair_base, her_top_latex, her_gloves_latex, her_stockings_latex, her_panties_latex, her_neckwear_latex], price=350, name="Latex Set", desc="A tight fitting outfit that takes approximately twenty minutes to put on properly.") -#################### -## Fishnet Outfit ## -#################### +################# +## Fishnet Outfit +################# default her_top_fishnet = DollCloth("hermione", ("upper body", "other"), "top", "fishnet_top", [[24, 24, 24, 255]], blacklist=["bra"], level=19) default her_panties_fishnet = DollCloth("hermione", ("lower undergarment", "other"), "panties", "fishnet_panties", [[24, 24, 24, 255]], level=19) -default her_outfit_fishnet = DollOutfit([her_hair_base, her_top_fishnet, her_panties_fishnet], price=350, name="Fishnet Set", desc="Disclaimer: Not suitable for actual fish catching.") +default her_outfit_fishnet = DollOutfit([her_hair_base, her_top_fishnet, her_panties_fishnet], price=350, name="Fishnet set", desc="Disclaimer: Not suitable for actual fish catching.") -############################## -## Fishnet One-piece Outfit ## -############################## + +########################### +## Fishnet One-piece Outfit +########################### default her_top_fishnet_onepiece = DollCloth("hermione", ("upper body", "one-piece suits"), "top", "fishnet_onepiece", [[0, 0, 0, 255], [0, 0, 0, 255]], blacklist=["panties", "bra"], zorder=183, level=19) default her_stockings_short_meshed = DollCloth("hermione", ("legwear", "socks"), "stockings", "short_meshed", [[0, 0, 0, 255], [0, 0, 0, 255]], level=13) -default her_outfit_fishnet_onepiece = DollOutfit([her_hair_base, her_top_fishnet_onepiece, her_stockings_short_meshed], price=350, name="Fishnet One-piece", desc="Perfect for containing your daily catch.") +default her_outfit_fishnet_onepiece = DollOutfit([her_hair_base, her_top_fishnet_onepiece, her_stockings_short_meshed], price=350, name="Fishnet Onepiece", desc="Perfect for containing your daily catch.") ################### -## Winter Outfit ## +## Winter Outfit ## (Unfinished) # TODO: Add to clothing event once it's been finished. ################### default her_top_pullover_1 = DollCloth("hermione", ("upper body", "sweaters"), "top", "pullover_1", [[255, 123, 207, 255]], unlocked=True) default her_top_pullover_2 = DollCloth("hermione", ("upper body", "sweaters"), "top", "pullover_2", [[255, 123, 207, 255]], unlocked=True, level=8) default her_top_pullover_3 = DollCloth("hermione", ("upper body", "sweaters"), "top", "pullover_3", [[255, 123, 207, 255]], unlocked=True, level=16) +default her_bottom_winter_1 = DollCloth("hermione", ("lower body", "skirts"), "bottom", "winter_skirt_1", [[192, 31, 30, 255]]) default her_stockings_pantyhose_1= DollCloth("hermione", ("legwear", "pantyhose"), "stockings", "pantyhose_1", [[177, 144, 131, 255]], unlocked=True, level=4) default her_stockings_pantyhose_2= DollCloth("hermione", ("legwear", "pantyhose"), "stockings", "pantyhose_2", [[177, 144, 131, 255]], unlocked=True, level=10) default her_stockings_pantyhose_3= DollCloth("hermione", ("legwear", "pantyhose"), "stockings", "pantyhose_3", [[177, 144, 131, 255]], unlocked=True, level=19) @@ -347,15 +351,15 @@ default her_top_ruffled = DollCloth("hermione", ("upper body", "shirts"), "top", default her_bottom_jeans = DollCloth("hermione", ("lower body", "trousers"), "bottom", "jeans_1", [[64, 87, 88, 255], [174, 93, 11, 255], [155, 142, 130, 255]], unlocked=True) ################### -## Casual Outfit ## +## Casual Outfit ## TODO: Turn into clothing event once it's been finished. ################### default her_top_casual1 = DollCloth("hermione", ("upper body", "sweaters"), "top", "casual_top_1", [[116, 18, 48, 255], [60, 111, 66, 255]], unlocked=True) default her_top_casual2 = DollCloth("hermione", ("upper body", "sweaters"), "top", "casual_top_2", [[116, 18, 48, 255]], unlocked=True, level=6) -######################### -## Cheerleader Outfits ## -######################### +######################## +## Cheerleader Outfit ## +######################## default her_top_cheerleader1 = DollCloth("hermione", ("upper body", "shirts"), "top", "cheerleader_top_1", [[251, 251, 251, 255], [167, 77, 42, 255], [237, 179, 14, 255]], level=10) default her_top_cheerleader2 = DollCloth("hermione", ("upper body", "other"), "top", "cheerleader_top_2", [[167, 77, 42, 255], [237, 179, 14, 255]], level=16) @@ -365,8 +369,8 @@ default her_bottom_cheerleader2 = DollCloth("hermione", ("lower body", "skirts") default her_gloves_cheerleader = DollCloth("hermione", ("upper body", "gloves"), "gloves", "cheerleader_armband", [[167, 77, 42, 255], [237, 179, 14, 255]]) -default her_outfit_cheerleader_1 = DollOutfit([her_hair_base, her_top_cheerleader1, her_bottom_cheerleader1, her_gloves_cheerleader, her_panties_base1, her_bra_base1], price=450, name="Gryffindor Cheerleader Uniform", desc="So daring and bold, sporting red and gold!") -default her_outfit_cheerleader_2 = DollOutfit([her_hair_base, her_top_cheerleader2, her_bottom_cheerleader2, her_panties_base1, her_bra_base1], price=650, name="Gryffindor Cheerleader Plus Uniform", desc="For when your teammates need an extra push.") +default her_outfit_cheerleader_1 = DollOutfit([her_hair_base, her_top_cheerleader1, her_bottom_cheerleader1, her_gloves_cheerleader, her_panties_base1, her_bra_base1], price=450, name="Gryffindor Cheerleader uniform", desc="So daring and bold, sporting red and gold!") +default her_outfit_cheerleader_2 = DollOutfit([her_hair_base, her_top_cheerleader2, her_bottom_cheerleader2, her_panties_base1, her_bra_base1], price=650, name="Gryffindor Cheerleader Plus uniform", desc="For when your teammates need an extra push.") ################# ~*~Ä~*~*~*~*~ ################# ## Xmas Stuff ### /%\ ___&__ ### Ho Ho Ho ## @@ -388,9 +392,9 @@ default her_stockings_xmas = DollCloth("hermione", ("legwear", "stockings"), "st default her_outfit_ribbon = DollOutfit([her_hair_base, her_neckwear_choker1, her_bra_ribbon, her_panties_ribbon]) default her_outfit_xmas = DollOutfit([her_hair_base, her_hat_antlers, her_neckwear_bell1, her_top_xmas, her_bottom_xmas, her_gloves_xmas, her_stockings_xmas, her_panties_base1], addons=[her_hat_elf]) -############################ -## Wrestling Robes Outfit ## #Unlocked in a_white_christmas mirror story -############################ +##################### +## Wrestling Robes ## +##################### default her_robe_wrestling = DollCloth("hermione", ("upper body", "robes"), "robe", "wrestling_robe", [[166, 63, 29, 255], [255, 253, 237, 255]], level=3) default her_bra_sports = DollCloth("hermione", ("upper undergarment", "bras"), "bra", "sports_bra", [[66, 71, 100, 255], [242, 244, 255, 255]], level=3) @@ -399,23 +403,12 @@ default her_accessory_belt_wrestling = DollCloth("hermione", ("misc", "accessory default her_outfit_wrestling = DollOutfit([her_hair_base, her_robe_wrestling, her_bra_sports, her_panties_sports, her_accessory_belt_wrestling]) -############################ -## Blueballing Bad Outfit ## #Unlocked in blueballing_bad mirror story -############################ +########## +## MISC ## +########## -default her_accessory_bb_tie = DollCloth("hermione", ("misc", "accessory"), "accessory", "bb_tie", [[177, 51, 159, 255], [246, 40, 0, 255], [255, 247, 0, 255]], zorder=6) -default her_tattoo_bb_tattoo = DollCloth("hermione", ("piercings & tattoos", "tattoos"), "tattoo", "bb_tattoo", [[0, 0, 0, 255], [255, 247, 0, 255], [246, 40, 0, 255]]) - -default her_outfit_bb = DollOutfit([her_hair_base, her_accessory_bb_tie, her_tattoo_bb_tattoo]) - -################# -## Accessories ## -################# - -default her_accessory_house_emblem = DollCloth("hermione", ("misc", "accessory"), "accessory", "house_emblem", [[167, 77, 42, 255], [237, 179, 14, 255]], zorder=193, unlocked=True) - -default her_accessory_reading_glasses = DollCloth("hermione", ("head", "glasses"), "glasses", "reading_glasses", [[240, 240, 241, 255]], unlocked=True) -default her_accessory_vintage_glasses = DollCloth("hermione", ("head", "glasses"), "glasses", "vintage_glasses", [[255, 255, 255, 50], [36, 36, 36, 255], [116, 116, 116, 255]], unlocked=True) +default her_accessory_gift_wrap = DollCloth("hermione", ("misc", "accessory"), "accessory", "leg_wrap", [[167, 77, 42, 255], [237, 179, 14, 255]], zorder=183, unlocked=True, level=5) +default her_bra_bandaids = DollCloth("hermione", ("upper undergarment", "other"), "bra", "bandaids", [[233, 187, 149, 255]], unlocked=True, level=19) ############# ## Tattoos ## @@ -424,7 +417,7 @@ default her_accessory_vintage_glasses = DollCloth("hermione", ("head", "glasses" # Pelvis/crotch (Slot 0) default her_tattoo_10g = DollCloth("hermione", ("piercings & tattoos", "tattoos"), "tattoo", "10g_tattoo", [[0, 0, 0, 255]], unlocked=True) default her_tattoo_cockhole = DollCloth("hermione", ("piercings & tattoos", "tattoos"), "tattoo", "cockhole_tattoo", [[0, 0, 0, 255]], unlocked=True) -default her_tattoo_cumhere = DollCloth("hermione", ("piercings & tattoos", "tattoos"), "tattoo", "cumhere_tattoo", [[0, 0, 0, 255]], unlocked=True) +default her_tattoo_cumhere = DollCloth("hermione", ("piercings & tattoos", "tattoos"), "tattoo", "cumhere_tattoo1", [[0, 0, 0, 255]], unlocked=True) default her_tattoo_cumslut = DollCloth("hermione", ("piercings & tattoos", "tattoos"), "tattoo", "cumslut_tattoo", [[0, 0, 0, 255]], unlocked=True) default her_tattoo_cunt = DollCloth("hermione", ("piercings & tattoos", "tattoos"), "tattoo", "cunt_tattoo", [[0, 0, 0, 255]], unlocked=True) default her_tattoo_deatheater = DollCloth("hermione", ("piercings & tattoos", "tattoos"), "tattoo", "deatheater_tattoo", [[0, 0, 0, 255]], unlocked=True) @@ -440,7 +433,7 @@ default her_tattoo_womb = DollCloth("hermione", ("piercings & tattoos", "tattoos default her_tattoo_twist = DollCloth("hermione", ("piercings & tattoos", "tattoos"), "tattoo", "twist_tattoo", [[0, 0, 0, 255]], unlocked=True) # Torso/chest (Slot 2) -default her_tattoo_cumhere2 = DollCloth("hermione", ("piercings & tattoos", "tattoos"), "tattoo", "cumhere_tattoo", [[0, 0, 0, 255]], unlocked=True) +default her_tattoo_cumhere2 = DollCloth("hermione", ("piercings & tattoos", "tattoos"), "tattoo", "cumhere_tattoo2", [[0, 0, 0, 255]], unlocked=True) # Legs/Thighs (Slot 3) default her_tattoo_lockhart = DollCloth("hermione", ("piercings & tattoos", "tattoos"), "tattoo", "lockhart_tattoo", [[70, 70, 70, 255]]) @@ -472,6 +465,46 @@ default her_pubes_beaver = DollCloth("hermione", ("lower undergarment", "pubes") default her_pubes_stuble = DollCloth("hermione", ("lower undergarment", "pubes"), "pubes", "stuble", [[92, 54, 29, 255]], unlocked=True) default her_pubes_unshaved = DollCloth("hermione", ("lower undergarment", "pubes"), "pubes", "unshaved", [[92, 54, 29, 255]], unlocked=True) +### Default Schedules ### + +default her_outfit_s_clearday = DollOutfit([her_hair_base, her_top_school3, her_bottom_school1, her_panties_base1, her_bra_base1], True, schedule={"day": True}) +default her_outfit_s_clearnight = DollOutfit([her_hair_base, her_top_casual1, her_bottom_jeans, her_panties_base1, her_bra_base1], True, schedule={"night": True}) +default her_outfit_s_snow = DollOutfit([her_hair_base, her_top_pullover_1, her_bottom_jeans, her_panties_base1, her_bra_base1], True, schedule={"day": True, "night": True, "snowy": True}) +default her_outfit_s_overcast = DollOutfit([her_hair_base, her_top_pullover_1, her_bottom_school1, her_panties_base1, her_bra_base1, her_stockings_base1], True, schedule={"day": True, "night": True, "cloudy": True}) +default her_outfit_s_rain = DollOutfit([her_hair_base, her_robe_school_1, her_top_school1, her_bottom_school1, her_panties_base1, her_bra_base1, her_stockings_base1], True, schedule={"day": True, "night": True, "rainy": True}) + +############################ +## Cat-girl potion outfit ## +############################ + +default her_cat_ears = DollClothDynamic("hermione", ("head", "headgear"), "headgear", "cat_ears", [[209, 123, 67, 255], [232, 232, 232, 255]], tracking="?hair") +default her_cat_legs = DollCloth("hermione", ("legwear", "stockings"), "stockings", "cat_legs",[[209, 123, 67, 255]]) +default her_cat_arms = DollCloth("hermione", ("upper body", "gloves"), "gloves", "cat_arms", [[209, 123, 67, 255], [214, 122, 122, 255], [37, 37, 37, 255]]) +default her_cat_tail = DollCloth("hermione", ("misc", "accessory"), "accessory", "cat_tail", [[209, 123, 67, 255]], zorder=-1) +default her_cat_muzzle = DollCloth("hermione", ("head", "makeup"), "makeup", "cat_muzzle", [[214, 122, 122, 255]]) + +default her_outfit_cat1 = DollOutfit([her_hair_base, her_cat_ears, her_cat_tail], hidden=True) +default her_outfit_cat2 = DollOutfit([her_hair_base, her_cat_ears, her_cat_tail, her_cat_legs, her_cat_arms, her_pubes_beaver], hidden=True) +default her_outfit_cat3 = DollOutfit([her_hair_base, her_cat_ears, her_cat_tail, her_cat_legs, her_cat_arms, her_pubes_beaver, her_cat_muzzle], hidden=True) + +################### +## Magic Collars ## +################### + +default her_neckwear_basic_collar = DollCloth("hermione", ("head", "neckwear"), "neckwear", "basic_collar", [[182, 114, 91, 255], [255, 0, 0, 255]]) +default her_neckwear_good_girl_collar = DollCloth("hermione", ("head", "neckwear"), "neckwear", "good_girl_collar", [[255, 184, 192, 255], [255, 224, 230, 255], [255, 102, 204, 255]]) +default her_neckwear_whore_collar = DollCloth("hermione", ("head", "neckwear"), "neckwear", "whore_collar", [[59, 59, 59, 255]]) +default her_neckwear_flasher_collar = DollCloth("hermione", ("head", "neckwear"), "neckwear", "flasher_collar", [[233, 64, 240, 255], [245, 219, 104, 255]], blacklist=["top", "bra"]) +default her_neckwear_slut_collar = DollCloth("hermione", ("head", "neckwear"), "neckwear", "slut_collar", [[251, 66, 82, 255], [40, 40, 40, 255]]) +default her_neckwear_slave_collar = DollCloth("hermione", ("head", "neckwear"), "neckwear", "slave_collar", [[170, 169, 173, 255]]) + +################ +## Butt Plugs ## +################ +default her_buttplug_small1 = DollCloth("hermione", ("misc", "accessory"), "accessory", "buttplug_small_1", [[252, 195, 219, 255], [84, 76, 214, 255]], zorder=-1, level=15) +default her_buttplug_medium1 = DollCloth("hermione", ("misc", "accessory"), "accessory", "buttplug_medium_1", [[255, 255, 119, 255], [243, 140, 9, 255], [255, 76, 46, 255], [84, 76, 214, 255]], zorder=-1, level=19) +default her_buttplug_large1 = DollCloth("hermione", ("misc", "accessory"), "accessory", "buttplug_large_1", [[99, 208, 14, 255], [254, 108, 181, 255], [84, 76, 214, 255]], zorder=-1, level=23) + ############### ## Piercings ## ############### @@ -487,29 +520,12 @@ default her_piercing_belly_stud = DollCloth("hermione", ("piercings & tattoos", default her_piercing_belly_heart = DollCloth("hermione", ("piercings & tattoos", "piercings"), "piercing", "belly_heart", [[161, 159, 159, 255]], unlocked=True) default her_piercing_belly_dick = DollCloth("hermione", ("piercings & tattoos", "piercings"), "piercing", "belly_dick", [[161, 159, 159, 255]], unlocked=True) -########## -## MISC ## -########## - -default her_accessory_gift_wrap = DollCloth("hermione", ("misc", "accessory"), "accessory", "leg_wrap", [[167, 77, 42, 255], [237, 179, 14, 255]], zorder=183, unlocked=True, level=5) -default her_bra_bandaids = DollCloth("hermione", ("upper undergarment", "other"), "bra", "bandaids", [[233, 187, 149, 255]], unlocked=True, level=19) - -### Default Schedules ### - -default her_outfit_s_clearday = DollOutfit([her_hair_base, her_top_school3, her_bottom_school1, her_panties_base1, her_bra_base1], True, schedule={"day": True}) -default her_outfit_s_clearnight = DollOutfit([her_hair_base, her_top_casual1, her_bottom_jeans, her_panties_base1, her_bra_base1], True, schedule={"night": True}) -default her_outfit_s_snow = DollOutfit([her_hair_base, her_top_pullover_1, her_bottom_jeans, her_panties_base1, her_bra_base1], True, schedule={"day": True, "night": True, "snowy": True}) -default her_outfit_s_overcast = DollOutfit([her_hair_base, her_top_pullover_1, her_bottom_school1, her_panties_base1, her_bra_base1, her_stockings_base1], True, schedule={"day": True, "night": True, "cloudy": True}) -default her_outfit_s_rain = DollOutfit([her_hair_base, her_robe_school_1, her_top_school1, her_bottom_school1, her_panties_base1, her_bra_base1, her_stockings_base1], True, schedule={"day": True, "night": True, "rainy": True}) - ############ ## Events ## ############ -# Gryffindor Quidditch Match default herq_panties_on_head = DollClothDynamic("hermione", ("head", "headgear"), "headgear", "panties_on_head", [[156, 204, 249, 255]], tracking="?hair") -# Vibrator default her_panties_base_vibrators = DollCloth("hermione", ("lower undergarment", "panties"), "panties", "basic_panties_vibrators", [[232, 232, 232, 255], [202, 60, 1, 255]]) default her_bra_base_vibrators = DollCloth("hermione", ("upper undergarment", "bras"), "bra", "basic_bra_vibrators", [[232, 232, 232, 255], [202, 60, 1, 255]]) default her_nipple_vibrators = DollCloth("hermione", ("misc", "accessory"), "accessory", "nipple_vibrators", [[234, 142, 97, 255], [252, 217, 135, 255], [255, 118, 96, 255]], zorder=5) @@ -518,44 +534,19 @@ default her_clit_vibrators = DollCloth("hermione", ("misc", "accessory"), "acces default her_outfit_vibrators = DollOutfit([her_hair_base, her_panties_base_vibrators, her_bra_base_vibrators, her_nipple_vibrators, her_clit_vibrators], hidden=True) default her_outfit_vibrators_nude = DollOutfit([her_hair_base, her_nipple_vibrators, her_clit_vibrators], hidden=True) -# Magic Collars -default her_neckwear_basic_collar = DollCloth("hermione", ("head", "neckwear"), "neckwear", "basic_collar", [[182, 114, 91, 255], [255, 0, 0, 255]]) -default her_neckwear_good_girl_collar = DollCloth("hermione", ("head", "neckwear"), "neckwear", "good_girl_collar", [[255, 184, 192, 255], [255, 224, 230, 255], [255, 102, 204, 255]]) -default her_neckwear_whore_collar = DollCloth("hermione", ("head", "neckwear"), "neckwear", "whore_collar", [[59, 59, 59, 255]]) -default her_neckwear_flasher_collar = DollCloth("hermione", ("head", "neckwear"), "neckwear", "flasher_collar", [[233, 64, 240, 255], [245, 219, 104, 255]], blacklist=["top", "bra"]) -default her_neckwear_slut_collar = DollCloth("hermione", ("head", "neckwear"), "neckwear", "slut_collar", [[251, 66, 82, 255], [40, 40, 40, 255]]) -default her_neckwear_slave_collar = DollCloth("hermione", ("head", "neckwear"), "neckwear", "slave_collar", [[170, 169, 173, 255]]) +default her_accessory_bb_tie = DollCloth("hermione", ("misc", "accessory"), "accessory", "bb_tie", [[177, 51, 159, 255], [246, 40, 0, 255], [255, 247, 0, 255]], zorder=6) +default her_tattoo_bb_tattoo = DollCloth("hermione", ("piercings & tattoos", "tattoos"), "tattoo", "bb_tattoo", [[0, 0, 0, 255], [255, 247, 0, 255], [246, 40, 0, 255]]) -# Butt Plugs -default her_buttplug_small1 = DollCloth("hermione", ("misc", "accessory"), "buttplug", "buttplug_small_1", [[252, 195, 219, 255], [84, 76, 214, 255]], zorder=-1, level=15) -default her_buttplug_medium1 = DollCloth("hermione", ("misc", "accessory"), "buttplug", "buttplug_medium_1", [[255, 255, 119, 255], [243, 140, 9, 255], [255, 76, 46, 255], [84, 76, 214, 255]], zorder=-1, level=19) -default her_buttplug_large1 = DollCloth("hermione", ("misc", "accessory"), "buttplug", "buttplug_large_1", [[99, 208, 14, 255], [254, 108, 181, 255], [84, 76, 214, 255]], zorder=-1, level=23) +default her_outfit_bb = DollOutfit([her_hair_base, her_accessory_bb_tie, her_tattoo_bb_tattoo]) -# Potions # +############# +## Potions ## +############# -#Breast Expansion -default her_potion_expand_breasts1 = DollCloth("hermione", ("hidden", "accessory"), "accessory", "potion_expand_breasts1", None) -default her_potion_expand_breasts2 = DollCloth("hermione", ("hidden", "accessory"), "accessory", "potion_expand_breasts2", None) -default her_potion_expand_breasts3 = DollCloth("hermione", ("hidden", "accessory"), "accessory", "potion_expand_breasts3", None) +default her_chest_breasts1 = DollBodypart("hermione", ("hidden", "chest"), "chest", "big1") +default her_chest_breasts2 = DollBodypart("hermione", ("hidden", "chest"), "chest", "big2") +default her_chest_breasts3 = DollBodypart("hermione", ("hidden", "chest"), "chest", "big3") -# Ass Expansion -default her_potion_expand_ass1 = DollCloth("hermione", ("hidden", "accessory"), "accessory", "her_potion_expand_ass1", None) -default her_potion_expand_ass2 = DollCloth("hermione", ("hidden", "accessory"), "accessory", "her_potion_expand_ass2", None) -default her_potion_expand_ass3 = DollCloth("hermione", ("hidden", "accessory"), "accessory", "her_potion_expand_ass3", None) - -# Catgirl -default her_cat_ears = DollClothDynamic("hermione", ("head", "headgear"), "headgear", "cat_ears", [[209, 123, 67, 255], [232, 232, 232, 255]], tracking="?hair") -default her_cat_legs = DollCloth("hermione", ("legwear", "stockings"), "stockings", "cat_legs",[[209, 123, 67, 255]]) -default her_cat_arms = DollCloth("hermione", ("upper body", "gloves"), "gloves", "cat_arms", [[209, 123, 67, 255], [214, 122, 122, 255], [37, 37, 37, 255]]) -default her_cat_tail = DollCloth("hermione", ("misc", "accessory"), "accessory", "cat_tail", [[209, 123, 67, 255]], zorder=-1) -default her_cat_muzzle = DollCloth("hermione", ("head", "makeup"), "makeup", "cat_muzzle", [[214, 122, 122, 255]]) - -default her_outfit_cat1 = DollOutfit([her_hair_base, her_cat_ears, her_cat_tail], hidden=True) -default her_outfit_cat2 = DollOutfit([her_hair_base, her_cat_ears, her_cat_tail, her_cat_legs, her_cat_arms, her_pubes_beaver], hidden=True) -default her_outfit_cat3 = DollOutfit([her_hair_base, her_cat_ears, her_cat_tail, her_cat_legs, her_cat_arms, her_pubes_beaver, her_cat_muzzle], hidden=True) - -################ -## Not In Use ## -################ - -#default her_bottom_winter_1 = DollCloth("hermione", ("lower body", "skirts"), "bottom", "winter_skirt_1", [[192, 31, 30, 255]]) +default her_hips_ass1 = DollBodypart("hermione", ("hidden", "hips"), "hips", "big1") +default her_hips_ass2 = DollBodypart("hermione", ("hidden", "hips"), "hips", "big2") +default her_hips_ass3 = DollBodypart("hermione", ("hidden", "hips"), "hips", "big3") diff --git a/game/scripts/characters/hooch/wardrobe.rpy b/game/scripts/characters/hooch/wardrobe.rpy index 35925fa3..c2720b46 100644 --- a/game/scripts/characters/hooch/wardrobe.rpy +++ b/game/scripts/characters/hooch/wardrobe.rpy @@ -4,6 +4,9 @@ default hooch = Doll(name="hooch") +default hoo_frame_default = DollBodypart("hooch", ("hidden", "frame"), "frame", "default") +default hoo_body_default = DollOutfit([hoo_frame_default], hidden=True) + ############### ## Hair ## ############### diff --git a/game/scripts/characters/luna/wardrobe.rpy b/game/scripts/characters/luna/wardrobe.rpy index 76beb59f..de2445a0 100644 --- a/game/scripts/characters/luna/wardrobe.rpy +++ b/game/scripts/characters/luna/wardrobe.rpy @@ -4,6 +4,9 @@ default luna = Doll(name="luna") +default lun_frame_default = DollBodypart("luna", ("hidden", "frame"), "frame", "default") +default lun_body_default = DollOutfit([lun_frame_default], hidden=True) + ########## ## Hair ## ########## diff --git a/game/scripts/characters/susan/wardrobe.rpy b/game/scripts/characters/susan/wardrobe.rpy index fdf0243a..ea9c1526 100644 --- a/game/scripts/characters/susan/wardrobe.rpy +++ b/game/scripts/characters/susan/wardrobe.rpy @@ -4,6 +4,9 @@ default susan = Doll(name="susan") +default sus_frame_default = DollBodypart("susan", ("hidden", "frame"), "frame", "default") +default sus_body_default = DollOutfit([sus_frame_default], hidden=True) + ########## ## Hair ## ########## diff --git a/game/scripts/characters/tonks/wardrobe.rpy b/game/scripts/characters/tonks/wardrobe.rpy index 76d644b6..facb11a9 100644 --- a/game/scripts/characters/tonks/wardrobe.rpy +++ b/game/scripts/characters/tonks/wardrobe.rpy @@ -4,6 +4,9 @@ default tonks = Doll(name="tonks") +default ton_frame_default = DollBodypart("tonks", ("hidden", "frame"), "frame", "default") +default ton_body_default = DollOutfit([ton_frame_default], hidden=True) + ########## ## Hair ## ########## diff --git a/game/scripts/doll/body.rpy b/game/scripts/doll/body.rpy index c9e467a2..b63de82e 100644 --- a/game/scripts/doll/body.rpy +++ b/game/scripts/doll/body.rpy @@ -19,39 +19,17 @@ init python: self.is_stale() def generate_hash(self): - salt = str( [self.char.name + self.char.pose, str(self.hue.__hash__())]) + bodyparts_hash = str([x[0]._hash for x in self.char.states.values() if istype(x[0], DollBodypart) and x[2]]) + salt = str( [self.char.name + self.char.pose, str(self.hue.__hash__()), bodyparts_hash]) return hash(salt) @functools.cache def get_layers(self, hash): - path = os.path.join("characters", self.char.name, self.char.pose, "body") - - extensions = self.extensions - modifiers = self.layer_modifiers - layers = {} - for f in renpy.list_files(): - fp, fn = os.path.split(f) - fn, ext = os.path.splitext(fn) - if not fp == path or not ext in extensions: - continue - - _, *tails = fn.rsplit("_") - - zorder = self.zorder - - if tails: - lmodifier, *tails = tails - - if not lmodifier in modifiers: - print("Invalid modifier for file: {}".format(f)) - continue - - zorder_mod = modifiers.get(lmodifier) - zorder = (zorder + int(zorder_mod)) if lmodifier != "zorder" else int(tails[-1]) - - layers.setdefault(fn, [f, zorder]) + for object, zorder, is_worn in self.char.states.values(): + if istype(object, DollBodypart) and is_worn is True: + layers.update(object.get_layers(object._hash)) return layers diff --git a/game/scripts/doll/bodypart.rpy b/game/scripts/doll/bodypart.rpy new file mode 100644 index 00000000..691dd0a0 --- /dev/null +++ b/game/scripts/doll/bodypart.rpy @@ -0,0 +1,71 @@ +init 1 python: + class DollBodypart(DollCloth): + layer_types = { + "mask": "-1", + } + + layer_modifiers = { + "zorder": None, + } + + def __init__(self, name, categories, type, id, zorder=None, unlocked=False, level=0, blacklist=[], parent=None, modpath=None): + super().__init__(name, categories, type, id, None, zorder, unlocked, level, blacklist, parent, modpath) + + def __repr__(self): + return f"DollBodypart(name={self.name}, categories={self.categories}, type={self.type}, id={self.id}, color={self.color}, zorder={self.zorder}, unlocked={self.unlocked}, level={self.level}, blacklist={self.blacklist}, parent={self.parent}, modpath={self.modpath or None})" + + def generate_hash(self): + salt = str( [self.name, self.type, self.char.pose, self.id, str(self.char.body._hash)] ) + return hash(salt) + + @functools.cache + def get_layers(self, hash): + path = os.path.join(self.modpath, "characters", self.name, self.char.pose, "bodyparts", self.type, self.id) + + extensions = self.extensions + types = self.layer_types + modifiers = self.layer_modifiers + + layers = {} + for f in renpy.list_files(): + fp, fn = os.path.split(f) + fn, ext = os.path.splitext(fn) + + if not fp == path or not ext in extensions: + continue + + ltype, *tails = fn.rsplit("_") + + # if not ltype in types: + # print("Invalid layer type for file: {}".format(f)) + # continue + + zorder = types.get(ltype) or self.zorder + + if isinstance(zorder, str): + # Note: Layer uses relative zorder if it's passed as a string + zorder = self.zorder + int(zorder) + + if tails: + lmodifier, *tails = tails + + if not lmodifier in modifiers: + print("Invalid modifier for file: {}".format(f)) + continue + + zorder_mod = modifiers.get(lmodifier) + zorder = (zorder + int(zorder_mod)) if lmodifier != "zorder" else int(tails[-1]) + layers.setdefault("_".join([ltype, lmodifier]), [f, zorder]) + else: + layers.setdefault(ltype, [f, zorder]) + + return layers + + def apply_color(self, img, n): + raise NotImplementedError + + def set_color(self, n): + raise NotImplementedError + + def reset_color(self, n=None): + raise NotImplementedError diff --git a/game/scripts/doll/clothes.rpy b/game/scripts/doll/clothes.rpy index 75132f0b..73ac0f06 100644 --- a/game/scripts/doll/clothes.rpy +++ b/game/scripts/doll/clothes.rpy @@ -2,7 +2,7 @@ init python: class DollCloth(DollMethods): layer_types = { "mask": "-1", - "skin": 1, + "skin": 10, "armfix": "+1", "outline": None, "extra": None, @@ -29,7 +29,7 @@ init python: self.char = eval(name) self.color_default = [x[:] for x in color] if color else None - self.zorder = zorder or self.char.clothes[type][1] + self.zorder = zorder or self.char.states[type][1] self.seen = self.unlocked self._hash = self.generate_hash() @@ -38,6 +38,9 @@ init python: self.char.wardrobe.setdefault(self.categories[0], {}).setdefault(self.categories[1], []).append(self) self.char.wardrobe_list.append(self) + # Define new item slot type if doesn't exist + self.char.states.setdefault(self.type, [None, (self.zorder or 1), True]) + def __repr__(self): return f"DollCloth(name={self.name}, categories={self.categories}, type={self.type}, id={self.id}, color={self.color}, zorder={self.zorder}, unlocked={self.unlocked}, level={self.level}, blacklist={self.blacklist}, parent={self.parent}, modpath={self.modpath or None})" @@ -159,12 +162,15 @@ init python: def build_icon(self, hash): matrix = SaturationMatrix(0.0) sprites = [i for i in self.build_image(hash, matrix=matrix) if not i[0] == "mask"] - bounds = self.get_layers(hash).get("outline", [sprites[0][1]])[0] + + try: + bounds = self.get_layers(hash).get("outline", [sprites[0][1]])[0] + except IndexError: + return Text(f"Error\n{{color=#00ffff}}{{size=-6}}ID:{self.id}{{/size}}{{/color}}", color="#ff0000") sprites.extend(self.char.body.build_image(self.char.body._hash, matrix=matrix)) sprites.sort(key=itemgetter(2)) - wmax, hmax = self.sizes wmin = hmin = 96 @@ -230,6 +236,7 @@ init python: renpy.hide_screen("colorpickerscreen") elif isinstance(n, list): self.color = [x[:] for x in n] + self.is_stale() def reset_color(self, n=None): """Reset cloth color. Takes optional int layer number to reset only specific layer color.""" diff --git a/game/scripts/doll/clothes_dynamic.rpy b/game/scripts/doll/clothes_dynamic.rpy index 17c7390c..2d16e74f 100644 --- a/game/scripts/doll/clothes_dynamic.rpy +++ b/game/scripts/doll/clothes_dynamic.rpy @@ -1,6 +1,6 @@ init python: class DollClothDynamic(DollCloth): - prefixes = ("!", "?") + prefixes = ["!=", "?=", "+=", "!", "?", "+"] def __init__(self, name, categories, type, id, color, zorder=None, unlocked=False, level=0, blacklist=[], modpath=None, tracking=None, parent=None): self._tracking = tracking @@ -8,17 +8,23 @@ init python: super().__init__(name, categories, type, id, color, zorder, unlocked, level, blacklist, modpath, parent) def __repr__(self): - return f"DollClothDynamic(name={self.name}, categories={self.categories}, type={self.type}, id={self.id}, color={self.color}, zorder={self.zorder}, unlocked={self.unlocked}, level={self.level}, blacklist={self.blacklist}, modpath={self.modpath or None}, tracking={self._tracking}, parent={self.parent})" + return f"DollClothDynamic(name='{self.name}', categories={self.categories}, type='{self.type}', id='{self.id}', color={self.color}, zorder={self.zorder}, unlocked={self.unlocked}, level={self.level}, blacklist={self.blacklist}, modpath={self.modpath or None}, tracking='{self._tracking}', parent={self.parent})" - @property + @functools.cached_property + def prefix(self): + return next((p for p in self.prefixes if self._tracking.startswith(p)), None) + + @functools.cached_property def tracking(self): prefixes = "".join(self.prefixes) - return self._tracking.strip(prefixes) + return self._tracking.strip(self.prefix) @property def tracking_object(self): - tracking = self.tracking - return self.char.clothes.get(tracking)[0] + if self.prefix in ("!", "?", "+"): + return self.char.states.get(self.tracking)[0] + else: + return eval(self.tracking) def generate_hash(self): tracking_object = self.tracking_object @@ -31,10 +37,10 @@ init python: path = os.path.join(self.modpath, "characters", self.name, self.char.pose, "clothes", self.type, self.id) _tracking = self._tracking - def _negative_lookahead(tracking): + def _negative_lookahead(): return None if self.tracking_object else "default" - def _lookahead(tracking, path): + def _lookahead(path): tracking_object = self.tracking_object tracking_id = tracking_object.id if tracking_object else None path = os.path.join(path, tracking_id) @@ -43,7 +49,36 @@ init python: return "default" return tracking_id - def _default(tracking): + def _chainload(): + + def __wrapper(obj): + + def ___chain(obj): + if isinstance(obj, DollClothDynamic): + return "+".join( (obj.id, ___chain(obj.tracking_object)) ) + return obj.id + + return ___chain(obj) + + tracking_object = self.tracking_object + + if tracking_object: + + chain = __wrapper(tracking_object) + tracking_id = chain + + return tracking_id + return None + + def _negative_lookahead_item(): + tracking_object = self.tracking_object + return None if self.char.is_equipped_item(tracking_object) else "default" + + def _lookahead_item(): + tracking_object = self.tracking_object + return tracking_object.id if self.char.is_equipped_item(tracking_object) else "default" + + def _default(): tracking_object = self.tracking_object return tracking_object.id if tracking_object else None @@ -51,13 +86,16 @@ init python: tracking_id = "default" else: processors = { - "!": lambda tracking, _: _negative_lookahead(_tracking), - "?": lambda tracking, path: _lookahead(_tracking, path), - None: lambda tracking, _: _default(_tracking) + "!": lambda tracking, _: _negative_lookahead(), + "?": lambda tracking, path: _lookahead(path), + "+": lambda tracking, _: _chainload(), + "!=": lambda tracking, _: _negative_lookahead_item(), + "?=": lambda tracking, _: _lookahead_item(), + "+=": lambda tracking, _: _chainload(), + None: lambda tracking, _: _default() } - prefix = next((p for p in self.prefixes if _tracking.startswith(p)), None) - processor = processors[prefix] + processor = processors[self.prefix] tracking_id = processor(_tracking, path) if tracking_id is None: @@ -106,9 +144,7 @@ init python: @functools.cache def build_icon(self, hash): - _tracking = self._tracking - - if _tracking.startswith("!"): + if self.prefix in ("!", "!="): self.layers = self.get_layers(hash, _ignore_equipped=True) hash = self.generate_hash() tracking_object = None diff --git a/game/scripts/doll/cum.rpy b/game/scripts/doll/cum.rpy index 3b8f0d79..8abf3a94 100644 --- a/game/scripts/doll/cum.rpy +++ b/game/scripts/doll/cum.rpy @@ -18,7 +18,7 @@ init python: self._hash = None def generate_hash(self): - salt = str( [self.char.name, self.char.pose, str(self.char.face._hash), str(self.char.face._hash), str([x[0]._hash for x in self.char.clothes.values() if x[0] and x[2]]), sorted(list(self._cum.items()))] ) + salt = str( [self.char.name, self.char.pose, str(self.char.face._hash), str(self.char.face._hash), str([x[0]._hash for x in self.char.states.values() if x[0] and x[2]]), sorted(list(self._cum.items()))] ) return hash(salt) def set_cum(self, *args, **kwargs): @@ -42,7 +42,7 @@ init python: face_layers = self.char.face_layers active_faces = self.char.face._face - active_clothes = self.char.clothes + active_clothes = self.char.states layers = {} for part, name in cum.items(): diff --git a/game/scripts/doll/init.rpy b/game/scripts/doll/init.rpy index 51d69808..756e48d3 100644 --- a/game/scripts/doll/init.rpy +++ b/game/scripts/doll/init.rpy @@ -5,6 +5,9 @@ init python: for c in CHARACTERS: char = get_character_object(c) + body_default = get_character_body(c, type="default") + char.equip(body_default) + outfit_default = get_character_outfit(c, type="default") char.equip(outfit_default) diff --git a/game/scripts/doll/main.rpy b/game/scripts/doll/main.rpy index 7ea35b27..a998d9b0 100644 --- a/game/scripts/doll/main.rpy +++ b/game/scripts/doll/main.rpy @@ -2,12 +2,30 @@ init python: import asyncio class Doll(DollMethods): - # 0 - 50 = Skin Layers + # 0 - 50 = Skin/Body Layers # 51 - 100 = Face Layers # 101 - 300+ = Clothes Layers + body_layers = { + "frame": 0, + "legs": 1, + "hips": 2, + "abdomen": 3, + "chest": 4, + "arms": 5, + "head": 6, + } + + face_layers = { + "tears": 75, + "eyebrows": 70, + "pupils": 65, + "eyes": 60, + "mouth": 55, + "cheeks": 51 + } + clothing_layers = { - "buttplug": -11, "makeup": 111, # multislot "accessory": 121, # multislot "piercing": 131, # multislot @@ -28,22 +46,13 @@ init python: "headgear": 281 } - face_layers = { - "tears": 75, - "eyebrows": 70, - "pupils": 65, - "eyes": 60, - "mouth": 55, - "cheeks": 51 - } - def __init__(self, name): self.wardrobe = {} self.wardrobe_list = [] self.blacklist = [] self.outfits = [] self.name = name - self.clothes = {k: [None, v, True] for k, v in self.clothing_layers.items()} + self.states = {k: [None, v, True] for k, v in (self.clothing_layers | self.body_layers).items()} self.face = DollFace(self) self.body = DollBody(self) self.cum = DollCum(self) @@ -64,7 +73,8 @@ init python: self.align = (0.5, 1.0) def generate_hash(self): - salt = str( [self.name, self.pose, str(self.body._hash), str(self.face._hash), str(self.cum._hash), str([x[0]._hash for x in self.clothes.values() if x[0] and x[2]])] ) + clothes_hash = str([x[0]._hash for x in self.states.values() if istype(x[0], (DollCloth, DollClothDynamic, DollMakeup)) and x[2]]) + salt = str( [self.name, self.pose, str(self.body._hash), str(self.face._hash), str(self.cum._hash), clothes_hash] ) return hash(salt) def show(self): @@ -92,7 +102,7 @@ init python: (self.body.build_image(self.body._hash), self.face.build_image(self.face._hash), self.cum.build_image(self.cum._hash), - *(x[0].build_image(x[0]._hash) for x in self.clothes.values() if x[0] and x[2])) + *(x[0].build_image(x[0]._hash) for x in self.states.values() if x[0] and x[2])) )) masks = [sprites.pop(sprites.index(x)) for x in sprites if x[0] == "mask"] @@ -131,16 +141,49 @@ init python: def equip(self, obj, remove_old=True): """Takes DollCloth or DollOutfit object to equip.""" - if isinstance(obj, DollCloth): - self._equip_cloth(obj) + + def _equip_item(item, color=None): + if item.is_multislot(): + for i in range(100): + multislot = item.type + str(i) + if multislot not in self.states or self.states[multislot][0] is None: + zorder = self.states[item.type][1] + self.states[multislot] = [item, zorder, True] + break + else: + zorder = self.states[item.type][1] + self.states[item.type] = [item, zorder, True] + + if self.is_blacklisted(item.type): + self.unequip(*self.get_blacklister(item.type)) + + if item.blacklist: + self.unequip(*item.blacklist) + + for tracking in self.get_trackers_list(item.type): + tracking.is_stale() + + if color: + item.set_color(color) + + item.is_stale() + + def _equip_bodypart(item): + _equip_item(item) + self.body.is_stale() + + if istype(obj, (DollCloth, DollClothDynamic, DollMakeup)): + _equip_item(obj) + elif istype(obj, DollBodypart): + _equip_bodypart(obj) elif isinstance(obj, DollOutfit): if remove_old: - self.unequip("all") - for cloth in obj.group: - self._equip_cloth(cloth.parent, color=cloth.color) + self.unequip("clothes", "makeup") + for item in obj.group: + _equip_item(item.parent, color=item.color) elif isinstance(obj, (list, tuple)): - for cloth in obj: - self._equip_cloth(cloth) + for item in obj: + _equip_item(item) self.rebuild_blacklist() update_chibi(self.name) @@ -150,58 +193,56 @@ init python: if renpy.showing(get_character_tag(self.name), layer=self.layer): self.show() - def _equip_cloth(self, cloth, color=None): - if cloth.type in self.multislots: - for i in range(100): - multitype = cloth.type + str(i) - if multitype not in self.clothes or self.clothes[multitype][0] is None: - zorder = self.clothes[cloth.type][1] - self.clothes[multitype] = [cloth, zorder, True] - break - else: - zorder = self.clothes[cloth.type][1] - self.clothes[cloth.type] = [cloth, zorder, True] - - if self.is_blacklisted(cloth.type): - self.unequip(*self.get_blacklister(cloth.type)) - - if cloth.blacklist: - self.unequip(*cloth.blacklist) - - for tracking in self.get_trackers_list(cloth.type): - tracking.is_stale() - - if color: - cloth.set_color(color) - - cloth.is_stale() - def unequip(self, *args): """Takes argument(s) containing string cloth type(s) to unequip.""" - if "all" in args: - for k, v in self.clothes.items(): + + def _unequip_all(): + for k, v in self.states.items(): if not k in self.blacklist_unequip: v[0], v[2] = None, True - else: - for arg in args: - if isinstance(arg, DollCloth): - if arg.type in self.multislots: - slot = next((k for k, v in self.clothes.items() if v[0] == arg), None) - if not slot: - continue + def _unequip_type(type): + for k, v in self.states.items(): + if not k in self.blacklist_unequip and istype(v[0], type): + v[0], v[2] = None, True - self.clothes[slot][0] = None - else: - self.clothes[arg.type][0] = None + def _unequip_slot(slot): + if slot in self.blacklist_unequip: + return + + if slot in self.multislots: + for k, v in self.states.items(): + if any((x in k) for x in self.multislots): + v[0], v[2] = None, True + else: + self.states[slot][0], self.states[slot][2] = None, True + + for arg in args: + if isinstance(arg, str): + if arg == "all": + _unequip_all() + elif arg == "clothes": + _unequip_type((DollCloth, DollClothDynamic)) + elif arg == "bodyparts": + _unequip_type(DollBodypart) + elif arg == "makeup": + _unequip_type(DollMakeup) else: - if arg in self.multislots: - for k, v in self.clothes.items(): - if not k in self.blacklist_unequip and any((x in k) for x in self.multislots): - v[0], v[2] = None, True - else: - if not arg in self.blacklist_unequip: - self.clothes[arg][0] = None + _unequip_slot(arg) + + elif isinstance(arg, DollCloth): + if arg.is_multislot(): + slot = next((k for k, v in self.states.items() if v[0] == arg), None) + + if not slot: + continue + + _unequip_slot(slot) + else: + _unequip_slot(arg.type) + elif isinstance(arg, DollOutfit): + for item in arg.group: + _unequip_slot(item.type) self.rebuild_blacklist() update_chibi(self.name) @@ -211,9 +252,9 @@ init python: if renpy.showing(get_character_tag(self.name), layer=self.layer): self.show() - def get_equipped(self, type): + def get_equipped(self, slot): """Takes argument containing string cloth type. Returns equipped object for cloth type.""" - return self.clothes[type][0] + return self.states[slot][0] def get_equipped_item(self, items): """Returns first equipped item from a list or None.""" @@ -224,18 +265,39 @@ init python: def strip(self, *args): """Takes argument(s) containing string cloth type(s) to temporarily displace (hide).""" - if "all" in args: - for k, v in self.clothes.items(): - if not k.startswith(self.blacklist_toggles): + def _strip_all(): + for k, v in self.states.items(): + if not k.startswith(self.blacklist_unequip): v[2] = False - else: - for arg in args: - if arg in self.multislots: - for k, v in self.clothes.items(): - if k.startswith(arg): - v[2] = False - else: - self.clothes[arg][2] = False + + def _strip_type(type): + for k, v in self.states.items(): + if not k in self.blacklist_unequip and istype(v[0], type): + v[2] = False + + def _strip_slot(slot): + if slot in self.blacklist_unequip: + return + + if slot in self.multislots: + for k, v in self.states.items(): + if k.startswith(slot): + v[2] = False + else: + self.states[slot][2] = False + + for arg in args: + + if arg == "all": + _strip_all() + elif arg == "clothes": + _strip_type((DollCloth, DollClothDynamic)) + elif arg == "makeup": + _strip_type(DollMakeup) + elif arg == "bodyparts": + _strip_type(DollBodypart) + else: + _strip_slot(arg) update_chibi(self.name) self.is_stale() @@ -244,21 +306,36 @@ init python: self.show() def wear(self, *args): - """Takes argument(s) containing string cloth type(s) to put on (unhide).""" - if "all" in args: - if self.is_worn("all"): - return - - for v in self.clothes.values(): + """Takes argument(s) containing string cloth type(s) to temporarily displace (hide).""" + def _wear_all(): + for k, v in self.states.items(): v[2] = True - else: - for arg in args: - if arg in self.multislots: - for k, v in self.clothes.items(): - if k.startswith(arg): - v[2] = True - else: - self.clothes[arg][2] = True + + def _wear_type(type): + for k, v in self.states.items(): + if istype(v[0], type): + v[2] = True + + def _wear_slot(slot): + if slot in self.multislots: + for k, v in self.states.items(): + if k.startswith(slot): + v[2] = True + else: + self.states[slot][2] = True + + for arg in args: + + if arg == "all": + _wear_all() + elif arg == "clothes": + _wear_type((DollCloth, DollClothDynamic)) + elif arg == "makeup": + _wear_type(DollMakeup) + elif arg == "bodyparts": + _wear_type(DollBodypart) + else: + _wear_slot(arg) update_chibi(self.name) self.is_stale() @@ -270,64 +347,88 @@ init python: """Takes argument containing string cloth type. Returns True if slot is occupied, False otherwise.""" for arg in args: if arg in self.multislots: - return any(bool(v[0]) for k, v in self.clothes.items() if k.startswith(arg)) + return any(bool(v[0]) for k, v in self.states.items() if k.startswith(arg)) else: - if not self.clothes[arg][0]: + if not self.states[arg][0]: return False return True def is_any_equipped(self, *args): """Takes arguments containing string cloth types. Returns True if ANY of them is equipped, False otherwise.""" - if "clothes" in args: - for k, v in self.clothes.items(): - if not k.startswith(self.blacklist_toggles): + def _is_equipped_type(type): + for k, v in self.states.items(): + if not k in self.blacklist_toggles and istype(v[0], type): if self.is_equipped(k): return True - else: - for arg in args: - if self.is_equipped(arg): - return True - return False + return False + + state = False + + for arg in args: + + if arg == "clothes": + state = _is_equipped_type((DollCloth, DollClothDynamic)) + elif arg == "makeup": + state = _is_equipped_type(DollMakeup) + elif arg == "bodyparts": + state = _is_equipped_type(DollBodypart) + else: + state = self.is_equipped(arg) + + if state is True: + break + + return state def is_equipped_item(self, item): """Takes DollCloth object or list of objects. Returns True if item is equipped, False otherwise.""" if item.is_multislot(): - return bool(next((k for k, v in self.clothes.items() if v[0] == item), False)) + return bool(next((k for k, v in self.states.items() if v[0] == item), False)) return self.get_equipped(item.type) == item def is_worn(self, *args): """Takes argument(s) containing string cloth type(s). Returns True if worn, False otherwise.""" - if "all" in args: - for v in self.clothes.values(): - if not v[2]: + + for arg in args: + if arg in self.multislots: + return any( (v[0] and v[2]) for k, v in self.states.items() if k.startswith(arg)) + else: + if not self.states[arg][0] or not self.states[arg][2]: return False - else: - for arg in args: - if arg in self.multislots: - return any( (v[0] and v[2]) for k, v in self.clothes.items() if k.startswith(arg)) - else: - if not self.clothes[arg][0] or not self.clothes[arg][2]: - return False return True def is_any_worn(self, *args): """Takes arguments containing string cloth types. Returns True if ANY of them is worn, False otherwise.""" - if "clothes" in args: - for k, v in self.clothes.items(): - if not k.startswith(self.blacklist_toggles): + def _is_worn_type(type): + for k, v in self.states.items(): + if not k in self.blacklist_toggles and istype(v[0], type): if self.is_worn(k): return True - else: - for arg in args: - if self.is_worn(arg): - return True - return False + return False + + state = False + + for arg in args: + + if arg == "clothes": + state = _is_worn_type((DollCloth, DollClothDynamic)) + elif arg == "makeup": + state = _is_worn_type(DollMakeup) + elif arg == "bodyparts": + state = _is_worn_type(DollBodypart) + else: + state = self.is_worn(arg) + + if state is True: + break + + return state def set_face(self, *args, **kwargs): self.face.set_face(*args, **kwargs) - [x[0].is_stale() for x in self.clothes.values() if isinstance(x[0], DollMakeup) and x[2]] + [x[0].is_stale() for x in self.states.values() if istype(x[0], DollMakeup) and x[2]] self.cum.is_stale() def get_face(self): @@ -344,7 +445,7 @@ init python: """Takes integer between 0 - 359, rotates the character body colour by given amount.""" self.body.set_hue(arg) - [x[0].is_stale() for x in self.clothes.values() if x[0] and x[2]] + [x[0].is_stale() for x in self.states.values() if x[0] and x[2]] self.is_stale() if renpy.showing(get_character_tag(self.name), layer=self.layer): @@ -369,14 +470,14 @@ init python: self.body.is_stale() self.face.is_stale() self.cum.is_stale() - [x[0].is_stale() for x in self.clothes.values() if x[0] and x[2]] + [x[0].is_stale() for x in self.states.values() if x[0] and x[2]] if renpy.showing(get_character_tag(self.name), layer=self.layer): self.show() def rebuild_blacklist(self): blacklist = [] - for v in self.clothes.values(): + for v in self.states.values(): if v[0]: blacklist.extend(v[0].blacklist) self.blacklist = list(set(blacklist)) @@ -387,15 +488,15 @@ init python: def get_blacklister(self, type): """Takes string cloth type. Returns a list of clothing types that report incompatibility.""" - return [x[0].type for x in self.clothes.values() if x[0] and type in x[0].blacklist] + return [x[0].type for x in self.states.values() if x[0] and type in x[0].blacklist] def get_trackers_list(self, type): """Takes string cloth type. Returns a list of clothing types that report incompatibility.""" - return [x[0] for x in self.clothes.values() if isinstance(x[0], DollClothDynamic) and type == x[0].tracking] + return [x[0] for x in self.states.values() if istype(x[0], DollClothDynamic) and type == x[0].tracking] def create_outfit(self, temp=False): """Creates a copy of the current character clothes and stores it.""" - return DollOutfit([x[0] for x in self.clothes.values() if x[0]], True, temp=temp) + return DollOutfit([x[0] for x in self.states.values() if x[0]], True, temp=temp) def import_outfit(self, path, fromfile=True): """Imports outfit from .png file or clipboard text.""" diff --git a/game/scripts/doll/outfits.rpy b/game/scripts/doll/outfits.rpy index 3a452031..0ed5c0b6 100644 --- a/game/scripts/doll/outfits.rpy +++ b/game/scripts/doll/outfits.rpy @@ -122,7 +122,7 @@ init python: def save(self): """Overwrites this outfit with clothes currently equipped by the character.""" - self.group = [x[0].clone() for x in self.char.clothes.values() if x[0]] + self.group = [x[0].clone() for x in self.char.states.values() if x[0]] return def is_modded(self): @@ -160,7 +160,7 @@ init python: def has_any_type(self, *args): """Takes arguments containing string cloth types. Returns True if ANY of them is worn, False otherwise.""" if "clothes" in args: - for k in self.char.clothes.keys(): + for k in self.char.states.keys(): if not k.startswith(self.blacklist_toggles): if self.has_type(k): return True diff --git a/game/scripts/utility/common_functions.rpy b/game/scripts/utility/common_functions.rpy index 43900fdf..fb342dbe 100644 --- a/game/scripts/utility/common_functions.rpy +++ b/game/scripts/utility/common_functions.rpy @@ -180,6 +180,11 @@ init -1 python: def matches(s1, s2, filter=" "): return s1.replace(filter, "") == s2.replace(filter, "") + def istype(inst, clss): + if not isinstance(clss, (list, tuple, set)): + clss = (clss,) + return type(inst) in clss + class IntLike(python_object): # Does not support rollback diff --git a/game/scripts/wardrobe/functions.rpy b/game/scripts/wardrobe/functions.rpy index 2afd5f78..c4504d52 100644 --- a/game/scripts/wardrobe/functions.rpy +++ b/game/scripts/wardrobe/functions.rpy @@ -26,6 +26,11 @@ init python: raise KeyError("'{}' character is undefined.".format(key)) return getattr(store, "{}_outfit_{}".format(key[:3], type)) + def get_character_body(key, type="default"): + if not key in CHARACTERS: + raise KeyError("'{}' character is undefined.".format(key)) + return getattr(store, "{}_body_{}".format(key[:3], type)) + def get_character_outfit_req(key, item): if not key in CHARACTERS: raise KeyError("'{}' character is undefined.".format(key)) @@ -105,8 +110,8 @@ init python: if not outfit.has_type("bottom"): score += 4 - if outfit.has_type("buttplug"): - score += 9 + # if outfit.has_type("buttplug"): + # score += 9 if outfit.has_type("makeup"): score += 1 diff --git a/game/scripts/wardrobe/wardrobe.rpy b/game/scripts/wardrobe/wardrobe.rpy index cf212ae9..01bdbf4e 100644 --- a/game/scripts/wardrobe/wardrobe.rpy +++ b/game/scripts/wardrobe/wardrobe.rpy @@ -301,8 +301,8 @@ label wardrobe_menu(): progress = get_character_progression(active_girl) - for k in dict(char_active.clothes).keys(): - valid_choices = [x for x in char_active.wardrobe_list if (x.type == k and x.unlocked and progress >= x.level)] + for k in dict(char_active.states).keys(): + valid_choices = [x for x in char_active.wardrobe_list if (istype(x, (DollCloth, DollClothDynamic, DollMakeup)) and x.type == k and x.unlocked and progress >= x.level)] if k == "panties": if not progress >= get_character_requirement(active_girl, "category lower undergarment"):