Show Posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.


Messages - detah

Pages: 1 [2] 3 4 ... 15
16
Dead Souls Support / Re: Overland mapping?
« on: April 26, 2011, 09:00:03 AM »
I always think of Zelda (NES, 1986) when I think of overworld maps. The 'top' world map allows travel between major points of interest, but those major points of interest, like dungeons or shops, are entered into in one 'square' of the overworld, but that dungeon/shop is a larger area on its own. In muds this is nothing more than non-euclidean space, eg. start in Room #1, w to Room #2 (which is the entrance to some dungeon), e to Room #3 (goes to first room of the dungeon).

17
Dead Souls Support / Re: Spaceship Avatars
« on: February 16, 2011, 08:54:17 AM »
create your own ship.c std. Inherit as much or as little of item.c as you wish. There's certainly no point in reinventing the wheel for every ship you make.

18
Dead Souls Support / Re: DS combat
« on: February 10, 2011, 09:13:14 AM »
The prompt is calling the function GetHealthPoints, which is referencing the variable HealthPoints. I did NOT remove HealthPoints nor any of its associated functions from the lib. Those are from the stock ds hp-system. If you want your prompt, sc, stat, etc command to reference the new combat HP system, then you will need to reference the GetHP() fun. This is a trivial mod.

Removing HealthPoints and all of its associated functions is not trivial.

PS. my apologies to stanach. I did not understand what your issue was. I think this is what you were trying to say also.

19
Drivers / Re: Fluffos db package diffs to add postgres support
« on: January 07, 2011, 09:46:07 PM »
This always happens when you try to return poop. We have all learned a valuable lesson.

20
Dead Souls Support / Re: DS combat
« on: December 29, 2010, 04:16:00 PM »
copy/pasted from my earlier post #24 in this thread:

All newly created characters after this point will automatically generate their HP and MaxHP appropriately. However, existing characters will have 0/0 HP/MaxHP. To correct this do
Code: [Select]
eval return this_player()->ComputeMaxHP();
or
Code: [Select]
eval return find_player("playername")->ComputeMaxHP();

You can also use
Code: [Select]
eval return this_player()->AdjustHP(100);
to increase the HP of any player at any time.

The AdjustHP function is the 'healing' function. For new characters, their HP and MaxHP will be correct when the characters are created. The default setting has HP and MaxHP equal to durability * 8 + 50. I just confirmed this on a new character.

21
Dead Souls Support / Re: "Casting" Fighter Abilities
« on: October 21, 2010, 09:19:18 AM »
It sounds like what you want to do is use skills or commands. To do this, just create a new skill or command and give that class/guild access to it. If you want to have a unifying action word, like 'cast', but for fighters, you can do that too. Create a new verb 'kungfoo'. Then set a restriction in the verb so just that class/guild can use it.

22
Dead Souls Support / Re: DS combat
« on: October 14, 2010, 11:50:27 PM »
Updated Instructions to load my combat system into an out-of-the-box ds v3.0.

1) rename and move your stock combat.c to c:/ds/bin/combat.old

2) save the following as combat.c in /lib/
Code: [Select]
/*****************************************************************************
 * Barebones combat for Dead Souls lib                                       *
 * Author: Detah, with huge thanks to Silenus for design outline             *
 *   Thanks also to Cratylus and Raudhrskal for misc. advice                 *
 * Modified: Detah@Arcania 05-01-08                                          *
 * Modified: Detah@Arcania 09-30-08                                          *
 * Modified: Detah@Arcania 12-07-08                                          *
 * Modified: Detah@Arcania 01-29-09                                          *
 * to update after a change:                                                 *
 *   update /lib/combat.c                                                    *
 *   update -r /lib/creator.c                                                *
 *   update /domains/town/room/valley.c (testing room)                       *
 *   userload aura and any other tps                                         *
 *****************************************************************************/
#include <daemons.h>
inherit LIB_RACE;
inherit LIB_CLASSES;
inherit LIB_COMBATMSG;

static int rd;
int Dead, Wimpy;
private object *Enemies;        /* All enemies who you have ever attacked, not killed and are not calmed */
private object *LocalEnemies;   /* Those enemies in Enemies which are currently in attacker's env */
private object *CalmEnemies;    /* Storage area for Enemies during Calm, Quell, or any other StopCombat event */
private object CurrentEnemy;    /* This is the specific enemy which is targetted each round in melee */
int CombatRound(mixed target);
int ComputeToHit(object attacker, object target);
int ComputeDamage(object attacker, object target);
void DamageMessage(int dam, object target);
void ApplyDamage(int dam, object target);
int GetWimpy();
void Wimpy();
/*****************************************************************************
 * Create function                                                           *
 * Inputs: none                                                              *
 * Output: none                                                              *
 * initializes basic combat variables and starts the heartbeat function in   *
 * the current object                                                        *
 *****************************************************************************/
static void create() {
    race::create();
    rd=1;
    Dead=0; /*is this necessary, since its also in body.c create() */
Wimpy=20;
    Enemies=({});
    LocalEnemies=({});
    CalmEnemies=({});
    CurrentEnemy=0;
    set_heart_beat(1);
}

/*****************************************************************************
 * GetEnemy function                                                         *
 * Inputs: none                                                              *
 * Output: Enemies=all enemies in array                                      *
 * Returns an array of current targets/enemies                               *
 *****************************************************************************/
object array GetEnemies() {
    return Enemies;
}

object array GetLocalEnemies() {
return LocalEnemies;
}

object GetCurrentEnemy() {
return CurrentEnemy;
}

object array GetCalmEnemies() {
return CalmEnemies;
}

/*****************************************************************************
 * AddEnemy function                                                         *
 * Inputs: target=the current target                                         *
 * Output: none                                                              *
 * target info sent from attack verb, adds enemies who are not already in    *
 * the Enemies array                                                         *
 *****************************************************************************/
void AddEnemy(object target) {
    if(member_array(target, Enemies)==-1) {
      Enemies += ({target});
    }
}

void AddLocalEnemy(object target) {
if(member_array(target, LocalEnemies)==-1) {
      LocalEnemies += ({target});
    }
}

void AddCurrentEnemy(object target) {
if(CurrentEnemy == 0) {
      CurrentEnemy = target;
    }
}

void AddCalmEnemies(object target) {
if(member_array(target, CalmEnemies)==-1) {
    }
}

/*****************************************************************************
 * RemoveEnemy function                                                      *
 * Inputs: target=the current target                                         *
 * Output: none                                                              *
 * target info sent from attack verb, remove enemies who have died, exited   *
 * room, etc                                                                 *
 *****************************************************************************/
void RemoveEnemy(object target) {
    if(member_array(target, Enemies)!=-1) {
      Enemies -= ({target});
    }
}

void RemoveLocalEnemy(object target) {
    if(member_array(target, LocalEnemies)!=-1) {
      LocalEnemies -= ({target});
    }
}

void RemoveCurrentEnemy() {
    CurrentEnemy = 0;
}

void RemoveCalmEnemies(object target) {
    if(member_array(target, CalmEnemies)!=-1) {
      CalmEnemies -= ({target});
    }
}

/*****************************************************************************
 * SetAttack function                                                        *
 * Inputs: target=the current enemy                                          *
 * Output: none                                                              *
 * checks if attacked monster is already in Enemies array. if it is not then *
 * it gets added to Enemies for both combatants                              *
 *****************************************************************************/
void SetAttack(mixed target) {
    if(objectp(target)) target=({target}); /*converts trivial case object into an array for processing in general case arrayp below*/
    foreach(object ind in target) {        /*reads in all objs in array target and adds them to both combatants if not already present*/
      this_object()->AddEnemy(ind);
      ind->AddEnemy(this_object());
    }
}

/*****************************************************************************
 * Heartbeat function                                                        *
 * Inputs: none                                                              *
 * Output: none                                                              *
 * checks if there are enemies in the Enemies array, checks hit probability  *
 * function to hit, if a hit, applies damage with the eventReceiveDamage fun *
 *****************************************************************************/
void heart_beat() {
object attacker;
attacker=this_object();
Enemies -= ({0});
race::heart_beat();

    if(!clonep(this_object()) && !interactive(this_object())) return; /*prevents clones of combat.c from doing stuff*/
    if(member_array(CurrentEnemy, all_inventory(environment(attacker) ) )==-1 ) { rd=1; } /*resets rd counter if you leave the room*/
    /*Dead Clean Up*/
    if(sizeof(Enemies)) {                 /* There are enemies in Enemies */
      foreach(object ob in Enemies) {     /* If anything in Enemies is dead, remove it from Enemies, LocalEnemies and CurrentEnemy */
        if(ob->GetDead()) {
          RemoveCurrentEnemy();
          if(sizeof(LocalEnemies)) RemoveLocalEnemy(ob);
          RemoveEnemy(ob);
          if(sizeof(CalmEnemies)) RemoveCalmEnemies(ob);
        }
      }
    }
    LocalEnemies=Enemies & all_inventory(environment()); /*defines LocalEnemies*/
    if( sizeof(LocalEnemies)==0 ) CurrentEnemy=0;          /*if LocalEnemies is empty, then zero out CurrentEnemy*/
    if( sizeof(LocalEnemies) ) {
    if( member_array(CurrentEnemy, LocalEnemies) == -1 ) CurrentEnemy = LocalEnemies[0]; /*if CurrentEnemy is not an element of LocalEnemies, then change CurrentEnemy to the first enemy in LocalEnemies*/
      if(userp(this_object())) {                         /* Only the player generates the Round counter*/
        attacker->eventPrint("%^WHITE%^[%^RESET%^ RD: "+rd+"  HP: "+this_object()->GetHP()+"/"+this_object()->GetMaxHP()+" %^WHITE%^]%^RESET%^");
        if(this_object()->GetHP() < GetWimpy()) {  /* BEGIN wimpy */
          Wimpy();
        } /* END wimpy */
      }
      CombatRound(CurrentEnemy);
      rd++;
    }
}
 
/*****************************************************************************
 * CombatRound function                                                      *
 *   replaces eventExecuteAttack in DS stock                                 *
 * Inputs: target (should be an array)                                       *
 * Output: int 0/1 (success/failure)                                         *
 *****************************************************************************/
int CombatRound(object target) {
string damtype;
int dam;
object attacker;
attacker=this_object();
damtype=this_object()->GetWeaponType(); /*for use later when I make a complex tohit fun*/
Enemies -= ({0});

    if(ComputeToHit(attacker, CurrentEnemy)==0) {         /*missed*/
      attacker->eventPrint("You miss.");
      CurrentEnemy->eventPrint(GetName() + " misses you.");
      tell_room( environment(attacker), attacker->GetName() + " misses " + CurrentEnemy->GetName()+".", ({attacker, CurrentEnemy}) );
    } else {                                              /*hit*/
      dam=ComputeDamage(attacker, CurrentEnemy);
      ApplyDamage(dam, CurrentEnemy);
      DamageMessage(dam, CurrentEnemy);
    }
    return 1;
}

/*****************************************************************************
 * ComputerToHit = calculates probability and whether you hit this round     *
 * Inputs: attacker=current attacker                                         *
 *         target=current target                                             *
 * Output: 0=hit, 1=miss                                                     *
 * checks if an attack hits or misses                                        *
 *****************************************************************************/
int ComputeToHit(object attacker, object target) {
int h;
    h=50+attacker->GetStat("coordination")["points"];  /*overly simplified hitprob for now*/
    if(h<0) h=0;
    if(h>100) h=100;
    if(h>(1+random(100))) {
      return 1; /*hit*/
    }
    else {
      return 0; /*miss*/
    }
}

/*****************************************************************************
 * ComputeDamage function                                                    *
 * Inputs: attacker=the current attacker,                                    *
 *         target=current target of attack                                   *
 * Output: dam=damage of attack                                              *
 *****************************************************************************/
int ComputeDamage(object attacker, object target) {
    return to_int(1 + attacker->GetStat("strength")["points"]/10 );
}

/*****************************************************************************
 * ApplyDamage function                                                      *
 * Inputs: dam=damage done                                                   *
 *         target=current target of attack                                   *
 * Output: none                                                               *
 *****************************************************************************/
void ApplyDamage(int dam, object target) {
    target->AdjustHP(-dam, this_object());
}

/*****************************************************************************
 * DamageMessage function                                                    *
 * Inputs: dam=damage of attack                                              *
 *         target=current target of attack                                   *
 * Output: none                                                              *
 *****************************************************************************/
void DamageMessage(int dam, object target) {
string verb, verb2;
    if(target->GetDead() || this_object()->GetDead()) return;
    if(dam>29) { verb="bludgeon"; }
    else if(dam>19) { verb="smash"; verb2="smashes"; }
    else if(dam>9) { verb="crush"; verb2="crushes"; }
    else if(dam>4) { verb="whack"; verb2="whacks"; }
    else if(dam>2) { verb="poke"; verb2="pokes"; }
    else if(dam=2) { verb="graze"; verb2="grazes"; }
    else if(dam=1) { verb="tickle"; verb2="tickles"; }
    this_object()->eventPrint(sprintf( "You %s %s.", verb, target->GetName() ) );
    target->eventPrint(sprintf("%s %s you.", GetName(), verb2 ) );
    tell_room(environment(),sprintf("%s %s %s.", GetName(), verb2, target->GetName() ), ({ this_object(), target }));
}

int GetDead(){
    return Dead;
}

int SetDead(int i){
    if(i==1) Dead=1;
    else Dead = 0;
    return 1;
}

/* BEGIN Wimpy section */
int GetWimpy() {
    return Wimpy;
}

void SetWimpy(int x) {
    if(x < 0) Wimpy=0;
    if(x > this_object()->GetMaxHP()) write("You will always flee combat.");
    Wimpy=x;
}   


void Wimpy() {
string array exits;
int x;
    exits=environment(this_player())->GetExits();
    x=random(sizeof(exits));                                /*selects random exit among room's exits*/
    this_player()->eventPrint("You flee "+exits[x]+".\n");
    this_player()->eventForce(exits[x]);
}
/* END Wimpy section */

/*To maintain compatibility with living.c eventFollow()*/
static int Destruct() {
    /*if( GetParty() ) PARTY_D->eventLeaveParty(this_object());*/
    return 1;
}

int GetBaseStatLevel(string stat){
    return race::GetBaseStatLevel(stat);
}

varargs int eventDie(mixed agent){
    object ob, env = environment();
    int x;
    if(this_object()->GetGodMode()) return 0;

    if(Dead) return 1;
    Dead = 1;

    x = race::eventDie(agent);
    if( x != 1 ){
        return x;
    }
    foreach(ob in GetEnemies()){
        if( ob ){
            ob->eventEnemyDied(this_object());
        }
    }
    Enemies = ({});
    flush_messages();
    return 1;
}


3) Save the following as hp.c and save into /cmds/players/hp.c
Code: [Select]
/****************************************************
 * HP command, shows HP and MaxHP                   *
 * Author: Detah@Arcania 02-04-09                   *
 * This file should reside in /cmds/players/        *
 ****************************************************/
#include <lib.h>
inherit LIB_DAEMON;

mixed cmd() {
    this_player()->eventPrint("%^YELLOW%^[%^RESET%^ HP: "+this_player()->GetHP()+"/"+this_player()->GetMaxHP()+" %^YELLOW%^]%^RESET%^");
    return 1;
}


update /cmds/players/hp.c
update /daemon/command.c

4) make the following changes
Code: [Select]
/verbs/players/attack.c
L102-3 in do_attack_lvs fun, change to
        if(member_array(this_player(),subobj->GetEnemies()) != -1 ) { 
/*        &&  member_array(subobj,this_player()->GetNonTargets()) == -1){*/

/lib/player.c
L98 comment out living::eventKillEnemy(ob); in eventKillEnemy()
L105 changed to set_heart_beat(1); in eventReconnect()
L249 comment out SetSpecialTarget( ({}) ); in eventRevive()
L264 add this_object()->AdjustHP(this_object()->GetMaxHP(), this_object()); at the base level (ie. not in an if) in eventRevive, so players HP are reset after death, before final function bracket
L315 changed to set_heart_beat(1); in Setup()

/lib/npc.c
L64 changed to set_heart_beat(1); in create()
L78 changed to set_heart_beat(1); in CheckEncounter()
L85-90 comment out if( sizeof(enemies = GetEnemyNames()) ){ section in CheckEncounter()
L134 change GetInCombat to GetCurrentEnemy in heart_beat()
L138 change GetInCombat to GetCurrentEnemy in heart_beat()
L157 change GetInCombat to GetCurrentEnemy in heart_beat()
L185 comment out the if(GetParty()) line in Destruct()
L287 comment out living::eventEnemyDied(ob); line in eventEnemyDied()

/lib/race.c
L337 change GetInCombat to GetCurrentEnemy in GetHeartRate()
L359 changed to set_heart_beat(1); in heart_beat()

/lib/living.c
L240 change GetInCombat to GetCurrentEnemy in direct_steal_wrd_from_liv()
L253 change GetInCombat to GetCurrentEnemy in indirect_steal_obj_from_liv()
L628 change GetInCombat to GetCurrentEnemy in eventSteal()

/lib/genetics.c
L117 add this_object()->ComputeMaxHP(); in SetStat() last line
         if(stat=="durability") this_object()->AdjustHP(this_object()->GetMaxHP()); in SetStat()

/lib/sentient.c
L447 change GetInCombat to GetCurrentEnemy in heart_beat()

/lib/body.c
L39 add private int HP, MaxHP, Dead, AC; to variable declare section
L59 add the follow to the prototype section after the variable declare section
    int GetHP();
    int GetMaxHP();
    void ComputeMaxHP();
    varargs int AdjustHP(int x, object source);
    void NaturalHealing();
    int GetAC();
    void ComputeAC();
L85 add to create()
    HP=0;
    Dead=0;
    AC=0;
L90 add to beginning of functions section:
GetHP() {
    return HP;
}
GetMaxHP() {
    return MaxHP;
}
ComputeMaxHP() {
    MaxHP=50+GetStatLevel("durability")*8;
}
/*****************************************************
 * AdjustHP fun                                      *
 * Inputs: HP adjustment, object that did the damage *
 * Output: none                                      *
 * Applies the hp adj to the living's current HP and *
 * checks whether HP are negative to set Death seq   *
 *****************************************************/
AdjustHP(int x, object source) {
    HP+=x;
    if( HP < 0 ) {
      if(!this_object()->GetDead()){
        call_out("eventDie", 0, source);
      }
    }
    return 1;
}
/***************************************************************
 * NaturalHealing fun                                          *
 * Inputs: none                                                *
 * Output: none                                                *
 * Increases HP by 1 every 20 seconds if HP are less than      *
 * than MaxHP. This requires the LastHeal variable declared at *
 * top, initialized in create() and reset in eventReconnect    *
 ***************************************************************/
NaturalHealing() {
    if( time() - LastHeal > 20 && HP < MaxHP ) {
  AdjustHP(1, this_object());
  LastHeal=time();
  this_object()->eventPrint("[ HP: "+HP+"/"+MaxHP+" ]"); /* either a simple tick prompt or just for testing */
    }
}

GetAC() {
    return AC;
}

ComputeAC() {
AC=0;
    foreach(object ob in all_inventory(this_object())) {
      if(ob->GetWorn()) {
        AC+=ob->GetACValue();
      }
    }
}

comment out L386-388 if(!stringp(hobbled section in heart_beat()
L390 add following to heart_beat() at end of fun before final bracket
if(Dead==0) {
NaturalHealing();
}
L490 change GetInCombat to GetCurrentEnemy in eventCheckHealing()
L528 change GetInCombat to GetCurrentEnemy in eventCheckHealing()
L1010 add ComputeAC(); in eventWear() before final return 1
/*BEGIN ArmorClass section*/
/lib/std/armor.c (/lib/std/base_armor.c in post ds2.11 libs)
L40 add private int ACValue; to beginning of variable declare section
L54 add to beginning of functions section
void SetACValue(int x) {
    ACValue=x;
}
int GetACValue() {
    if(!ACValue) ACValue=0;
    return ACValue;
}
/*END ArmorClass section*/
/lib/leader.c
L155 comment out whole fun eventPreAttack()

/lib/firearm.c
L287 change GetInCombat to GetCurrentEnemy in eventFire()

/lib/fishing.c
L50 change GetInCombat to GetCurrentEnemy in heart_beat()
L108 change GetInCombat to GetCurrentEnemy in CanCast()

/lib/magic.c
L16 change GetInCombat to GetCurrentEnemy in prototype section
L139 change GetInCombat to GetCurrentEnemy in eventPrepareCast()

/lib/lvs/position.c
L238-9 in eventLand() comment out
    if(stringp(hobbled(this_object()))) Position = POSITION_STANDING;
    else Position = POSITION_LYING;
L244-247 comment out if(!stringp(hobbled(this_object()))){ section in eventStand()

/cmds/creators/quell.c
L17 change GetInCombat to GetCurrentEnemy in cmd()

/domains/campus/npc/turret.c
L42 change GetInCombat to GetCurrentEnemy in eventShootDude()

/verbs/items/wear.c
L43 add this_object()->ComputeAC();  at end of do_wear_obj()


5) update /lib/body.c
update /lib/race.c
update /lib/combat.c
update /lib/player.c
update /lib/npc.c
update /lib/leader.c
update -r /lib/creator.c
reboot mud

23
Dead Souls Support / Re: Class Specific Lines
« on: October 12, 2010, 01:07:37 PM »
This is trivially simple.  When someone becomes a member of a class, add
Code: [Select]
this_player->AddChannel("supercoolclasschannel");
somewhere in the class-gaining code. Then that player will be able to use that channel.

24
General / Re: Help on choosing a mudlib
« on: June 04, 2010, 08:55:33 AM »
1) wrt blindness. Are you expecting only blind players to play this mud? Are the PCs going to be blind too? That will determine how much effort you need to put into the SetShort and SetLong descriptions of your objects. And regardless if the player is blind or not, there are many things that are relevant for the PC character besides color. For instance, it is vitally important that you describe rooms and objects with dimensions, proximity, size, and texture. These will all be things that will go in the SetShort and SetLong descriptions. Besides, I see nothing wrong with you describing "A crimson-red lion" despite you not knowing what crimson red is. So long as your mud has some Fantasy theme, I think this would add value. When a blind player reads that, it is still distinct from the "A lion" appearing in the room and also provides variety in NPCs. While for the sighted player (if you have any), this adds considerable fantasy flavor to the game.  A common lightbrown/blond lion may be a challenge in combat, but a crimson red lion seems more entertaining, whether you know the difference between blond and red or not.

2) This idea that mudcoding (here I mean lib-coding) involves 'lots' of description-writing is nonsense. Lib-coding has almost zero description writing. I have been coding Arcania for over 4 years now and I have not written one object description yet. Now, for area building, that is a totally different thing. Writing descriptions may be 50% of the time you spend on creating an area. But I would argue that writing the descriptions is the most important part of writing an area, as the SetLongs are the means, by which, you tell your story to the PCs. It is really the only thing that the player sees/knows about your area.

-Detah@Arcania

25
Dead Souls Support / Re: newb question. simple check in attack.c?
« on: May 15, 2010, 10:58:01 PM »
Cratylus' point about 'shoot' was just an example. The point is that there are numerous ways to initiate combat in DS. Some of them are plain old attack/kill, casting a spell, using a combat skill, and shooting a ranged weapon. To get the result you want, you will need to tackle each method independently or insert a PrePreCombat function to catch this.

26
General / Re: heart_beat v. call_out
« on: April 22, 2010, 02:44:51 PM »
I think the answer is, it depends.

a) The obvious. If the object does not require any periodic checks of any kind, like an ordinary torch, then do not use callouts or heartbeats.
b) If the object calls a function/event rarely, eg. the first completion of a quest, then use call_outs.
c) If the object needs to make frequent and/or periodic checks on something, like a guild object checking on a guild status, then use heartbeats.
d) If there are contingent breaks in the check, like when a monster in your Enemies list leaves the room, then use heartbeats. ie. for combat, use heartbeats.

But for most instances when you do need to choose, use heartbeats. Most modern processors can handle thousands of heartbeats with no problems.

1.5 cents,
-Detah

27
Dead Souls Support / Re: room updates, but loads with error
« on: February 10, 2010, 11:16:58 PM »
Before you posted, R, I accidentally discovered that that is indeed the source of the problems. The real problem (for me) in describe.c begins at L76
Code: [Select]
        if(functionp(tmp = env->GetSmell("default")))
            tmp = (*tmp)("default");
        smell = tmp;

This is problematic for me because my GetSmell function takes a mapping as its argument. It looks like stock ds takes a mixed type, but it initialized to be a string here. I commented out the 9 lines in describe.c and now it all works without error.

I now have my first genuine completely original Arcania room online. KAZAA!

Thank you both.

Kal- I implemented your suggestion. That was surely an underlying problem, but I was still generated numerous errors on the describe even after implementing your suggestion. Thank you for catching that.

28
Dead Souls Support / room updates, but loads with error
« on: February 10, 2010, 12:56:17 AM »
I added several functions to /lib/std/room.c. Then I wrote a brand new room using some of those functions.
/lib/std/room.c updated with no errors. /domains/default/room/arcania1.c updated with no errors also.
Then I did
goto /domains/default/room/arcania1.c
and I got the following error:

Code: [Select]
--- Arcania
2010.02.09-20.37,27
*Bad type argument to +. Had string and mapping
Object: /secure/save/creators/d/detah (/lib/events/describe.c) at line 106

'<fake>' at /secure/save/creators/d/detah (/<driver>) at line 0
'cmdAll' at /secure/save/creators/d/detah (/lib/command.c) at line 210
'do_look' at /verbs/items/look at line 96
'eventDescribeEnvironment' at /secure/save/creators/d/detah (/lib/creator.c) at
line 116
'eventDescribeEnvironment' at /secure/save/creators/d/detah
(/lib/events/describe.c) at line 106
Trace written to /log/runtime

I never touched any of the player.c or creator.c code. But there seems to be an issue with /lib/events/describe.c at L106. Is that what this error message is telling me? If so here it is and I have no idea what it means.

Code: [Select]
    if( smell ) this_object()->eventPrint("%^GREEN%^" + smell, MSG_ROOMDESC);

I didn't touch that file either. It is all stock.
Any help would be appreciated.

29
Dead Souls Support / Re: DS combat
« on: January 25, 2010, 08:09:35 AM »
There may be two sources of confusion here.

First, when I provided an instruction like

L123 change GetInCombat to GetCurrentEnemy

to edit the stock ds code, I meant that you should go to Line 123 and change the function name "GetInCombat" to "GetCurrentEnemy". This is because the stock ds function is still trying to use the old GetInCombat function, which is no longer there, because we removed it in step #1 (remove old combat.c). The "L123" that I refer to does not come from any program. It is just my shorthand notation for "line 123".

Second, the instructions provided, to convert a stock ds to my new combat, are for converting a version of ds, approximately ds2.5 to ds2.9. Those should all work by following my detailed instructions. However, since I posted this new combat code, Crat has made numerous changes to the ds lib.

A couple of nights ago, I installed my new combat code onto a brand new ds3.0. The instructions are a bit longer than the posted ones. I shall try to post the full instructions for conversion to ds3.0 sometime in the next 2 weeks.

-Detah

30
Intermud / Re: Localhost or VPS. Can I still connect?
« on: January 13, 2010, 08:57:27 PM »
Hi and welcome to LP land.

Of course it is perfectly fine to login to your own mud on your own home computer. Connecting to the host from the host gives you 2 options to connect. You may connect as localhost or your may connect via the standard telnet port. How you do this is dependent upon your particular mudclient.

Do not worry about the imc2 channels at first. The ones that should be active by default are the i3 channels (ds, dchat, ds_test, and intercre). Type a test message on one of those and if you do not get a reply from another mud, then you know you have a problem.

There is no 'approval' for connecting to i3 or imc2. It will automatically attempt to connect you. Sometimes the imc2 server is very slow or sluggish to approve new or rejoining muds. Dont worry about that at first. Once you get i3 channels active, then you can direct your attention to imc2. Try to get the i3 channels working first. They are completely independent of one another.

The @yourmudname part of the echo is suppressed, since you are obviously chatting from your own mud. When others chat on that intermud channel, you will see it in the form of Detah@Arcania. Hope to see you on ds chat soon.

Be specific about the problems you are encountering, what you did to generate the problem, any error messages that you see. Even better copy/paste the session to a post here and one of us can evaluate your problem. Also, you should state if you are on *nix or Windows version of ds. It is my observation that the imc2 channels are pickier with the windows version. I cannot confirm that for sure. Just my observation.

Good luck.
Detah@Arcania

Pages: 1 [2] 3 4 ... 15