UnrealEngine3:
Work officially begins. Time to get this building under gcc again. Since
we changed up the source tree layout, the Makefiles from UE2 are basically
useless. Rather than rewrite them, I'm going to spend some time exploring
SCons, which came highly recommended by TTimo, the Doom3/linux guy. First
Unreal steals their colored lighting, then their build system! :)
Obviously, there's a lot to be done at this point, but best to start now
so I'm not scrambling to port a whole engine when UE3 games get closer to
shipping. Updates as I have them.
Spider-Man 2:
Gone gold, baby.
MojoPatch:
Now open source!
http://icculus.org/news/news.php?id=2040Shrek 2:
Now shipping!
OpenAL:
For those that weren't at WWDC, Apple gave out preview discs of MacOS X Tiger.
One of the things Tiger installs by default? OpenAL.framework. No kidding.
That's basically awesome. It's Apple's version, which is open-sourced and
residing in Creative.com's CVS repository.
Likely I'll move my implementation over to Linux and stop further Mac
development, so that there is a clear technology path on the Mac. I'll
devote further Mac development and debugging to the Apple implementation.
After all, it was partially a stop-gap solution (remember when ut2003 took
25% of the CPU mixing audio? It was a needed fix, no doubt!), and partially
a technology proof-of-concept to show Apple what works well in terms of game
development. No doubt it has served me well.
In the short term, I'll have to decide what we ship on the disc with
Unreal-based games. For ut2004, my implementation is the only one with
ALC_EXT_capture support for VoIP...this could be added to the other
implementation, but hasn't been as of yet. My version is apparently a
little faster, but it's stereo only (but the subversion repository doesn't
crash on M-Audio 5.1 and 7.1 cards anymore), so Apple's tech is probably
more attractive for further development by default.
All of the missing functionality in Apple's implementation could be fixed
with some elbow grease, which I'm sure will show up one way or another in
the near future. Overall, this is a very good step forward, and I applaud
Apple for giving game developers something they really need.
Duke3D:
Latest CVS builds and runs on Solaris/x86 (and presumably Solaris/sparc, too).
I get a lot of questions about MacOS X: the game _does_ run on OSX, there
just isn't a nice installer or anything at the moment, so you have to
compile it yourself. When there's time, I'll put together a shareware-based
installer, and, if I can find a copy, one that works with the Mac retail disc.
UTPG:
(Yes, this is still being worked on.)
Unreal Tournament 2003:
There's an exploit in the ut2003 network code, so here's a new build.
Linux:
http://0day.icculus.org/ut2003/ut2003lnx_patch2225-3-BETA.tar.bz2 MacOSX:
http://0day.icculus.org/ut2003/ut2003-mac-patch-2225-3.dmg.bz2 The Linux one has about a million changes over the stock 2225, since it's got
all the MacOSX work on top of it. Consider it beta. The Mac version has one
or two fixes, so it's worth updating.
Unreal Tournament 2004:
If Mac retail installer crashes on you, use this:
http://icculus.org/~icculus/tmp/UT2004-mac-updated-installer.tar.bz2 Linux (x86 and amd64) official 3236 patch (new build with load times fixed):
http://icculus.org/news/news.php?id=2064 MacOS X (un?)official 3236 patch (YES, this is newer than 3229):
http://icculus.org/news/news.php?id=2064Call of Duty:
1.4 is out, now with PunkBuster support:
http://www.callofduty.com/patch/ This is a 1.4 server with an exploit closed. Admins should all upgrade:
http://icculus.org/betas/cod/COD-lnxded-1.4-07252004.tar.bz2Postal 2 Share the Pain:
Linux demo:
http://icculus.org/news/news.php?id=1816 Linux retail: In beta testing (apply at
http://www.linuxgamepublishing.com/)
Mac retail: In beta testing (no more applications, please!)
America's Army:
2.1.0 is out for Linux and Mac:
http://icculus.org/news/news.php?id=2046Other stuff:
Mac::Glue is the best thing since sliced bread.
I have about 20 gigabytes of MP3s on my Linux box, and I want to put them
in an iTunes library on the Mac. The music is stored like this:
/mp3/artist_name/album_name/01-track_one_name.mp3
/mp3/artist_name/album_name/02-track_two_name.mp3
(etc)
So I copy this over to the Mac, try to use iTunes's "Add to Library" option.
It renames all the files, strips off the track number, and sorts them
alphabetically by track name, which is dumb. I turn off the "copy to library"
preference (since I don't really want the music copied/moved anyhow), and
it still can't handle this.
Plus, I'd like a playlist for each album, which is out of the question.
iTunes is pretty controllable via AppleScript, which I don't want to take the
time to learn. The basics of the interface are simple enough:
tell "iTunes" to add filename
etc, but i didn't want to spend time figuring out how to get file listings
and iterate over them in AppleScript. Enter pudge's
excellent Mac::Glue
perl module, which basically uses Reflection to make an AppleScript interface
into a Perl one. Pretty sweet.
So here's my code. It counts on your mp3s being in a certain structure, but
it'll add them to the main library, create a playlist named album_name, add
the mp3s to that, and then correct the playlist name once iTunes has access
to the id3tags. It also sets the "track number", which organizes the tracks
correctly (not by this moronic alphabetical-by-track-name method)...they are
sorted correctly in both the playlists and the main library view.
None of these albums have associated artwork, but the creative could automate
the pulling down of this from Amazon or iTMS at a later date. There
apparently already are AppleScripts for this.
Whole process took about 40 minutes to import 20.31GB (5269 mp3 files). This
would take longer if iTunes was commanded to copy the files, but we were
mostly just building a playlist database. Both Perl and iTunes spent a lot
of time idle, which I guess was waiting on disk i/o.
Let's see if IcculusFinger throws up on Perl code...
#!/usr/bin/perl -w
#
# You need Mac::Glue for this to work. To download and install it, run this,
# as root, from the Terminal:
#
# perl -MCPAN -e 'install Mac::Glue'
#
# And say "yes" to anything it asks you about adding stuff to the queue.
#
# Then run this:
# perl -w ./itunes_import.pl /where/i/keep/my/mp3s
#
# Written by Ryan C. Gordon (icculus@icculus.org)
use warnings;
use strict;
use Mac::Glue;
use Mac::Errors '$MacError';
my $mp3lib = shift;
die("\n\nUSAGE: $0 <mp3dir>\n\n") if not defined $mp3lib;
sub check_error {
return if not $^E;
print(" - AppleScript error: $MacError\n");
exit 1;
}
print(" + Starting converter...\n");
opendir(DIRH, $mp3lib) or die(" - opendir('$mp3lib') failed: $!\n");
my @artists = readdir(DIRH);
closedir(DIRH);
my $itunes = new Mac::Glue 'iTunes';
print(" + activating iTunes...\n");
$itunes->activate(); # load iTunes if needed.
check_error();
my $d = '';
foreach (@artists) {
next if $_ eq '.DS_Store'; # some Mac thing.
next if $_ eq '.';
next if $_ eq '..';
my $fullartist = "$mp3lib/$_";
print(" - '$fullartist' is not a directory!\n"), next if not -d $fullartist;
my $artist = $_;
print(" + Artist: $artist\n");
$d = "$mp3lib/$artist";
opendir(DIRH, "$d") or die(" - opendir('$d') failed: $!\n");
my @albums = readdir(DIRH);
closedir(DIRH);
foreach (@albums) {
next if $_ eq '.DS_Store';
next if $_ eq '.';
next if $_ eq '..';
my $fullalbum = "$mp3lib/$artist/$_";
print(" - '$fullalbum' is not a directory!\n"), next if not -d $fullalbum;
my $album = $_;
print(" + Album: $album\n");
$d = "$mp3lib/$artist/$album";
opendir(DIRH, "$d") or die(" - opendir('$d') failed: $!\n");
my @files = readdir(DIRH);
closedir(DIRH);
my @tracks;
foreach (@files) { next if not /.mp3\Z/i; push @tracks, $_; }
next if (scalar(@tracks) == 0);
@tracks = sort @tracks;
my $playlist = $itunes->make(new => 'user playlist', with_properties =>
{
name => $album,
shared => 1,
smart => 0,
visible => 1,
shuffle => 0,
song_repeat => 'off'
});
check_error();
my $tracknum = 1;
my $renamed = 0;
foreach (@tracks) {
my $trackname = $_;
my $trackfile = "$mp3lib/$artist/$album/$_";
print(" + Track: $trackname ($tracknum)\n");
my $track = $itunes->add($trackfile, to => $playlist);
check_error();
# Rename playlist from the album's dirname (the_album_name) to
# whatever is in the first id3tag we see (The Album Name), since
# it's more likely to be right.
if (not $renamed) {
my $realalbum = $track->prop('album')->get();
check_error();
if ((defined $realalbum) and (not $realalbum =~ /\A\s*\Z/)) {
$playlist->prop('name')->set(to => $realalbum);
check_error();
$renamed = 1;
}
}
# set track number; this causes it to be sorted correctly in
# the primary library view...
$track->prop('track number')->set(to => $tracknum);
check_error();
$tracknum++;
}
}
}
exit 0;
# end of itunes_import.pl ...
--ryan.