/*************************************************************************** * Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, * * Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. * * * * Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael * * Chastain, Michael Quan, and Mitchell Tse. * * * * In order to use any part of this Merc Diku Mud, you must comply with * * both the original Diku license in 'license.doc' as well the Merc * * license in 'license.txt'. In particular, you may not remove either of * * these copyright notices. * * * * Dystopia Mud improvements copyright (C) 2000, 2001 by Brian Graversen * * * * Much time and thought has gone into this software and you are * * benefitting. We hope that you share your changes too. What goes * * around, comes around. * ***************************************************************************/ #include <sys/types.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include "merc.h" /* * The following special functions are available for mobiles. */ DECLARE_SPEC_FUN( spec_priest ); DECLARE_SPEC_FUN( spec_ninja ); /*************************************************** * This is a prototype of a special program, feel * * free to copy and edit this to suit your needs * *************************************************** bool spec_prototype(CHAR_DATA *ch, char *argument) { if (!str_cmp(argument, "update")) { if (ch->fighting) return FALSE; // This part should contain movement, spell-casting, etc, // this part is called once every 4 seconds, and is not // related to combat... } else if (!str_cmp(argument, "midround")) { if (!ch->fighting) return FALSE; // This part is the combat oriented part of the code, // and is called once every combat round. It should // contain special moves/powers the mob uses in combat. } return FALSE; } ****************************************************/ bool spec_ninja(CHAR_DATA *ch, char *argument) { if (!str_cmp(argument, "update")) { if (ch->fighting) return FALSE; /* if not hidden, hide */ if (ch->position == POS_STANDING && !IS_AFFECTED(ch, AFF_HIDE)) do_hide(ch, ""); else return FALSE; } else if (!str_cmp(argument, "midround")) { CHAR_DATA *victim; if ((victim = ch->fighting) == NULL) return FALSE; if (number_range(1,3) == 2) one_hit(ch, victim, gsn_backstab, 0); } return FALSE; } bool spec_priest(CHAR_DATA *ch, char *argument) { if (!str_cmp(argument, "update")) { CHAR_DATA *vch; CHAR_DATA *gch; bool found = FALSE; int sn; for (vch = ch->in_room->people; vch && !found; vch = vch->next_in_room) { if (vch == ch) continue; if (number_range(1,2) == 1) continue; found = TRUE; gch = vch; } if (!found) return FALSE; switch(number_range(1,3)) { case 1: sn = skill_lookup("heal"); break; case 2: sn = skill_lookup("bless"); break; case 3: sn = skill_lookup("darkblessing"); break; } if (sn < 1) return FALSE; act("$n mumbles a few arcane words.", ch, NULL, NULL, TO_ROOM); (*skill_table[sn].spell_fun) (sn, ch->level, ch, gch); return TRUE; } else if (!str_cmp(argument, "midround")) { /* the priest does not fight */ return FALSE; } return FALSE; } /* * Special Functions Table. OLC */ const struct spec_type spec_table [ ] = { /* * Special function commands. */ { "spec_priest", spec_priest }, { "spec_ninja", spec_ninja }, /* * End of list. */ { "", 0 } }; /***************************************************************************** Name: spec_lookup Purpose: Given a name, return the appropriate spec fun. Called by: do_mset(act_wiz.c) load_specials,reset_area(db.c) ****************************************************************************/ SPEC_FUN *spec_lookup( const char *name ) /* OLC */ { int cmd; for ( cmd = 0; *spec_table[cmd].spec_name; cmd++ ) /* OLC 1.1b */ if ( !str_cmp( name, spec_table[cmd].spec_name ) ) return spec_table[cmd].spec_fun; return 0; } /***************************************************************************** Name: spec_string Purpose: Given a function, return the appropriate name. Called by: <???> ****************************************************************************/ char *spec_string( SPEC_FUN *fun ) /* OLC */ { int cmd; for ( cmd = 0; *spec_table[cmd].spec_fun; cmd++ ) /* OLC 1.1b */ if ( fun == spec_table[cmd].spec_fun ) return spec_table[cmd].spec_name; return 0; }