Skip to main content

How to Run Rise of Nations with Wine

I spent quite a while last night getting Rise of Nations Golden Edition running on Ubuntu Ibex. Here's what it took:

Part 1: Make CD images using Cdrdao

Cdrdao is used for dumping images of CDs in .bin/.toc format. Normally dd is enough to make an image. But, for copy-protected discs like RoN, you need something a little stronger. Here's the command I used to make images of both discs:
$ cdrdao read-cd --read-raw --datafile image.bin \
--device /dev/cdrw2 --driver generic-mmc-raw image.toc
Be sure to replace /dev/cdrw2 with your CDROM device.

Part 2: Mount the images using CDemu

Windows users are probably familiar with DAEMON Tools. CDemu is the equivalent for Linux. There are nice Debian packages available. Download and install, in order:
  • vhba-dkms
  • libmirage
  • cdemu-daemon
  • cdemu-client
Mounting the images after installing CDemu is simple.
$ cdemu load 0 image.toc

Part 3: Update and configure Wine

The standard Ubuntu repositories do not have the most up-to-date version of Wine. For that, you need to add Wine's own repository. They have directions for major distributions on their download page.

Next, get winetricks. After installation, simply execute winetricks to display the winetricks GUI. Then install directx9 and mfc42.

Finally, we need to touch some settings in Wine. Open winecfg and click the graphics tab. Uncheck the boxes for "Allow the window manager to decorate the windows" and "Allow the window manager to control the windows." Now click the Audio tab. If you haven't configured Wine's audio previously, Wine will display a message indicating it has now done so for you. The defaults should be fine, so now click the Libraries tab. To get sound working in RoN, change dsound from builtin to native.

Part 4: Install RoN

Normally this would be fairly straight forward. But for RoN, there's a few tricks. First, copy pidgen.dll from the first disc to ~/.wine/drive_c/windows/system32. Now, start installing RoN.
$ cd /media/RONGOLD1
$ wine setup.exe
The second trick is to convince the installer you've inserted the second disc when it asks. To do this, I had to manually change the symlinks in ~/.wine/dosdevices. Change whichever drive symlink points to RONGOLD1 so that it points to RONGOLD2. Also, be sure to change the symlink that points to the actually device as well (it will have the same name as the drive letter but with an extra colon). Click "OK" in the install window and it should finish up the installation. Once it's done, be sure to change the symlinks in dosdevices to point back to RONGOLD1.

Part 5: Configure RoN

I'm not sure these configurations are necessary, but they work for me. Edit /home/damonkohler/.wine/drive_c/windows/profiles/.../Application\ Data/Microsoft\ Games/Rise\ of\ Nations/rise2.ini to look like this:
Windowed Width=1024
Windowed Height=768
Don't Allow Texture Compression=0
SYS_grade_override(A-F or AUTO)=AUTO
MEM_grade_override(A-F or AUTO)=AUTO
CPU_grade_override(A-F or AUTO)=AUTO
GPU_grade_override(A-F or AUTO)=AUTO
Console Coord Mode=0
Console Name Mode=2
Sound Enabled=1
Force Profile Menu=0
StandaloneScriptsDirectory=Stand-alone Scripts
Part 6: Play the game!

Woot! You're done!

Popular posts from this blog

Bot Commander r1 Released

I just published Bot Commander , the code for my Lego NXT rover . There's a lot left to be done, but release early and often, right? Currently it provides a UI for controlling the direction and speed of all three motor ports on the NXT brick. You can link motors together to adjust their speed in unison. In addition, you can enable "Tilt Control" for a steering-wheel-type experience. To use tilt control: Hook up motor A and B to be the left and right wheels of your vehicle. Hold the phone sideways (i.e. landscape). Tilt the phone forward and backward to drive forward and backward. Turn the phone right and left (like a steering wheel) to steer right and left. As you tilt the phone, you'll see the UI update the slider controls for the speed of motors A and B. I plan to expand the UI to provide a lot more than just motor control. Before that, though, I'll push a JAR to make it easy to integrate control of Lego NXT robots into your own Android project. The code
Read more

Email Injection

Not so long ago, I ran a wiki called SecurePHP. On that wiki, there was one particular article about email injection that received a lot of attention. Naturally, with all the attention came lots of spam. As a result, I disabled editing of the wiki and content stagnated. Still, the email injection article remained popular. About a year later, the server that hosted SecurePHP died and I never had a chance to hook it all back up. I saved the article though and I'm reposting it now. It may be a bit old (I've been away from PHP for a long time), and I didn't write all of it, so feel free to leave comments about needed updates and corrections. Though this article focuses on PHP, it provides a lot of general information regarding email injection attacks. The PHP mail() Function There are a lot of ways to send anonymous emails, some use it to mass mail, some use it to spoof identity, and some (a few) use it to send email anonymously. Usually a web mailform using the mail() funct
Read more

Android Recipes and Snippets

I've put together a small collection of Android recipes. For each of these recipes, this is an instance of Context (more specifically, Activity or Service ) unless otherwise noted. Enjoy :) Intents One of the coolest things about Android is Intents . The two most common uses of Intents are starting an Activity (open an email, contact, etc.) and starting an Activity for a result (scan a barcode, take a picture to attach to an email, etc.). Intents are specified primarily using action strings and URIs. Here are some things you can do with the android.intent.action.VIEW action and startActivity() . Intent intent = new Intent(Intent.ACTION_VIEW); // Choose a value for uri from the following. // Search Google Maps: geo:0,0?q=query // Show contacts: content://contacts/people // Show a URL: intent.setData(Uri.parse(uri)); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); Other useful action/URI pairs include: Intent.ACTION_DIAL , tel://867530
Read more