Christians Tagebuch: games

The latest posts in full-text for feed readers.


Exclusive OUYA games

I collected a list of all games that were exclusively released on the OUYA gaming console.

All-time exclusives

Games that have never been ported to any other system - you need an OUYA to play them. Find them in the Exclusive category on my OUYA server.

Once exclusive

Games that were for some limited time only available on the OUYA, but got released on other platforms later. Find them in the VIP room category on the OUYA server.

Game name Other Platforms Source Notes
Amazing Frog PC (Steam) 15, 17, 18
Broken Age PC (Steam), Playstation, Apple App Store, Google Play 1 Only console on launch day
Chrono Blade Apple App Store, Google Play 14, 15 Demo only
Deep Dungeons of Doom OUYA (2013-04-11), Apple App Store (2013-06-04), Google Play 15, 19
Duck Game OUYA (2014), Nintendo Switch, Playstation 4, PC (Steam) (2015) 11, 13 new official site
Killing Floor: Calamity OUYA (2013-12), Nvidia Shield (2015-08), Google Play (2015-08) 27, 28, 29
Laza Knightez Windows, Mac OS 6
No Brakes Valet Windows, Apple App Store, Google Play 15, 16 new official site
Polarity PC (Steam), Apple App Store, Google Play 1, 15 new official site
Reagan Gorbachev Xbox One, PC (Steam, Humble Store) 2, 11
That Dragon, Chancer Mac, PC, Google Play, Apple App Store 4, 22 new official site
Toto Temple Playstation 4, Xbox one, WiiU, PC (Steam, Humble Store) 7, 8, 11
Towerfall Switch, PC (Steam), Playstation 4, Xbox One 9, 10, 14, 15
Whispering Willows Switch, PC (Steam), Playstation 4, Xbox One, Wii, Google Play, Apple App Store 11, 12 2 months exclusively on OUYA according to 12

Cancelled / Not exclusive

Some games were announced to be exclusively on OUYA but weren't actually, or were cancelled.

Game name Source Notes
Cascade 11, 23 Never released on the OUYA store. No mention of OUYA on homepage.
Fist of awesome 15 Kickstarter page says PC & Mac were there at least with ouya.
Human Element 1, 24 Cancelled
Neverending Nightmares 11 Released simulatenously on Windows, Mac, Linux, and Ouya. Kickstarter page: The Ouya Free The Games Fund exclusivity terms don't apply to computers.
PitchWreck 5, 25 Never released
Red. 15, 26 Released the same time on iOS and OUYA, 2013-03-13.
Yummy Circus 1, 3 Not on the ouya.tv games list. Was listed on their website as available on OUYA.

Sources

  1. Stuff.tv: Five exclusive games that'll make you want an Ouya
  2. TechnologyTell: Reagan Gorbachev Review: Taking the Reykjavik Summit by storm
  3. Phandroid: OUYA Exclusive: Yummy Circus puzzler gets demoed before launch
  4. Kotaku: The Powerfully Moving That Dragon, Cancer Is Now A Ouya Exclusive
  5. @playouya on Twitter: Pitchwreck
  6. Gambit Magazine: LAZA KNITEZ!! Launches March 12 Exclusively on OUYA
  7. daily dot: Ouya has a party in a box with ‘Toto Temple Deluxe’
  8. ouyaholic: Knightmare Tower Developers working on OUYA Exclusive
  9. Leo Sigh: TowerFall Review: It’s a Must Buy for the Ouya, It’s Awesome
  10. Destructoid: TowerFall ditches Ouya exclusivity with enhanced PC port
  11. GamesBeat: Six Ouya exclusives show the console's silly and serious side
  12. Whispering Willows homepage
  13. Wikipedia: Duck Game
  14. Pocketgamer: First impressions of Ouya
  15. Pocketgamer Youtube video: First impressions of Ouya
  16. Android Police: [New Game] No Brakes Valet Jumps From OUYA To The Google Play Store To Enable Your Ferris Bueller Fantasies
  17. OUYA… Why Amazing Frog? is on Steam Early Access
  18. OUYA wiki: Amazing Frog
  19. Thais Weiller: Deep Dungeons of Doom
  20. Indie Statik: How Some Students Found Hope In A Grain Of Sand: Monocle Man
  21. Wikipedia: Soul Fjord
  22. @playouya on Twitter: That Dragon, Cancer
  23. Youtube: OUYA Cascade game [W.I.P.] Brain Fly though [Unity] Level of detail test
  24. Wikipedia: Human Element
  25. Twitter: Neil Crofts: PitchWreck
  26. Twitter: Knife Media: Red release
  27. Engadget: Arcade shooter Killing Floor: Calamity arrives exclusively on Ouya
  28. Droid Gamers: Nvidia releases two new games for their Shield brand of devices: Killing Floor: Calamity and Windward
  29. Android Police: Killing Floor: Calamity, A Top-Down Adaptation Of The Popular First Person Shooter, Comes To Google Play

Published on 2021-10-13 in ,


Illegal instruction in 64-bit code

I've always wanted to play the game Horizon Zero Dawn since it was released for the PlayStation 4 in 2017. In 2020-07 it was released for PC, but since it was DRM-ridden, I did not buy it then.

In 2022-12 I found it on gog.com for a reasonable price of 17€ and bought it. After downloading the 74 GiB with the command-line tool LGOGDownloader and installing it with Wine 8.0-rc2, I started it and got a crash:

Unhandled exception: illegal instruction in 64-bit code (0x00000140118cb7).

It turned out that HorizonZeroDawn.exe uses CPU instructions that my processor (AMD Phenom II X4 945 from 2009) does not support. The minimum system requirements say that an AMD FX 6300 is needed, which was released in 2012.

Which illegal instructions?

It is possible to see which opcodes are used in an executable.

Combining objdump with some grep will give you the list of CPU instructions. I used cpu_features.py to get the list, and it showed me that AVX and SSE4 instructions are used:

$ python2 cpu_features.py HorizonZeroDawn.exe
[...]
x64:
	sse4.1:
		pextrw
		pextrq
	sse4.2:
		crc32
[...]
sandybridge:
	avx:
		vcvtss2sd
		vpmuludq
		vpsrlq
		vpcmpgtd
		vcvtsd2ss
		vaesenc
		vsqrtss
[...]

Just listing the instructions does not mean that they are actually used, because the programs can have checks that use certain opcodes only when the CPU supports it.

Patch 1.08: AVX

Many players complained about Horizon requiring AVX, and so version 1.08 was released that removed that requirement:

Fixed a start-up crash for CPUs that do not support AVX instructions

SSE 4

This leaves the SSE4 opcodes that are also not supported by my processor :-/ I will have buy a new CPU + mainboard until I am able to play the game.

Someone on the internet provides binaries for processors without SSE4.x support but those executables are for the Steam and Epic versions only, and not for the GOG one :(

Published on 2023-01-01 in , ,


Extracting textures from Defold .arcd files

The Defold game engine is able to generate applications that run on Desktop, smartphones and HTML5 web browsers. Just for fun I built an application that extracts textures and Lua scripts from the generated binary data files.

Problem

A game would not run on my computer, and I thought it would be worthwile to at least extract its image assets. It had a 1.5 GiB file called game.arcd that probably contained all the data, and I just had to obtain them from there.

Identification

I had no idea what tool was used to create the game.

Searching for .arcd file type did not give me any results (looking for game.arcd would have helped, but I only learned that later). Instead I ran strings on the executable file to see messages are inside it:

$ strings -n 10 executable |wc -l
5799

$ strings -n 10 executable |grep -iE 'error|fail'
...
ERROR:DLIB: dmLog already initialized
...

$ strings -n 10 executable
...
dmGraphics::ValidateAsyncJobProcessing
dmGraphics::OpenGLClear
dmGraphics::OpenGLFlip
...

I wanted at least 10 characters because otherwise it would just be too much output - 5800 lines were enough already. Then I looked for non-generic error messages and non-standard API strings, in the hope that that would tell me which engine was in use.

Searching for both dmLog and dmGraphics told me that the Defold game engine was used here.

Existing tools

I looked for existing tools that could unpack the game.arcd file and found Unfold, a unpacker written in Defold itself. Unfortunately it did not work.

Archive format

The Defold documentation talks about the game archive format, and it did not seem to be very complicated.

When inspecting the Defold source code I saw that there were .proto files, which are specifications for "Protocol buffers", a binary serialization format. This proto files can be compiled into Java, C, C++, PHP and other languages. That's enough to read all the files.

Let's get coding

I also found a ArchiveReader.java file that already implemented a file extractor! So I downloaded IntelliJ idea, set up a new Java project and wrote a tool that utilized the reader.

Working on a 1.5GiB file would be slow, so I checked out the Defold games showcase and downloaded a game that looked small: At first I used the browser's network inspector to obtain archive_files.json and then downloaded all files linked from it:

$ jq -r .content[].pieces[].name < archive_files.json | xargs -L1 I{} wget http://example.org/archive_files_dir/{}

The files extracted by my tool were of no use. After some tinkering I found out that files can be compressed and encrypted, and both features were not implemented in the ArchiveReader class.

An hour later I had a BetterArchiveReader with support for both compression and decryption, and it was able to extract .luac and .texturec files.

The .luac files has the Lua source code, but also some binary before and after the actual script code. This means the files were again packed protobufs, and needed to be unpacked.

Texture format

.texturec files may contain multiple texture formats, and each of them had meta data about the actual image format. The files I was interested in had Compression: basis UASTC, which turned out to be a format suitable for directly loading onto the graphics card.

Luckily the basis_universal basisu command line tool already contains an unpacker that is able to convert .basis texture files back into .png!

Prettification

The tool itself worked, but had hard-coded paths and I had to comment out code to switch between extraction and listing.

I decided to add a nice command line interface so others would not have to go through the same hoops as I. After evaluating Java command line parsing libraries I decided on JCommander.

After the initial work of about 5 hours, I spent 1.5 days to build the cli interface. It even has a pretty help screen:

 [files to extract]
        Options:
          --arci
            .arci index file path
          --dmanifest
            .dmanifest file path
          --extract-lua
            Extract Lua scripts from .luac files
            Default: false
          --extract-textures
            Extract textures from .texturec files
            Default: false
          -f, --filter
            File extension filter
          -l, --list
            List archive contents
            Default: false
          --outdir
            Directory to extract files to
          -v, --verbose
            Show names of extracted files
            Default: false

    lua      Inspect or extract a .luac file
      Usage: lua [options] <.luac file path>
        Options:
          -v, --verbose
            Show names of extracted files
            Default: false
          -i
            Show .luac file information. Do not extract.
            Default: false

    texture      Inspect or extract a texture file
      Usage: texture [options] <.texturec file path>
        Options:
          -v, --verbose
            Show names of extracted files
            Default: false
          -i
            Show texture information. Do not extract.
            Default: false
]]>

Download

The tool is called arcdEx, is open source and can be downloaded from codeberg.org/cweiske/arcdEx.

Published on 2022-08-20 in ,


Editing Andor's Trail savegames

I've been playing the android RPG game Andor's Trail (on F-Droid) a bit and was put off by the requirement to spend too much time slashing cute enemies to make money - only to be able to buy more equipment and to continue with the storyline.

My choices were: Stop playing the game, or find a way to get more money.

I chose the latter and found a forum thread Edit saved game files ?? which unfortunately has no useful information on the first two pages.

So I had to solve the problem myself:

$ adb connect
$ adb root
$ adb shell
$ find / -iname "*andor*" 2&>/dev/null
...
/storage/emulated/0/andors-trail/savegame1
...
$ exit
$ adb pull /storage/emulated/0/andors-trail/savegame1
# fix savegame
$ adb push savegame1 /storage/emulated/0/andors-trail/savegame1

To fix/adjust the savegame I used emacs in hexl-mode. The first line contains the name of the player with the main properties: (Level 7, 5361 Erfahrung, 459 Goldmünzen).

Then I converted the number of coins 459 to hexadecimal:

$ php -a
Interactive mode enabled

php > echo dechex(457);
1c9

Now I searched for c9 and found the hex values 01c9 which I replaced with (via C-M-x) with ffff (65536). After saving, I pushed the savegame onto my Android device, loaded the savegame and voila, I did not have to worry about money anymore.

I could also have increased my XP, but that would have spoiled the fun.

Screenshot of Andor's Trail

Published on 2019-01-30 in ,


Playing Tomb Raider 1 on OUYA

In 1996, Tomb Raider 1 invented the category of third-person 3D action-adventure games. After nearly twentry years I wanted to play it again, but this time from the couch on TV via my OUYA android gaming console.

It turned out that the game was ported to Android in 2015 and is available in the Google Play store. I asked the Square Enix support if the game supports gamepads or joysticks, and they confirmed that it works at least with the Moga Hero Power and Moga Pro Power controllers. So basic support was there, and the rest would be button mappings - I thought :)

Downloading

The Google Play store is not available on the OUYA (only the native OUYA store is supported), so I bought the game for 0,99 US dollars on a normal Android phone. Installing it on the OUYA required me to get hold of the game's package file, and I asked the support for the official .apk download URL, telling them the account email I used to buy it. They declined my request:

Unfortunately for security reasons it is not possible for us to advise you how to download the game unless you are using the Play store. If you are unable to do this then it should be possible for you to speak to them regarding a refund.

We are sorry for any disappointment that this may have caused.

Kind regards,
The Square Enix Support Centre team

I tried an APK Extractor app on the phone, which gave me an .apk file of 4 MiB while the original download was 320 MiB.

Then I went the usual route: Use mitmproxy to get hold of the URLs that are called when the phone downloads and installs the game. I used Android-x86 in VirtualBox for this since it was easier than to install the mitmproxy certificate on a real phone.

It turned out to be two files that were downloaded:

  • com.squareenix.tombraider1classic/40, an Android Expansion file (.obb), 316 MiB in size, MD5 hash 65f56cf31d5fc26e284ec26ef47636fa
  • com.squareenix.tombraider1classic/46/apk_gz, the actual Android package file, 4.4 MiB in size, MD5 hash b4a232b4c333211115169671b9a51ad6

The Android package installer installed the .apk file normally, and saved the expansion file at /sdcard/Android/obb/com.squareenix.tombraider1classic/main.40.com.squareenix.tombraider1classic.obb. The Tomb Raider app would show an error message if that file did not exist.

Running

After installing .apk and .obb file I started the game. The copyright notice, then the logos of Square Enix, Core and Realtech-VR appear, and the first frame of the intro video. Then it crashed, and I was back at the launcher.

I sent the log I got via adb logcat to the support, and again got dismissed:

We are sorry to hear that you are having trouble launching Tomb Raider on your OUYA. Unfortunately we cannot provide support on this platform as the game is not distributed on or to the OUYA.

We apologise for any inconvenience this may cause.

Fixing the game

Hammering

A day later I found a thread on ouyaforum.com about Tomb Raider Classic, and it gave me an important hint: You can skip the intro movie by hammering the red button on the controller. If you're quick enough and press it within the 100ms window before the movie player crashes, you'll get into the main menu!

It was cool to see the main menu, and I could even start the training session in Lara's home, as well as the normal game - if I managed to skip their intro videos.

Then the screen was filled with the button overlays, and I could use the OUYA's controller touchpad to press them. Apart from the red O button on the controller, no other button, analog stick or the digital pad worked.

Decompiling

So close, but so far away - still the Square Enix support had said there was controller support, and I just had to find out how to make it detect the OUYA controller.

At first I used jadx-gui to decompile the .apk file into nearly-real-java files that I could inspect. The input handling code is at com.realtechvr.v3x.input, and there are three classes:

  • GametelInputController
  • HoneyCombInputController
  • MOGAInputController

Gamtel was only activated if your device model was R800i, the input device model contained gametel or if the default device input method class starts with com.fructel.gametel.

The HoneyComb input handler looked more promising; it had a whitelist for controllers for Android versions < 4.3:

  • NVIDIA Corporation NVIDIA Controller
  • Broadcom Bluetooth HID
  • WikiPad Controller
  • Sony PLAYSTATION(R)3 Controller.
  • EI-GP20
  • Gamepad

At first I pondered how to change the input device name, but that required modifying and re-compiling the kernel, which I did not want to do again.

Then I saw that for Android 4.3 or later, every controller was accepted! The choices I had were:

  • Upgrade the OUYA from 4.1 to 4.3 - which will never ever be supported now that the OUYA developers were bought by Razer ; I don't expect any updates to the platform anymore
  • Make the OUYA return an API version of 18 instead of 16, which requires modifying the Android core and would break many other things.
  • Modify the Tomb Raider source code.

For simplicity, I chose the last option :)

smali to the rescue

The java code produced by jadx cannot be compiled, so I had to resort to apktool which generates .smali files that contain a plain text version of the Android Dalvik VM byte code .

I quickly found the HoneyCombInputController::isSupported method and the API version comparison code:

    .line 133
    .local v2, "ids":[I
    sget v4, Landroid/os/Build$VERSION;->SDK_INT:I

    const/16 v5, 0x12

    if-lt v4, v5, :cond_0

    .line 135
    invoke-static {}, Lcom/realtechvr/v3x/input/HoneyCombInputController;->initBindings()V

0x12 is the Android version being compared, and I simply changed it to 0x10 (16), which is the OUYA's android version.

I re-packaged the code up with apktool, signed it and installed it via adb on the OUYA.

Then I started it, skipped the intro, and ... it worked! Finally I was able to play the game as it was meant to be! I rejoyced like a child.

Another take on the movies

Now that I knew how to fix things, I checked the movies issue again. The code told me that even when I removed the movie files from the .obb package, the movie player was still initialized and started.

I hoped that preventing the player from being initialized and started also prevented the crash. There was an if statement in the SDLActivity::playFMV method which checked if the Android version was >= 11, and I simply reversed the condition in the corresponding .smali file:

     .line 921
     sget v5, Landroid/os/Build$VERSION;->SDK_INT:I
 
-    if-gt v5, v6, :cond_1
+    if-lt v5, v6, :cond_1

After building, signing, zip-aligning and re-installing the game on the OUYA I could start it without any crash!

Screenshots

Now that all is done, I could enjoy some hours of discovering the mysteries of caves with Lara:

Tomb Raider menu Menu: Controls Menu: Start new game Tomb Raider: The game has started (without controller support) A wolf A bear Medikit 1996-style mummy A cave

Open issues

During playing I noticed several small problems:

  • Sometimes when getting into the main menu, the buttons do not work. I had to press U twice to get to the OUYA game context menu and press A to get back to the game; the buttons then usually work.

    During gameplay sometimes they stop working and it seems as if you're in look-around-mode. Pressing L2+L3+R2+R3 and the look-around analog stick (the right one) usually fix this.

  • There is no "walk" button, but the left analog stick can be used for both walking and running.
  • On few occasions, the game was twice as fast as normal, but changed back to normal speed after a couple of seconds. This seems to have to do with the location within the game; when you visit the same place again, the speed increases again.

Published on 2015-09-09 in , ,


Making SNES ROMs easily runnable on OUYA

I bought my OUYA android gaming console mainly as to be able to play old games via emulators, for example Super Nintendo classics like Super Mario World or Aladdin.

For SNES emulation I use Snes9x EX+ which works fine - but to start a game, you have to start the emulator, use the "Open ROM" menu, navigate to the .smc file to finally run it. That's definitely not easy-to-use.

There are tools like Nostalgia that provide a graphical interface to start ROMs with a single click (once you started the interface of course) and automatically download covers. But that was still a click too much for my taste; I wanted to have the SNES games directly available in the OUYA launcher like all the native games.

I did try this already a year ago but failed to start the emulator with the game; this time - after trying to get Tomb Raider to run I had some experience with decompiling Android applications and could look under the hood of Nostalgia. Starting Snes9x EX+ with the game file path was easy:

Intent intent = new Intent();
intent.setComponent(
    new ComponentName("com.explusalpha.Snes9xPlus", "com.imagine.BaseActivity")
);
intent.setAction("android.intent.action.VIEW");
intent.setData(Uri.fromFile(new File(fileName)));

Now all left to do was extracting the .smc file shipped inside the package file, for which there were enough examples on the internet.

The result is a tool to generate OUYA SNES rom launchers with minimal effort: Provide a title, a ROM file and a image, and the script does the rest. Install the .apk on your OUYA, and enjoy the game.

The source code and build instructions for ouya-romlauncher are available on my own git server as well as GitHub.

Screenshots

My OUYA's PLAY menu now looks like this:

PLAY menu Game details

Game details are missing, but that has to wait until I build my own OUYA ROM store :)

Published on 2015-09-14 in ,


Commander Keen on OUYA

Some days ago I stumbled across a thread on ouyaforum.com, [Side-Load] Commander Genius (Commander Keen series interpreter) : It seemed to be possible to play Commander Keen on the OUYA!

Commander Genius is a Commander Keen game file interpreter, similar like ScummVM interprets the Monkey Island game files. Commander Genius is available for the most platforms, including Android (which OUYA is based on).

Downloading

Currently, Commander Genius is not available in the OUYA store and has to be installed manually.

Unfortunately, the Google Play page requires a Google account with a registered Android device, which I don't have. Also the Commander Genius Download page does not list the apk file, despite it being free of charge on Google play.

The Online apk downloader still allowed me to grab Commander Genius version 1.7.2.0 (although the current version is 1.7.4.0).

You may download the copy from my server: net.sourceforge.clonekeenplus-1.7.2.0.apk .

Setup

Copy the apk file onto an USB stick, plug that into your OUYA and install it with FilePwn.

It will be available in the Play menu because basic OUYA support is already included!

OUYA play menu

Playing

At first you have to select the Keen game you want to start. Commander Genius already ships with the freely avaiable episodes 1, 4 and 7. The controller's D-pad can be used properly here.

Game selection

Controls

The controller's D-pad can be used to move Keen, and the four OUYA buttons are mapped to HUD, Fire, Pogo and Jump.

Before playing a game, make sure to map the "Back" button in the controller settings - it is required to go back to the main menu, to save and load the game.

The analog sticks do not work. The upper buttons L2 and R2 can be mapped, L3 and R3 get double mappings. Don't try to map those.

Music

Music works in Commander Keen 1 if you enable the High Quality Pack in the download section of the "change device properties" window that can be accessed when starting Commander Genius (Use the touchpad to click the blue bar at the top of the screen to access this menu).

Screenshots

Commander Keen 1

Intro Main menu image Map First level

Commander Keen 4

Main menu image Main menu Map First level HUD

Published on 2014-06-23 in ,


Wine: MIDI sounds for Age of Empires

With version 1.3.37, Wine got a complete own DIB engine. I've been waiting since ~8 years for this to happen, because now I can play the classic strategy games Age of Empires and Age of Kings with Wine on my Linux machines properly. Before, the games would stutter and be generally not playable because they were so damn slow. With the fresh DIB engine, all that trouble is a fading memory.

After installing Age of Empires on my Ubuntu 11.10 box with Wine 1.4rc2, running patch 1.0c and executing the no-cd crack, I could start the game. Launching the first campaign, I missed an important thing: The music. Since the music is so important for the feeling of the game, I decided to fix it.

Age of Empires' music is delivered in MIDI files, and since nobody has soundcards with hardware MIDI support, you need a software synthesizer like TiMidity++.

Installing TiMidity together with Freepats (a sound font) is possible with apt-get. Note that you do not need timidity-daemon since one can run it by hand when you need MIDI sound:

$ timidity -Os -iA

When you did that, you can run aplaymidi to see that it is working:

$ aplaymidi -l
 Port    Client name                      Port name
 14:0    Midi Through                     Midi Through Port-0
128:0    TiMidity                         TiMidity port 0
128:1    TiMidity                         TiMidity port 1
128:2    TiMidity                         TiMidity port 2
128:3    TiMidity                         TiMidity port 3

Without TiMidity running, there would me "Midi Through" only. Testing MIDI playback is also possible with aplaymidi:

$ cd "~/.wine/drive_c/Programme/Microsoft Games/Age of Empires/sound"
$ aplaymidi --port 128:0 MUSIC5.MID

Contrary to the WineHQ MIDI wiki page did I not need to change any registry settings. Age of Empires now just plays awesome music!

Published on 2012-02-14 in , , ,


Tomb Raider Legend

After reading on WineHQ that Tomb Raider runs on Wine now, I did try the demo on my harddisk again. And guess what? It really worked. I played the whole demo, and decided to buy it.

Tomb Raider was the first game I ever bought... It was great that decade ago, and now I felt I wanted to relive the experiece again :)

Installation was a bit tricky: Since I install my games below /games/, and only the root directory was available in wine as drive, setup told me I didn't have 7GiB for installation. Solution was to create another drive that mounts /games/, and installation worked fine. And I had to cd to /mnt/dvd/, otherwise setup wouldn't run.

Running the game did also not work out of the box. I fetched the latest patch and a no-cd crack, and with this (thanks, Deviance!) I could finally start the game. The videos at the beginning take just half of the screen, but the game itself does work really nice.

I had to disable water effects and reflections, since they seem to have some bugs in Wine's D3D implementation, and Lara's shadow is flipped when viewed from the left, but otherwise I'm enjoying a nice action-adventure on my Gentoo box.

Published on 2007-03-28 in ,