From 52b9c50c7bcfe549d9b45f91b1098710d8c72250 Mon Sep 17 00:00:00 2001 From: LoafyLemon Date: Fri, 3 Mar 2023 00:50:50 +0000 Subject: [PATCH] Bug fixes * Fixed temporarily hidden clothes being excluded from staleness checks during pose changes * Fixed Luna's lion outfit * Replaced list method call with a for loop, to avoid large list memory allocation * Fixed big booba an dumpy cheats * Fixed body controller submodule hash generator * Fixed cho panties throw crashing the game * Fixed Outfit/Clothing unlock referenced methods * Excluded body submodule from doll and icon image generation (superseded by bodyparts) --- .../default/clothes/accessory/lionhead/0.webp | 3 -- .../{outline.webp => outline_zorder_252.webp} | 0 .../cho/events/quidditch/gryffindor_match.rpy | 2 +- game/scripts/characters/luna/wardrobe.rpy | 2 +- game/scripts/doll/body.rpy | 2 +- game/scripts/doll/clothes.rpy | 1 - game/scripts/doll/main.rpy | 20 ++++++-- game/scripts/interface/cheats.rpy | 50 ++++++++++++------- game/scripts/utility/common_screens.rpy | 2 +- 9 files changed, 50 insertions(+), 32 deletions(-) delete mode 100644 game/characters/luna/poses/default/clothes/accessory/lionhead/0.webp rename game/characters/luna/poses/default/clothes/accessory/lionhead/{outline.webp => outline_zorder_252.webp} (100%) diff --git a/game/characters/luna/poses/default/clothes/accessory/lionhead/0.webp b/game/characters/luna/poses/default/clothes/accessory/lionhead/0.webp deleted file mode 100644 index 6fbb7bcc..00000000 --- a/game/characters/luna/poses/default/clothes/accessory/lionhead/0.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e4f16469f76fa22ea43a2346407a802434ae02dff4da1c40bec6af146a42feae -size 94 diff --git a/game/characters/luna/poses/default/clothes/accessory/lionhead/outline.webp b/game/characters/luna/poses/default/clothes/accessory/lionhead/outline_zorder_252.webp similarity index 100% rename from game/characters/luna/poses/default/clothes/accessory/lionhead/outline.webp rename to game/characters/luna/poses/default/clothes/accessory/lionhead/outline_zorder_252.webp diff --git a/game/scripts/characters/cho/events/quidditch/gryffindor_match.rpy b/game/scripts/characters/cho/events/quidditch/gryffindor_match.rpy index fe23f896..e60b11d8 100644 --- a/game/scripts/characters/cho/events/quidditch/gryffindor_match.rpy +++ b/game/scripts/characters/cho/events/quidditch/gryffindor_match.rpy @@ -1632,7 +1632,7 @@ label gryffindor_match: # Cho panties appear on Hermione's head as Cho throws them at her $ renpy.sound.play("sounds/woosh.ogg") - $ cho.unequip("accessory2") # Panties + $ cho.unequip(choq_panties_in_hand) # Panties pause .8 $ renpy.sound.play("sounds/squelch.ogg") $ hermione.equip(herq_panties_on_head) diff --git a/game/scripts/characters/luna/wardrobe.rpy b/game/scripts/characters/luna/wardrobe.rpy index 34d9e497..e6584e2f 100644 --- a/game/scripts/characters/luna/wardrobe.rpy +++ b/game/scripts/characters/luna/wardrobe.rpy @@ -205,7 +205,7 @@ default lun_outfit_harley_quinn = DollOutfit([lun_hair_harley_quinn, lun_pantyho default lun_bottom_casual_jeans = DollCloth("luna", ("lower body", "skirts"), "bottom", "casual_jeans", ["#8027bfff"]) default lun_top_casual_sweater = DollCloth("luna", ("upper body", "shirts"), "top", "casual_sweater", ["#382088ff", "#382088ff"]) -default lun_accessory_lionhead = DollCloth("luna", ("misc", "accessory"), "accessory", "lionhead", ["#000000ff"], zorder=300) +default lun_accessory_lionhead = DollCloth("luna", ("misc", "accessory"), "accessory", "lionhead", None) default lun_outfit_casual= DollOutfit([lun_hair_base, lun_panties_base1, lun_bra_base1, lun_bottom_casual_jeans, lun_top_casual_sweater], unlocked=True) default lun_outfit_lion_event = DollOutfit([lun_panties_base1, lun_bra_base1, lun_accessory_lionhead, lun_bottom_casual_jeans, lun_top_casual_sweater], hidden=True) diff --git a/game/scripts/doll/body.rpy b/game/scripts/doll/body.rpy index b63de82e..74c41883 100644 --- a/game/scripts/doll/body.rpy +++ b/game/scripts/doll/body.rpy @@ -20,7 +20,7 @@ init python: def generate_hash(self): 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]) + salt = str( [self.char.name, self.char.pose, str(self.hue.__hash__()), bodyparts_hash]) return hash(salt) @functools.cache diff --git a/game/scripts/doll/clothes.rpy b/game/scripts/doll/clothes.rpy index e13070f7..64535acf 100644 --- a/game/scripts/doll/clothes.rpy +++ b/game/scripts/doll/clothes.rpy @@ -169,7 +169,6 @@ init python: print(f"Missing textures:\n{self.__repr__()}") return Text(f"TexErr\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 diff --git a/game/scripts/doll/main.rpy b/game/scripts/doll/main.rpy index fd269be1..925d67f3 100644 --- a/game/scripts/doll/main.rpy +++ b/game/scripts/doll/main.rpy @@ -100,9 +100,10 @@ init python: def build_image(self, hash): from itertools import chain + # Note: Bodyparts are a part of 'self.states' now. + sprites = list(chain.from_iterable( - (self.body.build_image(self.body._hash), - self.face.build_image(self.face._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.states.values() if x[0] and x[2])) )) @@ -430,7 +431,10 @@ init python: def set_face(self, *args, **kwargs): self.face.set_face(*args, **kwargs) - [x[0].is_stale() for x in self.states.values() if istype(x[0], DollMakeup) and x[2]] + for i in self.states.values(): + if istype(i[0], DollMakeup): + i[0].is_stale() + self.cum.is_stale() def get_face(self): @@ -447,7 +451,10 @@ 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.states.values() if x[0] and x[2]] + for i in self.states.values(): + if i[0]: + i[0].is_stale() + self.is_stale() if renpy.showing(get_character_tag(self.name), layer=self.layer): @@ -472,7 +479,10 @@ init python: self.body.is_stale() self.face.is_stale() self.cum.is_stale() - [x[0].is_stale() for x in self.states.values() if x[0] and x[2]] + + for i in self.states.values(): + if i[0]: + i[0].is_stale() if renpy.showing(get_character_tag(self.name), layer=self.layer): self.show() diff --git a/game/scripts/interface/cheats.rpy b/game/scripts/interface/cheats.rpy index 79bfd7ba..cfcededa 100644 --- a/game/scripts/interface/cheats.rpy +++ b/game/scripts/interface/cheats.rpy @@ -361,34 +361,46 @@ label cheats: "-Permanent body alteration-": label .alteration: - $ _curr_breast_type = hermione.body.body["breasts"][0] - $ _curr_ass_type = hermione.body.body["backside"][0] or "normal" - # Note: itertools.cycle breaks Ren'py so we have to rely on a good 'ol if statement # *Sigh* I wish we had match statement in python 2 :( + # + # Years later: Python 3 switch cases are finally here, but are not usable in renpy. :( + + default _curr_breast_type = 0 + default _curr_ass_type = 0 menu: "Hermione Breasts ([_curr_breast_type])" (icon="interface/icons/small/hermione.webp"): - if _curr_breast_type == "normal": - $ hermione.set_body(breasts="big1") - elif _curr_breast_type == "big1": - $ hermione.set_body(breasts="big2") - elif _curr_breast_type == "big2": - $ hermione.set_body(breasts="big3") - else: - $ hermione.set_body(breasts="normal") + python: + if _curr_breast_type == 0: + hermione.equip(her_chest_breasts1) + _curr_breast_type = 1 + elif _curr_breast_type == 1: + hermione.equip(her_chest_breasts2) + _curr_breast_type = 2 + elif _curr_breast_type == 2: + hermione.equip(her_chest_breasts3) + _curr_breast_type = 3 + elif _curr_breast_type == 3: + hermione.unequip("chest") + _curr_breast_type = 0 jump cheats.alteration "Hermione Ass ([_curr_ass_type])" (icon="interface/icons/small/hermione.webp"): - if _curr_ass_type == "normal": - $ hermione.set_body(backside="big1") - elif _curr_ass_type == "big1": - $ hermione.set_body(backside="big2") - elif _curr_ass_type == "big2": - $ hermione.set_body(backside="big3") - else: - $ hermione.set_body(backside=None) # This is intended. + python: + if _curr_ass_type == 0: + hermione.equip(her_hips_ass1) + _curr_ass_type = 1 + elif _curr_ass_type == 1: + hermione.equip(her_hips_ass2) + _curr_ass_type = 2 + elif _curr_ass_type == 2: + hermione.equip(her_hips_ass3) + _curr_ass_type = 3 + elif _curr_ass_type == 3: + hermione.unequip("hips") + _curr_ass_type = 0 jump cheats.alteration diff --git a/game/scripts/utility/common_screens.rpy b/game/scripts/utility/common_screens.rpy index 2b1ac2c2..255e79f9 100644 --- a/game/scripts/utility/common_screens.rpy +++ b/game/scripts/utility/common_screens.rpy @@ -41,7 +41,7 @@ screen clothing_unlock(item): if isinstance(item, DollCloth): add item.icon align (0.5, 0.5) zoom 0.5 elif isinstance(item, DollOutfit): - add item.get_image() align (0.5, 0.0) yoffset -50 zoom 0.4 + add item.image align (0.5, 0.0) yoffset -50 zoom 0.4 screen invisible_button(action=NullAction(), keysym=None, alternate=None):