Compare commits
14 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 06cf061aef | |||
| f99b288ce9 | |||
| a1ec9d6301 | |||
| 2b1e907db9 | |||
| 5df50b037b | |||
| 61aed4271f | |||
| 0da26cd7a0 | |||
| 04d0e3f959 | |||
| 7f9f995782 | |||
| f540d1d450 | |||
| a34657d394 | |||
| 265dc3dab8 | |||
| 05af3ba5f3 | |||
| be57060071 |
@@ -386,7 +386,7 @@ init python:
|
||||
reporter = distribute.TextReporter()
|
||||
rapt_interface = rapt.interface.Interface()
|
||||
|
||||
distribute.Distributor(project.current,
|
||||
distribute.Distributor(p,
|
||||
reporter=reporter,
|
||||
packages=[ 'android' ],
|
||||
build_update=False,
|
||||
|
||||
@@ -162,6 +162,7 @@ screen preferences:
|
||||
|
||||
textbutton _("Hardware rendering") style "l_checkbox" action ToggleField(persistent, "gl_enable")
|
||||
textbutton _("Show templates") style "l_checkbox" action ToggleField(persistent, "show_templates")
|
||||
textbutton _("Large fonts") style "l_checkbox" action [ ToggleField(persistent, "large_print"), renpy.utter_restart ]
|
||||
|
||||
if renpy.windows:
|
||||
textbutton _("Console output") style "l_checkbox" action ToggleField(persistent, "windows_console")
|
||||
|
||||
@@ -314,7 +314,8 @@ init python in project:
|
||||
"""
|
||||
|
||||
rv = [ ]
|
||||
rv.extend(i for i, isdir in util.walk(self.path) if (not isdir) and (i.endswith(".rpy") or i.endswith(".rpym")) )
|
||||
rv.extend(i for i, isdir in util.walk(self.path)
|
||||
if (not isdir) and (i.endswith(".rpy") or i.endswith(".rpym")) and (not i.startswith("tmp/")) )
|
||||
|
||||
return rv
|
||||
|
||||
|
||||
+26
-13
@@ -66,10 +66,23 @@ init -1 python:
|
||||
# FONTS/WEIGHTS
|
||||
LIGHT = "Roboto-Light.ttf"
|
||||
REGULAR = "Roboto-Regular.ttf"
|
||||
DARK = "Roboto-Medium.ttf"
|
||||
|
||||
if persistent.large_print:
|
||||
LIGHT = REGULAR
|
||||
|
||||
init 1 python:
|
||||
|
||||
def size(n):
|
||||
"""
|
||||
Adjusts the font size if we're in large-print mode.
|
||||
"""
|
||||
|
||||
if persistent.large_print and n < 18:
|
||||
n = 18
|
||||
|
||||
return n
|
||||
|
||||
|
||||
INDENT = 20
|
||||
HALF_INDENT = 10
|
||||
|
||||
@@ -103,7 +116,7 @@ init 1:
|
||||
color TEXT
|
||||
idle_color IDLE
|
||||
hover_color HOVER
|
||||
size 18
|
||||
size size(18)
|
||||
|
||||
style l_text is l_default
|
||||
|
||||
@@ -115,7 +128,7 @@ init 1:
|
||||
# A small button, used at the bottom of the screen.
|
||||
style l_link is l_default
|
||||
style l_link_text is l_default:
|
||||
size 14
|
||||
size size(14)
|
||||
font LIGHT
|
||||
|
||||
# Action buttons on the bottom of the screen.
|
||||
@@ -126,7 +139,7 @@ init 1:
|
||||
right_margin 10 + INDENT
|
||||
|
||||
style l_right_button_text is l_default:
|
||||
size 30
|
||||
size size(30)
|
||||
|
||||
style l_left_button is l_right_button:
|
||||
xalign 0.0
|
||||
@@ -158,7 +171,7 @@ init 1:
|
||||
background SEPARATOR
|
||||
|
||||
style l_label_text is l_default:
|
||||
size 24
|
||||
size size(24)
|
||||
xpos INDENT
|
||||
yoffset 6
|
||||
|
||||
@@ -172,7 +185,7 @@ init 1:
|
||||
style l_label_small_text is l_default:
|
||||
xpos INDENT
|
||||
yoffset 6
|
||||
size 20
|
||||
size size(20)
|
||||
|
||||
# Alternate labels. This nests inside an l_label, and gives a button
|
||||
# or label that's nested inside another label.
|
||||
@@ -184,17 +197,17 @@ init 1:
|
||||
right_margin INDENT
|
||||
|
||||
style l_alternate_text is l_default:
|
||||
size 14
|
||||
size size(14)
|
||||
font LIGHT
|
||||
text_align 1.0
|
||||
|
||||
style l_small_button is l_button
|
||||
|
||||
style l_small_button_text is l_button_text:
|
||||
size 14
|
||||
size size(14)
|
||||
|
||||
style l_small_text is l_text:
|
||||
size 14
|
||||
size size(14)
|
||||
|
||||
# Indents its contents.
|
||||
style l_indent is l_default:
|
||||
@@ -262,7 +275,7 @@ init 1:
|
||||
yoffset 12
|
||||
|
||||
style l_info_label_text is l_default:
|
||||
size 36
|
||||
size size(36)
|
||||
|
||||
style l_info_text is l_default:
|
||||
xalign 0.5
|
||||
@@ -292,11 +305,11 @@ init 1:
|
||||
top_margin 3
|
||||
|
||||
style l_navigation_button_text is l_button_text:
|
||||
size 14
|
||||
size size(14)
|
||||
font REGULAR
|
||||
|
||||
style l_navigation_text is l_text:
|
||||
size 12
|
||||
size size(14)
|
||||
font LIGHT
|
||||
color TEXT
|
||||
|
||||
@@ -324,7 +337,7 @@ init 1:
|
||||
background PROJECTS_WINDOW
|
||||
|
||||
style hyperlink_text:
|
||||
size 18
|
||||
size size(18)
|
||||
font LIGHT
|
||||
color IDLE
|
||||
hover_color HOVER
|
||||
|
||||
+57
-49
@@ -119,7 +119,7 @@ typedef struct VideoState {
|
||||
ReSampleContext *reformat_ctx;
|
||||
#endif
|
||||
int resample_frac;
|
||||
|
||||
|
||||
int show_audio; /* if true, display audio samples */
|
||||
int16_t sample_array[SAMPLE_ARRAY_SIZE];
|
||||
int sample_array_index;
|
||||
@@ -140,7 +140,7 @@ typedef struct VideoState {
|
||||
SDL_mutex *pictq_mutex;
|
||||
SDL_cond *pictq_cond;
|
||||
|
||||
|
||||
|
||||
// These are used to notify the parse thread when it's time to die.
|
||||
SDL_mutex *quit_mutex;
|
||||
SDL_cond *quit_cond;
|
||||
@@ -148,7 +148,7 @@ typedef struct VideoState {
|
||||
// QETimer *video_timer;
|
||||
SDL_RWops *rwops;
|
||||
AVIOContext *io_context;
|
||||
|
||||
|
||||
int width, height, xleft, ytop;
|
||||
|
||||
double audio_callback_time;
|
||||
@@ -166,12 +166,15 @@ typedef struct VideoState {
|
||||
|
||||
// The amount of audio we've played, in samples.
|
||||
unsigned int audio_played;
|
||||
|
||||
|
||||
double start_time;
|
||||
|
||||
// Should we force the display of the current video frame?
|
||||
int first_frame;
|
||||
|
||||
// The PTS of the first frame.
|
||||
double first_frame_pts;
|
||||
|
||||
#ifdef HAS_RESAMPLE
|
||||
// The audio frame, and the audio resample context.
|
||||
enum AVSampleFormat sdl_sample_fmt;
|
||||
@@ -218,7 +221,7 @@ static int audio_sample_rate;
|
||||
|
||||
/* ByteIOContext <-> SDL_RWops mapping. */
|
||||
static int rwops_read(void *opaque, uint8_t *buf, int buf_size) {
|
||||
SDL_RWops *rw = (SDL_RWops *) opaque;
|
||||
SDL_RWops *rw = (SDL_RWops *) opaque;
|
||||
|
||||
int rv = rw->read(rw, buf, 1, buf_size);
|
||||
return rv;
|
||||
@@ -257,7 +260,7 @@ static AVIOContext *rwops_open(SDL_RWops *rw) {
|
||||
rwops_write,
|
||||
rwops_seek);
|
||||
|
||||
return rv;
|
||||
return rv;
|
||||
}
|
||||
|
||||
static void rwops_close(SDL_RWops *rw) {
|
||||
@@ -373,7 +376,7 @@ static int packet_queue_get(PacketQueue *q, AVPacket *pkt, int block)
|
||||
break;
|
||||
} else if (q->end_request) {
|
||||
ret = -1;
|
||||
break;
|
||||
break;
|
||||
} else {
|
||||
SDL_CondWait(q->cond, q->mutex);
|
||||
}
|
||||
@@ -392,7 +395,7 @@ static void video_image_display(VideoState *is)
|
||||
SDL_Rect rect;
|
||||
|
||||
static struct SwsContext *img_convert_ctx;
|
||||
|
||||
|
||||
vp = &is->pictq[is->pictq_rindex];
|
||||
if (vp->surf) {
|
||||
/* XXX: use variable in the frame */
|
||||
@@ -405,7 +408,7 @@ static void video_image_display(VideoState *is)
|
||||
if (aspect_ratio <= 0.0)
|
||||
aspect_ratio = 1.0;
|
||||
aspect_ratio *= (float)is->video_st->codec->width / is->video_st->codec->height;
|
||||
|
||||
|
||||
/* XXX: we suppose the screen has a 1.0 pixel ratio */
|
||||
height = is->height;
|
||||
width = ((int)rint(height * aspect_ratio)) & ~1;
|
||||
@@ -424,7 +427,7 @@ static void video_image_display(VideoState *is)
|
||||
} else {
|
||||
is->no_background = 0;
|
||||
}
|
||||
|
||||
|
||||
rect.x = is->xleft + x;
|
||||
rect.y = is->ytop + y;
|
||||
rect.w = width;
|
||||
@@ -445,7 +448,7 @@ static void video_image_display(VideoState *is)
|
||||
|
||||
pict.data[0] = &((uint8_t *)vp->surf->pixels)[rect.y * vp->surf->pitch + rect.x * 4];
|
||||
pict.linesize[0] = vp->surf->pitch;
|
||||
|
||||
|
||||
sws_scale(
|
||||
img_convert_ctx,
|
||||
(const uint8_t * const *) vp->frame->data,
|
||||
@@ -453,9 +456,9 @@ static void video_image_display(VideoState *is)
|
||||
0,
|
||||
is->video_st->codec->height,
|
||||
pict.data,
|
||||
pict.linesize);
|
||||
pict.linesize);
|
||||
}
|
||||
|
||||
|
||||
} else {
|
||||
}
|
||||
}
|
||||
@@ -531,7 +534,7 @@ static int video_refresh(void *opaque)
|
||||
{
|
||||
VideoState *is = opaque;
|
||||
VideoPicture *vp;
|
||||
|
||||
|
||||
double delay;
|
||||
|
||||
if (!is->video_st) {
|
||||
@@ -551,7 +554,12 @@ static int video_refresh(void *opaque)
|
||||
is->video_current_pts = vp->pts;
|
||||
is->video_current_pts_time = av_gettime();
|
||||
|
||||
if (is->first_frame) {
|
||||
is->first_frame_pts = vp->pts;
|
||||
}
|
||||
|
||||
delay = get_audio_clock(is, 0) - vp->pts;
|
||||
delay += is->first_frame_pts;
|
||||
|
||||
/* The video is ahead of the audio. */
|
||||
if (delay < 0 && !is->first_frame) {
|
||||
@@ -607,13 +615,13 @@ static void alloc_picture(void *opaque, PyObject *pysurf)
|
||||
}
|
||||
|
||||
ffpy_needs_alloc = 0;
|
||||
|
||||
|
||||
surf = PySurface_AsSurface(pysurf);
|
||||
is->width = surf->w;
|
||||
is->height = surf->h;
|
||||
|
||||
vp = &is->pictq[is->pictq_windex];
|
||||
vp->surf = surf;
|
||||
vp->surf = surf;
|
||||
vp->width = is->video_st->codec->width;
|
||||
vp->height = is->video_st->codec->height;
|
||||
|
||||
@@ -649,7 +657,7 @@ static int queue_picture(VideoState *is, AVFrame *src_frame, double pts)
|
||||
AVPicture pict;
|
||||
static struct SwsContext *img_convert_ctx;
|
||||
#endif
|
||||
|
||||
|
||||
/* wait until we have space to put a new picture */
|
||||
SDL_LockMutex(is->pictq_mutex);
|
||||
while (is->pictq_size >= VIDEO_PICTURE_QUEUE_SIZE &&
|
||||
@@ -696,7 +704,7 @@ static int queue_picture(VideoState *is, AVFrame *src_frame, double pts)
|
||||
SDL_LockMutex(is->pictq_mutex);
|
||||
is->pictq_size++;
|
||||
SDL_UnlockMutex(is->pictq_mutex);
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -924,7 +932,7 @@ static int audio_decode_frame(VideoState *is, double *pts_ptr)
|
||||
if (is->audio_duration) {
|
||||
int len = data_size / 4;
|
||||
int maxlen = is->audio_duration - is->audio_played;
|
||||
|
||||
|
||||
if (len > maxlen) {
|
||||
len = maxlen;
|
||||
}
|
||||
@@ -1175,12 +1183,12 @@ int ffpy_audio_decode(struct VideoState *is, Uint8 *stream, int len)
|
||||
if (is->started) {
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
SDL_Delay(10);
|
||||
}
|
||||
|
||||
|
||||
is->audio_callback_time = get_time();
|
||||
|
||||
|
||||
while (len > 0) {
|
||||
if (is->audio_buf_index >= is->audio_buf_size) {
|
||||
|
||||
@@ -1204,7 +1212,7 @@ int ffpy_audio_decode(struct VideoState *is, Uint8 *stream, int len)
|
||||
|
||||
rv += len1;
|
||||
}
|
||||
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
@@ -1215,11 +1223,11 @@ static int stream_component_open(VideoState *is, int stream_index)
|
||||
AVCodecContext *enc;
|
||||
AVCodec *codec;
|
||||
int err;
|
||||
|
||||
|
||||
if (stream_index < 0 || stream_index >= ic->nb_streams)
|
||||
return -1;
|
||||
enc = ic->streams[stream_index]->codec;
|
||||
|
||||
|
||||
/* prepare audio output */
|
||||
if (enc->codec_type == AVMEDIA_TYPE_AUDIO) {
|
||||
if (enc->channels > 0) {
|
||||
@@ -1241,19 +1249,19 @@ static int stream_component_open(VideoState *is, int stream_index)
|
||||
enc->error_concealment= error_concealment;
|
||||
|
||||
// set_context_opts(enc, avctx_opts[enc->codec_type], 0);
|
||||
|
||||
|
||||
if (!codec) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
err = avcodec_open2(enc, codec, NULL);
|
||||
|
||||
|
||||
if (err < 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
is->audio_hw_buf_size = 2048;
|
||||
|
||||
|
||||
ic->streams[stream_index]->discard = AVDISCARD_DEFAULT;
|
||||
switch(enc->codec_type) {
|
||||
case AVMEDIA_TYPE_AUDIO:
|
||||
@@ -1336,7 +1344,7 @@ static void stream_component_close(VideoState *is, int stream_index)
|
||||
SDL_LockMutex(codec_mutex);
|
||||
avcodec_close(enc);
|
||||
SDL_UnlockMutex(codec_mutex);
|
||||
|
||||
|
||||
switch(enc->codec_type) {
|
||||
case AVMEDIA_TYPE_AUDIO:
|
||||
is->audio_st = NULL;
|
||||
@@ -1362,9 +1370,9 @@ static int decode_thread(void *arg)
|
||||
int err, i, ret, video_index, audio_index;
|
||||
AVPacket pkt1, *pkt = &pkt1;
|
||||
int codecs_locked = 0;
|
||||
|
||||
|
||||
// url_set_interrupt_cb(decode_interrupt_cb);
|
||||
|
||||
|
||||
video_index = -1;
|
||||
audio_index = -1;
|
||||
is->video_stream = -1;
|
||||
@@ -1392,7 +1400,7 @@ static int decode_thread(void *arg)
|
||||
NULL);
|
||||
|
||||
// printf("Format name: %s\n", fmt->name);
|
||||
|
||||
|
||||
is->ic = ic;
|
||||
|
||||
if (err < 0) {
|
||||
@@ -1415,7 +1423,7 @@ static int decode_thread(void *arg)
|
||||
if(ic->pb)
|
||||
ic->pb->eof_reached= 0; //FIXME hack, ffplay maybe should not
|
||||
//use url_feof() to test for the end
|
||||
|
||||
|
||||
/* if seeking requested, we execute it */
|
||||
if (start_time != AV_NOPTS_VALUE) {
|
||||
int64_t timestamp;
|
||||
@@ -1450,7 +1458,7 @@ static int decode_thread(void *arg)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
if (show_status) {
|
||||
av_dump_format(ic, 0, is->filename, 0);
|
||||
}
|
||||
@@ -1471,7 +1479,7 @@ static int decode_thread(void *arg)
|
||||
} else {
|
||||
is->show_audio = 0;
|
||||
}
|
||||
|
||||
|
||||
if (is->video_stream < 0 && is->audio_stream < 0) {
|
||||
fprintf(stderr, "could not open codecs\n");
|
||||
ret = -1;
|
||||
@@ -1488,12 +1496,12 @@ static int decode_thread(void *arg)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
SDL_UnlockMutex(codec_mutex);
|
||||
codecs_locked = 0;
|
||||
|
||||
is->started = 1;
|
||||
|
||||
|
||||
for(;;) {
|
||||
|
||||
if (is->abort_request) {
|
||||
@@ -1528,7 +1536,7 @@ static int decode_thread(void *arg)
|
||||
}
|
||||
|
||||
eof:
|
||||
|
||||
|
||||
/* Request the end of the audio queue when we have no more
|
||||
bytes to decode. */
|
||||
if (is->audio_st) {
|
||||
@@ -1555,7 +1563,7 @@ fail:
|
||||
SDL_UnlockMutex(codec_mutex);
|
||||
codecs_locked = 0;
|
||||
}
|
||||
|
||||
|
||||
/* close each stream */
|
||||
if (is->audio_stream >= 0)
|
||||
stream_component_close(is, is->audio_stream);
|
||||
@@ -1565,14 +1573,14 @@ fail:
|
||||
avformat_close_input(&(is->ic));
|
||||
is->ic = NULL;
|
||||
}
|
||||
|
||||
|
||||
is->audio_stream = -1;
|
||||
is->video_stream = -1;
|
||||
|
||||
av_free(is->io_context->buffer);
|
||||
av_free(is->io_context);
|
||||
rwops_close(is->rwops);
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1586,7 +1594,7 @@ VideoState *ffpy_stream_open(SDL_RWops *rwops, const char *filename)
|
||||
|
||||
is->filename = strdup(filename);
|
||||
is->rwops = rwops;
|
||||
|
||||
|
||||
is->iformat = NULL;
|
||||
is->ytop = 0;
|
||||
is->xleft = 0;
|
||||
@@ -1597,7 +1605,7 @@ VideoState *ffpy_stream_open(SDL_RWops *rwops, const char *filename)
|
||||
|
||||
is->quit_mutex = SDL_CreateMutex();
|
||||
is->quit_cond = SDL_CreateCond();
|
||||
|
||||
|
||||
is->parse_tid = SDL_CreateThread(decode_thread, is);
|
||||
|
||||
is->first_frame = 1;
|
||||
@@ -1628,12 +1636,12 @@ void ffpy_stream_close(VideoState *is)
|
||||
av_free(vp->frame);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
SDL_DestroyMutex(is->pictq_mutex);
|
||||
SDL_DestroyCond(is->pictq_cond);
|
||||
SDL_DestroyMutex(is->quit_mutex);
|
||||
SDL_DestroyCond(is->quit_cond);
|
||||
|
||||
|
||||
free(is->filename);
|
||||
av_free(is);
|
||||
}
|
||||
@@ -1658,9 +1666,9 @@ void ffpy_init(int rate, int status) {
|
||||
ffpy_did_init = 1;
|
||||
|
||||
show_status = status;
|
||||
|
||||
|
||||
audio_sample_rate = rate;
|
||||
|
||||
|
||||
/* register all codecs, demux and protocols */
|
||||
avcodec_register_all();
|
||||
av_register_all();
|
||||
@@ -1670,7 +1678,7 @@ void ffpy_init(int rate, int status) {
|
||||
} else {
|
||||
av_log_set_level(AV_LOG_ERROR);
|
||||
}
|
||||
|
||||
|
||||
av_init_packet(&flush_pkt);
|
||||
flush_pkt.data = (unsigned char *) "FLUSH";
|
||||
|
||||
|
||||
+2
-2
@@ -40,10 +40,10 @@ except ImportError:
|
||||
vc_version = 0
|
||||
|
||||
# The tuple giving the version number.
|
||||
version_tuple = (6, 18, 0, vc_version)
|
||||
version_tuple = (6, 17, 7, vc_version)
|
||||
|
||||
# The name of this version.
|
||||
version_name = "TBD."
|
||||
version_name = "In This Decade..."
|
||||
|
||||
# A verbose string giving the version.
|
||||
version = "Ren'Py " + ".".join(str(i) for i in version_tuple)
|
||||
|
||||
@@ -130,6 +130,7 @@ init -1500 python in build:
|
||||
("text_overflow.txt", None),
|
||||
("dialogue.txt", None),
|
||||
("dialogue.tab", None),
|
||||
("profile_screen.txt", None),
|
||||
|
||||
("tmp/", None),
|
||||
("game/saves/", None),
|
||||
@@ -306,7 +307,7 @@ init -1500 python in build:
|
||||
package("linux", "tar.bz2", "linux renpy all", "Linux x86/x86_64")
|
||||
package("mac", "app-zip", "mac renpy all", "Macintosh x86")
|
||||
package("win", "zip", "windows renpy all", "Windows x86")
|
||||
package("android", "directory", "android all", hidden=True, update=False, dlc=True)
|
||||
package("android", "directory", "android renpy all", hidden=True, update=False, dlc=True)
|
||||
|
||||
# Data that we expect the user to set.
|
||||
|
||||
|
||||
@@ -102,7 +102,7 @@ init -1600 python:
|
||||
)
|
||||
|
||||
# Should we use the autoreload system?
|
||||
config.autoreload = True
|
||||
config.autoreload = False
|
||||
|
||||
init -1600 python:
|
||||
|
||||
|
||||
+15
-15
@@ -1872,21 +1872,21 @@ def screen_statement(l, loc):
|
||||
return rv
|
||||
|
||||
|
||||
@statement("screen2")
|
||||
def screen2_statement(l, loc):
|
||||
|
||||
# The guts of screen language parsing is in screenlang.py. It
|
||||
# assumes we ate the "screen" keyword before it's called.
|
||||
screen = renpy.sl2.slparser.parse_screen(l, loc)
|
||||
|
||||
l.advance()
|
||||
|
||||
rv = ast.Screen(loc, screen)
|
||||
|
||||
if not l.init:
|
||||
rv = ast.Init(loc, [ rv ], -500)
|
||||
|
||||
return rv
|
||||
# @statement("screen2")
|
||||
# def screen2_statement(l, loc):
|
||||
#
|
||||
# # The guts of screen language parsing is in screenlang.py. It
|
||||
# # assumes we ate the "screen" keyword before it's called.
|
||||
# screen = renpy.sl2.slparser.parse_screen(l, loc)
|
||||
#
|
||||
# l.advance()
|
||||
#
|
||||
# rv = ast.Screen(loc, screen)
|
||||
#
|
||||
# if not l.init:
|
||||
# rv = ast.Init(loc, [ rv ], -500)
|
||||
#
|
||||
# return rv
|
||||
|
||||
|
||||
def translate_strings(init_loc, language, l):
|
||||
|
||||
+1
-1
@@ -287,7 +287,7 @@ class Script(object):
|
||||
try:
|
||||
data, stmts = loads(f.read().decode('zlib'))
|
||||
except:
|
||||
raise
|
||||
return None, None
|
||||
|
||||
if not isinstance(data, dict):
|
||||
return None, None
|
||||
|
||||
@@ -2,6 +2,27 @@
|
||||
Full Changelog
|
||||
==============
|
||||
|
||||
Ren'Py 6.17.7
|
||||
=============
|
||||
|
||||
This release includes a number of Android changes:
|
||||
|
||||
* RAPT has been updated to use the latest version of the SDK. Please install
|
||||
the SDK again if you have build problems.
|
||||
|
||||
* RAPT no longer includes a copy of Ren'Py. Instead, Ren'Py includes a copy of
|
||||
itself into the built game that RAPT uses. This makes it possible to include
|
||||
fixes to Ren'Py in an Android package.
|
||||
|
||||
* A low-level In-App Purchase implementation, contributed
|
||||
by Emmanuel Marty and Winter Wolves. The low-level IAP code supports Google
|
||||
Play and the Amazon App Store. This code is not currently documented, as it
|
||||
will be wrapped in a higher-level implementation.
|
||||
|
||||
This release includes a fix to an audio-video sync issue that affected the
|
||||
Windows, Mac OS X, and Linux platforms.
|
||||
|
||||
|
||||
Ren'Py 6.17.6
|
||||
=============
|
||||
|
||||
|
||||
@@ -654,7 +654,7 @@ Rarely or Internally Used
|
||||
released games, but setting it to a number will allow for
|
||||
automated demonstrations of games without much human interaction.
|
||||
|
||||
.. var:: config.autoreload = True
|
||||
.. var:: config.autoreload = False
|
||||
|
||||
If true, shift+R will toggle automatic reloading. When automatic
|
||||
reloading is enabled, Ren'Py will reload the game whenever a used
|
||||
|
||||
Reference in New Issue
Block a user