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:

  1. The player argues and complains with imms, then admins, then imps.  It's not fair, this isn't fair, life's not fair.
  2. 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.
  3. The player gets over his butthurt and just looks for another way to exploit the system.
  4. 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...

  1. 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.
  2. 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.
  3. 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.
  4. 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.

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:
  1. sends messages saying "So-and-so trips you and you go down!"
  2. does a little damage ("So-and-so's trip scratches you.")
  3. sets you to the sprawled position so you have to stand up before you can do other stuff
and they all happen at once.  You successfully trip someone, and they're on the ground instantaneously.  This isn't an unreasonable assessment, but the truth is that they don't all happen at once.  In fact, computers really can't do two things at once**; they take an instruction to do something, then they do it, then they take the next instruction, do it, and so on.  The reason it seems to happen all at once is because computers do this VERY quickly--our server's 3.2GHz processors can carry out 3.2 billion instructions per second**, or over three instructions every nanosecond.  To put that into perspective, in the time it takes you to blink your eye (~300ms), Dark Risings knocks out a billion instructions...so it's all effectively instantaneous to the player.

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:

  1. act("$n trips you and you go down!",ch,NULL,victim,TO_VICT);
  2. act("You trip $N and $N goes down!",ch,NULL,victim,TO_CHAR);
  3. act("$n trips $N, sending $M to the ground.",ch,NULL,victim,TO_NOTVICT);
  4. check_improve(ch, gsn_trip, TRUE, 1);
  5.  
  6. WAIT_STATE(victim, PULSE_VIOLENCE*2);
  7. WAIT_STATE(ch, PULSE_VIOLENCE*2+4);
  8. damage(ch, victim, number_range(2, 2 + 2 * victim->size), gsn_trip,
  9.    DAM_BASH, TRUE);
  10.  
  11. if ( victim->position != POS_DEAD && victim->position != POS_UNCONCIOUS )
  12.     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
That last bullet point is the killer here.  Keeping in mind that computers can only do one thing at a time, here's what's happening with the trip command:
  1. Everyone gets sent the appropriate "trips you and you go down!" message (lines 1-3)
  2. ch's trip skill might improve (line 4)
  3. both parties get lagged (lines 6-7)
  4. 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
  5. victim is tossed on the ground AFTER the damage() routine completes
So what's happening is that, since the instruction to actually knock the victim to the ground comes after the damage is dealt, the victim will have already fled (due to damage()) before the trip code ever gets to the point where the victim gets sprawled.  Thus, this old code from 2006 was making people sprawled out even though they had already wimpy-fled from the room.

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:

  1. if ( !IS_NPC(victim)
  2. &&   victim->hit > 0
  3. &&   victim->hit <= victim->wimpy
  4. &&   victim->wait < PULSE_VIOLENCE / 2 )
  5.    do_flee( victim, "" );

with a brief translation:
  • 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)
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.

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:

  1. act("$n trips you and you go down!",ch,NULL,victim,TO_VICT);
  2. act("You trip $N and $N goes down!",ch,NULL,victim,TO_CHAR);
  3. act("$n trips $N, sending $M to the ground.",ch,NULL,victim,TO_NOTVICT);
  4. check_improve(ch,gsn_trip,TRUE,1);
  5.  
  6. damage(ch,victim,number_range(2, 2 +  2 * victim->size),gsn_trip,
  7.     DAM_BASH,TRUE);
  8.  
  9. WAIT_STATE(victim,PULSE_VIOLENCE*2);
  10. WAIT_STATE(ch,PULSE_VIOLENCE*2+4);
  11.  
  12. /* damage() can cause wimpy which changes victim->in_room */
  13. if (victim->position > POS_FLATFOOTED && victim->in_room == ch->in_room)
  14.     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.

Monday, November 7, 2011

Coding Quandary for Brawler Scores

One of the principal challenges in establishing this new brawler scoreboard was establishing the framework for it.  The scoreboard, in the simplest sense, made of a string of individual brawlers and their scores.  As such, it would make sense to attach this information to each brawler's pfile (which is where their stats, equipment, description, et cetera are stored) since brawler scores are just another stat.  At the same time though, pfiles are loaded into the game dynamically--if a character isn't logged in, all of the information stored in his pfile (stats, equipment, description, et cetera) are totally unknown to the game.

Think about it.  Are there any commands that let you get information from another character who isn't logged in?  The only example of this that comes to mind reading notes posted by characters who aren't logged in; this is possible because notes are stored in a fashion similar to areas--they are saved to their own special file that is read in when the game starts up, and then the list of notes just floats in the game's permanent memory forever.  As new notes are posted, they also go into permanent memory, and they are saved to the special note file so that they can be reloaded after the next reboot.

Notes are static though;  once they're up, they really never need to be changed.  Brawler stats, on the other hand, will constantly be changing as people claim victory over each other.  Although these changes will only happen when brawlers are logged in to fight each other, what do we do with their scores when those brawlers log out?  They still need to be accessible by everyone on the scoreboard, and they need to be able to be reloaded after reboots.

This question highlights one of the principal design decisions I had to make in deciding how to actually implement this brawler scoreboard.  On the one hand, brawler scores need to be stored permanently like notes are, but on the other hand, they are fundamentally a stat that is attached to one and only one character.  Furthermore, we may need to be able to modify brawler scores even if the brawlers aren't logged in (e.g., in case of wimpouts or losses that need to be verified by imms).  How can these conflicting ideas be reconciled?  Here are the two options that I first considered:

  1. Store brawler scores in permanent memory, but have players "download" them to their character when they log in and "upload" their new scores when they log out
  2. Store brawler scores in permanent memory AND on the pfile, then keep track of which set of scores (the ones in permanent memory or the ones on the pfile) were updated most recently and use those
Unfortunately, both of these options raise problems with consistency.  Because information gets stored in two places in both cases, it becomes easy to envision a scenario where the information in one place doesn't get updated in the other place and suddenly one brawler has two different sets of scores.  This isn't an issue in 100% bug-free code, but the fact is that the system is not robust; if I (or a future coder) needs to modify the brawler code a few years down the road, we have to remember to make sure that both sets of scores need to be manually synced up or else problems arise.

A better option (and what I wound up doing) is to store brawler stats in permanent memory, and instead of worry about uploading/downloading/syncing those numbers against a pfile when it is loaded, just "attach" each player's brawler score info (still in permanent memory) to the pfile when the character logs in.  When the character logs out, the attachment breaks, but the brawler record is still floating in the permanent memory.

While we still have to make sure that brawler scores are properly attached to characters when they're logged in, this is far less flaky of a process than ensuring data is consistent across two places since it's trivial to perform the attachment.  So, in addition to checking for attachment when a character logs in, we can check for attachment at other critical points in the code such as when a brawler gets thrown out of brawler or scores another kill.

Speaking of getting thrown out of brawler, the reason why I bring this all up is because Stage 2 will include a new "leavebrawler" command that players can use to voluntarily quit.  However, quitting Brawler will also ban you from re-joining it for thirty real-life days.  Because we store brawler scores in permanent memory rather than on the pfile, this ban has the unintentional (but fortuitous) effect of persisting across recreates.  Even though a player may have deleted and re-created his character, that character's brawler record is stored in permanent memory and cannot be deleted by the player.

This might sound a bit trivial ("It'll take 30 days to level back up to 50 anyway!"), but a more powerful result of this is that immortals will have the ability to ban characters from brawler for life (such as may be necessary if they are caught abusing brawler perks).  Recreating won't circumvent that ban, which imposes an interesting incentive for players to not try to get cheap healing in a real fight by cheating the system.  A ban from brawler will truly be a ban for life.

Friday, November 4, 2011

Brawler Scoreboard Stage 2

We're moving forward with implementing the next stage of our new Brawler system, and based on our original ideas and some suggestions and observations from Stage 1, I think we're looking at rolling out features some fun new features.

A major component that we're currently lacking is the ability for the game to know that a particular fight is a brawl as it's happening; right now, brawls only become brawls when the victory command is used. To address this best, we're planning to add a command that will act as an "opening move" to initiate a brawl called "clobber."

We envision this clobber command functioning like backstab, where one Brawler uses it to tag another Brawler, and thereafter, both combatants are identified as brawling each other.  This establishes a nice framework where we can implement some features exclusive to brawls to make it easier, safer, and cheaper to learn PK as a brawler.

One of the significant (and controversial) features we'd like to include immediately is ultra-low-cost healing for brawls.  This has the benefit of letting people get up and running in PK without having to grind for gold, and really turns brawling into its own minigame within Dark Risings.  However, there are a lot of potential issues here:

PROS:
  1. no grinding for gold if you just want to pk for fun
  2. potentially attracts new players who may start out just looking for a good PK mud (but get sucked into RP in search for a vamp, etc)
  3. cements in PK as a distinct minigame within Dark Risings
CONS:
  1. less of a need for pure-PK players to actually play the game since they don't need to worry about collecting gold
  2. LOTS of potential for abuse if not coded properly
I think the pros are self-evident, but let's look at the cons a little more closely.

1. Less of a Need for Pure-PK Players to Actually Play the Game

"and stay IC" should be tacked on to the end of this con, and it's one of the bigger reservations I have.  Catering to PK-only players draws in a bigger pbase, and as long as they aren't disruptive to the rest of the game, I don't really mind.   However, I like to think that the process of getting money can often involve RP (e.g., collecting people to go kill mobs for equipment), and if we obviate the need for pure-PK players to get gold, it's easy to envision them having no reason to bother trying to roleplay at all.

Realistically though, gold farming has become the norm these days, and there's really no RP involved in that process anyway.  So I guess the damage has already been done, and giving Brawlers cheap healing won't cause too much more trouble.  It's just that the nightmare scenario for me is having a game full of players used to pure-PK MUDs who log in and are totally OOC in says, tells, over the brawler channel, etc, and generally degrade the quality of the game.  I absolutely do not want this, and I hope catering to PKers in this way won't effect that.

2. LOTS of Potential for Abuse

Of course, this is the most immediately problematic, because there are a number of ways this healing discount can be abused.  Here are a few scenarios.

  1. An Inferno named Jane jumps Bob the Brawler who has a contract on his head.  The Bob the Brawler just initiates a brawl against Jane so that Brawler rules (and cheap healing) are in effect and Jane can no longer loot on KO, etc.
  2. In a real PK, player Bob is getting attacked by player Jane.  He has a buddy, Harry, initiate a brawl against him so that Bob gets discounted healing since the game thinks he's brawling Harry when in fact he's fighting for his life against Jane.
  3. The opposite happens, and Bob initiates a brawl to get discounted healing, then jumps Jane.
Unfortunately, I really only see two solutions to these sorts of abuses.  The first one, which perhaps is what many players would immediately think, is to have an immortal arbitrate cases of abuse like this, and have stiff punishments for people who do this sort of thing.  This is a possibility, but we don't really have the staffing manpower to be micromanaging brawls and this is not really a good solution.

The second solution is to make it so that this "clobber" command to start a brawl can only be used when both participants are not in PK fightlag.  This solves the issues of people initiating brawls mid-fight to abuse the perks of brawling, but it also means that if you forget to make your initial tag with clobber, you have to flee safe before you can correct the issue and re-tag to initiate the brawl.  In practice, I suspect this might get annoying.

Another idea would be to create the opposite command of "clobber" and have it be something like "nobrawl."  If Jane wants to jump Bob for real, she can issue the "nobrawl" command on him after tagging him to lock Bob (and Jane) out of initiating brawls until they leave fightlag.  This is getting a bit complicated though, as Jane would have to remember to keep issuing nobrawl throughout the fight in case Bob momentarily got out of fightlag.  It also all operates under the assumption that Bob is definitely going to cheat to get out of getting KO'ed by Jane, which should be a pretty remote possibility to begin with.  Throwing a ton of complicated code at such a narrow problem is not something I like doing.

At any rate, for stage 2, the only brawler perk we're looking to put in would be this discounted healing. However, we might also consider features such as...
  • people flagged as being in brawls never leave fightlag (this was suggested a few times)
  • people flagged as being in brawls cannot be looted (by either anyone, or their brawling opponent) once they are KO'ed
  • announcements over the Brawler channel that Bob and Jane have begun brawling
For right now though, just figuring out how to prevent people from spuriously declaring brawls mid-fight to get out of a real PK is challenging enough.  Tying it to fight lag is tricky because there may be times when brawlers get out of fightlag but aren't actually done fighting (running to heal, running for a trap, etc), but we're not quite ready to force brawlers to remain in fightlag until someone gets KO'ed.

Comments, ideas, or suggestions are welcome.  Since this post won't fit into a note in the game, it's probably best to leave replies (anonymously or otherwise) as comments to the blog here.

Thursday, November 3, 2011

Taking a step back

Just a forewarning:  this post is long and rambling.  You might want to save it for bathroom reading.

There has been a lot more of a stir surrounding Sidonie's idea post about changing the way sleep/poison/pinch works than I expected, and an interesting discussion came up on OOC yesterday which was suggestive of an ongoing clash of perception.  For the sake of just delineating where I (and I think the other admins) are coming from, I think I'll ramble about it.

The issue that came up yesterday was centered around sleep's duration of 50 ticks at level 50.  There were essentially two camps here:

  1. sleep's long duration is good way to force people to cool off; if a BR is pestering you, or if someone is freaking out and going kamikaze after getting KO'ed, the 37 minute timeout is very useful
  2. sleep's long duration is unreasonable since it doesn't let a player actually play.
Oogon then mentioned something that really sheds light on this rift of perceptions that splits our current playerbase:

[OOC] Oogon: 'But really, how often is sleep used in that regard?'
[OOC] Oogon: 'To just let someone 'cool off'.'

And you know, it's the truth.  I've the benefit of remembering when sleeping pester characters (BRs, naked rogues, etc), was relatively normal, and during those days, slapping a player-mandated time-out was really the only recourse available.  However, something that a lot of older players seem not to realize is that Dark Risings really isn't the same game as it was five years ago; sure, it has the same name and the same backstory, but take a look around.  The areas are no longer static: Lilith has the power to corrupt the entire town of Three Firs, gypsy mobs remember their enemies, and the game is dotted with mini-quests that offer 5000-10000 experience for completing them.  The races are different:  avariels are no longer vuln to all fire, and ogre weres aren't vuln to all magic.  The classes are different: there are now templars, which offer a wildly different approach to PK.  Pick any aspect of the game, really.  I'll bet it's not the same now as it was five years ago.

More importantly, though, is that the whole process of implementation has wildly changed.  This point may not be as evident to players, but I think it's really the single largest change that separates "old Dark Risings" from "new Dark Risings."  Take, for example, the aforementioned avariel vuln to fire.

When avariels were made vuln to fire (this happened in around 2001), there was no discussion or player input.  There was a reboot and a terse note saying "avariels are now vuln to fire."  Since my main character was an avariel, this was a pretty devastating change; I went from having no vulnerabilities to being vulnerable to a spell that almost every class can cast (fireball).  I immediately protested since avariels really weren't very good to begin with, but my notes fell on deaf ears.  I wound up leaving the game a few months later, and while I was gone, flashfire was changed to no longer do fire damage since it was deemed to crippling against avariels.  This mitigated the problem to a degree, but it also left one of the "elemental" spells doing unintuitively and decidedly non-elemental damage.

I think these sorts of changes were very telling of the "old Dark Risings" approach to implementation; imps did what they thought was best for the game with a sort of players-be-damned attitude, and if the change proved to be unpopular or unbalancing, another change would be rolled out to mitigate.  This sort of implementation practice also meant a lot of decidedly reactionary changes went in; old players are rife with stories of how some skill got changed because an imp got beaten by someone gimping that skill in PK.  I'm not sure if these stories hold water, but it doesn't really matter now.

Fast forwarding to the "new Dark Risings," we really don't operate this way at all, and I think this is clearly evidenced by the fact that we solicited player input regarding this poison/sleep/pinch issue.  We also solicited (and continue to solicit) feedback on the brawler scoreboard idea.  The new spells that Arcaenum has are 100% player conceived and designed.  In fact, I don't think there's a single change that we've posted in the last year (except a few exploit fixes) that were done without player involvement.

So what has been the driving force behind this transition from "old Dark Risings" to "new Dark Risings?"

At the "old Dark Risings," the imps had always been people who were at Dark Risings from the very beginning.  All of them had always been imms or admins, and they all had a hand in creating Dark Risings out of nothing and making changes before there were even players to upset.  In many ways, they had every entitlement to do as they saw fit, because everything that Dark Risings had become was a result of their design.

However, this also created a rift between the players and the staff at times, and in many cases, set the stage for an "us against them" mentality at many levels.  The people making the decisions had always been the boss and never enjoyed the "player experience" of not being in control and having changes go in without their approval (or knowledge!).

The "new Dark Risings" really began when Sidonie and I took over the active implementation of the game.  When Mark relinquished his position as active imp, Dark Risings was, for the first time, being run by people who had started DR as regular old players.  We remember what it was like to be a nobody, and to be a player, and to be the victim of sometimes-heavy-handed changes forced down through the ranks.  We also weren't operating under the assumption that we always know what's best for the game, because much of the game was designed and played without us.  Dark Risings is "ours" in the sense that our names are on the paperwork, and we do have the benefit of being long-time players with some amount of wisdom, but I think the defining characteristic of the "new Dark Risings" is that its implementation is far more player-inclusive.

I'd like to think that Dark Risings is less dictatorial and more communal now.  Of course, that's not to say that us admins still aren't the boss.  We are the boss, and we make no bones about letting people know that from time to time.  But this new Dark Risings has become a product of player-driven efforts and RP, so we have nothing to gain by excluding players.