69 comments

[ 2.8 ms ] story [ 126 ms ] thread
While the details of this paper are above my head, I can say that, having spent years playing Tribes II, it was one of the smoothest online multiplayer experiences I've ever witnessed. At the time, it seemed very ahead of its time, compared to other online multiplayer games of the era.
I've actually thought about Tribes a lot recently, what with the kerfuffle over hitboxes/tickrate in Overwatch, the architectural issues with The Division (bad game), and general netcode angst these days. I remember the Tribes experience being buttery smooth and precise, even with the high speeds, long distances, and general reliance on physical projectiles rather than hitscan weapons.
And even on relatively slow internet connections, like four players in one room on a 1.5Mbps DSL connection!
That may be part of the reason why it was so good. In 1998, they had to make it playable on 56k modems, and a lot of those optimizations probably transferred over to smooth play over better connections.

Now there are fewer incentives to optimize to that degree...

> I remember the Tribes experience being buttery smooth and precise, even with the high speeds, long distances, and general reliance on physical projectiles rather than hitscan weapons.

I would think hitscan weapons would make keeping things visibly smooth and in sync harder rather than easier.

Obligatory "Shazbot!"

So was the Ghost Stream Manager meant to also help combat packet loss? Or is it more simply a form of "Game state redundancy"? I'm speaking out of wheelhouse here.

I'm always a bit fascinated by these write-ups because so much has to happen in such a small window.

The ghost stream manager was responsible for sending ghost representations of objects. They weren't full objects, but contained the properties or a subset of properties. All of the code was accessible as the Garage Games Torque engine.
Tribes 1 remains my favorite FPS experience to this day.
Yes.

There's still people playing every evening.

I completely agree - there was something so satisfying about nailing an enemy mid air with a disk. I might have to go digging through old hard drives to find all of my scripts...
It still blows my mind that Tribes came out in 1998.

That was a game with vehicles, easy modding (Tribes Football, RPG, Shifter, Renegades, anyone?), incredible mechanics (skiing), massive maps, recordable gameplay, a very active competitive community (OGL, 5150, players like Natural), And it was very playable on a 56k with some servers supporting 64+ players. Frankly, it puts a lot of titles with massive budgets, dev teams, and 18 years of learning to shame.

Thank you Dynamix.

Best i can tell, most of the dev team and budget is dedicated to the art side of the game. Meaning maps, models, sound etc.

And 18 years of learning? Sorry but most of the people and companies from back then are long gone. Best i can tell there are very few game development courses out there, and fewer still focus on the network plumbing.

The difference is substantial: There are books describing some standard practices now, third-party engines will at least include some basic networking functionality, and every worthwhile book on engines will at least mention what you need to do to reasonably support multiplayer. At the time that Tribes was developed, none of that reference material existed yet - you had to do your engineering from scratch, and there were plenty of major releases that shipped a multiplayer that was essentially broken or only viable on LAN - no Internet play, server browsers, or matchmaking.

Today it's more common for multiplayer to only be broken in a limited set of ways, instead of "we are hacking away at a fundamentally wrong architecture for this problem".

>Today it's more common for multiplayer to only be broken in a limited set of ways, instead of "we are hacking away at a fundamentally wrong architecture for this problem".

While true generally, that doesn't preclude us from some epic failures. My understanding is that The Division implemented client-authoritative simulation and is now in a hopeless battle against those that would modify their client for an advantage...

No, it seems relativity free of cheaters. Once they brought out the ban hammer (as well as perma bans), the amount of cheaters seems to have dropped quite a lot.
Half-Life had a major problem with this due to hit-scan weapons that insta-hit instead of using equations to make them travel through the environment. Tribes got around this with the laser sniper rifle by giving it an insanely fast velocity value, so it didn't insta-hit, but still hit basically during the same game tick.
Matchmaking was a major hurdle. The game launched with an IRC client so you could connect to their IRC server and find friends or servers. They had an announcement system to announce in channel what server someone joined.

IIRC, the Master Server was added in 1.04, alongside OpenGL support. Before then, it was Glide-only. Tribes was basically built for 3DFX cards.

Ah, ShifterV1 was the best mod ever. My friends and I used to say that Tribes 2 would be an easy ptoject: just grab the features from ShifterV1 and put on a fresh coat of graphics paint.

Too bad the real Tribes 2 turned out to be such a disappointment.

But in retrospect, even Tribes 2 wasn't that much of a disappointment. The hard-core types that frequented Tribalwar complained incessantly about it, and I grant you that the weeks following its release were bumpy, but there were a lot of people who enjoyed the game considerably.

Now Tribes:Vengeance and the free-to-play nonsense that is Tribes Ascend? Those have brought the franchise to a near-standstill.

Tribes Ascend wasn't that bad during its early beta stages, though. I think that was late 2011 / early 2012. It went downhill with the consecutive patches following the game's release in April 2012.
The devs made some utterly idiotic decisions regarding how they wanted the game to work and it ended up having a whole load of unintended negative effects.

If you're falling above 72km/hr and jetpack, they do nothing and you actually fall faster. Under 72 it decelerates as you'd expect. This is purely because they tried to impose variable physics based on your velocity, which in turn was a bandaid to address other issues.

They really shot themselves in the foot and only as of about 6 months ago - if that - has a small subgroup of the old devs been allowed to start unravelling the mess and make it more like Tribes 1. Before that, they basically ceased work on the game and abandoned it in favour of throwing all their devs at their next cash grab endeavour, Smite.

SMITE's actually a really good game though with a very fair and affordable payment system.

Criticize them for not allocating enough staff to maintain Tribes Ascend, sure, but it's unfair to call SMITE a cash-grab.

Fair; I called it such because I was bitter that they completely and unapologetically dropped T:A just as it was getting some momentum behind it simply to divert everyone onto SMITE. It felt like the next trend came along (MOBA) so they just completely abandoned T:A without a second thought.
You're joking, right? It took something like 3 months of near-constant patches before Tribes 2 would even run on my machine. It was the buggiest game I've ever bought, and I was shocked that they'd chosen to release it in that broken state.

By the time they'd patched it well-enough that it actually ran somewhat reliably, my friends and I had completely lost interest in it. Tribes 2 was a franchise-killer. I never even tried Tribes: Vengeance after that debacle.

(Tribes Ascend started out great, then became a textbook case of how pay-to-win makes good games terrible.)

Playing Tribes 2 was where I learned about Unhandled Exceptions and exception handling. (I wasn't coding regularly then.) The game regularly crashed with "UE"s several times an hour for the first few months. At one point, I downgraded to a TNT2 to get it to play.
Tribes: Ascend was also fine, even with the free-to-play parts, until they pushed the monetization just a little too far. I think I have something like 200 hours in it playing the basic classes with most of the essential unlocks, and it was a great game. And then they released way too much paid DLC and things got a bit too ridiculous for me.
Ascend now gives all unlocks for a fixed price. The game has received some support recently, mainly changes to make it more like classic Tribes games.
That's cool to hear! I'm glad they finally made the paid content system sane.

Though... for this guy in particular it came too late. At this point Tribes: Ascend will probably remain a game I at one point played every night.

Skiing was a bug - friction didn't apply to players while the jump animation was playing, but gravity equations did, so players slid downhill a bit. During beta, players learned to hammer their spacebar to maintain this frictionless state, skiing incredibly fast. Eventually, a script was released to automate this, repeating the jump when spacebar was held down; other games might consider this a cheat, but the community embraced it, and so did the devs.

Xtremeski came later...

Skiing was a bug in Starsiege:Tribes - it was a feature in Tribes 2 and arguably made the whole series into what it is.

The community eagerly awaits a reboot that can even come close to challenging the technical & operational superiority of T1 & T2. What masterpieces they were.

(comment deleted)
hmm.. a Ben Garney post and a TRIBES engine post.. is there a Dynamic/GarageGames data dump going on ? :-)
(comment deleted)
I saw it in one of the video conferencing posts he had. It was too good not to highlight!
(comment deleted)
Part of why Tribes was such an incredible experience was it had 64 player servers. The maps were constant chaos. Haven't quite experienced anything like that since.
PlanetSide and PlanetSide 2. While hard to get into, when platoon level operations are at their best it's something I've yet to experience in another game. I expect Eve would be the other example, but with time dilation and combat mechanics, the game is more strategic than tactical in my understanding.
PS2 still going strong? I thought they were combining server populations to help increase the size of each remaining server.
It just recently had a major update so people can build their own bases and stuff now.
Interesting, maybe I should get back into it.
Planetside 2 IMHO is the best Starsiege Tribes yet.
PlanetSide was by far the most unique shooter I've played. Easily my favorite game, to date.

The level of camaraderie, intensity, found in large outfit/platoon fights was unparalleled. PlanetSide 2 can't compare.

It's really a shame that the game had to go downhill like it did. SOE has a habit of killing incredible games.

The battlefield series tends to support a large number of players on very large maps. No jetpack assisted skiing though.
Battlefield 1942 came out 4 years later. Although it was incredible fun too. Its network code was infamous. Unloading entire magazines at point blank range was certainly no guarantee that you'd even scratch your target.
BF1942 is still the best game ever, though 64 player servers were not practical. 32 player games were amazing fun. I hope I can one day find its spiritual successor.
Random but related: does anyone know of a good library (in C#, Javascript, or really anything higher-level than C preferably) that implements this? By "this" I mean a UDP-based system capable of sending both "it's stale when it's sent" data that can be dropped if it's lost and "this must be delivered" messages that will be re-sent if not delivered?

I would need it for a Unity project, so if it's Unity-ready already that would be great, but honestly at this point I'm willing to just take what's out there as a starting point and work with it.

I did find this: https://community.unity.com/t5/Asset-Store/Open-Source-UdpKi... but it's apparently unsupported now and the author has moved on to other things.

There are some other packages on the Unity Asset Store but most of them are focused around Unity-to-Unity communication, and I'm looking for something more generic (since my architecture is actually Unity-to-NodeJS currently).

The Unity team plans to release a C# package for UNET low level API after the release of 5.4.0. I would caution that while it's extremely straightforward to implement those two QoS channels, you would be essentially reimplementing LLAPI and all its quirks, including queue management for a single threaded architecture.

If you are building something for mobile, consider the state of UDP support over AT&T, Verizon, T-Mobile and Sprint. It's poor. You will be reimplementing so much of LLAPI and Unity's relay servers that it may be more effective to port from NodeJS to Unity and run headless.

http://enet.bespin.org/ is C. But, it implements reliable|unreliable packet-based messages over UDP. You can have multiple "channels" active in a single connection. Each channel can independently pick a mode. Packet retries in a reliable channel do not delay packets in another channel.
WebRTC Data Channels http://www.html5rocks.com/en/tutorials/webrtc/datachannels/ let you freely mix reliable and unreliable data. I donno if there's any bindings from the webrtc library to unity yet.

EDIT: https://www.assetstore.unity3d.com/en/#!/content/47846

Tangentially: does anyone know of any great server-side implementations of this? So that a regular server could be a WebRTC peer?
... it's peer to peer ... the server acts like a peer... the same code can run for both peers ...

So you can choose any webrtc binding for any language you use server side.

Yes, sure. Incidentally, I haven't found any decent WebRTC bindings that aren't tightly wound to browsers.
For anyone interested in game networking the Quake 3 Network model was covered by Fabien Sanglard in this great blog post:

http://fabiensanglard.net/quake3/network.php

This paper come out in some form MUCH earlier than 2009. I was implementing its idea in my own engine in ... I dunno, 2003? Or earlier?
Well, Tribes was released in 1998.
Oh man this brings me back (and I'm probably not old enough to be allowed to say that)! My first real start with game development, and well serious coding, was using the Torque Game Engine, which is the Tribes II engine. I saved up my money to buy a license for Torque 1.5 (it was $150 I believe and I was in high school), because at the time it was the only game engine which 1) Had source code access, 2) Wasn't insanely expensive for a hobbyist, 3) Was fully functional by itself.

The engine overall was pretty amazing, of course it had it's warts. I still remember the networking code pretty well. I played with the physics part of the engine quite a lot and rewrote and modded it a few times. I usually wanted networking in my experiments, so I learned a lot about that part of the engine as well. I don't play with gamedev anymore, and probably wouldn't use Torque if I did, but I really miss it and the community it had. I still check in on it once a year or so, and there was a blog post recently thanking many community members from the past, and my old username was on the list :') I'm looking through my old forum posts now, wow was I annoying for a few years!

For anyone who wants to look, the latest version of the engine is now MIT licensed [0]. It's been through 2 major versions, and seems like they've simplified the inheritance, so I'm not sure how much is still intact, but netObject looks a lot like I remember. I would recommend redding the comments in the header file for a good overview of how it works. [1]

[0] https://github.com/GarageGames/Torque3D

[1] https://github.com/GarageGames/Torque3D/blob/bacf0cde2af17ab...

Definitely played the crap out of Tribes 2. I remember at the time it came out, I was so astounded by the smoothness of the gameplay and the sheer variety of tactics and options that I almost didn't believe it was possible. To support as many players as it did and deliver that level of experience over the internet technologies of the day was incredible. Also, for me, the game basically came out of nowhere. I missed out on Starsiege: Tribes and had never heard of the developer before Tribes 2.

"Get the enemy--shazbot."

Slightly off topic, but still related to Tribes...I remember purchasing Starsiege back during this time (if I remember correctly it and the original Tribes were released around the same time, along with Half-Life).

I never played the original Earthsiege I and II titles, but Starsiege was super cool for me as a kid, and it wasn't even really because I got to pass the game (it was kind of difficult for me at that age so it probably wasn't until ten years later that I actually played it again from the beginning and passed it).

The main thing I loved about the game was the big backstory book that was included with the game that really outlined the whole thing for you and gave you a pretty cool connection with the characters (looking back it was like a mix between The Matrix and the Terminator franchises in terms of story).

I'm not a movie director but occasionally I still find myself thinking about what a cool movie it would make and wish a new game for it would be released (since the last attempt got *nixed).

Tribes was cool too, don't get me wrong, and I played a fair amount of it too (though by 26.4 kbps connection kind of hurt my online play, lol), but compared to the more story driven Starsiege, I never got into it nearly as much.

I thought the last section was pretty funny:

"Acknowledgments Though several of the ideas presented here are unique to TRIBES, others have been assimilated from other sources over countless years of reading and the authors, being too lazy to research their sources, would like to thank everyone in one sentence."

This game ate my life in college. My friends and I founded tribalwar.com in late 1999, and I spent the next 3 years learning how to code websites. I was never that great at the game, but the skills I learned coding websites led to my first professional job.
This whole thread was a walk down memory lane. It also consumed my life in late high school and college.

Thanks for tribalwar. It was my HN before HN, and my slashdot before slashdot. Lots of hours spent on that site. I was Zoidberg in the community.

As a devoted member of TribalWar (thanks so much!) / avid T1 player, its awesome to see you on HN!

My handle was Duhck :)

Tribes was... magical. Tight knit player community, active modding community, amazing map design and tournament play.

Team Rabbit, Arena, and 10v10 CTF consumed the majority of my time from '98-'06