425 lines
14 KiB
Plaintext
425 lines
14 KiB
Plaintext
label her_chibi(action=None, xpos=None, ypos=None, flip=False, pic=None):
|
|
hide screen favor # screen tag
|
|
|
|
$ hermione_chibi.position(xpos, ypos, flip)
|
|
|
|
if action == "hide":
|
|
$ hermione_chibi.hide()
|
|
return
|
|
elif action == "leave":
|
|
hide hermione_main
|
|
hide screen bld1
|
|
hide screen blktone
|
|
play sound "sounds/door.ogg"
|
|
$ hermione_chibi.hide()
|
|
with d3
|
|
pause .5
|
|
return
|
|
|
|
elif action == "reset":
|
|
$ hermione_chibi.do(None)
|
|
return
|
|
|
|
$ hermione_chibi.do(action)
|
|
|
|
return
|
|
|
|
label her_walk(xpos=None, ypos=None, speed=1.0, action=None, reduce=False, path=None, flip=False):
|
|
scene onlayer dolls
|
|
hide screen bld1
|
|
hide screen blktone
|
|
with d3
|
|
|
|
if action == "enter":
|
|
play sound "sounds/door.ogg"
|
|
call her_chibi(None, "door", "base", flip)
|
|
with d3
|
|
if xpos or ypos:
|
|
$ hermione_chibi.move((xpos, ypos), speed, reduce)
|
|
elif action == "leave":
|
|
$ hermione_chibi.show()
|
|
$ hermione_chibi.move(("door", "base"), speed, reduce)
|
|
play sound "sounds/door.ogg"
|
|
$ hermione_chibi.hide()
|
|
with d3
|
|
pause .5
|
|
elif action == "run":
|
|
$ hermione_chibi.show()
|
|
$ hermione_chibi.move((xpos, ypos), speed, reduce, action)
|
|
elif path:
|
|
$ hermione_chibi.show()
|
|
$ hermione_chibi.move(path, speed, reduce)
|
|
else:
|
|
$ hermione_chibi.show()
|
|
$ hermione_chibi.move((xpos, ypos), speed, reduce)
|
|
|
|
return
|
|
|
|
# Chibi definition
|
|
default hermione_chibi = Chibi("hermione", ["base"], update_hermione_chibi)
|
|
|
|
#TODO Hermione's chibis need clothing layers and then update logic must be reworked to set clothing state (using chibi class best practice, see Cho chibi for example)
|
|
|
|
init python:
|
|
def update_hermione_chibi(chibi):
|
|
# Assume chibi action has a matching image definition
|
|
chibi_image = "ch_hem {}".format(chibi.action or "stand")
|
|
chibi["base"] = chibi_image
|
|
|
|
# Certain actions require more complex image selection, which is handled below
|
|
|
|
if chibi.action == "walk":
|
|
|
|
# Determine clothing state
|
|
if hermione.pose in ("hold_book",):
|
|
chibi["base"] = "ch_hem walk"
|
|
else:
|
|
if not hermione.is_worn("top") and not hermione.is_worn("bottom") and not hermione.is_worn("robe"):
|
|
chibi["base"] = "ch_hem walk_n"
|
|
elif hermione.is_worn("robe"):
|
|
if hermione.is_worn("top"):
|
|
chibi["base"] = "ch_hem walk_robe"
|
|
else:
|
|
chibi["base"] = "ch_hem walk_robe_n"
|
|
else:
|
|
chibi["base"] = "ch_hem walk"
|
|
|
|
elif not chibi.action or chibi.action == "stand":
|
|
# Determine clothing state
|
|
if hermione.pose in ("hold_book",):
|
|
chibi["base"] = "ch_hem blink"
|
|
else:
|
|
if not hermione.is_worn("top") and not hermione.is_worn("bottom") and not hermione.is_worn("robe"):
|
|
chibi["base"] = "ch_hem blink_n"
|
|
elif hermione.is_worn("robe"):
|
|
if hermione.is_worn("top"):
|
|
chibi["base"] = "ch_hem blink_robe"
|
|
else:
|
|
chibi["base"] = "ch_hem blink_robe_n"
|
|
else:
|
|
chibi["base"] = "ch_hem blink"
|
|
|
|
elif chibi.action == "dance":
|
|
# Determine clothing state
|
|
if hermione.is_worn("top"):
|
|
if hermione.get_equipped("top").id in ("top_school_1", "top_school_6"):
|
|
chibi["base"] = "clothed_dance_ani"
|
|
elif hermione.is_worn("bottom"):
|
|
chibi["base"] = "no_vest_dance_ani"
|
|
else:
|
|
chibi["base"] = "no_skirt_dance_ani"
|
|
else:
|
|
if hermione.is_worn("bottom"):
|
|
chibi["base"] = "no_shirt_dance_ani"
|
|
elif hermione.is_worn("panties"):
|
|
chibi["base"] = "no_shirt_no_skirt_dance_ani"
|
|
else:
|
|
chibi["base"] = "no_panties_dance_ani"
|
|
|
|
elif chibi.action == "dance_pause":
|
|
# Determine clothing state
|
|
if hermione.is_worn("panties"):
|
|
chibi["base"] = "no_shirt_no_skirt_dance_pause"
|
|
else:
|
|
chibi["base"] = "no_panties_dance_pause"
|
|
|
|
elif chibi.action == "top_naked":
|
|
chibi["base"] = "dance/03_no_shirt_03.webp" #TODO Should be 'stand' action without top clothes (needs layers first)
|
|
|
|
elif chibi.action == "lift_skirt":
|
|
if hermione.is_worn("panties"):
|
|
#TODO Figure out a better way to determine the expression (so it can be reused in a different event)
|
|
if not states.her.status.show_panties:
|
|
# Reluctant expression
|
|
chibi["base"] = "~/lift_skirt/panties_00.webp"
|
|
else:
|
|
# Happy expression
|
|
chibi["base"] = "~/lift_skirt/panties_01.webp"
|
|
else:
|
|
chibi["base"] = "~/lift_skirt/panties_02.webp"
|
|
|
|
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"
|
|
else:
|
|
chibi["base"] = f"ch_hem {chibi.action}"
|
|
|
|
|
|
# Sets up a chibi scene with Hermione and Genie in it
|
|
label her_chibi_scene(action="reset", xpos="mid", ypos="base", trans=None):
|
|
if trans is not None:
|
|
scene onlayer dolls
|
|
|
|
hide screen bld1
|
|
hide screen blkfade
|
|
|
|
call her_chibi("hide")
|
|
call gen_chibi("hide")
|
|
|
|
# Defaults
|
|
$ img = None
|
|
$ pos = (0,0)
|
|
$ zord = hermione_chibi.zorder
|
|
|
|
# Note: Images are inconsistent, some have the chair already in it, some don't, it's kind of stupid.
|
|
if states.room == "main_room":
|
|
$ desk_OBJ.hidden = True # Hide desk object
|
|
$ chair_left_OBJ.hidden = True # Hide left chair object
|
|
|
|
if action == "reset":
|
|
call her_chibi("stand", xpos, ypos)
|
|
call gen_chibi("sit_behind_desk")
|
|
hide screen her_chibi_scene
|
|
return
|
|
|
|
# Stand beside desk back
|
|
elif action == "behind_desk_back":
|
|
$ pos = (-77, 10)
|
|
|
|
if not hermione.is_any_worn("bottom", "top"):
|
|
$ img = "behind_desk_back_naked"
|
|
elif not hermione.is_worn("top"):
|
|
$ img = "behind_desk_back_topless"
|
|
elif not hermione.is_worn("bottom"):
|
|
$ img = "behind_desk_back_bottomless"
|
|
else:
|
|
$ img = "behind_desk_back"
|
|
|
|
# Stand beside desk front
|
|
elif action == "behind_desk_front":
|
|
$ pos = (-77, 10)
|
|
|
|
if not hermione.is_any_worn("bottom", "top"):
|
|
$ img = "behind_desk_front_naked"
|
|
elif not hermione.is_worn("top"):
|
|
$ img = "behind_desk_front_topless"
|
|
elif not hermione.is_worn("bottom"):
|
|
$ img = "behind_desk_front_bottomless"
|
|
else:
|
|
$ img = "behind_desk_front"
|
|
|
|
# Stand beside desk front lean on desk lift top
|
|
elif action == "behind_desk_front_show_tits":
|
|
$ pos = (-77, 10)
|
|
$ img = "behind_desk_front_show_tits"
|
|
|
|
# Stand beside desk lift top
|
|
elif action == "behind_desk_show_tits":
|
|
$ pos = (-77, 10)
|
|
$ img = "behind_desk_show_tits"
|
|
|
|
# Grope ass
|
|
elif action == "grope_ass_back":
|
|
$ pos = (-77, 10)
|
|
|
|
if not hermione.is_any_worn("bottom", "top"):
|
|
$ img = "grope_ass_back_naked"
|
|
elif not hermione.is_worn("top"):
|
|
$ img = "grope_ass_back_topless"
|
|
elif not hermione.is_worn("bottom"):
|
|
$ img = "grope_ass_back_bottomless"
|
|
else:
|
|
$ img = "grope_ass_back"
|
|
|
|
elif action == "grope_ass_back_fast":
|
|
$ pos = (-77, 10)
|
|
$ img = "grope_ass_back_topless_fast"
|
|
|
|
elif action == "grope_ass_front":
|
|
$ pos = (-77, 10)
|
|
|
|
if not hermione.is_any_worn("bottom", "top"):
|
|
$ img = "grope_ass_front_naked"
|
|
elif not hermione.is_worn("top"):
|
|
$ img = "grope_ass_front_topless"
|
|
elif not hermione.is_worn("bottom"):
|
|
$ img = "grope_ass_front_bottomless"
|
|
else:
|
|
$ img = "grope_ass_front"
|
|
|
|
elif action == "grope_ass_front_fast":
|
|
$ pos = (-77, 10)
|
|
$ img = "grope_ass_front_topless_fast"
|
|
|
|
# Grope tits
|
|
elif action == "grope_tits":
|
|
$ chair_left_OBJ.hidden = False # Unhide left chair object
|
|
$ pos = (-77, 10)
|
|
|
|
if hermione.is_worn("top", "bottom"):
|
|
$ img = "grope_tits"
|
|
elif hermione.is_worn("bottom"):
|
|
$ img = "grope_tits_topless"
|
|
elif hermione.is_worn("top"):
|
|
$ img = "grope_tits_bottomless"
|
|
else:
|
|
$ img = "grope_tits_naked"
|
|
|
|
elif action == "lift_top":
|
|
|
|
if hermione.is_worn("top", "bottom"):
|
|
$ img = "grope_tits_lift_top"
|
|
else:
|
|
$ img = "grope_tits_bottomless_lift_top"
|
|
|
|
elif action == "grope_tits_jerk_off":
|
|
$ chair_left_OBJ.hidden = False # Unhide left chair object
|
|
$ pos = (-77, 10)
|
|
|
|
if hermione.is_worn("top", "bottom"):
|
|
$ img = "grope_tits_jerk_off_clothed"
|
|
elif hermione.is_worn("bottom"):
|
|
$ img = "grope_tits_jerk_off_topless"
|
|
elif hermione.is_worn("top"):
|
|
$ img = "grope_tits_jerk_off_bottomless"
|
|
else:
|
|
$ img = "grope_tits_jerk_off_naked"
|
|
|
|
elif action == "grope_tits_jerk_off_lift_top":
|
|
$ chair_left_OBJ.hidden = False # Unhide left chair object
|
|
$ pos = (-77, 10)
|
|
|
|
if hermione.is_worn("top", "bottom"):
|
|
$ img = "grope_tits_jerk_off_lift_top"
|
|
elif hermione.is_worn("top"):
|
|
$ img = "grope_tits_jerk_off_bottomless_lift_top"
|
|
|
|
elif action == "grope_tits_cum":
|
|
$ chair_left_OBJ.hidden = False # Unhide left chair object
|
|
$ pos = (-77, 10)
|
|
|
|
if hermione.is_worn("top", "bottom"):
|
|
$ img = "grope_tits_cum_clothed"
|
|
elif hermione.is_worn("bottom"):
|
|
$ img = "grope_tits_cum_topless"
|
|
elif hermione.is_worn("top"):
|
|
$ img = "grope_tits_cum_bottomless"
|
|
else:
|
|
$ img = "grope_tits_cum_naked"
|
|
|
|
elif action == "grope_tits_cum_done":
|
|
$ chair_left_OBJ.hidden = False # Unhide left chair object
|
|
$ pos = (-77, 10)
|
|
|
|
if hermione.is_worn("top", "bottom"):
|
|
$ img = "grope_tits_cum_clothed_done"
|
|
elif hermione.is_worn("bottom"):
|
|
$ img = "grope_tits_cum_topless_done"
|
|
elif hermione.is_worn("top"):
|
|
$ img = "grope_tits_cum_bottomless_done"
|
|
else:
|
|
$ img = "grope_tits_cum_naked_done"
|
|
|
|
elif action == "grope_tits_cum_lift_top":
|
|
$ chair_left_OBJ.hidden = False # Unhide left chair object
|
|
$ pos = (-77, 10)
|
|
|
|
if hermione.is_worn("top", "bottom"):
|
|
$ img = "grope_tits_cum_lift_top"
|
|
else:
|
|
$ img = "grope_tits_cum_bottomless_lift_top"
|
|
|
|
elif action == "grope_tits_cum_lift_top_done":
|
|
$ chair_left_OBJ.hidden = False # Unhide left chair object
|
|
$ pos = (-77, 10)
|
|
|
|
if hermione.is_worn("top", "bottom"):
|
|
$ img = "grope_tits_cum_done"
|
|
else:
|
|
$ img = "grope_tits_cum_bottomless_lift_top_done"
|
|
|
|
# Grope on podium (Quidditch pitch)
|
|
elif action in ("grope_on_podium", "grope_on_podium_idle", "grope_on_podium_horny", "grope_on_podium_close", "grope_on_podium_cum"):
|
|
$ pos = (255, 211)
|
|
$ img = action
|
|
$ zord = 9 # Override zorder; In front of screen quidditch_stands_mid w/ podium.
|
|
|
|
# Lie on desk (admire ass)
|
|
elif action == "lie_on_desk":
|
|
$ pos = (-77, 10)
|
|
|
|
if hermione.is_worn("bottom"):
|
|
$ img = "lie_on_desk"
|
|
else:
|
|
$ img = "lie_on_desk_naked"
|
|
|
|
elif action == "lie_on_desk_fingering":
|
|
$ pos = (-77, 10)
|
|
$ img = "finger_naked"
|
|
|
|
elif action == "lie_on_desk_fingering_slow":
|
|
$ pos = (-77, 10)
|
|
$ img = "finger_naked_slow"
|
|
|
|
elif action == "lie_on_desk_fingering_pause":
|
|
$ pos = (-77, 10)
|
|
$ img = "finger_naked_pause"
|
|
|
|
elif action == "lie_on_desk_fingering_pause_ahegao":
|
|
$ pos = (-77, 10)
|
|
$ img = "finger_naked_pause_ahegao"
|
|
|
|
elif action == "lie_on_desk_fingering_cumming":
|
|
$ pos = (-77, 10)
|
|
$ img = "finger_naked_cumming"
|
|
|
|
elif action == "lie_on_desk_jerk_off":
|
|
$ pos = (-77, 10)
|
|
|
|
if hermione.is_worn("bottom"):
|
|
$ img = "lie_on_desk_jerk_off"
|
|
else:
|
|
$ img = "lie_on_desk_naked_jerk_off"
|
|
|
|
elif action == "lie_on_desk_cum":
|
|
$ pos = (-77, 10)
|
|
|
|
if hermione.is_worn("bottom"):
|
|
$ img = "lie_on_desk_cum"
|
|
else:
|
|
$ img = "lie_on_desk_naked_cum"
|
|
|
|
# Handjob
|
|
elif action in ("hj", "hj_pause", "hj_cum_in", "hj_cum_in_done", "hj_cum_on", "hj_cum_on_done", "hj_kiss", "hj_kiss_cum"):
|
|
$ desk_OBJ.hidden = False # Unhide desk object
|
|
$ chair_left_OBJ.hidden = False # Unhide left chair object
|
|
$ pos = (230, 0)
|
|
$ img = action
|
|
|
|
# Titjob
|
|
elif action in ("tj", "tj_pause", "tj_idle", "tj_cum_on", "tj_cum_on_done", "tj_mouth", "tj_cum_in", "tj_cum_in_done"):
|
|
$ desk_OBJ.hidden = False # Unhide desk object
|
|
$ chair_left_OBJ.hidden = False # Unhide left chair object
|
|
$ pos = (450, 200)
|
|
$ img = action
|
|
|
|
# Blowjob
|
|
elif action in ("bj", "bj_pause", "bj_cum_in", "bj_cum_out", "bj_cum_out_done"):
|
|
$ chair_left_OBJ.hidden = False # Unhide left chair object
|
|
$ pos = (-7, 14)
|
|
$ img = action
|
|
|
|
# Sex
|
|
elif action in (
|
|
"sex_hotdog", "sex", "sex_pause", "sex_slow", "sex_fast",
|
|
"sex_cum_out", "sex_cum_out_done", "sex_cum_in", "sex_cum_in_done",
|
|
"sex_naked", "sex_naked_pause", "sex_naked_slow", "sex_naked_fast",
|
|
"sex_naked_cum_out", "sex_naked_cum_out_done", "sex_naked_cum_in", "sex_naked_cum_in_done"
|
|
):
|
|
$ chair_left_OBJ.hidden = False # Unhide left chair object
|
|
$ pos = (-77, 10)
|
|
$ img = action
|
|
|
|
show screen her_chibi_scene(img, pos, zord)
|
|
|
|
if trans:
|
|
with trans
|
|
|
|
return
|
|
|
|
screen her_chibi_scene(img, pos, zord):
|
|
tag hermione_chibi
|
|
zorder zord
|
|
|
|
add img pos pos
|