Compare commits
13 Commits
Author | SHA1 | Date | |
---|---|---|---|
8b127a25b4 | |||
e295fbb791 | |||
5c4ce667a5 | |||
0dc071261b | |||
61da56b6c8 | |||
9aff807593 | |||
908beae5d3 | |||
d8751d73b9 | |||
224194754f | |||
e3c5fb609d | |||
e04fd221dd | |||
ef97c273db | |||
01126edc4e |
@ -273,10 +273,10 @@ image ch_gen dick_out:
|
|||||||
"characters/genie/chibis/jerk_off/dick_out.webp"
|
"characters/genie/chibis/jerk_off/dick_out.webp"
|
||||||
|
|
||||||
image ch_gen dick_out_normal:
|
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:
|
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
|
# Masturbating while standing
|
||||||
#TODO Genie's standing jerk off chibis don't stand level with the others. Fix this and check/correct relevant events
|
#TODO Genie's standing jerk off chibis don't stand level with the others. Fix this and check/correct relevant events
|
||||||
|
@ -1,5 +1,14 @@
|
|||||||
python early hide:
|
python early hide:
|
||||||
import inspect
|
import inspect
|
||||||
|
|
||||||
|
try:
|
||||||
|
from renpy.lint import python_builtins, renpy_builtins
|
||||||
|
except ImportError:
|
||||||
|
import builtins
|
||||||
|
python_builtins = set(dir(builtins))
|
||||||
|
del builtins
|
||||||
|
renpy_builtins = set()
|
||||||
|
|
||||||
__register_params = frozenset(inspect.signature(renpy.register_statement).parameters).difference({"name", "parse"})
|
__register_params = frozenset(inspect.signature(renpy.register_statement).parameters).difference({"name", "parse"})
|
||||||
def register_decorator(cls):
|
def register_decorator(cls):
|
||||||
"""
|
"""
|
||||||
@ -54,6 +63,12 @@ python early hide:
|
|||||||
evaled = {n: eval(e) for n, e in self.items()}
|
evaled = {n: eval(e) for n, e in self.items()}
|
||||||
renpy.dynamic(**evaled)
|
renpy.dynamic(**evaled)
|
||||||
|
|
||||||
|
def lint(self):
|
||||||
|
for domain, st in (("Python", python_builtins), ("Ren'Py", renpy_builtins)):
|
||||||
|
inter = st.intersection(self)
|
||||||
|
if inter:
|
||||||
|
renpy.error(f"Dynamic statement redefines one or several {domain} builtins: {', '.join(map(repr, inter))}")
|
||||||
|
|
||||||
@register_decorator
|
@register_decorator
|
||||||
class chibi:
|
class chibi:
|
||||||
@staticmethod
|
@staticmethod
|
||||||
|
@ -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")
|
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"):
|
if cho.is_worn("bottom"):
|
||||||
play sound "sounds/cloth_sound3.ogg"
|
play sound "sounds/cloth_sound3.ogg"
|
||||||
hide cho_main
|
hide cho_main
|
||||||
|
@ -13,20 +13,20 @@ label tentacle_scene_intro:
|
|||||||
$ d_flag_03 = False
|
$ d_flag_03 = False
|
||||||
label .spell:
|
label .spell:
|
||||||
if d_flag_01 and d_flag_02 and d_flag_03:
|
if d_flag_01 and d_flag_02 and d_flag_03:
|
||||||
jump .after_spell
|
jump .after_spell
|
||||||
menu:
|
menu:
|
||||||
"\"Open Sesame!\"" if not d_flag_01:
|
"\"Open Sesame!\"" if not d_flag_01:
|
||||||
$ d_flag_01 = True
|
$ d_flag_01 = True
|
||||||
gen "...{w=0.8} Guess not..." ("base", xpos="far_left", ypos="head")
|
gen "...{w=0.8} Guess not..." ("base", xpos="far_left", ypos="head")
|
||||||
jump .spell
|
jump .spell
|
||||||
"\"Hocus Pocus!\"" if not d_flag_02:
|
"\"Hocus Pocus!\"" if not d_flag_02:
|
||||||
$ d_flag_02 = True
|
$ d_flag_02 = True
|
||||||
gen "...{w=0.8} Damn..." ("base", xpos="far_left", ypos="head")
|
gen "...{w=0.8} Damn..." ("base", xpos="far_left", ypos="head")
|
||||||
jump .spell
|
jump .spell
|
||||||
"\"Abracadabra!\"" if not d_flag_03:
|
"\"Abracadabra!\"" if not d_flag_03:
|
||||||
$ d_flag_03 = True
|
$ d_flag_03 = True
|
||||||
gen "...{w=0.8} ..." ("base", xpos="far_left", ypos="head")
|
gen "...{w=0.8} ..." ("base", xpos="far_left", ypos="head")
|
||||||
jump .spell
|
jump .spell
|
||||||
|
|
||||||
label .after_spell:
|
label .after_spell:
|
||||||
gen "Work, you stupid scroll, or I'll throw you in the fire!" ("angry", xpos="far_left", ypos="head")
|
gen "Work, you stupid scroll, or I'll throw you in the fire!" ("angry", xpos="far_left", ypos="head")
|
||||||
|
@ -95,6 +95,7 @@ label update_lun_tier:
|
|||||||
# T5 NOT AVAILABLE
|
# T5 NOT AVAILABLE
|
||||||
return
|
return
|
||||||
|
|
||||||
|
# unreachable
|
||||||
# Requirement: Tier 4 - Blow me T4 E3
|
# Requirement: Tier 4 - Blow me T4 E3
|
||||||
$ lun_level_up = 4
|
$ lun_level_up = 4
|
||||||
return
|
return
|
||||||
|
@ -611,8 +611,8 @@ label snape_intro_E4:
|
|||||||
sna "......................." ("snape_01")
|
sna "......................." ("snape_01")
|
||||||
sna "Yeah, right..." ("snape_01")
|
sna "Yeah, right..." ("snape_01")
|
||||||
"\"I don't have a brother, Severus.\"":
|
"\"I don't have a brother, Severus.\"":
|
||||||
sna "........................" ("snape_01")
|
sna "........................" ("snape_01")
|
||||||
sna "You may not have one, but the real Albus Dumbledore does." ("snape_01")
|
sna "You may not have one, but the real Albus Dumbledore does." ("snape_01")
|
||||||
"-Use magic to get the right answer-":
|
"-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."
|
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")
|
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...\"":
|
"\"A week or so...\"":
|
||||||
sna "*Hmm*.... A week, huh..." ("snape_01")
|
sna "*Hmm*.... A week, huh..." ("snape_01")
|
||||||
"\"Could be months...\"":
|
"\"Could be months...\"":
|
||||||
sna "That long?" ("snape_01")
|
sna "That long?" ("snape_01")
|
||||||
sna "Now isn't that just \"perfect\"?" ("snape_01")
|
sna "Now isn't that just \"perfect\"?" ("snape_01")
|
||||||
"\"I have no clue...\"":
|
"\"I have no clue...\"":
|
||||||
sna "....................." ("snape_01")
|
sna "....................." ("snape_01")
|
||||||
sna "Splendid..." ("snape_31")
|
sna "Splendid..." ("snape_31")
|
||||||
|
@ -81,13 +81,13 @@ init -1 python:
|
|||||||
|
|
||||||
Actions are defined in the `actions` dict as a tuple: (special, transform, move_action|loop_time).
|
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.
|
* `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.
|
* `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.
|
* `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.
|
* `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:
|
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.
|
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.
|
* 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).
|
* 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.
|
* 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.
|
* Layers are updated whenever the action changes by calling `update_callback`, which is expected to set the layers again.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
@ -211,11 +211,9 @@ init 5 python:
|
|||||||
|
|
||||||
self.set_pose(pose or self.walk)
|
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:
|
# List of available warpers:
|
||||||
# https://www.renpy.org/doc/html/atl.html?#warpers
|
# https://www.renpy.org/doc/html/atl.html?#warpers
|
||||||
warper = eval(f"_warper.{warper}")
|
warper = getattr(_warper, warper, _warper.linear)
|
||||||
|
|
||||||
distances = []
|
distances = []
|
||||||
times = []
|
times = []
|
||||||
|
@ -145,6 +145,7 @@ label day_start:
|
|||||||
# Start Quests
|
# Start Quests
|
||||||
jump quests
|
jump quests
|
||||||
|
|
||||||
|
# unreachable
|
||||||
$ renpy.choice_for_skipping()
|
$ renpy.choice_for_skipping()
|
||||||
|
|
||||||
call screen room_menu
|
call screen room_menu
|
||||||
@ -239,6 +240,7 @@ label night_start:
|
|||||||
# Start Quests
|
# Start Quests
|
||||||
jump quests
|
jump quests
|
||||||
|
|
||||||
|
# unreachable
|
||||||
$ renpy.choice_for_skipping()
|
$ renpy.choice_for_skipping()
|
||||||
|
|
||||||
call screen room_menu
|
call screen room_menu
|
||||||
|
@ -348,7 +348,7 @@ label ball_ending_E1:
|
|||||||
play music "music/Plaint.ogg" fadein 1 fadeout 1 #SAD CREDITS MUSIC. if_changed
|
play music "music/Plaint.ogg" fadein 1 fadeout 1 #SAD CREDITS MUSIC. if_changed
|
||||||
|
|
||||||
centered """{size=+7}{color=#cbcbcb}Congratulations on completing the game!{/color}{/size}\n\n
|
centered """{size=+7}{color=#cbcbcb}Congratulations on completing the game!{/color}{/size}\n\n
|
||||||
{size=+5}{color=#cbcbcb}This is ending \"00\" out of \"02\".{/color}{/size}{#LINT_IGNORE}"""
|
{size=+5}{color=#cbcbcb}This is ending \"00\" out of \"02\".{/color}{/size}{#LINT_IGNORE}"""
|
||||||
|
|
||||||
centered "{size=+7}{color=#cbcbcb}Thank you for playing!{/color}{/size}\n\n{#LINT_IGNORE}"
|
centered "{size=+7}{color=#cbcbcb}Thank you for playing!{/color}{/size}\n\n{#LINT_IGNORE}"
|
||||||
|
|
||||||
|
@ -142,18 +142,24 @@ label teleport(position=None,effect=True,poof_label=None):
|
|||||||
with d1
|
with d1
|
||||||
|
|
||||||
hide screen blkfade
|
hide screen blkfade
|
||||||
show screen heal_animation
|
show heal_ani onlayer screens zorder teleport_zorder:
|
||||||
|
anchor (0.5, 1.0)
|
||||||
|
pos teleport_pos
|
||||||
|
zoom 0.5
|
||||||
with d3
|
with d3
|
||||||
|
|
||||||
#stop music fadeout 1
|
#stop music fadeout 1
|
||||||
|
|
||||||
hide screen heal_animation
|
hide heal_animation onlayer screens
|
||||||
if poof_label is not None:
|
if poof_label is not None:
|
||||||
$ renpy.call(poof_label)
|
call expression poof_label
|
||||||
show screen teleport_animation
|
show teleport_ani onlayer screens zorder teleport_zorder:
|
||||||
|
anchor (0.5, 0.7)
|
||||||
|
pos teleport_pos
|
||||||
|
zoom 0.5
|
||||||
with d5
|
with d5
|
||||||
|
|
||||||
hide screen teleport_animation
|
hide teleport_animation onlayer screens
|
||||||
with d5
|
with d5
|
||||||
|
|
||||||
if effect == True:
|
if effect == True:
|
||||||
@ -161,14 +167,6 @@ label teleport(position=None,effect=True,poof_label=None):
|
|||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
screen teleport_animation():
|
|
||||||
add "teleport_ani" anchor (0.5, 0.7) xpos teleport_xpos ypos teleport_ypos zoom 0.5
|
|
||||||
zorder teleport_zorder
|
|
||||||
|
|
||||||
screen heal_animation():
|
|
||||||
add "heal_ani" anchor (0.5, 1.0) xpos teleport_xpos ypos teleport_ypos zoom 0.5
|
|
||||||
zorder teleport_zorder
|
|
||||||
|
|
||||||
# Dummy labels. To prevent crashes. # TODO: Remove later.
|
# Dummy labels. To prevent crashes. # TODO: Remove later.
|
||||||
default hermione_action = None
|
default hermione_action = None
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@ init python:
|
|||||||
class Parcel(object):
|
class Parcel(object):
|
||||||
"""
|
"""
|
||||||
contents - Contents of the parcel, has to be a list of tuples
|
contents - Contents of the parcel, has to be a list of tuples
|
||||||
containing an item object and integer quantity [ (lollipop_ITEM, 5) ].
|
containing an item object and integer quantity [ (lollipop_ITEM, 5) ].
|
||||||
wait - Wait time required for the item to be delivered.
|
wait - Wait time required for the item to be delivered.
|
||||||
label - Call label called after the parcel was opened.
|
label - Call label called after the parcel was opened.
|
||||||
func - A setup function called before the parcel contents is being shown to the player.
|
func - A setup function called before the parcel contents is being shown to the player.
|
||||||
|
@ -3,7 +3,7 @@ init -999:
|
|||||||
import json
|
import json
|
||||||
import os
|
import os
|
||||||
|
|
||||||
if not getattr(persistent, "mods_enabled"):
|
if not persistent.mods_enabled:
|
||||||
persistent.mods_enabled = _set()
|
persistent.mods_enabled = _set()
|
||||||
|
|
||||||
mods_list = _dict()
|
mods_list = _dict()
|
||||||
|
@ -75,12 +75,20 @@ label start_dev:
|
|||||||
states.cho.ev.intro.e1_complete = True
|
states.cho.ev.intro.e1_complete = True
|
||||||
states.cho.ev.intro.e2_complete = True
|
states.cho.ev.intro.e2_complete = True
|
||||||
states.cho.ev.intro.e4_complete = True
|
states.cho.ev.intro.e4_complete = True
|
||||||
|
|
||||||
states.sna.ev.hangouts.cho_e1 = True
|
states.sna.ev.hangouts.cho_e1 = True
|
||||||
|
|
||||||
states.paperwork_unlocked = True
|
states.paperwork_unlocked = True
|
||||||
|
|
||||||
store.states.lun.ev.intro.e1_complete = True
|
states.lun.ev.intro.e1_complete = True
|
||||||
store.states.lun.ev.intro.e2_complete = True
|
states.lun.ev.intro.e2_complete = True
|
||||||
|
states.lun.ev.quibbler.stocked = True
|
||||||
|
thequibbler_ITEM.used = True
|
||||||
|
states.lun.ev.spectrespecs.e1_complete = True
|
||||||
|
states.lun.ev.spectrespecs.e2_complete = True
|
||||||
|
states.lun.ev.spectrespecs.e3_complete = True
|
||||||
|
states.lun.ev.spectrespecs.e4_complete = True
|
||||||
|
states.lun.favors_unlocked = True
|
||||||
|
|
||||||
for i in mirror.items:
|
for i in mirror.items:
|
||||||
i.unlocked = True
|
i.unlocked = True
|
||||||
|
@ -34,6 +34,63 @@ init python:
|
|||||||
gl_FragColor = vec4(mix(gl_FragColor.xyz, gl_FragColor.xyz * ctemp2rgb(ctemp), u_strength), 1.0);
|
gl_FragColor = vec4(mix(gl_FragColor.xyz, gl_FragColor.xyz * ctemp2rgb(ctemp), u_strength), 1.0);
|
||||||
""")
|
""")
|
||||||
|
|
||||||
|
renpy.register_shader("pixelatemaskshader", variables="""
|
||||||
|
uniform sampler2D tex0;
|
||||||
|
uniform sampler2D tex1;
|
||||||
|
uniform vec2 res0;
|
||||||
|
uniform float u_step;
|
||||||
|
uniform float u_lod_bias;
|
||||||
|
attribute vec2 a_tex_coord;
|
||||||
|
varying vec2 v_tex_coord;
|
||||||
|
""", vertex_600="""
|
||||||
|
v_tex_coord = a_tex_coord;
|
||||||
|
""", fragment_functions="""
|
||||||
|
vec2 CalculateNewUV(vec2 uv, vec2 size, float step) {
|
||||||
|
float dx = (step / size.x);
|
||||||
|
float dy = (step / size.y);
|
||||||
|
return vec2(dx*(floor(uv.x/dx) + 0.5), dy*(floor(uv.y/dy) + 0.5));
|
||||||
|
}
|
||||||
|
|
||||||
|
vec4 PixelateMask(sampler2D source, float alpha, vec2 size, vec2 uv, float step, float lod) {
|
||||||
|
if (alpha > 0.0) {
|
||||||
|
vec2 new_uv = CalculateNewUV(uv, size, step);
|
||||||
|
vec4 old = vec4(texture2D(source, uv, lod).rgb, 1.0);
|
||||||
|
vec4 new = vec4(texture2D(source, new_uv, lod).rgb, 1.0);
|
||||||
|
return mix(old, new, alpha);
|
||||||
|
}
|
||||||
|
|
||||||
|
return texture2D(source, uv, lod);
|
||||||
|
}
|
||||||
|
""", fragment_600="""
|
||||||
|
float alpha = texture2D(tex1, v_tex_coord).a;
|
||||||
|
gl_FragColor = PixelateMask(tex0, alpha, res0, v_tex_coord, u_step, u_lod_bias);
|
||||||
|
""")
|
||||||
|
|
||||||
|
class PixelateMask(renpy.Displayable, NoRollback):
|
||||||
|
def __init__(self, child, mask, step=1.0, **kwargs):
|
||||||
|
super().__init__(**kwargs)
|
||||||
|
self.child = renpy.displayable(child)
|
||||||
|
self.mask = renpy.displayable(mask)
|
||||||
|
self.step = step
|
||||||
|
|
||||||
|
def render(self, width, height, st, at):
|
||||||
|
child = renpy.display.render.render(self.child, width, height, st, at)
|
||||||
|
mask = renpy.display.render.render(self.mask, width, height, st, at)
|
||||||
|
|
||||||
|
rv = renpy.display.render.Render(width, height)
|
||||||
|
|
||||||
|
if renpy.display.render.models:
|
||||||
|
|
||||||
|
rv.mesh = True
|
||||||
|
rv.add_shader("pixelatemaskshader")
|
||||||
|
rv.add_uniform("u_step", self.step)
|
||||||
|
|
||||||
|
rv.blit(child, (0, 0))
|
||||||
|
rv.blit(mask, (0, 0))
|
||||||
|
|
||||||
|
renpy.redraw(self, 0)
|
||||||
|
return rv
|
||||||
|
|
||||||
transform color_temperature(factor=1.0, strength=1.0):
|
transform color_temperature(factor=1.0, strength=1.0):
|
||||||
mesh True
|
mesh True
|
||||||
shader "color_temperature_shader"
|
shader "color_temperature_shader"
|
||||||
|
@ -297,7 +297,7 @@ init -100 python:
|
|||||||
for slot in cls.__dict__.get("__slots__", ()):
|
for slot in cls.__dict__.get("__slots__", ()):
|
||||||
if slot.startswith("__") and not slot.endswith("__"):
|
if slot.startswith("__") and not slot.endswith("__"):
|
||||||
raise ValueError("slotted_object __slots__ can not be mangled. "
|
raise ValueError("slotted_object __slots__ can not be mangled. "
|
||||||
"If you need it, mangle it by yourself.")
|
"If you need it, mangle it by yourself.")
|
||||||
|
|
||||||
def _clean(self):
|
def _clean(self):
|
||||||
rv = object.__reduce_ex__(self, 2)[2]
|
rv = object.__reduce_ex__(self, 2)[2]
|
||||||
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user