Leveling Attacks/Spells
As you level up you will frequently gain new attacks and spells and frequently questions come up about how to use those, which to use, etc.
Learning/Adepting
To view your full skills list type 'slist'
To view your current skills/spells, and the percentage at which you have adepted them, type 'prac' (practice)
You'll notice that when you first learn a new thing you are only like 15% adept at it.
As such, it will fail most of the time when you attempt it. Just keep doing it, and eventually that number will rise and it'll work more often. (Yes, even failed attempts do count towards raising your adeptness). Adepting skills/spells is rather a bitch and it can take a lot of time to get them all to maximum adeptness. Really you just need the ones you use fully adepted, and those will be your combat skills and basic functionality stuff like search/track/scan etc.
You'll notice that some spells or skills seem to fail a LOT even once you are more adept at them, that's likely because the mob you're trying it upon is resistant or fully immune to that skill. For example, not all mobs can be subject to the 'weaken' spell, you cannot 'steal' from all mobs, etc. Figuring out what works on which mobs is part of learning your way in the realms.
Passive Skills
Some spells don't require any manual usage, they 'just happen'. Things like '2nd attack' for example, just happen, and you'll notice those becoming more adept and yourself landing more melee attacks over time, it typically doesn't take very long at all.
Combat & Experience
Experience points (xp) is awarded based on several factors, but the prime one is how much damage you actually deal to the mob.
So, in most cases your highest level attack will deal the most damage, so just use that. But for some cases, mostly pertaining to magical spell attacks, certain spells just hit harder regardless of their level. It can also be based on the mobs resistances/susceptabilities - if you hit an ice mob with a fire attack it might smack the shit out of it for super good xp, but you have to test because you really don't know - and 99% of the time your highest level attack will still be best anyways, which is kinda of a bummer.
Overall there is very minimal 'strategy' built into the skill/spell attacks, they don't really 'do' anything different they just hit and you should just use whichever thing hits the hardest. You can determine the strength of the damage you are doing by the descriptor used, see Damage Descriptors
Several years ago the immortal Edmond changed how experience points work, he provided the info on this rodpedia page which I really don't understand whatsoever: Experience Ratings
For a better discussion on leveling quickly, I'll make another page, because its pretty dumb and you shouldn't put much thought into it.
Physical Attacks
You should just use your highest level attack you have. The flavor of the attack really doesn't matter, so its not strategic. There is no difference between strike, swat, uppercut, etc. They just do progressively more damage, there are no other differences in how they hit the mob.
In SOME cases an attack can do more than just damage.
- Gouge has a chance to also blind the mob for a few rounds
- Bash will cause 4 bar lag to the mob
- Wasp Talon has a chance to poison the mob
There are not a ton of these, and their help files make it pretty clear, but ask on chat channel if you have questions.
Magical Attacks
Usually you just use your highest level magic attack - but with magic there are someeee slight variances compared to physical attacks.
- For clerics, if you turn evil align, the spell 'necromantic touch' is fucking game breaking to level with, you must turn evil and use that or you are a fool who is wasting so much time.
- For mages, the spell 'caustic touch' gets the most xp so once you get that stick with it as you level up, the higher level spells won't garner as much xp.
Otherwise, each type of magic attack will output a different type of magical damage - for example energy, cold, holy, etc. Mobs may be resistant or susceptible to those. See Resistances for a full list and more info. Only SOMETIMES will this actually matter, in the vast majority of cases it doesn't matter and you should just hit with your highest level attack spell.
Spelldowns
For spelldowns, you'll quickly notice that they won't work on every mob. Many are immune entirely, many are resistant.
It can be tricky when you first learn a new spelldown to determine if the problem is you are just not adept enough at it yet, or if the mob you are trying it upon is immune/resistant. Best suggestion there is to try it on different mobs, find one where it works, and use that mob to become more adept at it. Once you've adepted it to a high percentage, then if you try it like twice on a mob and it doesn't land you can be pretty sure the mob is immune/resistant.
There are also spelldowns that make the mob more susceptible to other spelldowns.... For example, the Nephandi class is entirely based upon this and if you cast all the 'neph downs' on a mob you can then land a bunch of shit that wouldn't normally land. Basic example, Neph's get 'petrification' which makes mobs susceptible to paralysis, and then you can land things like a Mages 'immobilize' when you normally could not.
Mechanics
Each attack, physical or magic, is individually coded. So, they all work slightly differently.
Some use a strict hardcoded table for damage that scales with your level. So, if you cast 'fart' at level 10 it'll do 100 damage, and at level 20 it'll do 200 damage.
Some use a relative value, derived by some logic, that usually had to do with your level, the mobs level, maybe some stats, etc.
Example For Nerds
Spell Attack
Here's a really old example from the public relase of SMAUG 1.8 for the 'burning hands' spell. This uses a pre-determined table of damage values, does some rolls on them, applies saving throws, to determine damage. Bear in mind that Resistances are then applied AFTER, and are a different chunk of code/logic.
ch_ret spell_burning_hands( int sn, int level, CHAR_DATA *ch, void *vo )
{
CHAR_DATA *victim = (CHAR_DATA *) vo;
static const sh_int dam_each[] =
{
0,
0, 0, 0, 0, 14, 17, 20, 23, 26, 29,
29, 29, 30, 30, 31, 31, 32, 32, 33, 33,
34, 34, 35, 35, 36, 36, 37, 37, 38, 38,
39, 39, 40, 40, 41, 41, 42, 42, 43, 43,
44, 44, 45, 45, 46, 46, 47, 47, 48, 48,
49, 49, 50, 50, 51, 51, 52, 52, 53, 53,
54, 54, 55, 55, 56, 56, 57, 57, 58, 58
};
int dam;
level = UMIN(level, sizeof(dam_each)/sizeof(dam_each[0]) - 1);
level = UMAX(0, level);
dam = number_range( dam_each[level] / 2, dam_each[level] * 2 );
if ( saves_spell_staff( level, victim ) )
dam /= 2;
return damage( ch, victim, dam, sn );
}
Here's how Claude explains that:
- Setup
- victim is the target, cast from the generic void *vo pointer.
- dam_each[] is a lookup table mapping the caster's level to a base damage value.
- Low levels (0–4) do 0, then it jumps to 14 at level 5 and scales up to 58 at the top.
- Clamping the level
- level = UMIN(level, sizeof(dam_each)/sizeof(dam_each[0]) - 1) caps the damage level at the last valid table index
- (70 here, since the array has 71 entries indexed 0–70). This prevents reading past the end of the array.
- level = UMAX(0, level) ensures level isn't negative. After these two lines, damage level is guaranteed to be a safe index.
- level = UMIN(level, sizeof(dam_each)/sizeof(dam_each[0]) - 1) caps the damage level at the last valid table index
- Rolling damage
- dam = number_range( dam_each[level] / 2, dam_each[level] * 2 ) picks a random integer between half and double the base value for that level.
- So at level 5 (base 14), it rolls between 7 and 28. This gives a wide random spread averaging roughly the base value (slightly above it, since the midpoint of half-to-double is 1.25× base).
- dam = number_range( dam_each[level] / 2, dam_each[level] * 2 ) picks a random integer between half and double the base value for that level.
- Saving throw
- if ( saves_spell_staff( level, victim ) ) dam /= 2; — if the victim successfully makes a saving throw (save vs. spells/staves), damage is halved.
- Applying it
- return damage( ch, victim, dam, sn ) deals the final damage from caster ch to victim, tagged with the spell number sn (used for messages, damage type, resistances, etc.).
Here's how that maps out to actual damage values per level:
- The 'Base' column is the base damage pulled from the index table of values in the spell code before randomization
- The code then operates upon that by doing "number_range(base/2, base*2)" to set the random spread. So base is the center-ish of the roll — the min is half of it, the max is double it.
Lvl Base NoSave(min-max) Saved(min-max) --- ---- --------------- -------------- 0 0 0-0 0-0 1 0 0-0 0-0 2 0 0-0 0-0 3 0 0-0 0-0 4 0 0-0 0-0 5 14 7-28 3-14 6 17 8-34 4-17 7 20 10-40 5-20 8 23 11-46 5-23 9 26 13-52 6-26 10 29 14-58 7-29 11 29 14-58 7-29 12 29 14-58 7-29 13 30 15-60 7-30 14 30 15-60 7-30 15 31 15-62 7-31 16 31 15-62 7-31 17 32 16-64 8-32 18 32 16-64 8-32 19 33 16-66 8-33 20 33 16-66 8-33 21 34 17-68 8-34 22 34 17-68 8-34 23 35 17-70 8-35 24 35 17-70 8-35 25 36 18-72 9-36 26 36 18-72 9-36 27 37 18-74 9-37 28 37 18-74 9-37 29 38 19-76 9-38 30 38 19-76 9-38 31 39 19-78 9-39 32 39 19-78 9-39 33 40 20-80 10-40 34 40 20-80 10-40 35 41 20-82 10-41 36 41 20-82 10-41 37 42 21-84 10-42 38 42 21-84 10-42 39 43 21-86 10-43 40 43 21-86 10-43 41 44 22-88 11-44 42 44 22-88 11-44 43 45 22-90 11-45 44 45 22-90 11-45 45 46 23-92 11-46 46 46 23-92 11-46 47 47 23-94 11-47 48 47 23-94 11-47 49 48 24-96 12-48 50 48 24-96 12-48