From: Christian Duvall Subject: Multi Attacks for mobiles Code developed by Chris Rehbein(lint@jhu.edu) and I for multi attacks on mobiles. This works on a percentage based system where a mob has prob of hitting anywhere from 0-100% on each of its, 2nd, 3rd, and 4th attacks. Any problems, comments, questions- good/bad email me chris@dp.net ****** In structs.h ****** In: mob_special_data add: int attack1; int attack2; int attack3; ***** fight.c ****** In: perform_violence() Add: int perc, val, apr; if (IS_NPC(ch)) { perc = number(1, 101); val = ch->mob_specials.attack1; if (val > perc) { apr++; perc = number(1,101); val = ch->mob_specials.attack2; if (val > perc) { apr++; perc = number(1,101); val = ch->mob_specials.attack3; if (val > perc) { apr++; } } } } /* NOT MY CODE, just in case you didnt use the same multi attack for players code as I did */ apr = MAX(-1, MIN(apr, 4)); if (apr >= 0) { for (; apr >= 0 && FIGHTING(ch); apr--) hit(ch, FIGHTING(ch), TYPE_UNDEFINED); } ****** db.c **** Find: (in the E-specs) CASE("Cha") { RANGE(3, 25); mob_proto[i].real_abils.cha = num_arg; } Add: CASE("Att1") { RANGE(1, 100); mob_proto[i].mob_specials.attack1 = num_arg; } CASE("Att2") { RANGE(1, 100); mob_proto[i].mob_specials.attack2 = num_arg; } CASE("Att3") { RANGE(1, 100); mob_proto[i].mob_specials.attack3 = num_arg; } ******* medit.c ****** Find: #define S_KEEPER(shop) ((shop)->keeper) Add: #define GET_ATTACK1(mob) ((mob)->mob_specials.attack1) #define GET_ATTACK2(mob) ((mob)->mob_specials.attack2) #define GET_ATTACK3(mob) ((mob)->mob_specials.attack3) Find: if(GET_CHA(mob) != 11) fprintf(mob_file, "Cha: %d\n", GET_CHA(mob)); Add: f(GET_ATTACK1(mob) != 0) fprintf(mob_file, "Att1: %d\n", GET_ATTACK1(mob)); if(GET_ATTACK2(mob) != 0) fprintf(mob_file, "Att2: %d\n", GET_ATTACK2(mob)); if(GET_ATTACK3(mob) != 0) fprintf(mob_file, "Att3: %d\n", GET_ATTACK3(mob)); Find: "%sI%s) Position : %s%s\r\n" "%sJ%s) Default : %s%s\r\n" "%sK%s) Attack : %s%s\r\n" < etc > "%sQ%s) Quit\r\n" "Enter choice : ", Change to: "%sI%s) Position : %s%s\r\n" "%sJ%s) Default : %s%s\r\n" "%sK%s) Attack : %s%s\r\n" "%sL%s) Attack-2 : %s%d\r\n" "%sM%s) Attack-3 : %s%d\r\n" "%sN%s) Attack-4 : %s%d\r\n" "%sO%s) NPC Flags : %s%s\r\n" "%sP%s) AFF Flags : %s%s\r\n" "%sQ%s) Quit\r\n" "Enter choice : ", Find: grn, nrm, yel, attack_hit_text[GET_ATTACK(mob)].singular, Add right below: grn, nrm, yel, GET_ATTACK1(mob), grn, nrm, yel, GET_ATTACK2(mob), grn, nrm, yel, GET_ATTACK3(mob), Find: case 'k': case 'K': OLC_MODE(d) = MEDIT_ATTACK; medit_disp_attack_types(d); return; erase up to default, and change to: case 'l': case 'L': OLC_MODE(d) = MEDIT_ATTACK1; i++; break; case 'm': case 'M': OLC_MODE(d) = MEDIT_ATTACK2; i++; break; case 'n': case 'N': OLC_MODE(d) = MEDIT_ATTACK3; i++; break; case 'o': case 'O': OLC_MODE(d) = MEDIT_NPC_FLAGS; medit_disp_mob_flags(d); return; case 'p': case 'P': OLC_MODE(d) = MEDIT_AFF_FLAGS; medit_disp_aff_flags(d); return; Find: case MEDIT_ATTACK: GET_ATTACK(OLC_MOB(d)) = MAX(0, MIN(NUM_ATTACK_TYPES-1, atoi(arg))); break; Add: case MEDIT_ATTACK1: GET_ATTACK1(OLC_MOB(d)) = MAX(0, MIN(200, atoi(arg))); break; case MEDIT_ATTACK2: GET_ATTACK2(OLC_MOB(d)) = MAX(0, MIN(200, atoi(arg))); break; case MEDIT_ATTACK3: GET_ATTACK3(OLC_MOB(d)) = MAX(0, MIN(200, atoi(arg))); break; Christian Duvall chris@dp.net