#if defined(macintosh) #include <types.h> #else #include <sys/types.h> #endif #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include "merc.h" #include "player.h" void do_shift(CHAR_DATA *ch, char *argument) { CHAR_DATA *vict; char arg2[MAX_STRING_LENGTH]; char arg3[MAX_STRING_LENGTH]; char buf[MAX_STRING_LENGTH]; char buf2[MAX_STRING_LENGTH]; int sn; argument = one_argument(argument, arg2); argument = one_argument(argument, arg3); if (!IS_CLASS(ch, CLASS_SHAPE)) { send_to_char("Your not a shapeshifter!\n\r", ch);return;} if (arg2[0] == '\0') { send_to_char("Please enter a mobs name, back, or list.\n\r", ch); return; } if (!str_cmp(arg2, "list")) {for (sn = 1;sn < MAX_SHAPE;sn++) { if (shape_skill[sn].name != NULL) { sprintf(buf, "%-23s %d\n\r", shape_skill[sn].name, shape_skill[sn].percent); send_to_char(buf, ch);} } return;} if (!str_cmp(arg2, "back")) {send_to_char("You shift back into your normal form.\n\r", ch); act("$n shifts back into his normal form.", ch, NULL, NULL, TO_ROOM); ch->shapespec = NULL; ch->shape[dopplevnum] = 0; return; } if ( ( vict = get_char_room( ch, arg2) ) == NULL ) { send_to_char("It's not here!\n\r", ch);return;} if (!IS_NPC(vict)) {send_to_char("Not on a player!\n\r", ch);return;} ch->shape[dopplevnum] = vict->pIndexData->vnum; ch->shapespec = vict->spec_fun; ch->shape[doppleweapon] = get_weapon_type(vict); sprintf(buf, "%s: %s", ch->name, vict->short_descr); sprintf(buf2, "You shift into %s\n\r", buf); send_to_char(buf2, ch); sprintf(buf2, "$n shifts into %s.\n\r", buf); act(buf2, ch, NULL, NULL, TO_ROOM); return; } void do_toggle(CHAR_DATA *ch, char *argument) { char arg1[MAX_INPUT_LENGTH]; argument = one_argument(argument, arg1); if (!IS_CLASS(ch, CLASS_SHAPE)) {stc("Huh?\n\r", ch);return;} if (arg1[0] == '\0') { send_to_char("Choose mob 'specs' or 'autodecap'\n\r", ch); return; } if (!str_cmp(arg1, "specs")) { if (!IS_CLASS(ch, CLASS_SHAPE)) { send_to_char("You are not a shapeshifter.\n\r", ch); return;} if (ch->shape[spectoggle] != TRUE) ch->shape[spectoggle] = TRUE; else if (ch->shape[spectoggle] == TRUE) ch->shape[spectoggle] = FALSE; if (ch->shape[spectoggle] == TRUE) send_to_char("Specs toggled ON.\n\r", ch); if (ch->shape[spectoggle] == FALSE) send_to_char("Specs toggled OFF.\n\r", ch); return; } if (!str_cmp(arg1, "autodecap")) { if (!IS_CLASS(ch, CLASS_SHAPE)) { send_to_char("You are not a shapeshifter.\n\r", ch); return;} if (ch->shape[autodecap] != TRUE) ch->shape[autodecap] = TRUE; else if (ch->shape[autodecap] == TRUE) ch->shape[autodecap] = FALSE; if (ch->shape[autodecap] == TRUE) send_to_char("Autodecap toggled ON.\n\r", ch); if (ch->shape[autodecap] == FALSE) send_to_char("Autodecap toggled OFF.\n\r", ch); return; } return; } const struct shapeskill_type shape_skill [MAX_SHAPE] = { {"Enhanced Sword", 9, 9, 9, NULL, 70, NULL}, {"Enhanced Dagger", 9, 9, 9, NULL, 70, NULL}, {"Enhanced Whip", 9, 9, 9, NULL, 70, NULL}, {"Enhanced Mace", 9, 9, 9, NULL, 70, NULL}, {"Enhanced Unarmed", 9, 9, 9, NULL, 70, NULL}, {"Enhanced FireArm", 9, 9, 9, NULL, 70, NULL}, {"Spirit", 2449, 2450, 0, NULL, 80, NULL}, {"Enhanced Dodge", 2411, 8123, 9405, NULL, 70, NULL}, {"UltraVision", 6307, 6301, 0, NULL, 40, NULL}, {"ShiftGate", 2318, 25015, 0, NULL, 20, NULL}, {"Fast Healing", 2803, 2226, 2802, NULL, 35, NULL}, {"Scry", 1352, 0, 0, NULL, 20, NULL}, {"Circle", 1101, 18036, 0, NULL, 40, NULL}, {"Rock-Like Skin", 9229, 3413, 0, NULL, 70, NULL}, {"Immobility", 8306, 0, 0, NULL, 70, NULL}, {"Superior Knowledge",2603, 0, 0, NULL, 25, NULL}, {"Speed", 18036, 23400, 0, NULL, 50, NULL}, {"Super Speed", 23400, 0, 0, NULL, 55, NULL}, {"Lightning Speed", 18036, 0, 0, NULL, 60, NULL}, {"Unnatural Strength",9309, 0, 0, NULL, 60, NULL}, {"Enhanced Damage", 6506, 8320, 0, NULL, 60, NULL}, {"AutoDecapitate", 6032, 0, 0, NULL, 15, NULL}, {"Warcry", 4051, 2325, 10412, NULL, 20, NULL}, {"Leave Without Notice",2604, 8515, 0, NULL, 30, NULL}, {"Double Heal", 9900, 401, 14904, NULL, 40, NULL}, {"Double Bullet", 3005, 2332, 8515, NULL, 30, NULL}, {"Unbelieveable Power",901, 0, 0, NULL, 40, NULL}, {"Enhanced Stealth", 11011, 11010, 6303, NULL, 20, NULL}, {"Rejuvination", 2226, 0, 0, NULL, 5, NULL}, {"Randomize Weapon", 5106, 0, 0, NULL, 20, NULL}, {"Enhanced Kick", 14113, 0, 0, NULL, 35, NULL} }; void do_talents(CHAR_DATA *ch, char *argument) { int count; int sn; int usable; char buf[MAX_STRING_LENGTH]; char prefix[5]; buf[0] = '\0'; count = 0; for (sn = 0; sn < MAX_SHAPE; sn++ ) { usable = shape_skill[sn].percent; if (ch->pcdata->shape[sn] > (usable - 1)) sprintf(prefix, "#1*#6"); if (ch->pcdata->shape[sn] < usable) sprintf(prefix, "#5=#6"); if (shape_skill[sn].name != NULL && can_get(ch, sn) && can_use(ch, shape_skill[sn].name)) { count++; if (count == 1) { sprintf(buf, "#7%-20s %s%-3d ", shape_skill[sn].name, prefix, ch->pcdata->shape[sn]);} if (count == 2) { sprintf(buf, "#7%-20s %s%-3d ", shape_skill[sn].name, prefix, ch->pcdata->shape[sn]);} if (count == 3) { sprintf(buf, "#7%-21s %s%-3d\n\r", shape_skill[sn].name, prefix, ch->pcdata->shape[sn]);count = 0;} send_to_char(buf, ch); } } sn = 0; if (ch->shapespec != 0) { for (sn = 0; *spec_table[sn].spec_fun; sn++) { if (spec_table[sn].spec_fun == ch->shapespec) break; }} if (ch->shapespec != NULL){ send_to_char("\n\r#3You are holding special emotions inside you.#n\n\r", ch);sprintf(buf, " %s", spec_table[sn].name);send_to_char(buf, ch);} return; } bool can_get(CHAR_DATA *ch, int sn) { if (able_to_use(ch, sn)) return TRUE; return FALSE; } int get_weapon_type(CHAR_DATA *ch) { OBJ_DATA *obj; if ((obj = get_eq_char( ch, WEAR_WIELD)) == NULL) return UNARMED; if (obj->value[3]== 0) return UNARMED; if (obj->value[3]== 1) return SWORD; if (obj->value[3]== 2) return DAGGER; if (obj->value[3]== 3) return SWORD; if (obj->value[3]== 4) return WHIP; if (obj->value[3]== 5) return UNARMED; if (obj->value[3]== 6) return FIREARM; if (obj->value[3]== 7) return MACE; if (obj->value[3]== 8) return MACE; if (obj->value[3]== 9) return FIREARM; if (obj->value[3]==10) return UNARMED; if (obj->value[3]==11) return DAGGER; if (obj->value[3]==12) return UNARMED; return UNARMED; } bool can_use(CHAR_DATA *ch, char *skill_name) { int sn; if (!IS_CLASS(ch, CLASS_SHAPE)) return FALSE; for (sn = 0; sn < MAX_SHAPE; sn++) { if (!str_cmp(shape_skill[sn].name, skill_name)) break; else continue; } if (shape_skill[sn].name == NULL) return FALSE; if (able_to_use(ch, sn)) return TRUE; return FALSE; } bool will_use(CHAR_DATA *ch, char *skill_name) { bool true = FALSE; bool improve = FALSE; int sn; if (!IS_CLASS(ch, CLASS_SHAPE)) return FALSE; for (sn = 0; sn < MAX_SHAPE; sn++) { if (!str_cmp(shape_skill[sn].name, skill_name)) break; else continue; } if (shape_skill[sn].name == NULL) return FALSE; if (ch->pcdata->shape[sn] == 100) return TRUE; if (!can_use(ch, skill_name)) return FALSE; if (can_use(ch, skill_name) && number_percent() < ch->pcdata->shape[sn]) true = TRUE; if (true == TRUE) {if (number_percent() > ch->pcdata->shape[sn]) improve = TRUE;else improve = FALSE;} if (true == TRUE) {if (number_percent() > ch->pcdata->shape[sn]) improve = TRUE;else improve = FALSE;} if (true == TRUE) {if (number_percent() > ch->pcdata->shape[sn]) improve = TRUE;else improve = FALSE;} if (true == FALSE) {if (number_percent() > ch->pcdata->shape[sn]) improve = TRUE;else improve = FALSE;} if (improve == TRUE && !str_cmp(shape_skill[sn].name, "AutoDecapitate")) ch->pcdata->shape[sn] += 1; if (improve == TRUE) {ch->pcdata->shape[sn] += 1;if (ch->pcdata->shape[sn] > 100) ch->pcdata->shape[sn] = 100;} if (true == TRUE) return TRUE; else return FALSE; } bool able_to_use(CHAR_DATA *ch, int sn) { int hmm = (shape_skill[sn].percent - 1); if (ch->shape[dopplevnum] == 14127) return TRUE; if (shape_skill[sn].name == NULL) return FALSE; if (ch->shape[dopplevnum] > 0) { if (ch->pcdata->shape[sn] > hmm) return TRUE; if (shape_skill[sn].vnum != 9) { if (shape_skill[sn].vnum == ch->shape[dopplevnum]) return TRUE; if (shape_skill[sn].vnum2 == ch->shape[dopplevnum]) return TRUE; if (shape_skill[sn].vnum3 == ch->shape[dopplevnum]) return TRUE; } if (shape_skill[sn].vnum == 9) { if (!str_cmp(shape_skill[sn].name, "Enhanced Sword") && ch->shape[doppleweapon] == SWORD) return TRUE; else if (!str_cmp(shape_skill[sn].name, "Enhanced Dagger") && ch->shape[doppleweapon] == DAGGER) return TRUE; else if (!str_cmp(shape_skill[sn].name, "Enhanced Whip") && ch->shape[doppleweapon] == WHIP) return TRUE; else if (!str_cmp(shape_skill[sn].name, "Enhanced Mace") && ch->shape[doppleweapon] == MACE) return TRUE; else if (!str_cmp(shape_skill[sn].name, "Enhanced Unarmed") && ch->shape[doppleweapon] == UNARMED) return TRUE; else if (!str_cmp(shape_skill[sn].name, "Enhanced Firearm") && ch->shape[doppleweapon] == FIREARM) return TRUE; else return FALSE; } return FALSE; } else { if (ch->pcdata->shape[sn] >= shape_skill[sn].percent) return TRUE; return FALSE; } } void do_shiftgate(CHAR_DATA *ch, char *argument) { CHAR_DATA *victim; char arg[MAX_INPUT_LENGTH]; argument = one_argument(argument, arg); if ( IS_NPC(ch) ) return; if (!will_use(ch, "ShiftGate")) { send_to_char("Huh?\n\r",ch); return; } if (ch->mana < 1500) { send_to_char("You do not have enough vitality to do that!\n\r",ch); return; } if (ch->fight_timer > 0) { send_to_char("You may not open a gate path with a fight timer.\n\r", ch); return; } if ( arg[0] == '\0' ) { send_to_char( "Open a gate path to who?\n\r", ch ); return; } if ((victim = get_char_world(ch, arg)) == NULL) { send_to_char("They aren't here!\n\r", ch); return; } if (ch == victim) { send_to_char("But you're already at yourself!\n\r",ch); return; } if (victim->in_room->vnum == ch->in_room->vnum) { send_to_char("But you're already there!\n\r",ch); return; } if (victim->mana > ch->mana && !IS_NPC(victim)) { send_to_char("Get more mana.\n\r", ch); return; } act("You open up a gate to $N and enter it.", ch, NULL, victim, TO_CHAR); act("$n opens up a gate and enters through it.", ch, NULL, NULL, TO_ROOM); char_from_room(ch); char_to_room(ch,victim->in_room); act("$n appears through a gate, infront of $N.", ch, NULL, victim, TO_ROOM); act("A gate appears and $n steps out.", ch, NULL, victim, TO_VICT); if (!IS_NPC(victim)) ch->mana -= 1000; do_look(ch, ""); WAIT_STATE(ch, 6); return; } void do_warcry(CHAR_DATA *ch, char *argument) { if (!will_use(ch, "Warcry")) {send_to_char("Huh?\n\r", ch);return;} if (ch->shape[warcry] == TRUE) {send_to_char("You are already in a frenzy like state.\n\r", ch); return;} ch->damroll += 295; ch->hitroll += 295; ch->armor -= 295; ch->shape[warcry] = TRUE; send_to_char("You scream out a powerfull battlecry, and you become empowered by the gods.\n\r", ch); act("$n screams out a powerfull warcry, and turns into a mad frenzy.", ch, NULL, NULL, TO_ROOM); WAIT_STATE(ch, 10); return; } void do_leave(CHAR_DATA *ch, char *argument) { if (!will_use(ch, "Leave Without Notice")) {send_to_char("Huh?\n\r", ch);return;} if ( IS_SET(ch->act, PLR_SACREDINVIS) ) { REMOVE_BIT(ch->act, PLR_SACREDINVIS); send_to_char( "You are now able to be seen..\n\r", ch ); act("$n slowly emerges into sight.",ch,NULL,NULL,TO_ROOM); } else { if (has_timer(ch)) return; send_to_char( "You hide yourself.\n\r", ch ); act("$n slowly fades into the background.",ch,NULL,NULL,TO_ROOM); SET_BIT(ch->act, PLR_SACREDINVIS); } return; } void do_double(CHAR_DATA *ch, char *argument) { int a; int times; char arg1[10]; CHAR_DATA *vict = NULL; int sn; char *spell; argument = one_argument(argument, arg1); if (!str_cmp(arg1, "heal")) { if (!will_use(ch, "Double Heal")) { send_to_char("Huh?\n\r", ch); return; } /* I added this in to help out..if its buggy lemme kniow and i'll fix it or just comment it out - smoo (April21st/2k)*/ if (*argument && (vict = get_char_world(ch, argument)) != NULL) ; else vict = NULL; if (vict == NULL) vict = ch; /*^^^^ IF YOU TAKE THIS OUT, change the spell_heal and take out the , vict put in ch in its place!*/ times = number_range(1, 4); times += 2; WAIT_STATE(ch, PULSE_VIOLENCE*.75); act("#4$n's eyes glow bright blue for a moment.",ch,NULL,NULL,TO_ROOM); act("#4Your eyes glow bright blue for a moment.",ch,NULL,NULL,TO_CHAR); for (a=1;a <= times; a++) spell_heal( skill_lookup( "heal" ), ch->level, ch, vict ); } if (!str_cmp(arg1, "bullet")) { if (!will_use(ch, "Double Bullet")) {send_to_char("Huh?\n\r", ch);return;} times = number_range(1, 6); if (ch->fighting == NULL) return; vict = ch->fighting; spell = "high explosive"; if ( ( sn = skill_lookup( spell ) ) < 0 ) return; for (a=1;a <= times; a++) (*skill_table[sn].spell_fun) ( sn, 120, ch, vict ); } WAIT_STATE(ch, PULSE_VIOLENCE*.75); return; } void do_randomize(CHAR_DATA *ch, char *argument) { char arg[MSL]; int special; int sn; int a; OBJ_DATA *obj; argument = one_argument(argument, arg); if (!will_use(ch, "Randomize Weapon")) { send_to_char("Huh?\n\r", ch); return;} if ((obj = get_obj_carry(ch,arg)) == NULL) { send_to_char("You dont have that weapon.\n\r",ch); return; } if (obj->item_type != ITEM_WEAPON) return; special = obj->value[0] / 1000; for (sn = 0; sn == 0; ) { a = number_range(1, MAX_SKILL); if (skill_table[a].spell_fun == spell_null) sn = 0; else if (skill_table[a].name == NULL) sn = 0; else if (skill_table[a].skill_level > ch->trust) sn = 0; else sn = a; } obj->value[0] = sn + (special * 1000); act("$p glows bright blue as $n utters a few words.", ch, obj, NULL, TO_ROOM); act("$p glows bright blue as you utter a few words.", ch, obj, NULL, TO_CHAR); return; } void do_shapecreate(CHAR_DATA *ch, char *argument) { CHAR_DATA *victim; char arg [MAX_INPUT_LENGTH]; int store; int store2; argument = one_argument( argument, arg ); if (IS_NPC(ch)) return; if (ch->generation > 2) { send_to_char("You cannot do that.. yet.\n\r",ch); return; } if ( arg[0] == '\0' ) { send_to_char( "Make whom a shapeshift?\n\r", ch ); return; } if ( ( victim = get_char_room( ch, arg ) ) == NULL ) { send_to_char( "They aren't here.\n\r", ch ); return; } if ( IS_NPC(victim) ) { send_to_char( "Not on NPC's.\n\r", ch ); return; } if ( ch == victim ) { send_to_char("Not on yourself.\n\r", ch ); return; } if (victim->class != 0 || IS_SET(victim->special, SPC_CHAMPION)) { send_to_char("You can't make a classed person a Shape.\n\r", ch); return;} if ( victim->level != LEVEL_AVATAR && !IS_IMMORTAL(victim) ) { send_to_char( "Only on avatars.\n\r", ch ); return; } send_to_char("You are now a shapeshifter!\n\r", victim); send_to_char("Ok.\n\r", ch); victim->class = CLASS_SHAPE; store = victim->trust; store2 = victim->level; victim->trust = 6.9; victim->level = 2; if (victim->trust < store) victim->trust = store; if (victim->level < store2) victim->level = store2; return; } void do_sinduct( CHAR_DATA *ch, char *argument ) { char arg[MAX_INPUT_LENGTH]; CHAR_DATA *victim; one_argument( argument, arg ); if (!IS_CLASS(ch, CLASS_SHAPE) ) { send_to_char("Huh?\n\r",ch); return; } if (ch->generation > 2) { send_to_char("Sorry, you cannot decide a clan member's fate.\n\r",ch); return; } if ( arg[0] == '\0' ) { send_to_char( "Decide who's fate?\n\r", ch ); send_to_char( "Syntax 'Decide <victim>'\n\r", ch ); return; } if ( ( victim = get_char_room( ch, arg ) ) == NULL ) { send_to_char( "They aren't here.\n\r", ch ); return; } if ( IS_NPC(victim) ) { send_to_char( "Not on NPC's.\n\r", ch ); return; } if (!str_cmp(victim->clan,ch->clan) ) { send_to_char( "They're already in your clan.\n\r", ch ); return; } if ( victim->level != LEVEL_AVATAR && !IS_IMMORTAL(victim) ) { send_to_char( "You can only induct avatars.\n\r", ch ); return; } act("You induct $N into your clan.", ch, NULL, victim, TO_CHAR); act("$n inducts $N into his clan.", ch, NULL, victim, TO_NOTVICT); act("$n inducts you in his clan.", ch, NULL, victim, TO_VICT); send_to_char( "You are now in $n's clan.\n\r", victim ); free_string(victim->lord); victim->lord = str_dup(ch->name); free_string(victim->clan); victim->clan = str_dup( ch->clan ); save_char_obj(ch); save_char_obj(victim); return; } void do_sexpel( CHAR_DATA *ch, char *argument ) { char arg[MAX_INPUT_LENGTH]; CHAR_DATA *victim; one_argument( argument, arg ); if (!IS_CLASS(ch, CLASS_SHAPE) ) { send_to_char("Huh?\n\r",ch); return; } if (ch->generation > 2) { send_to_char("Sorry, you cannot decide a clan member's fate.\n\r",ch); return; } if ( ( victim = get_char_room( ch, arg ) ) == NULL ) { send_to_char( "They aren't here.\n\r", ch ); return; } if ( IS_NPC(victim) ) { send_to_char( "Not on NPC's.\n\r", ch ); return; } if ( arg[0] == '\0' ) { send_to_char( "Expel who?\n\r", ch ); send_to_char( "Syntax 'Expel <victim>'\n\r", ch ); return; } if (str_cmp(victim->clan,ch->clan) ) { send_to_char( "They're aren't in your clan.\n\r", ch ); return; } if ( victim->level != LEVEL_AVATAR && !IS_IMMORTAL(victim) ) { send_to_char( "You can only expel avatars.\n\r", ch ); return; } act("You expel $N from your clan.", ch, NULL, victim, TO_CHAR); act("$n expels $N from his clan.", ch, NULL, victim, TO_NOTVICT); act("$n expelled you from his clan.", ch, NULL, victim, TO_VICT); send_to_char( "You are now clanless.\n\r", victim ); free_string(victim->lord); free_string(victim->clan); victim->clan = str_dup( "" ); victim->lord = str_dup( "" ); save_char_obj(ch); save_char_obj(victim); return; }