Compare commits

..

4 Commits

Author SHA1 Message Date
Gouvernathor 218d8c63d2 Fix 2024-03-30 17:53:00 +01:00
Gouvernathor 1d1d18ad1c Remove the last setattr on the store
benign in this case since the variable is builtin, but consistency and good practices
2024-03-30 17:33:28 +01:00
Gouvernathor 31ebf9356a Avoid mutable objects in signature 2024-03-30 17:18:54 +01:00
Gouvernathor f7f0ecb566 Default queues instead of using instanciation magic 2024-03-30 17:17:14 +01:00
63 changed files with 565 additions and 752 deletions

120
README.md

File diff suppressed because it is too large Load Diff

View File

@ -273,10 +273,10 @@ image ch_gen dick_out:
"characters/genie/chibis/jerk_off/dick_out.webp"
image ch_gen dick_out_normal:
"characters/genie/chibis/jerk_off/dick_out_normal.webp"
"characters/genie/chibis/jerk_off/dick_out_normal.webp"
image ch_gen dick_out_shocked:
"characters/genie/chibis/jerk_off/dick_out_shocked.webp"
"characters/genie/chibis/jerk_off/dick_out_shocked.webp"
# Masturbating while standing
#TODO Genie's standing jerk off chibis don't stand level with the others. Fix this and check/correct relevant events

File diff suppressed because it is too large Load Diff

View File

@ -82,12 +82,12 @@ init python:
child = getattr(self, layer)
if isinstance(child, ImageReference):
name = getattr(self, f"_{layer}")
attributes = renpy.get_attributes(name) or renpy.get_attributes(f"{tag_prefix}_{layer}")
name = getattr(self, "_{}".format(layer))
attributes = renpy.get_attributes(name) or renpy.get_attributes("{}_{}".format(tag_prefix, layer))
if attributes:
attributes = " ".join(attributes)
child = ImageReference(f"{name} {attributes}")
child = ImageReference("{} {}".format(name, attributes))
elif child.name != name:
child = ImageReference(name)
else:

View File

@ -813,7 +813,7 @@ label cc_pf_strip_T2_intro_E3:
cho @ cheeks blush "Does Granger do these sorts of things for you too?" ("soft", "base", "worried", "mid")
# Remove skirt.
# Remove skirt.
if cho.is_worn("bottom"):
play sound "sounds/cloth_sound3.ogg"
hide cho_main

View File

@ -24,7 +24,7 @@ init python:
states.gen.image.offset = (0, 600)
if face:
variant = f"genie {face}"
variant = "genie {}".format(face)
renpy.set_tag_attributes(variant)
side = "genie"

View File

@ -82,7 +82,7 @@ init python:
else:
chibi["base"] = "ch_hem walk_robe_n"
else:
chibi["base"] = "ch_hem walk"
chibi["base"] = "ch_hem walk"
elif not chibi.action or chibi.action == "stand":
# Determine clothing state
@ -97,7 +97,7 @@ init python:
else:
chibi["base"] = "ch_hem blink_robe_n"
else:
chibi["base"] = "ch_hem blink"
chibi["base"] = "ch_hem blink"
elif chibi.action == "dance":
# Determine clothing state
@ -140,9 +140,9 @@ init python:
elif chibi.action in ("drink_potion", "sniff_potion", "hold_potion"):
if not hermione.is_any_worn("top", "bottom"):
chibi["base"] = f"ch_hem {chibi.action}_nude"
chibi["base"] = "ch_hem {}_nude".format(chibi.action)
else:
chibi["base"] = f"ch_hem {chibi.action}"
chibi["base"] = "ch_hem {}".format(chibi.action)
# Sets up a chibi scene with Hermione and Genie in it

View File

@ -534,6 +534,6 @@ label hermione_chitchat:
block if states.her.ev.potions.breast_expand_drank:
her "You don't happen to have any more of that breast expansion potion, [name_genie_hermione]?" ("open", "base", "base", "mid")
her "I've noticed some correlations between grades and the student's chest size, so I thought I'd give it a shot during our next exam..." ("open", "base", "base", "mid")
her "I've noticed some correlations between your grades and your chest size, so I thought I'd give it a shot during our next exam..." ("open", "base", "base", "mid")
return

View File

@ -13,20 +13,20 @@ label tentacle_scene_intro:
$ d_flag_03 = False
label .spell:
if d_flag_01 and d_flag_02 and d_flag_03:
jump .after_spell
jump .after_spell
menu:
"\"Open Sesame!\"" if not d_flag_01:
$ d_flag_01 = True
gen "...{w=0.8} Guess not..." ("base", xpos="far_left", ypos="head")
jump .spell
"\"Hocus Pocus!\"" if not d_flag_02:
$ d_flag_02 = True
gen "...{w=0.8} Damn..." ("base", xpos="far_left", ypos="head")
jump .spell
"\"Abracadabra!\"" if not d_flag_03:
$ d_flag_03 = True
gen "...{w=0.8} ..." ("base", xpos="far_left", ypos="head")
jump .spell
"\"Open Sesame!\"" if not d_flag_01:
$ d_flag_01 = True
gen "...{w=0.8} Guess not..." ("base", xpos="far_left", ypos="head")
jump .spell
"\"Hocus Pocus!\"" if not d_flag_02:
$ d_flag_02 = True
gen "...{w=0.8} Damn..." ("base", xpos="far_left", ypos="head")
jump .spell
"\"Abracadabra!\"" if not d_flag_03:
$ d_flag_03 = True
gen "...{w=0.8} ..." ("base", xpos="far_left", ypos="head")
jump .spell
label .after_spell:
gen "Work, you stupid scroll, or I'll throw you in the fire!" ("angry", xpos="far_left", ypos="head")

View File

@ -1168,7 +1168,7 @@ label ll_pf_masturbate_T4_E1_repeat:
lun "I never realised that the tests at Hogwarts just happened to have acronyms, that's fascinating!" ("grin", "base", "base", "mid")
gen "Yep... I'm sure some writer didn't spend hours coming up with those."
lun "*Huh*?" ("soft", "base", "raised", "mid")
gen "Anyway...{w=0.4} Now that that's established, you may begin the test.{#LINT_IGNORE}"
gen "Anyway...{w=0.4} Now that that's established, you may begin the test."
lun "Oh, alright!" ("base", "base", "base", "mid")
gen "Why don't you start off with the thought process behind the removal of your top."
lun "Oh! Oh! I know that!" ("smile", "base", "base", "stare")

View File

@ -1609,7 +1609,7 @@ label ll_pf_blowjob_T4_E4_repeat:
show screen blkfade
with d5
nar "As Luna crawls out from under your desk, you slump back into your chair, exhausted by the sheer intensity of the session."
nar "As Luna crawls out from under your desk, you slump back into your chair, exhausted by the cheer intensity of the session."
hide cg
hide screen blkfade

View File

@ -95,7 +95,6 @@ label update_lun_tier:
# T5 NOT AVAILABLE
return
# unreachable
# Requirement: Tier 4 - Blow me T4 E3
$ lun_level_up = 4
return

View File

@ -611,8 +611,8 @@ label snape_intro_E4:
sna "......................." ("snape_01")
sna "Yeah, right..." ("snape_01")
"\"I don't have a brother, Severus.\"":
sna "........................" ("snape_01")
sna "You may not have one, but the real Albus Dumbledore does." ("snape_01")
sna "........................" ("snape_01")
sna "You may not have one, but the real Albus Dumbledore does." ("snape_01")
"-Use magic to get the right answer-":
nar "You use your phenomenal cosmic powers to peek into the very fabric of the universe and get the correct answer."
gen "My little brother Aberforth? Why would I miss him?" ("base", xpos="far_left", ypos="head")
@ -640,8 +640,8 @@ label snape_intro_E4:
"\"A week or so...\"":
sna "*Hmm*.... A week, huh..." ("snape_01")
"\"Could be months...\"":
sna "That long?" ("snape_01")
sna "Now isn't that just \"perfect\"?" ("snape_01")
sna "That long?" ("snape_01")
sna "Now isn't that just \"perfect\"?" ("snape_01")
"\"I have no clue...\"":
sna "....................." ("snape_01")
sna "Splendid..." ("snape_31")

View File

@ -206,7 +206,7 @@ default ton_outfit_mechanic = DollOutfit([ton_hair_mechanic, ton_top_vest_mechan
default ton_robe_office = DollCloth("tonks", ("upper body", "robes"), "robe", "office",["#353843ff", "#fff24aff"])
default ton_top_office = DollCloth("tonks", ("upper body", "shirts"), "top", "office", ["#e7e7e7ff", "#d1cebbff"])
default ton_bottoms_office = DollCloth("tonks", ("lower body", "trousers"), "bottom", "office",["#353843ff"])
default ton_accessory_office = DollCloth("tonks", ("misc", "accessory"), "accessory", "office_pin", ["#e7e7e7ff", "#fff24aff", "#d8422cff"], zorder=235)
default ton_accessory_office = DollCloth("tonks", ("misc", "accessory"), "accessory", "office_pin", ["#e7e7e7ff", "#fff24aff", "#d8422cff"], zorder=225)
default ton_outfit_office = DollOutfit([ton_hair_base, ton_robe_office, ton_top_office, ton_bottoms_office, ton_accessory_office], price=450, name="SECS Outfit", desc="A smart suit for a clever girl.")

View File

@ -14,7 +14,7 @@ screen chibi(chibi_object):
screen chibi_emote(emote, chibi_object):
zorder chibi_object.zorder
sensitive False
add f"emo_{emote}":
add "emo_{}".format(emote):
at emote_effect
anchor (0.5, 1.0)
pos chibi_object.pos
@ -45,12 +45,12 @@ init -1 python:
def get_chibi_object(name):
"""Get a chibi object by its character's name."""
name = f"{name}_chibi"
name = "{}_chibi".format(name)
c = getattr(renpy.store, name, None)
if c and isinstance(c, Chibi):
return c
else:
raise Exception(f"Chibi object not found. {name}")
raise Exception("Chibi object not found. {}".format(name))
def complete_chibi_moves(**elapsed):
"""Resume old chibi action after (multiple) reduced move calls."""
@ -81,13 +81,13 @@ init -1 python:
Actions are defined in the `actions` dict as a tuple: (special, transform, move_action|loop_time).
* `special` (bool) specifies whether layer images should come from a folder with the same name as the action.
This can be useful to prevent repetitive code in update callbacks.
This can be useful to prevent repetitive code in update callbacks.
* `transform` (string) is the name of the transform that is used for this action.
It will be combined with a base transform.
It will be combined with a base transform.
* `move_action` (string) if set, it's the action that will be used when the chibi starts moving after the current action.
It should not be set for move actions.
It should not be set for move actions.
* `loop_time` (float) if set, it's the time in seconds for one animation loop of this action. Used to calculate movement time.
It should only be set for move actions. Set to zero to disable time adjustments.
It should only be set for move actions. Set to zero to disable time adjustments.
Layers:
A chibi is made up of one or more named layers. These are cleared on update and should be set by a callback function.
@ -95,7 +95,7 @@ init -1 python:
* A layer can be set to either a filename or any kind of displayable.
* When setting an image filename, this class will look for it in `image_path` (or `image_path/action` if the action is special).
* Adding `~` as a prefix to a filename will ignore the special action folder.
This can be useful for images that are compatible with multiple actions.
This can be useful for images that are compatible with multiple actions.
* Layers are updated whenever the action changes by calling `update_callback`, which is expected to set the layers again.
"""
@ -120,7 +120,7 @@ init -1 python:
if image_path:
self.image_path = image_path
else:
self.image_path = f"characters/{tag}/chibis"
self.image_path = "characters/{}/chibis".format(tag)
if actions:
# Override class variable for this instance
@ -138,11 +138,11 @@ init -1 python:
self.transform = None
# Define a screen for the chibi
self.screen_tag = f"{tag}_chibi"
self.screen_tag = "{}_chibi".format(tag)
renpy.define_screen(self.screen_tag, Chibi._screen, tag=self.screen_tag, zorder="chibi_object.zorder")
# Define a screen for the chibi emote
self.emote_tag = f"{tag}_chibi_emote"
self.emote_tag = "{}_chibi_emote".format(tag)
renpy.define_screen(self.emote_tag, Chibi._emote_screen, tag=self.emote_tag, zorder="chibi_object.zorder")
@staticmethod
@ -282,7 +282,7 @@ init -1 python:
# Combine with base transform
return combine_transforms(self.base_transform(), trans(*args))
elif config.developer:
raise Exception(f"Expected an ATL transform: {name}")
raise Exception("Expected a transform: {}".format(name))
# No transform was given or found
return self.base_transform()
@ -358,7 +358,7 @@ init -1 python:
room = room or renpy.store.states.room
chibi_room = ChibiRoom.rooms.get(room, None)
if not chibi_room:
raise Exception(f"Chibi room is not defined for {room}")
raise Exception("Chibi room is not defined for {}".format(room))
return chibi_room
@staticmethod

View File

@ -37,7 +37,7 @@ init 1 python:
ltype, *tails = fn.rsplit("_")
# if not ltype in types:
# print(f"Invalid layer type for file: {f}")
# print("Invalid layer type for file: {}".format(f))
# continue
zorder = types.get(ltype) or self.zorder
@ -50,7 +50,7 @@ init 1 python:
lmodifier, *tails = tails
if not lmodifier in modifiers:
print(f"Invalid modifier for file: {f}")
print("Invalid modifier for file: {}".format(f))
continue
zorder_mod = modifiers.get(lmodifier)

View File

@ -211,9 +211,11 @@ init 5 python:
self.set_pose(pose or self.walk)
# Note: Warper names and their count can change over time,
# so it's easier to just evaluate the input.
# List of available warpers:
# https://www.renpy.org/doc/html/atl.html?#warpers
warper = getattr(_warper, warper, _warper.linear)
warper = eval(f"_warper.{warper}")
distances = []
times = []

View File

@ -108,7 +108,7 @@ init python:
ltype, *tails = fn.rsplit("_")
if not ltype.isdigit() and not ltype in types:
print(f"Invalid layer type for file: {f}")
print("Invalid layer type for file: {}".format(f))
continue
zorder = z if (z := types.get(ltype)) is not None else self.zorder
@ -121,7 +121,7 @@ init python:
lmodifier, *tails = tails
if not lmodifier in modifiers:
print(f"Invalid modifier for file: {f}")
print("Invalid modifier for file: {}".format(f))
continue
zorder_mod = modifiers.get(lmodifier)
@ -319,7 +319,7 @@ init python:
# Method 4
average = (0.3333, 0.3333, 0.3333)
return Transform(img, maxsize=maxsize, matrixcolor=SepiaMatrix(c, desat=average)*OpacityMatrix(c.alpha))
except TypeError:

View File

@ -131,7 +131,7 @@ init python:
lmodifier, *tails = tails
if not lmodifier in modifiers:
print(f"Invalid modifier for file: {f}")
print("Invalid modifier for file: {}".format(f))
continue
zorder_mod = modifiers.get(lmodifier)

View File

@ -54,7 +54,7 @@ init python:
ltype, *tails = fn.rsplit("_")
if not ltype in types:
print(f"Invalid layer type for file: {f}")
print("Invalid layer type for file: {}".format(f))
continue
zorder = types.get(ltype) or face_layers.get(part)
@ -63,7 +63,7 @@ init python:
lmodifier, *tails = tails
if not lmodifier in modifiers:
print(f"Invalid modifier for file: {f}")
print("Invalid modifier for file: {}".format(f))
continue
zorder_mod = modifiers.get(lmodifier)

Some files were not shown because too many files have changed in this diff Show More