I am working on a major overhaul MUD based on Circle bpl 11, and I have a few questions. Firstly, I am lkooking into making it so that mobs can have skills (ie. A mob that can dodge or cast spells, or steal...without spec_procs for individual commands) and that use this skill definition to determine what level they can teach a skill up to if they are a guildmaster. For example, a guildmaster in midgaard has fireball at 50%. He can only teach a PC up to 50%, then they must seek out a better master. I am thinking of making this in mob as a sort of command like in objects for affects. I got it working, BUT, because all mobs use the same skill settings (damn them pointers) all mobs will have the same lkevel of skills. (A fido with 85% dodge? I dunnot think so!) Is there a way to give only certain mobs their own skills, and the rest can go to pointer heck. (I'm still new in C, so be kind to a pointer fearing newbie coder) Also, does anyone want SeeFu's weather code? It was based on the weather code from NoMUD, and I have added a lot of interesting things (lightning and tornadoes that can hurt or kill, heat waves that make players need more water, severe storms that make more movement needed) I am about to completely do an overhaul on the weather system to make it VERY detailed (wind speed/direction, humidty, temperature, seasons) and I don't mind giving out the old code. Finally, I got LostLands missile weapon code and implemented it. (A big hit I must say) and then I made a few alterations to have it so that you could aim it so that the weapon had to go a minimum distance before it would even check to see if it hits (like a torpedo, needs a distance to 'arm' itself) It worked great for missile hurling weapons (bows, crossbows, my arm mounted sidewinder missile launcher :) but thrown weapons stopped hitting (stuff like spears, boomerangs, etc.) Here is the code I have. (in act.offensive.c) static char *fire_msg[] = { "You are not holding something to throw.\r\n", "You must wield the correct weapon.\r\n", "You are not holding the right missile type for that weapon.\r\n", "You must specify a correct direction.\r\n", "You pull back your arm and throw $p.", "You take aim and fire $p.", "With herculean might, $n throws $p.", "With skill equal to that of William Tell, $n fires $p.", "Losing it's momentum, $p falls to the ground.", "Miraculously, $p returns to $n.", "Miraculously, $p returns to you." "\n" }; extern char *dirs[]; void fire_in_direction(struct char_data *ch, struct obj_data *obj, int look_type, int distance, int dist_set); ACMD(do_fire) { static char arg2[MAX_INPUT_LENGTH]; struct obj_data * obj = GET_EQ(ch, WEAR_WIELD); int look_type, distance; int dist_set; half_chop(argument, arg, arg2); if (!*arg || (look_type = search_block(arg, dirs, FALSE)) < 0) { send_to_char(fire_msg[3], ch); return; } if (ROOM_FLAGGED(ch->in_room, ROOM_PEACEFUL)) { send_to_char("Divine intervention prevents you from doing that.\r\n", ch); return; } dist_set = 0; if (subcmd == 1) { obj = GET_EQ(ch, WEAR_DUALWIELD); if (!obj && !GET_EQ(ch, WEAR_WIELD)) { if (!GET_EQ(ch, WEAR_HOLD)) { send_to_char(fire_msg[0], ch); return; } else obj = unequip_char(ch, WEAR_HOLD); } else if (!obj) { obj = unequip_char(ch, WEAR_WIELD); } else { obj = unequip_char(ch, WEAR_DUALWIELD); } if (GET_OBJ_TYPE(obj) == ITEM_MISSILE) distance = 2; else distance = 1; } else { if (!obj || GET_OBJ_TYPE(obj) != ITEM_FIREWEAPON) { send_to_char(fire_msg[1], ch); return; } if (!GET_EQ(ch, WEAR_LOAD) || GET_OBJ_TYPE(GET_EQ(ch, WEAR_LOAD)) != ITEM_MISSILE || GET_OBJ_VAL(obj, 3) != GET_OBJ_VAL(GET_EQ(ch, WEAR_LOAD), 3)) { send_to_char(fire_msg[2], ch); return; } obj = unequip_char(ch, WEAR_LOAD); distance = GET_OBJ_VAL(obj, 0); if (*arg2) { dist_set = MAX(1, MIN(atoi(arg2), distance)); dist_set = MIN(dist_set, 10); } act(fire_msg[3 + subcmd], FALSE, ch, obj, 0, TO_CHAR); act(fire_msg[5 + subcmd], FALSE, ch, obj, 0, TO_ROOM); fire_in_direction(ch, obj, look_type, distance, dist_set); WAIT_STATE(ch, PULSE_VIOLENCE * 1); } } bool range_hit(struct char_data *ch, struct char_data * victim, struct obj_data *obj); bool fire_at_char(struct char_data *ch, struct char_data * list, struct obj_data * obj, int dir, bool do_hit); void fire_in_direction(struct char_data *ch, struct obj_data *obj, int dir, int distance, int dist_set) { int temp_room = ch->in_room; struct char_data *vict; bool contin = TRUE; while (contin && EXITN(temp_room, dir) && (distance-- > 0) && !IS_SET(EXITN(temp_room, dir)->exit_info, EX_CLOSED)) { temp_room = EXITN(temp_room, dir)->to_room; if (dist_set-- < 2) contin = fire_at_char(ch, world[temp_room].people, obj, dir, TRUE); else contin = fire_at_char(ch, world[temp_room].people, obj, dir, FALSE); } if (IS_OBJ_STAT(obj, ITEM_RETURNING)) { act(fire_msg[10], FALSE, ch, obj, 0, TO_CHAR); act(fire_msg[9], FALSE, ch, obj, 0, TO_ROOM); obj_to_char(obj, ch); } else { obj_to_room(obj, temp_room); if ((vict = world[temp_room].people)) { act(fire_msg[8], FALSE, vict, obj, 0, TO_CHAR); act(fire_msg[8], FALSE, vict, obj, 0, TO_ROOM); } } /* WAIT_STATE(ch, PULSE_VIOLENCE * 4); */ } (in fight.c) bool range_hit(struct char_data *ch, struct char_data * victim, struct obj_data *obj) { int w_type = 315, victim_ac, calc_thaco, dam = 0, diceroll; extern int thaco[NUM_CLASSES][LVL_IMPL+1]; extern struct str_app_type str_app[]; extern struct dex_app_type dex_app[]; if (!IS_NPC(ch)) calc_thaco = thaco[(int) GET_CLASS(ch)][(int) GET_LEVEL(ch)]; else calc_thaco = 20; calc_thaco -= dex_app[GET_DEX(ch)].miss_att; calc_thaco -= GET_HITROLL(ch); calc_thaco -= (int) ((GET_INT(ch) - 13) / 1.5); calc_thaco -= (int) ((GET_WIS(ch) - 13) / 1.5); diceroll = number(1, 20); victim_ac = GET_AC(victim) / 10; if (AWAKE(victim)) victim_ac += dex_app[GET_DEX(victim)].defensive; if (GET_POS(victim) == POS_SITTING) victim_ac -= 1; if (GET_POS(victim) <= POS_RESTING) victim_ac -= 2; victim_ac = MAX(-10, victim_ac); if ((((diceroll < 20) && AWAKE(victim)) & ((diceroll == 1) || ((calc_thaco - diceroll) > victim_ac)))) { return FALSE; } else { dam = str_app[STRENGTH_APPLY_INDEX(ch)].todam; if (GET_OBJ_TYPE(obj) == ITEM_MISSILE) { dam += GET_DAMROLL(ch); dam += dice(GET_OBJ_VAL(obj, 1), GET_OBJ_VAL(obj, 2)); } if (GET_OBJ_TYPE(obj) == ITEM_WEAPON) dam += (GET_OBJ_VAL(obj, 0) + dice(GET_OBJ_VAL(obj, 1), GET_OBJ_VAL(obj, 2)) /2); else dam += number(0, (GET_OBJ_WEIGHT(obj) / 5)); dam = MAX(1, dam); damage(ch, victim, dam, w_type); return TRUE; } return FALSE; } const char *opp_dir[] = { "south", "west", "north", "east", "area below you", "area above you", "\n" }; bool fire_at_char(struct char_data *ch, struct char_data * list, struct obj_data * obj, int dir, bool do_hit) { struct char_data *vict = list; char msgbuf[256]; while (vict) { sprintf(msgbuf, "$p just flew in from %s.", opp_dir[dir]); act(msgbuf, FALSE, vict, obj, 0, TO_CHAR); if (do_hit) { if (range_hit(ch, vict, obj)) { if (vict) { if (IS_NPC(vict) && !IS_NPC(ch) && GET_POS(ch) > POS_STUNNED) { SET_BIT(MOB_FLAGS(vict), MOB_MEMORY); remember(vict, ch); HUNTING(vict) = ch; } } return FALSE; } } send_to_char("It flies past you harmlessly.\r\n", vict); vict = vict->next_in_room; } return TRUE; } (end of snippet) Can anyone help me find my bugs. ------------------------------------------------------------------ Ryan A.J. Biggs email-ae744@freenet.toronto.on.ca Doppleganger, Charon the Boatman and member of Dieties Anonymous Owner of a 100% organic wibble and Plasma lamp, and rubber chicken Keeper of the sacred butcher knife and the Cloak of Shadows Compiler of the Net.Psionics.Handbook ------------------------------------------------------------------
This archive was generated by hypermail 2b30 : 12/07/00 PST