feat: player runtime for goodluke and SaintlyCorruption
CI / frontend (push) Failing after 16s
CI / backend (push) Failing after 39s

Text fields (`input`) with InputValue classes games can extend, continue/break in screen loops, Confirm,
CaptureFocus/ClearFocus/InvertSelected, generator functions and iter/next, starred tuple items,
renpy.file and json over data files loaded before the game starts, renpy.Container and
register_sl_displayable, DiamondBox layout, ConditionSwitch/DynamicImage/Animation, renpy.show(what=...),
callable transforms (`store.move_in(0.3)`), call_in_new_context as a call, im.matrix/im.Image/
MatrixColor, colorsys, fnmatch, FontGroup, persistent._clear and small renpy helpers.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
mrleo1nidandClaude Sonnet 5.5 committed 2026-10-26 17:28:14 +03:00
1 parent e66160cffa
commit e48521bdfb
12 files changed
+440 -26

No files matched your search

+32
View File
@@ -312,6 +312,38 @@ export function pythonModules(): Record<string, any> {
OrderedDict: () => new PyDict(),
},
functools: functionModules,
colorsys: {
rgb_to_hls: (r: number, g: number, b: number) => {
const max = Math.max(r, g, b), min = Math.min(r, g, b), l = (max + min) / 2, d = max - min;
if (d === 0) return [0, l, 0];
const s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
const h = max === r ? ((g - b) / d) % 6 : max === g ? (b - r) / d + 2 : (r - g) / d + 4;
return [((h / 6) % 1 + 1) % 1, l, s];
},
hls_to_rgb: (h: number, l: number, s: number) => {
if (s === 0) return [l, l, l];
const q = l < 0.5 ? l * (1 + s) : l + s - l * s, p = 2 * l - q;
const channel = (t: number) => {
t = ((t % 1) + 1) % 1;
return t < 1 / 6 ? p + (q - p) * 6 * t : t < 1 / 2 ? q : t < 2 / 3 ? p + (q - p) * (2 / 3 - t) * 6 : p;
};
return [channel(h + 1 / 3), channel(h), channel(h - 1 / 3)];
},
rgb_to_hsv: (r: number, g: number, b: number) => {
const max = Math.max(r, g, b), min = Math.min(r, g, b), d = max - min;
const h = d === 0 ? 0 : max === r ? ((g - b) / d) % 6 : max === g ? (b - r) / d + 2 : (r - g) / d + 4;
return [((h / 6) % 1 + 1) % 1, max === 0 ? 0 : d / max, max];
},
hsv_to_rgb: (h: number, s: number, v: number) => {
const i = Math.floor(h * 6), f = h * 6 - i, p = v * (1 - s), q = v * (1 - f * s), t = v * (1 - (1 - f) * s);
return [[v, q, p, p, t, v][i % 6], [t, v, v, q, p, p][i % 6], [p, p, t, v, v, q][i % 6]];
},
},
fnmatch: {
fnmatch: (name: any, pattern: any) => new RegExp("^" + String(pattern).replace(/[.+^${}()|\\]/g, "\\$&")
.replace(/\*/g, ".*").replace(/\?/g, ".") + "$", "i").test(String(name)),
},
traceback: { format_exc: () => "", print_exc: () => null },
hashlib: {
md5: (data?: any) => new Hash(md5, data),
sha256: (data?: any) => new Hash(sha256, data),