DISCLAIMER: I didn't write these credit for them goes to Dio (Dave Oldcorn)
Who is the coder for NewDawn (suppose should register it as a CircleMUD
at some point :) after all year and half without is getting silly -
apologises I'm naturally lazy and do to much :) -Tim (Aldric))
Well you can't set two spec procs on a mob as far as I'm aware
you can HOWEVER do this :)
/*
* Special procedure combos below here.
* A combo is a very simple process that just calls one and then
* the other if the first did not respond. It is therefore important
* that pulsed responses do return the correct value even though it
* usually doesn't matter.
* This technique is NOT recommended for Extend Specials. An Extend
* Combo routine will be written when I think we need it.
*/
SPECIAL(fighter_cityguard)
{
int v;
if (!(v = cityguard(ch, me, cmd, argument)))
v = fighter(ch, me, cmd, argument);
return(v);
}
I don't know if the person who was asking for help on a cleric who would
sell his services to player chars still needs it but here it is :)
/*
* The pay priest offers his services to characters just as a
* shopkeeper, although they are in the form of spells. Unlike
* shopkeepers, there's nothing to stop people killing him (although
* he is likely to be a bit on the hard side....) He MUST have
* mob memory on, to stop the 'feature' of people jumping him, legging
* it, and then asking for heal.
*/
SPECIAL(pay_priest)
{
struct spell_cost_list {
int spellnum;
int cost;
} spell_cost[] = { /* These HAVE to be quite expensive esp. healing. */
{ SPELL_INVISIBLE, 1000 },
{ SPELL_ARMOR, 1000 },
{ SPELL_CURE_CRITIC, 2000 },
{ SPELL_BERSERKER, 2500 },
{ SPELL_STONESKIN, 6500 },
{ SPELL_HEAL, 10000 },
{ SPELL_AGE, 10000 },
{ SPELL_REMOVE_CURSE, 10000 },
{ SPELL_REMOVE_POISON, 10000 },
{ SPELL_METALSKIN, 12500 },
{ SPELL_REJUVENATE, 15000 },
{ SPELL_SANCTUARY, 50000 },
{ -1, -1 }
};
int i, sp;
struct char_data *priest;
priest = (struct char_data *) me;
if (cmd && (GET_POS(priest) == POS_STANDING)) {
skip_spaces(&argument);
if (CMD_IS("list")) {
send_to_char("Available Services:\r\n", ch);
for(i=0;spell_cost[i].spellnum >= 0;i++) {
sprintf(buf, "%30s %6d\r\n",
spells[spell_cost[i].spellnum], spell_cost[i].cost);
send_to_char(buf, ch);
}
return(TRUE);
} else if (CMD_IS("buy")) {
if ((sp = search_block(argument, spells, 0)) >= 0) {
for(i=0;spell_cost[i].spellnum >= 0;i++) {
if (spell_cost[i].spellnum == sp) {
if (GET_GOLD(ch) >= spell_cost[i].cost) {
cast_spell(priest, ch, 0, sp);
GET_GOLD(ch) -= spell_cost[i].cost;
act("$n says, 'Have a nice day.'", TRUE, priest, 0, ch, TO_VICT);
} else {
act("$n says, 'You don't have the money.'",
TRUE, priest, 0, ch, TO_ROOM);
}
return(TRUE);
}
}
}
act("$n says, 'I don't sell that spell.'",
TRUE, priest, 0, ch, TO_ROOM);
return(TRUE);
}
}
/* Otherwise, acts as a normal cleric */
return(cleric(ch, me, cmd, argument));
}
Our cleric spec proc looks like this :)
SPECIAL(cleric)
{
struct char_data *vict;
int level, damaged;
if (cmd)
return FALSE;
level = GET_LEVEL(ch);
/* Non-combat: cast some affects */
if (GET_POS(ch) == POS_STANDING) {
/* First check: heal self if injured - clerics always do this immediately */
if ((GET_HIT(ch) < GET_MAX_HIT(ch)) && (level > 15) && (GET_MANA(ch)
> 10))
{
cast_spell(ch, ch, 0, SPELL_HEAL);
GET_MANA(ch) -= 10; /* Doesn't cost as much if not in combat */
return(TRUE);
}
/* So higher level clerics have more affects on them: lev 50 cast
* about once in 1 minute, lev 1 about once every 4 minutes, and
* also is more likely to fail level check in switch*/
if ( number(0, 22-(level / 3)) )
return FALSE;
switch(number(0,8)) {
case 0:
if (!affected_by_spell(ch, SPELL_ARMOR) &&
!affected_by_spell(ch, SPELL_STONESKIN) &&
!affected_by_spell(ch, SPELL_METALSKIN) ) {
if (level < 20)
cast_spell(ch, ch, 0, SPELL_ARMOR);
else if (level < 25)
cast_spell(ch, ch, 0, SPELL_STONESKIN);
else
cast_spell(ch, ch, 0, SPELL_METALSKIN);
}
break;
break;
case 1:
if ((level > 5) && !affected_by_spell(ch, SPELL_BLESS) )
cast_spell(ch, ch, 0, SPELL_BLESS);
break;
case 2:
if (level > 6)
cast_spell(ch, ch, 0, SPELL_STRENGTH);
break;
case 3:
if (level > 12) {
if (IS_GOOD(ch) && !IS_AFFECTED(ch, AFF_PROTECT_EVIL) )
cast_spell(ch, ch, 0, SPELL_PROTECTION_FROM_EVIL);
else if (IS_EVIL(ch) && !IS_AFFECTED(ch, AFF_PROTECT_GOOD) )
cast_spell(ch, ch, 0, SPELL_PROTECTION_FROM_GOOD);
}
break;
case 4:
if ((level > 15) && !IS_AFFECTED(ch, AFF_SANCTUARY) )
cast_spell(ch, ch, 0, SPELL_SANCTUARY);
break;
case 5:
if ((level > 17) && !affected_by_spell(ch, SPELL_REFLECTION) )
cast_spell(ch, ch, 0, SPELL_REFLECTION);
break;
case 6:
if ((level > 20) && !affected_by_spell(ch, SPELL_GUIDE) )
cast_spell(ch, ch, 0, SPELL_GUIDE);
break;
case 7:
if ((level > 26) && !affected_by_spell(ch, SPELL_HASTE) )
cast_spell(ch, ch, 0, SPELL_HASTE);
break;
}
return(TRUE);
}
/* Combat: blast opponent time */
if (GET_POS(ch) != POS_FIGHTING)
return(FALSE);
/* choose someone in the room who is fighting me */
for (vict = world[ch->in_room].people; vict; vict = vict->next_in_room)
if (FIGHTING(vict) == ch && !number(0, 4))
break;
/* if I didn't pick any of those, then just slam the guy I'm fighting */
if (vict == NULL)
vict = FIGHTING(ch);
/* Over level 40 will hit them EVERY round! */
if ( (level < 40) && number(0, 4-(level/10)) )
return TRUE;
/* Specific try-occasionally variety spells
* These should be in reverse level order of trying */
/* Is call lightning an option? */
if (OUTSIDE(ch) && (get_weather_sky(ch) >= SKY_RAINING) && (level > 8)) {
/* If victim has metalskin on, definitely, else perhaps */
if (affected_by_spell(vict, SPELL_METALSKIN) || number(0,6))
/* This WILL hurt if metalskin... */
cast_spell(ch, vict, NULL, SPELL_CALL_LIGHTNING);
}
if ((level > 30) && !number(0, 3)) {
cast_spell(ch, vict, NULL, SPELL_DOOM);
return(TRUE);
}
if ((level > 12) && !number(0, 3)) {
if (IS_EVIL(ch)) {
if (IS_GOOD(vict)) {
cast_spell(ch, vict, NULL, SPELL_DISPEL_GOOD);
return TRUE;
}
} else if (IS_GOOD(ch) && IS_EVIL(vict)) {
cast_spell(ch, vict, NULL, SPELL_DISPEL_EVIL);
return TRUE;
}
}
if ((level > 14) && !number(0, 4)) {
cast_spell(ch, vict, NULL, SPELL_BLINDNESS);
return(TRUE);
}
/* OK default action: if badly damaged, heal, else harm. This MUST
* be mana-limited, or else the cleric could be unbeatable! To make simple,
* and since NPC's have less mana than PC's, each cast costs a
* fixed, small amount (a level 10 NPC has 70 mana, an L50 has 230).
* The spells above are not mana-limited but should be rare enough that
* it doesn't matter.
*/
if (GET_MANA(ch) > 20) {
damaged = GET_MAX_HIT(ch) - GET_HIT(ch);
if (level < 10) {
if (damaged > 20) {
cast_spell(ch, ch, NULL, SPELL_CURE_LIGHT);
GET_MANA(ch) -= 5;
return(TRUE);
}
} else if (level <= 15) {
if (damaged > 35) {
cast_spell(ch, ch, NULL, SPELL_CURE_CRITIC);
GET_MANA(ch) -= 8;
return(TRUE);
}
} else {
if (damaged > 60) {
cast_spell(ch, ch, NULL, SPELL_HEAL);
GET_MANA(ch) -= 20; /* Needs to be quite high to cope with mana rega
in */
return(TRUE);
}
}
/* If get here, not healed, so harm if we can. */
if (level > 19) {
cast_spell(ch, vict, NULL, SPELL_HARM);
GET_MANA(ch) -= 10;
return(TRUE);
}
}
return TRUE;
}
Tim can be reached via computer technology at:
e-mail: lostsoul@city.ac.uk (df109@city.ac.uk),
lostsoul@soi.city.ac.uk (df109@soi.city.ac.uk),
lostsoul@mono.org or lostsoul@spodbox.linux.org.uk (MIME)
"Blood, sweat and tears, really don't matter.
Just the things that you do, in this garden"
On Thu, 11 Jul 1996, Eduardo Gutierrez de Oliveira wrote:
> On Wed, 10 Jul 1996, Brian Williams - Nashak wrote:
>
> > well, ignore my last post.. it works fine.. I just learned you can't
> > assign a mob 2 spec procs.. :P also.. the proc seems to not be doing any
> > damage to my mortal.. and it doesn't attack me if I am in the gate..
> > thought it said it would, and it'd say the messages?
> >
>
> Wrong, it specifically says that it will not attack the room where the
> guard is unless you specify so (by changing the -1 witht he room vnum)
>
> It says the message in both the victim and the people in the same room
> where the archer is...
>
> I do have some other question... Is it true? can't you assign to
> spec_procs to the same mob? even if they are not colliding?
>
> Greets
>
> Myth
>
> PS: I have the MudChat system for MERC in my drive, if anyone is willing
> to port it to circle (or to mobprogs) please let me know...:)
> ---------------------------------------------------------------------------
> Eduardo Gutierrez de Oliveira eduo@sparc.ciateq.conacyt.mx
> Administrador de Internet Internet Administrator
> Proveedor de Servicio Internet Internet Service Provider
> CIATEQ, A.C.
> Centro de Investigacion y Asistencia Tecnica del Estado de Queretaro, A.C.
> http://sparc.ciateq.conacyt.mx/
> ---------------------------------------------------------------------------
>
This archive was generated by hypermail 2b30 : 12/07/00 PST