Compare commits

...

13 Commits
gouv-5 ... main

Author SHA1 Message Date
LoafyLemon 8b127a25b4 Merge branch 'refs/heads/dev' 2024-04-08 15:53:40 +01:00
LoafyLemon e295fbb791 PixelateMask Shader 2024-04-08 15:48:23 +01:00
LoafyLemon 5c4ce667a5 Replace unneccesary eval 2024-04-03 12:38:48 +01:00
LoafyLemon 0dc071261b Unlock Luna's favours in developer skip 2024-04-02 16:31:14 +01:00
LoafyLemon 61da56b6c8 Partially revert #7ca17b7 (Breaks dev debug) 2024-04-02 16:21:13 +01:00
LoafyLemon 9aff807593 Bug fixes
* Fixed inconsistent spacing
* Fixed inconsistent state var access
2024-04-02 16:18:18 +01:00
LoafyLemon 908beae5d3 Maintain access convention within save compat 2024-04-02 14:19:59 +01:00
Gouvernathor d8751d73b9 Remove nonsense calls of getattr
(cherry picked from commit 7ca17b7ba7)
2024-04-02 13:53:55 +01:00
Gouvernathor 224194754f Avoid using unnecessary screens 2024-04-02 13:44:04 +01:00
Gouvernathor e3c5fb609d Avoid python statement
(cherry picked from commit 22348f0901)
2024-04-02 13:41:44 +01:00
Gouvernathor e04fd221dd Flag unreachable code
(cherry picked from commit 25820e002a)
2024-04-02 13:37:20 +01:00
Gouvernathor ef97c273db Linting dynamic
(cherry picked from commit 60244e258a)
2024-04-02 13:36:59 +01:00
LoafyLemon 01126edc4e Update README 2023-08-02 22:00:18 +01:00
17 changed files with 164 additions and 85 deletions

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

View File

@ -1,5 +1,14 @@
python early hide:
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"})
def register_decorator(cls):
"""
@ -54,6 +63,12 @@ python early hide:
evaled = {n: eval(e) for n, e in self.items()}
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
class chibi:
@staticmethod

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

@ -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

@ -95,6 +95,7 @@ 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

@ -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.
"""

View File

@ -211,11 +211,9 @@ 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 = eval(f"_warper.{warper}")
warper = getattr(_warper, warper, _warper.linear)
distances = []
times = []

View File

@ -145,6 +145,7 @@ label day_start:
# Start Quests
jump quests
# unreachable
$ renpy.choice_for_skipping()
call screen room_menu
@ -239,6 +240,7 @@ label night_start:
# Start Quests
jump quests
# unreachable
$ renpy.choice_for_skipping()
call screen room_menu

View File

@ -348,7 +348,7 @@ label ball_ending_E1:
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
{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}"

View File

@ -142,18 +142,24 @@ label teleport(position=None,effect=True,poof_label=None):
with d1
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
#stop music fadeout 1
hide screen heal_animation
hide heal_animation onlayer screens
if poof_label is not None:
$ renpy.call(poof_label)
show screen teleport_animation
call expression poof_label
show teleport_ani onlayer screens zorder teleport_zorder:
anchor (0.5, 0.7)
pos teleport_pos
zoom 0.5
with d5
hide screen teleport_animation
hide teleport_animation onlayer screens
with d5
if effect == True:
@ -161,17 +167,9 @@ label teleport(position=None,effect=True,poof_label=None):
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.
default hermione_action = None
label set_her_action(action=None, update=None):
$ hermione_action = action
return
return

View File

@ -2,7 +2,7 @@ init python:
class Parcel(object):
"""
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.
label - Call label called after the parcel was opened.
func - A setup function called before the parcel contents is being shown to the player.

View File

@ -3,7 +3,7 @@ init -999:
import json
import os
if not getattr(persistent, "mods_enabled"):
if not persistent.mods_enabled:
persistent.mods_enabled = _set()
mods_list = _dict()

View File

@ -75,12 +75,20 @@ label start_dev:
states.cho.ev.intro.e1_complete = True
states.cho.ev.intro.e2_complete = True
states.cho.ev.intro.e4_complete = True
states.sna.ev.hangouts.cho_e1 = True
states.paperwork_unlocked = True
store.states.lun.ev.intro.e1_complete = True
store.states.lun.ev.intro.e2_complete = True
states.lun.ev.intro.e1_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:
i.unlocked = True

View File

@ -34,6 +34,63 @@ init python:
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):
mesh True
shader "color_temperature_shader"

View File

@ -297,7 +297,7 @@ init -100 python:
for slot in cls.__dict__.get("__slots__", ()):
if slot.startswith("__") and not slot.endswith("__"):
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):
rv = object.__reduce_ex__(self, 2)[2]

File diff suppressed because it is too large Load Diff