Compare commits

...

14 Commits

Author SHA1 Message Date
Tom Rothamel 06cf061aef Update changelog. 2014-07-06 16:45:40 -04:00
Tom Rothamel f99b288ce9 Include Ren'Py with android distributions.
RAPT will now use this version of Ren'Py, which can include patches
by the creator.

Fixes #368.
2014-07-06 13:35:01 -04:00
Tom Rothamel a1ec9d6301 Bump version to 6.17.7. 2014-07-06 10:43:05 -04:00
Tom Rothamel 2b1e907db9 Ignore .rpyc files that cannot be loaded.
This makes it possible to version down if the .rpy file exists and
do not use any newer features.
2014-07-06 10:37:22 -04:00
Tom Rothamel 5df50b037b Add a large-fonts mode to the launcher.
Fixes #399.
2014-07-06 10:24:54 -04:00
Tom Rothamel 61aed4271f Ignore tmp/ directory when navigating .rpy files. 2014-07-06 10:24:04 -04:00
Tom Rothamel 0da26cd7a0 Ignore profile_screen.txt when distributing. 2014-07-06 10:23:42 -04:00
Tom Rothamel 04d0e3f959 Distribute the project given to android_build.
This fixes a bug where we would distribute the current project
instead of the one supplied on the command line, causing things
not to work.
2014-07-06 10:23:04 -04:00
Tom Rothamel 7f9f995782 Remove constant offsets from video timestamps.
We had previously been assuming the audio started at 0, while
respecting the video PTS. If the PTS of the first video frame was
non-zero, this would lead to the video being delayed behind the audio
and never catching up.

Fixes #386.
2014-07-06 10:22:40 -04:00
Tom Rothamel f540d1d450 Merge branch 'master' into maintenance/6.17.5 2014-05-07 21:39:18 -04:00
Tom Rothamel a34657d394 Bump version. 2014-05-07 21:36:18 -04:00
Tom Rothamel 265dc3dab8 Merge branch 'master' into maintenance/6.17.5 2014-05-07 21:29:01 -04:00
Tom Rothamel 05af3ba5f3 Merge branch 'master' into maintenance/6.17.5 2014-05-01 22:49:41 -04:00
Tom Rothamel be57060071 Disable 6.18-isms, change version. 2014-05-01 21:35:12 -04:00
12 changed files with 130 additions and 85 deletions
+1 -1
View File
@@ -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,
+1
View File
@@ -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")
+2 -1
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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)
+2 -1
View File
@@ -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.
+1 -1
View File
@@ -102,7 +102,7 @@ init -1600 python:
)
# Should we use the autoreload system?
config.autoreload = True
config.autoreload = False
init -1600 python:
+15 -15
View File
@@ -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
View File
@@ -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
+21
View File
@@ -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
=============
+1 -1
View File
@@ -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