What we do…
Brought up by Tai’lahr on the MOUL forums, who had a very good point that not many people actually know what we mean when we say that we “hack” Uru/Plasma. Hopefully an explanation will help to dispel some of the fear, doubt, and uncertainty that is being spread.
Prologue ended in February 2004. With the closing of areas such as the hoods and Ae’gura (which weren’t available in the offline game), some people began to look for ways to access those areas in the offline Ages Beyond Myst. All of Uru’s configuration and game files were encrypted, and started jokingly with the phrase “whatdoyousee”.
The night that Prologue shut down, a user by the name of Anonymous54321 posted a function on the Clockwork Orange BBS (COBBS) board that decrypted these files. The decryption was actually quite easy to figure out: we had the files, and we had UruExplorer.exe. UruExplorer has to decrypt those files when it reads them, so by reading the machine code inside UruExplorer.exe, we could figure out what it did to decrypt the files.
Once the xTEA (whatdoyousee) encryption was broken (which means, we were able to decrypt and re-encrypt the files), we had access to the SDL (State Description Language) system. SDL files store the default state of objects in an Age, such as open doors, barriers, and Journey Cloth visibility. Anything that could be turned on and off in the online Vault could be turned on and off using the SDL files for offline Uru.
After a bit of playing with SDL, some people wanted to look more closely at the game logic, the Python scripts that powered interaction. The process was an interesting one. Again using UruExplorer.exe, people traced to where it loaded the Python.pak file. Then, these people wrote documentation for it, byte by byte, as to what the game loaded.
Despite the fall of COBBS in April 2005, I was able to dig up a copy of the original Python hacking thread. This thread is where Python.pak was first looked at, decrypted, unpacked, and edited; and can be read here.
By the time To D’ni was released for free, COBBS members had already written tools to decrypt and edit the SDL and Python files (UruFun and UruPython were both written by Anonymous54321; UruTweak was written by Marrack; and Kirk had a Java program called WYDS’d).
I didn’t join the scene until shortly before Path of the Shell was released, but around the time of To D’ni came the invention of flymode. Flymode brought a lot more attention to COBBS, some of it positive, and some of it negative. It was really just some additions to Uru’s xKI Python file, which was then recompyled and packed back into Python.pak.
At this time, some people were also wondering if it would be possible to add our own meshes and textures to Uru. They began investigating the PRP files, which held the actual game data. This was a very slow process: the PRP files had a packing format, and contained objects. There were over 300 types of objects, and each object had its own format.
Path of the Shell complicated things a bit, since it added even more objects to the PRP files, and also changed the KI system (which was used as the basis for flymode). But the actual encryption didn’t change, so after examining the changes, we were able to continue making progress.
Aside project that was going on at this time was Alcugs, an open-source server for Uru that was written by Almlys,starting the day that Prologue shut down. When Path of the Shell was released, Alcugs made efforts to support it as well as the original online content. Untìl Uru was released in August 2004, around the same time that Alcugs was made publicly available. Most people initially ran Untìl Uru servers, but those wanting Path of the Shell content ran Alcugs.
During the online stuff, work continued on the PRP files, with IngisKahn writing and releasing PRPExplorer. The first view versions just listed the objects, but support quickly grew to viewing, exporting, and replacing textures. A new era of Uru hacking had been born: Texture hacks.
Unfortunately, the online aspect meant that PRP hacks had to be done offline, so that there were no Vault issues or file version mismatches. But as support for PRP hacks grew (and editors and knowledge about more PRP objects), more people started adding things to their offline games, and some servers even offered extra clothing options to players.
In April 2005, ycikamookow and IngisKahn released a video of an Age that they had built using ycikamookow’s custom 3DS Max exporter. Shortly after, the COBBS server was cracked, and all posts were lost. Luckily most of the documentation from the H’uru wiki was retrieved and reposted.
The Myst V Mac Demo came out in August 2005, and within a few days we had used the MachO executable to break the new AES encryption and begin to figure out the changes to the PRP file format. During this time, we had a brief discussion with Colin Bonstead at Cyan, who wished us luck with the Uru hacking, and said he wished that Cyan could give us some help in our quest to build custom content.
Almlys had also been quietly working on a new project too. A Blender exporter plugin for Uru, which was released in late October 2005. At first, it could create basic geometry. Within weeks support had been added for textures and lights. All of the Blender plugin features depended on the documentation of the PRP object formats.
Over time, tools changed… The PRP Blender plugin became known as PyPRP, which forked in April 2008 to become GoW PyPRP.
PRPExplorer fell mostly to the wayside as Zrax’s libPlasma work allowed us to create tools like PageEditor and PRPShop.
During D’mala, Cyan accepted some small patches from the community and released them as Untìl Uru updates; but many people saw it as “too little, too late”, as some servers had been running with modified content and bugfixes for years.
Untìl Uru’s global authentication server was shut down, leaving shard owners to either implement their own, or shut down their shards.
Myst Online: Uru Live was released, giving us yet another slightly different PRP packing format, more PRP objects, new encryption methods, but also a better understanding of some PRP objects.
Myst Online: Uru Live spawned the Guilds, and then shut down. A year and a half later we have no further progress on an online Uru, but the tools and documentation for creating custom content have improved dramatically.
So when we say “hacking Uru”, what does it mean?
It means that we are reading the assembly machine code from UruExplorer.exe to find out how it works, and how it reads the PRP objects. Then we are documenting what it reads, and finding out what those values represent.
It means that we are taking existing content and changing it to add new features (such as flymode).
It means that we are using the knowledge we have extracted as a way to write tools that allow us to edit and create content for Plasma.
For some of us, this quest stopped being about Uru and its community a long time ago, the quest now is to understand Plasma and to create new places to explore, ideally in an online environment. To us, an open-source Plasma would allow us to take what we know about the engine and use to it add new functionality and enhance old functionality (when you read the machine code, you tend to see a lot of places where things could be done better, or where bugs could be fixed).
However, without the source code we cannot add new functionality to the actual engine, we can only document its current functionality and use that to create tools.
Mysterium Vancouver?
Okay, I’ve been promising a bunch of updates about a bunch of things on here. Sorry, maybe later… :P
This post focusses on an idea that has slowly been growing since Mysterium 2009 with the live video feed. With the announcement that Mysterium 2010 would be in Minneapolis (and a number of people wouldn’t be able to attend), I thought about it a bit more, got some feedback from Odo, and decided to put this out for review.
Would people be interested in a Mini-Mysterium in Vancouver (BC, Canada)? One weekend, probably offset just before or after the official Mysterium. Consider it an alternative Mysterium for people who aren’t able to travel from the northwest out to the east for a convention.
Feedback, ideas, etc.?
Rewriting pidgin-cyanchat
When I first wrote pidgin-cyanchat over a year ago I had no idea what I was doing. Quite honestly, my knowledge of C was whatever I had picked up reading samples or flying back and forth in IRC conversations. I drew heavily from existing plugins (to the libpurple irc-prpl devs: you are pretty much the only reason this thing works).
I’ve fixed bugs here and there, added a few new features… but I wasn’t really happy with the overall design of the plugin. There were a few inherent issues, and as I was using the IRC plugin as my base, these issues are mainly due to differences between CyanChat and IRC:
- CyanChat has only a single room/channel
- CyanChat requires that you connect to the server, and then join the room/login… you cannot have PM conversations without joining the chatroom
- CyanChat has no user auth, no way to verify that a user is who they claim to be
In the existing implementation, I worked around those issues in a variety of ways, some of which weren’t even fully supported by Pidgin.
- I manually add a chatroom entry to the Pidgin buddylist when a CyanChat account is enabled, and manually remove it when the account is disabled. This prevents the user from setting a “friendly name” alias on the chatroom, and prevents it being moved into a group of the user’s choice.
- Essentially, the code is just full of checks to see if we are logged into the room before allowing PMs to be sent. It’s quite possible to type a number of lines to a user, and have them not sent due to not being logged in.
- I copied from the Bonjour plugin here (which as dynamic buddies across a LAN), and removed the add_buddy function to simply not add a buddy. However, Pidgin still gave me an “Add Buddy” option on all chatroom users. There is an existing bug report for this issue, with an expected resolution in Pidgin 3.0.0.
Wanting to do better, I started this week to rewrite libcyanchat. I split it into multiple files to make editing less of a nightmare, and I actually used comments this time :P
My new implementation is quite different than the existing one. The biggest difference is that one account can connect to multiple servers.
I decided to extend things a bit by making each CyanChat server act as a chatroom in Pidgin. So you create a CyanChat Account, and use the “Join a Chat” menu to specify a server, port, and nickname. A chat opens, which can be added to the buddylist the same way as an IRC channel, or a Jabber MUC. It’s a very nice, clean, easy system… until you remember that CyanChat supports PMs.
Now, a bit of background on the CC protocol… users are sent to the client in the following form
[1 digit user level][nickname],[IP address hash]
Although the server is supposed to prevent users with the same name, the user levels and IP hashes make it relatively simple to identify users. Each user is unique… until you add multiple servers. While there are only two official servers, they use the same IP hashing algorithm, whereas 3rd party servers use a different hashing method. The problem here is that if Bob is logged in on both official servers and I’m having a PM conversation with him, it would be impossible for Pidgin to tell which server I was using to chat with him, because the user ids on both servers would be identical.
So I devised a solution to ensure unique usernames… After the IP hash, add @server:port (thanks Jabber!). That would create a full user id of
[nickname],[IP address hash]@[server name]:[server port]
This works quite nicely for nearly everything. Yes, nearly… because now in a PM conversation with Bob, I get a huge behemoth complicated username sending me chat, rather than simply the nickname. This isn’t a problem in the chatroom, only in PM conversations.
Edit: The user level should not factor in as it would mean messages from ChatServer are spread across two windows due to varying user levels.
So how does on fix that issue? Well, one can’t. Pidgin (libpurple) doesn’t seem to have any way to alias a user who isn’t on the buddylist. So I have no way to simplify the display of Bob’s full id into the simple nick of “Bob”.
I would definitely appreciate feedback on this, especially if someone knows of a workaround for this issue. The biggest problem is that I don’t see any existing protocols which would need to do something like this, and hence I have no examples from which to draw ideas.
Vacation!!
Yes, I know I haven’t updated recently… Here’s a basic summary:
Oh noes! Grad cut-off and chaos!
SSGH fun.
w00t! Graduation!
Geography exams make me a sad llama.
BBQs are awesome.
Anyways, I’m heading off camping again. :D Tofino for a week (leaving tomorrow), and then Barkerville for a week after that. Both are a lotof fun, and both should yield some amazing textures :P
Victoria, Day III
The 3rd day is always the least eventful, and involves a lot of travelling. We walked to Timmies early this morning, and then got on the bus to head to Fort Rodd Hill. We spent close to two hours at Fort Rodd before heading to the ferry to get back to the mainland. The best part of these trips (especially Connections trips) is sitting up near the front and listening to the teachers talk. This is how one learns interesting things, such as the taste-saturating abilities of ketchup.
Overall, the trip was great, and I had a lot of fun again :D
Victoria, Day II
Woke up early this morning (although not quite as early as yesterday) in preparation to head out to visit Frances Kelsey, the only other self-directed school in the province. Stopped at Timmies for breakfast (<3) and went to FKSS. Got a tour by some of their leadership students, played a bit of capture the flag, and then ate pizza with their grade 12 cooking students. I was also introduced as an “invaluable and crucial developer of [my school]’s website” and gave my name to some teachers at FKSS who were hoping to start their own website using the Moodle Project. FKSS is very different from our school, and yet so similar. They have two blocked classes for every subject, and then fewer “flex” times. While our school has a number of very large work areas, FKSS has many smaller work areas, and many more seminar rooms (interesting politics behind that… very interesting politics, that I often see mirrored at our school). We headed back to downtown Victoria afterward, and the grade 11s started the Amazing Race. Jessica, Maggie, and I walked up to Craigdarroch Castle and spent about an hour touring it. Still as wonderful as ever, and still where I one day dream of setting up my residence ;). Then we caught a bus up to UVIC. Not just any bus… a double decker bus! It was amazing to feel so high and superior to all of the other cars on the road, while actually using public transit. Jessica loved the bunnies at UVIC, and she spent 10 minutes or so futilely trying to pick one up in hopes of taking it home. We caught the bus back downtown and grabbed a snack before meeting Godfrey in Bastion Square. Ah, the annual “Food Eating Contest” where each team tries to find something absolutely disgusting and eat it. One team this year had gone to a market in Chinatown to buy their foods, and misheard the cashier say “semen fungus” in place of “persimmon fruit”. I swear Godfrey was howling with laughter for almost half an hour. After the contest, which was filled with its own surprises (btw, congrats Mallika for eating her own, and everybody else’s concoctions). We went to Earl’s for dinner, which was good food, but rather slow service. Then Mallika, Maggie, and I went to take more photos in HDR :D. Came back to the hotel and had a small, short-lived game of football, before heading in for the night.
Victoria, Day I
Woke up at an entirely unreasonable hour (4:30) today to be at school for the bus. Trip to the ferry was rather uneventful, although filled with delicious candy. Ferry trip itself was a bit boring, a number of us were hoping for wireless Internet on the boat, but unfortunately there was none to be found. A few of us played cheat for a while after heading up on the deck. Arrived in Victoria and had some free time for lunch (food court of course! :D) and then a tour of the legislature buildings. The tour this year was much better than last, and I learnt a few things that I hadn’t known before. Then we headed back to check into the hotel, and get things organized. We went out for the group dinner, which unfortunately was to a Chinese buffet-style restaurant. I, alas, am not a big Chinese-food eater. We then walked around downtown for a bit, where Mallika and I took some of the most amazing photographs with Mr. Biggar’s D300 camera. HDR is so definitely FTW! Ghost tour started soon after, and was much like the tour last year, although slightly less exciting IMO. Got back to the hotel, and did a quick Timmies run before bed.
Random fact time: There is only one flavour of ketchup, because ketchup reaches all of the taste areas of the tongue, and in fact saturates them entirely. Ketchup cannot be more “ketchupy” because it’s already overloading the taste sensors in your mouth. This is also why ketchup is so perfect for disguising foods that you don’t like.
Lost in Eternity
Okay, a few reason why my blogging ability fails:
- I have Twitter, which is great for those short things that I want to share. Blogs are fairly boring when each post is only 140 characters…
- Although I often want to respond to Uru forums posts or other blog posts (such as vaaht’s recent post) I generally don’t (especially forum posts, since people seem to take offense to my criticising of their stupidity) or give my thoughts over IMs.
- I have issues with getting my thoughts onto a tangible medium in a way that keeps them intact. I make abstractly logical associations in my head that don’t communicate well… anywhere outside of my head :P
- Usually anything personally ends up in IMs, because I have this fear that my blog will turn into an emo-fest. That, and my personal stuff always seems so mediocre and meaningless in the long run.
So, the past two months in recap? $cat < /dev/dox
Melissa got me hooked on A Softer World; and just yesterday Chacal posted a link to Sequential Art. Those are likely two comics that I will follow irregularly, along with my devotion to XKCD.
I’ve decided/discovered that my favourite time was my grade 10 year, the year I started this blog. Despite what it might seem, that year was a lot of fun and if I could build a time machine, you’d find me in spring 2007.
Grad is coming up, and my ambivalence to the world is apparently an issue for some people. I do care about things, just evidently not the things that I’m supposed to care about.
School is both amazing and boring me to death. I’d really like nothing better than to sit in 2029 all day with friends and read cracked.com, but some people seem to think that my marks aren’t good enough to merit enjoyment and fun. I’ll be spending the next week in physics.
I’m passive aggressive. Deal with it.
I can fill in the entire periodic table on sporcle.com in under 4 minutes. Spring break didn’t go entirely to waste. :P (Incidentally, my friend use spring break to learn all 53 countries of Africa on sporcle.)
I’m doing some work on Ahra Pahts, and there are some days that PyPRP makes me want to shoot myself.
I have 3 computers in my room, with RAM sticks on the floor like candy wrappers. Streaming media server: here we come!
Some days, everything seems blurry and disconnected… like it’s impossible to focus on one thing for very long, or pay attention to conversations… Sometimes I like that, and sometimes you go through a day hearing all the conversations that just catch in your mind and won’t let you think.
Æternity
This is the regret which once brought you down,
drowned you in silent insanity;
Locking you out of both kingdom and crown,
Feel the trials of inhumanity.
How obvious this irony, we dream
of lies to ignore our fate, realize
this world will never be part of your scheme.
The life you wanted, you idealize.
Did you hear how every breath stole your mind?,
eroding you, as you lay in the night.
The cries that never left your lips will find
eternity to haunt you and incite.
I am the dark that brings you to your knees,
I am the storm that silences your pleas.
