diff -BbuprN -x '*.o' src/srcbak/act.wizard.c src/src/act.wizard.c --- src/srcbak/act.wizard.c 2004-10-03 13:17:09.000000000 -0400 +++ src/src/act.wizard.c 2004-10-02 17:01:02.000000000 -0400 @@ -532,7 +533,7 @@ void list_zone_commands_room(struct char void do_stat_room(struct char_data *ch, room_rnum location) { - char buf2[MAX_STRING_LENGTH]; + char buf2[MAX_STRING_LENGTH], buf[MAX_STRING_LENGTH]; struct extra_descr_data *desc; struct room_data *rm; int i, found, column; @@ -554,6 +555,9 @@ void do_stat_room(struct char_data *ch, sprintbitarray(rm->room_flags, room_bits, RF_ARRAY_MAX, buf2); send_to_char(ch, "SpecProc: %s, Flags: %s\r\n", rm->func == NULL ? "None" : "Exists", buf2); + sprintbitarray(rm->spells, spell_list, SP_ARRAY_MAX, buf); + send_to_char(ch, "Room has these Anti-spell affects: [%s%s%s]\r\n", CCGRN(ch, C_NRM), buf, CCNRM(ch, C_NRM)); + send_to_char(ch, "Description:\r\n%s", rm->description ? rm->description : " None.\r\n"); if (rm->ex_description) { diff -BbuprN -x '*.o' src/srcbak/constants.c src/src/constants.c --- src/srcbak/constants.c 2004-10-02 16:45:05.000000000 -0400 +++ src/src/constants.c 2004-10-02 17:06:51.000000000 -0400 @@ -362,6 +362,133 @@ const char *connected_types[] = { }; +const char *spell_list[] = { + "Reserved", + "Armor", + "Teleport", + "Bless", + "Blindness", + "Burning_hands", + "Call_lightning", + "Charm", + "Chill_touch", + "Clone", + "Color_spray", + "Control_weather", + "Create_food", + "Create_water", + "Cure_blind", + "Cure_critic", + "Cure_light", + "Curse", + "Detect_align", + "Detect_invis", + "Detect_magic", + "Detect_poison", + "Dispel_evil", + "Earthquake", + "Enchant_weapon", + "Energy_drain", + "Fireball", + "Harm", + "Heal", + "Invisible", + "Lightning_bolt", + "Locate_object", + "Magic_missile", + "Poison", + "Prot_from_evil", + "Remove_Curse", + "Sanctuary", + "Shocking_grasp", + "Sleep", + "Strength", + "Summon", + "Ventriloquate", + "Word_of_recall", + "Remove_poison", + "Sense_life", + "Animate_dead", + "Dispel_good", + "Group_armor", + "Group_heal", + "Group_recall", + "Infravision", + "Waterwalk", + "Portal", + "Paralize", + "Cause_light", + "Cause_critic", + "Identify", + "Unused", + "Unused", + "Unused", + "Unused", + "Unused", + "Unused", + "Unused", + "Unused", + "Unused", + "Unused", + "Unused", + "Unused", + "Unused", + "Unused", + "Unused", + "Unused", + "Unused", + "Unused", + "Unused", + "Unused", + "Unused", + "Unused", + "Unused", + "Unused", + "Unused", + "Unused", + "Unused", + "Unused", + "Unused", + "Unused", + "Unused", + "Unused", + "Unused", + "Unused", + "Unused", + "Unused", + "Unused", + "Unused", + "Unused", + "Unused", + "Unused", + "Unused", + "Unused", + "Unused", + "Unused", + "Unused", + "Unused", + "Unused", + "Unused", + "Unused", + "Unused", + "Unused", + "Unused", + "Backstab", + "Bash", + "Hide", + "Kick", + "Pick_lock", + "Lay_hands", + "Rescue", + "Sneak", + "Steal", + "Track", + "Disarm", + "Turning", + "\n" +}; + + /* * WEAR_x - for eq list * Not use in sprinttype() so no \n. diff -BbuprN -x '*.o' src/srcbak/constants.h src/src/constants.h --- src/srcbak/constants.h 2004-10-02 16:45:05.000000000 -0400 +++ src/src/constants.h 2004-10-02 16:51:51.000000000 -0400 @@ -6,6 +6,7 @@ extern const char *abbr_dirs[]; extern const char *room_bits[]; extern const char *exit_bits[]; extern const char *sector_types[]; +extern const char *spell_list[]; extern const char *genders[]; extern const char *position_types[]; extern const char *player_bits[]; diff -BbuprN -x '*.o' src/srcbak/db.c src/src/db.c --- src/srcbak/db.c 2004-10-03 13:25:24.000000000 -0400 +++ src/src/db.c 2004-10-02 17:02:13.000000000 -0400 @@ -1073,7 +1073,7 @@ void parse_room(FILE *fl, int virtual_nr int t[10], i, retval; char line[READ_SIZE], flags[128], flags2[128], flags3[128]; char flags4[128], buf2[MAX_STRING_LENGTH], buf[128]; - struct extra_descr_data *new_descr; + char flags5[READ_SIZE], flags6[READ_SIZE], flags7[READ_SIZE], flags8[READ_SIZE]; struct extra_descr_data *new_descr; char letter; /* This really had better fit or there are other problems. */ @@ -1099,7 +1099,7 @@ void parse_room(FILE *fl, int virtual_nr exit(1); } - if (((retval = sscanf(line, " %d %s %s %s %s %d ", t, flags, flags2, flags3, flags4, t + 2)) == 3) && (bitwarning == TRUE)) { + if (((retval = sscanf(line, " %d %s %s %s %s %d %d %d %d %d ", t, flags, flags2, flags3, flags4, t + 2, t + 3, t + 4, t + 5, t + 6)) == 3) && (bitwarning == TRUE)) { log("WARNING: Conventional worldfiles detected. Please read 128bit.readme."); exit(1); } else if ((retval == 3) && (bitwarning == FALSE)) { @@ -1138,6 +1138,20 @@ void parse_room(FILE *fl, int virtual_nr world[room_nr].room_flags[3] = asciiflag_conv(flags4); world[room_nr].sector_type = t[2]; + + sprintf(flags, "object #%d", virtual_nr); /* sprintf: OK (until 399-bit integers) */ + for(taeller=0; taeller < AF_ARRAY_MAX; taeller++) + check_bitvector_names(world[room_nr].room_flags[taeller], room_bits_count, flags, "room"); + } else if (retval == 10) { + int taeller; + + world[room_nr].room_flags[0] = asciiflag_conv(flags); + world[room_nr].room_flags[1] = asciiflag_conv(flags2); + world[room_nr].room_flags[2] = asciiflag_conv(flags3); + world[room_nr].room_flags[3] = asciiflag_conv(flags4); + + world[room_nr].sector_type = t[2]; + sprintf(flags, "object #%d", virtual_nr); /* sprintf: OK (until 399-bit integers) */ for(taeller=0; taeller < AF_ARRAY_MAX; taeller++) check_bitvector_names(world[room_nr].room_flags[taeller], room_bits_count, flags, "room"); @@ -1165,6 +1179,25 @@ void parse_room(FILE *fl, int virtual_nr exit(1); } switch (*line) { + case 'A': + if (!get_line(fl, line)) { + log("SYSERR: Expecting Anti_room_flags in room #%d but file ended!", + virtual_nr); + exit(1); + } + if ((retval = sscanf(line, "%s %s %s %s %s %s %s %s", flags, flags2, flags3, flags4, flags5, flags6, flags7, flags8)) != 8) { + log("SYSERR: Format error in Anti_room_flags of room #%d Number count %d", virtual_nr, retval); + exit(1); + } + world[room_nr].spells[0] = asciiflag_conv(flags); + world[room_nr].spells[1] = asciiflag_conv(flags2); + world[room_nr].spells[2] = asciiflag_conv(flags3); + world[room_nr].spells[3] = asciiflag_conv(flags4); + world[room_nr].spells[4] = asciiflag_conv(flags5); + world[room_nr].spells[5] = asciiflag_conv(flags6); + world[room_nr].spells[6] = asciiflag_conv(flags7); + world[room_nr].spells[7] = asciiflag_conv(flags8); + break; case 'D': setup_dir(fl, room_nr, atoi(line + 1)); break; diff -BbuprN -x '*.o' src/srcbak/genwld.c src/src/genwld.c --- src/srcbak/genwld.c 2004-10-03 13:25:55.000000000 -0400 +++ src/src/genwld.c 2004-10-02 16:53:54.000000000 -0400 @@ -295,6 +295,8 @@ int save_rooms(zone_rnum rzone) char buf[MAX_STRING_LENGTH], buf1[MAX_STRING_LENGTH]; char rbuf1[MAX_STRING_LENGTH], rbuf2[MAX_STRING_LENGTH]; char rbuf3[MAX_STRING_LENGTH], rbuf4[MAX_STRING_LENGTH]; + char rbuf5[MAX_STRING_LENGTH], rbuf6[MAX_STRING_LENGTH]; + char rbuf7[MAX_STRING_LENGTH], rbuf8[MAX_STRING_LENGTH]; #if CIRCLE_UNSIGNED_INDEX if (rzone == NOWHERE || rzone > top_of_zone_table) { @@ -403,6 +405,21 @@ int save_rooms(zone_rnum rzone) "%s~\n", xdesc->keyword, buf); } } + + /* if Room anti spell exists write out all existing values */ + sprintascii(rbuf1, room->spells[0]); + sprintascii(rbuf2, room->spells[1]); + sprintascii(rbuf3, room->spells[2]); + sprintascii(rbuf4, room->spells[3]); + sprintascii(rbuf5, room->spells[4]); + sprintascii(rbuf6, room->spells[5]); + sprintascii(rbuf7, room->spells[6]); + sprintascii(rbuf8, room->spells[7]); + fprintf(sf, "A\n" + "%s %s %s %s %s %s %s %s\n", + rbuf1, rbuf2, rbuf3, rbuf4, rbuf5, rbuf6, rbuf7, rbuf8); + + fprintf(sf, "S\n"); script_save_to_disk(sf, room, WLD_TRIGGER); } diff -BbuprN -x '*.o' src/srcbak/oasis.h src/src/oasis.h --- src/srcbak/oasis.h 2004-10-03 13:20:39.000000000 -0400 +++ src/src/oasis.h 2004-10-02 16:58:26.000000000 -0400 @@ -278,6 +278,8 @@ extern const char *nrm, *grn, *cyn, *yel #define REDIT_EXTRADESC_KEY 15 #define REDIT_EXTRADESC_DESCRIPTION 16 #define REDIT_DELETE 17 +#define REDIT_ANTI_SPELLS 18 + /* * Submodes of ZEDIT connectedness. @@ -528,6 +530,7 @@ void redit_disp_sector_menu(struct descr void redit_disp_menu(struct descriptor_data *d); void redit_parse(struct descriptor_data *d, char *arg); void free_room(struct room_data *room); +void redit_disp_spell_menu(struct descriptor_data *d); ACMD(do_oasis_redit); void sedit_setup_new(struct descriptor_data *d); diff -BbuprN -x '*.o' src/srcbak/redit.c src/src/redit.c --- src/srcbak/redit.c 2004-10-03 13:16:47.000000000 -0400 +++ src/src/redit.c 2004-10-02 17:03:14.000000000 -0400 @@ -36,6 +36,7 @@ extern const char *sector_types[]; extern const char *exit_bits[]; extern struct zone_data *zone_table; extern struct descriptor_data *descriptor_list; +extern struct spell_info_type spell_info[]; /*------------------------------------------------------------------------*/ @@ -417,6 +418,25 @@ void redit_disp_exit_flag_menu(struct de OLC_MODE(d) = REDIT_EXIT_DOORFLAGS; } +void redit_disp_spell_menu(struct descriptor_data *d) +{ + int counter, columns = 0; + char buf[MAX_STRING_LENGTH]; + + get_char_colors(d->character); + clear_screen(d); + + for (counter = 1; counter < MAX_CUR_SKILLS; counter++) { + write_to_output(d, "%s%2d%s) %s%-20.20s %s", grn, counter + 1, nrm, yel, + spell_info[counter].name, !(++columns % 3) ? "\r\n" : ""); + } + + sprintbitarray(OLC_ROOM(d)->spells, spell_list, SP_ARRAY_MAX, buf); + write_to_output(d, "\r\nAnti spells assigned: &R%s&n\r\n" + "Enter spell choice (0 to exit) : ", buf); + OLC_MODE(d) = REDIT_ANTI_SPELLS; +} + /* * For room flags. @@ -459,6 +479,7 @@ void redit_disp_sector_menu(struct descr */ void redit_disp_menu(struct descriptor_data *d) { + char buf[MAX_STRING_LENGTH]; char buf1[MAX_STRING_LENGTH]; char buf2[MAX_STRING_LENGTH]; struct room_data *room; @@ -467,6 +488,7 @@ void redit_disp_menu(struct descriptor_d clear_screen(d); room = OLC_ROOM(d); + sprintbitarray(room->spells, spell_list, SP_ARRAY_MAX, buf); sprintbitarray(room->room_flags, room_bits, RF_ARRAY_MAX, buf1); sprinttype(room->sector_type, sector_types, buf2, sizeof(buf2)); write_to_output(d, @@ -484,7 +506,6 @@ void redit_disp_menu(struct descriptor_d "%sH%s) Extra descriptions menu\r\n" "%sX%s) Delete Room\r\n" "%sS%s) Script : %s%s\r\n" - "%sQ%s) Quit\r\n" "Enter choice : ", cyn, OLC_NUM(d), nrm, @@ -532,9 +553,15 @@ void redit_disp_menu(struct descriptor_d grn, nrm, grn, nrm, grn, nrm, cyn, OLC_SCRIPT(d) ? "Set." : "Not Set." - grn, nrm ); + write_to_output(d, + "%sV%s) Change anti_room_spells : %s%s%s\r\n" + "%sQ%s) Quit\r\n" + "Enter choice : ", + grn, nrm, grn, buf, nrm, + grn, nrm + ); OLC_MODE(d) = REDIT_MAIN_MENU; } @@ -690,6 +717,11 @@ void redit_parse(struct descriptor_data dg_script_menu(d); return; + case 'v': + case 'V': + redit_disp_spell_menu(d); + break; + default: write_to_output(d, "Invalid choice!"); redit_disp_menu(d); @@ -735,6 +767,20 @@ void redit_parse(struct descriptor_data } return; + case REDIT_ANTI_SPELLS: + number = atoi(arg); + if (number < 0 || number > MAX_SKILLS) { + write_to_output(d, "That is not a valid choice!\r\n"); + redit_disp_spell_menu(d); + } else if (number == 0) + break; + else { + TOGGLE_BIT_AR(OLC_ROOM(d)->spells, number - 1); + redit_disp_spell_menu(d); + } + return; + + case REDIT_SECTOR: number = atoi(arg); if (number < 0 || number >= NUM_ROOM_SECTORS) { diff -BbuprN -x '*.o' src/srcbak/spell_parser.c src/src/spell_parser.c --- src/srcbak/spell_parser.c 2004-10-03 13:14:14.000000000 -0400 +++ src/src/spell_parser.c 2004-10-02 17:27:18.000000000 -0400 @@ -230,6 +230,12 @@ int call_magic(struct char_data *caster, return (0); } + if (ROOM_ANTISPELL(IN_ROOM(caster), spellnum)) { + send_to_char(caster, "The room seems to absorb your magic!\r\n"); + act("The room absorbes $n's magic spell!", FALSE, caster, 0, 0, TO_ROOM); + return (0); + } + /* determine the type of saving throw */ switch (casttype) { diff -BbuprN -x '*.o' src/srcbak/spells.c src/src/spells.c --- src/srcbak/spells.c 2004-10-03 13:13:45.000000000 -0400 +++ src/src/spells.c 2004-10-02 17:20:18.000000000 -0400 @@ -47,6 +47,12 @@ ASPELL(spell_create_water) return; /* level = MAX(MIN(level, LVL_IMPL), 1); - not used */ + if (ROOM_ANTISPELL(IN_ROOM(victim), SPELL_WORD_OF_RECALL)) { + send_to_char(victim, "The room seems to absorb your magic!\r\n"); + act("The room absorbes $n's magic spell!", FALSE, victim, 0, 0, TO_ROOM); + return; + } + if (GET_OBJ_TYPE(obj) == ITEM_DRINKCON) { if ((GET_OBJ_VAL(obj, 2) != LIQ_WATER) && (GET_OBJ_VAL(obj, 1) != 0)) { name_from_drinkcon(obj); @@ -73,6 +79,12 @@ ASPELL(spell_recall) if (victim == NULL || IS_NPC(victim)) return; + if (ROOM_ANTISPELL(IN_ROOM(ch), SPELL_TELEPORT)) { + send_to_char(ch, "The room seems to absorb your magic!\r\n"); + act("The room absorbes $n's magic spell!", FALSE, ch, 0, 0, TO_ROOM); + return; + } + act("$n disappears.", TRUE, victim, 0, 0, TO_ROOM); char_from_room(victim); char_to_room(victim, real_room(CONFIG_MORTAL_START)); @@ -91,6 +103,12 @@ ASPELL(spell_teleport) if (victim == NULL || IS_NPC(victim)) return; + if (ROOM_ANTISPELL(IN_ROOM(ch), SPELL_SUMMON)) { + send_to_char(ch, "The room seems to absorb your magic!\r\n"); + act("The room absorbes $n's magic spell!", FALSE, ch, 0, 0, TO_ROOM); + return; + } + do { to_room = rand_number(0, top_of_world); } while (ROOM_FLAGGED(to_room, ROOM_PRIVATE | ROOM_DEATH | ROOM_GODROOM)); @@ -119,6 +137,12 @@ ASPELL(spell_summon) return; } + if (ROOM_ANTISPELL(IN_ROOM(ch), 0) == SPELL_SUMMON || ROOM_ANTISPELL(IN_ROOM(ch), 1) == SPELL_SUMMON || + ROOM_ANTISPELL(IN_ROOM(ch), 2) == SPELL_SUMMON || ROOM_ANTISPELL(IN_ROOM(ch), 3) == SPELL_SUMMON) { + send_to_char(ch, "The room seems to absorb your magic!\r\n"); + act("The room absorbes $n's magic spell!", FALSE, ch, 0, 0, TO_ROOM); + return; + } if (!CONFIG_PK_ALLOWED) { if (MOB_FLAGGED(victim, MOB_AGGRESSIVE)) { @@ -181,6 +205,12 @@ ASPELL(spell_locate_object) return; } + if (ROOM_ANTISPELL(IN_ROOM(ch), SPELL_LOCATE_OBJECT)) { + send_to_char(ch, "The room seems to absorb your magic!\r\n"); + act("The room absorbes $n's magic spell!", FALSE, ch, 0, 0, TO_ROOM); + return; + } + strlcpy(name, fname(obj->name), sizeof(name)); j = level / 2; @@ -217,6 +247,11 @@ ASPELL(spell_charm) if (victim == NULL || ch == NULL) return; + if (ROOM_ANTISPELL(IN_ROOM(ch), SPELL_CHARM)){ + send_to_char(ch, "The room seems to absorb your magic!\r\n"); + act("The room absorbes $n's magic spell!", FALSE, ch, 0, 0, TO_ROOM); + return; + } if (victim == ch) send_to_char(ch, "You like yourself even better!\r\n"); @@ -270,6 +305,13 @@ ASPELL(spell_identify) size_t len; + if (ROOM_ANTISPELL(IN_ROOM(ch), SPELL_IDENTIFY)) { + send_to_char(ch, "The room seems to absorb your magic!\r\n"); + act("The room absorbes $n's magic spell!", FALSE, ch, 0, 0, TO_ROOM); + return; + } + + if (obj) { char bitbuf[MAX_STRING_LENGTH]; @@ -366,6 +408,12 @@ ASPELL(spell_enchant_weapon) return; + if (ROOM_ANTISPELL(IN_ROOM(ch), SPELL_ENCHANT_WEAPON)) { + send_to_char(ch, "The room seems to absorb your magic!\r\n"); + act("The room absorbes $n's magic spell!", FALSE, ch, 0, 0, TO_ROOM); + return; + } + /* Either already enchanted or not a weapon. */ if (GET_OBJ_TYPE(obj) != ITEM_WEAPON || OBJ_FLAGGED(obj, ITEM_MAGIC)) return; @@ -406,6 +454,12 @@ ASPELL(spell_enchant_weapon) ASPELL(spell_detect_poison) { + if (ROOM_ANTISPELL(IN_ROOM(ch), SPELL_DETECT_POISON)){ + send_to_char(ch, "The room seems to absorb your magic!\r\n"); + act("The room absorbes $n's magic spell!", FALSE, ch, 0, 0, TO_ROOM); + return; + } + if (victim) { if (victim == ch) { if (AFF_FLAGGED(victim, AFF_POISON)) @@ -447,6 +501,12 @@ ASPELL(spell_portal) return; + if (ROOM_ANTISPELL(IN_ROOM(ch), SPELL_PORTAL)) { + send_to_char(ch, "The room seems to absorb your magic!\r\n"); + act("The room absorbes $n's magic spell!", FALSE, ch, 0, 0, TO_ROOM); + return; + } + if (ZONE_FLAGGED(rm->zone, ZONE_QUEST)) { send_to_char(ch, "You can not create a portal to that room.\r\n"); return; diff -BbuprN -x '*.o' src/srcbak/spells.h src/src/spells.h --- src/srcbak/spells.h 2004-10-02 16:45:05.000000000 -0400 +++ src/src/spells.h 2004-10-02 17:04:54.000000000 -0400 @@ -133,6 +133,10 @@ #define MIN_WP 170 #define MAX_WP 182 +/*Current Max skills you have in your game not the acutal array max */ +#define MAX_CUR_SKILLS 132 + + /* * NON-PLAYER AND OBJECT SPELLS AND SKILLS * The practice levels for the spells and skills below are _not_ recorded diff -BbuprN -x '*.o' src/srcbak/structs.h src/src/structs.h --- src/srcbak/structs.h 2004-10-03 13:31:03.000000000 -0400 +++ src/src/structs.h 2004-10-02 16:46:30.000000000 -0400 @@ -632,6 +632,7 @@ #define TW_ARRAY_MAX 4 #define EF_ARRAY_MAX 4 #define ZF_ARRAY_MAX 4 +#define SP_ARRAY_MAX 8 /* other #defined constants **********************************************/ @@ -894,7 +895,7 @@ struct room_data { struct extra_descr_data *ex_description; /* for examine/look */ struct room_direction_data *dir_option[NUM_OF_DIRS]; /* Directions */ int room_flags[RF_ARRAY_MAX]; /* DEATH,DARK ... etc */ - + int spells[SP_ARRAY_MAX]; /* Anti room spells --Cunning */ struct trig_proto_list *proto_script; /* list of default triggers */ struct script_data *script; /* script info for the object */ diff -BbuprN -x '*.o' src/srcbak/utils.h src/src/utils.h --- src/srcbak/utils.h 2004-10-03 13:21:20.000000000 -0400 +++ src/src/utils.h 2004-10-02 16:47:29.000000000 -0400 @@ -221,6 +221,7 @@ void update_pos(struct char_data *victim #define ROOM_FLAGS(loc) (world[(loc)].room_flags) #define SPELL_ROUTINES(spl) (spell_info[spl].routines) #define ZONE_FLAGS(loc) (zone_table[(loc)].zone_flags) +#define ROOM_SPELL(loc) (world[(loc)].spells) /* * See http://www.circlemud.org/~greerga/todo/todo.009 to eliminate MOB_ISNPC. * IS_MOB() acts as a VALID_MOB_RNUM()-like function. @@ -234,6 +235,7 @@ void update_pos(struct char_data *victim #define AFF_FLAGGED(ch, flag) (IS_SET_AR(AFF_FLAGS(ch), (flag))) #define PRF_FLAGGED(ch, flag) (IS_SET_AR(PRF_FLAGS(ch), (flag))) #define ROOM_FLAGGED(loc, flag) (IS_SET_AR(ROOM_FLAGS(loc), (flag))) +#define ROOM_ANTISPELL(loc, flag) (IS_SET_AR(ROOM_SPELL(loc), (flag))) #define ZONE_FLAGGED(loc, flag) (IS_SET_AR(ZONE_FLAGS(loc), (flag))) #define EXIT_FLAGGED(exit, flag) (IS_SET((exit)->exit_info, (flag))) #define OBJAFF_FLAGGED(obj, flag) (IS_SET(GET_OBJ_AFFECT(obj), (flag)))