#include <sys/types.h> #include <stdio.h> #include <string.h> #include <time.h> #include "merc.h" /* Druid */ void do_vineforge(CHAR_DATA *ch, char *argument) { OBJ_DATA *obj; if (argument[0] == '\0') { send_to_char("#0Which item do you wish to vineforge?#n\n\r", ch); return; } if ( (obj = get_obj_carry(ch, argument)) == NULL) { send_to_char("#0You are not carrying that item.#n\n\r", ch); return; } if (IS_SET(obj->quest,QUEST_VINEFORGE)) { send_to_char("#0This item has already been Vine forged#n\n\r",ch); return; } if (obj->item_type == ITEM_WEAPON) { SET_BIT(obj->quest,QUEST_VINEFORGE); obj->condition = 100; obj->toughness = 100; obj->resistance = 1; act(" $p is surrounded with thin, barbed vines.", ch, obj, NULL, TO_CHAR); act("$n stares into $p and it becomes surrounded with thin, barbed vines.", ch, obj, NULL, TO_ROOM); ch->practice -= 1500; WAIT_STATE(ch, 8); return; } } /* Beast */ void do_purification( CHAR_DATA *ch, char *argument ) { char arg[MAX_INPUT_LENGTH]; int hps = ch->max_hit / 4; argument = one_argument( argument, arg ); if (IS_NPC(ch)) return; if (!IS_GUILD(ch, GUILD_BEAST)) { stc("Only the pure in heart can use purification!\n\r",ch); return; } if (ch->fight_timer > 0) { stc("You have to be totally calm to purify yourself!\n\r",ch); return; } if (ch->move < 5000) { stc("You are too exhausted to purify your mind\n\r",ch); return; } act( "A bright halo glows above $n's head.", ch, NULL,NULL, TO_ROOM ); send_to_char("You purify your mind.\n\r",ch); WAIT_STATE(ch,12); ch->move -= 5000; ch->hit += hps; if (ch->hit > ch->max_hit) ch->hit = ch->max_hit; return; } /* Beast */ void do_beastform( CHAR_DATA *ch, char *argument ) { char arg [MAX_INPUT_LENGTH]; char buf [MAX_STRING_LENGTH]; argument = one_argument( argument, arg ); if (IS_NPC(ch)) return; if (ch->guild != 3) { send_to_char("#0Huh?#n\n\r",ch); return; } if (IS_POLYAFF(ch, POLY_ZULOFORM)) { REMOVE_BIT(ch->polyaff, POLY_ZULOFORM); REMOVE_BIT(ch->affected_by, AFF_POLYMORPH); act( "#0You transform into human form.#n", ch, NULL, NULL, TO_CHAR ); act( "#7$n's #0shrinks back into human form.#n", ch, NULL, NULL, TO_ROOM); ch->damroll -= 200; ch->hitroll -= 200; ch->armor += 300; free_string( ch->morph ); ch->morph = str_dup( "" ); return; } else if (IS_AFFECTED(ch,AFF_POLYMORPH)) { send_to_char("#0You cant wolf form when changed.#n\n\r",ch); return; } if (ch->stance[0] != -1) do_stance(ch,""); if (ch->mounted == IS_RIDING) do_dismount(ch,""); act( "#0You transform into a huge wolf.#n", ch, NULL, NULL, TO_CHAR); act( "#7$n's #0body grows and distorts into a huge wolf.#n", ch, NULL, NULL, TO_ROOM ); SET_BIT(ch->polyaff, POLY_ZULOFORM); SET_BIT(ch->affected_by, AFF_POLYMORPH); sprintf(buf, "%s the huge white wolf", ch->name); free_string( ch->morph ); ch->morph = str_dup( buf ); ch->damroll += 200; ch->hitroll += 200; ch->armor -= 300; return; } /* Guardian */ void do_guardianbless(CHAR_DATA * ch, char *argument) { CHAR_DATA *victim; char arg[MAX_INPUT_LENGTH]; int level, sn, spelltype; argument = one_argument(argument, arg); if (IS_NPC(ch)) return; if (!IS_GUILD(ch, GUILD_GUARDIAN)) { send_to_char("#0Huh?#n\n\r", ch); return; } if ((victim = get_char_room(ch, arg)) == NULL) { send_to_char("They aren't here.\n\r", ch); return; } if (ch->mana < 1000 || ch->move < 500) { send_to_char("You are to tired.\n\r", ch); return; } act("You Guardian Bless $N.", ch, NULL, victim, TO_CHAR); act("$n Guardian Blesses you.", ch, NULL, victim, TO_VICT); act("$n protects $N $S.", ch, NULL, victim, TO_NOTVICT); if ((sn = skill_lookup("bless")) > 0) { spelltype = skill_table[sn].target; level = 200; (*skill_table[sn].spell_fun) (sn, level, ch, victim); } if ((sn = skill_lookup("frenzy")) > 0) { spelltype = skill_table[sn].target; level = 200; (*skill_table[sn].spell_fun) (sn, level, ch, victim); } if ((sn = skill_lookup("armor")) > 0) { spelltype = skill_table[sn].target; level = 200; (*skill_table[sn].spell_fun) (sn, level, ch, victim); } if ((sn = skill_lookup("cure poison")) > 0) { spelltype = skill_table[sn].target; level = 200; (*skill_table[sn].spell_fun) (sn, level, ch, victim); } if ((sn = skill_lookup("shield")) > 0) { spelltype = skill_table[sn].target; level = 200; (*skill_table[sn].spell_fun) (sn, level, ch, victim); } if ((sn = skill_lookup("stone skin")) > 0) { spelltype = skill_table[sn].target; level = 200; (*skill_table[sn].spell_fun) (sn, level, ch, victim); } if ((sn = skill_lookup("darkblessing")) > 0) { spelltype = skill_table[sn].target; level = 200; (*skill_table[sn].spell_fun) (sn, level, ch, victim); } if ((sn = skill_lookup("fly")) > 0) { spelltype = skill_table[sn].target; level = 200; (*skill_table[sn].spell_fun) (sn, level, ch, victim); } if ((sn = skill_lookup("detect invis")) > 0) { spelltype = skill_table[sn].target; level = 200; (*skill_table[sn].spell_fun) (sn, level, ch, victim); } if ((sn = skill_lookup("detect hidden")) > 0) { spelltype = skill_table[sn].target; level = 200; (*skill_table[sn].spell_fun) (sn, level, ch, victim); } if ((sn = skill_lookup("detect magic")) > 0) { spelltype = skill_table[sn].target; level = 200; (*skill_table[sn].spell_fun) (sn, level, ch, victim); } ch->mana -= 1000; ch->move -= 500; WAIT_STATE(ch, 12); return; } /* Damned */ void do_faeriecurse(CHAR_DATA * ch, char *argument) { CHAR_DATA *victim; char arg[MAX_INPUT_LENGTH]; int level, sn, spelltype; argument = one_argument(argument, arg); if (IS_NPC(ch)) return; if (!IS_GUILD(ch, GUILD_DAMNED)) { send_to_char("#0Huh?#n\n\r", ch); return; } if ((victim = get_char_room(ch, arg)) == NULL) { send_to_char("They aren't here.\n\r", ch); return; } if (ch == victim) { send_to_char("Not on yourself.\n\r", ch); return; } if (ch->mana < 1000 || ch->move < 500) { send_to_char("You are to tired.\n\r", ch); return; } act("You let the forces of limbo envelope $N.", ch, NULL, victim, TO_CHAR); act("$n points at you and flickering rays of energy strikes your body.", ch, NULL, victim, TO_VICT); act("$n points at $N and flickering rays of energy strikes $S.", ch, NULL, victim, TO_NOTVICT); if (number_range(1, 3) != 1) { if ((sn = skill_lookup("web")) < 0) return; spelltype = skill_table[sn].target; level = 50; (*skill_table[sn].spell_fun) (sn, level, ch, victim); } if (number_range(1, 3) != 1) { if ((sn = skill_lookup("curse")) < 0) return; spelltype = skill_table[sn].target; level = 50; (*skill_table[sn].spell_fun) (sn, level, ch, victim); } ch->mana -= 1000; ch->move -= 500; WAIT_STATE(ch, 12); return; } /* Dark Hand */ void do_raise( CHAR_DATA *ch, char *argument ) { char buf [MAX_STRING_LENGTH]; OBJ_DATA *corpse; CHAR_DATA *victim; char arg[MAX_STRING_LENGTH]; AFFECT_DATA af; one_argument (argument, arg); if (IS_NPC(ch)) return; if (!IS_GUILD(ch, GUILD_DARK_HAND)) { send_to_char("#0This is a Dark Hand Guild Ability.#n\n\r",ch); return; } if ((corpse = get_obj_room (ch, arg)) == NULL) { stc ("That corpse isnt here.\n\r", ch); return; } if (corpse->item_type != ITEM_CORPSE_NPC) { stc ("Only on mobile corpses.\n\r", ch); return; } victim=create_mobile( get_mob_index( MOB_VNUM_MOUNT )); free_string(victim->short_descr); free_string(victim->name); free_string(victim->long_descr); victim->name = str_dup( corpse->name); victim->short_descr = str_dup(corpse->short_descr); victim->long_descr = str_dup(corpse->description); victim->level = ch->spl[RED_MAGIC]; victim->hit = 200 * ch->spl[RED_MAGIC]; victim->max_hit = 200 * ch->spl[RED_MAGIC]; victim->hitroll = ch->spl[RED_MAGIC]; victim->damroll = ch->spl[RED_MAGIC]; char_to_room( victim, ch->in_room ); add_follower( victim, ch ); af.type = skill_lookup ("charm person"); af.duration = 666; af.location = APPLY_NONE; af.modifier = 0; af.bitvector = AFF_CHARM; affect_to_char( victim, &af ); SET_BIT(victim->act,ACT_NOEXP); SET_BIT(victim->act,PLR_HOLYLIGHT); do_group(ch,victim->name); if (corpse != NULL) extract_obj (corpse); return; } /* Dark Hand */ void do_perfectsight( CHAR_DATA *ch, char *argument ) { if (IS_NPC(ch)) return; if (!IS_GUILD(ch, GUILD_DARK_HAND)) { send_to_char("Huh?\n\r",ch); return; } if (IS_SET(ch->act, PLR_HOLYLIGHT)) { REMOVE_BIT(ch->act, PLR_HOLYLIGHT); send_to_char("Your vision is back to normal.\n\r", ch); } else { SET_BIT(ch->act, PLR_HOLYLIGHT); send_to_char( "You eyes now penetrate the dimension of the mortals.\n\r", ch ); } return; } void do_knightshield( CHAR_DATA *ch, char *argument ) { OBJ_INDEX_DATA *pObjIndex; OBJ_DATA *obj; char arg[MAX_INPUT_LENGTH]; int vnum = 0; argument = one_argument( argument, arg ); if (IS_NPC(ch)) return; if (!IS_GUILD(ch, GUILD_CRUSADERS)) { send_to_char("#0You are not a crusader.#n\n\r",ch); return; } if ( ch->pcgold < 100000 ) { send_to_char("#0You don't have the 100,000 gold needed.#n\n\r",ch); return; } vnum = 2909; if ( vnum == 0 || (pObjIndex = get_obj_index( vnum )) == NULL) { send_to_char("#7Missing object, please inform Xrakisis.#n\n\r",ch); return; } if(!IS_IMMORTAL(ch)) ch->pcdata->quest -= 100000; obj = create_object(pObjIndex, 50); obj->questowner = str_dup(ch->pcdata->switchname); obj_to_char(obj, ch); act("You transform the 100,000 gold into $p.",ch,obj,NULL,TO_CHAR); act("$n forms $p out of 100,000 gold.",ch,obj,NULL,TO_ROOM); return; } void load_fortress() { int i; FILE *fp; if ((fp = fopen("../txt/fortress.txt", "r")) == NULL) { log_string("Error: fortress.txt not found!"); exit(1); } fortress[0].guard = 0; fortress[0].soldier = 0; for (i = 0; i < 6; i++) { fortress[i].guard = fread_number(fp); fortress[i].soldier = fread_number(fp); } fclose(fp); } void save_fortress() { FILE *fp; int i; if ((fp = fopen("../txt/fortress.txt","w")) == NULL) { log_string("Error writing to fortress.txt"); return; } for (i=0;i<6;i++) { fprintf(fp, "%d\n", fortress[i].guard); fprintf(fp, "%d\n", fortress[i].soldier); } fclose (fp); } void do_garrison(CHAR_DATA *ch, char *argument) { char arg1[MAX_INPUT_LENGTH]; char guild[MAX_STRING_LENGTH]; char buf[MAX_STRING_LENGTH]; int x; argument = one_argument( argument, arg1 ); sprintf(buf,"Dark Hand Guards: %d\n\r",fortress[0].guard); send_to_char( buf, ch ); sprintf(buf,"Dark Hand Soldiers: %d\n\r",fortress[0].soldier); send_to_char( buf, ch ); sprintf(buf,"Guardian Guards: %d\n\r",fortress[1].guard); send_to_char( buf, ch ); sprintf(buf,"Guardian Soldiers: %d\n\r",fortress[1].soldier); send_to_char( buf, ch ); sprintf(buf,"Beast Guards: %d\n\r",fortress[2].guard); send_to_char( buf, ch ); sprintf(buf,"Beast Soldiers: %d\n\r",fortress[2].soldier); send_to_char( buf, ch ); sprintf(buf,"Damned Guards: %d\n\r",fortress[3].guard); send_to_char( buf, ch ); sprintf(buf,"Damned Soldiers: %d\n\r",fortress[3].soldier); send_to_char( buf, ch ); sprintf(buf,"Crusaders Guards: %d\n\r",fortress[4].guard); send_to_char( buf, ch ); sprintf(buf,"Crusaders Soldiers: %d\n\r",fortress[4].soldier); send_to_char( buf, ch ); sprintf(buf,"Druid Guards: %d\n\r",fortress[5].guard); send_to_char( buf, ch ); sprintf(buf,"Druid Soldiers: %d\n\r",fortress[5].soldier); send_to_char( buf, ch ); return; } void do_hire(CHAR_DATA *ch, char *argument) { char arg1[MAX_INPUT_LENGTH]; char guild[MAX_STRING_LENGTH]; char buf[MAX_STRING_LENGTH]; int x; x = ch->guild - 1; argument = one_argument( argument, arg1 ); if (arg1[0] == '\0') { send_to_char("Soldier 100,000\n\r",ch); send_to_char("Guard 100,000\n\r",ch); } if (!str_cmp(arg1,"soldier")) { if (ch->pcgold < 100000 ) { send_to_char("You don't have the 100,000 gold needed.\n\r",ch); return; } fortress[x].soldier++; send_to_char("You hire a soldier.\n\r",ch); ch->pcgold -= 100000; save_fortress(); return; } if (!str_cmp(arg1,"guard")) { if (ch->pcgold < 100000 ) { send_to_char("You don't have the 100,000 gold needed.\n\r",ch); return; } fortress[x].guard++; send_to_char("You hire a guard.\n\r",ch); ch->pcgold -= 100000; save_fortress(); return; } return; } void do_grecall(CHAR_DATA * ch, char *argument) { char buf[MAX_STRING_LENGTH]; CHAR_DATA *victim; CHAR_DATA *mount; ROOM_INDEX_DATA *location; if (IS_NPC(ch)) return; if (ch->guild == 0) { stc("#0your not in a Guild#n\n\r", ch); return; } act("$n's body flickers with red energy.", ch, NULL, NULL, TO_ROOM); act("Your body flickers with red energy.", ch, NULL, NULL, TO_CHAR); if (IS_GUILD(ch, GUILD_DARK_HAND)) location = get_room_index(5200); else if (IS_GUILD(ch, GUILD_GUARDIAN)) location = get_room_index(5101); else { send_to_char("#0Your grecall is broken, tell Xrakisis#n\n\r", ch); return; } if (ch->in_room == location) return; if (IS_SET(ch->in_room->room_flags, ROOM_NO_RECALL) || IS_AFFECTED(ch, AFF_CURSE)) { send_to_char("You are unable to crecall.\n\r", ch); return; } if ((victim = ch->fighting) != NULL) { if (number_bits(1) == 0) { WAIT_STATE(ch, 4); sprintf(buf, "You failed!\n\r"); send_to_char(buf, ch); return; } sprintf(buf, "You grecall from combat!\n\r"); send_to_char(buf, ch); stop_fighting(ch, TRUE); } act("$n disappears.", ch, NULL, NULL, TO_ROOM); char_from_room(ch); char_to_room(ch, location); act("$n appears in the room.", ch, NULL, NULL, TO_ROOM); do_look(ch, "auto"); if ((mount = ch->mount) == NULL) return; char_from_room(mount); char_to_room(mount, ch->in_room); return; }