summaryrefslogtreecommitdiff
path: root/pcr/renpy-python3
diff options
context:
space:
mode:
Diffstat (limited to 'pcr/renpy-python3')
-rw-r--r--pcr/renpy-python3/PKGBUILD2
-rw-r--r--pcr/renpy-python3/python3.patch417
2 files changed, 382 insertions, 37 deletions
diff --git a/pcr/renpy-python3/PKGBUILD b/pcr/renpy-python3/PKGBUILD
index 55ae76867..ff7ae3eba 100644
--- a/pcr/renpy-python3/PKGBUILD
+++ b/pcr/renpy-python3/PKGBUILD
@@ -26,7 +26,7 @@ sha256sums=('0eb0c763bf7e977db06039c69751f1ed5e69c4b738f7f6d975e99e8729eff58e'
'fccde3461617a098a78d938d9db782d403eda410a84ab52825a597498ab95834'
'611edc07a40ccb8e04e8858847fc1d2a066d29c2ed54e5b357880a0605818dc5'
'c2d27a3f6b74f874a790ce6c12e9d4b718784478d8a8aa23c879d186f60a25ab'
- 'd3fa4d78ceb52f4ec26bc18e87f94e19bcf579766ef2ffee080d11194f0fb913')
+ '664b708f5d4f39d8c3006b796c7e07fadb73fc8fd60b67d29b48d91b89c1299b')
prepare() {
cd renpy-${pkgver}-source
diff --git a/pcr/renpy-python3/python3.patch b/pcr/renpy-python3/python3.patch
index 972242311..3c406515b 100644
--- a/pcr/renpy-python3/python3.patch
+++ b/pcr/renpy-python3/python3.patch
@@ -709,6 +709,133 @@ index 5b64008..a88d089 100644
# Binary mode stdout for python3.
try:
+diff --git a/module/gen/renpy.text.textsupport.c b/module/gen/renpy.text.textsupport.c
+index f09ec46..bbe9b3a 100644
+--- a/module/gen/renpy.text.textsupport.c
++++ b/module/gen/renpy.text.textsupport.c
+@@ -800,7 +800,7 @@ int __pyx_module_is_main_renpy__text__textsupport = 0;
+ static PyObject *__pyx_builtin_range;
+ static PyObject *__pyx_builtin_Exception;
+ static PyObject *__pyx_builtin_ord;
+-static PyObject *__pyx_builtin_unichr;
++static PyObject *__pyx_builtin_chr;
+ static int __pyx_pf_5renpy_4text_11textsupport_5Glyph___init__(struct __pyx_obj_5renpy_4text_11textsupport_Glyph *__pyx_v_self); /* proto */
+ static PyObject *__pyx_pf_5renpy_4text_11textsupport_5Glyph_2__repr__(struct __pyx_obj_5renpy_4text_11textsupport_Glyph *__pyx_v_self); /* proto */
+ static PyObject *__pyx_pf_5renpy_4text_11textsupport_5Glyph_1x___get__(struct __pyx_obj_5renpy_4text_11textsupport_Glyph *__pyx_v_self); /* proto */
+@@ -964,7 +964,7 @@ static char __pyx_k_offset[] = "offset";
+ static char __pyx_k_source[] = "source";
+ static char __pyx_k_spaces[] = "spaces";
+ static char __pyx_k_splitx[] = "splitx";
+-static char __pyx_k_unichr[] = "unichr";
++static char __pyx_k_chr[] = "chr";
+ static char __pyx_k_CLASSES[] = "CLASSES";
+ static char __pyx_k_advance[] = "advance";
+ static char __pyx_k_justify[] = "justify";
+@@ -1190,7 +1190,7 @@ static PyObject *__pyx_n_s_text_align;
+ static PyObject *__pyx_n_s_tokenize;
+ static PyObject *__pyx_n_s_tpg;
+ static PyObject *__pyx_n_s_tweak_glyph_spacing;
+-static PyObject *__pyx_n_s_unichr;
++static PyObject *__pyx_n_s_chr;
+ static PyObject *__pyx_n_s_w;
+ static PyObject *__pyx_n_s_width;
+ static PyObject *__pyx_n_s_x;
+@@ -5652,7 +5652,7 @@ static PyObject *__pyx_pf_5renpy_4text_11textsupport_12linebreak_debug(CYTHON_UN
+ * if g.split == SPLIT_INSTEAD:
+ * rv += "|"
+ * elif g.split == SPLIT_BEFORE: # <<<<<<<<<<<<<<
+- * rv += "[" + unichr(g.character)
++ * rv += "[" + chr(g.character)
+ * else:
+ */
+ switch (__pyx_v_g->split) {
+@@ -5671,7 +5671,7 @@ static PyObject *__pyx_pf_5renpy_4text_11textsupport_12linebreak_debug(CYTHON_UN
+ * if g.split == SPLIT_INSTEAD:
+ * rv += "|" # <<<<<<<<<<<<<<
+ * elif g.split == SPLIT_BEFORE:
+- * rv += "[" + unichr(g.character)
++ * rv += "[" + chr(g.character)
+ */
+ __pyx_t_3 = PyNumber_InPlaceAdd(__pyx_v_rv, __pyx_kp_s__2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 393; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+ __Pyx_GOTREF(__pyx_t_3);
+@@ -5683,7 +5683,7 @@ static PyObject *__pyx_pf_5renpy_4text_11textsupport_12linebreak_debug(CYTHON_UN
+ * if g.split == SPLIT_INSTEAD:
+ * rv += "|"
+ * elif g.split == SPLIT_BEFORE: # <<<<<<<<<<<<<<
+- * rv += "[" + unichr(g.character)
++ * rv += "[" + chr(g.character)
+ * else:
+ */
+ case __pyx_e_5renpy_4text_11textsupport_SPLIT_BEFORE:
+@@ -5691,9 +5691,9 @@ static PyObject *__pyx_pf_5renpy_4text_11textsupport_12linebreak_debug(CYTHON_UN
+ /* "renpy/text/textsupport.pyx":395
+ * rv += "|"
+ * elif g.split == SPLIT_BEFORE:
+- * rv += "[" + unichr(g.character) # <<<<<<<<<<<<<<
++ * rv += "[" + chr(g.character) # <<<<<<<<<<<<<<
+ * else:
+- * rv += unichr(g.character)
++ * rv += chr(g.character)
+ */
+ __pyx_t_3 = __Pyx_PyInt_From_unsigned_int(__pyx_v_g->character); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 395; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+ __Pyx_GOTREF(__pyx_t_3);
+@@ -5702,7 +5702,7 @@ static PyObject *__pyx_pf_5renpy_4text_11textsupport_12linebreak_debug(CYTHON_UN
+ PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3);
+ __Pyx_GIVEREF(__pyx_t_3);
+ __pyx_t_3 = 0;
+- __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_unichr, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 395; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
++ __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_chr, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 395; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+ __Pyx_GOTREF(__pyx_t_3);
+ __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+ __pyx_t_4 = PyNumber_Add(__pyx_kp_s__3, __pyx_t_3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 395; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+@@ -5717,9 +5717,9 @@ static PyObject *__pyx_pf_5renpy_4text_11textsupport_12linebreak_debug(CYTHON_UN
+ default:
+
+ /* "renpy/text/textsupport.pyx":397
+- * rv += "[" + unichr(g.character)
++ * rv += "[" + chr(g.character)
+ * else:
+- * rv += unichr(g.character) # <<<<<<<<<<<<<<
++ * rv += chr(g.character) # <<<<<<<<<<<<<<
+ *
+ * return rv
+ */
+@@ -5730,7 +5730,7 @@ static PyObject *__pyx_pf_5renpy_4text_11textsupport_12linebreak_debug(CYTHON_UN
+ PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3);
+ __Pyx_GIVEREF(__pyx_t_3);
+ __pyx_t_3 = 0;
+- __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_unichr, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 397; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
++ __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_chr, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 397; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+ __Pyx_GOTREF(__pyx_t_3);
+ __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+ __pyx_t_4 = PyNumber_InPlaceAdd(__pyx_v_rv, __pyx_t_3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 397; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+@@ -5752,7 +5752,7 @@ static PyObject *__pyx_pf_5renpy_4text_11textsupport_12linebreak_debug(CYTHON_UN
+ __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+ /* "renpy/text/textsupport.pyx":399
+- * rv += unichr(g.character)
++ * rv += chr(g.character)
+ *
+ * return rv # <<<<<<<<<<<<<<
+ *
+@@ -10826,7 +10826,7 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = {
+ {&__pyx_n_s_tokenize, __pyx_k_tokenize, sizeof(__pyx_k_tokenize), 0, 0, 1, 1},
+ {&__pyx_n_s_tpg, __pyx_k_tpg, sizeof(__pyx_k_tpg), 0, 0, 1, 1},
+ {&__pyx_n_s_tweak_glyph_spacing, __pyx_k_tweak_glyph_spacing, sizeof(__pyx_k_tweak_glyph_spacing), 0, 0, 1, 1},
+- {&__pyx_n_s_unichr, __pyx_k_unichr, sizeof(__pyx_k_unichr), 0, 0, 1, 1},
++ {&__pyx_n_s_chr, __pyx_k_chr, sizeof(__pyx_k_chr), 0, 0, 1, 1},
+ {&__pyx_n_s_w, __pyx_k_w, sizeof(__pyx_k_w), 0, 0, 1, 1},
+ {&__pyx_n_s_width, __pyx_k_width, sizeof(__pyx_k_width), 0, 0, 1, 1},
+ {&__pyx_n_s_x, __pyx_k_x, sizeof(__pyx_k_x), 0, 0, 1, 1},
+@@ -10838,7 +10838,7 @@ static int __Pyx_InitCachedBuiltins(void) {
+ __pyx_builtin_range = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_range) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 152; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+ __pyx_builtin_Exception = __Pyx_GetBuiltinName(__pyx_n_s_Exception); if (!__pyx_builtin_Exception) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 98; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+ __pyx_builtin_ord = __Pyx_GetBuiltinName(__pyx_n_s_ord); if (!__pyx_builtin_ord) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 175; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+- __pyx_builtin_unichr = __Pyx_GetBuiltinName(__pyx_n_s_unichr); if (!__pyx_builtin_unichr) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 395; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
++ __pyx_builtin_chr = __Pyx_GetBuiltinName(__pyx_n_s_chr); if (!__pyx_builtin_chr) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 395; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+ return 0;
+ __pyx_L1_error:;
+ return -1;
diff --git a/module/generate_linebreak.py b/module/generate_linebreak.py
index 670adb7..8914199 100644
--- a/module/generate_linebreak.py
@@ -1113,13 +1240,15 @@ index 9935b29..5b2e3b5 100644
for position, target in edits:
output += data[consumed:position]
diff --git a/renpy/ast.py b/renpy/ast.py
-index ec2cbf5..78499e2 100644
+index ec2cbf5..286c54a 100644
--- a/renpy/ast.py
+++ b/renpy/ast.py
-@@ -31,6 +31,7 @@ import renpy.display
+@@ -30,7 +30,8 @@ import renpy.display
+
import re
import time
- import md5
+-import md5
++import hashlib
+import collections
def statement_name(name):
@@ -1168,6 +1297,15 @@ index ec2cbf5..78499e2 100644
class PyCode(object):
+@@ -261,7 +262,7 @@ class PyCode(object):
+ if isinstance(code, renpy.python.ast.AST): #@UndefinedVariable
+ code = renpy.python.ast.dump(code) #@UndefinedVariable
+
+- self.hash = chr(renpy.bytecode_version) + md5.md5(repr(self.location) + code.encode("utf-8")).digest()
++ self.hash = chr(renpy.bytecode_version) + hashlib.md5(repr(self.location) + code.encode("utf-8")).digest()
+ return self.hash
+
+
@@ -291,7 +292,7 @@ class Scry(object):
def __getattr__(self, name):
return None
@@ -1671,7 +1809,7 @@ index bf959b5..9ccce1c 100644
try:
diff --git a/renpy/bootstrap.py b/renpy/bootstrap.py
-index 9dbe2e0..a86088a 100644
+index 9dbe2e0..285e571 100644
--- a/renpy/bootstrap.py
+++ b/renpy/bootstrap.py
@@ -64,8 +64,8 @@ def extra_imports():
@@ -1707,7 +1845,7 @@ index 9dbe2e0..a86088a 100644
del os.environ["SDL_VIDEODRIVER"]
- renpy_base = unicode(renpy_base, FSENCODING, "replace")
-+ renpy_base = str(renpy_base, FSENCODING, "replace")
++ renpy_base = renpy_base.encode(FSENCODING, "replace").decode(FSENCODING, "replace")
# If environment.txt exists, load it into the os.environ dictionary.
if os.path.exists(renpy_base + "/environment.txt"):
@@ -3970,7 +4108,7 @@ index 2201010..8e81dd2 100644
rv = _MultiPersistent()
diff --git a/renpy/pyanalysis.py b/renpy/pyanalysis.py
-index f5267bb..81f17a7 100644
+index f5267bb..041ea8d 100644
--- a/renpy/pyanalysis.py
+++ b/renpy/pyanalysis.py
@@ -19,11 +19,6 @@
@@ -3994,6 +4132,15 @@ index f5267bb..81f17a7 100644
# The set of names that should be treated as constants.
always_constants = { 'True', 'False', 'None' }
+@@ -45,7 +40,7 @@ pure_functions = {
+ "getattr", "globals", "hasattr", "hash", "hex", "int", "isinstance",
+ "len", "list", "long", "map", "max", "min", "oct", "ord", "pow",
+ "range", "reduce", "repr", "round", "set", "sorted",
+- "str", "sum", "tuple", "unichr", "unicode", "vars", "zip",
++ "str", "sum", "tuple", "vars", "zip",
+
+ # enumerator and reversed return iterators at the moment.
+
@@ -137,7 +132,7 @@ def pure(fn):
name = fn
@@ -4013,7 +4160,7 @@ index f5267bb..81f17a7 100644
return False
diff --git a/renpy/python.py b/renpy/python.py
-index 22e7405..c408ad4 100644
+index 22e7405..22f5ecb 100644
--- a/renpy/python.py
+++ b/renpy/python.py
@@ -30,7 +30,6 @@ import marshal
@@ -4138,7 +4285,23 @@ index 22e7405..c408ad4 100644
if e.lineno is not None:
e.lineno += line_offset
-@@ -590,7 +589,7 @@ class RevertableList(list):
+@@ -558,7 +557,6 @@ class RevertableList(list):
+ list.__init__(self, *args)
+
+ __delitem__ = mutator(list.__delitem__)
+- __delslice__ = mutator(list.__delslice__)
+ __setitem__ = mutator(list.__setitem__)
+ __iadd__ = mutator(list.__iadd__)
+ __imul__ = mutator(list.__imul__)
+@@ -577,7 +575,6 @@ class RevertableList(list):
+ return newmethod
+
+ __add__ = wrapper(list.__add__)
+- __getslice__ = wrapper(list.__getslice__)
+ __mul__ = wrapper(list.__mul__)
+ __rmul__ = wrapper(list.__rmul__)
+
+@@ -590,7 +587,7 @@ class RevertableList(list):
self[:] = old
def revertable_range(*args):
@@ -4147,7 +4310,7 @@ index 22e7405..c408ad4 100644
def revertable_sorted(*args, **kwargs):
return RevertableList(sorted(*args, **kwargs))
-@@ -630,7 +629,7 @@ class RevertableDict(dict):
+@@ -630,7 +627,7 @@ class RevertableDict(dict):
return rv
def get_rollback(self):
@@ -4156,7 +4319,99 @@ index 22e7405..c408ad4 100644
def rollback(self, old):
self.clear()
-@@ -869,15 +868,15 @@ class Rollback(renpy.object.Object):
+@@ -638,7 +635,7 @@ class RevertableDict(dict):
+ for k, v in old:
+ self[k] = v
+
+-class RevertableSet(sets.Set):
++class RevertableSet(set):
+
+ def __init__(self, *args):
+ log = renpy.game.log
+@@ -646,44 +643,43 @@ class RevertableSet(sets.Set):
+ if log is not None:
+ log.mutated[id(self)] = None
+
+- sets.Set.__init__(self, *args)
+-
+- __iand__ = mutator(sets.Set.__iand__)
+- __ior__ = mutator(sets.Set.__ior__)
+- __isub__ = mutator(sets.Set.__isub__)
+- __ixor__ = mutator(sets.Set.__ixor__)
+- add = mutator(sets.Set.add)
+- clear = mutator(sets.Set.clear)
+- difference_update = mutator(sets.Set.difference_update)
+- discard = mutator(sets.Set.discard)
+- intersection_update = mutator(sets.Set.intersection_update)
+- pop = mutator(sets.Set.pop)
+- remove = mutator(sets.Set.remove)
+- symmetric_difference_update = mutator(sets.Set.symmetric_difference_update)
+- union_update = mutator(sets.Set.union_update)
+- update = mutator(sets.Set.update)
++ set.__init__(self, *args)
++
++ __iand__ = mutator(set.__iand__)
++ __ior__ = mutator(set.__ior__)
++ __isub__ = mutator(set.__isub__)
++ __ixor__ = mutator(set.__ixor__)
++ add = mutator(set.add)
++ clear = mutator(set.clear)
++ difference_update = mutator(set.difference_update)
++ discard = mutator(set.discard)
++ intersection_update = mutator(set.intersection_update)
++ pop = mutator(set.pop)
++ remove = mutator(set.remove)
++ symmetric_difference_update = mutator(set.symmetric_difference_update)
++ union = mutator(set.union)
++ update = mutator(set.update)
+
+ def wrapper(method): # E0213 @NoSelf
+ def newmethod(*args, **kwargs):
+ rv = method(*args, **kwargs) # E1102
+- if isinstance(rv, sets.Set):
++ if isinstance(rv, set):
+ return RevertableSet(rv)
+ else:
+ return rv
+
+ return newmethod
+
+- __and__ = wrapper(sets.Set.__and__)
+- __copy__ = wrapper(sets.Set.__copy__)
+- __deepcopy__ = wrapper(sets.Set.__deepcopy__)
+- __sub__ = wrapper(sets.Set.__sub__)
+- __xor__ = wrapper(sets.Set.__xor__)
+- __or__ = wrapper(sets.Set.__or__)
+- copy = wrapper(sets.Set.copy)
+- difference = wrapper(sets.Set.difference)
+- intersection = wrapper(sets.Set.intersection)
+- symmetric_difference = wrapper(sets.Set.symmetric_difference)
+- union = wrapper(sets.Set.union)
++ __and__ = wrapper(set.__and__)
++ copy = wrapper(set.copy)
++ __sub__ = wrapper(set.__sub__)
++ __xor__ = wrapper(set.__xor__)
++ __or__ = wrapper(set.__or__)
++ copy = wrapper(set.copy)
++ difference = wrapper(set.difference)
++ intersection = wrapper(set.intersection)
++ symmetric_difference = wrapper(set.symmetric_difference)
++ union = wrapper(set.union)
+
+ del wrapper
+
+@@ -691,8 +687,8 @@ class RevertableSet(sets.Set):
+ return list(self)
+
+ def rollback(self, old):
+- sets.Set.clear(self)
+- sets.Set.update(self, old)
++ set.clear(self)
++ set.update(self, old)
+
+
+ class RevertableObject(object):
+@@ -869,15 +865,15 @@ class Rollback(renpy.object.Object):
# Add objects reachable from the stores. (Objects that might be
# unreachable at the moment.)
@@ -4175,7 +4430,7 @@ index 22e7405..c408ad4 100644
reached(v, reachable, wait)
# Add in objects reachable through displayables.
-@@ -892,7 +891,7 @@ class Rollback(renpy.object.Object):
+@@ -892,7 +888,7 @@ class Rollback(renpy.object.Object):
reached(rb, reachable, wait)
else:
if renpy.config.debug:
@@ -4184,7 +4439,7 @@ index 22e7405..c408ad4 100644
pass
-@@ -911,12 +910,12 @@ class Rollback(renpy.object.Object):
+@@ -911,12 +907,12 @@ class Rollback(renpy.object.Object):
if roll is not None:
obj.rollback(roll)
@@ -4199,7 +4454,7 @@ index 22e7405..c408ad4 100644
if value is deleted:
if name in store:
del store[name]
-@@ -1045,7 +1044,7 @@ class RollbackLog(renpy.object.Object):
+@@ -1045,7 +1041,7 @@ class RollbackLog(renpy.object.Object):
self.rolled_forward = False
# Reset the point that changes are relative to.
@@ -4208,7 +4463,7 @@ index 22e7405..c408ad4 100644
sd.begin()
def complete(self):
-@@ -1059,18 +1058,18 @@ class RollbackLog(renpy.object.Object):
+@@ -1059,18 +1055,18 @@ class RollbackLog(renpy.object.Object):
# Update self.current.stores with the changes from each store.
# Also updates .ever_been_changed.
@@ -4230,7 +4485,7 @@ index 22e7405..c408ad4 100644
if v is None:
continue
-@@ -1102,7 +1101,7 @@ class RollbackLog(renpy.object.Object):
+@@ -1102,7 +1098,7 @@ class RollbackLog(renpy.object.Object):
rv = { }
@@ -4239,7 +4494,7 @@ index 22e7405..c408ad4 100644
for name in sd.ever_been_changed:
if name in sd:
rv[store_name + "." + name] = sd[name]
-@@ -1300,7 +1299,7 @@ class RollbackLog(renpy.object.Object):
+@@ -1300,7 +1296,7 @@ class RollbackLog(renpy.object.Object):
# Otherwise, just give up.
@@ -4248,7 +4503,7 @@ index 22e7405..c408ad4 100644
revlog.reverse()
self.log = self.log + revlog
-@@ -1422,7 +1421,7 @@ class RollbackLog(renpy.object.Object):
+@@ -1422,7 +1418,7 @@ class RollbackLog(renpy.object.Object):
clean_stores()
renpy.translation.init_translation()
@@ -4257,7 +4512,7 @@ index 22e7405..c408ad4 100644
if "." in name:
store_name, name = name.rsplit(".", 1)
-@@ -1458,7 +1457,7 @@ def py_exec_bytecode(bytecode, hide=False, globals=None, locals=None, store="sto
+@@ -1458,7 +1454,7 @@ def py_exec_bytecode(bytecode, hide=False, globals=None, locals=None, store="sto
if locals is None:
locals = globals #@ReservedAssignment
@@ -4266,7 +4521,7 @@ index 22e7405..c408ad4 100644
def py_exec(source, hide=False, store=None):
-@@ -1471,7 +1470,7 @@ def py_exec(source, hide=False, store=None):
+@@ -1471,7 +1467,7 @@ def py_exec(source, hide=False, store=None):
else:
locals = store #@ReservedAssignment
@@ -4275,7 +4530,7 @@ index 22e7405..c408ad4 100644
def py_eval_bytecode(bytecode, globals=None, locals=None): #@ReservedAssignment
-@@ -1485,7 +1484,7 @@ def py_eval_bytecode(bytecode, globals=None, locals=None): #@ReservedAssignment
+@@ -1485,7 +1481,7 @@ def py_eval_bytecode(bytecode, globals=None, locals=None): #@ReservedAssignment
return eval(bytecode, globals, locals)
def py_eval(code, globals=None, locals=None): #@ReservedAssignment
@@ -4284,7 +4539,7 @@ index 22e7405..c408ad4 100644
code = py_compile(code, 'eval')
return py_eval_bytecode(code, globals, locals)
-@@ -1505,7 +1504,7 @@ def raise_at_location(e, loc):
+@@ -1505,7 +1501,7 @@ def raise_at_location(e, loc):
code = compile(node, filename, 'exec')
# PY3 - need to change to exec().
@@ -4293,7 +4548,7 @@ index 22e7405..c408ad4 100644
# This was used to proxy accesses to the store. Now it's kept around to deal
-@@ -1524,18 +1523,18 @@ class StoreProxy(object):
+@@ -1524,18 +1520,18 @@ class StoreProxy(object):
# Code for pickling bound methods.
def method_pickle(method):
@@ -4365,10 +4620,17 @@ index 4a537eb..b393a53 100644
raise renpy.parser.ParseError(
filename,
diff --git a/renpy/script.py b/renpy/script.py
-index 61d6b5f..8773787 100644
+index 61d6b5f..98a6857 100644
--- a/renpy/script.py
+++ b/renpy/script.py
-@@ -33,7 +33,7 @@ import marshal
+@@ -27,13 +27,13 @@ import renpy
+ import os
+ import imp
+ import difflib
+-import md5
++import hashlib
+ import time
+ import marshal
import struct
import zlib
@@ -4386,7 +4648,17 @@ index 61d6b5f..8773787 100644
else:
self.key = None
-@@ -195,7 +195,7 @@ class Script(object):
+@@ -130,7 +130,8 @@ class Script(object):
+
+ self.serial = 0
+
+- self.digest = md5.md5(renpy.version_only)
++ self.digest = hashlib.md5(renpy.version_only)
++ self.md5 = hashlib.md5
+
+ self.loaded_rpy = False
+ self.backup_list = [ ]
+@@ -195,7 +196,7 @@ class Script(object):
continue
try:
@@ -4395,7 +4667,7 @@ index 61d6b5f..8773787 100644
except:
pass
-@@ -402,7 +402,7 @@ class Script(object):
+@@ -402,7 +403,7 @@ class Script(object):
name = node.name
if name in self.namemap:
@@ -4404,7 +4676,7 @@ index 61d6b5f..8773787 100644
bad_name = name
bad_node = node
old_node = self.namemap[name]
-@@ -566,7 +566,7 @@ class Script(object):
+@@ -566,7 +567,7 @@ class Script(object):
self.assign_names(stmts, fullfn)
try:
@@ -4413,7 +4685,16 @@ index 61d6b5f..8773787 100644
self.write_rpyc_header(f)
self.write_rpyc_data(f, 1, dumps((data, stmts), 2))
-@@ -615,7 +615,7 @@ class Script(object):
+@@ -579,7 +580,7 @@ class Script(object):
+ self.write_rpyc_data(f, 2, dumps((data, stmts), 2))
+
+ with open(fullfn, "rU") as fullf:
+- rpydigest = md5.md5(fullf.read()).digest()
++ rpydigest = hashlib.md5(fullf.read()).digest()
+
+ self.write_rpyc_md5(f, rpydigest)
+
+@@ -615,7 +616,7 @@ class Script(object):
return None, None
if data is None:
@@ -4422,7 +4703,37 @@ index 61d6b5f..8773787 100644
return None, None
if not isinstance(data, dict):
-@@ -698,11 +698,11 @@ class Script(object):
+@@ -652,8 +653,8 @@ class Script(object):
+ raise Exception("Could not load from archive %s." % (lastfn,))
+
+ f = renpy.loader.load(fn + compiled)
+- f.seek(-md5.digest_size, 2)
+- digest = f.read(md5.digest_size)
++ f.seek(-self.md5.digest_size, 2)
++ digest = f.read(self.md5.digest_size)
+ f.close()
+
+ else:
+@@ -667,15 +668,15 @@ class Script(object):
+
+ if os.path.exists(rpyfn):
+ with open(rpyfn, "rU") as f:
+- rpydigest = md5.md5(f.read()).digest()
++ rpydigest = hashlib.md5(f.read()).digest()
+ else:
+ rpydigest = None
+
+ try:
+ if os.path.exists(rpycfn):
+ with open(rpycfn, "rb") as f:
+- f.seek(-md5.digest_size, 2)
+- rpycdigest = f.read(md5.digest_size)
++ f.seek(-self.md5.digest_size, 2)
++ rpycdigest = f.read(self.md5.digest_size)
+ else:
+ rpycdigest = None
+ except:
+@@ -698,11 +699,11 @@ class Script(object):
data, stmts = self.load_file(dir, fn + compiled)
if data is None:
@@ -4436,7 +4747,7 @@ index 61d6b5f..8773787 100644
raise
pass
-@@ -781,7 +781,7 @@ class Script(object):
+@@ -781,7 +782,7 @@ class Script(object):
elif i.mode == 'eval':
code = renpy.python.py_compile_eval_bytecode(i.source, filename=i.location[0], lineno=i.location[1])
@@ -4484,7 +4795,7 @@ index 92994d0..6818c59 100644
new_stmts.append(i)
diff --git a/renpy/sl2/slast.py b/renpy/sl2/slast.py
-index defd86f..37022db 100644
+index defd86f..78c2f01 100644
--- a/renpy/sl2/slast.py
+++ b/renpy/sl2/slast.py
@@ -30,7 +30,7 @@
@@ -4496,7 +4807,17 @@ index defd86f..37022db 100644
import zlib
import renpy.display
-@@ -1398,7 +1398,7 @@ class SLFor(SLBlock):
+@@ -43,7 +43,8 @@ from renpy.display.predict import displayable as predict_displayable
+
+ from renpy.python import py_eval_bytecode
+ from renpy.pyanalysis import Analysis, NOT_CONST, GLOBAL_CONST, ccache
+-import md5
++import hashlib
++md5 = hashlib.md5
+
+ # This file contains the abstract syntax tree for a screen language
+ # screen.
+@@ -1398,7 +1399,7 @@ class SLFor(SLBlock):
if c is None:
return
@@ -4505,7 +4826,7 @@ index defd86f..37022db 100644
for i in self.children:
i.copy_on_change(child_cache)
-@@ -1422,7 +1422,7 @@ class SLPython(SLNode):
+@@ -1422,7 +1423,7 @@ class SLPython(SLNode):
analysis.python(self.code.source)
def execute(self, context):
@@ -4854,6 +5175,22 @@ index 0d78ddf..748dbbd 100644
new_tokens.append((kind2, text2))
+diff --git a/renpy/text/textsupport.pyx b/renpy/text/textsupport.pyx
+index feabbc3..5b31613 100644
+--- a/renpy/text/textsupport.pyx
++++ b/renpy/text/textsupport.pyx
+@@ -392,9 +392,9 @@ def linebreak_debug(list glyphs):
+ if g.split == SPLIT_INSTEAD:
+ rv += "|"
+ elif g.split == SPLIT_BEFORE:
+- rv += "[" + unichr(g.character)
++ rv += "[" + chr(g.character)
+ else:
+- rv += unichr(g.character)
++ rv += chr(g.character)
+
+ return rv
+
diff --git a/renpy/translation.py b/renpy/translation.py
index 3b62fee..0cd1150 100644
--- a/renpy/translation.py
@@ -5022,10 +5359,18 @@ index 464440b..26ee95d 100644
if isinstance(v, Wrapper):
v.name = k
diff --git a/renpy/warp.py b/renpy/warp.py
-index 41bd1be..a81102a 100644
+index 41bd1be..8675c4e 100644
--- a/renpy/warp.py
+++ b/renpy/warp.py
-@@ -56,7 +56,7 @@ def warp():
+@@ -24,7 +24,6 @@
+ # location.
+
+ import renpy
+-import sets
+
+ warp_spec = None
+
+@@ -56,7 +55,7 @@ def warp():
prev = { }
@@ -5034,7 +5379,7 @@ index 41bd1be..a81102a 100644
seenset = sets.Set(workset)
# This is called to indicate that next can be executed following node.
-@@ -100,7 +100,7 @@ def warp():
+@@ -100,7 +99,7 @@ def warp():
add(n, n.get_next())
elif getattr(n, 'next', None) is not None: