Wardrobe 2.0 - Easter egg, text tags

This commit is contained in:
LoafyLemon 2024-10-29 14:06:38 +00:00
parent 93c899cd44
commit 70ec01da8b
11 changed files with 134 additions and 19 deletions

View File

@ -55,7 +55,7 @@ label ast_reaction_touch(what):
gen "*Err*..." ("base", xpos="far_left", ypos="head") gen "*Err*..." ("base", xpos="far_left", ypos="head")
ast "When people called you eccentric I didn't think they meant bonkers mad..." ("clench", "closed", "base", "down") ast "When people called you eccentric I didn't think they meant bonkers mad..." ("clench", "closed", "base", "down")
elif what == "breasts": elif what == "breasts":
$ mouse_heart() $ mouse_boing()
random: random:
block: block:

View File

@ -89,7 +89,7 @@ label cho_reaction_touch(what):
elif what == "breasts": elif what == "breasts":
$ mouse_heart() $ mouse_boing()
if states.cho.level < 16: # Before Gryffindor match if states.cho.level < 16: # Before Gryffindor match
random: random:

View File

@ -90,7 +90,7 @@ label her_reaction_touch(what):
her "Why are you doing that?" ("clench", "base", "base", "R") her "Why are you doing that?" ("clench", "base", "base", "R")
elif what == "breasts": elif what == "breasts":
$ mouse_heart() $ mouse_boing()
if states.her.level >= 20: if states.her.level >= 20:
random: random:

View File

@ -102,7 +102,7 @@ label lun_reaction_touch(what):
elif what == "breasts": elif what == "breasts":
$ mouse_heart() $ mouse_boing()
if states.lun.tier == 5: if states.lun.tier == 5:
random: random:

View File

@ -37,11 +37,6 @@ label sus_reaction_category_fail(category):
return return
label sus_reaction_touch(what): label sus_reaction_touch(what):
if what == "head":
$ mouse_headpat()
else:
$ mouse_heart()
if what == "head": if what == "head":
$ mouse_headpat() $ mouse_headpat()
@ -51,7 +46,7 @@ label sus_reaction_touch(what):
sus @ cheeks blush "Professor, p--{w=0.2} please..." ("base", "base", "sad", "downR") sus @ cheeks blush "Professor, p--{w=0.2} please..." ("base", "base", "sad", "downR")
elif what == "breasts": elif what == "breasts":
$ mouse_heart() $ mouse_boing()
random: random:
sus @ cheeks blush "W--{w=0.2} Why are you..." ("soft", "happy", "sad", "stare") sus @ cheeks blush "W--{w=0.2} Why are you..." ("soft", "happy", "sad", "stare")

View File

@ -66,7 +66,7 @@ label ton_reaction_touch(what):
ton "Don't you dare touch my elbows next..." ("soft", "narrow", "base", "mid") ton "Don't you dare touch my elbows next..." ("soft", "narrow", "base", "mid")
elif what == "breasts": elif what == "breasts":
$ mouse_heart() $ mouse_boing()
random: random:
ton "*Mmm*..." ("base", "narrow", "base", "up") ton "*Mmm*..." ("base", "narrow", "base", "up")

View File

@ -151,6 +151,14 @@ style what_centered:
hinting "bytecode" hinting "bytecode"
size 48 size 48
style what_centered_small:
align (0.5, 0.5)
text_align 0.5
color "#fff"
outlines [(2, "#000000", 1, 1)]
hinting "bytecode"
size 24
style namebox: style namebox:
ysize 22 # Halved due to oversampling ysize 22 # Halved due to oversampling
padding (32, 0, 32, 0) padding (32, 0, 32, 0)

View File

@ -64,10 +64,11 @@ screen close_button_background(action=Return("Close"), keysym=None):
# Animation effect controller # Animation effect controller
screen gfx_effect(start_x=None, start_y=None, target_x=None, target_y=None, img=None, xanchor=0.5, yanchor=0.5, zoom=0.5, duration=1.0, timer=0.5): screen gfx_effect(start_x=None, start_y=None, target_x=None, target_y=None, img=None, xanchor=0.5, yanchor=0.5, zoom=0.5, duration=1.0, timer=0.5):
tag gfx tag gfx
layer "interface"
zorder 30 zorder 30
if target_x: if target_x:
add img xanchor xanchor yanchor yanchor zoom zoom at move_to(start_x, start_y, target_x, target_y, duration) add img xanchor xanchor yanchor yanchor zoom zoom at move_to(start_x, start_y, target_x, target_y, duration), gfx_effect_hide(timer)
else: else:
add img xanchor xanchor yanchor yanchor zoom zoom xpos start_x ypos start_y add img xanchor xanchor yanchor yanchor zoom zoom xpos start_x ypos start_y
timer timer action Hide("gfx_effect") timer timer action Hide("gfx_effect")
@ -75,3 +76,7 @@ screen gfx_effect(start_x=None, start_y=None, target_x=None, target_y=None, img=
screen ctc(): screen ctc():
zorder 30 zorder 30
add "ctc" add "ctc"
transform gfx_effect_hide(timer):
alpha 1
linear timer alpha 0

View File

@ -125,6 +125,21 @@ init python:
rv.append((kind, text)) rv.append((kind, text))
return rv return rv
@renpy.pure
def text_tag_squeeze(tag, argument, contents):
if not settings.get("kinetictext"):
return contents
rv = []
kwargs = convert_tags_to_kwargs(contents)
for kind, text in contents:
if kind == renpy.TEXT_TEXT:
d = At(Text(text, **kwargs), squeeze_text)
rv.append((renpy.TEXT_DISPLAYABLE, d))
else:
rv.append((kind, text))
return rv
@renpy.pure @renpy.pure
def text_tag_shudder(tag, argument, contents): def text_tag_shudder(tag, argument, contents):
if not settings.get("kinetictext"): if not settings.get("kinetictext"):
@ -225,6 +240,17 @@ transform pulse_text:
easein 0.25 yzoom 1.0 easein 0.25 yzoom 1.0
repeat repeat
transform squeeze_text:
animation
subpixel True
perspective True
xzoom 1.0
pos (-240, 2)
easeout 0.5 xzoom 0.5# pos (-300, 2)
easeout 0.5 xzoom 1.0# pos (-240, 2)
pause 1
repeat
transform shake_text: transform shake_text:
animation animation
subpixel True subpixel True
@ -299,6 +325,7 @@ define config.custom_text_tags = {
"shake": text_tag_shake, "shake": text_tag_shake,
"shudder": text_tag_shudder, "shudder": text_tag_shudder,
"pulse": text_tag_pulse, "pulse": text_tag_pulse,
"squeeze": text_tag_squeeze,
"flip": text_tag_flip, "flip": text_tag_flip,
"rotate": text_tag_rotate, "rotate": text_tag_rotate,
} }

View File

@ -118,20 +118,33 @@ init -1 python:
def mouse_headpat(): def mouse_headpat():
"""Causes the mouse to be moved away from current position and displays a heart effect""" """Causes the mouse to be moved away from current position and displays a heart effect"""
renpy.play('sounds/slap_03.ogg') renpy.play("sounds/slap_03.ogg")
renpy.stop_predict_screen("gfx_effect") renpy.stop_predict_screen("gfx_effect")
x, y = renpy.get_mouse_pos() x, y = renpy.get_mouse_pos()
xx, yy = x, y-15 xx, yy = x, y-15
img = At(Text("*pat*", size=16, color="#000000CC", outlines=[(1, "#FFFFFFCC", 0, 0)]), random_rotation) img = At(Text(_("{shudder}*pat*{/shudder}")), random_rotation)
renpy.hide_screen("gfx_effect") renpy.hide_screen("gfx_effect")
renpy.show_screen("gfx_effect", start_x=x, start_y=y, target_x=xx, target_y=yy, img=img, xanchor=0.5, yanchor=0.65, zoom=1.0, timer=0.35) renpy.show_screen("gfx_effect", start_x=x, start_y=y, target_x=xx, target_y=yy, img=img, xanchor=0.5, yanchor=0.65, zoom=1.0, timer=1)
def mouse_boing():
"""Causes the mouse to be moved away from current position and displays a heart effect"""
renpy.play('sounds/boing02.ogg')
renpy.stop_predict_screen("gfx_effect")
x, y = renpy.get_mouse_pos()
xx, yy = x, y-15
img = At(Text(_("{shake}*boing*{/shake}")), random_rotation)
renpy.hide_screen("gfx_effect")
renpy.show_screen("gfx_effect", start_x=x, start_y=y, target_x=xx, target_y=yy, img=img, xanchor=0.5, yanchor=0.65, zoom=1.0, timer=1)
def mouse_heart(): def mouse_heart():
"""Causes the mouse to be moved away from current position and displays a heart effect""" """Causes the mouse to be moved away from current position and displays a heart effect"""
renpy.play('sounds/kiss.ogg') renpy.play('sounds/drooling.ogg')
renpy.stop_predict_screen("gfx_effect") renpy.stop_predict_screen("gfx_effect")
x, y = renpy.get_mouse_pos() x, y = renpy.get_mouse_pos()
renpy.show_screen("gfx_effect", start_x=x, start_y=y, target_x=x, target_y=y, img="love_heart", xanchor=0.45, yanchor=0.65, zoom=0.2, timer=0.45) xx, yy = x, y-15
img = At(At(Text(_("*squelch*"), style="what_centered_small"), squeeze_hearts), random_rotation)
renpy.hide_screen("gfx_effect")
renpy.show_screen("gfx_effect", start_x=x, start_y=y, target_x=xx, target_y=yy, img=img, xanchor=0.5, yanchor=0.65, zoom=1.0, timer=1)
def wardrobe_fail_hint(value): def wardrobe_fail_hint(value):
"""Displays required whoring/friendship/affection level.""" """Displays required whoring/friendship/affection level."""
@ -171,3 +184,13 @@ init -1 python:
files.append(build_button(rp)) files.append(build_button(rp))
return files return files
transform squeeze_hearts:
animation
subpixel True
transform_anchor True
xzoom 1.0
easein 0.5 xzoom 0.65
easeout 0.5 xzoom 1.0
pause 1
repeat

View File

@ -21,6 +21,7 @@ default wardrobe.allow_opacity = False
# Functions # Functions
init python in wardrobe: init python in wardrobe:
import functools
from collections import OrderedDict from collections import OrderedDict
_last_track = None _last_track = None
@ -236,6 +237,54 @@ init python in wardrobe:
if character.is_worn(item.type): if character.is_worn(item.type):
return renpy.store.AlphaMask(renpy.store.Transform(item.icon, xysize=(48, 48)), renpy.store.Transform("wheelmenu_button_opaque", xysize=(48, 48))) return renpy.store.AlphaMask(renpy.store.Transform(item.icon, xysize=(48, 48)), renpy.store.Transform("wheelmenu_button_opaque", xysize=(48, 48)))
return renpy.store.Transform(renpy.store.AlphaMask(renpy.store.Transform(item.icon, xysize=(48, 48)), renpy.store.Transform("wheelmenu_button_opaque", xysize=(48, 48))), matrixcolor=renpy.store.SaturationMatrix(0)*renpy.store.BrightnessMatrix(-0.25)*renpy.store.OpacityMatrix(0.5)) return renpy.store.Transform(renpy.store.AlphaMask(renpy.store.Transform(item.icon, xysize=(48, 48)), renpy.store.Transform("wheelmenu_button_opaque", xysize=(48, 48))), matrixcolor=renpy.store.SaturationMatrix(0)*renpy.store.BrightnessMatrix(-0.25)*renpy.store.OpacityMatrix(0.5))
@functools.cache
def easteregg(character_name):
head_action = renpy.store.Function(wardrobe_react,"touch", "head")
breasts_action = renpy.store.Function(wardrobe_react, "touch", "breasts")
vagina_action = renpy.store.Function(wardrobe_react, "touch", "vagina")
# Positions (hardcoded)
if character_name == "tonks":
head_box = (763, 31, 882, 160)
breasts_box = (735, 232, 890, 310)
vagina_box = (765, 405, 834, 466)
elif character_name == "hermione":
head_box = (760, 14, 882, 170)
breasts_box = (735, 232, 880, 320)
vagina_box = (770, 387, 834, 440)
elif character_name == "cho":
head_box = (756, 71, 863, 193)
breasts_box = (751, 247, 856, 318)
vagina_box = (768, 405, 826, 457)
elif character_name == "luna":
head_box = (763, 31, 885, 165)
breasts_box = (740, 220, 872, 310)
vagina_box = (771, 391, 834, 444)
elif character_name == "astoria":
head_box = (757, 64, 863, 194)
breasts_box = (755, 254, 863, 318)
vagina_box = (775, 410, 824, 457)
else: # Susan + fallback
head_box = (771, 56, 871, 184)
breasts_box = (724, 230, 882, 342)
vagina_box = (770, 405, 850, 464)
head_xysize = (head_box[2] - head_box[0], head_box[3] - head_box[1])
breasts_xysize = (breasts_box[2] - breasts_box[0], breasts_box[3] - breasts_box[1])
vagina_xysize = (vagina_box[2] - vagina_box[0], vagina_box[3] - vagina_box[1])
head_pos = (head_box[0], head_box[1])
breasts_pos = (breasts_box[0], breasts_box[1])
vagina_pos = (vagina_box[0], vagina_box[1])
# Buttons
head_btn = renpy.store.Button(child=renpy.store.Null(), style="wardrobe_secret", xysize=head_xysize, action=head_action)
breasts_btn = renpy.store.Button(child=renpy.store.Null(*breasts_xysize), style="wardrobe_secret", xysize=breasts_xysize, action=breasts_action)
vagina_btn = renpy.store.Button(child=renpy.store.Null(*vagina_xysize), style="wardrobe_secret", xysize=vagina_xysize, action=vagina_action)
return [(head_btn, head_pos), (breasts_btn, breasts_pos), (vagina_btn, vagina_pos)]
# Context # Context
label wardrobe(inter_pause=True): label wardrobe(inter_pause=True):
$ disable_game_menu() $ disable_game_menu()
@ -413,7 +462,7 @@ screen wardrobe():
hbox: hbox:
xfill True xfill True
text _("Value") xalign 0 text _("Brightness") xalign 0 # HSV calls it value, but brightness is more user friendly
frame: frame:
xysize (255, 32) xysize (255, 32)
xalign 1.0 xalign 1.0
@ -487,6 +536,9 @@ screen wardrobe():
textbutton "Strip" action wardrobe.strip textbutton "Strip" action wardrobe.strip
textbutton "Return" action wardrobe.exit keysym "K_ESCAPE" textbutton "Return" action wardrobe.exit keysym "K_ESCAPE"
for i, j in wardrobe.easteregg(character.name):
add i pos j
style wardrobe_item_button is empty: style wardrobe_item_button is empty:
background Transform("wheelmenu_button", xysize=(96,96)) background Transform("wheelmenu_button", xysize=(96,96))
hover_background At(Transform("wheelmenu_button_opaque", xysize=(96,96)), wheelmenu_hover_anim) hover_background At(Transform("wheelmenu_button_opaque", xysize=(96,96)), wheelmenu_hover_anim)
@ -541,3 +593,8 @@ style wardrobe_checkbox_button:
style wardrobe_checkbox_button_text is wardrobe_button_text: style wardrobe_checkbox_button_text is wardrobe_button_text:
first_indent 24 first_indent 24
# Debug only
style wardrobe_secret:
#background "#ff000025"
background None