15 ms·
Wi Flag (2002)
- Goronmon 4y agoStrange to see this exact topic come up twice in two days (the other on Reddit). But as a huge fan of the original AC, it's always fun to see it come up still.
- jedberg 4y agoMost likely someone saw it on reddit and posted it here. :)
- TheRealPomax 4y agotl;dr: players get attacked based on monster targeting RNG that's supposed to take an interval [0,num_players], assign players to subintervals that are shorter or longer based on a bunch of factors, and then roll a random number somewhere in that full interval. Whoever's subinterval the number ends in, they get targetted. Instead, the code assigned subintervals and then rolled a number between 0 and 1, instead of 0 and num_players. If your player happened to sort to the top of the list for subinterval assignment, you'd be it. You'd always be it. Someone had to think to look at this, then confirm the maths, before it was found, years after the symptoms got reported. A unit test would have caught this, but didn't. Writing tests is annoying, especially in a codebase that keeps changing, but it's so important that this should count as one of those "this is what happens when you don't" lessons. Money was lost here.
- jefftk 4y ago> You'd always be it. It's slightly more complex than that: if you were farther away or otherwise in a better position than average your portion of the interval would be <1, and so even if you sorted first you still weren't guaranteed to be hit.
- TheRealPomax 4y agoUntil you were actually taking part in combat and did damage to something, at which point you'd be it.
- SamBam 4y ago> A unit test could have caught this I've always wondered the best way to write tests for "This event should happen x% of the time." Obviously we could re-run the test 100 times and see if it happened close to x%, but not only is that inefficient, how close is "close"? You'll get a bell curve (or similar), and most of the time you'll be close to x but sometimes you'll be legitimately far away from x and your test will fail. You could start from a known seed, but then are you really testing the percentages, or just checking that the RNG gives you the same output for the same seed, which you already know?
- hashkb 4y agoYou can mock the RNG. You don’t need to test/prove it’s random, you need to test your code which is not random.
- hinkley 4y agounit tests are notoriously bad about testing n>2. I just ran into a problem with sorting recently that was caused by buggy comparators, but it didn't bubble up to the tests until the runtime switched to a different sort implementation. Most of the tests were doing n=2 so it was not visible under the old runtime version but was under the new one. This has been broken in production for months if not years. If the test had used n=5 I'm pretty sure the old tests would fail as well.
- delecti 4y agoYou would probably not test "happens x% of the time", but rather that for a given set of inputs, passing in 0.1, 0.2, 0.3, etc, let you have the expected outcomes across the distribution. So you're testing that you can achieve each outcome across the spectrum with a pre-selected "random" number.
- jerf 4y agoIn the similar situations I've run, what I've often done is: 1. Start with a known seed. 2. Run a single test run like what you say, and verify this run by hand. 3. Freeze the test in this state, that is, assert you get that exact result every time on the given seed. What this creates is not what I would strictly speaking call a "unit test", but it does sort of pin the algorithm to your examined and verified output. In this case, a human would quite likely have caught this problem on a decent test set. Obviously, there are other pathologies that would slip right by a human; the human being careful only raises the bar for such pathologies, it doesn't completely eliminate them. But at least freezing it solves the problem where a change you did not realize would be a change slips by unnoticed and this function suddenly has a completely different outcome. This has worked for me, in the sense it has caught a couple of bugs that would have had non-trivial customer implications. But I've never worked on an MMORPG or anything else where randomness was intrinsic to my problem; it has always been incidental, like, is my password generation algorithm correct and does this sample of my data look like what I expect, not the core of my system.
- EarthLaunch 4y agoIs it so important? I think this made the community and game world more interesting. It's emergent behavior. As a game developer, I hope I can make things complicated enough to have emergent behavior, even if that's just from my bugs.
- TheRealPomax 4y agoYou know what would have made it even better though? Not having a bug that made your character cursed through no fault of your own without any recourse.
- claytongulick 4y agoWould it have? Now a player named Wi is still the subject of conversation on at least two major online discussion forms over 20 years later. From what I've read, it introduced quirkiness and a bunch of unintentional community involvement, with likely much hilarity. The goal of playing a game is to have fun. Dealing with frustration can also be fun, in fact the Dark Souls series recognized this brilliantly. This bug, while undoubtedly frustrating, sounds like it was also a lot of fun for a lot of folks.
- toast0 4y ago> A unit test would have caught this, but didn't. Unit tests for things with probability are hard. I've written one recently, and among other reasons, it convinced me to write the selection differently so it was both more 'fair' and more easily tested.
- btown 4y agoMy startup integrates with numerous third-party data sources, and they'll send quotes in all shapes and colors, usually providing both a total and a complicated breakdown which we need to parse and reshape/classify into line items in our system. And since it's very easy to introduce a bug that skips over a fee accidentally, part of our code review checklist is to ensure that we always explicitly check that our code summing over our final line items sums to the actual ground-truth total; we have a runtime assertion that logs an error to Sentry and, depending on business requirements, shows a (friendly) error rather than incorrect pricing. It's saved us many a time from silly bugs where we're non-exhaustively handling parts of the breakdown data structure. To generalize, it's vital to have something like Sentry from day one - a low-cost abstraction that lets you monitor broken assumptions asynchronously. Though of course, these kinds of tools didn't exist in 2002!
- thecapybara 4y ago> A unit test would have caught this, but didn't The first unit testing library, JUnit (Java), was released in 1997. Asheron's Call was released in 1999 after four years of development. It's quite possible that this bug was introduced before the concept of unit testing even existed or was widely known.
- rcme 4y agoThe RNG was supposed to generate a random number in [0, sum of weights] not [0, num_players]. It's also possible to write a test for this where the behavior in the test accurately tests the wrong behavior. The error is pretty subtle. There was even a “bug” in your summary of the bug ;)
- hinkley 4y ago> Writing tests is annoying, especially in a codebase that keeps changing Only if you don't have a functional core. One of the psychology tricks I've learned about unit testing is just how bad sunk cost fallacy affects some people (all the time, and most people some of the time). I've witnessed people pairing for two days to fix a couple of nasty integration tests. That's 3 person-days of work lost on a couple of tests. How many release cycles would it take for that test to pay for itself versus manual testing? You want the tests at the bottom of your pyramid to be so simple that people think of them as disposable. They should not feel guilty deleting one test and writing a replacement if the requirements change. Elaborate mocks or poorly organized suites can take that away. Which is hard to explain to people who don't see the problem with their tests. You also want the sides of that pyramid to be pretty shallow, especially if you keep changing your design.
- squeaky-clean 4y agoWas money lost here? Everyone in this thread who played AC is speaking pretty fondly of the bug.
- dylanpyle 4y agoI've seen a similar mistake in a rushed "feature flagging"/phased rollout system. User IDs were random UUIDs. Let's say we want to release a feature to ~33% of users; we take the first 2 characters of the UUID, giving us 256 possible buckets, then say that everyone in the first 1/3 of that range gets the feature. So, 00XXX...-55XXX... IDs get it, and 56-FF do not. This works fine. However, if we then release another feature to 10% of users - everyone from 00-1A gets it, 1B-FF do not. That first set now has both features, and 56-FF have none. It turns out you can't draw meaningful conclusions when some users get every new feature and some get none at all.
- deleted 4y ago[deleted]
- xmonkee 4y agoHuh, thanks for this. Will live in my head from now. Basically, in this situation, use (user_id, feature_name) for hashing, not just the user_id.
- dabeeeenster 4y agoHaha funnily enough that is our (Flagmsith's) exact algorithm!
- yiuywieyrw 4y agoA better way is to assign some internal salt to the feature at creation time and use that, that way you are not dependent on something external that user (the creator of the feature flag) could change. I bear the scars of this design mistake from when I worked for a company that provided feature flagging. It was not my initial mistake, but I drew the short straw trying to work around it.
- xmonkee 4y agoSolid tip, again.
- dekhn 4y ago
- veilrap 4y agoI love the "lore" that this sort of bug creates, especially in these sorts of large scale multiplayer environments. Players claiming to be cursed, and the curse was real! A very different sort of event that it reminds me of is the old World of Warcraft plague: https://en.wikipedia.org/wiki/Corrupted_Blood_incident https://en.wikipedia.org/wiki/Corrupted_Blood_incident
- iamdbtoo 4y agoMy theory for why people think they are being "shadowbanned" or otherwise targeted by a social media company is often because of bugs like this. They are weird and almost like gaslighting in the way you experience them and people who don't understand how these bugs can exist assume sinister motives.
- nyanpasu64 4y agoShadowbanning is a very real phenomenon; my current Reddit account was shadowbanned twice because I had created and posted memes which got unusually high upvotes for a new account, and the algorithm thought I was a bot reposting images to farm karma for future spamming. And from time to time I see HN users whose posts are flagged by default. I'm less sure if/how shadowbanning occurs on Twitter.
- kevingadd 4y agoThe problem is that while shadowbanning is a real thing, there are lots of bugs that also appear to be shadowbans and might just be a momentary glitch or an unintended interaction between systems. In Twitter's case, there are multiple different penalties that can apply to account and people refer to them all interchangeably as a "shadowban". And some people claim to be shadowbanned when as far as anyone can tell there's no function in Twitter's system to do it, there's just something weird happening in the infrastructure or algorithms (or it's all imaginary, who can say)
- mistermann 4y ago
- downvotetruth 4y agoWhat does "Wi" stand for in the stamp? Would have been better to have a flag of freshmeat.
- trynewideas 4y agoApocryphal but as valid as anything when it comes to MMO terminology: https://forums.ddo.com/forums/showthread.php/264543-Wi-Flag-has-manifested-itself-into-this-game https://forums.ddo.com/forums/showthread.php/264543-Wi-Flag-... > Anyone who played Asheron's Call probably heard of the AI bug associated with monster Aggro where a person name "Wi" was forever cursed with getting the aggro no matter what.
- hesdeadjim 4y agoFrom what I recall it was a character named Wi who was persistently vocal about it.
- emdashcomma 4y agoOne of the impacted players had an in-game character named Wi.
- BryantD 4y agoAs trynewideas says, “Wi” was the name of the player who famously described this problem. Source: I worked for Turbine at the time.
- jefftk 4y ago(2002)
- karaterobot 4y agoSo it's not really a flag, it's that the algorithm that determines who the monsters attacks had a bug. The bug made it so that when there were a group of players to choose from, the mob would always pick players whose (hashed) identifier was higher on the list. Since the hash of your ID doesn't change, those players would always get picked on first. Like if your name is Aaron A. Aardvark, you're always coming first on any alphabetized list.
- dmurray 4y agoBut it wouldn't always pick them, it would pick them with a higher probability that also depended on the players' relative distances to the monster. So it's a stochastic bug where any given occurrence can be explained as "you just have confirmation bias, you don't notice all the times Zygy Zebra gets attacked" or "you must have been closer than Zygy even though you thought you were a bit further away". Especially if the game has a first-player perspective which makes it harder to estimate whether you or another player is closer.
- EarthLaunch 4y agoWhy does weighted randomness seem so difficult for games? Are there any libraries that simplify this? I couldn't find any for JS. So I created my own "algorithms" for things like randomly choosing which type of plants spawn in the world. It weighs them by the local frequency of each land-type. Eg if there's more swamp nearby, it's more likely to spawn cattails. It's awful. Not intuitive. Weights have to be passed in ordered smallest to largest. Posting in hopes someone will correct my entire approach or point out an industry-standard way of doing these things. Utils.weightedRandom(percents, types) function weightedRandom(weight, outcomes){ var randNumber = Math.floor(Math.random()*100) for(let i=0; i<weight.length; i++){ if(randNumber<weight[i]){ return outcomes[i] } else { randNumber -= weight[i] } } }
- freitzkriesler2 4y agoI've been pondering a way to implement a quantum random number generator into a game. Could this be useful at all?
- EarthLaunch 4y agoWhat is the general benefit to a quantum random number generator versus a regular one? Is it that it's more truly random, or has a better distribution, or?
- jefftk 4y agoIn Python: random.choices(population=['A', 'B', 'C', 'D'], weights=[3, 2, 5, 7]) https://docs.python.org/3/library/random.html#random.choices https://docs.python.org/3/library/random.html#random.choices
- EarthLaunch 4y agoThank you very much! That led me to a JS clone[0]. Python has amazing math libraries. I use numjs[1] for everything, which is a port of numpy. I frequently wish I had use of Python's libraries. 0: https://github.com/parmentf/random-weighted-choice https://github.com/parmentf/random-weighted-choice 1: https://github.com/nicolaspanel/numjs https://github.com/nicolaspanel/numjs
- deleted 4y ago[deleted]
- Aeolun 4y agoHmm, when they told me they were assigning people to a list I kind of knew what the answer was going to be. What is curious is that it took them a long time to find. I’d think that -as long as you believe there is a bug- this should be fairly straightforward to spot.
- Goronmon 4y agoI could be remembering incorrectly, but back when this was occurring no one knew that issue was specifically limited to "mob spawns attacked certain people". The more honest description is the line about "From the beginning of AC, some players have complained about unbelievably bad luck." People blamed this behavior for everything from loot drops, to combat outcomes, and to aggro mechanics. And also remember that AC was before MMOs became massively popular, and outside of specific events and locations, there wasn't always more than a handful of players in a certain area for a given server where aggro mechanics like this would matter.
- ok_dad 4y agoI was waiting for them to say something like "then we take the random variable and multiply it by 3 to correct for this" and then explain some other, more subtle, bug. Looks like we all make stupid mistakes like this sometimes. I made a bug where I tried to get the month number for the next month, so you had to wrap at 12, but I just did "(current_month + 1) % 12" and left it at that, thinking for some reason that modulo works differently than it does in reality. Some stuff broke recently, due to that, and it was quite embarrassing.
- Aloisius 4y agoI must be missing something. That is how modulo works. Well as long as January is month 0.
- SoftAnnaLee 4y agoIt seems that the issue is that `January === 1`; so when you get to December (i.e. `12`) it rolls over to 0 rather than remaining as 12.
- hesdeadjim 4y agoSome of my fondest gaming memories are from this game. There was nothing ever quite like it, and the allegiance system created a special type of community bond that I haven’t seen repeated. At one point I had 10 “vassals” sworn to me, and in our allegiance that came with the expectation that you assist and mentor those under you. Stakes were higher when our allegiance committed to being red dot PKs on a white server with a few other stronger groups in play. The server emulation scene has come a long way since retail shut down, but even the most populous servers are a pale shade of this game in its hey day.
- loganc2342 4y agoMMOs are just so expensive to develop now that innovation is almost dead. You either make a WoW-like or you die (and many times you die anyway). They really don’t make MMOs like they used to.
- tsgagnon 4y agoSocial media has taken a significant bite out of what I would consider the more important parts of the older MMOs, especially when it comes to apps like Discord. Not enough people want to interact in games anymore outside of specific gameplay scenarios.
- bob1029 4y ago> MMOs are just so expensive to develop now that innovation is almost dead. I look at this differently. I think the extreme cost of an MMO should force innovation. Take the constraints for what they are and run with them. Accepting that you can't do it the "traditional" way is the first step to figuring out a better way. There is nothing that says a high-quality WoW killer absolutely must cost 10 figures to produce.
- Thaxll 4y agoIt does though, MMO are very complicated to do and there is a lot of tech to build by specialized people. The content is an other issue. You won't build anythinng close to wow bellow 100M.
- NKosmatos 4y agoI enjoy reading such stories, where the software fault (or glitch) is something very simple and easily overlooked. Mind you, this story is from 2002 :-)
- anyfoo 4y agoAround 15 years ago, when casual little games on Facebook were still a thing (actually when Facebook itself was still a thing), I used to play Yahtzee on the site while watching TV shows or whatever. It was one of the most popular games on there. For me it was something to fidget with (there was no money involved or anything, just a personal high score), so I played it a lot. I felt more and more that dice values of specifically 1 and 6 were harder to come by than other values, so one day I sat down for a few minutes and logged the value of 100 or so dice throws. Turns out I was right, the distribution was not uniform: 2-5 were fine, but it seemed that it was twice as hard to get a 1 or a 6 compared to any other value. I even did a chi-squared hypothesis test, because I was crazy. (And because I was studying for my statistics minor in university at the time). Seeing the result, the problem was pretty clear, without even knowing the source code. Almost certainly, they had a random number generator giving a number in a uniform range, let's say from 0 to 1, and did something like the following to get a dice value from 1 to 6: value = round(random()*5)+1 Do you spot the issue? The problem is that round() rounds to the nearest integer. So any value between, say, 1.5 and 2.5 (exclusive at one end) rounds to 2, 2.5-3.5 rounds to 3, and so on. Add 1, and you have the dice value. But the ranges for dice values 1 and 6, are only 0 to 0.5 and 4.5-5 respectively, so ranges that are only half the size. The fix should be extremely simple: value = floor(random()*6)+1 The crucial point being to use floor() or ceil() instead of round(), to only round towards one direction. I wrote up exactly this in a short email to the company that made the Yahtzee game. They did not reply and just silently fixed the bug, right after my email. I was disappointed and stopped playing.
- bscphil 4y ago> I wrote up exactly this in a short email to the company that made the Yahtzee game. They did not reply and just silently fixed the bug, right after my email. I was disappointed and stopped playing. I love this. It's one of those things that's entirely intelligible to me but I imagine would be next to impossible to explain to a Martian.
- deanCommie 4y agoSame :) But here's another layer, though. What if it isn't? Our science fiction is filled with this fairly human-chauvinistic worldview where even in a hypothetical future where we are rubbing shoulders with many different alien species, many of them technologically superior to ours, some of them still admire or begrudgingly respect us for our ingenuity, spirit, some je ne sais quoi. That we're illogical and inconsistent and jealous and petty and insecure, but also humble and funny and empathetic and creative. But...we have no evidence that this would be unique about humans whether sentient intelligence is common throughout the universe or rare. In fact, it's quite possible, that this is a necessary prerequisite, side effect, or consequence of conscious intelligence. So this hypothetical martian maybe would just smile, nod and say "Ah yes, the company was embarrassed, or didn't want to risk liability, or didn't want to risk their reputation being compromised. But OP just wanted a thank you. He wouldn't have wanted money, just a 'hey thanks for finding that for us'. And it soured him on the whole experience. Been there, my new human bro, been there." edit: I wrote this before I saw the rest of the replys, and HOLY, there's a bunch of humans that don't understand why OP stopped playing.
- BryantD 4y agoSandra Powers (who finally figured the problem out) and her husband have been writing and running their own MMO for quite a while now. Check out http://projectgorgon.com/ http://projectgorgon.com/ if you’re interested in something handcrafted, quirky, and high quality.
- tsgagnon 4y agoWow, I had definitely forgotten that was being worked on still, it's been a long time since I've played it. Also reminded me that I backed Camelot Unchained that's still kicking around in development after all these years.
- DanHulton 4y agoI keep forgetting about this game and meaning to go back to it. Definitely the "weirdest" (in a good way!) MMO out there.
- don_neufeld 4y agoI had the pleasure of working with Sandra at SOE for a while on EverQuest II, and later I contracted with her and Eric to help at my startup Ohai. They are both wonderful people and it's great to see this game is still ongoing.
- shostack 4y agoHow has that one been shaping up?
- sveiss 4y agoMy favourite part of this story is that Sandra's handle on the fansites at the time was "srand". A highly appropriate coincidence, given the nature of the bug!
- jjcm 4y agoLove bug deep dives like these. Along a similar line is the "foxes lead users to treasure" behavior in Skyrim: https://twitter.com/JoelBurgess/status/1428008041887281157 https://twitter.com/JoelBurgess/status/1428008041887281157
- shihab 4y agoI don't quite get the bug, that is what exactly makes the fox follow regions of denser triangles?
- lanternfish 4y agoBasic probability - randomly walking a graph will tend to have you in regions of higher vertex density. Same reason why randomly picking a road intersection will tend to put you in cities - cities just have most of the intersections. (the walk isn't exactly random but it still works - the pathing heuristic is real-coordinate agnostic).
- nluken 4y agoI love hearing about bugs like this one. It's a nice reminder of the problem solving that made me fall in love with computer programming, which sometimes gets obscured in the day-to-day processes of working on software.
- ergonaught 4y agoI miss AC so much it hurts.
- dualboot 4y agohttps://emulator.ac/ https://emulator.ac/ =)
- thomasskis 4y agoI dream of the day when I can ask an LLM to write a modern version of AC in Unreal 7... Exploring Dereth with reality level detail would be incredible.
- vehementi 4y agoYeah, reading through this thread I get an actual little pain inside.
- deleted 4y ago[deleted]
- theptip 4y agoIt seems quite uncommon to write the statistical unit test for this sort of algorithm; I suppose most languages lacking statistical programming toolchain makes it less appealing. I wonder if there’s a cheap Frankenstein approach to create a test-only interface into your code with a CLI / FFI and wrap it with some Python to easily test the result distributions. Then you can use tools like scipy or newer probabilistic programming frameworks like pyro. Not sure what the FFI story is in R, maybe something similar could be done there.
- GuB-42 4y agoIt reminds me of the "charm tables" of some Monster Hunter games. Charms are equipment with randomly selected skills. When you create a character, you are assigned a random "table" and all charms you may get are selected from that table. There are 17 of them, 12 of them are normal with some slightly better suited to some play styles but it is a really minor thing, the remaining 5 are called "cursed tables", they are much smaller and you will never be able to get the best charms. It is not game breaking, but it is annoying if you want a highly optimized build. The reason it happen is that the random number generator has only a small state (I think 16 bits) a limited number of possible rolls, and some seeds have a really short period, which limits it even more. Also, the seed is stored in your save file. It means that if you have a bad seed, you will always have a seriously broken RNG and the only way to change that is to create a new character. I think in later games, the same terrible RNG is used, but a new seed is picked each time you start the game, so you won't stay in the same "table". And while "charm tables" are the most obvious consequence, if probably has other, less noticeable effects on gameplay. The weird part is that while it is obviously a bug as it negatively affects the experience of some random players, it is rarely referred to as such. It even persisted between versions. Some people even wrote tools to find out early on which table you are, and techniques to get the table you want, along with a variety of RNG manipulation exploits.
- tm-guimaraes 4y agoYes, Monster Hunter 3 Ultimate had the permanent table. While 4 was for game session.
- kypro 4y agoWhat am I missing here? Unless all the devs were really bad at maths (unlikely if they're game devs) then this seems like a really easy bug to find all things considered? I thought maybe it was going to be some weird DB glitch or something far upstream from the algorithm selecting which player to attack, but it was literally the logic of the very algorithm you would first look at if you were aware of such an issue. This was a fun read though. Finding and fixing bugs like this is some of the most satisfying work we do imo, and no one outside of tech understands =)
- mabbo 4y agoIt's game code that was written in the late 90s. Unit tests aren't very likely. And a quick glance at the code probably looked completely sane.
- hinkley 4y agoI'm missing something here and it has nothing to do with math. Why couldn't they reproduce the problem in testing? For what was it, years?
- voakbasda 4y agoLikely because they tested with characters that were not affected. Sometimes reproducing bugs takes good luck more than skill.
- remram 4y agoAll characters would have been affected. If they had picked any 3 characters, and put them in a room with monsters repeatedly, they would have observed that the same character was attacked most times.
- Normal_gaussian 4y agoSystematic debugging flaws probably; and lack of tooling to easily isolate. Systematic flaws: a cross between groupthink, early flawed assumptions, deference to team leads, a 'I just look for 1hr, if I can't find move on' (which leads to not looking), or just plain simple "reading" instead of searching. Lack of tooling: many game engines are infamous for lack of control over tooling. I havent used many, but I understand it would be quite an effort to run meaningful parameterised or structured fuzz testing on most systems. This makes it hard to artificially confirm suggestions. That said, there is practically no excuse for them not to just add a bunch of counters to the game - even on their internal testers it would very quickly become clear there was a bias. Most of my 'should have caught it earlier bugs' are of the 'deference to lead' variety. I looked, didn't see immediately, handed off with some notes, and then the follow up debugger(s) took notes or thoughts as gospel. This is really hard to fight - I write something along the lines of "my hunch is there is a problem in code x because it handles y and is poorly structured/tested. I checked z and found i, j - queries as follows" and then find the debuggers effevtively refuse to look anywhere past x. This is particularly true for a group of debuggers, who play chinese whispers with groupthink and invent reasons it must be x.
- jdk 4y agoReally didn't expect to see AC at the top of HN. Asheron's Call was the first game I worked on and I remember all the times we'd joke with Wi about it and watch monsters beeline for him. It seemed like one of those "Haha sure, player perception" problems and not something that was actually real. IIRC someone did a very cursory look at the code at one point but it never bubbled up as important enough to assign someone to to actually investigate. Wi came to one of the player gatherings with little printed out cards and would hand them to people and say, "You've been Wi flagged!" The fondest of memories.
- berkle4455 4y agoSorry, who is Wi?
- johnnyo 4y ago"Wi" was An early player of the game that was the a victim of the bug. His character's name was Wi, and the bug was named after him. I remember people theorizing it was due to a short name (only 2 characters), and so would create longer usernames to try and avoid the "curse"
- nevir 4y agoAC was such a fantastic game and community - props to all you at Turbine that worked on it. So many great memories for me!
- jdk 4y agoThanks! Glad it holds a special place for you :) In retrospect, I give a lot of credit to the fact that we were young and dumb and didn't know any better. I've been revisiting a lot of the stories from back then and so many of them end up with us saying, "I dunno, let's see what happens!" and not being dissuaded by "best practices" or even common sense. Also lots of credit goes to the early internet era when people were a LOT more forgiving of, well, everything.
- Naomarik 4y ago
- deleted 4y ago[deleted]
- thomasskis 4y agoThe bugs in this game lead to some of the greatest gameplay of all time. I think the best bug was the movement possibilities during spell casting from breaking animations. It created one of the most complex and amazing PK (PvP) dynamics of any MMO to exist. The complexity of being able to move only so much to still get your cast off, and being able to slightly fast-cast or hold long delay-casts to "outplay" your opponents created so much depth to duels it was incredible. Even after all these years I can still remember the Arc cast I would do, it was the keyboard combo: Hold Left -> Hold Z -> X -> tap/hold up to control the radius Then Hold Right -> Hold C -> X -> tap up to reverse the arc to return to where you initiated the cast so the spell could go off. Man I miss this game, I hope someone creates a wonderfully buggy remake someday!
- thomasskis 4y agoIf anyone remembers the days when guys like "Rookie" or the UD's figured this out and mastered it, what a time to be alive! Good ol' AB wars... :)
- thomasskis 4y agoWow I had to go on a nostalgia tour and I found a Rookie classic: https://www.youtube.com/watch?v=FwpujtVM6R8 https://www.youtube.com/watch?v=FwpujtVM6R8 Bugs really made this game one of a kind, it's sad it would be so hard to replicate. The way he uses strafing and delay casting on corners to fight odds is amazing. I still remember my hands shaking when I was in PK fights like this in my youth. The consequences of death made fighting so much more intense in this type of MMO.
- celdon25 4y agoThe late Anti Parazi (Reckful) figured it out way ahead of his time, before Rookie. He’s still considered to be the best of all time.
- Papychulo0217 4y ago[flagged]
- deleted 4y ago[deleted]
- arduinomancer 4y agoI totally get how this bug would end up in the game Someone probably manually tested the feature originally and thought “yeah this feels random”
- bombcar 4y agoApple had to add code to iTunes so that on shuffle it wouldn’t play two tracks from the same album after each other because it wouldn’t “feel” random.
- thaumasiotes 4y agoI don't understand the math. They are very clear about what they want their algorithm to achieve: > The problem comes up when we are assigning portions of the range to various players. If we wanted distance from the creature to be proportional to your chance to be selected--that is, if the closer you are the less chance you have of being attacked--then we would assign this range by taking your distance from the creature over the total distance--the distances of everybody under consideration added together. But we really want the inverse of this ratio That couldn't be more explicit. In the example model, where distance is danger, player D is twice as far away as player A, and has twice the chance of being attacked. To invert that, in the game, where proximity is danger, when player A is twice as close as player D, he should have twice the chance of being attacked. The game's algorithm does not attempt to do this. In the worked example, player A is 50% more likely to be attacked than player D is. The correct algorithm is not difficult to write or to execute: 1. Assign all players equal odds of being attacked. 2. Weight the odds by the ratio of (distance_to_furthest_targetable_player / distance_to_me). To make the example easier to follow, assign player D [distance: 10] 60 units of probability space. Then player A [distance: 5] should receive 60*(10/5) = 120 units, player B [distance: 2] should receive 300 units, and player C [distance: 3] should receive 200 units. Generate a real number (or, heck, an integer) in the range [0, 680) and you have your selection. Or, if you prefer, normalize all the odds and then generate something in the range [0, 1). But how did they pick the crazy algorithm they're actually using?
- cratermoon 4y agoRandom numbers are hard.
- DanHulton 4y agoGod I miss Asheron's Call. I had a character named Sal Monella, and I ran around the various major hubs trading people a single Fried Egg. Good times.