/*************************************************************************** * This snippet was written by Donut & Buba for the Khrooon Mud. * * Original Coded by Yago Diaz <yago@cerberus.uab.es> * * (C) November 1996 * * (C) Last Modification September 1997 * ***************************************************************************/ /*************************************************************************** * 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. * * * * 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. * **************************************************************************/ /*************************************************************************** * ROM 2.4 is copyright 1993-1996 Russ Taylor * * ROM has been brought to you by the ROM consortium * * Russ Taylor (rtaylor@efn.org) * * Gabrielle Taylor * * Brian Moore (zump@rom.org) * * By using this code, you have agreed to follow the terms of the * * ROM license, in the file Rom24/doc/rom.license * ***************************************************************************/ /* * This is the file where all mob related services will be. */ #include <sys/types.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include "include.h" CHAR_DATA * find_forger args( ( CHAR_DATA * ch ) ); CHAR_DATA * find_restringer args( ( CHAR_DATA * ch ) ); CHAR_DATA * find_innkeeper args( ( CHAR_DATA * ch ) ); CHAR_DATA * find_blesser args( ( CHAR_DATA * ch ) ); CHAR_DATA * find_sage args( ( CHAR_DATA * ch ) ); CHAR_DATA * find_smith args( ( CHAR_DATA * ch ) ); CHAR_DATA * find_summoner args( ( CHAR_DATA * ch ) ); CHAR_DATA * find_forger ( CHAR_DATA *ch ) { CHAR_DATA * forger; for ( forger = ch->in_room->people; forger != NULL; forger = forger->next_in_room ) { if (!IS_NPC(forger)) continue; if ( IS_NPC(forger) && IS_SET(forger->act, ACT_FORGER) ) return forger; } if ( forger == NULL ) { send_to_char("You can't do that here.\n\r", ch); return NULL; } return NULL; } CHAR_DATA * find_restringer ( CHAR_DATA *ch ) { CHAR_DATA * restringer; for ( restringer = ch->in_room->people; restringer != NULL; restringer = restringer->next_in_room ) { if (!IS_NPC(restringer)) continue; if (restringer->spec_fun == spec_lookup( "spec_restringer" ) ) return restringer; } if ( restringer == NULL || restringer->spec_fun != spec_lookup( "spec_restringer" )) { send_to_char("What? You can't do that here.\n\r", ch); return NULL; } if ( restringer->fighting != NULL ) { send_to_char("Wait until the fighting stops.\n\r",ch ); return NULL; } return NULL; } CHAR_DATA * find_innkeeper ( CHAR_DATA *ch ) { CHAR_DATA * innkeeper; for ( innkeeper = ch->in_room->people; innkeeper != NULL; innkeeper = innkeeper->next_in_room ) { if (!IS_NPC(innkeeper)) continue; if (innkeeper->spec_fun == spec_lookup( "spec_innkeeper" ) ) return innkeeper; } if ( innkeeper == NULL || innkeeper->spec_fun != spec_lookup( "spec_innkeeper" )) { send_to_char("What? You can't do that here.\n\r", ch); return NULL; } if ( innkeeper->fighting != NULL ) { send_to_char("Wait until the fighting stops.\n\r",ch ); return NULL; } return NULL; } CHAR_DATA * find_blacksmith( CHAR_DATA *ch ) { CHAR_DATA * blacksmith; for ( blacksmith = ch->in_room->people; blacksmith != NULL; blacksmith = blacksmith->next_in_room ) { if (!IS_NPC(blacksmith)) continue; if (blacksmith->spec_fun == spec_lookup( "spec_blacksmith" ) ) return blacksmith; } if ( blacksmith == NULL || blacksmith->spec_fun != spec_lookup( "spec_blacksmith" )) { send_to_char("What? You can't do that here.\n\r", ch); return NULL; } if ( blacksmith->fighting != NULL ) { send_to_char("Wait until the fighting stops.\n\r",ch ); return NULL; } return NULL; } CHAR_DATA * find_blesser ( CHAR_DATA *ch ) { CHAR_DATA * blesser; for ( blesser = ch->in_room->people; blesser != NULL; blesser = blesser->next_in_room ) { if (!IS_NPC(blesser)) continue; if (blesser->spec_fun == spec_lookup( "spec_blesser" ) ) return blesser; } if ( blesser == NULL || blesser->spec_fun != spec_lookup( "spec_blesser" )) { send_to_char("What? You can't do that here.\n\r", ch); return NULL; } if ( blesser->fighting != NULL ) { send_to_char("Wait until the fighting stops.\n\r",ch ); return NULL; } return NULL; } CHAR_DATA * find_sage ( CHAR_DATA *ch ) { CHAR_DATA * sage; for ( sage = ch->in_room->people; sage != NULL; sage = sage->next_in_room ) { if (!IS_NPC(sage)) continue; if (sage->spec_fun == spec_lookup( "spec_sage" ) ) return sage; } if ( sage == NULL || sage->spec_fun != spec_lookup( "spec_sage" )) { send_to_char("What? You can't do that here.\n\r", ch); return NULL; } if ( sage->fighting != NULL ) { send_to_char("Wait until the fighting stops.\n\r",ch ); return NULL; } return NULL; } CHAR_DATA * find_smith( CHAR_DATA *ch ) { CHAR_DATA * smith; for ( smith = ch->in_room->people; smith != NULL; smith = smith->next_in_room ) { if (!IS_NPC(smith)) continue; if (smith->spec_fun == spec_lookup( "spec_smith" ) ) return smith; } if ( smith == NULL || smith->spec_fun != spec_lookup( "spec_smith" )) { send_to_char("What? You can't do that here.\n\r", ch); return NULL; } if ( smith->fighting != NULL ) { send_to_char("Wait until the fighting stops.\n\r",ch ); return NULL; } return NULL; } CHAR_DATA *find_summoner ( CHAR_DATA *ch ) { CHAR_DATA * summoner; for ( summoner = ch->in_room->people; summoner != NULL; summoner = summoner->next_in_room ) { if (!IS_NPC(summoner)) continue; if (summoner->spec_fun == spec_lookup( "spec_summoner" )) return summoner; } if (summoner == NULL || summoner->spec_fun != spec_lookup( "spec_summoner" )) { send_to_char("You can't do that here.\n\r",ch); return NULL; } if ( summoner->fighting != NULL) { send_to_char("Wait until the fighting stops.\n\r",ch); return NULL; } return NULL; } void do_forge( CHAR_DATA *ch, char *argument ) { OBJ_DATA * obj; CHAR_DATA * forger; char weapon[MAX_INPUT_LENGTH]; char * words; int cost; forger = find_forger(ch); if (!forger) return; if (argument[0] == '\0') { act("$N says 'You have to tell me the type of forge do you want on your weapon.'", ch, NULL, forger, TO_CHAR); send_to_char("You have to tell me the weapon you want to forge.\n\r", ch); send_to_char("My possible forges are:\n\r",ch); send_to_char(" flame : flaming weapon 1250 quest points\n\r",ch); send_to_char(" drain : vampiric weapon 1750 quest points\n\r",ch); send_to_char(" shocking : electric weapon 1750 quest points\n\r",ch); send_to_char(" frost : frost weapon 2250 quest points\n\r",ch); send_to_char(" sharp : sharp weapon 2500 quest points\n\r",ch); send_to_char(" vorpal : vorpal weapon 1750 quest points\n\r",ch); send_to_char("\n\rType 'forge <weapon> <type>' to forge the weapon.\n\r",ch); return; } argument = one_argument ( argument, weapon); if ( ( obj = get_obj_carry( ch, weapon, ch ) ) == NULL ) { act ("$N says 'You're not carrying that.'", ch, NULL, forger, TO_CHAR); return; } if(obj->item_type != ITEM_WEAPON) { act ("$N says 'This is not a weapon!.'", ch, NULL, forger, TO_CHAR); return; } if ( argument[0] == '\0' ) { act ("$N says 'Pardon? type 'forge' to see the list of modifications.'", ch, NULL, forger, TO_CHAR); return; } if (!str_prefix(argument,"flame")) { if (IS_WEAPON_STAT( obj, WEAPON_FLAMING) ) { act("$N says '$p is already flaming.'", ch, obj, forger, TO_CHAR); return; } words = "yrawz braoculo"; cost = 1250; if ( cost > ch->pcdata->questpoints ) { act ("$N says 'You do not have enough quest points for my services'", ch, NULL, forger, TO_CHAR); return; } act("$n utters the words '$T'.", forger, NULL, words, TO_ROOM); spell_flame_blade( skill_lookup("flame blade"), 50, forger, obj, 0 ); if ( IS_WEAPON_STAT ( obj, WEAPON_FLAMING) ) { act ("$N gives $p to $n.", ch, obj, forger, TO_ROOM); act ("$N says 'Take care with $p, now is a lot powerful.'", ch, obj, forger, TO_CHAR); ch->pcdata->questpoints -= cost; forger->gold += cost; } else act ("$N says 'I'm sorry I can't help you.'", ch, NULL, forger, TO_CHAR); return; } if (!str_prefix(argument,"drain")) { if (IS_WEAPON_STAT( obj, WEAPON_VAMPIRIC) ) { act("$N says '$p is already vampiric.'", ch, obj, forger, TO_CHAR); return; } words = "egruui braoculo"; cost = 1750; if ( cost > ch->pcdata->questpoints ) { act ("$N says 'You do not have enough gold for my services'", ch, NULL, forger, TO_CHAR); return; } act("$n utters the words '$T'.", forger, NULL, words, TO_ROOM); spell_drain_blade( skill_lookup("drain blade"), 50, forger, obj, 0 ); if ( IS_WEAPON_STAT ( obj, WEAPON_VAMPIRIC) ) { act ("$N gives $p to $n.", ch, obj, forger, TO_ROOM); act ("$N says 'Take care with $p, now is a lot powerful.'", ch, obj, forger, TO_CHAR); ch->pcdata->questpoints -= cost; forger->gold += cost; } else act ("$N says 'I'm sorry I can't help you.'", ch, NULL, forger, TO_CHAR); return; } if (!str_prefix(argument,"shocking")) { if (IS_WEAPON_STAT( obj, WEAPON_SHOCKING) ) { act("$N says '$p is already electrical.'", ch, obj, forger, TO_CHAR); return; } words = "gpaqtuio braoculo"; cost = 1750; if ( cost > ch->pcdata->questpoints ) { act ("$N says 'You do not have enough quest points for my services.'", ch, NULL, forger, TO_CHAR); return; } act("$n utters the words '$T'.", forger, NULL, words, TO_ROOM); spell_shocking_blade( skill_lookup("shocking blade"), 50, forger, obj, 0 ); if ( IS_WEAPON_STAT ( obj, WEAPON_SHOCKING) ) { act ("$N gives $p to $n.", ch, obj, forger, TO_ROOM); act ("$N says 'Take care with $p, now is a lot powerful.'", ch, obj, forger, TO_CHAR); ch->pcdata->questpoints -= cost; forger->gold += cost; } else act ("$N says 'I'm sorry I can't help you.'", ch, NULL, forger, TO_CHAR); return; } if (!str_prefix(argument,"frost")) { if (IS_WEAPON_STAT( obj, WEAPON_FROST) ) { act("$N says '$p is already frost.'", ch, obj, forger, TO_CHAR); return; } words = "yfagh braoculo"; cost = 2250; if ( cost > ch->pcdata->questpoints ) { act ("$N says 'You do not have enough quest points for my services'", ch, NULL, forger, TO_CHAR); return; } act("$n utters the words '$T'.", forger, NULL, words, TO_ROOM); spell_frost_blade( skill_lookup("frost blade"), 50, forger, obj, 0 ); if ( IS_WEAPON_STAT ( obj, WEAPON_FROST) ) { act ("$N gives $p to $n.", ch, obj, forger, TO_ROOM); act ("$N says 'Take care with $p, now is a lot powerful.'", ch, obj, forger, TO_CHAR); ch->pcdata->questpoints -= cost; forger->gold += cost; } else act ("$N says 'I'm sorry I can't help you.'", ch, NULL, forger, TO_CHAR); return; } if (!str_prefix(argument,"sharp")) { if (IS_WEAPON_STAT( obj, WEAPON_SHARP) ) { act("$N says '$p is already sharp.'", ch, obj, forger, TO_CHAR); return; } words = "gpabras braoculo"; cost = 2500; if ( cost > ch->pcdata->questpoints ) { act ("$N says 'You do not have enough quest points for my services'", ch, NULL, forger, TO_CHAR); return; } act("$n utters the words '$T'.", forger, NULL, words, TO_ROOM); spell_sharp_blade( skill_lookup("sharp blade"), 50, forger, obj, 0 ); if ( IS_WEAPON_STAT ( obj, WEAPON_SHARP) ) { act ("$N gives $p to $n.", ch, obj, forger, TO_ROOM); act ("$N says 'Take care with $p, now is a lot powerful.'", ch, obj, forger, TO_CHAR); ch->pcdata->questpoints -= cost; forger->gold += cost; } else act ("$N says 'I'm sorry I can't help you.'", ch, NULL, forger, TO_CHAR); return; } if (!str_prefix(argument,"vorpal")) { if (IS_WEAPON_STAT( obj, WEAPON_VORPAL) ) { act("$N says '$p is already vorpal.'", ch, obj, forger, TO_CHAR); return; } words = "zafsar braoculo"; cost = 1750; if ( cost > ch->pcdata->questpoints ) { act ("$N says 'You do not have enough quest points for my services'", ch, NULL, forger, TO_CHAR); return; } act("$n utters the words '$T'.", forger, NULL, words, TO_ROOM); spell_vorpal_blade( skill_lookup("vorpal blade"), 50, forger, obj, 0 ); if ( IS_WEAPON_STAT ( obj, WEAPON_VORPAL) ) { act ("$N gives $p to $n.", ch, obj, forger, TO_ROOM); act ("$N says 'Take care with $p, now is a lot powerful.'", ch, obj, forger, TO_CHAR); ch->pcdata->questpoints -= cost; forger->gold += cost; } else act ("$N says 'I'm sorry I can't help you.'", ch, NULL, forger, TO_CHAR); return; } act ("$N says 'Pardon? Type 'forge' to see the list of modifications.'", ch, NULL, forger, TO_CHAR); return; } void spell_drain_blade( int sn, int level, CHAR_DATA *ch, void *vo, int target ) { OBJ_DATA * obj = (OBJ_DATA *) vo; AFFECT_DATA af; if(obj->item_type != ITEM_WEAPON) { send_to_char("You can only cast this spell on weapons.\n\r",ch); return; } if(IS_WEAPON_STAT(obj,WEAPON_VAMPIRIC)) { send_to_char("This weapon is already vampiric.\n\r", ch); return; } if(IS_OBJ_STAT(obj,ITEM_BLESS)) { send_to_char("This weapon is too blessed.\n\r", ch); return; } af.where = TO_WEAPON; af.type = sn; af.level = 20; af.duration = -1; af.location = 0; af.modifier = 0; af.bitvector = WEAPON_VAMPIRIC; affect_to_obj(obj, &af); act("$p carried by $n turns dark and vampiric.", ch, obj, NULL, TO_ROOM); act("$p carried by you turns dark and vampiric.", ch, obj, NULL, TO_CHAR); return; } void spell_shocking_blade( int sn, int level, CHAR_DATA *ch, void *vo, int target ) { OBJ_DATA * obj = (OBJ_DATA *) vo; AFFECT_DATA af; if(obj->item_type != ITEM_WEAPON) { send_to_char("You can only cast this spell on weapons.\n\r",ch); return; } if(IS_WEAPON_STAT(obj,WEAPON_SHOCKING)) { send_to_char("This weapon is already electrical.\n\r", ch); return; } af.where = TO_WEAPON; af.type = sn; af.level = 20; af.duration = -1; af.location = 0; af.modifier = 0; af.bitvector = WEAPON_SHOCKING; affect_to_obj(obj, &af); act("$p carried by $n sparks with electricity.", ch, obj, NULL, TO_ROOM); act("$p carried by you sparks with electricity.", ch, obj, NULL, TO_CHAR); return; } void spell_flame_blade( int sn, int level, CHAR_DATA *ch, void *vo, int target ) { OBJ_DATA *obj = (OBJ_DATA *) vo; AFFECT_DATA af; if(obj->item_type != ITEM_WEAPON) { send_to_char("You can only cast this spell on weapons.\n\r",ch); return; } if(IS_WEAPON_STAT(obj,WEAPON_FLAMING)) { send_to_char("This weapon is already flaming.\n\r", ch); return; } if(IS_WEAPON_STAT(obj,WEAPON_FROST)) { send_to_char("This weapon is too frost to handle this magic.\n\r", ch); return; } af.where = TO_WEAPON; af.type = sn; af.level = 20; af.duration = -1; af.location = 0; af.modifier = 0; af.bitvector = WEAPON_FLAMING; affect_to_obj(obj, &af); act("$p carried by $n gets a fiery aura.", ch, obj, NULL, TO_ROOM); act("$p carried by you gets a fiery aura.", ch, obj, NULL, TO_CHAR); return; } void spell_frost_blade( int sn, int level, CHAR_DATA *ch, void *vo, int target ) { OBJ_DATA *obj = (OBJ_DATA *) vo; AFFECT_DATA af; if(obj->item_type != ITEM_WEAPON) { send_to_char("You can only cast this spell on weapons.\n\r",ch); return; } if(IS_WEAPON_STAT(obj,WEAPON_FROST)) { send_to_char("This weapon is already frost.\n\r", ch); return; } if(IS_WEAPON_STAT(obj,WEAPON_FLAMING)) { send_to_char("This weapon is too hot to handle this magic.\n\r", ch); return; } af.where = TO_WEAPON; af.type = sn; af.level = 20; af.duration = -1; af.location = 0; af.modifier = 0; af.bitvector = WEAPON_FROST; affect_to_obj(obj, &af); act("$p carried by $n grows wickedly cold.", ch, obj, NULL, TO_ROOM); act("$p carried by you grows wickedly cold.", ch, obj, NULL, TO_CHAR); return; } void spell_sharp_blade( int sn, int level, CHAR_DATA *ch, void *vo, int target ) { OBJ_DATA *obj = (OBJ_DATA *) vo; AFFECT_DATA af; if(obj->item_type != ITEM_WEAPON) { send_to_char("You can only cast this spell on weapons.\n\r",ch); return; } if(IS_WEAPON_STAT(obj,WEAPON_SHARP)) { send_to_char("This weapon is already sharp.\n\r", ch); return; } af.where = TO_WEAPON; af.type = sn; af.level = 20; af.duration = -1; af.location = 0; af.modifier = 0; af.bitvector = WEAPON_SHARP; affect_to_obj(obj, &af); act("$p carried by $n looks newly honed.", ch, obj, NULL, TO_ROOM); act("$p carried by you looks newly honed.", ch, obj, NULL, TO_CHAR); return; } void spell_vorpal_blade( int sn, int level, CHAR_DATA *ch, void *vo, int target ) { OBJ_DATA *obj = (OBJ_DATA *) vo; AFFECT_DATA af; if(obj->item_type != ITEM_WEAPON) { send_to_char("You can only cast this spell on weapons.\n\r",ch); return ; } if(IS_WEAPON_STAT(obj,WEAPON_VORPAL)) { send_to_char("This weapon is already vorpal.\n\r", ch); return; } af.where = TO_WEAPON; af.type = sn; af.level = level/2; af.duration = -1; af.location = 0; af.modifier = 0; af.bitvector = WEAPON_VORPAL; affect_to_obj(obj, &af); act("$p carried by $n gleams witch magical strengh.", ch, obj, NULL, TO_ROOM); act("$p carried by you gleams witch magical strengh.", ch, obj, NULL, TO_CHAR); return; } void do_restring( CHAR_DATA *ch, char *argument ) { char arg [MIL]; char arg1 [MIL]; char arg2 [MIL]; CHAR_DATA *restringer; OBJ_DATA *obj; int cost = 1500; restringer = find_restringer(ch); smash_tilde( argument ); argument = one_argument( argument, arg ); argument = one_argument( argument, arg1 ); strcpy( arg2, argument ); if ( arg[0] == '\0' || arg1[0] == '\0' || arg2[0] == '\0' ) { printf_to_char( ch, "The cost for a restring is %d gold.\n\r", cost ); send_to_char( "Syntax: Restring <obj> <field>\n\r", ch ); send_to_char( "Valid fields are: short name and long\n\r", ch ); return; } if ( ( obj = (get_obj_carry(ch, arg, restringer) ) ) == NULL ) { send_to_char( "You don't have that item.\n\r", ch ); return; } if ( cost > ch->gold ) { send_to_char( "You don't have enough gold.\n\r", ch ); return; } if ( !str_prefix( arg1, "name" ) ) { free_string( obj->name ); obj->name = str_dup( arg2 ); } else if ( !str_prefix( arg1, "short" ) ) { free_string( obj->short_descr ); obj->short_descr = str_dup(arg2); } else if ( !str_prefix( arg1, "long" ) ) { free_string( obj->description ); obj->description = str_dup( arg2 ); } else { send_to_char("Syntax: valid fields are: name short and long\n\r",ch); return; } ch->gold -= cost; restringer->gold += cost; act( "$n takes your $p works on it and hands it back to you.", restringer, obj,NULL,TO_VICT ); act( "$N takes $n's item works on it and then hands it back to them.", restringer, NULL, ch, TO_ROOM); } /* do_bounty */ /* Global variables */ BOUNTY_DATA *bounty_list; /* Command functions needed */ DECLARE_DO_FUN(do_say ); /* Function definitions */ int clan_lookup args( (const char *name) ); /* And some local defines */ #define BOUNTY_PLACE_CHARGE 3 #define BOUNTY_REMOVE_CHARGE 100 #define BOUNTY_ADD_CHARGE 5 #define MIN_BOUNTY 1000 void save_bounties() { FILE *fp; BOUNTY_DATA *bounty; bool found = FALSE; fp = file_open( BOUNTY_FILE, "w" ); for( bounty = bounty_list; bounty != NULL; bounty = bounty->next) { found = TRUE; fprintf(fp,"%-12s %d\n",bounty->name,bounty->amount); } file_close(fp); if(!found) unlink(BOUNTY_FILE); } void load_bounties() { FILE *fp; BOUNTY_DATA *blist; if (!file_exists(BOUNTY_FILE)) return; fp = file_open( BOUNTY_FILE, "r" ); blist = NULL; for( ; ; ) { BOUNTY_DATA *bounty; if ( feof(fp) ) { file_close(fp); return; } bounty = new_bounty(); bounty->name = str_dup(fread_word(fp)); bounty->amount = fread_number(fp); fread_to_eol(fp); if(bounty_list == NULL) bounty_list = bounty; else blist->next = bounty; blist = bounty; } } bool is_bountied(CHAR_DATA *ch) { BOUNTY_DATA *bounty; bool found = FALSE; if(IS_NPC(ch)) return FALSE; for(bounty = bounty_list; bounty != NULL; bounty = bounty->next) { if( !str_cmp(ch->name,bounty->name) ) found = TRUE; } return found; } void do_bounty(CHAR_DATA *ch, char *argument) { FILE *fp; CHAR_DATA *vch; BOUNTY_DATA *bounty; BOUNTY_DATA *prev=NULL; char arg[MAX_INPUT_LENGTH]; char arg2[MAX_INPUT_LENGTH]; char buf[MAX_STRING_LENGTH]; char strsave[MAX_STRING_LENGTH]; const char *word; bool found = FALSE; bool clanned = FALSE; int cash, amount, surcharge; if( IS_NPC(ch) ) return; /* Check for the bounty collector */ for(vch = ch->in_room->people; vch ; vch = vch->next_in_room) { if(IS_NPC(vch) && IS_SET(vch->act, ACT_BOUNTY)) break; } if(vch == NULL) { send_to_char("You cannot do that here.\n\r",ch); return; } /* Only clanned chars/pkillers can place bounties. */ /* if( !is_clan(ch) ) { do_say(vch,"You must be in a clan to place or collect a bounty."); return; }*/ argument = one_argument(argument, arg); one_argument(argument, arg2); if(arg[0] == '\0') { do_say(vch,"These are the bounties I will honor:"); send_to_char(" Name Bounty\n\r",ch); send_to_char(" ============ ===============\n\r",ch); for(bounty = bounty_list;bounty != NULL;bounty=bounty->next) { sprintf(buf," %-12s %d\n\r",bounty->name,bounty->amount); send_to_char(buf,ch); } return; } if( arg2[0] == '\0' || (str_cmp(arg,"remove") && str_cmp(arg,"collect") && !is_number(arg2)) ) { send_to_char("Syntax: bounty\n\r",ch); send_to_char(" bounty remove \n\r",ch); send_to_char(" bounty collect \n\r",ch); send_to_char(" bounty <name> <amount> \n\r",ch); return; } /* For collecting bounties. */ if( !str_cmp(arg,"collect") ) { OBJ_DATA *obj; for(bounty = bounty_list; bounty != NULL; prev=bounty, bounty=bounty->next) { if( !str_cmp(arg2,bounty->name) ) break; } if( bounty == NULL ) { do_say(vch,"That individual is not in the books."); return; } for(obj = ch->carrying; obj != NULL; obj = obj->next) { if( is_name(arg2,obj->name) && (obj->pIndexData->vnum == OBJ_VNUM_SEVERED_HEAD) ) break; } if( obj == NULL ) { do_say(vch,"I'm afraid I'll need proof of the death."); return; } extract_obj(obj); do_say(vch,"Very well, here is your payment."); ch->pcdata->gold_bank += bounty->amount; /* * OK, we've got a valid bounty and they've * been paid. Time to remove the bounty. */ if(prev == NULL) bounty_list = bounty_list->next; else prev->next = bounty->next; free_bounty(bounty); save_bounties(); return; } /* For buying off bounties. */ if( !str_cmp(arg,"remove") ) { for(bounty = bounty_list; bounty != NULL; prev=bounty, bounty=bounty->next) { if( !str_cmp(arg2,bounty->name) ) break; } if( bounty == NULL ) { do_say(vch,"That individual is not in the books."); return; } surcharge = BOUNTY_REMOVE_CHARGE; amount = bounty->amount+(bounty->amount*surcharge/100); cash = ch->gold + (ch->silver/100) + ch->pcdata->gold_bank + (ch->pcdata->silver_bank/100); sprintf( buf, "The amount for removal is %d Gold.\n\r", amount); send_to_char( buf, ch); if(cash < amount) { do_say(vch,"You cannot afford to remove that bounty."); return; } if(ch->pcdata->silver_bank < (amount*100)) { amount -= (ch->pcdata->silver_bank/100); ch->pcdata->silver_bank %= 100; } else { ch->pcdata->silver_bank -= amount*100; amount = 0; } if(ch->pcdata->gold_bank < amount) { amount -= ch->pcdata->gold_bank; ch->pcdata->gold_bank = 0; } else { ch->pcdata->gold_bank -= amount; amount = 0; } if(ch->silver < (amount*100)) { amount -= (ch->silver/100); ch->silver %= 100; } else { ch->silver -= amount*100; amount = 0; } if(ch->gold < amount) { amount -= ch->gold; ch->gold = 0; } else { ch->gold -= amount; amount = 0; } /* * OK, we've got a valid bounty and they can * pay. Time to remove the bounty. */ if(prev == NULL) bounty_list = bounty_list->next; else prev->next = bounty->next; printf_to_char( ch, "The Bounty Processor says '%'s has been removed from the books.\n\r", bounty->name ); info( ch, 0, "{G[INFO]:{x Someone has had their bounty removed.\n\r" ); free_bounty(bounty); save_bounties(); return; } /* * This code allows you to bounty those * offline as well as those not visible. */ sprintf(strsave, "%s%s", PLAYER_DIR, capitalize(arg)); if (!file_exists(strsave)) { do_say(vch,"I am afraid there is no such person."); return; } fp = file_open( strsave, "r" ); strcpy(arg,capitalize(arg)); while( !found ) { char *clanName; word = feof(fp) ? "End" : fread_word( fp ); if( !str_cmp(word, "Clan") ) { found = TRUE; clanName = fread_string(fp); clanned = clan_lookup(clanName) ? TRUE : FALSE; free_string(clanName); } else if( !str_cmp(word, "End") ) { found = TRUE; } else { fread_to_eol( fp ); } } file_close( fp ); /* Only clanned chars can be bountied */ /* if( !clanned ) { do_say(vch,"You cannot place bounties on non-clanned characters."); return; }*/ /* Minimum bounty, change as desired */ if( (amount = atoi(arg2)) < MIN_BOUNTY) { sprintf(buf,"I do not accept bounties under %d gold.",MIN_BOUNTY); do_say(vch,buf); return; } /* * Char's cash total in gold, bounties * are always set in gold. Notice the */ cash = ch->gold + (ch->silver/100) + ch->pcdata->gold_bank + (ch->pcdata->silver_bank/100); /* * Does the bounty already exist? * Let's find out. */ for(bounty = bounty_list;bounty != NULL;bounty = bounty->next) { if( !str_cmp(bounty->name,arg) ) break; } if(bounty == NULL) { surcharge = BOUNTY_PLACE_CHARGE; if(cash < (amount+(amount*surcharge/100))) { do_say(vch,"You cannot afford to place that bounty."); return; } bounty = new_bounty(); bounty->name = str_dup(arg); bounty->amount = amount; bounty->next = bounty_list; bounty_list = bounty; amount += amount*surcharge/100; } else { sprintf(buf,"There is a %d%% surcharge to add to an existing bounty.",BOUNTY_ADD_CHARGE); do_say(vch,buf); surcharge = BOUNTY_PLACE_CHARGE + BOUNTY_ADD_CHARGE; amount += amount*surcharge/100; if(cash < amount) { do_say(vch,"You cannot afford to place that bounty."); return; } bounty->amount += amount; } save_bounties(); sprintf( buf, "The cost of the bounty is %d Gold.\n\r", amount); send_to_char( buf, ch); /* * Now make them pay, start with bank * then go to cash on hand. Also use * up that annoying silver first. */ if(ch->pcdata->silver_bank < (amount*100)) { amount -= (ch->pcdata->silver_bank/100); ch->pcdata->silver_bank %= 100; } else { ch->pcdata->silver_bank -= amount*100; amount = 0; } if(ch->pcdata->gold_bank < amount) { amount -= ch->pcdata->gold_bank; ch->pcdata->silver_bank = 0; } else { ch->pcdata->gold_bank -= amount; amount = 0; } if(ch->silver < (amount*100)) { amount -= (ch->silver/100); ch->silver %= 100; } else { ch->silver -= amount*100; amount = 0; } if(ch->gold < amount) { amount -= ch->gold; ch->gold = 0; } else { ch->gold -= amount; amount = 0; } printf_to_char( ch, "The Bounty Processor says '%'s has been recorded in the books.\n\r", bounty->name ); info( ch, 0, "{G[INFO]:{x {BSomeone has just had a bounty placed on their head!{x\n\r" ); } /* Synon */ void do_exchange( CHAR_DATA *ch, char * argument ) { char arg[MSL]; CHAR_DATA *innkeeper; OBJ_DATA *obj; int qreward = 50; int preward = 1; int treward = 1; int ereward = 50; int etreward = 2; innkeeper = find_innkeeper( ch ); if (!innkeeper) return; argument = one_argument( argument, arg ); if ( arg[0] == '\0' ) { printf_to_char(ch, "{RTypes{x : Quest: Practice: Train: Exp: Exp: \n\r" ); printf_to_char(ch, "===========================================================================\n\r" ); printf_to_char(ch, "{BValues{x: Questpoints: %-2d Practices: %-2d Trains: %-2d Exp: %-2d Trains: %-2d\n\r\n\r", qreward, preward, treward, ereward, etreward ); send_to_char( "Syntax: exchange <token>\n\r", ch ); return; } if ( IS_NPC( ch ) ) { send_to_char( "You can't do that.\n\r", ch ); return; } else { if ( !str_cmp( arg, "quest" ) ) { if ( ( obj = get_obj_carry( ch, arg, ch ) ) == NULL ) { send_to_char( "You don't have anything like that in your inventory.\n\r", ch ); return; } printf_to_char( ch, "You exchange a quest token for %d questpoints.\n\r", qreward ); obj_from_char( obj ); extract_obj( obj ); ch->pcdata->questpoints += qreward; printf_to_char( ch, "You now have %d questpoints.\n\r", ch->pcdata->questpoints ); return; } else if ( !str_cmp( arg, "practice" ) ) { if ( ( obj = get_obj_carry( ch, arg, ch ) ) == NULL ) { send_to_char( "You don't have anything like that in your inventory.\n\r", ch ); return; } printf_to_char( ch, "You exchange a practice token for %d practice.\n\r", preward ); obj_from_char( obj ); extract_obj( obj); ch->practice += preward; printf_to_char( ch, "You now have %d practices.\n\r", ch->practice ); return; } else if ( !str_cmp( arg, "train" ) ) { if ( ( obj = get_obj_carry( ch, arg, ch ) ) == NULL ) { send_to_char( "You don't have anything like that in your inventory.\n\r", ch ); return; } printf_to_char( ch, "You exchange a train token for %d train.\n\r", treward ); obj_from_char( obj ); extract_obj( obj); ch->train += treward; printf_to_char( ch, "You now have %d trains.\n\r", ch->train ); return; } else if ( !str_cmp( arg, "exp" ) ) { if ( ( obj = get_obj_carry( ch, arg, ch ) ) == NULL ) { send_to_char( "You don't have anything like that in your inventory.\n\r", ch ); return; } if ( ch->level < LEVEL_HERO ) { printf_to_char( ch, "You exchange an exp token for %d exp.\n\r", ereward ); obj_from_char( obj ); extract_obj( obj); printf_to_char( ch, "You need %d exp to level.\n\r", (ch->level + 1) * exp_per_level(ch,ch->pcdata->points) - ch->exp); gain_exp( ch, ereward ); advance_level( ch, TRUE ); return; } else { printf_to_char( ch, "You exchange an exp token for %d trains.\n\r", etreward ); obj_from_char( obj ); extract_obj( obj ); ch->train += etreward; printf_to_char( ch, "You now have %d trains.\n\r", ch->train ); return; } } else { send_to_char( "Syntax: exchange <token>. Valid tokens are.\n\rexp\n\rtrain\n\rquest\n\rpractice\n\r", ch ); return; } } } void do_petcall(CHAR_DATA *ch, char *argument) { int cost = 200; if( IS_NPC(ch) ) { send_to_char("Mobs dont need pets!\n\r",ch); return; } if ( IS_IMMORTAL( ch ) ) { send_to_char( "Your an immortal just transfer your pet!\n\r", ch ); return; } if( IN_MINE(ch) ) { send_to_char("Your pet isn't able to hear you in the mine.\n\r",ch); return; } if ( ch->pet == NULL ) { send_to_char ( "You don't have a pet!\n\r", ch ); return; } char_from_room( ch->pet ); char_to_room( ch->pet, ch->in_room ); act( "$n whistles loudly, and $N appears in the room.", ch, NULL, ch->pet, TO_ROOM ); act( "You whistle loudly, and $N appears in the room.", ch, NULL, ch->pet, TO_CHAR ); if ( ch->move > 200 ) ch->move -= cost; else ch->move *= .25; printf_to_char( ch, "Calling your pet to your side exhaust you and drains %d movement.\n\r", cost ); } void do_repair(CHAR_DATA *ch, char *argument) { CHAR_DATA *blacksmith; char arg[MIL]; char arg1[MIL]; char buf[MIL]; OBJ_DATA *obj; OBJ_DATA *obj_next; bool found = FALSE; int cost = 0; int count; blacksmith = find_blacksmith( ch ); if (!blacksmith) return; argument = one_argument(argument,arg); argument = one_argument( argument, arg1 ); if (arg[0] == '\0') { do_say(blacksmith,"I will repair your weapon for a price.\n\r"); send_to_char("Type repair <weapon> estimate to be assessed for damage.\n\r",ch); printf_to_char( ch, "You can repair all <estimate> to be assessed for repairs on all eq. \n\r" ); printf_to_char( ch, "To repair your eq type: repair all <repair>\n\r" ); return; } if ( !str_cmp( arg, "all" ) ) { if ( arg1[0] == '\0' ) { printf_to_char( ch, "You can repair all <estimate> to be assessed for repairs on all eq. \n\r" ); printf_to_char( ch, "To repair your eq type: repair all <repair>\n\r" ); return; } if ( !str_cmp( arg1, "repair" ) ) { for (obj = ch->carrying; obj; obj = obj_next) { obj_next = obj->next_content; if (IS_SET(obj->extra_flags, ITEM_NOREPAIR)) continue; if ( obj->condition <= 50 && obj->condition > 0 && count++ > 1 ) { found = TRUE; cost += ( (obj->level * 10) + ((obj->cost * (100 - obj->condition)) /100) ); cost /= 100; } } if ( cost <= ch->gold ) { for (obj = ch->carrying; obj; obj = obj_next) { obj_next = obj->next_content; if (IS_SET(obj->extra_flags, ITEM_NOREPAIR)) continue; if ( obj->condition <= 50 && obj->condition > 0 && count++ > 1 ) { found = TRUE; set_obj_condition( obj, 100 ); } } } if ( cost > ch->gold ) { printf_to_char( ch, "You don't have enough gold for my services.\n\r" ); return; } if ( !found ) { do_say( blacksmith, "You don't have anything that needs repairing.\n\r" ); found = FALSE; return; } ch->gold -= cost; blacksmith->gold += cost; sprintf(buf, "$N takes $n's damaged objects repairs them and returns them to $n"); wait_act( 0, buf,ch,NULL,blacksmith,TO_ROOM); sprintf(buf, "$N charges you %d gold takes your items, repairs them, and returns them to you.\n\r", cost ); wait_act( 1, buf, ch, NULL, blacksmith, TO_CHAR ); return; } else if ( !str_cmp( arg1, "estimate" ) ) { for (obj = ch->carrying; obj; obj = obj_next) { obj_next = obj->next_content; if (IS_SET(obj->extra_flags, ITEM_NOREPAIR)) continue; if ( obj->condition <= 50 && obj->condition > 0 && count++ > 1 ) { found = TRUE; cost += ( (obj->level * 10) + ((obj->cost * (100 - obj->condition)) /100) ); cost /= 100; } } if ( !found ) { do_say( blacksmith, "You don't have anything that needs repairing.\n\r" ); found = FALSE; return; } printf_to_char( ch, "It will cost %d gold to fix those items.\n\r", cost ); return; } } if (( obj = get_obj_carry(ch, arg, ch)) == NULL) { do_say(blacksmith,"You don't have that item"); return; } if (obj->condition >= 100) { do_say(blacksmith,"But that item is not broken."); return; } if (obj->condition == 0) { sprintf(buf ,"%s is beyond repair.\n\r", obj->short_descr); do_say(blacksmith,buf); return; } if (IS_SET(obj->extra_flags, ITEM_NOREPAIR)) { send_to_char( "This object can not be repaired.\n\r", ch ); return; } cost = ( (obj->level * 10) + ((obj->cost * (100 - obj->condition)) /100) ); cost /= 100; if (!str_cmp( arg1, "estimate" ) ) { sprintf(buf, "It will cost %d gold to fix that item", cost); do_say(blacksmith,buf); } if (cost > ch->gold) { do_say(blacksmith,"You do not have enough gold for my services."); return; } WAIT_STATE(ch,PULSE_VIOLENCE); ch->gold -= cost; blacksmith->gold += cost; sprintf(buf, "$N takes %s from $n, repairs it, and returns it to $n", obj->short_descr); wait_act( 0, buf,ch,NULL,blacksmith,TO_ROOM); sprintf(buf, "$N takes %s, repairs it, and returns it to you.\n\r", obj->short_descr); wait_act( 1, buf, ch, NULL, blacksmith, TO_CHAR ); set_obj_condition( obj, 100 ); } void do_beseech(CHAR_DATA *ch, char *argument) { char buf[MSL]; char arg[MSL]; char arg1[MSL]; CHAR_DATA *blesser; int value; blesser = find_blesser( ch ); if (!blesser) return; argument = one_argument( argument, arg ); argument = one_argument( argument, arg1 ); if (IS_NPC(ch)) return; if ( arg[0] == '\0' || arg1[0] == '\0' || !is_number( arg ) ) { send_to_char( "Syntax: beseech <amount> <type>.\n\r", ch ); send_to_char( "Valid types are:\n\r", ch ); send_to_char( " level, train, practice, gold, silver, questpoints\n\r", ch ); send_to_char( " hp, mana, move\n\r", ch ); return; } value = atoi( arg ); if ( value < 1 || value > 10 ) { send_to_char( "You must choose a value between 1 and 10.\n\r", ch ); return; } if ( !str_cmp( arg1, "level" ) ) { if ( ch->level >= LEVEL_HERO ) send_to_char( "Sorry you can't level anymore!\n\r", ch ); if (ch->bp_points < value ) { printf_to_char( ch, "You don't have %d blessing points!\n\r", value ); return; } if ( value < 2 ) send_to_char( "Sorry you need at least 2 blessing points for one level!\n\r", ch ); ch->bp_points -= value; ch->level += value / 2; advance_level( ch, TRUE ); sprintf(buf,"You are now level %d.\n\r",ch->level); send_to_char(buf,ch); ch->exp = exp_per_level(ch,ch->pcdata->points) * UMAX( 1, ch->level ); do_function( ch, &do_save, "" ); return; } if ( !str_cmp( arg1, "train" ) ) { if ( ch->bp_points < value ) { printf_to_char( ch, "You don't have %d blessing points!\n\r", value ); return; } ch->bp_points -= value; ch->train += value * 2; printf_to_char( ch, "You gained %d trains!\n\r", value * 2 ); printf_to_char( ch, "You now have %d trains!\n\r", ch->train ); do_function( ch, &do_save, "" ); return; } if ( !str_cmp( arg1, "practice" ) ) { if ( ch->bp_points < value ) { printf_to_char( ch, "You don't have %d blessing points!\n\r", value ); return; } ch->bp_points -= value; ch->practice += value * 20; printf_to_char( ch, "You gained %d practices!\n\r", value * 20 ); printf_to_char( ch, "You now have %d practies!\n\r", ch->practice ); do_function( ch, &do_save, "" ); return; } if ( !str_cmp( arg1, "gold" ) ) { if ( ch->bp_points < value ) { printf_to_char( ch, "You don't have %d blessing points!\n\r", value ); return; } ch->bp_points -= value; ch->gold += value * 500; printf_to_char( ch, "You gained %d gold!\n\r", value * 500 ); printf_to_char( ch, "You now have %d gold!\n\r", ch->gold ); do_function( ch, &do_save, "" ); return; } if ( !str_cmp( arg1, "silver" ) ) { if ( ch->bp_points < value ) { printf_to_char( ch, "You don't have %d blessing points!\n\r", value ); return; } ch->bp_points -= value; ch->silver += value * 5000; printf_to_char( ch, "You gained %d silver!\n\r", value * 5000 ); printf_to_char( ch, "You now have %d silver!\n\r", ch->silver ); do_function( ch, &do_save, "" ); return; } if ( !str_cmp( arg1, "questpoints" ) ) { if ( ch->bp_points < value ) { printf_to_char( ch, "You don't have %d blessing points!\n\r", value ); return; } ch->bp_points -= value; ch->pcdata->questpoints += value * 50; printf_to_char( ch, "You gained %d questpoints!\n\r", value * 50 ); printf_to_char( ch, "You now have %d questpoints!\n\r", ch->pcdata->questpoints ); do_function( ch, &do_save, "" ); return; } if ( !str_cmp( arg1, "hp" ) ) { if ( ch->bp_points < value ) { printf_to_char( ch, "You don't have %d blessing points!\n\r", value ); return; } ch->bp_points -= value; ch->max_hit += value * 25; printf_to_char( ch, "You gained %d hp!\n\r", value * 25 ); printf_to_char( ch, "You now have %d hit points!\n\r", ch->max_hit ); do_function( ch, &do_save, "" ); return; } if ( !str_cmp( arg1, "mana" ) ) { if ( ch->bp_points < value ) { printf_to_char( ch, "You don't have %d blessing points!\n\r", value ); return; } ch->bp_points -= value; ch->max_mana += value *25; printf_to_char( ch, "You gained %d mana!\n\r", value * 25 ); printf_to_char( ch, "You now have %d mana!\n\r", ch->max_mana ); do_function( ch, &do_save, "" ); return; } if ( !str_cmp( arg1, "move" ) ) { if ( ch->bp_points < value ) { printf_to_char( ch, "You don't have %d blessing points!\n\r", value ); return; } ch->bp_points -= value; ch->max_move += value * 25; printf_to_char( ch, "You gained %d move!\n\r", value * 25 ); printf_to_char( ch, "You now have %d movement!\n\r", ch->max_move ); do_function( ch, &do_save, "" ); return; } send_to_char( "Syntax: beseech <amount> <type>\n\r", ch); return; } void do_reveal( CHAR_DATA *ch, char *argument ) { OBJ_DATA *obj; CHAR_DATA *sage; int cost; sage = find_sage( ch ); if (!sage) return; if ( argument[0] == '\0' ) { send_to_char("Syntax: reveal objectname\n\r", ch ); return; } if ( ( obj = get_obj_carry( ch, argument, ch ) ) == NULL ) { send_to_char( "You are not carrying that.\n\r", ch ); return; } if (IS_IMMORTAL(ch)) { send_to_char( "Your an immortal you don't need my services!\n\r", ch ); return; } cost = obj->level * 50; if ( !str_cmp( argument, "cost" ) ) { printf_to_char( ch, "The %s tells you, it will cost you %d gold to identify this object!\n\r", sage->name, cost ); return; } if (ch->gold < cost) { printf_to_char( ch, "%s refuses to look at %s you need more gold.\n\r", sage->name, obj ); return; } else { ch->gold -= cost; wait_act( 0, "$n takes your gold, and $p agrees to identify it.\n\r", sage->name, obj, NULL, TO_CHAR ); wait_act( 1, "$n studies $p and glances towards the ground, when he looks up he reveals $p's stats for you.\n\r", sage->name, obj->name, obj->name, TO_CHAR ); do_lore( ch, "obj->name" ); } return; } void do_mtsteal( CHAR_DATA *ch, char *argument ) { CHAR_DATA *victim; CHAR_DATA *mount; int amount = 200; if ( argument[0] == '\0' ) { send_to_char( "Use: mtsteal <person who is mounted>.\n\r", ch ); return; } if ( ch->move < amount ) { printf_to_char( ch, "You need %d movement to do that.\n\r", amount ); return; } if ( !( victim = get_char_room( ch, NULL, argument ) ) ) { send_to_char( "They're not here.\n\r", ch ); return; } if ( !MOUNTED(victim )) { send_to_char( "They're not mounted...\n\r", ch ); return; } if (MOUNTED(ch)) { send_to_char("You are already riding.\n\r", ch); return; } if ( victim->position == POS_FIGHTING || victim->fighting ) { send_to_char( "Wait until they're done fighting.\n\r", ch ); return; } if ( number_percent( ) <= 50 ) { mount = MOUNTED( victim ); victim->riding = FALSE; mount->riding = FALSE; ch->mount = mount; ch->riding = TRUE; mount->mount = ch; mount->riding = TRUE; ch->move /=2; act( "You steal $N's mount!", ch, NULL, victim, TO_CHAR ); act( "$n has stolen your mount!", ch, NULL, victim, TO_VICT ); return; } act( "You tried to steal $N's mount but failed.", ch, NULL, victim, TO_CHAR ); printf_to_char( victim, "%s has tried to steal your mount!\n\r", ch->name ); act( "$n tried to steal $N's mount but failed.", ch, NULL, victim, TO_ROOM ); return; } void do_petshow( CHAR_DATA *ch, char *argument ) { ROOM_INDEX_DATA *in_room; in_room = ch->in_room; if ( ch->pet == NULL ) { send_to_char( "I'm sorry you don't have a pet!\n\r", ch ); return; } if ( ch->pet->in_room->area != ch->in_room->area ) { send_to_char( "Your pet has to be in the same area as you!\n\r", ch ); return; } send_to_char("{bHere are the stats for your pet:{x\n\r", ch ); send_to_char("{cName Hit Mana Move Location Exp to level Current exp Levelflux{x\n\r",ch); send_to_char("{C============================================================================================={x\n\r", ch ); printf_to_char(ch, "%-12s %-8d %-8d %-8d %-15s %-16d %-13d %-7d\n\r", capitalize(ch->pet->short_descr), ch->pet->hit, ch->pet->mana, ch->pet->move, ch->pet->in_room->area->name, ch->pet->xp_tolevel, ch->pet->exp, ch->pet->levelflux ); return; } void do_convert( CHAR_DATA *ch, char *argument ) { char arg[MSL]; char arg2[MSL]; char arg3[MSL]; CHAR_DATA *mob; int amount; int cost = 40; for ( mob = ch->in_room->people; mob; mob = mob->next_in_room ) { if ( IS_NPC(mob) && IS_SET(mob->act, ACT_TRAIN) ) break; } if ( mob == NULL ) { send_to_char( "You can't do that here.\n\r", ch ); return; } argument = one_argument( argument, arg ); argument = one_argument( argument, arg2 ); argument = one_argument( argument, arg3 ); if ( arg[0] == '\0' || arg2[0] == '\0' || arg3[0] == '\0' ) { send_to_char( "Syntax: convert <amount> <type> to <type>\n\r", ch ); send_to_char( "Valid types are: hp mana move\n\r", ch ); printf_to_char( ch, "The current cost of conversion is: %d gold.\n\r", cost ); return; } amount = is_number(arg) ? atoi(arg) : 1; if ( amount < 1 || amount > 32000 ) { send_to_char( "Please choose a value between 1 and 32000.\n\r", ch ); return; } if ( !str_cmp( arg2, "hp" ) ) { if ( !str_cmp ( arg3, "move" ) ) { if ( ch->pcdata->perm_hit <= amount ) { send_to_char( "I'm sorry you don't have enough hitpoints to make that conversion!\n\r", ch ); return; } if ( ch->gold < cost ) { send_to_char( "I'm sorry you don't have enough gold!\n\r", ch ); return; } ch->max_hit -= amount; ch->hit = ch->max_hit; ch->pcdata->perm_hit -= amount; ch->max_move += amount; ch->move = ch->max_move; ch->pcdata->perm_move += amount; ch->gold -= amount; printf_to_char( ch, "You convert %d hp into movement.\n\rYou have %d movement, and %d hp!\n\r", amount, ch->max_move, ch->max_hit ); return; } else if ( !str_cmp ( arg3, "mana" ) ) { if ( ch->pcdata->perm_hit <= amount ) { send_to_char( "I'm sorry you don't have enough hitpoints to make that conversion!\n\r", ch ); return; } if ( ch->gold < cost ) { send_to_char( "I'm sorry you don't have enough gold!\n\r", ch ); return; } ch->max_hit -= amount; ch->hit = ch->max_hit; ch->pcdata->perm_hit -= amount; ch->max_mana += amount; ch->mana = ch->max_mana; ch->pcdata->perm_mana += amount; ch->gold -= amount; printf_to_char( ch, "You convert %d hp into mana.\n\rYou have %d mana and %d hp!\n\r", amount, ch->max_mana, ch->max_hit ); return; } } else if ( !str_cmp( arg2, "mana" ) ) { if ( !str_cmp( arg3, "hp" ) ) { if ( ch->pcdata->perm_mana <= amount ) { send_to_char( "I'm sorry you don't have enough mana to make that conversion!\n\r", ch ); return; } if ( ch->gold < cost ) { send_to_char( "I'm sorry you don't have enough gold!\n\r", ch ); return; } ch->max_mana -= amount; ch->mana = ch->max_mana; ch->pcdata->perm_mana -= amount; ch->max_hit += amount; ch->hit = ch->max_hit; ch->pcdata->perm_hit += amount; ch->gold -= amount; printf_to_char( ch, "You convert %d mana into hp.\n\rYou have %d hp and %d mana!\n\r", amount, ch->max_hit, ch->max_mana ); return; } else if ( !str_cmp( arg3, "move" ) ) { if ( ch->pcdata->perm_mana <= amount ) { send_to_char( "I'm sorry you don't have enough mana to make that conversion!\n\r", ch ); return; } if ( ch->gold < cost ) { send_to_char( "I'm sorry you don't have enough gold!\n\r", ch ); return; } ch->max_mana -= amount; ch->mana = ch->max_mana; ch->pcdata->perm_mana -= amount; ch->max_move += amount; ch->move = ch->max_move; ch->pcdata->perm_move += amount; ch->gold -= amount; printf_to_char( ch, "You convert %d mana into move.\n\rYou have %d move and %d mana!\n\r", amount, ch->max_move, ch->max_mana ); return; } } else if ( !str_cmp( arg2, "move" ) ) { if ( !str_cmp( arg3, "hp" ) ) { if ( ch->pcdata->perm_move <= amount ) { send_to_char( "I'm sorry you don't have enough movement to make that conversion!\n\r", ch ); return; } if ( ch->gold < cost ) { send_to_char( "I'm sorry you don't have enough gold!\n\r", ch ); return; } ch->max_move -= amount; ch->move = ch->max_move; ch->pcdata->perm_move -= amount; ch->max_hit += amount; ch->hit = ch->max_hit; ch->pcdata->perm_hit += amount; ch->gold -= amount; printf_to_char( ch, "You convert %d movement into hp.\n\rYou have %d hp and %d movement!\n\r", amount, ch->max_hit, ch->max_move ); return; } else if ( !str_cmp( arg3, "mana" ) ) { if ( ch->pcdata->perm_move <= amount ) { send_to_char( "I'm sorry you don't have enough movement to make that conversion!\n\r", ch ); return; } if ( ch->gold < cost ) { send_to_char( "I'm sorry you don't have enough gold!\n\r", ch ); return; } ch->max_move -= amount; ch->move = amount; ch->pcdata->perm_move -= amount; ch->max_mana += amount; ch->hit = ch->max_hit; ch->pcdata->perm_hit += amount; ch->gold -= amount; printf_to_char( ch, "You convert %d movement into mana.\n\rYou have %d mana and %d movement!\n\r", amount, ch->max_mana, ch->max_move ); return; } } send_to_char( "Syntax: convert <amount> <type> to <type>\n\r", ch ); send_to_char( "Valid types are: hp, mana, move\n\r", ch ); return; } void do_qsmith(CHAR_DATA *ch, char *argument) { OBJ_DATA *obj; AFFECT_DATA paf; char arg1[MIL]; char arg2[MIL]; char arg3[MIL]; CHAR_DATA *smith; char buf[MSL]; int affect_modify = 0, bit = 0, enchant_type, pos, i, cost; smith = find_smith( ch ); if (!smith) return; argument = one_argument( argument, arg1 ); argument = one_argument( argument, arg2 ); argument = one_argument( argument, arg3 ); if ( arg1[0] == '\0' || arg2[0] == '\0' || arg3[0] == '\0' ) { send_to_char( "This is a valid list of types and affects:\n\r", ch ); for (i = 0; smith_table[i].type != NULL; i++) { sprintf(buf, "{c%-10s{x {C%-25s{x {c%-2d{x {Ciqp{x\n\r", i < 14 ? "Type" : "Affect", smith_table[i].type, smith_table[i].cost); send_to_char( buf, ch ); } send_to_char("\n\rSyntax: qsmith <object> <type> <value>\n\r",ch); send_to_char("Syntax: qsmith <object> affect <name>\n\r",ch); return; } if ((obj = get_obj_here(ch, NULL, arg1)) == NULL) { send_to_char("No such object exists!\n\r",ch); return; } else if (!str_prefix(arg2,"hp")) { enchant_type = APPLY_HIT; } else if (!str_prefix(arg2,"str")) { enchant_type = APPLY_STR; } else if (!str_prefix(arg2,"dex")) { enchant_type = APPLY_DEX; cost = 1; } else if (!str_prefix(arg2,"int")) { enchant_type = APPLY_INT; } else if (!str_prefix(arg2,"wis")) { enchant_type = APPLY_WIS; } else if (!str_prefix(arg2,"con")) { enchant_type = APPLY_CON; } else if (!str_prefix(arg2,"mana")) { enchant_type = APPLY_MANA; } else if (!str_prefix(arg2,"move")) { enchant_type = APPLY_MOVE; } else if (!str_prefix(arg2,"ac")) { enchant_type = APPLY_AC; } else if (!str_prefix(arg2,"hitroll")) { enchant_type = APPLY_HITROLL; } else if (!str_prefix(arg2,"damroll")) { enchant_type = APPLY_DAMROLL; cost = 2; } else if (!str_prefix(arg2,"saves")) { enchant_type = APPLY_SAVING_SPELL; cost = 2; } else if (!str_prefix(arg2,"clevel")) { enchant_type = APPLY_CAST_LEVEL; } else if (!str_prefix(arg2,"cability")) { enchant_type = APPLY_CAST_ABILITY; } else if (!str_prefix(arg2,"affect")) { enchant_type = APPLY_SPELL_AFFECT; } else { send_to_char("That apply is not possible!\n\r",ch); return; } if (enchant_type == APPLY_SPELL_AFFECT) { for (pos = 0; affect_flags[pos].name != NULL; pos++) if (!str_cmp(affect_flags[pos].name,arg3)) bit = affect_flags[pos].bit; } else { if ( is_number(arg3) ) { affect_modify = atoi(arg3); cost = affect_modify; } else { send_to_char("Applies require a value.\n\r", ch); return; } } affect_enchant(obj); /* create the affect */ paf.where = TO_AFFECTS; paf.type = 0; paf.level = ch->level; paf.duration = -1; paf.location = enchant_type; paf.modifier = affect_modify; paf.bitvector = bit; if ( enchant_type == APPLY_SPELL_AFFECT ) { /* make table work with skill_lookup */ for ( i=0 ; arg3[i] != '\0'; i++ ) { if ( arg3[i] == '_' ) arg3[i] = ' '; } paf.type = skill_lookup(arg3); for ( i = 0; smith_table[i].type != NULL; i++ ) { if (is_name(arg3, smith_table[i].type)) { if (ch->pcdata->qps >= smith_table[i].cost) { ch->pcdata->qps -= smith_table[i].cost; } affect_to_obj(obj,&paf); sprintf(buf, "$N takes %s, adds your affect and studies his work carefully.\n\r", obj->short_descr ); wait_act( 2, buf, ch, NULL, smith, TO_CHAR ); sprintf(buf, "$N says, You owe me %d immortal questpoints for adding those affects.\n\r", smith_table[i].cost ); wait_act( 4, buf, ch, NULL, smith, TO_CHAR ); sprintf(buf, "You pay $N %d immortal questpoints and thank him for his services.\n\r", smith_table[i].cost ); wait_act( 6, buf, ch, NULL, smith, TO_CHAR ); sprintf(buf, "$N smiles, taking your questpoints, then gives you %s.\n\rI guarantee all my work so if you have any problems come back and see me.\n\r", obj->short_descr ); wait_act( 8, buf, ch, NULL, smith, TO_CHAR ); sprintf(buf, "You have %d immortal questpoints left.\n\r", ch->pcdata->qps ); wait_act( 10, buf, ch, NULL, NULL, TO_CHAR ); } } } else { for ( i = 0; smith_table[i].type != NULL; i++ ) { if (is_name(arg3, smith_table[i].type)) { if (ch->pcdata->qps >= smith_table[i].cost) { ch->pcdata->qps -= ( smith_table[i].cost * cost ); } affect_to_obj(obj,&paf); sprintf(buf, "$N takes %s, adds your affect and studies his work carefully.\n\r", obj->short_descr ); wait_act( 2, buf, ch, NULL, smith, TO_CHAR ); sprintf(buf, "$N says, You owe me %d immortal questpoints for adding those affects.\n\r", smith_table[i].cost * cost ); wait_act( 4, buf, ch, NULL, smith, TO_CHAR ); sprintf(buf, "You pay $N %d immortal questpoints and thank him for his services.\n\r", smith_table[i].cost * cost ); wait_act( 6, buf, ch, NULL, smith, TO_CHAR ); sprintf(buf, "$N smiles, taking your questpoints, then gives you %s.\n\rI guarantee all my work so if you have any problems come back and see me.\n\r", obj->short_descr ); wait_act( 8, buf, ch, NULL, smith, TO_CHAR ); sprintf(buf, "You have %d immortal questpoints left.\n\r", ch->pcdata->qps ); wait_act( 10, buf, ch, NULL, NULL, TO_CHAR ); return; } } } } PET_DATA *pet_list; void save_pets() { FILE *fp; PET_DATA *pEt; if ( ( fp = file_open( PET_FILE, "w" ) ) == NULL ) { logf2("The pet file is gone!\n\r"); return; } for( pEt = pet_list; pEt != NULL; pEt = pEt->next) { fprintf(fp,"Cname %s~\n", pEt->cname ); fprintf(fp,"Name %s~\n", pEt->name ); fprintf(fp,"Shd %s~\n", pEt->short_desc ); fprintf(fp,"Lnd %s~\n", pEt->long_desc ); fprintf(fp,"Cost %d\n", pEt->cost ); fprintf(fp,"Vnum %d\n", pEt->vnum ); fprintf(fp,"Level %d\n", pEt->level ); fprintf(fp,"Mhit %d\n", pEt->max_hit ); fprintf(fp,"Mmana %d\n", pEt->max_mana ); fprintf(fp,"Mmove %d\n", pEt->max_move ); fprintf(fp,"Exp %d\n", pEt->exp ); fprintf(fp,"Xptolevel %d\n", pEt->xp_tolevel ); fprintf(fp,"Levelflux %d\n", pEt->levelflux ); fprintf(fp,"Practice %d\n", pEt->practice ); fprintf(fp,"Train %d\n", pEt->train ); fprintf(fp,"Damroll %d\n", pEt->damroll ); fprintf(fp,"Hitroll %d\n", pEt->hitroll ); fprintf(fp,"Armor %d %d %d %d\n", pEt->armor[0], pEt->armor[1], pEt->armor[2], pEt->armor[3] ); fprintf(fp,"Gold %d\n", pEt->gold ); fprintf(fp,"Silver %d\n\n", pEt->silver ); } fprintf(fp, "$\n"); logf2("Pets saved."); file_close(fp); return; } void load_pets() { FILE *fp; const char *word; PET_DATA *plist; PET_DATA *pEt; if (file_exists(PET_FILE)) { fp = file_open( PET_FILE, "r" ); plist = NULL; for( ; ; ) { word = feof( fp ) ? "End" : fread_word( fp ); if(word[0] == '$' ) return; if (!str_cmp(word, "Cname" ) ) { pEt = new_pet(); if(pet_list == NULL) pet_list = pEt; else plist->next = pEt; plist = pEt; pEt->cname = str_dup(fread_string(fp)); } if (!str_cmp(word, "Name" ) ) pEt->name = str_dup(fread_string(fp)); if (!str_cmp(word, "Shd" ) ) pEt->short_desc = str_dup(fread_string(fp)); if (!str_cmp(word, "Lnd" ) ) pEt->long_desc = str_dup(fread_string(fp)); if (!str_cmp(word, "Cost" ) ) pEt->cost = fread_number(fp); if (!str_cmp(word, "Vnum" ) ) pEt->vnum = fread_number(fp); if (!str_cmp(word, "Level" ) ) pEt->level = fread_number(fp); if (!str_cmp(word, "Mhit" ) ) pEt->max_hit = fread_number(fp); if (!str_cmp(word, "Mmana" ) ) pEt->max_mana = fread_number(fp); if (!str_cmp(word, "Mmove" ) ) pEt->max_move = fread_number(fp); if (!str_cmp(word, "Exp" ) ) pEt->exp = fread_number(fp); if (!str_cmp(word, "Xptolevel" ) ) pEt->xp_tolevel = fread_number(fp); if (!str_cmp(word, "Levelflux" ) ) pEt->levelflux = fread_number(fp); if (!str_cmp(word, "Practice" ) ) pEt->practice = fread_number(fp); if (!str_cmp(word, "Train" ) ) pEt->train = fread_number(fp); if (!str_cmp(word, "Damroll" ) ) pEt->damroll = fread_number(fp); if (!str_cmp(word, "Hitroll" ) ) pEt->hitroll = fread_number(fp); if (!str_cmp(word, "Armor" ) ) { int i; for (i = 0; i < 4; i++) pEt->armor[i] = fread_number(fp); } if (!str_cmp(word, "Gold" ) ) pEt->gold = fread_number(fp); if (!str_cmp(word, "Silver" ) ) pEt->silver = fread_number(fp); } } return; } bool on_petlist(CHAR_DATA *ch) { PET_DATA *pEt; bool found = FALSE; for(pEt = pet_list; pEt != NULL; pEt = pEt->next) { if( !str_cmp(ch->name,pEt->cname) ) found = TRUE; } return found; } void do_petlist( CHAR_DATA *ch, char *argument ) { char arg[MSL]; char arg1[MSL]; PET_DATA *pEt; PET_DATA *prev = NULL; CHAR_DATA *pet; bool found = FALSE; int vnum; argument = one_argument( argument, arg ); one_argument( argument, arg1 ); if ( IS_NPC( ch ) ) { send_to_char( "Sorry mobs can not own pets!\n\r", ch ); return; } if(arg[0] == '\0') { send_to_char("Name Cost\n\r",ch); send_to_char("{B======================{x\n\r",ch); for(pEt = pet_list;pEt != NULL;pEt = pEt->next) { if( !str_cmp(ch->name,pEt->cname) ) { printf_to_char( ch, "%-12s %-4d\n\r", pEt->name, pEt->cost); found = TRUE; } } if ( !found ) { send_to_char( "You do not have any pets that you can ressurect!\n\r", ch ); return; } return; } if ( arg1[0] == '\0' ) { send_to_char( "Syntax: petlist revive <name>\n\r", ch ); return; } if ( !str_cmp( arg, "revive" ) ) { for ( pEt = pet_list; pEt != NULL; prev = pEt, pEt = pEt->next ) { if ( !str_cmp( arg1, pEt->name ) ) break; } if ( pEt == NULL ) { send_to_char( "That pet is not on the list!\n\r", ch ); return; } if ( ch->pet != NULL ) { send_to_char("You already own a pet.\n\r",ch); return; } vnum = pEt->vnum; if (get_mob_index(vnum) == '\0') { send_to_char( "This pet has been deleted from the mud, contact an immortal.\n\r", ch ); return; } pet = create_mobile( get_mob_index( vnum ) ); SET_BIT(pet->act, ACT_PET); SET_BIT(pet->affected_by, AFF_CHARM); pet->comm = COMM_NOTELL|COMM_NOSHOUT|COMM_NOCHANNELS; ch->gold -= pEt->cost; revived_pet( pet, pEt ); char_to_room( pet, ch->in_room ); send_to_char( "Ok here is your pet enjoy.\n\r", ch ); add_follower( pet, ch ); pet->leader = ch; ch->pet = pet; if ( prev == NULL ) pet_list = pet_list->next; else pEt->next = pEt->next; free_pet(pEt); save_pets(); return; } } void do_level( CHAR_DATA *ch, char *argument ) { char buf[MAX_STRING_LENGTH]; CHAR_DATA *leveler; for ( leveler = ch->in_room->people; leveler != NULL; leveler = leveler->next_in_room ) { if ( IS_NPC(leveler) && IS_SET(leveler->act, ACT_LEVELER) ) break; } if (leveler == NULL || !can_see(ch,leveler)) { send_to_char( "You can't do that here.\n\r", ch ); return; } if (ch->pcdata->current_exp < exp_per_level(ch, ch->pcdata->points)) { sprintf(buf, "You have insufficient experience to gain another level, %s.",ch->name); do_say(leveler,buf); return; } ch->level += 1; sprintf(buf,"%s gained level %d",ch->name,ch->level); log_string(buf); sprintf(buf,"$N has attained level %d!",ch->level); wiznet(buf,ch,NULL,WIZ_LEVELS,0,0); advance_level(ch,FALSE); info( ch, 0, "{G[INFO]:{x{G%s{x {Bhas just attained level{x {R%d{x!{x\n\r", ch->name, ch->level ); affect_strip(ch,skill_lookup("plague")); affect_strip(ch,skill_lookup("poison")); affect_strip(ch,skill_lookup("blindness")); affect_strip(ch,skill_lookup("sleep")); affect_strip(ch,skill_lookup("curse")); ch->hit = ch->max_hit; ch->mana = ch->max_mana; ch->move = ch->max_move; update_pos( ch); ch->pcdata->current_exp -= exp_per_level(ch, ch->pcdata->points); send_to_char( "{G[INFO]:{x {BSynon has given you the power to continue!{x\n\r", ch ); save_char_obj(ch); return; } void do_travel(CHAR_DATA *ch, char *argument) { CHAR_DATA *summoner,*pet; ROOM_INDEX_DATA *room; int i = 0; char buf[MSL], arg[MSL]; char arg1[MSL]; argument = one_argument(argument, arg ); argument = one_argument(argument, arg1); summoner = find_summoner (ch); if (!summoner) return; if (arg[0] == '\0') { printf_to_char(ch, "You must tell me what travel you want to do:\n\r" "TRAVEL list - shows possible locations to travel to.\n\r" "TRAVEL buy <name> - Travel to selected location.\n\r"); return; } if (!strcmp( arg, "list")) { printf_to_char(ch, "%s says you may travel to the following locations:\n\r", PERS(summoner,ch)); for(i=0;summoner_table[i].name != NULL;i++) { sprintf(buf,"\t%-15s - %-3d %s\n\r", summoner_table[i].name,summoner_table[i].cost, MONEY); send_to_char(buf,ch); } return; } if (!strcmp( arg, "buy")) { if (arg1[0] == '\0') { sprintf(buf, "You must tell me where you wish to travel"); act("$N says '$t'.", ch, buf, summoner, TO_CHAR); return; } for(i=0;summoner_table[i].name != NULL;i++) if(is_name(arg1,summoner_table[i].name)) break; if(summoner_table[i].name == NULL) { sprintf(buf, "That location of travel is not on the list"); act("$N says '$t'.", ch, buf, summoner, TO_CHAR); return; } if ( (ch->silver + 100 * ch->gold) < summoner_table[i].cost ) { sprintf(buf, "You don't have enough %s for my services",MONEY); act("$N says '$t'.", ch, buf, summoner, TO_CHAR); return; } if( (room = get_room_index(summoner_table[i].vnum) ) == NULL ) { send_to_char("That location's room doesn't seem to exist, please inform your Imp.\n\r",ch); return; } if ( (pet = ch->pet) != NULL && pet->in_room == ch->in_room) { char_from_room( pet ); char_to_room( pet, get_room_index(summoner_table[i].vnum) ); } char_from_room( ch ); char_to_room( ch, get_room_index(summoner_table[i].vnum) ); deduct_cost(ch,summoner_table[i].cost); printf_to_char(ch, "%s utters the words 'hasidsindsad'\n\rYou are surrounded by a violet fog.\n\r", summoner->short_descr); do_function( ch, &do_look, "" ); return; } else do_function( ch, &do_travel, "" ); }