Somebody Wrote: > > > > After an evening of coding fun, I've finally altered do_cast > > into do_mpcast, There was a number of people who said that > > they were having problems with MobProgs and casting spells, > > I then added cases to the edesc feilds in db.c. > > I believe it looked something like this, > > case ("Fireball"): { > RANGE(1, 100); > GET_SKILL(mob_proto, SPELL_FIREBALL) = num_arg; > break; > } > Instead of modifying the mobs database format, I just came up with a system of calculating percentage for the skill based on the mobs level. I then removed the checks to see if the Mob new the spell and gave the mobs all available spells. The chance of success is based on their level. > > The only problem is that every skill/spell you want the mob to use has to > be added as a case here. Did you find an easier or more efficient way? Well this may not be the most efficient way of doing it, (in fact I plan to rewrite my hack) but here is my modified do_cast: ACMD(do_cast) { struct char_data *tch = NULL; struct obj_data *tobj = NULL; char *s, *t; int mana, spellnum, i, target = 0, mob_percent = 0, dieroll = 0; if (IS_NPC(ch)) { /* set the percentage that a mob needs to sucessfully cast a spell */ if (GET_LEVEL(ch) < 3) mob_percent = 10; if (GET_LEVEL(ch) >= 3 && GET_LEVEL(ch) < 6) mob_percent = 20; if (GET_LEVEL(ch) >= 6 && GET_LEVEL(ch) < 9) mob_percent = 30; if (GET_LEVEL(ch) >= 9 && GET_LEVEL(ch) < 12) mob_percent = 40; if (GET_LEVEL(ch) >= 12 && GET_LEVEL(ch) < 15) mob_percent = 50; if (GET_LEVEL(ch) >= 15 && GET_LEVEL(ch) < 18) mob_percent = 60; if (GET_LEVEL(ch) >= 18 && GET_LEVEL(ch) < 21) mob_percent = 70; if (GET_LEVEL(ch) >= 21 && GET_LEVEL(ch) < 24) mob_percent = 80; if (GET_LEVEL(ch) >= 24 && GET_LEVEL(ch) < 28) mob_percent = 90; if (GET_LEVEL(ch) >= 28 && GET_LEVEL(ch) < 30) mob_percent = 95; if (GET_LEVEL(ch) >= 30) mob_percent = 99; } /* get: blank, spell name, target name */ s = strtok(argument, "'"); if (s == NULL) { send_to_char("Cast what where?\r\n", ch); return; } if (!IS_NPC(ch)) { if (GET_CLASS(ch) == CLASS_PALADIN) if (!IS_GOOD(ch)) { send_to_char("The Gods have taken your powers away for not being of Good Alignment.\r\n", ch); act("$n hands are slapped by the Gods.", FALSE, ch, 0, 0, TO_ROOM); return; } } s = strtok(NULL, "'"); if (s == NULL) { send_to_char("Spell names must be enclosed in the Holy Magic Symbols: '\r\n", ch); return; } t = strtok(NULL, "\0"); /* spellnum = search_block(s, spells, 0); */ spellnum = find_skill_num(s); if ((spellnum < 1) || (spellnum > MAX_SPELLS)) { send_to_char("Cast what?!?\r\n", ch); return; } if (GET_LEVEL(ch) < SINFO.min_level[(int) GET_CLASS(ch)] && !IS_NPC(ch)) { send_to_char("You do not know that spell!\r\n", ch); return; } if (GET_SKILL(ch, spellnum) == 0 && !IS_NPC(ch)) { send_to_char("You are unfamiliar with that spell.\r\n", ch); return; } /* Find the target */ if (t != NULL) { one_argument(strcpy(arg, t), t); skip_spaces(&t); } if (IS_SET(SINFO.targets, TAR_IGNORE)) { target = TRUE; } else if (t != NULL && *t) { if (!target && (IS_SET(SINFO.targets, TAR_CHAR_ROOM))) { if ((tch = get_char_room_vis(ch, t)) != NULL) target = TRUE; } if (!target && IS_SET(SINFO.targets, TAR_CHAR_WORLD)) if ((tch = get_char_vis(ch, t))) target = TRUE; if (!target && IS_SET(SINFO.targets, TAR_OBJ_INV)) if ((tobj = get_obj_in_list_vis(ch, t, ch->carrying))) target = TRUE; if (!target && IS_SET(SINFO.targets, TAR_OBJ_EQUIP)) { for (i = 0; !target && i < NUM_WEARS; i++) if (GET_EQ(ch, i) && !str_cmp(t, GET_EQ(ch, i)->name)) { tobj = GET_EQ(ch, i); target = TRUE; } } if (!target && IS_SET(SINFO.targets, TAR_OBJ_ROOM)) if ((tobj = get_obj_in_list_vis(ch, t, world[ch->in_room].contents))) target = TRUE; if (!target && IS_SET(SINFO.targets, TAR_OBJ_WORLD)) if ((tobj = get_obj_vis(ch, t))) target = TRUE; } else { /* if target string is empty */ if (!target && IS_SET(SINFO.targets, TAR_FIGHT_SELF)) if (FIGHTING(ch) != NULL) { tch = ch; target = TRUE; } if (!target && IS_SET(SINFO.targets, TAR_FIGHT_VICT)) if (FIGHTING(ch) != NULL) { tch = FIGHTING(ch); target = TRUE; } /* if no target specified, and the spell isn't violent, default to self */ if (!target && IS_SET(SINFO.targets, TAR_CHAR_ROOM) && !SINFO.violent) { tch = ch; target = TRUE; } if (!target) { sprintf(buf, "Upon %s should the spell be cast?\r\n", IS_SET(SINFO.targets, TAR_OBJ_ROOM | TAR_OBJ_INV | TAR_OBJ_WORLD) ? "what" : "who"); send_to_char(buf, ch); return; } } if (target && (tch == ch) && SINFO.violent) { send_to_char("You shouldn't cast that on yourself -- could be bad for your health!\r\n", ch); return; } if (!target) { send_to_char("Cannot find the target of your spell!\r\n", ch); return; } mana = mag_manacost(ch, spellnum); if ((mana > 0) && (GET_MANA(ch) < mana) && (GET_LEVEL(ch) < LVL_IMMORT)) { send_to_char("You haven't the energy to cast that spell!\r\n", ch); return; } /* You throws the dice and you takes your chances.. 101% is total failure */ dieroll = number(0, 101); if (!IS_NPC(ch)) { if (dieroll > GET_SKILL(ch, spellnum) && !IS_NPC(ch)) { WAIT_STATE(ch, PULSE_VIOLENCE); if (!tch || !skill_message(0, ch, tch, spellnum)) send_to_char("You lost your concentration!\r\n", ch); if (mana > 0) GET_MANA(ch) = MAX(0, MIN(GET_MAX_MANA(ch), GET_MANA(ch) - (mana >> 1))); if (SINFO.violent && tch && IS_NPC(tch)) hit(tch, ch, TYPE_UNDEFINED); } else { /* cast spell returns 1 on success; subtract mana & set waitstate */ if (cast_spell(ch, tch, tobj, spellnum)) { WAIT_STATE(ch, PULSE_VIOLENCE); if (mana > 0) GET_MANA(ch) = MAX(0, MIN(GET_MAX_MANA(ch), GET_MANA(ch) - mana)); } } } else { if (dieroll > mob_percent) { WAIT_STATE(ch, PULSE_VIOLENCE); if (!tch || !skill_message(0, ch, tch, spellnum)) send_to_char("You lost your concentration!\r\n", ch); if (mana > 0) GET_MANA(ch) = MAX(0, MIN(GET_MAX_MANA(ch), GET_MANA(ch) - (mana >> 1))); if (SINFO.violent && tch) hit(tch, ch, TYPE_UNDEFINED); } else { if (cast_spell(ch, tch, tobj, spellnum)) { WAIT_STATE(ch, PULSE_VIOLENCE); } } } +-----------------------------------------------------------+ | Ensure that you have read the CircleMUD Mailing List FAQ: | | http://cspo.queensu.ca/~fletcher/Circle/list_faq.html | +-----------------------------------------------------------+
This archive was generated by hypermail 2b30 : 12/18/00 PST