rlvm 0.13 released!

13 Oct 2013
Tags: rlvm

rlvm should now do a much better job running Little Busters. It should also detect if the user tried to run a game before installing an English patch and offer to reset save game data.

“lurkmore” has written tonecurve support, so character sprites should be tinted in scenes with different lighting conditions. In addition, there are major changes to the graphics system to allow for sepia effects, colour tinting, and new animation primitives.

Comment

Download

Ubuntu (Precise) package for x86 machines (version 0.13)
Ubuntu (Precise) package for amd64 machines (version 0.13)
Mac OSX Application (Intel) (version 0.13)
Source code (0.13)

Chrome Sync and Android

27 Aug 2011
Tags: Android

A word of caution; last night I enabled the new “Encrypt all synced data” option in Google Chrome. It is awesome that we now offer this.

The Android browser also talks to the chrome sync servers; their (not Chrome) browser in Honeycomb 3.1 looks like it doesn’t handle encryption yet, and crashes hard when the option is enabled on my G-Slate. Periodically, the com.google.process.gapps process crashes, often while I’m doing something else on my tablet. Looking at the output of adb logcat:

E/AndroidRuntime( 2861): FATAL EXCEPTION: SyncAdapterThread-1
E/AndroidRuntime( 2861): java.lang.NullPointerException
E/AndroidRuntime( 2861): 	at com.google.android.syncadapters.
    bookmarks.BookmarksSyncAdapter.innerPerformSync(
    BookmarksSyncAdapter.java:562)
E/AndroidRuntime( 2861): 	at com.google.android.syncadapters.
    bookmarks.BookmarksSyncAdapter.onPerformLoggedSync(
    BookmarksSyncAdapter.java:246)
E/AndroidRuntime( 2861): 	at com.google.android.common.
    LoggingThreadedSyncAdapter.onPerformSync(
    LoggingThreadedSyncAdapter.java:33)
E/AndroidRuntime( 2861): 	at android.content.
    AbstractThreadedSyncAdapter$SyncThread.run(
    AbstractThreadedSyncAdapter.java:202)

So…don’t turn on encryption on all your browser sync data in Chrome if you have a Honeycomb tablet! Since you can’t disable this once it’s on in Chrome, the workaround is unchecking Accounts & sync > (your Google account) > Sync Browser until their browser supports encrypted datatypes.

(In general, if you’re wondering why something is crashing, you can usually get a good idea by using adb logcat from the Android development SDK or one of the logcat programs on Market.)

Life Counter and Honeycomb

17 Jul 2011
Tags: Android and LifeCounter

A little under a month ago, I got a Honeycomb tablet. While trying it out, I noticed that some apps would only display in a small box on the top of the screen. Including Life Counter, my app.

Oops.

I spent most of yesterday evening and today on the update and theoretically, the update is live, though I had to clear the My Apps cache on my Honeycomb tablet. (My Gingerbread phone had no problem immediately detecting the update).

Here is what I think of the process of Honeycombizing an Android app:

  • When I first started writing Android apps, I was confused about why they emphasized using XML based resources for layout. There had to have been simpler ways to deal with different layouts for orientation. Now that Life Counter supports multiple form factors, I understand and it’s one of the best things about development for Android.

    The ability to have an image, and then have another version for larger screens is a really good abstraction. I have four different copies of the 4 player layout depending on orientation and screen size and they’re all treated the same from code. The runtime will determine the best version for the current situation and present that to my app.

  • Integration with the ActionBar is…interesting. In the main LifeCounter activity, I use Google’s backwards compatibility library to mark the coin flip menu item so it’ll both activate the display of the action bar and put it in.

    Everywhere else, I have Honeycomb specific subclasses. For example, Coin2DActivityHC derives from Coin2DActivity, and then LifeCounter selects which activity to run at runtime. I almost never do Java; I’m a little shocked that I can compile classes that require certain APIs into “binaries” that are run on systems that don’t provide those APIs. I suppose that makes sense if class loading is lazy and binding doesn’t happen until loading time, though it still was unexpected. (In my defense, I come from a world that still uses dysym()).