Dragonfire III Documentation

From Dragonfiremud.com - the Ancient Realm of Dragonfire

Jump to: navigation, search

Contents

Important Simul-Efuns and other functions

object locate_item(object where, string item, int which)

Locate_item uses the same method of organizing items as does 'look' or 'inventory'. This is critical for dependability in locating items with basic commands.

Commands that use locate_item. get, put, wield, wear, drop, etc.

display_inventory( object ob ) works in conjunction with locate_item. this displays a color coded inventory of the object provided

diminishing_returns, self explanatory

transfer modified with regard to containers-> can_put_and_get() called from transfer now passes the item trying to be placed in the container as can_put_and_get(object item). This allows the coder to query certain things about the object to be placed within the container, if necessary. A function can_put_and_get() can still be placed in the object with no argument (item) received with no errors for blanket returns. Also, prevent_insert() has been modified to pass the destination object as prevent_insert(object dest). Again, this allows the object to check the destination for various parameters to determine whether it should go or not. Very similar in function to the above discussion.


evars

player code: mixed query_evar(string evar);

Evars or environmental variables, are a way of allowing a player to customize their gameplay a bit.

As functionality is created we can allow players to set certain variables in order to receive more or less output from the game.

For example if they wanted channels and chat to snip out cuss words.. we would have to modify the channel and chat code and then check their evar. If this evar was called CUSSING, it might go something like this. if(TP->query_evar("CUSSING")) -- blah

players can modify their evars through the evars command.


Directory hierarchy and mudlib inheritables

  • /domains/areas/: all in-game areas are in subfolders here
  • /players/wizname/: wizards home directories
  • /obj/:all base objects
  • /obj/modules/:modules included by base objects
  • /obj/living/: a few modules that should be moved to modules
  • /obj/living/races/:all race data
  • /bin/player/:player bins
  • /bin/wiz/:wiz bins
  • /secure/simul/:simul efuns
  • /bin/skills/:all skills
  • /room/:base room
  • /room/guild/:guild room inheritable

important objects:

  • /obj/weapon.c
  • /obj/armor.c
  • /obj/living.c -> player.c or monster.c
  • /room/room.c
  • /room/basic_shop.c -> inheritable for basic buy-only shops

Code Examples

Monster

inherit "/obj/monster.c";
 
void reset(status arg)
{
    ::reset(arg);
    if(arg) return;
    add_object("/path/to/object.c", 1);//only need the second arg if the monster should wield/wear the object
 
    set_name("demon"); 
    set_alias("ugly demon");
    set_short("demon");
    set_long("A disgusting, and hideous demon.\n");
    set_race("demon");
    set_level (1);
    set_gender("male");
 
    //very optional settings
    add_skill("resist blunt", 20);//20% blunt resistance skill
 
}

Skills

Shield

inherit "/bin/skill_inh.c";
 
void reset(int arg)
{
    if(arg)return;
 
    /* REQUIRED */
    set_name("force shield");
    set_type("magical");
    set_is_spell(1);
 
    /* REQUIRED */
 
    set_flags( ([
        "cast_time": 10,
        "duration" :120,
        "absorb magic":100,
        "spell cost" : 50,
        "mess caster": "You cover %p in a force shield.\n",
        "mess target": "%a covers you in a force shield.\n",
        "mess others": "%a covers %t in a force shield.\n",
        "affected_frequency_mess":"Your force shield fades away.\n",
        "other_frequency_mess":"%t's force shield fades away.\n",
 
      ])
    );
 
}

Attack with Stun

inherit "/bin/skill_inh.c";
 
void reset(int arg)
{
    if(arg)return;
 
    /* REQUIRED */
    set_name("templar charge");
    set_type("wound");
    /* REQUIRED */
 
    set_flags( ([
        "cast_time":random(3)+4,
        "endurance cost" : 15,
        "damage"   : 50,
        "stun_duration":3,
        "stun_level":8,
        "stun_chance":50,
        "non-combat":"yes",
        "resist"   : ({"blunt"}),
        "require_weapon_type":({"sword"}),
 
        "modifier":(["swordsmanship":10]),
 
        "mess caster": "As %t looks away for a split second, you turn your blade
and CHARGE at %v "
        "driving the hilt of your sword into %p head!\n",
        "mess target": "%a catches you off your guard for a split second and
CHARGES at you driving the "
        "hilt of %u blade into your head!\n",
        "mess others": "%a catches %t off guard turns %u blade and CHARGES,
driving the hilt of %u blade "
        "into %t's head!\n",
        "description":"The Templar Knight being a true swordsman at heart, is
able to use combat tactics "
=== More: (73%) Page 1, 1..34 [CR,u,f,l,q,/<regexp>,<page>,?] 
        "with its sword to create the ultimate pre-fight diversion. If executed
properly the Knight "
        "can throw its opponent off guard and bash them with the hilt of its
sword, stunning "
        "them briefly",
        "mess caster fail": "%t is paying too close of attention.\n",
        "mess target fail": "You catch %a staring at you.\n",
        "mess others fail": "%a stares at %t.\n"
      ])
    );
 
}

Dispel

inherit "/bin/skill_inh.c";
 
void reset(int arg)
{
    if(arg)return;
 
    /* REQUIRED */
    set_name("dispel magic");
    set_type("magic");
    /* REQUIRED */
    set_is_spell(1);
 
    set_flags( ([
        "cast_time": 1,
        "spell cost": 5,
        "dispel": ({ "magic" }),
        "modifier":(["spell casting":25]),
        "mess caster": "You dispel magic on %t.\n",
        "mess target": "%a dispels magic on you.\n",
        "mess others": "%a dispels magic on %t.\n",
        "mess caster fail": "Your spells fails!\n",
        "mess target fail": "%a tries to cast a spell at you, but fails!\n",
        "mess others fail": "%a tries to cast a spell at %t but fails!\n",
      ])
    );
 
}

Heal

inherit "/bin/skill_inh.c";
 
void reset(int arg)
{
    if(arg)return;
 
    /* REQUIRED */
    set_name("heal");
    set_type("magic");
    set_is_spell(1);
    /* REQUIRED */
 
    set_flags( ([
        "cast_time": 3,
        "spell cost" : 15,
        "heal"       : 50,
        "modifier":(["art of healing":25, "casting spells":25]),
        "mess caster": "Your hand begins to glow.\n"
        "You touch %t, healing some of %u wounds.\n",
        "mess target": "%a's hand begins to glow.\n%a heals some of your
wounds.\n",
        "mess others": "%a's hand begins to glow.\n%a heals some of %t's
wounds.\n",
        "mess caster fail": "You fail the healing spell.\n",
        "mess target fail": "%a does nothing.\n",
        "mess others fail": "%a does nothing.\n",
        "modifier":(["art of healing":5, "vicar's will":10])
 
 
      ])
    );
 
}

Group Heal

inherit "/bin/skill_inh.c";
 
void reset(int arg)
{
    if(arg)return;
 
    /* REQUIRED */
    set_name("heal party");
    set_type("magic");
    set_is_spell(1);
    /* REQUIRED */
 
    set_flags( ([
        "cast_time": 3,
        "spell cost" : 15,
        "heal"       : 50,
        "area affect": "party",
        "modifier":(["casting spells":25, "art of healing":25]),
        "mess caster": "Your hand begins to glow.\n"
        "You touch %t, healing some of %u wounds.\n",
        "mess target": "%a's hand begins to glow.\n%a heals some of your
wounds.\n",
        "mess others": "%a's hand begins to glow.\n%a heals some of %t's
wounds.\n",
        "mess caster fail": "You fail the healing spell.\n",
        "mess target fail": "%a does nothing.\n",
        "mess others fail": "%a does nothing.\n",
        "modifier":(["art of healing":5, "vicar's will":10])
 
 
      ])
    );
 
}

Spell with condition

inherit "/bin/skill_inh.c";
 
void reset(int arg)
{
    if(arg)return;
 
    /* REQUIRED */
    set_name("thunderclap");
    set_type("magic");
    set_is_spell(1);
    /* REQUIRED */
 
    set_flags( ([
        "cast_time":2,
        "spell cost":10,
        "condition":(["deaf":10]),
        "duration":60,
        "modifier":(["casting spells":25]),
        "mess caster": "You deafen %t with a loud thunderclap.\n",
        "mess target": "%a deafens you with a loud thunderclap.\n",
        "mess others": "%a deafens %t with a loud thunderclap.\n",
        "mess caster fail": "You fail your spell.\n",
        "mess target fail": "%a fails a spell.\n",
        "mess others fail": "%a fails a spell.\n",
        "affected_fade_mess": "Your hearing returns.\n",
        "other_fade_mess": "%t's hearing returns.\n",
      ])
    );
 
}

Combat flowcharts

The chance of getting a combat special to go off during a normal hit is unlikely, however during stuns, glancing blows, successful dodges or successfully taking a hit, this can increase the chance of a special offense skill such as a critical hit, a counter attack, etc.

Avoidance: Dodge-> succeed-->dodge|sidestep|backpedal|turn|duck|magical dodge->chance to counter attack fail----->glancing blow|critical hit|stun->chance to receive counter

Take hit-> succeed-->take strategic hit->chance to offensive like critical|stun|etc fail----->take full hit Image:Combat_example.png

Outworld map

Image:Coloredmap.jpg

damage messages

1,2,4,6,8,10,15,20,25,30,35,40,45,50, //14 60,70,80,90,100, //5 125,150,175,200, //5 250,300,350,400, //5 450,500,600,700,800,900,1000 //7 can have CAPS here

35 total messages

damage types

DF3 has 9 damage types:

  • "blunt"
  • "edge"
  • "pierce"
  • "fire"
  • "ice"
  • "spell"
  • "acid"
  • "poison"
  • "electric"

immunity and resistance

example: add_racial_skill("resist spell", -5); This would give -5% immunity to spell damage (they would take 5% extra damage);

Races,Origins,Backgrounds

Races are categorized once by their Origin. Currently there is one place of origin, the continent of Estygia.

Estygia houses a few starting races. Humans, Satyrs, Orcs, Trolls.

These races are further classified by their background or nature. Humans and orcs are the combative type relying on mostly physical abilities, instinct, etc. Trolls are of a mystical background. This background has a little balance of physical and magical capabilities while also providing supporting abilities or spells such as that a shaman would cast. Magical nature subjects that race to only magical abilities, and very very little physical ability. There may also be a civilized background where that type of player would provide services to others.

Nature also defines other things such as: Guilds you can join, weapons you can wield, and armor you can wear. This follows typical MMO style whereas you would not often see a healer class in full HIGH-AC plate armor.

Magical backgrounds are further designated as spiritual or chaotic. Spiritual magicians are more of the caster type with healing capabilities while chaotic magicians can focus on detrimental abilities.

Valid Natures:

evil

good

neutral

Valid Backgrounds:

Fighter

Magical

Spiritual

These backgrounds coincide with typical mmo classes. for example:

True Classes:

  • Melee DPS (fighter):
  • Melee Tank (fighter):
  • Caster Heal (spiritual):
  • Caster DPS (magical):

Hybrid Classes:

  • Melee DPS/Melee Tank:
  • Caster DPS/Caster Heal:

Cross Hybrid Classes:

  • Melee DPS/Caster Heal:
  • Melee DPS/Caster DPS:
  • Melee Tank/Caster Healer:


Sample race template:

//Race template
//Race: Satyr
//Written by: Uuga
#define RACE_DIRECTORY "/obj/living/races/"
inherit "/obj/living/races/race_template.c";
 
 
void reset(int arg)
{
         if(arg)return;
 
set_nature("good");
set_background("spiritual");
set_body_desc(
({ 
  "face",
  "neck",
  "hand","hands",
  "wrist","wrists",
  "finger","fingers", 
  "arm","arms",
  "torso",
  "hairy back",
  "hind leg","hind legs",
  "hind hoof","hind hooves",
  "hind ankle","hind ankles",
  "hoof", "hooves",
  "horns"
}) );
 
set_body_adj( 
({ 
  "",
  "",
  "",
  "",
  "",
  "",
  "",
  "",
  "",
  "",
  "",
  "",
  ""
}) );  
 
 
//racial stat modifiers - REQUIRED
add_racial_skill("strength", 30);
add_racial_skill("dexterity", 50);
add_racial_skill("intelligence", 70);
add_racial_skill("wisdom", 90);
add_racial_skill("constitution", 40);
add_racial_skill("size", 30);
 
 
//skills
add_racial_skill("social status", 40);
add_racial_skill("wealthiness", 25);
add_racial_skill("health regeneration", 50);
add_racial_skill("spell regeneration", 70);
add_racial_skill("endurance regeneration", 40);
add_racial_skill("resist blunt", -5);
add_racial_skill("resist edge", -5);
add_racial_skill("resist pierce", 0);
add_racial_skill("resist fire", 0);
add_racial_skill("resist ice", 0);
add_racial_skill("resist spell", 20);
add_racial_skill("resist acid", 0);
add_racial_skill("resist poison", 0);
add_racial_skill("resist electric", 0);
add_racial_skill("resist stun", 5);
add_racial_skill("infravision", 20);
 
 
//Spells only work for magical and spiritual races
add_race_spell("acid arrow");
 
}

race ideas and complete list

I permanently borrowed list list of races from a few of my favorite muds genocide and bat.

Complete

Just because they're complete doesn't mean they are playable races.

  • Demon
  • Human
  • Troll
  • Satyr
  • Centipede
  • Shade
  • Shadow Elf
  • Orc
  • Skeleton
  • Wolf

Todo races

  • Angel
  • Avian
  • Beholder
  • Centaur
  • Doppelganger
  • Draconian
  • Drow
  • Dwarf
  • Elemental
  • Elf
  • Ettin
  • Giant
  • Gnome
  • Goblin
  • Griffin
  • Half-dragon
  • Half-elf
  • Halfling
  • Hydra
  • Kender
  • Lizardman
  • Medusa
  • Merfolk
  • Minotaur
  • Ogre
  • Orc
  • Primordial
  • Troll
  • Undead
  • Wolfman
  • Wyvern
  • Barsoomian
  • Brownie
  • Catfolk
  • Centaur
  • Cromagnon
  • Cyclops
  • Demon
  • Doppelganger
  • Draconian
  • Drow
  • Duck
  • Duergar
  • Dwarf
  • Elf
  • Ent
  • Gargoyle
  • Giant
  • Gnoll
  • Gnome
  • Hobbit
  • Human
  • Kobold
  • Leech
  • Leprechaun
  • Lich
  • Lizardman
  • Merfolk
  • Minotaur
  • Moomin
  • Ogre
  • Orc
  • Penguin
  • Shadow
  • Skeleton
  • Sprite
  • Thrikhren
  • Tinmen
  • Titan
  • Troll
  • Valar
  • Vampire
  • Wolfman
  • Zombie

race vision

  • 1 horrible vision. brightness sometimes blurs vision. easily loses vision in a stun. can't see in the dark at all.
  • 2 needs extra torches or infravision to see in mild darkness. brightness sometimes blurs vision.
  • 3 can't see in the dark, needs lots of light.
  • 4 can't see in the dark, needs torches equal to negative light.
  • 5 fair vision. can't see in the dark but a little light goes a long way.
  • 6 can see in mild darkness
  • 7 can see in mild darkness, rarely loses vision in a stun
  • 8 can see in very dark areas
  • 9 can see in more than Very dark areas :)
  • 10 full infravision can basically see anywhere

race size

  • 1 small, 1-2 ft tall, very thin
  • 2 small, 1-2 ft tall, muscular
  • 3 medium size (3-4 ft), thin
  • 4 medium size (3-4 ft), muscular
  • 5 average size 5 foot or so, thin
  • 6 average size 5 foot or so, muscular
  • 7 big, 6-7 ft tall, thin
  • 8 big, 6-7 ft tall, muscular
  • 9 giant (8-10 ft tall), very large and in fair shape
  • 10 giant (8-10 ft tall), very large and muscular

Religious following

Races can choose religious followings after their creation, however this has yet to define any bonuses or limitations.

Skill/Spell notes

Skill/Spell types:

  • magic //any magical effect
  • curse //self explanatory - usually a negative
  • nature //anything found in nature
  • wound //a straight damaging skill/spell
  • passive (for passive skills the mapping key "value" is used to determine the value of ths skill, just like damage)
  • evaluation

Type no longer determines how the skill is processed. It really only affects how a skill/spell with an add_effect are dispelled or resisted.

All flags (unless they oppose one another) can be used within a single skill/spell. A post-command is always processed last. (That's why it's a POST command.)

Heals and Damage: Heals and damage skills at level 1% automatically gain 10% of their overall effectiveness. 2% to 100% will raise the remaining 90% of the spells effectiveness. This means that a 100 HP heal will be worth 10 healing at 1% effectiveness, and will be worth about 55 healing at 50% effectiveness. This allows spells to be instantly gratifying while preserving the scale of effectiveness.

Flags:

  • cast_time: seconds it takes to cast the skill or spell
  • damage: damage done by the spell or skill
  • area_effect: options are all, party, enemies
  • health cost: cost to cast in health
  • spell cost: cost to cast in spell points
  • endurance cost: cost to cast in endurance
  • resist: the specific resist type which this spell uses (or an array of types)
  • heal: healing done by spell
  • stun_chance : chance for a direct damage spell to cause a stun 1-100 chance or 1.0-100.0
  • stun_level : see the stun discussion (1 - 10)
  • stun_duration : length of stun (all three stun attributes must be defined for it to work)
  • non-combat: spell can be used out of combat only
  • combat: can only be used in combat
  • modifier:(["advanced healing":25]), // each modifier skill applies its percentage to this skill. in this example advanced healing is worth 25% so if this skill's value is 100 and advanced healing is at 50, you would get 50% of 25% of 100 which 12.5
  • self-only: can use only on self // opposite of other-only (don't use together)
  • other-only: can use only on others // opposite of self-only (don't use together)
  • allow commands" :({"/path/to/command.c"}), having this skill at certain levels gives you access to certain commands // TBD
  • post-command"  :({"/path/to/command.c"}), custom command to be called when skill completes - this calls the function main() in the file provided w/ the arguments int main(object skill, object caster, object *targets, mapping flags) - the flags should be used to create the proper messaging as no messages will be processed by the 'use' or 'cast' command for the post-command. In fact, nothing is done for the post-command within the 'use' or 'cast' command.
  • dispels: type. example "dispels":({ "curse" }) -- this removes your skill % from the skill % of any 'curse' applied on the target. once that % hits 0, the effect is removed
//skills and spells template
//uuga
//all skills effectiveness are inherently modified 100% by their skill level percentage
 
void reset(int arg)
{
	if(arg)return;
 
	/* REQUIRED */
	set_name("magic dart");
	set_type("direct damage");
	/* REQUIRED */
        set_is_spell(1); // 1 or 0 -> 1 requires the user to type 'cast' instead of 'use'
 
	/* Damage Flags */
	set_flags( ([
         "cast_time":5, //5 seconds, (rounds are 1 second on df3)
         "cast_time":random(3)+4, //can also be a random (4-6)
	 "damage" : 30,
         "health cost": 0,
         "spell cost": 15,
         "endurance cost": 0,
	 "resist" : "spell",
	 "heal": 50,
	 "non-combat": 0, //if a spell can only be used out of combat
         "combat": 0, //if a spell can only be used in combat (do not use these two together)
	 "modifier":(["advanced healing":25]),
	 "self-only"      :0, //do not use other-only & self-only together
         "other-only"     :0, //it will result in nothing happening
         "area affect"    : "party", //to set an area affect to your fellow party members
         "area affect"    : "enemies", //to set an area affect against enemies
         "area affect"    : "all", //to set an area affect against all
                                   //only one area affect type per skill/spell
	 "allow commands" :({"/path/to/command.c"}),
         "post-command"   :({"/path/to/command.c"}), //working
	 ]) 
	 );
	/* FLAGS */	
}

Example skill: consider the enemy

//skills and spells template
//uuga
//all skills effectiveness are inherently modified 100% by their skill level percentage
inherit "/bin/skill_inh.c";
 
void reset(int arg)
{
    if(arg)return;
 
    /* REQUIRED */
    set_name("consider the enemy");
    set_type("evaluation");
    /* REQUIRED */
    set_flags( ([
        "cast_time": 6,
        "endurance cost"  : 10,
        "post-command": ({"/bin/skills/consider.c"}),
      ]) );
 
 
}

Message customization:

                Variables:
                %t - Targets name.
                %T - Targets REAL name.
                %p - Targets possessive.
                %o - Targets objective.
                %r - Targets pronoun.
 
                %a - Attackers name.
                %A - Attackers REAL name.
                %u - Attackers possessive.
                %v - Attackers objective.
                %w - Attackers pronoun.
 
                Direct damage example:
                "mess caster": "You kick %t viciously!\n"
                "mess target": "%a kicks you viciously!\n"
                "mess others": "%a kicks %t viciously!\n"
                "mess caster fail": "You try to kick %t but miss!\n"
                "mess target fail": "%a tries to kick you but misses!\n"
                "mess others fail": "%a tries to kick %t but misses!\n"

Duration based skill variables

These are used in addition to the regular skill variables in order to become a duration skill such as a protection spell or a curse.

NOTE: All mods and add's can be provided as a string. This makes the interpreter believe that it is intended to be a percentage. For example "20" means 20% of the value before effects come into play. 20 as an integer means the actual value 20

  • type: curse, poison, (need more types here, because it gives options for dispels and such. cure poison, dispel magic, etc)

--for flags - any 'add' is processed on a tick. any 'mod' lasts for the duration of the effect.

    • "duration" : how long does this last
    • "frequency": how often it ticks
    • "add-hp"  :
    • "add-sp"  :
    • "add-ep"  :
    • "mod-ep"  : modified ep
    • "mod-sp"  : modified sp
    • "mod-hp"  : modified hp
    • "mod-stat-{stat}": mod any stat by a number or percentage - percentage is passed as a string (i.e. "10")
    • "mod-skill-{skill}": mod any skill by a percentage - passed as a whole int (i.e. 200 = 200%);
    • "mod-hpr": hp regen mod, percentage based
    • "mod-spr": percent
    • "mod-epr": percent
    • "condition": (["condition_name": level]) add any supported condition at int level - this will be applied for the duration coded
    • //Messaging
    • affected_frequency_mess
    • other_frequency_mess
    • affected_fade_mess
    • other_fade_mess
  • //DAMAGE ABSORBTION (damage shields)
  • absorb X: X can be any of the following.. A damage type (blunt, edge, etc), A condition (stun, paralysis, etc). Conditions reduce by 1 for each application attempt. Damage types reduce by the amount of damage done until the absorbed number is gone. Example: "absorb blunt": 10, "absorb stun" : 1,
  • reflect X: Same as absorbtion except this does not apply to conditions. Conditions cannot be reflected.
    • ABSORB/REFLECT messaging (these won't go off if the hit that triggers them fades the effect)
    • affected_absorb_mess, affected_reflect_mess
    • other_absorb_mess, other_reflect_mess

Skill type categories

Type is important for dispelling/cleansing purposes.

types:

  • magical: casted by a magician, might be the category for all beneficial things
  • curse: evil curse, usually a statistic modifier
  • poison: poison, ouch
  • wound: a physical owwie, harder to fix

example: With something like a cleric aegis spell which is typicall a statistic buff, this is probably just a magical type effect. A bleeding wound ofcourse is a wound from being injured by a weapon. Poison could be from spells like acid arrow but more so from objects or traps. Something with negative stat modifiers would be a curse.


Skill input/output variables

Defense:

  • special abilities
  • defensive potential
  • dodge chance / chance not to be hit
  • turn/deflect attacks
  • evade attacks
  • sidestep or backpedal to avoid damage
  • using craftmanship to your advantage, getting the most out of good armor
  • negate level difference modifiers
  • lower hit effectiveness (the amount of randomness to an attack)
  • avoid stuns

Offensive:

  • special abilities
  • attack potential
  • chance to hit
  • negate level difference modifiers
  • chance to crit
  • raise hit effectiveness (reduce amount of randomness)
  • racial limbs and what % they fit the normal mold
  • parry chance
  • stun chance
  • ability to cast
  • casting effectiveness

General combat:

  • wimpy
  • reduce ability costs
  • chance to speed up abilities or casting

General Non combat:

  • traveling - less endurance to travel
  • swimming
  • sight distance
  • chance to lose less endurance or sp from abilities

Skill Naming Ideas

  • Expertise
  • Immunity
  • Avoidance
  • Anticipation
  • Reflexes
  • Swiftness
  • Improved x
  • Reaction
  • Mastery
  • Advantage
  • Tactics
  • Maneuvers
  • Opportunity

Offense Tree

  • Combat Tactics
  • Parry
  • Melee Expertise
  • Opportunity Awareness
  • Improved Reaction
  • Two-handed or one-handed improvements

Defensive Tree

  • Defensive Maneuvers
  • Evasive Maneuvers
  • Dodge
  • Turn Blades
  • Anticipate Strikes
  • Combat Reflexes
  • Improved X Immunity

Skill/Spell EXP Costs

The Exp Cost of a skill or spell is modified by the following attributes.

Skill modifiers

  • heal 9
  • heal over time 8
  • direct damage 9
  • damage over time 8
  • passive ?
  • buff 7
  • curse 7
  • evaluation 6

Passive skill mod

  • offense mod 10
  • spell mod 10
  • Skill modifiers 10
  • defense mod 10

Base Skills List

Base skills are all skills that are directly referenced from the player file. Dodge, armor penetration, swordsmanship etc are examples of skills that will be directly called upon from the player's code. While these skills are important they may not be trainable, more so they are simply enhanced by modifier skills.

Most of these skills are passive - because the mudlib only really uses it as a variable modifier or a reference point. Armor penetration for example may have a max value of 10. If you have a modifier skill for armor penetration at max, you will get some armor penetration value because of it. This will be used to modify the amount of armor your attacks might avoid.

Here is a list of the main base skills: .. after a skill means it isn't coded in

PHYSICAL OFFENSE

  • armor penetration - attacks can avoid some of the enemy's armor
  • swordsmanship - the skill necessary to use a sword
  • axe handling - the skill necessary to use an axe
  • stave handling.. - the skill necessary to use a staff
  • bludgeoning - the skill necessary to use a blunt weapon
  • impaling - the skill necessary to use a dagger or piercing weapon
  • polearm fighting - the skill necessary to use a polearm
  • critical hit - increased chance to score a critical hit
  • hit - increased chance to not miss your enemy
  • avoidance (decreased enemy to_hit)
  • stun - chance to stun with melee
  • attack speed
  • hefting: increased wield strength
  • combat focus: ability to swing while casting
  • stun duration and stun potency..
  • counter attack:..
  • offensive experience:.. increases modifier fighting smaller npcs
  • defensive preparation:.. increases personal modifiers fighting larger npcs
  • strategic strike:.. chance for an armor penetrating strike
  • critical hit damage:.. a base stat that can increase the damage done by a crit
  • weapon use:.. maybe allow bonus damage % from a weapon attribute
  • double attack:.. might be a balanced way to allow for more than 1.0 attack rate, the second hit could have a %

RANGED OFFENSE

  • ammo recovery:.. gather back some ammo from your dead
  • ammo usage.. maybe some extra ammo dmg

DEFENSE

  • reflect type.. damage shields that reflect
  • absorb type.. damage shields
  • dodge - dodge attack chance
  • resist curse
  • resist magic
  • resist nature
  • resist wound
  • spell reflection chance:..
  • defensive expertise:.. improves defense against npcs less experienced than you
  • defensive preparation:.. increases personal modifiers fighting larger npcs
  • reduce critical hits..
  • avoid counter attacks..
  • armor modifier skills.. like get more % from less than a full suit of armor

SPELLCASTING

  • spellcasting: defines the potency of all of your spells, very important
  • spellcasting focus: your success at casting the spell
  • concentration: how well you cast while taking hits or witnessing distractions
  • spell critical hit
  • spell critical amount bonus..
  • spell penetration.. - penetrates resistance
  • spell potency:.. allow the caster to get more % out of the spell than they are supposed to
  • ep/sp modified usage during a failed or normal skill..
  • combat focus - allows you to attack while casting
  • spell hit:..
  • spell stun:..
  • spell avoidance:..
  • spell cast speed:..
  • effect duration:.. maybe this can increase durations


STATISTICS MODIFICATION

  • infravision.. in place but needs integration to living
  • perception..
    • see enemy casting..
    • get an idea if the enemy has some inventory..
    • evaluate or consider enemy..
    • disguise..
      • see specifics but not everything..
  • regen modifiers, in and out of combat..
  • level difference buffer, increase for you decrease for enemies..
  • carry strength..
  • money carrying..
  • questing skills..
  • armor/weapon repair..
  • armor degradation modifier..

PET SKILLS:

  • Pets will automatically inherit the same skills a player can, so racial skills will be big here..

Not in but some ideas:

  • armor usage modifiers, how much you get from armor
  • weapon - same as armor
  • limb modifiers
  • lockpicking
  • paramedic
  • armor and weapon degradation rate modifier
  • traveling skills
    • swimming: less ep use in water
    • hiking: less ep use on mountains
    • underwater breathing: can breathe longer underwater
    • endurance: reduced ep cost for travel
    • finding others
    • seeing enemies on map
    • sensing danger
    • stealth
  • languages
    • race languages and a skill for each
  • perception modifiers. how much you see? how far can you see outside?

base skills functions

  • query_skill_percent: this returns the total % of a players skill level, including modifier skills
  • query_skill_value: same as query_skill_percent but instead returns the percentage of 'value'. value can be manually added to the skill as "value":x or if not present value defaults to 1. Example: if value is 5 and query_skill_percent returns 200%, query_skill_value will equal 10 (5*2.0 or 200%)

Guilds

each skill has three attributes, (in order)

  • minimum level to train
  • level when skill can be trained to MAX
  • max skill level
    //Knights Templar Guild
    set_guild_data( ([
        "name":"knights templar",
        "max_level":25,
        "min_level":1, //can join at 1   
        "background":({"fighter"}),
        "nature" : ({"good", "neutral"}),
        "skills":
        ([
          "swordsmanship" : ({1,25,100}),
          "dodge"         : ({10,25,70}),
          "holy vengeance" :({5,20,100}),
          "consider the enemy" : ({1,15,80}),
          "combat perception" : ({1,10,25}),
        ])
      ])
    );

Effects

Weapons and armors can have worn and wielded effects that are only active while using the equipment. Weapons can have a weapon hit effect that can fire while attacking. The argument is the chance for that skill/spell to fire during the attack round. The skill/spell will be limited in effect by the average of the weapon's quality and damage percentages. Similarly, a weapon hit effect can be defined for the user of the weapon.

The code is simple and should be placed in the object's reset function, past if(arg)return;

example weapon:

add_wielded_effect("ogre strength");
add_weapon_hit_effect("fire blast", int chance);
add_weapon_hit_user_effect("dispel magic", int chance);

example armor:

add_worn_effect("ogre strength");

Parties

Partying on DF3 takes a different approach toward traditional mud partying. Parties will consist of formations such as a 3x3 grid. Players in the front most row are able to attack physically and serve as meat shields for players in rows behind them. If a player in the second or third row back is unblocked, they are susceptible to attacks from the onslaught of NPC's.

Row 2 can consist of both healers and or casters, and or ranged attackers. Healers can only heal from one row away, so their best placement is in the middle row. Ranged attackers and casters can cast from the middle or back row. Ranged attackers are those such as archers, magicians, etc.

Caster NPC's you may fight will be able to cast through the formation. These monsters are tricky and need special precautions need to be taken before fighting them.

Most upper level monsters on DF3 will only be able to be taken out with a party, no matter how powerful the player is attempting to kill it.

Party NPC ABilities

This section describes what kinds of abilities some NPCS can have to make them unique and challenging to a party.

  • casters
  • cleave
  • wide
  • no casting
  • resistant to (name your damage type)
  • summons adds
  • odd damage types
  • hunt you
  • roamers
  • no run!
  • shielded: takes a number of hits before vulnerability kicks in
  • summons until all enemies are dead if not in combat (have to kill in one pass)
  • flurries or something nasty when low hp
  • prevents damage from large players
  • debuffers to make you take more dmg

To achieve resistance to damage types simply set add_resistance( (["blunt":90.0]) ); to make the npc mostly blunt resistant.

Stats

DFIII relies heavily on stat points. A race starts with certain stat modifiers which are applied upon every level of advancement (player levels). The player is given some extra stat points to spend, however the bulk of their stats are predetermined by racial/nature/religious choices.


Players have seven primary statistics:

Str - EP, carry capacity, weapon wielding, skills

Dex - EP, Defense and to hit

Con - EP, HP, skills

Int - SP, Spells, to hit

Wis - SP, Spells, healing

Cha - cha is stupid :)

weapons

All types in the below chart are valid types. The skill listed with the type is the base skill for that class of weapons.

types

Type->Subtype:

  • sword - swordsmanship
    • edge, sword, shortsword, longsword, sabre, bastardsword, claymore, broadsword, cutlass, drusus, falchion, khopesh, rapier, scimitar, twohandedsword, knife, maingauche, katana
  • bludgeon - bludgeoning (this is the default weapon type)
    • blunt, chain, maul, mace, flail, hammer, warhammer, bludgeon, morningstar, sap, scourge, whip
  • axe - axe handling
    • axe, handaxe, greataxe, broadaxe, doubleaxe, battleaxe
  • piercers - impaling
    • point, dagger, lance, dirk, harpoon, javelin, stiletto, gaff, hook
  • polearm - polearm fighting
    • polearm, voulge, scythe, trident, pole, spear, halberd, glaive, pike, bardiche, becdecorbin, billguisarme, fauchard, fauchardfork, glaiveguisarme, guisarmevoulge, hookfauchard, lucernhammer, militaryfork, fork, partisan, ranseur, spetum, sickle
  • hand - punching
    • hand, cestus, brassknuckles
  • foot - kicking
    • foot
  • staff - stave handling
    • staff, quarterstaff
  • bow - archery
    • bow, recurve bow, composite bow, long bow, short bow
  • crossbow - crossbow handling
    • crossbow, heavy crossbow, light crossbow, horse crossbow
  • gun - firearms
    • gun, hand gun, handgun, rifle, long gun, revolver, pistol, shotgun

weapon damage

weapon damage is an enabler - a percentage number that enables the wielder to unlock a percentage of their attack potential for that type of weapon.

for example, if a player has a 100% weapon skill for swords, that would unlock a certain portion of their potential.. for this example we will say it would unlock 50%, so even with the worst sword you would be at 50% of your potential. is you wield a weapon that has a 25% skill value, that would also unlock 25% of whatever the base attack potential from the weapon would be.

weapon example

inherit "/obj/weapon.c";
 
void reset(int arg)
{
    ::reset(arg);
    if(arg) return;
 
    set_name ("poker");
    set_alias("hot poker");
    set_short("red hot poker");
    set_long ("This spear like poker is HOT!\n");
 
    //The following 4 function calls are required to set up the weapon properly
    set_type("spear"); //type determines initial damage types
    set_weapon_damage(50.0); //how effective is this weapon..100%?
    set_quality(30.0); //use the quality chart to determine quality setting
    set_material("iron");
 
    //This function is optional for different damage types
    add_damage_type( ([ "fire":100.0 ]) ); //could also just do "fire" without the mapping
 
    //Effects
    add_wielded_effect("ogre strength");
    add_weapon_hit_effect("fire blast", 10);
}

Ranged Weapons

Ranged weapons require three objects:

 1.  The weapon itself.
 2.  An ammo container (e.g. quiver for arrows).
 3.  Ammo (e.g. an arrow).

ranged weapon example:

//Composite bow weapon
inherit "/obj/weapon.c";
 
void
reset(int arg) {
     ::reset(arg);
     if(arg) return;
     set_name("bow");
     set_aliases(({"composite bow", "composite"}));
     set_short("Composite Bow");
     set_long("A composite bow.\n");
     set_quality(10.0);
     set_material("wood");
     set_type("bow");
     set_weapon_damage(50.0);
}

ammo container example:

inherit "/obj/ammo_container.c";
 
void
reset(int arg) {
     ::reset(arg);
     if(arg) return;
     set_name("quiver");
     set_short("A Quiver of Arrows");
     set_long("A quiver of arrows.\n");
     set_quality(10.0);
     set_material("wood");
     set_type("ammo");
     set_projectile_name("arrow");
     set_max_items(30);
}

ammo example:

inherit "/obj/ammo.c";
 
void
reset(int arg) {
    ::reset(arg);
    if(arg) return;
    set_name("arrow");
    set_short("An Arrow");
    set_long("This is a plain old arrow.\n");
    set_material("wood");
    set_projectile_name("arrow");
    set_quality(10.0);
    set_weapon_damage(10.0);
}

The ammunition can be give effects as follows:

add_user_effect("sharp shooting");
add_target_effect("thunderclap");

The weapon type determines the ammo type as follows:

  • bows - arrows
  • crossbows - bolts
  • gun - bullet

armor

Armor works close to the same as weaponry..

Players/npcs have a defense potential number based on their stats. They can unlock this potential with the following:

  • how many body slots they have filled with armors
  • armor percentages
  • types of armors
  • materials of armors
  • craftsmanship

Example armor:

Armor creation on DF3 is purely percentage based. You must set the following in order for the armor to be used. Armor class is basically at the designers discretion - it can' be any percentage value. In this example the armor is 20% protective. Quality is reflective of how difficult the item is to obtain and should be well thought out -- 100% is the max quality which is shown in the table below as a gift from the gods.

inherit "/obj/armor.c";
 
void reset(int arg)
{
    ::reset(arg);
    if(arg) return;
    set_name  ("chainmail");
    set_short ("A set of chainmail");    
    set_long  ("A set of chainmail.\n");
    set_armor_class("blunt", 20.0);
    set_armor_class("edge", 20.0);
    set_armor_class("point", 15.0);
    set_quality(10.0); 
    set_material("iron");
    set_type  ("armor"); //torso type armor
}

NPCS

npc example

#pragma strict_types
#include <generic_macros.h>
 
inherit "/obj/monster.c";
 
 
void reset(status arg)
{
    ::reset(arg);
    if(arg) return;
    set_name    ("demon"); 
    set_alias   ("ugly demon");
    random_short("a disgusting, and hideous demon");
    set_long    ("A disgusting, and hideous demon.\n");
    set_race("demon");
    set_level (1);
    set_gender(random(2) ? "male" : "female");
 
    //really optional stuff
    add_resistance( (["blunt":10.0]) );
}

exp

Exp amount is currently determined by the same formula used to determine level costs. This is a factor of how powerful the npc is at that level overall. Stat modifiers, level, limbs, and special npc abilities are taken into account.

armor damage mitigation

damage mitigation from armor is similar to weapon damage. the player has a base defense statistic based mostly on Dexterity.

6 attributes determine the amount of the total defense to be unlocked:

  • how many body slots they have filled - max of 10 (20%)
  • sum of all armor classes (20%)
  • sum of materials of armors (30%)
  • sum of craftsmanship of armors (30%)
  • bonus defense skills (10%)
  • defense skills (50%)

clearly you can achieve greater than 100% of your defense modifier

Example: lets say your defense potential was 150 due to your obscene dexterity stat and bonus dex from armors and the above held true. This assumes that you have awesome armor (100% of all including materials and craftsmanship). You would be able to mitigate up to an entire 150 damage hit. The range of mitigation has not been determined yet but it will most likely not be completely random. the lack of randomness will most likely be mitigated through combat skills.

this scenario is critical to be able to tank large monsters such as a level 50 demon with 125 attack potential per hand.

basic rules

  • no more than 85% of incoming damage can be mitigated
  • defense decays slightly in long combat
  • quality and material is only applied if the armor has some armor class for that type

example armor class scenario

In the example below I am wearing 7 pretty decent armors. Something I would imagine to be very difficult to get with a strong party.

As you can see It has unlocked my attack potential almost halfway for the damage types it has armor class in. For the other types, they have been lightly unlocked due to the fact that I have some armor worn.

each of these armors has the following statistics

  • set_armor_class("blunt", 60.0);
  • set_armor_class("edge", 60.0);
  • set_armor_class("point", 80.0);
  • set_armor_class("fire", 50.0);
  • set_quality(70.0);
4632> stat uuga
looking for uuga
 Uuga
 
   wiz level:  10000       Attack Potential
       level:  50          ----------------------------------
       coins:  48373       Limb      Weapon%   Attack Potential
       spell:  0           right %h       0%   2
         max:  295          left %h       0%   2
          hp:  295         ----------------------------------
          ep:  0           Defense Potential ----------------
       carry:  0           Max Defense: 88
   max_carry:  10          Blunt:     32
       align:  0           Edge:      32
       pkill:  0           Pierce:    12
                           Fire:      31
 str: 44 +0   dex: 44 +0   Ice:       12
 con: 44 +0   cha: 44 +0   Spell:     12
 int: 44 +0   wis: 44 +0   Acid:      12
                           Poison:    12
                           Electric:  12
                           ----------------------------------
 
                           armor: gloves, helmet, carapace, cloak,
                           amulet, boots, ring, 
 
 
                           interactive:  yes
 
12396> l at uuga
Uuga (male).
==> elder
Uuga is a member of the human race.
        Uuga is carrying:
Hands: A pair of hydra-scale gloves
Head: A hydra-scale helmet
Torso: A hydra-scale carapace
Back: A splintered hydra-scale cloak
Neck: A hydra-scale amulet
Feet: A pair of hydra-scale boots
Finger1: A hydra-tooth ring

craftsmanship

craftsmanship applies to armors and weapons. this is a new concept!

the level of craftsmanship helps to automatically determine a weapon or armors attributes. craftmanship levels are as follows:

  • 1 common object
  • 2 rough craft
  • 3 hand made item
  • 4 well balanced item
  • 5 honed, sharpened, etc
  • 6 skillfully made
  • 7 made for war
  • 8 made by (significant crafter here)
  • 9 used by a legendary warrior
  • 10 a gift from the gods

Conditions

Conditions on df3 are any kind of physical condition that affects a player. Like being dizzy (stunned), being asleep, blinded, deaf, breathing underwater, etc. These conditions are tied into the mudlib as such to make the game feel realistic.

all conditions accept a level (1-10) which defines how serious the condition is. Some conditions may only be on/off but still accept a level. Duration is always required.

Some important functions on the player:

set_condition(string condition, int duration, int level);

remove_condition(string condition);

int query_condition(string cond);

int query_condition_duration(string cond);

example condition: sleeping

string *start_sleeping(int level)
{
	return ({"You lie down get comfortable, and quickly doze off.",
	         "%t lies down and begins to snore."});
}
 
 
string *clear_sleeping(int level)
{
	return ({"You wake up from your power nap.",
	         "%t opens %p eyes and wakes up from a power nap."});
}
 
 
 
string *condition_sleeping_commands(int level)
{
	return ({"You are in a deep sleep..",
	         0});
}
string *condition_sleeping_hearing(int level)
{
 
}
string *condition_sleeping_talking(int level)
{
//talking doesn't matter here because all commands are limited
}
string *condition_sleeping_movement(int level)
{
//same as talking
}
string *condition_sleeping_combat(int level)
{
 
}
 
//using this will block skill usage
string *condition_stun_skills(int level)
{
 
}
 
//using this will block spell casting
string *condition_stun_spells(int level)
{
 
}

This is automatically applied through effects also. see effects section.

Here are a list of DF conditions. .. means it is not coded yet.

  • stunned
  • underwater..
  • flying..
  • sick..
  • cursed..
  • poisoned..
  • blind..
  • deaf..
  • mute..
  • asleep..

stun condition mechanics

Stun:

Dizzyness

  • 1 trouble seeing
  • 2 speech impedement

Uuga shakes his head trying to wear off the dizzyness.

Blurred Vision

  • 3 can't see well
  • 4 reduced defense
  • 5 reduced offense

Uuga blinks, trying to see his opponent.

Disorientation

  • 6 can't move
  • 7 greatly reduced defense
  • 8 greatly reduced offense

Uuga stumbles trying to regain balance.

Uuga regains mobility.

Loss of Function

  • 9 can't do shit
  • 10 defense is halved
  • 10 offense is null

Uuga goes unconscious.

Uuga wakes up and shakes off the stun.

Loss of Consciousness - must be revived

  • 10 defense halved
  • 10 can't do shit
  • 10 near death scenario

autosaving

Gear saves on you if you quit or the game reboots. nuff said.

currency

Design 1:

based on the gold coin having the base value of 1.0.


Layers of currency: coin (1) -> piece of eight (8) -> doubloon (60) -> nugget (200) -> chunk (500) Layers of weight: 0.03 -> 0.05 -> 0.08 -> 1.0 -> 3.0 all multiplied by materials modifiers Layers of material: copper (0.001g) silver (0.01g) -> gold (1g) -> mithril (100g) -> uvum (500g)

Nuggets and chunks of metal have no value until they are melted down and sold.

Gems more valuable than uvum are TBD

Questing Stuff

Communication Standard

Communication and questing goes hand in hand. Often in mud quests, the syntax involved with communicating to NPC's can be frustrating. This communication standard introduces a new way to talk to NPC's and also offers a way to easily code mini quests.

Greetings and responses are different. Greetings are a way to get the NPC to talk about whatever they're interested in. Greetings can be provoked by most standard soul communication or even saying hello. You can wave at the npc, smile, greet, hail, etc. This will all provoke a greeting if one is to be offered.

Responses are triggered by 'ask'ing the npc about a topic. For example if the npc's greeting talks about goblins, you might 'ask <whoever> about goblins' to provoke another response.

Responses can require stimulus such as a path to an item or a custom closure. If a path to an item is provided, the player must have that item on them to generate the right response.. if the item is not on them they will get a negative response about the item not being there.

Finally the quest can have solution steps which can do 3 important things: destroy required items, create new items, add money or exp to player.

These steps included all make for a complete mini quest.


Standard variables can be used in communication standards including emotes!

                %t - Targets name.
                %T - Targets REAL name.
                %p - Targets possessive.
                %o - Targets objective.
                %r - Targets pronoun.
 
                %a - Attackers name.
                %A - Attackers REAL name.
                %u - Attackers possessive.
                %v - Attackers objective.
                %w - Attackers pronoun.

Details about the response mapping

  • quest: this is the name of the quest. It is not required unless you want to place a timer on it
  • level: this provides a suggested level to do the quest as well as auto-calculated cash and exp rewards
  • reward-timer":({1,2,3,4}), this example shows 1 day, 2 hours, 3 minutes, 4 seconds until you can re-do the quest. Items will not be destroyed nor rewarded
  • timer-response: "You just did the quest! Please wait..." -- a canned response to tell the person they aren't ready yet. This is processed BEFORE any item requirements so you can check easily. If the response isn't provided, a generic response is given.
  • trigger: "complete" -- what is asked in the communication standard to trigger this quest point: this can also be an array of triggers.
  • response: "Great work %t! You've gathered all of the neccessary pieces! Here is your reward." -- this response is only provided if the player meets quest requirements, and has the required items etc. this can also be an array of responses
  • flags: (["blah":"You didnt do blah!", "quest 2":"You didnt do quest2!"]) -- flags required in order to be at this point.
  • emote:"smile %t",-- an emote response, can be included along with the response or in place of it
  • required:(["/some/axehandle.c":"%t, did you not find the axe handle yet?",
            "/some/axeblade.c" :"The blade is the most important part %t! Come back when you've found it."
           ]), -- items required in order to complete
  • destroyed:({"/some/axehandle.c", "/some/axeblade.c"}), -- items that will be destroyed when completing. These should be in required also!
  • rewarded:({"/some/completeaxe.c"}), -- items you get after completing
  • cash":1,//1 = yes, reward is determined by quest level so it must be provided
  • exp":1, //1 = yes, reward is determined by quest level so it must be provided


varargs int add_greeting(string resp, int emote);
varargs int add_response(mapping details);
 
==example quest==
 
    add_greeting("welcome %t", 1);
    add_greeting("hello %t! Are you interested in doing me a favor?");
 
    add_response(([
                 "trigger" :"favor",
                 "response":"I'm trying to build a new axe but I still need a good sturdy axe handle "
                            "and a sharp blade. If you can help me find these missing pieces "
                            "I will reward you with the finished axe, 50 gold and 100 experience." ]));
    add_response(([
                 "trigger" :"complete",
                 "quest"   :"Gathering for the guards",
                 "level"   :10,//suggested level and determination of reward amounts
                 "reward-timer":({1,2,3,4}), //1 day, 2 hours, 3 minutes, 4 seconds 
                 "response":"Great work %t! You've gathered all of the neccessary pieces! Here is your reward.",
                 "required":(["/some/axehandle.c":"%t, did you not find the axe handle yet?",
                              "/some/axeblade.c" :"The blade is the most important part %t! Come back when you've found it."
                            ]), 
                 "destroyed":({"/some/axehandle.c", "/some/axeblade.c"}),
                 "rewarded" :({"/some/completeaxe.c"}),
                 "cash":1,
                 "exp":1 ]));


Image:quest_sample.jpg

chain quest example

This example shows how to chain 3 quests together, including a room action quest

 add_response(([
        "trigger" :({"cloak", "cloaks", "cleric", "clerics", "demonic cloak", "demonic cloaks"}),
        "quest"   :"Step 1 - my quest", // you must have a quest name for a chain quest
        "level"   :5,
        "reward-timer":({0,0,25,0}), //0 day, 0 hours, 25 minutes, 0 seconds
        //there must be a timer, this is how long the flag lasts after doing this
        "response":({"You asked about the cloaks. Cool! Now go south and find Bob. Ask him about a 'fake reward'."}),
        "timer-response":"I already told you..go find Bob to the south and ask him about your 'fake reward'!" ]));
 
 
add_response(([
        "trigger" :({"reward", "fake reward"}),
        "quest"   :"Step 2 - my quest", // you must have a quest name for a chain quest
        "level"   :5,
        "flags": (["Step 1 - my quest":"Go away! You can only talk to me with an appointment!"]),
        "reward-timer":({0,0,25,0}), //0 day, 0 hours, 25 minutes, 0 seconds
        //there must be a timer, this is how long the flag lasts after doing this
        "response":({"Cool! Now if you 'turn crank' in this room, you get the final reward."}),
        "timer-response":"How many rewards do you want, greedy bastard!" ]));
 
 
add_room_action("turn",
   ([
     //Surprise, you found a knife!
     "args": ({"crank"}),
     "arg_message": "Turn what, the crank?",
     "message":"You turn the crank.",
     "room_message":"%t turns the crank.",
     "delay": 300, // 5 mins until someone else can turn this
     "delay_message":"The crank has been turned recently.",
 
     //quest stuff
     "quest": "Step 3 - the end",
     "flags": (["Step 2 - my quest":"You aren't trained to turn this."]),
     "reward-timer":({0,0,25,0}),
     "response":({"You turn the crank and magically earn some experience!"}),
     "timer-response":"You can't do that again for a while.",
     "rewarded" :({"/domains/areas/uuga_towers/gear/dwarf_axe.c"}),
 
   ]));

Quest Functionality

One side of questing is communication, which we've accomplished through the greetings and responses system. The other side of questing is searching, and figuring out some wizard's syntax and thought process. We would like to make our attempt to eliminate the confusion and wondering in quests.

There are a few ways to 'do' things in a quest

  • communicate with npcs (described above in the communication standard)
  • do tasks for npcs
  • examine rooms
  • search things
  • do custom actions

Unfortunately 'do custom actions' leads to most of the confusion and giving up on quests. Every developer chooses their own method of custom actions in a quest. For example what if you need to cut the head off of a corpse. Cut head off corpse, remove head, cut head from corpse.. oh yeah, behead corpse! This confusion is also a fun part of doing quests on muds, so it can't be eliminated entirely. However, it should be accommodated with clear suggestions from search commands. I.e. 'search corpse': Dotted lines are drawn along the neck. The corpse could be beheaded if you had the right knife.

Quest example

Search items on DF3: In effort to eliminate most confusing custom code and create a standard.

add_search_item(string syntax, mixed action);
add_room_action(string syntax, mixed action);
 
Normal usage:
add_search_item("corpse", "Dotted lines are drawn along the neck. The corpse could be beheaded if you had the right knife.");
 
Custom usage (points to blah function):
add_room_action("turn", "@@turn");
 
Advanced usage: (details mapping explained below this section)
add_search_item("corpse",
   ([
     //a standard message from searching, some damage done
     "message":"You search the corpse and it spits up blood and gore at you!"
     "room_message":"%t searches the corpse and it spits up blood and gore at you!"
     "hit_player":([3:"blunt"]),
     "hit_room":([3:"blunt"]),
     "delay": 300, // 5 mins
     "delay_message":"The corpse is a mess, covered in blood and gore.",
   ]));
add_search_item("corpse",
   ([
     //Surprise, a rat!
     "message":"You search the corpse...a rat crawls out from the mouth!"
     "room_message":"%t searches the corpse and a rat crawls out from the mouth!"
     "clone_to_room":AREA_PATH "npcs/rat.c",
     "delay": 300, // 5 mins
     "delay_message":"The corpse is a oozing a bit where the rat crawled out from.",
   ]));
add_search_item("corpse",
   ([
     //Surprise, you found a knife!
     "message":"You search the corpse and find a pocket knife!"
     "room_message":"%t searches the corpse and finds something."
     "clone_to_player":AREA_PATH "npcs/knife.c",
     "delay": 300, // 5 mins
     "delay_message":"The corpse has been looted recently.",
   ]));
room actions work exactly the same way, except that you can provide args and an arg message
if args are not provided one simple has to type 
 
add_room_action("turn",
   ([
     //Surprise, you found a knife!
     "args": ({"wheel", "rusty wheel"})
     "arg_message": "Tuen what..the wheel?"
     "message":"You search the corpse and find a pocket knife!",
     "room_message":"%t searches the corpse and finds something.",
     "clone_to_player":AREA_PATH "all/spider2.c",
     "delay": 300, // 5 mins
     "delay_message":"The corpse has been looted recently.",
   ]));

Shared Keys - these are shared between room actions and npc communication for questing

  • quest: this is the name of the quest. It is not required unless you want to place a timer on it
  • level: this provides a suggested level to do the quest as well as auto-calculated cash and exp rewards
  • reward-timer":({1,2,3,4}), this example shows 1 day, 2 hours, 3 minutes, 4 seconds until you can re-do the quest. Items will not be destroyed nor rewarded
  • timer-response: "You just did the quest! Please wait..." -- a canned response to tell the person they aren't ready yet. This is processed BEFORE any item requirements so you can check easily. If the response isn't provided, a generic response is given.
  • flags: (["blah":"You didnt do blah!", "quest 2":"You didnt do quest2!"]) -- flags required in order to be at this point.
  • required:(["/some/axehandle.c":"%t, did you not find the axe handle yet?",
           "/some/axeblade.c" :"The blade is the most important part %t! Come back when you've found it."
          ]), -- items required in order to complete
  • destroyed:({"/some/axehandle.c", "/some/axeblade.c"}), -- items that will be destroyed when completing. These should be in required also!
  • rewarded:({"/some/completeaxe.c"}), -- items you get after completing
  • cash":1,//1 = yes, reward is determined by quest level so it must be provided
  • exp":1, //1 = yes, reward is determined by quest level so it must be provided

add_search_item and add_room_action mapping keys:

  • message: the message the searcher sees
  • room_message: message others in the room see
  • hit_player: the damage and damage type done to the player
  • hit_room: the damage and damage type done to others in the room
  • delay: the number of seconds until this is searchable again
  • delay_message: the message you get if you're searching and there is a delay
  • delay_usages: 5 // if this is supplied, the action can be done 5 times - every 'delay' time after it will regenerate one usage
  • clone_to_room: Something you clone to the room while searching. -- accepts string or array
  • clone_to_player: Something cloned and attempted to be moved into your inventory while searching (can fall to ground if too heavy) -- accepts string or array
  • create_exit: (["east":"path../.c"]) // self explanatory
  • open_door: "east" opens a door in the room
  • move_player: ({"in the hole", "path to hole.c"})

room actions

add_room_action(function or details mapping, strings typed)

Same as above but allows another key in the details:

  • args: ({"door", "big door", "super door"})
  • arg_message: "Open what?"

unique and saved gear discussion

This is a rant about unique and saved gear. DF3 is using a saved gear scenario where all gear saves on you as you log out. This is appealing but also unappealing to traditional mudders whom enjoy farming gear at the beginning of a reboot. This makes it fun to log in after a reboot and do a boot run, grab some unique gear and use it all boot with an enjoyed bonus.

This concept of unique gear is important to recognize. How can unique gear be identified in a gear saving game such as this?

Ideas:

  • unique items that are a little easier to get but only one can exist in the game at a time. destroys upon reboot or logout etc.
  • charged items that only last so long -- could be destroy on drop too so you can only use one at a time.
  • reward items short lifespan
  • really powerful things that you can't allow to exist over one reboot. a really nice sword from a group quest or something, but short duration.

Incentive system

Need a way to make it an incentive to report bugs/typos/etc so it gets done.

Rewards can be:

  • short duration items
  • task points of some kind to be traded in for bonuses to your player
  • exp
  • cashola

i would just assume give them the points for something and let it be redeemed how/whenever they want

HALF DONE list

  • weapon damage - done
  • skills system - in place
  • armor formulas - in place 1.0 !
  • autosaving - done, time to test
  • aliases - done. fixed alias command to show builtin separately
  • let odiff go negative - done - set to -10 max
  • 'set/unset' command for typical environmentals for players - eset done
  • stun mechanic - done! still a little room 4 improvement
  • get drop take wield wear remove standardization - done but needs debugging
  • mini quest workflow - done could use review
  • communication standard (for quests) - done but needs to be integrated with factions when they are done
  • saving gear - done - seems to be working fine. works during quit and shutdown but fails during a destruct which is the intention
  • weight cleanup - weight cleaned up. in pounds as a float. armors and weapons get a base weight if not set by hand. yay
  • party (movement/attacks/exp) - movement and attacks in place
  • death sequence - did a basic hell room so far. you leave = you lose exp
  • combat stun rate - done
  • limbs and weapons need to accept multiple damage types and those should be chosen randomly by their % value
  • races closer to finalization so i can do more races
  • racial immunities and resists to damage types
  • give races a wealth status which determines how much cash they can have
  • give races a social status which determines what kind of coins their cash is in
  • currency
  • race casting - its done

TO-DO list

  • need a standard for short descs on items. for example do we include (a) in the beginning or always forego it? how about special characters for special purposes?
  • better aset/aunset ansi variable stuff
  • guilds - 2 started
  • race homes
  • auto update player objects based on change
  • reputation, factions
  • achievements - tattoos!
  • aggro generation
  • road guards
  • resistance to X (stun, blind, etc)
  • paths to areas
  • stun chance increase while walking into combat
  • Party NPC Abilities and Skill Input/Output variables need to be elaborated
  • better short party info for quick heals
  • ability to target party with skills. front row, middle, back, 1.1, etc.
  • exp gain/track
  • race discovery and mini questing to allow you to join that race. other races are 'natives'. all should be quests!
  • show limbs and exprate on creation page
  • race infravision and exp modified by such - vision 1-10
  • allow weapons to be + to a race
  • pub code
  • shop code
  • pet code
  • add support for area specific races - something like ~/races/
  • organize the skill commands and separate for security purposes - Sort of complete. Skills have been separated and a base/ folder created. This base also proves useful in the skills section of this doc.
  • wimpy related skills
  • demo needs another weapon or a shield for dual wielding. also weapon options
  • offer command, offers commands to others and they can offer # to use it. like offer gorgar alias dr dragon would allow me to use this alias command instantly
  • add an identify system whereby hidden powers of items can be ascertained by an identify spell or skill or scroll..a lore level would determine what level identify is needed
  • weapon proficiency from actually using the weapon - permanent, slow skill gain
  • setup weapons armors and items to inherit usable and passive 'effects' which come from skill files -- done
  • travel skills - ep tied into exploring -- mostly complete - travel module
  • record gear creators - party or player who killed the npc
  • polymorph effects
  • condition module needs cleanup and calls from attack need to be added. Max condition needs to be modified based on material.
  • containers
  • trinket armor slots
  • review display_inventory make sure the targeting functions also exist
  • define the source of defense better where applicable such as absorb, immune, etc. a shield effect might absorb. a worn shield may deflect, etc etc.
  • finish absorption and reflection: add to _use and effect module, finish calls in attack_x modules create absorb/reflect effects.
  • spellcasting focus base skill needs further development. it works but it should probably take into account the spell power of the player
  • command to show effects
  • more exp from demo
  • remove old commands!
  • get/take from is kinda messy, review - cant drop cash
  • find a good place to add ammo effects in attack
  • party npc abilities, plus extra exp for these
  • begin tracking various statistics about the boot. critical hits, misses, hits etc and allow the player to view these anytime as well as logout time
Personal tools