Compare commits

..

1 Commits

Author SHA1 Message Date
Andy_kl 48d19bb038 Implement 'add image' screen language statement. 2024-09-07 00:25:17 +04:00
544 changed files with 8142 additions and 10966 deletions
+1 -41
View File
@@ -13,6 +13,7 @@ ehthumbs_vista.db
# Python related files.
*.pyc
*.pyo
*.pyi
*.egg-info
# Editor/tool files.
@@ -133,44 +134,3 @@ CubismSdkForNative-4-*.zip
/cg
/.vscode/launch.json
/.vscode/tasks.json
# Pyi Files (generated by scripts/generate_pyi.py)
renpy/audio/filter.pyi
renpy/audio/renpysound.pyi
renpy/display/accelerator.pyi
renpy/display/matrix.pyi
renpy/display/quaternion.pyi
renpy/display/render.pyi
renpy/encryption.pyi
renpy/gl2/gl2draw.pyi
renpy/gl2/gl2mesh.pyi
renpy/gl2/gl2mesh2.pyi
renpy/gl2/gl2mesh3.pyi
renpy/gl2/gl2model.pyi
renpy/gl2/gl2polygon.pyi
renpy/gl2/gl2shader.pyi
renpy/gl2/gl2texture.pyi
renpy/gl2/live2dmodel.pyi
renpy/lexersupport.pyi
renpy/pydict.pyi
renpy/style.pyi
renpy/style.pyi
renpy/styledata/style_activate_functions.pyi
renpy/styledata/style_functions.pyi
renpy/styledata/style_hover_functions.pyi
renpy/styledata/style_idle_functions.pyi
renpy/styledata/style_insensitive_functions.pyi
renpy/styledata/style_selected_activate_functions.pyi
renpy/styledata/style_selected_functions.pyi
renpy/styledata/style_selected_hover_functions.pyi
renpy/styledata/style_selected_idle_functions.pyi
renpy/styledata/style_selected_insensitive_functions.pyi
renpy/styledata/styleclass.pyi
renpy/styledata/stylesets.pyi
renpy/text/ftfont.pyi
renpy/text/hbfont.pyi
renpy/text/textsupport.pyi
renpy/text/texwrap.pyi
renpy/uguu/gl.pyi
renpy/uguu/uguu.pyi
+16 -51
View File
@@ -1,22 +1,23 @@
{
"files.watcherExclude": {
"**/renpy/0old/**": true,
"**/renpy/atom/**": true,
"**/renpy/cubism/**": true,
"**/renpy/dists/**": true,
"**/renpy/dl/**": true,
"**/renpy/doc/**": true,
"**/renpy/doc-web/**": true,
"**/renpy/jedit/**": true,
"**/renpy/renpy*.app/**": true,
"**/renpy/tmp/**": true,
"**/renpy/web/**": true
"**/renpy/0old/**" : true,
"**/renpy/atom/**" : true,
"**/renpy/cubism/**" : true,
"**/renpy/dists/**" : true,
"**/renpy/dl/**" : true,
"**/renpy/doc/**" : true,
"**/renpy/doc-web/**" : true,
"**/renpy/jedit/**" : true,
"**/renpy/renpy*.app/**" : true,
"**/renpy/tmp/**" : true,
"**/renpy/web/**" : true,
},
"files.exclude": {
"0old": true,
"**-dists": true,
"**/*.pyc": true,
"**/*.pyo": true,
"renpy/**/*.pyi": true,
"**/*.rpmc": true,
"**/*.rpyc": true,
"**/__pycache__": true,
@@ -41,45 +42,9 @@
"web3": true,
"**/*.rpa": true,
"**/*.rpymc": true,
"**/cache/": true,
"renpy/audio/filter.pyi": true,
"renpy/audio/renpysound.pyi": true,
"renpy/display/accelerator.pyi": true,
"renpy/display/matrix.pyi": true,
"renpy/display/quaternion.pyi": true,
"renpy/display/render.pyi": true,
"renpy/encryption.pyi": true,
"renpy/gl2/gl2draw.pyi": true,
"renpy/gl2/gl2mesh.pyi": true,
"renpy/gl2/gl2mesh2.pyi": true,
"renpy/gl2/gl2mesh3.pyi": true,
"renpy/gl2/gl2model.pyi": true,
"renpy/gl2/gl2polygon.pyi": true,
"renpy/gl2/gl2shader.pyi": true,
"renpy/gl2/gl2texture.pyi": true,
"renpy/gl2/live2dmodel.pyi": true,
"renpy/lexersupport.pyi": true,
"renpy/pydict.pyi": true,
"renpy/style.pyi": true,
"renpy/styledata/style_activate_functions.pyi": true,
"renpy/styledata/style_functions.pyi": true,
"renpy/styledata/style_hover_functions.pyi": true,
"renpy/styledata/style_idle_functions.pyi": true,
"renpy/styledata/style_insensitive_functions.pyi": true,
"renpy/styledata/style_selected_activate_functions.pyi": true,
"renpy/styledata/style_selected_functions.pyi": true,
"renpy/styledata/style_selected_hover_functions.pyi": true,
"renpy/styledata/style_selected_idle_functions.pyi": true,
"renpy/styledata/style_selected_insensitive_functions.pyi": true,
"renpy/styledata/styleclass.pyi": true,
"renpy/styledata/stylesets.pyi": true,
"renpy/text/ftfont.pyi": true,
"renpy/text/hbfont.pyi": true,
"renpy/text/textsupport.pyi": true,
"renpy/text/texwrap.pyi": true,
"renpy/uguu/gl.pyi": true,
"renpy/uguu/uguu.pyi": true
"**/cache/": true
},
"python.languageServer": "Pylance",
"python.analysis.typeCheckingMode": "basic",
"python.analysis.diagnosticMode": "workspace",
@@ -280,5 +245,5 @@
}
}
]
}
}
},
}
+18 -43
View File
@@ -4,29 +4,8 @@ The Ren'Py Visual Novel Engine
https://www.renpy.org
Branches
========
The following branches are the most interesting.
``fix``
The fix branch is used for fixes to the current version of Ren'Py that do
not require dangerous changes. The fix branch is also the source of the
documentation on https://www.renpy.org/. This branch is automatically
merged into master on a regular basis.
Pull requests that contain fixes or documentation improvements should be
made to the fix branch. When a release is made, the master branch is
copied to the fix branch.
``master``
The master branch is where the main focus of development is. This branch
will eventually become the next release of Ren'Py.
Pull requests that contain new features, that require incompatible changes,
or major changes to Ren'Py's internals should be targeted at the master
branch.
Ren'Py development takes place on the ``master`` branch, and occasionally
on feature branches.
Getting Started
@@ -58,7 +37,7 @@ renpy.app, or renpy.exe, as appropriate for your platform.
If the current nightly build doesn't work, please wait 24 hours for a new
build to occur. If that build still doesn't work, contact Tom (`pytom at bishoujo.us`,
or @renpytom on Twitter/X) to find out what's wrong.
or @renpytom on twitter) to find out what's wrong.
The ``doc`` symlink will dangle until documentation is built, as described
below.
@@ -70,9 +49,9 @@ Building the modules requires you have the many dependencies installed on
your system. On Ubuntu and Debian, these dependencies can be installed with
the command::
sudo apt install virtualenvwrapper python3-dev libassimp-dev libavcodec-dev libavformat-dev \
sudo apt install virtualenvwrapper python3-dev libavcodec-dev libavformat-dev \
libswresample-dev libswscale-dev libharfbuzz-dev libfreetype6-dev libfribidi-dev libsdl2-dev \
libsdl2-image-dev libsdl2-gfx-dev libsdl2-mixer-dev libsdl2-ttf-dev libjpeg-dev pkg-config
libsdl2-image-dev libsdl2-gfx-dev libsdl2-mixer-dev libsdl2-ttf-dev libjpeg-dev
Ren'Py requires SDL_image 2.6 or greater. If your distribution doesn't include
that version, you'll need to download it from:
@@ -92,18 +71,29 @@ To return to this virtualenv later, run::
After activating the virtualenv, install additional dependencies::
pip install -U setuptools cython future six typing pefile requests ecdsa
pip install -U cython future six typing pefile requests ecdsa
Then, install pygame_sdl2 by running the following commands::
git clone https://www.github.com/renpy/pygame_sdl2
pushd pygame_sdl2
python setup.py install
python setup.py install_headers
popd
Finally, use setup.py to compile extension modules that support Ren'Py::
Next, set RENPY_DEPS_INSTALL To a \:-separated (\;-separated on Windows)
list of paths containing the dependencies, and RENPY_CYTHON to the name
of the cython command::
export RENPY_DEPS_INSTALL="/usr:/usr/lib/$(gcc -dumpmachine)/"
export RENPY_CYTHON=cython
Finally, use setup.py in the Ren'Py ``module`` directory to compile and
install the modules that support Ren'Py::
pushd module
python setup.py install
popd
Ren'Py will be installed into the activated virtualenv. It can then be run
using the command::
@@ -111,21 +101,6 @@ using the command::
python renpy.py
Other Platforms
---------------
Where supported, Ren'Py will attempt to find include directories and library paths
using pkg-config. If pkg-config is not present, include and library paths can be
specified using CFLAGS and LDFLAGS.
If RENPY_CFLAGS is present in the environment and CFLAGS is not, setup.py
will set CFLAGS to RENPY_CFLAGS. The same is true for RENPY_LDFLAGS,
RENPY_CC, RENPY_CXX, and RENPY_LD.
Setup.py does not support cross-compiling. See https://github.com/renpy/renpy-build
for software that cross-compiles Ren'Py for many platforms.
Documentation
=============
+1 -1
View File
@@ -252,7 +252,7 @@ def main():
"-q",
"egg_info",
"--tag-build",
"+renpy" + args.version.replace("+", "-"),
"+renpy" + args.version,
"sdist",
"-d",
os.path.abspath(destination)
-5
View File
@@ -1,5 +0,0 @@
*.c
*.so
*.egg-info
*.html
build
-1
View File
@@ -1 +0,0 @@
../../renpy/cslots.pyx
-8
View File
@@ -1,8 +0,0 @@
from setuptools import setup, Extension
setup(
name="cslots",
version="1.0.0",
ext_modules=[
Extension("cslots", [ "cslots.pyx" ]),
])
-7
View File
@@ -1,7 +0,0 @@
#!/bin/bash
set -e
cython -a cslots.pyx
pip install -e .
python3 -m pytest
-262
View File
@@ -1,262 +0,0 @@
import sys
import pickle
from cslots import Object, Slot, IntegerSlot
class C1(Object):
str1 : str|None = None
int1 : int = 0
def __init__(self, str1=None, int1=1):
self.str1 = str1
self.int1 = int1
class C2(C1):
str2 : str|None = None
int2 : int = 0
def __init__(self, str1=None, int1=0, str2=None, int2=0):
self.str1 = str1
self.int1 = int1
self.str2 = str2
self.int2 = int2
def test_slot_count():
assert C1._cslot_count == 2
assert C2._cslot_count == 4
def test_slots():
o = C2()
assert o.str1 is None
assert o.int1 == 0
assert o.str2 is None
assert o.int2 == 0
o.str1 = "hello"
o.int1 = 42
o.str2 = "world"
o.int2 = 43
assert o.str1 == "hello"
assert o.int1 == 42
assert o.str2 == "world"
assert o.int2 == 43
o.str1 = None
o.int1 = 0
o.str2 = None
o.int2 = 0
assert o.str1 is None
assert o.int1 == 0
assert o.str2 is None
assert o.int2 == 0
def test_compress():
def expect_size(o, values, indexes):
assert sys.getsizeof(o) == 32 + 8 * values + indexes
o = C2()
o.str1 = "hello"
o.int1 = 42
o.str2 = "world"
o.int2 = 43
expect_size(o, 4, 4)
o._compress()
assert o.str1 == "hello"
assert o.int1 == 42
assert o.str2 == "world"
assert o.int2 == 43
expect_size(o, 4, 4)
o = C2()
o.str2 = "world"
o.int2 = 43
o._compress()
assert o.str1 is None
assert o.int1 == 0
assert o.str2 == "world"
assert o.int2 == 43
expect_size(o, 2, 4)
o = C2()
o.str1 = "hello"
o._compress()
assert o.str1 == "hello"
assert o.int1 == 0
assert o.str2 is None
assert o.int2 == 0
expect_size(o, 1, 1)
def test_decompress():
def expect_size(o, values, indexes):
assert sys.getsizeof(o) == 32 + 8 * values + indexes
o = C2()
o.str1 = "hello"
o.int1 = 42
o.str2 = "world"
o.int2 = 43
expect_size(o, 4, 4)
o._compress()
o._decompress()
assert o.str1 == "hello"
assert o.int1 == 42
assert o.str2 == "world"
assert o.int2 == 43
expect_size(o, 4, 4)
o = C2()
o.str2 = "world"
o.int2 = 43
o._compress()
o._decompress()
assert o.str1 is None
assert o.int1 == 0
assert o.str2 == "world"
assert o.int2 == 43
expect_size(o, 4, 4)
o = C2()
o.str1 = "hello"
o._compress()
o._decompress()
assert o.str1 == "hello"
assert o.int1 == 0
assert o.str2 is None
assert o.int2 == 0
expect_size(o, 4, 4)
def test_kill():
o = C2()
o.str1 = "hello"
o.int1 = 42
o.str2 = "world"
o.int2 = 43
o._kill()
assert o.str1 is None
assert o.int1 == 0
assert o.str2 is None
assert o.int2 == 0
o = C2()
o.str2 = "world"
o.int2 = 43
o._compress()
o._kill()
assert o.str1 is None
assert o.int1 == 0
assert o.str2 is None
assert o.int2 == 0
def test_pickle():
o = C2()
o.str1 = "hello"
o.int1 = 42
o.str2 = "world"
o.int2 = 43
o = pickle.loads(pickle.dumps(o))
assert o.str1 == "hello"
assert o.int1 == 42
assert o.str2 == "world"
assert o.int2 == 43
o = C2()
o.str2 = "world"
o.int2 = 43
o = pickle.loads(pickle.dumps(o))
assert o.str1 is None
assert o.int1 == 0
assert o.str2 == "world"
assert o.int2 == 43
o = C2()
o.str1 = "hello"
o = pickle.loads(pickle.dumps(o))
assert o.str1 == "hello"
assert o.int1 == 0
assert o.str2 is None
assert o.int2 == 0
def test_pickle_compressed():
o = C2()
o.str1 = "hello"
o.int1 = 42
o.str2 = "world"
o.int2 = 43
o._compress()
o = pickle.loads(pickle.dumps(o))
assert o.str1 == "hello"
assert o.int1 == 42
assert o.str2 == "world"
assert o.int2 == 43
o = C2()
o.str2 = "world"
o.int2 = 43
o._compress()
o = pickle.loads(pickle.dumps(o))
assert o.str1 is None
assert o.int1 == 0
assert o.str2 == "world"
assert o.int2 == 43
o = C2()
o.str1 = "hello"
o._compress()
o = pickle.loads(pickle.dumps(o))
assert o.str1 == "hello"
assert o.int1 == 0
assert o.str2 is None
assert o.int2 == 0
+1 -1
View File
@@ -328,7 +328,7 @@ define gui.vbar_borders = Borders(gui.scale(4), gui.scale(4), gui.scale(4), gui.
define gui.vscrollbar_borders = Borders(gui.scale(4), gui.scale(4), gui.scale(4), gui.scale(4))
define gui.vslider_borders = Borders(gui.scale(4), gui.scale(4), gui.scale(4), gui.scale(4))
## What to do with unscrollable scrollbars in the game menu. "hide" hides them, while
## What to do with unscrollable scrollbars in the gui. "hide" hides them, while
## None shows them.
define gui.unscrollable = "hide"
-1
View File
@@ -1 +0,0 @@
## When this file exists, Ren'Py will load files in game/libs before other files in game.
+7 -8
View File
@@ -96,6 +96,7 @@ style frame:
## https://www.renpy.org/doc/html/screen_special.html#say
screen say(who, what):
style_prefix "say"
window:
id "window"
@@ -244,7 +245,9 @@ screen quick_menu():
hbox:
style_prefix "quick"
style "quick_menu"
xalign 0.5
yalign 1.0
textbutton _("Back") action Rollback()
textbutton _("History") action ShowMenu('history')
@@ -263,14 +266,9 @@ init python:
default quick_menu = True
style quick_menu is hbox
style quick_button is default
style quick_button_text is button_text
style quick_menu:
xalign 0.5
yalign 1.0
style quick_button:
properties gui.button_properties("quick_button")
@@ -703,7 +701,6 @@ style slot_name_text is slot_button_text
style page_label:
xpadding gui.scale(50)
ypadding gui.scale(3)
xalign 0.5
style page_label_text:
textalign 0.5
@@ -1523,9 +1520,11 @@ screen quick_menu():
if quick_menu:
hbox:
style "quick_menu"
style_prefix "quick"
xalign 0.5
yalign 1.0
textbutton _("Back") action Rollback()
textbutton _("Skip") action Skip() alternate Skip(fast=True, confirm=True)
textbutton _("Auto") action Preference("auto-forward", "toggle")
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
+15 -5
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
@@ -76,14 +76,24 @@ class BinFile(object):
self.addr = addr
def tostring(self):
return self.a.tobytes()
if PY2:
return self.a.tostring() # type: ignore
else:
return self.a.tobytes()
def substring(self, start, len): # @ReservedAssignment
return self.a[start:start + len].tobytes()
if PY2:
return self.a[start:start + len].tostring() # type: ignore
else:
return self.a[start:start + len].tobytes()
def __init__(self, data):
self.a = array.array('B')
self.a.frombytes(data)
if PY2:
self.a.fromstring(data) # type: ignore
else:
self.a.frombytes(data)
##############################################################################
# These functions parse data out of the file. In these functions, offset is
@@ -386,7 +396,7 @@ def change_icons(oldexe, icofn):
#Image size is the memory size of all sections + all headers, padded to memory alignment.
#There's already a header size, and this isn't changing headers, so just add.
#There's alread a header size, and this isn't changing headers, so just add.
#imageSize = pe.OPTIONAL_HEADER.ImageBase + pe.OPTIONAL_HEADER.SizeOfHeaders
imageSize = pe.OPTIONAL_HEADER.SizeOfHeaders
for s in pe.sections:
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
+6 -5
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
@@ -24,6 +24,7 @@ init python:
import codecs
import re
import sys
import future.utils
def theme_names():
"""
@@ -97,7 +98,7 @@ init python:
return
renpy.style.restore(style_backup)
exec(theme_data.THEME[theme][scheme], globals(), globals())
future.utils.exec_(theme_data.THEME[theme][scheme], globals(), globals())
# Rebuild the style cache.
renpy.style.rebuild(False)
@@ -167,8 +168,8 @@ init python:
def list_logical_lines(filename):
"""
This reads in filename, and turns it into a list of logical
lines.
This reads in filename, and turns it into a list of logical
lines.
"""
f = codecs.open(filename, "rb", "utf-8")
@@ -187,7 +188,7 @@ init python:
# The line that we're building up.
line = ""
# The number of open parenthesis there are right now.
# The number of open parenthesis there are right now.
parendepth = 0
# Looping over the characters in a single logical line.
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
+50 -32
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
@@ -432,7 +432,10 @@ fix_dlc("renios", "renios")
for f in sorted(self, key=lambda a : a.name):
f.hash(sha, distributor)
return sha.hexdigest()
if PY2:
return sha.hexdigest().decode("utf-8")
else:
return sha.hexdigest()
def split_by_prefix(self, prefix):
"""
@@ -658,6 +661,7 @@ fix_dlc("renios", "renios")
# Build the mac app and windows exes.
self.add_mac_files()
self.add_windows_files()
self.add_main_py()
# Add the main.py.
self.add_main_py()
@@ -894,7 +898,7 @@ fix_dlc("renios", "renios")
if not os.path.exists(path):
raise Exception("{} does not exist.".format(path))
if isinstance(file_list, str):
if isinstance(file_list, basestring):
file_list = file_list.split()
f = File(name, path, False, executable)
@@ -907,7 +911,7 @@ fix_dlc("renios", "renios")
Adds an empty directory to the file lists.
"""
if isinstance(file_list, str):
if isinstance(file_list, basestring):
file_list = file_list.split()
f = File(name, None, True, False)
@@ -943,15 +947,6 @@ fix_dlc("renios", "renios")
arcfn = arcname + ".rpa"
arcpath = self.temp_filename(arcfn)
# Create new directories leading to the new archive file relative to the tmp root
# if the archive's name indicates it should be in a subdirectory
arc_relpath = os.path.relpath(arcpath, self.project.tmp)
arc_subdir = os.path.dirname(arc_relpath)
if arc_subdir:
abs_subdir = os.path.join(self.project.tmp, arc_subdir)
os.makedirs(abs_subdir, exist_ok=True)
af = archiver.Archive(arcpath)
fll = len(self.file_lists[arcname])
@@ -990,7 +985,7 @@ fix_dlc("renios", "renios")
script_version_txt = self.temp_filename("script_version.txt")
with open(script_version_txt, "w") as f:
f.write(repr(renpy.renpy.version_tuple[:-1]))
f.write(unicode(repr(renpy.renpy.version_tuple[:-1])))
self.add_file("all", "game/script_version.txt", script_version_txt)
@@ -1080,8 +1075,11 @@ fix_dlc("renios", "renios")
rv = self.temp_filename("Info.plist")
with open(rv, "wb") as f:
plistlib.dump(plist, f)
if PY2:
plistlib.writePlist(plist, rv)
else:
with open(rv, "wb") as f:
plistlib.dump(plist, f)
return rv
@@ -1102,14 +1100,12 @@ fix_dlc("renios", "renios")
prefix = py("lib/py{major}-")
i686fn = os.path.join(config.renpy_base, prefix + "linux-i686/renpy")
if os.path.exists(i686fn):
if os.path.exists(linux_i686):
self.add_file(
linux_i686,
prefix + "linux-i686/" + self.executable_name,
i686fn,
os.path.join(config.renpy_base, prefix + "linux-i686/renpy"),
True)
self.add_file(
@@ -1118,6 +1114,16 @@ fix_dlc("renios", "renios")
os.path.join(config.renpy_base, prefix + "linux-x86_64/renpy"),
True)
armfn = os.path.join(config.renpy_base, prefix + "linux-armv7l/renpy")
if os.path.exists(armfn):
self.add_file(
raspi,
prefix + "linux-armv7l/" + self.executable_name,
armfn,
True)
aarch64fn = os.path.join(config.renpy_base, prefix + "linux-aarch64/renpy")
if os.path.exists(aarch64fn):
@@ -1220,8 +1226,19 @@ fix_dlc("renios", "renios")
if os.path.exists(tmp):
self.add_file(fl, dst, tmp)
write_exe("lib/py3-windows-x86_64/renpy.exe", self.exe, self.exe, windows)
write_exe("lib/py3-windows-x86_64/pythonw.exe", "lib/py3-windows-x86_64/pythonw.exe", "pythonw-64.exe", windows)
if PY2:
if self.build["include_i686"]:
write_exe("lib/py2-windows-i686/renpy.exe", self.exe32, self.exe32, windows_i686)
write_exe("lib/py2-windows-i686/pythonw.exe", "lib/py2-windows-i686/pythonw.exe", "pythonw-32.exe", windows_i686)
write_exe("lib/py2-windows-x86_64/renpy.exe", self.exe, self.exe, windows)
write_exe("lib/py2-windows-x86_64/pythonw.exe", "lib/py2-windows-x86_64/pythonw.exe", "pythonw-64.exe", windows)
else:
write_exe("lib/py3-windows-x86_64/renpy.exe", self.exe, self.exe, windows)
write_exe("lib/py3-windows-x86_64/pythonw.exe", "lib/py3-windows-x86_64/pythonw.exe", "pythonw-64.exe", windows)
def add_main_py(self):
@@ -1514,12 +1531,11 @@ fix_dlc("renios", "renios")
update = { variant : { "version" : self.update_versions[variant], "base_name" : self.base_name, "files" : update_files, "directories" : update_directories, "xbit" : update_xbit } }
update_fn = self.temp_filename(filename + ".update.json")
update_fn = os.path.join(self.destination, filename + ".update.json")
if self.include_update and not format.startswith("app-"):
with open(update_fn, "w") as f:
with open(update_fn, "wb" if PY2 else "w") as f:
json.dump(update, f, indent=2)
if (not dlc) or (format == "update"):
@@ -1549,11 +1565,14 @@ fix_dlc("renios", "renios")
in this thread or a background thread.
"""
final_update_fn = os.path.join(self.destination, filename + ".update.json")
if self.build_update or dlc:
if self.include_update and not self.build_update and not dlc:
if os.path.exists(update_fn):
shutil.copy(update_fn, final_update_fn)
os.unlink(update_fn)
if not directory:
file_hash = hash_file(path)
else:
file_hash = ""
if format == "tar.bz2" or format == "bare-tar.bz2":
pkg = TarPackage(path, "w:bz2")
@@ -1787,9 +1806,8 @@ fix_dlc("renios", "renios")
reporter.info(_("Recompiling all rpy files into rpyc files..."))
project.launch([ "compile", "--keep-orphan-rpyc" ], wait=True)
files = [
fn + "c" for fn in project.script_files()
if fn.startswith("game/") and project.exists(fn + "c")]
files = [fn + "c" for fn in project.script_files()
if fn.startswith("game/") and project.exists(fn + "c")]
len_files = len(files)
if not files:
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
+2 -2
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
@@ -52,7 +52,7 @@ init python:
# This is set to true by cancel() to indicate the download should be cancelled.
self.cancelled = False
# Set on success or failure.
# Set on succes or failure.
self.success = False
self.failure = None
+6 -6
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
@@ -225,7 +225,7 @@ init 1 python in editor:
_("JEdit is deprecated, using another editor is recommended."),
"jedit",
_("1.8 MB download required."),
_("This may have occurred because Java is not installed on this system."),
_("This may have occured because Java is not installed on this system."),
deprecated=True,
)
@@ -411,7 +411,7 @@ init 1 python in editor:
except Exception as e:
exception = traceback.format_exception_only(type(e), e)[-1][:-1]
renpy.invoke_in_new_context(interface.error, _("An exception occurred while launching the text editor:\n[exception!q]"), error_message, exception=exception)
renpy.invoke_in_new_context(interface.error, _("An exception occured while launching the text editor:\n[exception!q]"), error_message, exception=exception)
class EditAbsolute(Action):
def __init__(self, filename, line=None, check=False):
@@ -457,7 +457,7 @@ init 1 python in editor:
except Exception as e:
exception = traceback.format_exception_only(type(e), e)[-1][:-1]
renpy.invoke_in_new_context(interface.error, _("An exception occurred while launching the text editor:\n[exception!q]"), error_message, exception=exception)
renpy.invoke_in_new_context(interface.error, _("An exception occured while launching the text editor:\n[exception!q]"), error_message, exception=exception)
class EditAll(Action):
@@ -495,7 +495,7 @@ init 1 python in editor:
except Exception as e:
exception = traceback.format_exception_only(type(e), e)[-1][:-1]
renpy.invoke_in_new_context(interface.error, _("An exception occurred while launching the text editor:\n[exception!q]"), error_message, exception=exception)
renpy.invoke_in_new_context(interface.error, _("An exception occured while launching the text editor:\n[exception!q]"), error_message, exception=exception)
class EditProject(Action):
@@ -518,7 +518,7 @@ init 1 python in editor:
except Exception as e:
exception = traceback.format_exception_only(type(e), e)[-1][:-1]
renpy.invoke_in_new_context(interface.error, _("An exception occurred while launching the text editor:\n[exception!q]"), error_message, exception=exception)
renpy.invoke_in_new_context(interface.error, _("An exception occured while launching the text editor:\n[exception!q]"), error_message, exception=exception)
def CanEditProject():
+11 -7
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
@@ -157,11 +157,13 @@ screen front_page_project:
label _("Open Directory") style "l_label_small"
frame style "l_indent":
has grid 2 max(5, (len(p.get_renpy_launcher()["open_directory"]) + 1) // 2):
transpose True xfill True
has vbox
for button_name, path in p.get_renpy_launcher()["open_directory"].items():
textbutton button_name action OpenDirectory(os.path.join(p.path, path), absolute=True)
textbutton "game" action OpenDirectory(os.path.join(p.path, "game"), absolute=True)
textbutton "base" action OpenDirectory(os.path.join(p.path, "."), absolute=True)
textbutton "images" action OpenDirectory(os.path.join(p.path, "game/images"), absolute=True)
textbutton "audio" action OpenDirectory(os.path.join(p.path, "game/audio"), absolute=True)
textbutton "gui" action OpenDirectory(os.path.join(p.path, "game/gui"), absolute=True)
vbox:
if persistent.show_edit_funcs:
@@ -171,8 +173,10 @@ screen front_page_project:
frame style "l_indent":
has vbox
for button_name, path in p.get_renpy_launcher()["edit_file"].items():
textbutton button_name action editor.Edit(path, check=True)
textbutton "script.rpy" action editor.Edit("game/script.rpy", check=True)
textbutton "options.rpy" action editor.Edit("game/options.rpy", check=True)
textbutton "gui.rpy" action editor.Edit("game/gui.rpy", check=True)
textbutton "screens.rpy" action editor.Edit("game/screens.rpy", check=True)
if editor.CanEditProject():
textbutton _("Open project") action editor.EditProject()
+1 -10
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
@@ -26,15 +26,6 @@ define gui.asian = False
# and provides the full path to the template project.
default gui_template_path = None
define LIBS_TXT = _("""\
The game/libs/ directory is meant for third-party libraries that ask to be
put in game/libs.
When this file (game/libs/libs.txt) is present, Ren'Py will load all files
in libs before any other file in game/, and will not consider directory names
when loading these files.
""")
init -1 python:
import gui7
+2 -6
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
@@ -28,19 +28,15 @@ import os
import shutil
def finish(p):
for dn in [ "images", "audio", "libs" ]:
for dn in [ "images", "audio" ]:
fulldn = os.path.join(p.prefix, dn)
if not os.path.exists(fulldn):
os.mkdir(fulldn)
with open(os.path.join(p.prefix, "libs", "libs.txt"), "w") as f:
f.write(renpy.translation.translate_string(renpy.store.LIBS_TXT, language=p.language))
def generate_gui(p):
ImageGenerator(p).generate_all()
+2 -2
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
@@ -172,7 +172,7 @@ class CodeGenerator(object):
for l in self.lines:
m = re.match(r'^(\s*)define (.*?) =', l)
m = re.match('^(\s*)define (.*?) =', l)
if m:
indent = m.group(1)
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
+10 -2
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
@@ -81,7 +81,10 @@ init python:
label install_live2d:
python hide:
_prefix = r"lib/py3-"
if PY2:
_prefix = r"lib/py2-"
else:
_prefix = r"lib/py3-"
patterns = [
(r".*/Core/dll/linux/x86_64/(libLive2DCubismCore.so)", _prefix + r"linux-x86_64/\1"),
@@ -94,6 +97,11 @@ label install_live2d:
(r".*/Core/dll/android/(x86_64/libLive2DCubismCore.so)", r"rapt/prototype/renpyandroid/src/main/jniLibs/\1"),
]
if PY2:
patterns.extend([
(r".*/Core/dll/windows/x86/(Live2DCubismCore.dll)", _prefix + r"windows-i686/\1"),
])
install_from_zip("Live2D Cubism SDK for Native", "CubismSdkForNative-[45]-*.zip", patterns)
jump front_page
+3 -7
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
@@ -169,7 +169,7 @@ def _check_hash(filename, hashj):
download_file = ""
download_url = ""
def download(url, filename, hash=None, headers=None, requests_kwargs={}):
def download(url, filename, hash=None):
"""
Downloads `url` to `filename`, a tempfile.
"""
@@ -188,13 +188,9 @@ def download(url, filename, hash=None, headers=None, requests_kwargs={}):
progress_time = time.time()
all_headers = {"User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36 renpy/8'}
if headers:
all_headers.update(headers)
try:
response = requests.get(url, stream=True, proxies=renpy.exports.proxies, timeout=15, headers=all_headers, **requests_kwargs)
response = requests.get(url, stream=True, proxies=renpy.exports.proxies, timeout=15)
response.raise_for_status()
total_size = int(response.headers.get('content-length', 1))
+6 -13
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
@@ -33,10 +33,6 @@ init python in interface:
DOC_URL = "http://www.renpy.org/doc/html/"
DOC_LOCAL_URL = "file:///" + DOC_PATH
# If true, the launcher should not link back to renpy.org.
NO_LAUNCHER_LINKS = os.path.exists(os.path.join(config.renpy_base, "no_launcher_links.txt"))
local_doc_exists = os.path.exists(DOC_PATH)
def get_doc_url(page):
@@ -44,7 +40,7 @@ init python in interface:
Returns the URL to the documentation page.
"""
if local_doc_exists and (NO_LAUNCHER_LINKS or not persistent.use_web_doc):
if local_doc_exists and not persistent.use_web_doc:
from urllib.parse import urljoin
from urllib.request import pathname2url
@@ -121,10 +117,7 @@ screen bottom_info:
hbox:
spacing INDENT
textbutton _("Documentation") style "l_link" action interface.OpenDocumentation()
if not interface.NO_LAUNCHER_LINKS:
textbutton _("Ren'Py Website") style "l_link" action OpenURL(interface.RENPY_URL)
textbutton _("Ren'Py Website") style "l_link" action OpenURL(interface.RENPY_URL)
textbutton _("[interface.version]") style "l_link" action Jump("about")
hbox:
@@ -140,7 +133,7 @@ screen bottom_info:
textbutton _("preferences") style "l_link" action Jump("preferences")
textbutton _("quit") style "l_link" action Quit(confirm=False)
if persistent.sponsor_message and not interface.NO_LAUNCHER_LINKS:
if persistent.sponsor_message:
textbutton _("Ren'Py Sponsor Information"):
style "l_link"
@@ -352,7 +345,7 @@ init python in interface:
def error(message, submessage=None, label="front_page", **kwargs):
"""
Indicates to the user that an error has occurred.
Indicates to the user that an error has occured.
`message`
The message to display.
@@ -408,7 +401,7 @@ init python in interface:
except Exception as e:
renpy.renpy.error.report_exception(e, editor=False)
error(_("While [what!qt], an error occurred:"),
error(_("While [what!qt], an error occured:"),
_("[exception!q]"),
what=what,
label=label,
+4 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
@@ -164,6 +164,9 @@ init python:
print("Eliminating __pycache__...")
if PY2:
return
import pathlib
import sys
+2 -2
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
@@ -50,7 +50,7 @@ init python:
pass
with interface.error_handling(_("Downloading the itch.io butler.")):
url = "https://broth.itch.zone/butler/{}/LATEST/archive/default".format(platform)
url = "https://broth.itch.ovh/butler/{}/LATEST/archive/default".format(platform)
response = requests.get(url, headers={'User-Agent' : "Renpy"}, proxies=renpy.proxies)
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
+2 -2
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
@@ -91,7 +91,7 @@ init -1 python:
def log(self, msg):
with open(self.filename, "a") as f:
f.write("\n")
f.write(msg)
f.write(unicode(msg))
f.write("\n")
def info(self, prompt):
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
+4 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
@@ -34,6 +34,9 @@ label new_project:
if persistent.projects_directory is None:
$ interface.error(_("The projects directory could not be set. Giving up."))
if PY2:
$ interface.info(_("Warning : you are using Ren'Py 7. It is recommended to start new projects using Ren'Py 8 instead."))
python:
new_project_language = __("{#language name and font}")
gui_kind = "new_gui_project"
+30 -27
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
@@ -301,8 +301,6 @@ init python:
build.classify_renpy("**.new", None)
build.classify_renpy("**.bak", None)
build.classify_renpy("**.keystore", None)
build.classify_renpy("**/log.txt", None)
build.classify_renpy("**/traceback.txt", None)
build.classify_renpy("**/errors.txt", None)
@@ -322,7 +320,7 @@ init python:
"""
if py is True:
py = 'pycache'
py = 'pyo' if PY2 else 'pycache'
if py == 'pycache':
build.classify_renpy(pattern + "/**__pycache__/", binary)
@@ -346,8 +344,6 @@ init python:
build.classify_renpy(pattern + "/**.pyo", None)
build.classify_renpy(pattern + "/**.pyi", None)
build.classify_renpy(pattern + "/**.pyx", "source_only")
build.classify_renpy(pattern + "/**.pxd", "source_only")
build.classify_renpy(pattern + "/**.rpyc", binary)
build.classify_renpy(pattern + "/**.rpymc", binary)
@@ -359,7 +355,6 @@ init python:
build.classify_renpy(pattern + "/**", source)
build.classify_renpy("renpy/gl/", None)
build.classify_renpy("renpy.py", "binary")
source_and_binary("renpy")
@@ -395,31 +390,39 @@ init python:
build.classify_renpy("sphinx/source/inc/", None)
build.classify_renpy("sphinx/source/**", "source_only")
# Build System.
build.classify_renpy("setup.py", "source_only")
build.classify_renpy("src/**", "source_only")
build.classify_renpy("scripts/", "source_only")
build.classify_renpy("scripts/setuplib.py", "source_only")
build.classify_renpy("scripts/generate_styles.py", "source_only")
# module.
build.classify_renpy("module/", "source")
build.classify_renpy("module/*.c", "source")
build.classify_renpy("module/gen/", None)
build.classify_renpy("module/*.h", "source")
build.classify_renpy("module/*.py*", "source")
build.classify_renpy("module/include/", "source")
build.classify_renpy("module/include/*.pxd", "source")
build.classify_renpy("module/include/*.pxi", "source")
build.classify_renpy("module/pysdlsound/", "source")
build.classify_renpy("module/pysdlsound/*.py", "source")
build.classify_renpy("module/pysdlsound/*.pyx", "source")
build.classify_renpy("module/fribidi-src/**", "source")
build.classify_renpy("module/tinyfiledialogs/**", "source")
build.classify_renpy("module/libhydrogen/**", "source")
# all-platforms binary.
build.classify_renpy("lib/**/libpython{}.{}.dll".format(sys.version_info.major, sys.version_info.minor), "binary")
build.classify_renpy("lib/**/libpython*.dll", None)
build.classify_renpy("lib/**/*steam_api*", "steam")
build.classify_renpy("lib/**/*Live2D*", None)
build.classify_renpy("lib/py3-linux-armv7l", None)
build.classify_renpy("lib/py3-linux-aarch64/**", "linux_arm")
source_and_binary("lib/py3-**", "binary", "binary")
libpython = "lib/python{}.{}".format(sys.version_info.major, sys.version_info.minor)
source_and_binary(libpython, "binary", "binary", py='pyc')
build.classify_renpy("lib/python**", None)
build.classify_renpy("lib/py2-**", None)
build.classify_renpy("renpy3.sh", "binary")
if PY2:
build.classify_renpy("lib/py2-linux-armv7l/**", "linux_arm")
build.classify_renpy("lib/py2-linux-aarch64/**", "linux_arm")
source_and_binary("lib/py2-**", "binary", "binary")
source_and_binary("lib/python2**", "binary", "binary")
build.classify_renpy("renpy2.sh", "binary")
else:
build.classify_renpy("lib/py3-linux-armv7l/**", "linux_arm")
build.classify_renpy("lib/py3-linux-aarch64/**", "linux_arm")
source_and_binary("lib/py3-**", "binary", "binary")
source_and_binary("lib/python3**", "binary", "binary", py='pyc')
build.classify_renpy("renpy3.sh", "binary")
build.classify_renpy("lib/", "binary")
+95 -12
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
@@ -34,21 +34,106 @@ init python in distribute:
from zipfile import crc32
# Since the long type doesn't exist on py3, define it here
long = int
if not PY2:
long = int
zlib.Z_DEFAULT_COMPRESSION = 5
class ZipFile(zipfile.ZipFile):
if PY2:
def write_with_info(self, zinfo, filename):
class ZipFile(zipfile.ZipFile):
if zinfo.filename.endswith("/"):
data = b''
else:
with open(filename, "rb") as f:
data = f.read()
def write_with_info(self, zinfo, filename):
"""Put the bytes from filename into the archive under the name
arcname."""
if not self.fp:
raise RuntimeError(
"Attempt to write to ZIP archive that was already closed")
self.writestr(zinfo, data)
st = os.stat(filename)
isdir = stat.S_ISDIR(st.st_mode)
zinfo.file_size = st.st_size
zinfo.flag_bits = 0x00
zinfo.header_offset = self.fp.tell() # Start of header bytes
self._writecheck(zinfo)
self._didModify = True
if isdir:
zinfo.file_size = 0
zinfo.compress_size = 0
zinfo.CRC = 0
self.filelist.append(zinfo)
self.NameToInfo[zinfo.filename] = zinfo
self.fp.write(zinfo.FileHeader())
return
with open(filename, "rb") as fp:
# Must overwrite CRC and sizes with correct data later
zinfo.CRC = CRC = 0
zinfo.compress_size = compress_size = 0
file_size = 0
zip64 = self._allowZip64 and \
zinfo.file_size * 1.05 > zipfile.ZIP64_LIMIT
self.fp.write(zinfo.FileHeader(zip64))
if zinfo.compress_type == zipfile.ZIP_DEFLATED:
cmpr = zlib.compressobj(zlib.Z_DEFAULT_COMPRESSION,
zlib.DEFLATED, -15)
else:
cmpr = None
while 1:
buf = fp.read(1024 * 1024)
if not buf:
break
file_size = file_size + len(buf)
CRC = crc32(buf, CRC) & 0xffffffff
if cmpr:
buf = cmpr.compress(buf)
compress_size = compress_size + len(buf)
self.fp.write(buf)
if cmpr:
buf = cmpr.flush()
compress_size = compress_size + len(buf)
self.fp.write(buf)
zinfo.compress_size = compress_size
else:
zinfo.compress_size = file_size
zinfo.CRC = CRC
zinfo.file_size = file_size
if not zip64 and self._allowZip64:
if file_size > zipfile.ZIP64_LIMIT:
raise RuntimeError('File size has increased during compressing')
if compress_size > zipfile.ZIP64_LIMIT:
raise RuntimeError('Compressed size larger than uncompressed size')
# Seek backwards and write CRC and file sizes
position = self.fp.tell() # Preserve current position in file
self.fp.seek(zinfo.header_offset, 0)
self.fp.write(zinfo.FileHeader(zip64))
self.fp.seek(position, 0)
self.filelist.append(zinfo)
self.NameToInfo[zinfo.filename] = zinfo
else:
class ZipFile(zipfile.ZipFile):
def write_with_info(self, zinfo, filename):
if zinfo.filename.endswith("/"):
data = b''
else:
with open(filename, "rb") as f:
data = f.read()
self.writestr(zinfo, data)
class ZipPackage(object):
@@ -384,5 +469,3 @@ init python in distribute:
for i in parallel_threads:
if i.done:
i.done()
parallel_threads.clear()
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
+9 -44
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
@@ -92,10 +92,6 @@ init python in project:
# The mtime of the last dump file loaded.
self.dump_mtime = 0
# A processed version of data['renpy_launcher'] with missing files
# and directories removed.
self.renpy_launcher = None
def get_dump_filename(self):
if os.path.exists(os.path.join(self.gamedir, "saves")):
@@ -160,43 +156,6 @@ init python in project:
data["renamed_steam"] = True
def get_renpy_launcher(self):
if self.renpy_launcher is not None:
return self.renpy_launcher
rv = { }
default_values = {
"open_directory":
{
"game": "game",
"base": ".",
"images": "game/images",
"audio": "game/audio",
"gui": "game/gui",
"libs": "game/libs",
"mods": "game/mods",
},
"edit_file":
{
"script.rpy": "game/script.rpy",
"options.rpy": "game/options.rpy",
"gui.rpy": "game/gui.rpy",
"screens.rpy": "game/screens.rpy"
}
}
for k, default_d in default_values.items():
d = self.data.get("renpy_launcher", {}).get(k, default_d)
rv[k] = { name : path for name, path in d.items() if os.path.exists(os.path.join(self.path, path)) }
self.renpy_launcher = rv
return rv
def make_tmp(self):
"""
Makes the project's temporary directory, if it doesn't exist
@@ -393,6 +352,12 @@ init python in project:
line = line[:1024]
if PY2:
try:
line = line.decode("utf-8")
except Exception:
continue
m = re.search(r"#\s*TODO(\s*:\s*|\s+)(.*)", line, re.I)
if m is None:
@@ -707,7 +672,7 @@ init python in project:
The label to jump to when clicked.
"""
if isinstance(p, str):
if isinstance(p, basestring):
p = manager.get(p)
self.project = p
@@ -795,7 +760,7 @@ init python in project:
def __init__(self, p=None):
if p is None:
self.project = current
elif isinstance(p, str):
elif isinstance(p, basestring):
self.project = manager.get(p)
else:
self.project = p
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
+5 -5
View File
@@ -364,7 +364,7 @@
new "{b}نقترح.{/b} محرر نص له واجهة سهلة الاستعمال ويعين على كتابة النصوص البرمجية يفضل برنامج يحتوي على مدقق لغوي. Editraحالياً لا يدعم اللغات الأجنبية مثل اللغه الكورية و الصينية و اليابانية. على نظام لينوكس, Editra يحتاج wxPython."
# editor.rpy:167
old "This may have occurred because wxPython is not installed on this system."
old "This may have occured because wxPython is not installed on this system."
new "قد يكون سبب ذلك ان wxPython غير موجود في نظام التشغيل لديك"
# editor.rpy:169
@@ -380,7 +380,7 @@
new "مطلوب تحميل ملف بحجم 1.8 ميغا بايت."
# editor.rpy:182
old "This may have occurred because Java is not installed on this system."
old "This may have occured because Java is not installed on this system."
new "قد يكون السبب ان الجافا غير موجوده على هذا الجهاز."
# editor.rpy:191
@@ -392,7 +392,7 @@
new "يمنع رينباي من فتح اي محرر نصوص"
# editor.rpy:359
old "An exception occurred while launching the text editor:\n[exception!q]"
old "An exception occured while launching the text editor:\n[exception!q]"
new "حصل استثناء اثناء فتح المحرر: \n[exception!q]"
# editor.rpy:457
@@ -608,7 +608,7 @@
new "خطأ"
# interface.rpy:356
old "While [what!qt], an error occurred:"
old "While [what!qt], an error occured:"
new "حصل خطأ أثناء [what!qt]"
# interface.rpy:356
@@ -1136,7 +1136,7 @@
new "أحدث نسخة طازجة من رينباي التجريبي, قد يحتوي على آخر مستجدات رينباي و قد لا يعمل مطلقاً"
# updater.rpy:152
old "An error has occurred:"
old "An error has occured:"
new "حصل خطأ:"
# updater.rpy:154
+1 -1
View File
@@ -929,7 +929,7 @@
new "Spildataene er blevet hentet."
# renpy/common/00updater.rpy:2078
old "An error occurred when trying to download game data:"
old "An error occured when trying to download game data:"
new "En fejl opstod under forsøg på hentning af spildata:"
# renpy/common/00updater.rpy:2083
+4 -4
View File
@@ -749,7 +749,7 @@
new "Hentning af 1.8 MB påkrævet."
# game/editor.rpy:211
old "This may have occurred because Java is not installed on this system."
old "This may have occured because Java is not installed on this system."
new "Dette er muligvis opstået, fordi Java ikke er installeret på dette system."
# game/editor.rpy:220
@@ -781,7 +781,7 @@
new "Rediger [text]."
# game/editor.rpy:401
old "An exception occurred while launching the text editor:\n[exception!q]"
old "An exception occured while launching the text editor:\n[exception!q]"
new "En undtagelse opstod under opstart af tekstbehandleren:\n[exception!q]"
# game/editor.rpy:533
@@ -1073,7 +1073,7 @@
new "åbner logfilen"
# game/interface.rpy:407
old "While [what!qt], an error occurred:"
old "While [what!qt], an error occured:"
new "En fejl opstod under [what!qt]:"
# game/interface.rpy:407
@@ -1753,7 +1753,7 @@
new "%d. %B, %Y"
# game/updater.rpy:163
old "An error has occurred:"
old "An error has occured:"
new "En fejl er opstået:"
# game/updater.rpy:165
+5 -5
View File
@@ -364,7 +364,7 @@
new "{b}Suositeltu.{/b} Helppokäyttöinen beta-asteella oleva tekstieditori, joka sisältää kehitystä helpottavia toimintoja. Toistaiseksi Editrasta puuttuu täysin kiinalaisen, japanilaisen ja korealaisen tekstin kannatus."
# editor.rpy:167
old "This may have occurred because wxPython is not installed on this system."
old "This may have occured because wxPython is not installed on this system."
new "Tämä saattoi tapahtua, koska wxPythonia ei ole asennettu järjestelmään."
# editor.rpy:169
@@ -380,7 +380,7 @@
new "1.8 MB lataus vaaditaan."
# editor.rpy:182
old "This may have occurred because Java is not installed on this system."
old "This may have occured because Java is not installed on this system."
new "Tämä saattoi tapahtua, koska Javaa ei ole asennettu."
# editor.rpy:191
@@ -392,7 +392,7 @@
new "Estää Ren'Py-ohjelmaa avaamasta tekstieditoria."
# editor.rpy:359
old "An exception occurred while launching the text editor:\n[exception!q]"
old "An exception occured while launching the text editor:\n[exception!q]"
new "Virhe käynnistäessä tekstieditoria:\n[exception!q]"
# editor.rpy:457
@@ -610,7 +610,7 @@
new "VIRHE"
# interface.rpy:356
old "While [what!qt], an error occurred:"
old "While [what!qt], an error occured:"
new "Kun [what!qt], tapahtui virhe:"
# interface.rpy:356
@@ -1138,7 +1138,7 @@
new "Upouudet Ren'Py-kehitysjulkaisut. Voi sisältää uusimmat toiminnot, tai ei ehkä toimi lainkaan."
# updater.rpy:152
old "An error has occurred:"
old "An error has occured:"
new "On tapahtunut virhe:"
# updater.rpy:154
+5 -5
View File
@@ -365,7 +365,7 @@
new "{b}Recommandé.{/b} Un éditeur en version beta avec une interface simple et des fonctionnalités dassistance au développement. Editra manque pour le moment du support pour les textes en chinois, japonais et coréen. Sur GNU-Linux, Editra nécessite wxPython."
# editor.rpy:167
old "This may have occurred because wxPython is not installed on this system."
old "This may have occured because wxPython is not installed on this system."
new "Cela est sans doute dû au fait que wxPython nest pas installé sur votre système."
# editor.rpy:169
@@ -381,7 +381,7 @@
new "1.8 Mo de téléchargement requis."
# editor.rpy:182
old "This may have occurred because Java is not installed on this system."
old "This may have occured because Java is not installed on this system."
new "Cela est sans doute produit parce que Java nest pas installé sur ce système."
# editor.rpy:191
@@ -393,7 +393,7 @@
new "Empêcher RenPy douvrir un éditeur de texte."
# editor.rpy:359
old "An exception occurred while launching the text editor:\n[exception!q]"
old "An exception occured while launching the text editor:\n[exception!q]"
new "Une exception est survenue lors du lancement de l’éditeur de texte :\n[exception!q]"
# editor.rpy:457
@@ -609,7 +609,7 @@
new "ERREUR"
# interface.rpy:356
old "While [what!qt], an error occurred:"
old "While [what!qt], an error occured:"
new "Pendant que [what!qt], une erreur est survenue :"
# interface.rpy:356
@@ -1177,7 +1177,7 @@
new "Une version journalière qui corrige les bugs de la dernière version stable."
# updater.rpy:152
old "An error has occurred:"
old "An error has occured:"
new "Une erreur est survenue :"
# updater.rpy:154
+5 -5
View File
@@ -376,7 +376,7 @@
new "{b}Empfohlen.{/b} Ein Betaeditor mit einer leichten Benutzeroberfläche und Funktionen, die bei der Entwicklung helfen, wie eine Rechtschreibprüfung. Editra fehlt derzeit die Eingabemethode, die für Chinesisch, Japanisch und Koreanisch benötigt wird. Unter Linux benötigt Editra wxPython."
# editor.rpy:167
old "This may have occurred because wxPython is not installed on this system."
old "This may have occured because wxPython is not installed on this system."
new "Dies ist vermutlich passiert, weil wxPython nicht auf Deinem System installiert ist."
# editor.rpy:169
@@ -392,7 +392,7 @@
new "1,8 MB benötigt."
# editor.rpy:182
old "This may have occurred because Java is not installed on this system."
old "This may have occured because Java is not installed on this system."
new "Dies ist vermutlich passiert, weil Java nicht auf Deinem System installiert ist."
# editor.rpy:191
@@ -404,7 +404,7 @@
new "Verhindert, dass Ren'Py einen Texteditor öffnet."
# editor.rpy:359
old "An exception occurred while launching the text editor:\n[exception!q]"
old "An exception occured while launching the text editor:\n[exception!q]"
new "Ein Fehler ist beim Starten des Texteditors aufgetreten:\n[exception!q]"
# editor.rpy:457
@@ -631,7 +631,7 @@
new "FEHLER"
# interface.rpy:356
old "While [what!qt], an error occurred:"
old "While [what!qt], an error occured:"
new "Während [what!qt] ist ein Fehler aufgetreten:"
# interface.rpy:356
@@ -1193,7 +1193,7 @@
new "Die allerneuste Ren'Py Version. Diese enthält die neusten Funktionen, könnte aber auch überhaupt nicht funktionieren."
# updater.rpy:152
old "An error has occurred:"
old "An error has occured:"
new "Ein Fehler ist aufgetreten:"
# updater.rpy:154
+1 -1
View File
@@ -1,4 +1,4 @@
translate german strings:
# screens.rpy:9
+5 -5
View File
@@ -370,7 +370,7 @@
new "{b}Συνιστάται.{/b} Ένας επεξεργαστής κειμένου σε έκδοση beta, με εύκολο περιβάλλον εργασίας και χαραχτηριστικά που σας βοηθούν, όπως π.χ. ορθογραφικό έλεγχο. Ο Editra προς το παρόν δεν υποστηρίζει IME για είσοδο κειμένου σε Κινέζικα, Ιαπωνέζικα και Κορεάτικα. Σε Linux ο Editra απαιτεί το wxPython."
# editor.rpy:167
old "This may have occurred because wxPython is not installed on this system."
old "This may have occured because wxPython is not installed on this system."
new "Αυτό πιθανώς να συνέβη, διότι το wxPython δεν έχει εγκατασταθεί σε αυτό το σύστημα."
# editor.rpy:169
@@ -386,7 +386,7 @@
new "1.8 MB απαιτείται να κατέβει."
# editor.rpy:182
old "This may have occurred because Java is not installed on this system."
old "This may have occured because Java is not installed on this system."
new "Αυτό πιθανώς να συνέβη, διότι η Java δεν έχει εγκατασταθεί σε αυτό το σύστημα."
# editor.rpy:191
@@ -398,7 +398,7 @@
new "Εμποδίζει τη Ren'Py να ανοίξει επεξεργαστή κειμένου."
# editor.rpy:359
old "An exception occurred while launching the text editor:\n[exception!q]"
old "An exception occured while launching the text editor:\n[exception!q]"
new "Μια προγραμματιστική εξαίρεση συνέβει κατά την εκκίνηση του επεξεργαστή κειμένου:\n[exception!q] "
# editor.rpy:457
@@ -624,7 +624,7 @@
new "ΣΦΑΛΜΑ"
# interface.rpy:356
old "While [what!qt], an error occurred:"
old "While [what!qt], an error occured:"
new "Ενόσω [what!qt], συνέβη ένα σφάλμα:"
# interface.rpy:356
@@ -1179,7 +1179,7 @@
new "Η απόλυτη νεώτερη έκδοση της Ren'Py. Μπορεί να έχει τα πιο νέα χαρακτηριστικά, αλλά να μη μπορέι καν να φορτώσει."
# updater.rpy:152
old "An error has occurred:"
old "An error has occured:"
new "Ένα σφάλμα συνέβη:"
# updater.rpy:154
+5 -5
View File
@@ -366,7 +366,7 @@
new "{b}Di Rekomendasikan.{/b} Editor dengan interface yang mudah untuk di gunakan dan fitur yang sesuai dengan development . Saat ini Editra belum mendukung text input IME yang di butuhkan untuk bahasa Cina,Jepang Dan Korea. Pada Linux, Editra memerlikan wxPython."
# editor.rpy:167
old "This may have occurred because wxPython is not installed on this system."
old "This may have occured because wxPython is not installed on this system."
new "Ini mungkin terjadi karena wxPython tidak terpasang di sistem ini."
# editor.rpy:169
@@ -382,7 +382,7 @@
new "1.8 MB download di butuhkan."
# editor.rpy:182
old "This may have occurred because Java is not installed on this system."
old "This may have occured because Java is not installed on this system."
new "Ini mungkin terjadi karena Java tidak terpasang di sistem ini."
# editor.rpy:191
@@ -394,7 +394,7 @@
new "Larang Ren''Py untuk membuka editor text."
# editor.rpy:359
old "An exception occurred while launching the text editor:\n[exception!q]"
old "An exception occured while launching the text editor:\n[exception!q]"
new "Kesalahan terjadi ketika menjalankan editor text: \n[exception!q]"
# editor.rpy:457
@@ -612,7 +612,7 @@
new "KESALAHAN"
# interface.rpy:356
old "While [what!qt], an error occurred:"
old "While [what!qt], an error occured:"
new "Kesalahan terjadi ketika : [what!qt] adalah :"
# interface.rpy:356
@@ -1146,7 +1146,7 @@
new "Update terbaru dari pengembangan Ren'Py. Ini mungikin mempunyai fitur terbaru. Bahkan tidak jalan sama sekali."
# updater.rpy:152
old "An error has occurred:"
old "An error has occured:"
new "Kesalahan telah terjadi:"
# updater.rpy:154
+5 -5
View File
@@ -365,7 +365,7 @@
new "{b}Raccomandato.{/b} Un editor in fase Beta con un'interfaccia facile da usare e funzionalità adatte allo sviluppo come il controllo ortografico. Editra al momento non offre il supporto IMO richiesto per Cinese, Giapponese e Coreano e richiede wxPython su Linux."
# editor.rpy:167
old "This may have occurred because wxPython is not installed on this system."
old "This may have occured because wxPython is not installed on this system."
new "Potrebbe essersi verificato per via dell'assenza di wxPython su questo sistema."
# editor.rpy:169
@@ -381,7 +381,7 @@
new "Verranno scaricati 1.8 MB."
# editor.rpy:182
old "This may have occurred because Java is not installed on this system."
old "This may have occured because Java is not installed on this system."
new "Potrebbe essersi verificato per l'assenza di Java su questo sistema."
# editor.rpy:191
@@ -393,7 +393,7 @@
new "Impedisce a Ren'Py di aprire un editor di testo."
# editor.rpy:359
old "An exception occurred while launching the text editor:\n[exception!q]"
old "An exception occured while launching the text editor:\n[exception!q]"
new "Si è verificata un'eccezione durante il lancio dell'editor:\n[exception!q]"
# editor.rpy:457
@@ -609,7 +609,7 @@
new "ERRORE"
# interface.rpy:356
old "While [what!qt], an error occurred:"
old "While [what!qt], an error occured:"
new "Durante [what!qt], si è verificato un errore:"
# interface.rpy:356
@@ -1141,7 +1141,7 @@
new "La versione più recente di Ren'Py. Potrebbe avere maggiori funzionalità come anche non funzionare affatto."
# updater.rpy:152
old "An error has occurred:"
old "An error has occured:"
new "Si è verificato un errore:"
# updater.rpy:154
+1 -1
View File
@@ -969,7 +969,7 @@ translate japanese strings:
new "ゲームデータがダウンロードされました"
# renpy/common/00updater.rpy:2078
old "An error occurred when trying to download game data:"
old "An error occured when trying to download game data:"
new "ゲームデータダウンロード中にエラーが発生しました:"
# renpy/common/00updater.rpy:2083
+5 -5
View File
@@ -364,7 +364,7 @@
new "{b}推奨{/b} 使いやすいインターフェースと、スペルチュックのような開発を補助する機能を持つベータエディターです。Editra は現在、中国、韓国、日本語の入力に必要な IME のサポートに欠陥があります。Linux では Editra は wxpython を必要とします。"
# editor.rpy:167
old "This may have occurred because wxPython is not installed on this system."
old "This may have occured because wxPython is not installed on this system."
new "このエラーは wxPython がこのシステムにインストールされていないため発生したと思われます。"
# editor.rpy:169
@@ -380,7 +380,7 @@
new "1.8 MB のダウンロードが必要です。"
# editor.rpy:182
old "This may have occurred because Java is not installed on this system."
old "This may have occured because Java is not installed on this system."
new "このエラーは Java がこのシステムにインストールされていないため発生しましたと思われます。"
# editor.rpy:191
@@ -392,7 +392,7 @@
new "Ren'Py のテキストエディターの実行を停止します。"
# editor.rpy:359
old "An exception occurred while launching the text editor:\n[exception!q]"
old "An exception occured while launching the text editor:\n[exception!q]"
new "テキストエディターの選択中にエラーが発生しました:\n[exception!q]"
# editor.rpy:457
@@ -608,7 +608,7 @@
new "エラー"
# interface.rpy:356
old "While [what!qt], an error occurred:"
old "While [what!qt], an error occured:"
new "[what!qt] 中にエラーが発生しました:"
# interface.rpy:356
@@ -1136,7 +1136,7 @@
new "Ren'Py の開発版で極めて不安定です。このバージョンには最新の機能が含まれていますが、全く動かないかもしれません。"
# updater.rpy:152
old "An error has occurred:"
old "An error has occured:"
new "エラーが発生しました。"
# updater.rpy:154
+5 -5
View File
@@ -624,7 +624,7 @@
new "에디트라(Editra)는 현재 중국어, 일본어, 한국어 텍스트를 입력할 때 필요한 IME를 지원하지 않습니다. 리눅스에서, 에디트라는 wxPython이 필요합니다."
# game/editor.rpy:195
old "This may have occurred because wxPython is not installed on this system."
old "This may have occured because wxPython is not installed on this system."
new "wxPython이 설치되지 않아 문제가 발생했을 가능성이 있습니다."
# game/editor.rpy:197
@@ -640,7 +640,7 @@
new "1.8MB 내려받기 필요."
# game/editor.rpy:210
old "This may have occurred because Java is not installed on this system."
old "This may have occured because Java is not installed on this system."
new "자바(Java)가 설치되지 않아 문제가 발생했을 수도 있습니다."
# game/editor.rpy:219
@@ -664,7 +664,7 @@
new "[text] 편집."
# game/editor.rpy:387
old "An exception occurred while launching the text editor:\n[exception!q]"
old "An exception occured while launching the text editor:\n[exception!q]"
new "스크립트 에디터를 실행하던 도중 예외가 발생했습니다:\n[exception!q]"
# game/editor.rpy:519
@@ -1480,7 +1480,7 @@
new "%Y년 %m월 %d일"
# game/updater.rpy:140
old "An error has occurred:"
old "An error has occured:"
new "오류가 발생했습니다:"
# game/updater.rpy:142
@@ -1532,7 +1532,7 @@
new "다음으로"
# game/interface.rpy:394
old "While [what!qt], an error occurred:"
old "While [what!qt], an error occured:"
new "[what!qt]에 오류가 발생했습니다:"
# game/interface.rpy:394
+4 -4
View File
@@ -384,7 +384,7 @@
new "Penyunting matang. Editra tiada sokongan IME yang diperlukan untuk input tulisan bahasa Cina, Jepun, dan Korea. Di Linux, Editra memerlukan wxPython."
# editor.rpy:195
old "This may have occurred because wxPython is not installed on this system."
old "This may have occured because wxPython is not installed on this system."
new "Ini mungkin berlaku kerana wxPython tidak dipasangkan di sistem ini."
# editor.rpy:197
@@ -400,7 +400,7 @@
new "1.8 MB muat turun diperlukan."
# editor.rpy:210
old "This may have occurred because Java is not installed on this system."
old "This may have occured because Java is not installed on this system."
new "Ini munhkin berlaku kerana Java tidak dipasangkan di sistem ini."
# editor.rpy:219
@@ -424,7 +424,7 @@
new "Sunting [text]"
# editor.rpy:387
old "An exception occurred while launching the text editor:\n[exception!q]"
old "An exception occured while launching the text editor:\n[exception!q]"
new "Telah berlakunya pengecualian ralat ketika melancarkan penyunting tulisan:\n[exception!q]"
# editor.rpy:519
@@ -1216,7 +1216,7 @@
new "Penjujuhan pinggir pembangunan Ren'Py. Ini mungkin ada ciri-ciri paling baru, atau mungkin tak boleh dijalankan langsung."
# updater.rpy:158
old "An error has occurred:"
old "An error has occured:"
new "Telah berlakunya ralat:"
# updater.rpy:160
+1 -1
View File
@@ -942,7 +942,7 @@ translate piglatin strings:
new "Hetay amegay ataday ashay eenbay ownloadedday."
# renpy/common/00updater.rpy:2078
old "An error occurred when trying to download game data:"
old "An error occured when trying to download game data:"
new "Naay erroray occureday henway yingtray otay ownloadday amegay ataday:"
# renpy/common/00updater.rpy:2083
+4 -4
View File
@@ -730,7 +730,7 @@ translate piglatin strings:
new "1.8 Bmay ownloadday equiredray."
# game/editor.rpy:214
old "This may have occurred because Java is not installed on this system."
old "This may have occured because Java is not installed on this system."
new "Histay aymay avehay occureday ecausebay Avajay isay otnay installeday onay histay ystemsay."
# game/editor.rpy:228
@@ -762,7 +762,7 @@ translate piglatin strings:
new "Diteay [text]."
# game/editor.rpy:409
old "An exception occurred while launching the text editor:\n[exception!q]"
old "An exception occured while launching the text editor:\n[exception!q]"
new "Naay exceptionay occureday hileway aunchinglay hetay exttay editoray:\n[exception!q]"
# game/editor.rpy:541
@@ -1070,7 +1070,7 @@ translate piglatin strings:
new "openingay hetay oglay ilefay"
# game/interface.rpy:407
old "While [what!qt], an error occurred:"
old "While [what!qt], an error occured:"
new "Hileway [what!qt], anay erroray occureday:"
# game/interface.rpy:407
@@ -1778,7 +1778,7 @@ translate piglatin strings:
new "%Bay %day, %Yay"
# game/updater.rpy:162
old "An error has occurred:"
old "An error has occured:"
new "Naay erroray ashay occureday:"
# game/updater.rpy:164
+4 -4
View File
@@ -632,7 +632,7 @@
new "Wymagane pobieranie 1,8 MB."
# game/editor.rpy:177
old "This may have occurred because Java is not installed on this system."
old "This may have occured because Java is not installed on this system."
new "Problem powstał prawdopodobnie przez brak zainstalowanego oprogramowania Java na tym systemie."
# game/editor.rpy:186
@@ -656,7 +656,7 @@
new "Edytuj [text]."
# game/editor.rpy:354
old "An exception occurred while launching the text editor:\n[exception!q]"
old "An exception occured while launching the text editor:\n[exception!q]"
new "Wystąpił wyjątek podczas uruchamiania edytora tekstu:\n[exception!q]"
# game/editor.rpy:486
@@ -965,7 +965,7 @@
new "Otwieranie pliku dziennika"
# game/interface.rpy:394
old "While [what!qt], an error occurred:"
old "While [what!qt], an error occured:"
new "Podczas [what!qt], wystąpił błąd:"
# game/interface.rpy:394
@@ -1553,7 +1553,7 @@
new "%B %d, %Y"
# game/updater.rpy:140
old "An error has occurred:"
old "An error has occured:"
new "Wystąpił błąd:"
# game/updater.rpy:142
+4 -4
View File
@@ -11,7 +11,7 @@
new "{b}Recomendado.{/b} Um editor beta com uma interface fácil para uso e características que ajudam no desenvolvimento, como correção ortográfica. Editra atualmente carece do suporte IME necessário para textos em Chinês, Japonês e Coreano. No Linux, Editra necessita do wxPython."
# game/editor.rpy:137
old "This may have occurred because wxPython is not installed on this system."
old "This may have occured because wxPython is not installed on this system."
new "Isto pode ter ocorrido porque wxPython não está instalado neste sistema."
# game/editor.rpy:144
@@ -28,7 +28,7 @@
new "Downlod de 1.8 MB é necessário."
# game/editor.rpy:158
old "This may have occurred because Java is not installed on this system."
old "This may have occured because Java is not installed on this system."
new "Isto pode ter ocorrido porque Java não está instalado neste sistema"
# option: "System Editor"
@@ -52,8 +52,8 @@
new "Evita que Ren'Py abra um editor de texto."
# game/editor.rpy:327
old "An exception occurred while launching the text editor:\n[exception!q]"
new "Ocorreu uma exceção ao executar o editor de texto:\n[exception!q]"
old "An exception occured while launching the text editor:\n[exception!q]"
new "Ocorreu uma exceção ao executar o editor de texto:\[exception!q]"
# game/editor.rpy:423
old "Select Editor"
+1 -1
View File
@@ -62,7 +62,7 @@
new "ERRO"
# game/interface.rpy:328
old "While [what!qt], an error occurred:"
old "While [what!qt], an error occured:"
new "Enquanto [what!qt], ocorreu um erro:"
# game/interface.rpy:329
+1 -1
View File
@@ -44,7 +44,7 @@
new "Última versão, ainda instavél, do Ren'Py. Pode ter as últimas características ou pode não funcionar de vez."
# game/updater.rpy:119
old "An error has occurred:"
old "An error has occured:"
new "Um erro ocorreu:"
# game/updater.rpy:121
+1 -1
View File
@@ -1144,7 +1144,7 @@ translate russian strings:
new "Данные игры загружены."
# renpy/common/00updater.rpy:2077
old "An error occurred when trying to download game data:"
old "An error occured when trying to download game data:"
new "При попытке загрузить данные игры произошла ошибка:"
# renpy/common/00updater.rpy:2082
+6 -6
View File
@@ -624,7 +624,7 @@
new "Старый, проверенный бета-редактор. Editra на данный момент не поддерживает IME, необходимые для ввода Китайского, Японского и Корейского текстов. На Linux, Editra требует wxPython."
# editor.rpy:195
old "This may have occurred because wxPython is not installed on this system."
old "This may have occured because wxPython is not installed on this system."
new "Это могло случиться из-за того, что wxPython не установлен на этой системе."
# editor.rpy:197
@@ -640,7 +640,7 @@
new "Требуется скачать 1.8 МБ."
# editor.rpy:210
old "This may have occurred because Java is not installed on this system."
old "This may have occured because Java is not installed on this system."
new "Это могло случиться из-за того, что Java не установлена в данной системе."
# editor.rpy:219
@@ -664,7 +664,7 @@
new "Редактировать [text]"
# editor.rpy:387
old "An exception occurred while launching the text editor:\n[exception!q]"
old "An exception occured while launching the text editor:\n[exception!q]"
new "Возникла ошибка при запуске текстового редактора:\n[exception!q]"
# editor.rpy:519
@@ -1457,7 +1457,7 @@
new "%d %B %Y года"
# updater.rpy:140
old "An error has occurred:"
old "An error has occured:"
new "Возникла ошибка:"
# updater.rpy:142
@@ -1525,7 +1525,7 @@
new "(Бета)"
# interface.rpy:394
old "While [what!qt], an error occurred:"
old "While [what!qt], an error occured:"
new "В процессе выполнения \"[what!qt]\" произошла ошибка:"
# interface.rpy:394
@@ -1874,7 +1874,7 @@
# game/androidstrings.rpy:43
old "I was unable to use javac to compile a test file. If you haven't installed the Java Development Kit yet, please download it from:\n\n{a=https://adoptium.net/?variant=openjdk8}https://adoptium.net/?variant=openjdk8{/a}\n\nThe JDK is different from the JRE, so it's possible you have Java without having the JDK. Please make sure you installed the 'JavaSoft (Oracle) registry keys'.\n\nWithout a working JDK, I can't continue."
new "Не удалось использовать javac для компиляции тестового файла. Если вы еще не установили Java Development Kit, загрузите его с:\n\n{a=https://adoptium.net/?variant=openjdk8}https://adoptium.net/?variant=openjdk8{/a}\n\nJDK отличается от JRE, поэтому возможно, что у вас есть Java без JDK. Пожалуйста, убедитесь, что вы установили 'переменные окружения JavaSoft (Oracle)'.\n\nБез работающего JDK я не могу продолжать."
new "Не удалось использовать javac для компиляции тестового файла. Если вы еще не установили Java Development Kit, загрузите его с:\n\n{a=https://adoptium.net/?variant=openjdk8}https://adoptium.net/?variant=openjdk8{/a}\n\JDK отличается от JRE, поэтому возможно, что у вас есть Java без JDK. Пожалуйста, убедитесь, что вы установили 'переменные окружения JavaSoft (Oracle)'.\n\nБез работающего JDK я не могу продолжать."
# game/androidstrings.rpy:64
old "I've opened the directory containing android.keystore and bundle.keystore. Please back them up, and keep them in a safe place."
+1 -1
View File
@@ -1129,7 +1129,7 @@
new "游戏数据已下载"
# renpy/common/00updater.rpy:2078
old "An error occurred when trying to download game data:"
old "An error occured when trying to download game data:"
new "尝试下载游戏数据时发生错误:"
# renpy/common/00updater.rpy:2083
+4 -4
View File
@@ -697,7 +697,7 @@
new "需要下载 1.8 MB 的文件。"
# game/editor.rpy:200
old "This may have occurred because Java is not installed on this system."
old "This may have occured because Java is not installed on this system."
new "这可能是由于您的系统中尚未安装 Java 造成的。"
# game/editor.rpy:209
@@ -729,7 +729,7 @@
new "编辑 [text]。"
# game/editor.rpy:390
old "An exception occurred while launching the text editor:\n[exception!q]"
old "An exception occured while launching the text editor:\n[exception!q]"
new "启动编辑器时发生异常:\n[exception!q]"
# game/editor.rpy:522
@@ -1037,7 +1037,7 @@
new "打开日志文件"
# game/interface.rpy:399
old "While [what!qt], an error occurred:"
old "While [what!qt], an error occured:"
new "[what!qt]时出错:"
# game/interface.rpy:399
@@ -1697,7 +1697,7 @@
new "%Y-%m-%d"
# game/updater.rpy:157
old "An error has occurred:"
old "An error has occured:"
new "发生错误:"
# game/updater.rpy:159
+2 -2
View File
@@ -884,7 +884,7 @@ translate spanish strings:
# renpy/common/00sync.rpy:593
old "You can use this ID to download your save on another device.\nThis sync will expire in an hour.\nRen'Py Sync is supported by {a=https://www.renpy.org/sponsors.html}Ren'Py's Sponsors{/a}."
new "Puede usar esta ID para descargar su guardado en otro dispositivo.\nEsta sincronización caducará en una hora.\nRenPy Sync está para {a=https://www.renpy.org/sponsors.html}los patrocinadores de Ren'Py{/a}."
new "Puede usar esta ID para descargar su guardado en otro dispositivo.\nEsta sincronización caducará en una hora.\RenPy Sync está para {a=https://www.renpy.org/sponsors.html}los patrocinadores de Ren'Py{/a}."
# renpy/common/00sync.rpy:619
old "Sync Error"
@@ -943,7 +943,7 @@ translate spanish strings:
new "Descarga de los datos del juego."
# renpy/common/00updater.rpy:2078
old "An error occurred when trying to download game data:"
old "An error occured when trying to download game data:"
new "Se ha producido un error al intentar descargar los datos del juego:"
# renpy/common/00updater.rpy:2083
+5 -5
View File
@@ -384,7 +384,7 @@
new "Un editor maduro. Editra carece de soporte IME, necesario para el texto en chino, japonés y coreano. En Linux, Editra necesita wxPython."
# editor.rpy:195
old "This may have occurred because wxPython is not installed on this system."
old "This may have occured because wxPython is not installed on this system."
new "Esto puede haber ocurrido porque wxPython no está instalado en este sistema."
# editor.rpy:197
@@ -400,7 +400,7 @@
new "Requiere descargar 1.8 MB."
# editor.rpy:210
old "This may have occurred because Java is not installed on this system."
old "This may have occured because Java is not installed on this system."
new "Esto puede haber ocurrido porque Java no está instalado en este sistema"
# editor.rpy:219
@@ -424,7 +424,7 @@
new "Editar [text]."
# editor.rpy:387
old "An exception occurred while launching the text editor:\n[exception!q]"
old "An exception occured while launching the text editor:\n[exception!q]"
new "Ha ocurrido una excepción mientras se ejecutaba el editor de texto:\\[exception!q]"
# editor.rpy:519
@@ -1216,7 +1216,7 @@
new "Versión de desarrollo de Ren'Py. Puede tener las últimas características o puede no funcionar."
# updater.rpy:152
old "An error has occurred:"
old "An error has occured:"
new "Ha sucedido un error:"
# updater.rpy:154
@@ -1568,7 +1568,7 @@
new "abriendo el archivo de registro"
# game/interface.rpy:394
old "While [what!qt], an error occurred:"
old "While [what!qt], an error occured:"
new "Mientras que [what!qt], ocurrió un error:"
# game/interface.rpy:394
+1 -1
View File
@@ -738,7 +738,7 @@ translate tchinese strings:
new "遊戲資料已下載。"
# renpy/common/00updater.rpy:2078
old "An error occurred when trying to download game data:"
old "An error occured when trying to download game data:"
new "嘗試下載遊戲資料時發生錯誤:"
# renpy/common/00updater.rpy:2083
+5 -5
View File
@@ -364,7 +364,7 @@
new "{b}推薦{/b} 一個有簡單易用的介面和功能的測試版編輯器能夠幫助開發,例如拼字的校對功能。Editra 現在沒有中文,日文,韓文的輸入功能。在 linux 中 Editra 需要 wxPython(模組支援)。"
# editor.rpy:167
old "This may have occurred because wxPython is not installed on this system."
old "This may have occured because wxPython is not installed on this system."
new "這可能是因為 wxPython 沒有被安裝在當前系統中而發生的。"
# editor.rpy:169
@@ -380,7 +380,7 @@
new "1.8 MB 需要下載。"
# editor.rpy:182
old "This may have occurred because Java is not installed on this system."
old "This may have occured because Java is not installed on this system."
new "這可能是因為 Java 沒有被安裝在當前系統中而發生的。"
# editor.rpy:191
@@ -392,7 +392,7 @@
new "防止 Ren'Py 開啟文字編輯器。"
# editor.rpy:359
old "An exception occurred while launching the text editor:\n[exception!q]"
old "An exception occured while launching the text editor:\n[exception!q]"
new "啟動以下編輯器出現異常:\n[exception!q]"
# editor.rpy:457
@@ -608,7 +608,7 @@
new "錯誤"
# interface.rpy:356
old "While [what!qt], an error occurred:"
old "While [what!qt], an error occured:"
new "[what!qt] 時,出現錯誤:"
# interface.rpy:356
@@ -1136,7 +1136,7 @@
new "Ren'Py 最新的開發版本。這可能會擁有最新的功能,或可能根本無法運作。"
# updater.rpy:152
old "An error has occurred:"
old "An error has occured:"
new "一個錯誤發生:"
# updater.rpy:154
+6 -6
View File
@@ -620,7 +620,7 @@
new "Gelişmiş bir düzenleyici. Editra; Çince, Japonca ve Korece metin girişi için gerekli olan IME desteğinden yoksundur. Linux'ta Editra wxPython gerektirir."
# editor.rpy:195
old "This may have occurred because wxPython is not installed on this system."
old "This may have occured because wxPython is not installed on this system."
new "Bu sistemde wxPython kurulu olmadığı için olabilir."
# editor.rpy:197
@@ -636,7 +636,7 @@
new "1.8 MB indirme gerekir."
# editor.rpy:210
old "This may have occurred because Java is not installed on this system."
old "This may have occured because Java is not installed on this system."
new "Bunun sebebi sistemde Java kurulu olmaması olabilir."
# editor.rpy:219
@@ -660,7 +660,7 @@
new "Düzenle [text]."
# editor.rpy:387
old "An exception occurred while launching the text editor:\n[exception!q]"
old "An exception occured while launching the text editor:\n[exception!q]"
new "Metin düzenleyicisini başlatırken bir hata oluştu:\n[exception!q]"
# editor.rpy:519
@@ -896,7 +896,7 @@
new "HATA"
# interface.rpy:394
old "While [what!q], an error occurred:"
old "While [what!q], an error occured:"
new "[what!q] sırasında bir hata meydana geldi:"
# interface.rpy:394
@@ -1465,7 +1465,7 @@
new "B %d, %Y"
# updater.rpy:140
old "An error has occurred:"
old "An error has occured:"
new "Bir hata meydana geldi:"
# updater.rpy:142
@@ -1913,7 +1913,7 @@ translate turkish strings:
new "günlük dosyasının açılması"
# game/interface.rpy:407
old "While [what!qt], an error occurred:"
old "While [what!qt], an error occured:"
# Automatic translation.
new "[what!qt] adresindeyken bir hata oluştu:"
+2 -2
View File
@@ -1,4 +1,4 @@
translate ukrainian strings:
# 00action_file.rpy:26
@@ -1134,7 +1134,7 @@ translate ukrainian strings:
new "Дані гри було завантажено."
# renpy/common/00updater.rpy:2078
old "An error occurred when trying to download game data:"
old "An error occured when trying to download game data:"
new "Виникла помилка при спробі завантажити дані гри:"
# renpy/common/00updater.rpy:2083
+1 -12
View File
@@ -1,4 +1,4 @@

translate ukrainian strings:
# 00console.rpy:255
@@ -156,14 +156,3 @@ translate ukrainian strings:
# renpy/common/00console.rpy:813
old "Help may display undocumented functions. Please check that the function or\nclass you want to use is documented.\n\n"
new "У довідці можуть бути недокументовані функції. Будь ласка, перевірте, чи бажана функція або\nклас задокументовано.\n\n"
translate ukrainian strings:
# renpy/common/_developer/developer.rpym:133
old " [name!q] [attributes!q] (hidden)"
new " [name!q] [attributes!q] (приховано)"
# renpy/common/_developer/developer.rpym:137
old " [name!q] [attributes!q]"
new " [name!q] [attributes!q]"
+1 -1
View File
@@ -1,4 +1,4 @@

translate ukrainian strings:
# 00gltest.rpy:70
+1 -8
View File
@@ -1,4 +1,4 @@

translate ukrainian strings:
# gui/game/gui.rpy:2
@@ -440,10 +440,3 @@ translate ukrainian strings:
# gui/game/gui.rpy:461
old "## NVL-mode."
new "## NVL-режим."
translate ukrainian strings:
# gui/game/gui.rpy:331
old "## What to do with unscrollable scrollbars in the game menu. \"hide\" hides them, while None shows them."
new "## Що робити з не прокручуваними смугами прокрутки у меню гри. Параметр «hide» приховує їх, а «None» показує їх."
+5 -5
View File
@@ -1,4 +1,4 @@

translate ukrainian strings:
# game/about.rpy:39
@@ -706,7 +706,7 @@ translate ukrainian strings:
new "Розмір завантаження — 1,8 МБ."
# game/editor.rpy:211
old "This may have occurred because Java is not installed on this system."
old "This may have occured because Java is not installed on this system."
new "Це могло статися через те, що на цій системі не встановлено Java."
# game/editor.rpy:220
@@ -738,7 +738,7 @@ translate ukrainian strings:
new "Редагувати [text]."
# game/editor.rpy:401
old "An exception occurred while launching the text editor:\n[exception!q]"
old "An exception occured while launching the text editor:\n[exception!q]"
new "Під час запуску текстового редактора виникла помилка:\n[exception!q]"
# game/editor.rpy:533
@@ -1050,7 +1050,7 @@ translate ukrainian strings:
new "відкриття файлу журналу"
# game/interface.rpy:399
old "While [what!qt], an error occurred:"
old "While [what!qt], an error occured:"
new "Під час [what!qt] сталася помилка:"
# game/interface.rpy:399
@@ -1718,7 +1718,7 @@ translate ukrainian strings:
new "%d %B, %Y"
# game/updater.rpy:157
old "An error has occurred:"
old "An error has occured:"
new "Сталася помилка:"
# game/updater.rpy:159
+1 -1
View File
@@ -1,4 +1,4 @@

translate ukrainian strings:
# gui/game/options.rpy:1
+1 -1
View File
@@ -1,4 +1,4 @@

translate ukrainian strings:
# gui/game/screens.rpy:9
+1 -1
View File
@@ -1,4 +1,4 @@
# У цьому файлі міститься сценарій гри.
# У цьому файлі міститься сценарій гри.
# Визначення персонажів для гри.
# Аргумент color змінює колір ім’я персонажа.
+5 -5
View File
@@ -364,7 +364,7 @@
new "{b}Khuyến khích{/b} Một trình biên tập có giao diện thân thiện và chức năng hỗ trợ phát triển, chẳng hạn như kiểm tra lỗi chính tả. Editra hiện đang thiếu sự hỗ trợ IME cần thiết để nhập văn bản Trung Quốc, Nhật Bản, và Hàn Quốc. Với Linux Editra cần thêm wxPython."
# editor.rpy:167
old "This may have occurred because wxPython is not installed on this system."
old "This may have occured because wxPython is not installed on this system."
new "Lỗi xảy ra có thể là do wxPython chưa được cài đặt vào hệ thống."
# editor.rpy:169
@@ -380,7 +380,7 @@
new "Cần tải về 1.8 MB tập tin"
# editor.rpy:182
old "This may have occurred because Java is not installed on this system."
old "This may have occured because Java is not installed on this system."
new "Lỗi xảy ra có thể là do Java chưa được cài đặt vào hệ thống."
# editor.rpy:191
@@ -392,7 +392,7 @@
new "Chặn Ren'py mở một trình biên tập văn bản"
# editor.rpy:359
old "An exception occurred while launching the text editor:\n[exception!q]"
old "An exception occured while launching the text editor:\n[exception!q]"
new "Một lỗi xuất hiện khi đang mở trình biên tập văn bản:\n[exception!q]"
# editor.rpy:457
@@ -608,7 +608,7 @@
new "LỖI"
# interface.rpy:356
old "While [what!qt], an error occurred:"
old "While [what!qt], an error occured:"
new "Trong khi [what!qt], một lỗi xảy ra:"
# interface.rpy:356
@@ -1136,7 +1136,7 @@
new "Rìa gần nhất tới sự phát triển của Ren'Py. Nó có thể chứa các tính năng mới nhất hoặc chẳng chạy được luôn."
# updater.rpy:152
old "An error has occurred:"
old "An error has occured:"
new "Một lỗi đã xảy ra:"
# updater.rpy:154
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
+2 -2
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
@@ -159,7 +159,7 @@ screen updater:
has vbox
if u.state == u.ERROR:
text _("An error has occurred:")
text _("An error has occured:")
elif u.state == u.CHECKING:
text _("Checking for updates.")
elif u.state == u.UPDATE_NOT_AVAILABLE:
+3 -3
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
@@ -55,7 +55,7 @@ init -1 python in util:
for subdir, directories, files in os.walk(directory):
for fn in directories:
if not isinstance(fn, str):
if not isinstance(fn, unicode):
continue
fullfn = os.path.join(subdir, fn)
@@ -66,7 +66,7 @@ init -1 python in util:
yield relfn, True
for fn in files:
if not isinstance(fn, str):
if not isinstance(fn, unicode):
continue
fullfn = os.path.join(subdir, fn)
+16 -11
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
@@ -440,12 +440,13 @@ init python:
# Find the presplash and copy it over.
presplash = None
for fn in [ "web-presplash.png", "web-presplash.jpg", "web-presplash.webp" ]:
fullfn = os.path.join(project.current.path, fn)
if not PY2:
for fn in [ "web-presplash.png", "web-presplash.jpg", "web-presplash.webp" ]:
fullfn = os.path.join(project.current.path, fn)
if os.path.exists(fullfn):
presplash = fn
break
if os.path.exists(fullfn):
presplash = fn
break
if presplash:
os.unlink(os.path.join(destination, "web-presplash.jpg"))
@@ -455,16 +456,20 @@ init python:
with io.open(os.path.join(WEB_PATH, "index.html"), encoding='utf-8') as f:
html = f.read()
html = html.replace("Ren'Py Web Game", display_name)
if PY2:
html = html.replace("%%TITLE%%", display_name)
else:
html = html.replace("Ren'Py Web Game", display_name)
if presplash:
html = html.replace("web-presplash.jpg", presplash)
if presplash:
html = html.replace("web-presplash.jpg", presplash)
with io.open(os.path.join(destination, "index.html"), "w", encoding='utf-8') as f:
f.write(html)
generate_web_icons(p, destination)
prepare_pwa_files(p, destination)
if not PY2:
generate_web_icons(p, destination)
prepare_pwa_files(p, destination)
# Zip up the game.
+1 -12
View File
@@ -17,8 +17,6 @@ root = ""
import renpy
class BannedException(Exception):
pass
class WebHandler(http.server.BaseHTTPRequestHandler):
@@ -61,13 +59,7 @@ class WebHandler(http.server.BaseHTTPRequestHandler):
None, in which case the caller has nothing further to do.
"""
try:
path = self.translate_path(self.path)
except BannedException:
self.send_error(403, "File not found")
return None
path = self.translate_path(self.path)
f = None
if os.path.isdir(path):
parts = urllib.parse.urlsplit(self.path)
@@ -200,9 +192,6 @@ class WebHandler(http.server.BaseHTTPRequestHandler):
path = root
for word in words:
if word.startswith("."):
raise BannedException("Invalid path.")
if os.path.dirname(word) or word in (os.curdir, os.pardir):
# Ignore components that are not a simple file/directory name
continue
+1 -1
View File
@@ -25,7 +25,7 @@
* 11/08/2004 - Compr fix, levels -1,1-7 now work - Tyler Montbriand
*/
#include <stdlib.h>
#include <SDL2/SDL.h>
#include <SDL.h>
#include <png.h>
#include <zlib.h>
#include "IMG_savepng.h"
+40
View File
@@ -0,0 +1,40 @@
_renpy gen/_renpy.c IMG_savepng.c core.c
_renpybidi gen/_renpybidi.c renpybidicore.c
renpy.audio.renpysound gen/renpy.audio.renpysound.c renpysound_core.c ffmedia.c
renpy.audio.filter gen/renpy.audio.filter.c
renpy.lexersupport gen/renpy.lexersupport.c
renpy.pydict gen/renpy.pydict.c
renpy.style gen/renpy.style.c
renpy.encryption gen/renpy.encryption.c
renpy.compat.dictviews gen/renpy.compat.dictviews.c
renpy.styledata.styleclass gen/renpy.styledata.styleclass.c
renpy.styledata.stylesets gen/renpy.styledata.stylesets.c
renpy.styledata.style_selected_hover_functions gen/renpy.styledata.style_selected_hover_functions.c
renpy.styledata.style_selected_idle_functions gen/renpy.styledata.style_selected_idle_functions.c
renpy.styledata.style_selected_insensitive_functions gen/renpy.styledata.style_selected_insensitive_functions.c
renpy.styledata.style_selected_functions gen/renpy.styledata.style_selected_functions.c
renpy.styledata.style_hover_functions gen/renpy.styledata.style_hover_functions.c
renpy.styledata.style_idle_functions gen/renpy.styledata.style_idle_functions.c
renpy.styledata.style_insensitive_functions gen/renpy.styledata.style_insensitive_functions.c
renpy.styledata.style_functions gen/renpy.styledata.style_functions.c
renpy.styledata.style_activate_functions gen/renpy.styledata.style_activate_functions.c
renpy.styledata.style_selected_activate_functions gen/renpy.styledata.style_selected_activate_functions.c
renpy.display.matrix gen/renpy.display.matrix.c
renpy.display.render gen/renpy.display.render.c
renpy.display.accelerator gen/renpy.display.accelerator.c
renpy.display.quaternion gen/renpy.display.quaternion.c
renpy.uguu.gl gen/renpy.uguu.gl.c
renpy.uguu.uguu gen/renpy.uguu.uguu.c
renpy.gl2.gl2mesh gen/renpy.gl2.gl2mesh.c
renpy.gl2.gl2mesh2 gen/renpy.gl2.gl2mesh2.c
renpy.gl2.gl2mesh3 gen/renpy.gl2.gl2mesh3.c
renpy.gl2.gl2polygon gen/renpy.gl2.gl2polygon.c
renpy.gl2.gl2model gen/renpy.gl2.gl2model.c
renpy.gl2.gl2draw gen/renpy.gl2.gl2draw.c
renpy.gl2.gl2texture gen/renpy.gl2.gl2texture.c
renpy.gl2.gl2shader gen/renpy.gl2.gl2shader.c
renpy.gl2.live2dmodel gen/renpy.gl2.live2dmodel.c
renpy.text.textsupport gen/renpy.text.textsupport.c
renpy.text.texwrap gen/renpy.text.texwrap.c
renpy.text.ftfont gen/renpy.text.ftfont.c ftsupport.c ttgsubtable.c
renpy.text.hbfont gen/renpy.text.hbfont.c
+1
View File
@@ -0,0 +1 @@
_renpytfd gen/_renpytfd.c tinyfiledialogs/tinyfiledialogs.c
+1 -1
View File
@@ -1,5 +1,5 @@
# -*- python -*-
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
+1 -1
View File
@@ -1,6 +1,6 @@
#include "renpy.h"
#include "IMG_savepng.h"
#include <SDL2/SDL.h>
#include <SDL.h>
#include <pygame_sdl2/pygame_sdl2.h>
#include <stdio.h>
#include <math.h>

Some files were not shown because too many files have changed in this diff Show More