27 Oct, 2009, Antron wrote in the 1st comment:
Votes: 0
okay, this is more of a kvetch than an actual question, but is there any difference between bash, blitz, cuff, headbutt, elbow, jab, kick, knee, leap, lunge, punch, punt, pummel, roundhouse, shoulder, spinkick, spurn, strike, swat, swipe, uppercut, and vault?

do we really need 22 ways to strike someone who you are already swinging your sword at five times per second?
27 Oct, 2009, David Haley wrote in the 2nd comment:
Votes: 0
I think it had to do with wanting different and better skills as you advanced through levels, and it was (for whatever reason, perhaps technical) decided that this should be done with different skills instead of making a given skill progress with levels (for example having damage be a function of level).

That said, some differences can actually matter; you could imagine not being able to use hand techniques if you're wielding weapons, for instance. KaVir's GWII game does things with different techniques being interesting due to what can be followed up with what, what an attack's relative speed is, etc.
27 Oct, 2009, KaVir wrote in the 3rd comment:
Votes: 0
Antron said:
okay, this is more of a kvetch than an actual question, but is there any difference between bash, blitz, cuff, headbutt, elbow, jab, kick, knee, leap, lunge, punch, punt, pummel, roundhouse, shoulder, spinkick, spurn, strike, swat, swipe, uppercut, and vault?

Depends on the implementation, but from a design perspective I'd certainly hope so (even if it's just a case of scaling damage with progression, as suggested by David).

Antron said:
do we really need 22 ways to strike someone who you are already swinging your sword at five times per second?

You might well do. However I'd have some serious misgivings about a combat system that allowed players to consistently attack five times per second.
27 Oct, 2009, Tonitrus wrote in the 4th comment:
Votes: 0
Antron said:
okay, this is more of a kvetch than an actual question, but is there any difference between bash, blitz, cuff, headbutt, elbow, jab, kick, knee, leap, lunge, punch, punt, pummel, roundhouse, shoulder, spinkick, spurn, strike, swat, swipe, uppercut, and vault?

bash lags the opponent, which only works on players, but is vastly different than all the other skills. The others are basically just the same cookie-cutter attack skill with different damages/levels. Unrelatedly, I think having attacks that are only useful for certain levels is stupid. Just make them all useful in different situations, and hand them out at different levels, if you really need such a thing.

Antron said:
do we really need 22 ways to strike someone who you are already swinging your sword at five times per second?

5 sword-swings a second is dumb, you may as well just make it one and do 5x damage. And to answer your previous questions, YES, you need 22 to ways to strike someone, but they should all do different things, not be the same skill. You can do some very interesting things with short-duration effects too. Here's some ideas:

bash - lag opponent, maybe 1rd of stun verses mobs or something
blitz - Extra damage to during World Wars
cuff - -2 wis/-2 int from the insult of being hit with cuff, seriously.
headbutt - -4 int for 2rounds (-1 if saved)
elbow - A lot of damage, high lag, only hits lagged opponents
jab - Very little damage, low lag.
kick - damage, defender's dex resists.
knee - critical hit stuns males for 10rds :(
leap - -8 dex (attacker) 2rds, -8 dex defender 2rds (if it hits)
lunge - -4 charisma (assuming charisma isn't as useless as it normally is, people who lunge are scary)
punch - Do some damage, strength verses defender's con
punt - massive damage to resting hobbits
pummel - low lag, low damage, punch?
roundhouse - 1 round of FLYING (Chuck Norris Style)
shoulder - -4 dex for 2 rounds (-1 saved)
spinkick - easy to miss, opponent's dex protects him, hit does lag for 2 rounds like bash, but has shorter lag itself
spurn - extra damage against people who care
strike - dex verses int damage (monk style attack, think quickly to resist) (this is a stretch, I know)
swat - -4 charisma for the embarrassment of being swatted
swipe - hit them and steal their stuff, like FF "mug"
uppercut - damage + 0rds of stun (the rest of the round) (save negates)
vault - little damage, knocks defender off balance, -8 dex for a round or something.

These are all off the top of my head and quite a few of them aren't meant seriously, but you get the idea. If skills all react to subtle changes in the user and defender's stats and also AFFECT those stats, even temporarily, you can get some interesting combinations of skills that become useful. And if you're anything like me, the more options you have during a fight, the less likely you are to get pissy and complain on channels for 2 years.
27 Oct, 2009, Antron wrote in the 5th comment:
Votes: 0
My five-times-per-second comment was about the skills:
* second attack
* third attack
* fourth attack
* fifth attack

which I believe are SMAUG stock and if I understand correctly are additional attacks per round. Of course a round is a little longer than one second.

If anything I say sounds ignorant it's because I've been building and implementing (but not coding) on SMAUG derivatives for about 8 years but have probably only played a stock smaug for about 10 minutes total.

Tonitrus said:
punt - massive damage to resting hobbits


heh
27 Oct, 2009, Lyanic wrote in the 6th comment:
Votes: 0
As has been mentioned, there's a lot more you can do with attack skills than simple damage modifications. For instance, these are some specific examples from my game:

headbutt = chance to break opponent's nose/skull
kick = chance to break opponent's leg (on low kick)
knee = chance to break opponent's ribs
lunge = chance to intimidate victim into fleeing
punch = chance to knock victim down
roundhouse = chance to hit multiple victims
spinkick = can not be dodged
uppercut = chance to knock opponent upward (into ceiling if inside, into air if outside - situational)
vault = chance to land behind victim, allowing either back-attack or easier escape

I don't have all the skills mentioned, otherwise I'd post examples for all of them (too lazy to make them up). There are a lot of potential variations that are either strategic or situational, and not solely statistical variants. It depends a lot on the available infrastructure of the game, though. I'm not sure I understand the rationale behind this post…
28 Oct, 2009, Tonitrus wrote in the 7th comment:
Votes: 0
Antron said:
My five-times-per-second comment was about the skills:
* second attack
* third attack
* fourth attack
* fifth attack

which I believe are SMAUG stock and if I understand correctly are additional attacks per round. Of course a round is a little longer than one second.

To be clear, I understood what you meant and was commenting about 2nd/3rd/4th/5th attack in my previous post. A round is really more like 3 seconds, supposedly, although it never seems that way to me. I just went with the X attacks a second because that is what your post said. 2nd/3rd/4th/5th attack are one of the things that I absolutely loathe about Smaug. Let's take for example a pk fight with two people against another two. Each person in the fight has 4 (maybe even 5) attacks. Assuming 4 attacks, that's 16 attacks a round, not counting mid-round murders, which would boost it another 4 for each murder. If no one is murdering now, we also have between 1/2 and 1 skill-based attack each round by each non-tank individual, so we'll say 1 extra, and if the tanks are taking sufficient damage, they'll be healing as fast as they can, which is either 4 or 8 potions a round, not bothering with springs and other such things. So that's either 8 or 16 possible actions. So we end up with 25 (or 33) actions occurring every 3 seconds, with up to 39 (or 47) with extra murders. In a 2 on 2. It's been a while since I pked, and I'm distracted while writing this, so I may be exaggerating things a bit. At any rate, the only way I was ever able to pk in such a setting was to use massive amounts of highlights and use echo triggers to say things like SANC 30 times on 3 lines if my sanc fell. There is a stock setting you can use to avoid seeing misses, but then you can't distinguish misses from attacks you simply didn't make. I don't know about you, but I can't read that fast, and there's no real point in having such a system. It also does nothing to make the game more interesting. Experienced pkers would always tell me that after a while you learn to ignore all the spam and only pick out the interesting parts. If something like 80% of what you are displaying isn't interesting, why even display it?

As a codebase, Smaug has a great deal of potential and some very great features. As an example of game design, though, stock Smaug is pretty brain-damaged.
28 Oct, 2009, David Haley wrote in the 8th comment:
Votes: 0
Tonitrus said:
5 sword-swings a second is dumb, you may as well just make it one and do 5x damage.

Five attacks per second plus extra skill-based attacks is indeed rather odd, but it is certainly not the same thing as just one with five times the damage. Five attacks means that many more chances to land a hit – and sometimes landing a hit can be more important than dealing damage [1] – whereas one attack means you get one chance and that's it. If the "five per second" frequency bugs you, think of it as "five per ten seconds" (one per two seconds) – this is certainly not exactly the same as one per ten seconds with five times the damage.

[1] e.g., when using poison, using some special attack that blinds (or whatever) the opponent, trying to disrupt a spell, trying to disrupt concentration in general, and so forth.
28 Oct, 2009, Antron wrote in the 9th comment:
Votes: 0
Tonitrus said:
As a codebase, Smaug has a great deal of potential and some very great features. As an example of game design, though, stock Smaug is pretty brain-damaged.


That's for sure! Unfortunately I think that often players are unable to make that distinction (no one here, but players who don't also build or code or anything)
28 Oct, 2009, Tonitrus wrote in the 10th comment:
Votes: 0
David Haley said:
Tonitrus said:
5 sword-swings a second is dumb, you may as well just make it one and do 5x damage.

Five attacks per second plus extra skill-based attacks is indeed rather odd, but it is certainly not the same thing as just one with five times the damage. Five attacks means that many more chances to land a hit – and sometimes landing a hit can be more important than dealing damage [1] – whereas one attack means you get one chance and that's it. If the "five per second" frequency bugs you, think of it as "five per ten seconds" (one per two seconds) – this is certainly not exactly the same as one per ten seconds with five times the damage.

[1] e.g., when using poison, using some special attack that blinds (or whatever) the opponent, trying to disrupt a spell, trying to disrupt concentration in general, and so forth.


With the possible exception of wimpy (ugh), it's the same as one attack with 5 chances to hit, each increasing the current damage. To avoid the line noise, you may as well just display something like:

Bob hits scratch, wound, disorient, miss, and aggravate Fred!

(for the same amount of damage, instead of seeing all the spam)

For reference, I think the damage is too high too, but I suppose that's another argument.
28 Oct, 2009, Igabod wrote in the 11th comment:
Votes: 0
Just another suggestion for different effects of punch. If you've ever been punched in the nose really hard you know that it can make it difficult to see for a while afterward. Perhaps you could add in a chance for blinding for 1 - 3 rounds depending on the attacking char's proficiency with the punch skill. A player with 20% punch would get a 2% chance of blinding for 1 round. A player with 50% would get a 5% chance for 2 rounds, a player with 75% or higher would get a 10% chance of blinding for 3 rounds. I toyed around with the idea of totally re-doing all of the warrior-type skills in this manner when I was tinkering with a rom a while back. I only got a few of them done before I realized how big the job was and that my skills weren't quite up to doing some of the things I wanted to do, but the punch modification was fairly easy to do even for me. If you want further ideas for modifications lemme know and I'll throw them your way, this offer is open to anybody. I'm full of ideas but my skills aren't quite up to the job.

[edit to add] You could also make the victim have a chance to not be affected depending on their con stat or add a new toughness stat for the purpose of resistance to these type of attacks.
28 Oct, 2009, KaVir wrote in the 12th comment:
Votes: 0
Tonitrus said:
With the possible exception of wimpy (ugh), it's the same as one attack with 5 chances to hit, each increasing the current damage.

Except, as David pointed out, each hit may cause other effects (which could be cumulative). Also, if you implement armour as damage soak, it would apply against each attack separately. You might also have other features that respond differently to multiple attacks, such as a 'parry' skill which only works against the first attack each round, or a 'counterattack' which gains a bonus for every blow that misses, etc.

Tonitrus said:
To avoid the line noise, you may as well just display something like:

Bob hits scratch, wound, disorient, miss, and aggravate Fred!

You could do, although some players actually like multiple attack messages because they think it looks impressive (!), so if you do combine the messages I'd suggest making it a configurable option.

Personally I think I'd limit it to a maximum of 3 attacks per round, if I were using that style of combat system.
28 Oct, 2009, David Haley wrote in the 13th comment:
Votes: 0
Tonitrus said:
With the possible exception of wimpy (ugh), it's the same as one attack with 5 chances to hit, each increasing the current damage. To avoid the line noise, you may as well just display something like:

Bob hits scratch, wound, disorient, miss, and aggravate Fred!

Now you're just talking about compressing output, not making it just one attack. Your previous statement was saying that 5 hits at damage X was the same as 1 hit at damage 5X, which is what I was disagreeing with. This new statement I have little issue with, except that it's about output control and not attack control. That said, I think KaVir's point (that some players like the output) is worth considering.
28 Oct, 2009, sam.j.brown wrote in the 14th comment:
Votes: 0
Here is how i compresses the output of smaug combat code to make it much less spammy and compact.

Each skill and spell needs this line added to the success if statement.

ch->success_attack += 1;


MUD.H

Add to the char_data structure

int success_attack;
int damage_amount;


FIGHT.C

in NEW_DAMAGE_MESSAGE

replace the parts that look like this code with this:

if ( dt == TYPE_HIT )
{
snprintf ( buf1, 256, "$n %s $N%c [%d] Times for [%d] Total Damage", vp, punct, ch->success_attack, ch->damage_amount );
snprintf ( buf2, 256, "You %s $N%c [%d] Times for [%d] Total Damage", vs, punct, ch->success_attack, ch->damage_amount );
snprintf ( buf3, 256, "$n %s you%c [%d] Times for [%d] Total Damage", vp, punct, ch->success_attack, ch->damage_amount );
}



snprintf ( buf1, 256, "$n's poisoned %s %s $N%c [%d] Times for [%d] Total Damage", attack, vp, punct, ch->success_attack, ch->damage_amount );
snprintf ( buf2, 256, "Your poisoned %s %s $N%c [%d] Times for [%d] Total Damage", attack, vp, punct, ch->success_attack, ch->damage_amount );
snprintf ( buf3, 256, "$n's poisoned %s %s you%c [%d] Times for [%d] Total Damage", attack, vp, punct, ch->success_attack, ch->damage_amount );



snprintf ( buf1, 256, "$n's %s %s $N%c [%d] Times for [%d] Total Damage", attack, vp, punct, ch->success_attack, ch->damage_amount );
snprintf ( buf2, 256, "Your %s %s $N%c [%d] Times for [%d] Total Damage", attack, vp, punct, ch->success_attack, ch->damage_amount );
snprintf ( buf3, 256, "$n's %s %s you%c [%d] Times for [%d] Total Damage", attack, vp, punct, ch->success_attack, ch->damage_amount );



in DAMAGE

find

if ( ch != victim )
dam_message ( ch, victim, dam, dt );

/*
* Hurt the victim, Inform the victim of his new state.
*/
victim->hit -= dam;

replace with


ch->damage_amount = 0;
dam = dam * ch->success_attack; // removing battle spam Fury.
ch->damage_amount = dam;

if ( dam == 0 )
ch->success_attack = 0;

if ( ch != victim )
dam_message ( ch, victim, dam, dt );

/*
* Hurt the victim, Inform the victim of his new state.
*/
victim->hit -= dam;


MULTI_HIT

Check your function first to see if it has extra code, then replace with this

/*
* Do one group of attacks.
*/
ch_ret multi_hit ( CHAR_DATA * ch, CHAR_DATA * victim, int dt )
{
int schance;
int dual_bonus;
ch_ret retcode;

ch->success_attack = 0;

/* add timer to pkillers */
if ( !IS_NPC ( ch ) && !IS_NPC ( victim ) )
{
if ( xIS_SET ( ch->act, PLR_NICE ) )
return rNONE;
add_timer ( ch, TIMER_RECENTFIGHT, 11, NULL, 0 );
add_timer ( victim, TIMER_RECENTFIGHT, 11, NULL, 0 );
}

/* Check for suppressed or hidden attack */
if ( is_attack_supressed ( ch ) )
return rNONE;

/* Check for NO attack mobile */
if ( IS_NPC ( ch ) && xIS_SET ( ch->act, ACT_NOATTACK ) )
return rNONE;

/* Check for circle or backstab attack
if ( who_fighting ( ch ) != victim || dt == gsn_backstab || dt == gsn_circle )
return rNONE; */

/* NPC predetermined number of attacks -Thoric */
if ( IS_NPC ( ch ) && ch->numattacks > 0 )
{
for ( schance = 0; schance < ch->numattacks; schance++ )
{
ch->success_attack += 1;
}
retcode = one_hit ( ch, victim, dt );
return retcode;
}


/* Check for berserk attack */
schance = IS_NPC ( ch ) ? 100 : ( LEARNED ( ch, gsn_berserk ) * 5 / 2 );
if ( IS_AFFECTED ( ch, AFF_BERSERK ) && number_percent( ) < schance )
{
ch->success_attack += 1;
}

/* Check for dual wield attack */
if ( get_eq_char ( ch, WEAR_DUAL_WIELD ) )
{
dual_bonus = IS_NPC ( ch ) ? ( ch->level / 10 ) : ( LEARNED ( ch, gsn_dual_wield ) / 10 );
schance = IS_NPC ( ch ) ? ch->level : LEARNED ( ch, gsn_dual_wield );
if ( number_percent( ) < schance )
{
learn_from_success ( ch, gsn_dual_wield );
ch->success_attack += 1;
}
else
learn_from_failure ( ch, gsn_dual_wield );
}
else
dual_bonus = 0;

if ( ch->move < 10 )
dual_bonus = -20;

/* Roll for first attack */
schance = IS_NPC ( ch ) ? ( int ) ( ch->level / 2 ) : 0;
if ( number_percent( ) < schance )
ch->success_attack += 1;

/* Roll for second attack */
schance = IS_NPC ( ch ) ? ch->level : ( int ) ( ( LEARNED ( ch, gsn_second_attack ) + dual_bonus ) / 1.5 );
if ( number_percent( ) < schance )
{
learn_from_success ( ch, gsn_second_attack );
ch->success_attack += 1;
}
else
learn_from_failure ( ch, gsn_second_attack );

/* Roll for third attack */
schance = IS_NPC ( ch ) ? ch->level : ( int ) ( ( LEARNED ( ch, gsn_third_attack ) + ( dual_bonus * 1.5 ) ) / 2 );
if ( number_percent( ) < schance )
{
learn_from_success ( ch, gsn_third_attack );
ch->success_attack += 1;
}
else
learn_from_failure ( ch, gsn_third_attack );

/* Roll for forth attack */
schance = IS_NPC ( ch ) ? ch->level : ( int ) ( ( LEARNED ( ch, gsn_fourth_attack ) + ( dual_bonus * 2 ) ) / 3 );
if ( number_percent( ) < schance )
{
learn_from_success ( ch, gsn_fourth_attack );
ch->success_attack += 1;
}
else
learn_from_failure ( ch, gsn_fourth_attack );

/* Roll for fifth attack */
schance = IS_NPC ( ch ) ? ch->level : ( int ) ( ( LEARNED ( ch, gsn_fifth_attack ) + ( dual_bonus * 3 ) ) / 4 );
if ( number_percent( ) < schance )
{
learn_from_success ( ch, gsn_fifth_attack );
ch->success_attack += 1;
}
else
learn_from_failure ( ch, gsn_fifth_attack );

if ( ( retcode = one_hit ( ch, victim, dt ) ) != rNONE )
return retcode;

retcode = rNONE;
if ( retcode == rNONE )
{
int move;

if ( !IS_AFFECTED ( ch, AFF_FLYING ) && !IS_AFFECTED ( ch, AFF_FLOATING ) )
move = encumbrance ( ch, movement_loss[UMIN ( SECT_MAX - 1, ch->in_room->sector_type ) ] );
else
move = encumbrance ( ch, 1 );
if ( ch->move )
ch->move = UMAX ( 0, ch->move - move );
}

return retcode;
}
29 Oct, 2009, David Haley wrote in the 15th comment:
Votes: 0
That code is doing one roll and multiplying by the number of hits, as opposed to doing one roll per hit. Was that intentional?

Probabilistically speaking, this makes it easier to inflict maximum possible damage, in addition to reducing the number of possible damage amounts. Consider damage in range 1-2, and 3 attacks. Assume that all hits land.

Normally the probability of inflicting six points of damage is 1/2 * 1/2 * 1/2 = 1/8. (Because you have to roll 2 three times.)
Using your method, it's simply 1/2. (Because you have to roll 2 simply once.)
Furthermore, your method removes the damages in between.

For example, the normal way allows damages:
3 with probability 1/8 (only one way to get 3: 1/1/1)
4 with probability 3/8 (the three ways to get 4 are 1/1/2, 1/2/1, 2/1/1)
5 with probability 3/8 (the three ways to get 5 are 1/2/2, 2/1/2, 2/2/1)
6 with probability 1/8 (only one way to get 6: 2/2/2)

whereas your method only allows damages:
3 with probability 1/2 (1/2 chance to get 1, times 3)
6 with probability 1/2 (1/2 chance to get 2, times 3)


So, you have not only reduced the output, but you have also changed the combat rules.
29 Oct, 2009, Koron wrote in the 16th comment:
Votes: 0
The first solution we implemented to reduce combat spam (and we've since moved onto better things) was to add two variables multi_hit, num_hits and total_damage. When it called one_hit, it did it something to the tune of if ((dam_swing = one_hit(ch, vict, blah blah blah)) > 0) {dam_total += dam_swing; num_hits++;}. The damage func was then called with those variables, which in turn called the dam message stuff. We had to do a fair share of code acrobatics to make sure everything worked as intended.

That seemed the simplest solution, but it definitely wasn't the best one. We've since revamped combat (more than once, actually) to include more complicated mechanics. In the process we also removed multi hits. It makes things much simpler to work with and is far easier (for me, at least) to understand at a glance.

The take-away from this is what David's getting at: stock combat systems are complicated and thus easy to mess up.

As far as the OP goes, I would say that it's silly to have a huge list of skills that all do the same thing, especially if they all belong to the same class. There are some good suggestions in this thread for minor variation. Those are excellent starting points. Go from there.
29 Oct, 2009, sam.j.brown wrote in the 17th comment:
Votes: 0
Actually i had not thought about this, it would make sense to roll damage for each successful attack and sum up the results (adding this to todo list), thus keeping closer to what smaug did originally, however i do not think it really makes much of a difference as everyone gets to play by the same rules, and apart from a few minor tweaks here and there, players have not really noticed the difference at all. BTW i did not write the code, it was given to me from the original author to use, also the author has made the snippet public domain, so anyone can use it.
29 Oct, 2009, Tonitrus wrote in the 18th comment:
Votes: 0
On the subject of Smaug combat spam reduction, I had had an idea on how to handle it the last time I was messing with Smaug. I never got around to writing it, so (like many of my ideas) it's probably either a really great idea or a really dumb one, I'm not much for middle ground.

Anyway, the idea was to add static variables to damage(), last_victim and last_attacker. I think I'd probably need about 5 (10) other static variables, for the damage (and type) of up to 5 attacks. Then I planned to add an extra damage at the end of each multi_hit and melee_hit where it would pass some magic number and a bunch of nulls. I think that's how it was going to work, I forget. Anyway, the gist is that as long at the attacker and the defender were the same, damage() would just keep track of the numbers, when they differed, it would display all the damage messages at once on one line.

The trouble with this is that you'd have to basically tell damage to "flush" and just display what it has without waiting around anymore. I wouldn't think that'd be a terribly big deal, but it would involve some busy-work in going through the skills/spells.
29 Oct, 2009, Runter wrote in the 19th comment:
Votes: 0
Antron said:
okay, this is more of a kvetch than an actual question, but is there any difference between bash, blitz, cuff, headbutt, elbow, jab, kick, knee, leap, lunge, punch, punt, pummel, roundhouse, shoulder, spinkick, spurn, strike, swat, swipe, uppercut, and vault?

do we really need 22 ways to strike someone who you are already swinging your sword at five times per second?


No. Personally I have a distaste for games that use multiple skills that do the same thing. As I do for games where a bunch of spells named different things do the same thing.
29 Oct, 2009, KaVir wrote in the 20th comment:
Votes: 0
Runter said:
Personally I have a distaste for games that use multiple skills that do the same thing. As I do for games where a bunch of spells named different things do the same thing.

But how strictly do you define "the same thing"? For example, how would you feel about the following:

* Firebolt and icebolt: These do the same thing, except one inflicts heat damage and the other cold damage.

* Fireball and Flamestrike: These do the same thing, except one takes longer to cast and the other has a shorter range.

* Icestorm and Iceblast: These do the same thing, except one does it on everyone within range while the other only effects your target.

* Heal and Harm: These do the same thing on living and undead creatures respectively, reversed if cast on the other type (eg Harm heals undead).

* Sonicblast and Sonicwave: These do the same thing, except one requires a gesture and the other requires speech.

* Shadowbolt and Shadowstream: These do the same thing, but require different gestures to cast.

* Stoneskin and Sanctuary: These do the same thing, but the former only works against physical damage, while the latter only works against evil creatures.

* Soulblade and Spiritblade: These do the same thing when used on their own, but each are tied to separate skill trees which provide different options and enhancements.
0.0/35