Hello everyone.
It's a beautiful spring afternoon here. The sun is streaming in through the windows, a sweet breeze is blowing, and I am listening to Fleetwood Mac's Rumours. What better time possible to address some of the concerns which have been circulating?
The biggest one, clearly, has been the recent and almost total lack of activity in the game. Since early December, DR has just been slowing down, to the very sluggish state it's in right now. I think it's worth explaining what's been happening behind the scenes, both then and now: what led to this state, and what we're doing to fix it. Just a warning though: I ramble a lot in this post.
The way Dark Risings is designed, it is extremely dependent on having an active staff to keep things moving. For better or for worse, guild immortals are vital to their guilds, and not just as automatons guilding in whomever the players have vouched. Guild immortals are the ones responsible for following the stories of their guild members, for enhancing and building on them, for bringing to admin's attention the ones that require further support in the way of coding or building.
In many ways guild imms are the conduits of player story lines, because most players do not record their own stories or tell the admin staff about them. We have staff policies designed to enhance player privacy, and I think that's a good thing; the downside of that is that admin doesn't often know what's happening in the player world. We need people to keep us informed, and most of the time, those people are the guild immortals. Providing enhancement and support for character stories is also pretty time intensive, so having an active staff means that there is a team working towards a common goal. Without that team, running the mud is impossible.
So what happened?
It started with our decision to ask one imm to step down, followed shortly by having two imms quit. These are delicate situations where it's easy for players to make assumptions based on biased and incomplete information. Whenever an imm quits (or is asked to step down), or a player is penalized, or anything of that nature, that person tends to tell his or her side of the story. And certainly I understand that -- that's such a normal thing to do. The trouble is that our side of the story is almost never told. We hold back, and for several reasons. Part of it is that we understand that people need to save face, that people need to vent. Part of it is that we think the classy thing to do is not to sink to a level of he-said/she-said bickering in an environment where we hold the power (though dang, it's sometimes hard to stick to that high road). Part of it is to protect other people involved in the situation. Part of it is to protect the very person who is telling everyone what he or she sees as the truth.
How much to divulge about this type of decision is something I struggle with in all of these situations. Older players may remember one very infamous episode in DR history where Player X was in a pk with a character who was suspected to be one of Mark's alts (Mark being an implementor at the time, along with Andy and Dan). Player X had Mark's alt slept without poison, and out of nowhere, a "someone" (ie a wizi imm) cast Pinch on him, waking him up. Obviously, that looks horribly like Mark used his imm character to cheat, and Player X went on a huge smear campaign to try to have Mark discredited and thrown out of the game by the other imps. A lot of players heard Player X's story and concluded that Mark MUST have cheated, and it did a lot of damage to the game environment that lasted for years.
I was an imm when that happened and none of us were told anything about it, except that it wasn't what it looked like and that we should trust the imps to handle it. That was all the players got too. That didn't sit well with pretty much everyone. It wasn't until years later when I was an imp, when I had the ability to check the facts, that I got the real story. Pinch was at that time brand new -- I think it had gone in just a day or two before -- and one of the other imms was just being goofy and messing around with it. He didn't know that Mark's character was in a PK, and just to be funny, he cast it on that character. The timing couldn't have been worse, and it sparked this huge, huge, mess which was really devastating in a lot of ways. So everyone on the imp staff was silent about what really happened, to protect the imm who had screwed up with such a simple little thing, a harmless little thing (or at least it would have been, if Mark's character hadn't also been in a PK with probably the worst possible player for this to happen with), and a huge amount of distrust was fostered. And Mark's own personality made matters even worse, because he is the kind of person who, if misjudged, says 'You seriously think this bad thing could be true about me? Screw you, I'll show you bad," and then goads the hell out of the person who misjudged him to start with. And he was really insulted by this -- not so much the assertion that he would cheat, but the assertion that he would cheat in such an obvious, ridiculously blatant way. And so Mark, who has done so much for DR, is still reviled by a large number of old players, for many incidents very similar to this.
So what should we do? In that situation, should they just have thrown the imm who made the mistake under the bus? Were they wrong to expect the players to just accept that no wrongdoing actually took place, regardless of how it looked from Player X's perspective and his many theories about it?
As imps, should we go out of our way to explain our decisions about difficult topics, even if it means outting other people's alts or giving away game secrets that players have worked for months or years to develop, just so that we can clear our names? I guess for us, the answer is clearly 'No.' We would rather take the bullet. When we have asked staff to step down or change something they were doing, it wasn't done out of petty personal self-interest. We have done it because as implementors we see a full picture of the game that no one else has, with the benefit of having more experience running the game than any other implementors in DR's history, and, even more, the added benefit of being able to learn not only from our own mistakes, but the mistakes of everyone who came before us.
Maybe it was a mistake given how it all turned out not to be up-front in divulging what happened in the above situation, but I admire Mark for taking the heat and protecting his staff. I think that took a lot of grit. This is not to say that the staff member got a free pass -- he got a royal chewing out, and all subsequent imms got a big lecture about how immortal powers are NOT toys and shouldn't be used to dick around, because you never know when some innocent goofy prank can have drastic consequences.
In any case, I remain the optimist. I think we must ask staff to believe in us, to believe that our fundamental goal is to make a great game, and if they can't do that, then they probably should not be part of our team and leaving the staff is the right decision for them to make. We aren't looking for a team of yes-men -- the point is we want staff who will come to us when they see problems and work them out with us, not just passively seethe about it in silence or rant about it to players. To us, a team works together towards a common goal, and undercutting members of the team is not going to produce a win.
The point is, it isn't enough just to have bodies on staff. For this game to work, for it to be really great, we need people who have faith in us, and in whom we have faith. And we want DR to be great. We think it has achieved a level of greatness that makes us extremely proud to be a part of it, and we want to keep that going for as long as possible, whether it's us at the wheel or whoever takes over after us. And we will take quality staff members over a quantity of poor ones every day of the week.
So, back to the point: we lost three staff members. Inferno is mortal-run, so that leaves six guilds: doing the math, we lost half our staff within a few months. During that time we also hired one new imm and closed down one guild, leaving us with five guilds who needed immortals, and four people to fill the slots.
That's when things got really bad. Of the four people we had, all four had real life suddenly rear its ugly head, and their time and ability to play DR was suddenly non-existent. Obviously I'm not going to detail the private lives of the staff, but for each one of them, the reason was a very good one, unavoidable, and, while it was long-lasting, temporary. One of the four was me, and while my real-life issue was much shorter than the others, I came back to a mud with no staff support whatsoever.
I have said this before and I'll say it again: it is not possible to run Dark Risings without staff. Just completely not possible at all. For one person to try to do it is a fool's errand. I have heard people assert how easy it is to hire staff, and for other muds that may be true. But it isn't true for -this- mud, at least not at this stage of the game. Hiring a new staff member is a huge investment in time and effort for admin, because of the standards we ask staff to meet and the ways in which we do things. I have seen dozens of imms hired, back in the day, and thrown into a guild they had never even had a mortal in, and left to sink or swim. Most of them sank. It's done very differently now, because want to do everything we possibly can to help new imms prosper, and it takes time. It also helps to have an active staff when hiring new staff members, because we can be a team and work together to teach the new imms everything they need to know: how to make their equipment and token and poofs and room and rank and pretitle and all the other things new imms have to make; the transmission of almost 14 years of guild histories, policies on guilding and ranking and eq, not to mention the story lines; what imm commands they now have and the rules we have about using them -- and all of this is just the tip of the iceberg. It's a lot, both for the new imm and for the current staff.
So when I came back and the staff was still absent, I lost interest myself. Plus, not gonna lie: I had just gotten Skyrim and was totally addicted. It was easy to ignore Dark Risings, because nothing was happening and I didn't have much help to make things happen. The staff would be coming back, I knew, and so I didn't want to replace them. One guild, Covenance, was completely without an imm, but Parviane dragged out one of his old Covenance immortals and was covering there as best he could given how little time he had for DR. Life trumps the game, and that's how it should be, but dang. Tough times for DR.
I often just have to laugh when I hear people with little-to-no imming experience talk about what they think imms do or how easy it is to hire/be staff. I do understand it -- Parviane and I are the only implementors in DR history who started out as players first, and over the years I have been increasingly stunned to realize just how much immortals do that players don't realize, how much admins do that imms don't realize, how much imps do that admin don't realize. It's like an ant climbing to the top of an anthill about which he knows everything, only to have the camera draw back to reveal a whole field of anthills he never knew existed.
And that feeling has intensified over the years, as we have tried to refine the DR gaming experience from one that appealed to 14-year-old boys, to one suitable for our current 20-40 age group made up pretty equally of men and women. Imming at DR is a vastly different experience now from what it was when I was brought on as staff in the spring of 2002. (Holy crap. In two months I will have been a DR staff member for a solid decade.) The game is very different now, and while there are certainly people who will always mourn for the good old days when they played important characters and were known throughout the mud, I am proud of what we've built it into: a unique, original, and cohesive world built out of incongruent sources; a game based on the tenets of fair play, respect for players and their stories (past and present), and balanced mechanics. DR really is a magical place.
Anyway, I think the players saw the lack of staff and thought that since we weren't there to make the magic happen, they had no reason to be there either. And while it is possible to play DR and make magic happen without the presence of a staff, it's a lot less fun that it should be. And what is a game supposed to be, if not fun?
So we stagnated. We were in the position of having very few regular players logging, and possibly having to start from scratch with staff, and not even having much of a pool of players who had shown any interest in being staff to pick from.
I'll admit, I got disheartened. When we came back from our absence a few years ago, DR was in a similar state and we brought it back to life then, through a lot of hard work and constant effort. The thought of doing that again was, for a while, pretty overwhelming. I thought about possibly writing an ending for the DR story, having a set date on which the mud would close and staging a series of climactic events to culminate in one big bang, with the ending determined by player actions along the way. I would rather give the game closure and go out with a bang than just have it waste away to nothing. I even went to the extent of asking a few players if that's something they would like to see, and while they agreed it would be better than letting the game die quietly, they said both options were less desirable than having the game pick back up again.
And isn't that what I want too? It so is. DR can be a frustrating, exhausting creature sometimes. But I love it. I have loved it for ten years. And I want it to be awesome, to give it life, to make it soar.
So.
We are making changes. Of the three staff who had their time sucked away, two are back. We have also hired three new staff members, and the plotting has been fast and furious. I can't tell you how great it feels to have people to conspire with again. We have a ton of great stuff planned and I am really hoping that the resurgence in active staff is going to bring the players back. You have all been sorely missed.
Since it is going to take a few weeks for the new staff to get ready and go vis, I thought I would write this post to let you know that we're focused again, we're taking big steps to fix the horrible problem with stagnation, and we're very excited about the future of the game.
Come back, beloved players: it's about to get good :)
Sunday, March 18, 2012
Friday, November 18, 2011
The Elephant in the Room
I hesitate to air these sorts of administrative concerns over the idea board, so rather than post my response in-game where everyone (especially impressionable newbies) can see it, I'll write it out here.
There were a couple of idea posts overnight that are oddly atypical of what we administrators hear from players. In effect, they called for tightening up regulation of unmanned looping to get gold or level up... Imagine that. Players asking for rules making it harder to get to 50 and get rich. On the one hand, it pleases me to hear players starting to appreciate why this sort of gameplay is bad. On the other hand though, I'm not pleased that we let the situation get to a point where players are starting to complain about it.
The years of admin experience we have means we can typically spot problematic behavior early on, and this is why we try to nip this sort of unfair play in the bud by coming down on people who start doing stuff like gold looping. What's sparked this most recent bout of outrage was certain individuals quietly roboleveled for months during the summer. There was little harm was being done, the admins were largely away on vacation, and nothing came of it. Here we are a few months later, though, and now we've got players equipped with an army of indescript, throw-away, power-combo alts that have tons of money and all the perks that come with that (level 50 baking, crazy quest weapons, etc.). These players have started leveraging their armies of alts, and now suddenly there's a problem.
Addressing these issues is quite tricky; in the past (which I have dubbed Dark Risings 1.0), dealing with isolated abuses were often compulsive and sweeping. A great historic example of this is when the game's economy was redone and a lot of players lost all their gold because a few abusive players (I'll call them powerplayers) got crazy rich. Here in Dark Risings 2.0, we've been trying to curtail these sweeping, reactionary changes in favor of more conservative responses that don't impact the entire game. For example, one of our current powerplayers continued roboleveling despite being told many times to stop, so we made all mobs in all leveling areas aggressive towards just his character. Permanently.
The downside to this approach is that it's extremely time consuming. Once we impose such a punishment on an individual, there is a pretty predictable chain of events that follows:
This process is extremely aggravating and time-consuming for us admins, and this is why, despite our desire to limit fallout, we still sometimes introduce sweeping changes. The case of rose bushes no longer being immune to squires was kind of a balance between the Dark Risings 1.0 approach and the 2.0 approach; initially, I was going to just remove their immunity to pierce altogether, but Sidonie (who has been really championing sensibility) suggested we limit the change to squires so that rose bushes can still be used for honest reasons elsewhere.
The situation in which we now find ourselves is at stage #3. The truth is, there are other charmable mobs in the game that are immune to pierce; people just haven't discovered them. As soon as they are found, I'd be willing to bet that our resident powerplayers will abuse the hell out of them, and we'll have to change them as well. The ultimate question is, how do we break this cycle? We could...
I think option #4 is the gist of what the recent idea posts advocate, but the truth is, this option sucks too. If you think back to the time when afk spamming wasn't allowed, people were still doing it. Even after we've told people that they aren't allowed to robolevel or robofarm gold, they are still doing it. When we catch someone in the act, there's always an excuse. My Chinese food just arrived. I had to walk the dog. I went out for a smoke. My kitchen caught on fire. And even then, we wouldn't be preventing the problem players from manually farming gold. It wouldn't change the facts that they continually strip an area and prevent anyone else from using it, they hog charmies, and they really disrupt the gameplay for others.
So do we still ban them and embitter them against Dark Risings? I'm not sure that's any more fair than saving powerplayers from themselves by plugging up exploits. Both cases are just addressing the symptom, not the problem.
The underlying problem is that powerplayers, to a large degree, just don't "get" Dark Risings. To them, Dark Risings is something for their sole enjoyment (not unlike a single player game), and they don't care about anyone else's fun. They want the high score--the highest hp, the best PK record, and the highest hit/dam. They want to get guilded and become a vampire because they want the best spells and the best equipment in the game. RP is just a formality required to get those things. In many cases, it's not that the player is mean-spirited or "bad," it's just that they don't understand the game that us admins are trying to make and that the majority of our players enjoy.
Dark Risings 1.0 was not a bad place to be for powerplayers; they were on staff, they were in guilds, they were everywhere. And there's nothing wrong with that kind of MUD per se, but it's not the game that Dark Risings has become. Us admins don't have the energy to run a game with the deep undercurrents of acrimony that those games can breed. We want to run a game that's fun and fair to play.
So I guess the punchline here is that I don't know what to do about the bad apples who spoil the fun for others. They tend not to listen to us staff because they don't "get" us, and since they don't understand what we're trying to accomplish with our game, they often assume that we're just out to get them. Maybe they'll listen to what their peers (all you players) are saying instead. Give it a try. Just remember that you catch more flies with honey.
There were a couple of idea posts overnight that are oddly atypical of what we administrators hear from players. In effect, they called for tightening up regulation of unmanned looping to get gold or level up... Imagine that. Players asking for rules making it harder to get to 50 and get rich. On the one hand, it pleases me to hear players starting to appreciate why this sort of gameplay is bad. On the other hand though, I'm not pleased that we let the situation get to a point where players are starting to complain about it.
The years of admin experience we have means we can typically spot problematic behavior early on, and this is why we try to nip this sort of unfair play in the bud by coming down on people who start doing stuff like gold looping. What's sparked this most recent bout of outrage was certain individuals quietly roboleveled for months during the summer. There was little harm was being done, the admins were largely away on vacation, and nothing came of it. Here we are a few months later, though, and now we've got players equipped with an army of indescript, throw-away, power-combo alts that have tons of money and all the perks that come with that (level 50 baking, crazy quest weapons, etc.). These players have started leveraging their armies of alts, and now suddenly there's a problem.
Addressing these issues is quite tricky; in the past (which I have dubbed Dark Risings 1.0), dealing with isolated abuses were often compulsive and sweeping. A great historic example of this is when the game's economy was redone and a lot of players lost all their gold because a few abusive players (I'll call them powerplayers) got crazy rich. Here in Dark Risings 2.0, we've been trying to curtail these sweeping, reactionary changes in favor of more conservative responses that don't impact the entire game. For example, one of our current powerplayers continued roboleveling despite being told many times to stop, so we made all mobs in all leveling areas aggressive towards just his character. Permanently.
The downside to this approach is that it's extremely time consuming. Once we impose such a punishment on an individual, there is a pretty predictable chain of events that follows:
- The player argues and complains with imms, then admins, then imps. It's not fair, this isn't fair, life's not fair.
- A smear campaign is launched against the immortals over IMs for singling out and picking on one poor guy who was just trying to level his character.
- The player gets over his butthurt and just looks for another way to exploit the system.
- The player finds a way to exploit the system, and the cycle repeats.
This process is extremely aggravating and time-consuming for us admins, and this is why, despite our desire to limit fallout, we still sometimes introduce sweeping changes. The case of rose bushes no longer being immune to squires was kind of a balance between the Dark Risings 1.0 approach and the 2.0 approach; initially, I was going to just remove their immunity to pierce altogether, but Sidonie (who has been really championing sensibility) suggested we limit the change to squires so that rose bushes can still be used for honest reasons elsewhere.
The situation in which we now find ourselves is at stage #3. The truth is, there are other charmable mobs in the game that are immune to pierce; people just haven't discovered them. As soon as they are found, I'd be willing to bet that our resident powerplayers will abuse the hell out of them, and we'll have to change them as well. The ultimate question is, how do we break this cycle? We could...
- levy some sort of punishment against the abusive character. This won't work because powerplayers' characters are usually interchangeable and disposeable, and we don't have the effort to persecute every new character they pump out.
- make a sweeping or semi-sweeping change. This is what we've been doing, but it sucks. It's a lot harder for a casual player to get gold now, because all the "easy" ways had to be plugged up on account of powerplayers grossly abusing them.
- ban the powerplayer. But for what? Having the time and dedication to play the game hardcore and make juiced up characters? That's not against the rules.
- make it a serious rule violation to robolevel/robofarm gold, then ban the powerplayer.
I think option #4 is the gist of what the recent idea posts advocate, but the truth is, this option sucks too. If you think back to the time when afk spamming wasn't allowed, people were still doing it. Even after we've told people that they aren't allowed to robolevel or robofarm gold, they are still doing it. When we catch someone in the act, there's always an excuse. My Chinese food just arrived. I had to walk the dog. I went out for a smoke. My kitchen caught on fire. And even then, we wouldn't be preventing the problem players from manually farming gold. It wouldn't change the facts that they continually strip an area and prevent anyone else from using it, they hog charmies, and they really disrupt the gameplay for others.
So do we still ban them and embitter them against Dark Risings? I'm not sure that's any more fair than saving powerplayers from themselves by plugging up exploits. Both cases are just addressing the symptom, not the problem.
The underlying problem is that powerplayers, to a large degree, just don't "get" Dark Risings. To them, Dark Risings is something for their sole enjoyment (not unlike a single player game), and they don't care about anyone else's fun. They want the high score--the highest hp, the best PK record, and the highest hit/dam. They want to get guilded and become a vampire because they want the best spells and the best equipment in the game. RP is just a formality required to get those things. In many cases, it's not that the player is mean-spirited or "bad," it's just that they don't understand the game that us admins are trying to make and that the majority of our players enjoy.
Dark Risings 1.0 was not a bad place to be for powerplayers; they were on staff, they were in guilds, they were everywhere. And there's nothing wrong with that kind of MUD per se, but it's not the game that Dark Risings has become. Us admins don't have the energy to run a game with the deep undercurrents of acrimony that those games can breed. We want to run a game that's fun and fair to play.
So I guess the punchline here is that I don't know what to do about the bad apples who spoil the fun for others. They tend not to listen to us staff because they don't "get" us, and since they don't understand what we're trying to accomplish with our game, they often assume that we're just out to get them. Maybe they'll listen to what their peers (all you players) are saying instead. Give it a try. Just remember that you catch more flies with honey.
Tuesday, November 8, 2011
The Truth Behind Wimpy and Trip
This blog post has two parts. The first part is a rant, and the other part is a little more relevant. If you're interested in just reading the detailed technical info, just scroll down past the rant.
Despite this fact that we did not change anything, a number of players insisted that this wimpying on trip was something new and made a big stink about it. Again, I emphasized that it was not new, but some people refused to believe it, either claiming that (a) they knew more about what I changed in the code than I did, or (b) I was purposely lying to them for some nefarious reason. Both accusations were leveled at me directly (that is, at least one player literally called me a liar on OOC).
This bothered me more than usual because it's a gross mischaracterization of the admin staff, and it reeks of a total lack of understanding of how the admin staff runs Dark Risings. We don't typically change major aspects of PK on a whim, try to sneak it into a bug fix, then lie about it. In fact, literally every significant (and even almost every minor) change to PK we have made has been vetted by players, either by inviting select PKers to participate in closed testing or by hosting an open Hell Night. That's just not how we operate, and I've written about our approach to implementation before.
In the next section, I'll walk through the code and explain exactly what is going on when someone wimpys out due to being tripped, and exactly what I changed in April that got everyone so convinced that we screwed up wimpy+trip.
However, let's look at the code for the trip command from August 26, 2006, which predates the changes I made in April 2011 by a good many years:
To translate a little, here's what's going on:
The next question is, where does wimpy factor into this?
As it turns out, a lot of functionality is wrapped up in the damage() routine (Line 8), and wimpy is a part of this. When you trip someone and the game gets to executing Line 8 in the code, lines 11 and 12 don't get executed until the damage() routine is fully complete. Here's what's going on in damage(), in no particular order:
Line 11 above is a special check that was added in 2000 to prevent a similar problem. Before it was added, some PKers had found out that if you manage to KO someone using a knockdown, they would get set to the unconscious position by damage(), but then immediately get woken back up when the rest of the trip code finished and set the person to the sprawled position. Thus, they didn't have to wait the 45 seconds before they recovered from the KO; they could immediately stand up (after their PULSE_VIOLENCE*2 lag from trip) and run away before anyone could loot them. What Line 11 does is only set the person's sprawled position if they weren't rendered (!= means "not equal") dead or unconscious as a result of the damage() routine immediately preceding it.
So, there you have it. Code from 2006 showing that, due to the order in which damage is dealt relative to the instruction to sprawl out the victim, it is possible to wimpy out due to the damage from trip. Sort of.
As Sintar pointed out (and much to my embarrassment), you can wimpy out of a fight even if you're sprawled. Initially I said this was impossible because wimpy just issues the "flee" command automatically for the player, and the "flee" command can only be used by the player if his character is fighting, not sprawled. Go get bashed by a mob and type "flee." You'll see what I mean.
So how can Sintar get bashed by Heimdall, stay on the ground, and still wimpy out? Well, let's look at the wimpy code in the damage() routine, which happens to be at the very end of it:
So does this mean that you will always wimpy flee if sprawled out in PK?
Not quite.
Line 4 is the key here; although wimpy can make you flee regardless of if you're sprawled, Line 4 says that wimpy won't work unless you've got less than PULSE_VIOLENCE/2, or 1.5 seconds, worth of lag left. Since trip gives the victim 6 seconds of lag, this guarantees that, as long as the trip damage itself doesn't cause wimpy
The trip damage shouldn't ever cause wimpy to fire, because the lag is applied before the damage() (and therefore the wimpy code) gets run. So, by the time the trip damage is dealt, the victim already has the 6 seconds of lag. Line 4 will always cause wimpy to fail both when damage() is called by the trip command and for the first 4.5 seconds of lag caused by trip, which translates to a guaranteed minimum of one round of combat before the victim has a chance to flee-while-sprawled.
So why does the damage caused by trip cause the victim to wimpy out?
Because in the change I made back in April, I moved the WAIT_STATE lines in trip (and bash, entangle, armthrow, et cetera) below the damage() line:
Remembering that computers execute commands in-order**, this means that when the damage from trip is dealt, the victim hasn't been lagged by trip yet. So, wimpy will kick in as long as the victim doesn't have more than 1.5 seconds of lagged already queued up from some other source.
Thus, contrary to the big long tirades I've gone on explaining how we never changed anything, we (that is, I) inadvertently did change (and break) wimpying from trip. While it was true that it was always possible to wimpy out from being tripped, trip used to guarantee you 4.5 seconds of combat (at least one round) before your opponent could wimpy out.
Now there is a question of what we should do about this; the majority of players seem to agree that wimpy is fine as-is, but its as-is state is really the result of a bug. If I'm lucky, I will have put everyone to sleep before they read this far down the post, and nobody will ever become aware of my serious folly here. Realistically though, my inadvertent breakage of wimpy/trip (and subsequent ardent denial of doing such a thing) was not fair to the players, so it should be "fixed" and functionally restored to the way it used to be. It was a reasonably fair way of doing it, too; people could still wimpy out of being tripped, but tagging with trip guaranteed you a round of combat to dish out damage before that happened. The subsequent lag was still in the wimp's favor (6 seconds vs. 7 seconds) which is how it remains; the tripper just had a chance at knocking his enemy out with that one round before the wimp could take off again.
Blearg, I hate being wrong, and I hate more when I've been a jerk in the process of being wrong. Maybe I should take a page from Nixon's book and just destroy all the evidence before word gets out.
** Note: these statements aren't really true, but they are close enough to the truth to illustrate my point.
Rant / Background Info
Back in April of this year, a small bugfix went in to address a problem with wimpy. For some reason, a number of players read this change and assumed that the fact that wimpy can kick in when tripped was something new that we had added as a part of that change. The truth of the matter was that trip always triggered wimpy, and the only thing that we had changed was the need to type "stand" after having wimpy-fled from being tripped. The lag on both the tripper and the person being tripped remained the same, the damages were the same, and the fact that wimpy could be activated by the trip skill itself remained the same.Despite this fact that we did not change anything, a number of players insisted that this wimpying on trip was something new and made a big stink about it. Again, I emphasized that it was not new, but some people refused to believe it, either claiming that (a) they knew more about what I changed in the code than I did, or (b) I was purposely lying to them for some nefarious reason. Both accusations were leveled at me directly (that is, at least one player literally called me a liar on OOC).
This bothered me more than usual because it's a gross mischaracterization of the admin staff, and it reeks of a total lack of understanding of how the admin staff runs Dark Risings. We don't typically change major aspects of PK on a whim, try to sneak it into a bug fix, then lie about it. In fact, literally every significant (and even almost every minor) change to PK we have made has been vetted by players, either by inviting select PKers to participate in closed testing or by hosting an open Hell Night. That's just not how we operate, and I've written about our approach to implementation before.
In the next section, I'll walk through the code and explain exactly what is going on when someone wimpys out due to being tripped, and exactly what I changed in April that got everyone so convinced that we screwed up wimpy+trip.
Detailed Technical Info
I think a large reason people don't understand/believe what I did and did not change in April is that they don't fully understand how trip works. To the casual player, the trip command does these things:- sends messages saying "So-and-so trips you and you go down!"
- does a little damage ("So-and-so's trip scratches you.")
- sets you to the sprawled position so you have to stand up before you can do other stuff
However, let's look at the code for the trip command from August 26, 2006, which predates the changes I made in April 2011 by a good many years:
- act("$n trips you and you go down!",ch,NULL,victim,TO_VICT);
- act("You trip $N and $N goes down!",ch,NULL,victim,TO_CHAR);
- act("$n trips $N, sending $M to the ground.",ch,NULL,victim,TO_NOTVICT);
- check_improve(ch, gsn_trip, TRUE, 1);
- WAIT_STATE(victim, PULSE_VIOLENCE*2);
- WAIT_STATE(ch, PULSE_VIOLENCE*2+4);
- damage(ch, victim, number_range(2, 2 + 2 * victim->size), gsn_trip,
- DAM_BASH, TRUE);
- if ( victim->position != POS_DEAD && victim->position != POS_UNCONCIOUS )
- victim->position = POS_SPRAWLED;
To translate a little, here's what's going on:
- Lines 1-3 are the messages that get sent to the person getting tripped (called victim), the person doing the tripping (called ch), and the rest of the room
- Line 4 is the check to see if your trip skill% should go up
- Line 6 is what puts the trip lag on the person getting tripped (victim). It says PULSE_VIOLENCE*2, which means two rounds of combat, or six seconds.
- Line 7 is what puts the trip lag on the person using trip (ch). PULSE_VIOLENCE*2+4 means six seconds (PULSE_VIOLENCE*2) plus another full second, so a total of seven seconds of lag, or one more second of lag than the victim.
- Line 8-9 is what does the damage from trip. The messages ("Your trip scratches so-and-so.") is generated within this damage() routine, which is why they don't appear here.
- the first parameter, ch, indicates who is dealing the damage
- the second parameter, victim, indicates who should receive it
- the third parameter, number_range(2, 2+2*victim->size), is the amount of damage that should be done before sanc/ward/resists/etc. In this case, it's doing a random amount of damage between 2 and 2+2*(the size of your race)..it's not much.
- the fourth parameter, gsn_trip, indicates the damnoun for the damage (in this case, it'll show up as "Your trip scratches ...")
- the fifth parameter, DAM_BASH, indicates the damage type of the damage. Since it's DAM_BASH here, it'll do bash-type damage. If it were DAM_HOLY, it'd do holy damage; DAM_ACID would do acid damage, and so on.
- the sixth parameter, TRUE, just indicates if the damage message ("Your trip scratches ...") should be sent out at all. If this were set to FALSE, you'd take damage but it would be silent (like how dirt kick is).
- Line 11 is a bugfix that was added back in 2000. More on this below.
- Line 12 is what puts the victim on the ground instead of in the regular fighting position
The next question is, where does wimpy factor into this?
As it turns out, a lot of functionality is wrapped up in the damage() routine (Line 8), and wimpy is a part of this. When you trip someone and the game gets to executing Line 8 in the code, lines 11 and 12 don't get executed until the damage() routine is fully complete. Here's what's going on in damage(), in no particular order:
- the effects of sanctuary are applied
- a check is made to see if the damage should hit a mirror image
- hp is subtracted from the victim
- if the victim's resulting hp falls below 1, either knock them out or kill them (depending on whether ch is a player or a mob)
- if the victim's resulting hp falls below their wimpy, make them flee
- Everyone gets sent the appropriate "trips you and you go down!" message (lines 1-3)
- ch's trip skill might improve (line 4)
- both parties get lagged (lines 6-7)
- damage is dealt to victim (line 8-9)
- if this damage drops victim's hp below his wimpy, he flees at this point
- if this damage drops victim's hp below 1, he is knocked out at this point
- victim is tossed on the ground AFTER the damage() routine completes
Line 11 above is a special check that was added in 2000 to prevent a similar problem. Before it was added, some PKers had found out that if you manage to KO someone using a knockdown, they would get set to the unconscious position by damage(), but then immediately get woken back up when the rest of the trip code finished and set the person to the sprawled position. Thus, they didn't have to wait the 45 seconds before they recovered from the KO; they could immediately stand up (after their PULSE_VIOLENCE*2 lag from trip) and run away before anyone could loot them. What Line 11 does is only set the person's sprawled position if they weren't rendered (!= means "not equal") dead or unconscious as a result of the damage() routine immediately preceding it.
So, there you have it. Code from 2006 showing that, due to the order in which damage is dealt relative to the instruction to sprawl out the victim, it is possible to wimpy out due to the damage from trip. Sort of.
As Sintar pointed out (and much to my embarrassment), you can wimpy out of a fight even if you're sprawled. Initially I said this was impossible because wimpy just issues the "flee" command automatically for the player, and the "flee" command can only be used by the player if his character is fighting, not sprawled. Go get bashed by a mob and type "flee." You'll see what I mean.
So how can Sintar get bashed by Heimdall, stay on the ground, and still wimpy out? Well, let's look at the wimpy code in the damage() routine, which happens to be at the very end of it:
- if ( !IS_NPC(victim)
- && victim->hit > 0
- && victim->hit <= victim->wimpy
- && victim->wait < PULSE_VIOLENCE / 2 )
- do_flee( victim, "" );
with a brief translation:
The reason Sintar's wimpy lets him use the flee command is a bit hard to explain; in essence, the part of the code that takes whatever command you type (e.g., "flee") and translates that into a command that the game understands (e.g., do_flee()) is what imposes the restrictions on whether or not you have to be standing to use a command. Wimpy bypasses that command interpreter entirely, so there's no position check.- if the victim is not an NPC (that is, they are a PC, or a player character)... (line 1)
- AND the victim's hp is above zero (they aren't KO'ed or dead yet)... (line 2)
- AND the victim's hp is less than or equal to their wimpy setting... (line 3)
- AND their current lag is less than PULSE_VIOLENCE/2... (line 4)
- then execute the "flee" command directly, bypassing all the regular checks to make sure the person is standing, of the appropriate level to use the command, etc. (line 5)
So does this mean that you will always wimpy flee if sprawled out in PK?
Not quite.
Line 4 is the key here; although wimpy can make you flee regardless of if you're sprawled, Line 4 says that wimpy won't work unless you've got less than PULSE_VIOLENCE/2, or 1.5 seconds, worth of lag left. Since trip gives the victim 6 seconds of lag, this guarantees that, as long as the trip damage itself doesn't cause wimpy
CRAP
The trip damage shouldn't ever cause wimpy to fire, because the lag is applied before the damage() (and therefore the wimpy code) gets run. So, by the time the trip damage is dealt, the victim already has the 6 seconds of lag. Line 4 will always cause wimpy to fail both when damage() is called by the trip command and for the first 4.5 seconds of lag caused by trip, which translates to a guaranteed minimum of one round of combat before the victim has a chance to flee-while-sprawled.
So why does the damage caused by trip cause the victim to wimpy out?
Because in the change I made back in April, I moved the WAIT_STATE lines in trip (and bash, entangle, armthrow, et cetera) below the damage() line:
- act("$n trips you and you go down!",ch,NULL,victim,TO_VICT);
- act("You trip $N and $N goes down!",ch,NULL,victim,TO_CHAR);
- act("$n trips $N, sending $M to the ground.",ch,NULL,victim,TO_NOTVICT);
- check_improve(ch,gsn_trip,TRUE,1);
- damage(ch,victim,number_range(2, 2 + 2 * victim->size),gsn_trip,
- DAM_BASH,TRUE);
- WAIT_STATE(victim,PULSE_VIOLENCE*2);
- WAIT_STATE(ch,PULSE_VIOLENCE*2+4);
- /* damage() can cause wimpy which changes victim->in_room */
- if (victim->position > POS_FLATFOOTED && victim->in_room == ch->in_room)
- victim->position = POS_SPRAWLED;
Remembering that computers execute commands in-order**, this means that when the damage from trip is dealt, the victim hasn't been lagged by trip yet. So, wimpy will kick in as long as the victim doesn't have more than 1.5 seconds of lagged already queued up from some other source.
Thus, contrary to the big long tirades I've gone on explaining how we never changed anything, we (that is, I) inadvertently did change (and break) wimpying from trip. While it was true that it was always possible to wimpy out from being tripped, trip used to guarantee you 4.5 seconds of combat (at least one round) before your opponent could wimpy out.
Now there is a question of what we should do about this; the majority of players seem to agree that wimpy is fine as-is, but its as-is state is really the result of a bug. If I'm lucky, I will have put everyone to sleep before they read this far down the post, and nobody will ever become aware of my serious folly here. Realistically though, my inadvertent breakage of wimpy/trip (and subsequent ardent denial of doing such a thing) was not fair to the players, so it should be "fixed" and functionally restored to the way it used to be. It was a reasonably fair way of doing it, too; people could still wimpy out of being tripped, but tagging with trip guaranteed you a round of combat to dish out damage before that happened. The subsequent lag was still in the wimp's favor (6 seconds vs. 7 seconds) which is how it remains; the tripper just had a chance at knocking his enemy out with that one round before the wimp could take off again.
Blearg, I hate being wrong, and I hate more when I've been a jerk in the process of being wrong. Maybe I should take a page from Nixon's book and just destroy all the evidence before word gets out.
** Note: these statements aren't really true, but they are close enough to the truth to illustrate my point.
Subscribe to:
Posts (Atom)