diff -BbuprN -x '*.0' srcbak/act.wizard.c src/act.wizard.c --- srcbak/act.wizard.c 2004-09-27 15:02:36.000000000 -0400 +++ src/act.wizard.c 2004-09-27 15:06:06.000000000 -0400 @@ -64,6 +64,7 @@ struct char_data *find_char(int n); SPECIAL(shop_keeper); void Crash_rentsave(struct char_data * ch, int cost); void show_guild(struct char_data * ch, char *arg); +struct spell_info_type spell_info[]; /* local functions */ int perform_set(struct char_data *ch, struct char_data *vict, int mode, char *val_arg); @@ -528,6 +529,12 @@ 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); + send_to_char(ch, "Room has these Anti-spell affects: [&G%-10.5s&n] [&G%-10.5s&n] [&G%-10.5s&n] [&G%-10.5s&n]\r\n", + (rm->value[0] < 1) ? "none" : spell_info[rm->value[0]].name, + (rm->value[1] < 1) ? "none" : spell_info[rm->value[1]].name, + (rm->value[2] < 1) ? "none" : spell_info[rm->value[2]].name, + (rm->value[3] < 1) ? "none" : spell_info[rm->value[3]].name); + send_to_char(ch, "Description:\r\n%s", rm->description ? rm->description : " None.\r\n"); if (rm->ex_description) { diff -BbuprN -x '*.0' srcbak/constants.c src/constants.c --- srcbak/constants.c 2004-09-27 15:02:36.000000000 -0400 +++ src/constants.c 2004-09-27 15:35:49.000000000 -0400 @@ -119,6 +119,7 @@ const char *room_bits[] = { "UNDERGROUND", "CURRENT", "TIMED_DT", + "ANTI_SPELL", "\n" }; diff -BbuprN -x '*.0' srcbak/db.c src/db.c --- srcbak/db.c 2004-09-27 15:02:36.000000000 -0400 +++ src/db.c 2004-09-27 15:18:33.000000000 -0400 @@ -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,26 @@ void parse_room(FILE *fl, int virtual_nr world[room_nr].room_flags[3] = asciiflag_conv(flags4); world[room_nr].sector_type = t[2]; + world[room_nr].value[0] = -1; + world[room_nr].value[1] = -1; + world[room_nr].value[2] = -1; + world[room_nr].value[3] = -1; + 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]; + world[room_nr].value[0] = t[7]; + world[room_nr].value[1] = t[8]; + world[room_nr].value[2] = t[9]; + world[room_nr].value[3] = t[10]; 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"); diff -BbuprN -x '*.0' srcbak/genwld.c src/genwld.c --- srcbak/genwld.c 2004-09-27 15:02:36.000000000 -0400 +++ src/genwld.c 2004-09-27 15:19:52.000000000 -0400 @@ -338,12 +338,14 @@ int save_rooms(zone_rnum rzone) fprintf(sf, "#%d\n" "%s%c\n" "%s%c\n" - "%d %s %s %s %s %d\n", + "%d %s %s %s %s %d %d %d %d %d\n", room->number, room->name ? room->name : "Untitled", STRING_TERMINATOR, buf, STRING_TERMINATOR, zone_table[room->zone].number, rbuf1, rbuf2, rbuf3, rbuf4, room->sector_type + room->value[0], room->value[1], room->value[2], + room->value[3], room->room_affections ); /* diff -BbuprN -x '*.0' srcbak/oasis.h src/oasis.h --- srcbak/oasis.h 2004-09-27 15:02:36.000000000 -0400 +++ src/oasis.h 2004-09-27 15:27:35.000000000 -0400 @@ -277,6 +277,10 @@ extern const char *nrm, *grn, *cyn, *yel #define REDIT_EXTRADESC_KEY 15 #define REDIT_EXTRADESC_DESCRIPTION 16 #define REDIT_DELETE 17 +#define REDIT_VALUE_0 18 +#define REDIT_VALUE_1 19 +#define REDIT_VALUE_2 20 +#define REDIT_VALUE_3 21 /* * Submodes of ZEDIT connectedness. @@ -524,6 +528,11 @@ 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); +void redit_disp_value0(struct descriptor_data *d); +void redit_disp_value1(struct descriptor_data *d); +void redit_disp_value2(struct descriptor_data *d); +void redit_disp_value3(struct descriptor_data *d); ACMD(do_oasis_redit); void sedit_setup_new(struct descriptor_data *d); diff -BbuprN -x '*.0' srcbak/redit.c src/redit.c --- srcbak/redit.c 2004-09-27 15:02:36.000000000 -0400 +++ src/redit.c 2004-09-27 15:25:45.000000000 -0400 @@ -21,6 +21,7 @@ #include "improved-edit.h" #include "dg_olc.h" #include "constants.h" +#include "spells.h" /*------------------------------------------------------------------------*/ @@ -35,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[]; /*------------------------------------------------------------------------*/ @@ -416,6 +418,46 @@ 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; + + get_char_colors(d->character); + clear_screen(d); + + for (counter = 1; counter < NUM_SPELLS; counter++) { + write_to_output(d, "%s%2d%s) %s%-20.20s %s", grn, counter, nrm, yel, + spell_info[counter].name, !(++columns % 3) ? "\r\n" : ""); + } + write_to_output(d, "\r\n%sEnter spell choice (0 for none) : ", nrm); +} + + +void redit_disp_value0(struct descriptor_data *d) +{ + OLC_MODE(d) = REDIT_VALUE_0; + redit_disp_spell_menu(d); +} + +void redit_disp_value1(struct descriptor_data *d) +{ + OLC_MODE(d) = REDIT_VALUE_1; + redit_disp_spell_menu(d); +} + +void redit_disp_value2(struct descriptor_data *d) +{ + OLC_MODE(d) = REDIT_VALUE_2; + redit_disp_spell_menu(d); +} + +void redit_disp_value3(struct descriptor_data *d) +{ + OLC_MODE(d) = REDIT_VALUE_3; + redit_disp_spell_menu(d); +} + + /* * For room flags. */ @@ -482,7 +524,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, @@ -530,6 +571,20 @@ void redit_disp_menu(struct descriptor_d grn, nrm, grn, nrm, grn, nrm, cyn, OLC_SCRIPT(d) ? "Set." : "Not Set.", + ); + + write_to_output(d, + "%sV%s) Anti-spells value1: %-10.5s\r\n" + " value2: %-10.5s\r\n" + " value3: %-10.5s\r\n" + " value4: %-10.5s\r\n" + "%sQ%s) Quit\r\n" + "Enter choice : ", + grn, nrm, + room->value[0] < 1 ? "None" : spell_info[room->value[0]].name, + room->value[1] < 1 ? "None" : spell_info[room->value[1]].name, + room->value[2] < 1 ? "None" : spell_info[room->value[2]].name, + room->value[3] < 1 ? "None" : spell_info[room->value[3]].name, grn, nrm ); @@ -686,6 +741,12 @@ void redit_parse(struct descriptor_data OLC_SCRIPT_EDIT_MODE(d) = SCRIPT_MAIN_MENU; dg_script_menu(d); return; + + case 'v': + case 'V': + redit_disp_value0(d); + break; + default: write_to_output(d, "Invalid choice!"); redit_disp_menu(d); @@ -823,6 +884,61 @@ void redit_parse(struct descriptor_data redit_disp_exit_menu(d); return; + case REDIT_VALUE_0: + number = atoi(arg); + if (number == 0){ + redit_disp_menu(d); + break; + } else if (number < 1 || number > NUM_SPELLS) { + write_to_output(d, "Thats not valid!\r\n"); + redit_disp_spell_menu(d); + } else { + OLC_ROOM(d)->value[0] = number; + redit_disp_value1(d); + } + return; + + case REDIT_VALUE_1: + number = atoi(arg); + if (number == 0){ + redit_disp_menu(d); + break; + }else if (number < 1 || number > NUM_SPELLS) { + write_to_output(d, "Thats not valid!\r\n"); + redit_disp_spell_menu(d); + } else { + OLC_ROOM(d)->value[1] = number; + redit_disp_value2(d); + } + return; + + case REDIT_VALUE_2: + number = atoi(arg); + if (number == 0){ + redit_disp_menu(d); + break; + }else if (number < 1 || number > NUM_SPELLS) { + write_to_output(d, "Thats not valid!\r\n"); + redit_disp_spell_menu(d); + } else { + OLC_ROOM(d)->value[2] = number; + redit_disp_value3(d); + } + return; + + case REDIT_VALUE_3: + number = atoi(arg); + if (number == 0){ + redit_disp_menu(d); + break; + }else if (number < 1 || number > NUM_SPELLS) { + write_to_output(d, "Thats not valid!\r\n"); + redit_disp_spell_menu(d); + } else + OLC_ROOM(d)->value[3] = number; + return; + + case REDIT_EXIT_DOORFLAGS: number = atoi(arg); if (number < 0 || number > NUM_EXIT_FLAGS) { diff -BbuprN -x '*.0' srcbak/spell_parser.c src/spell_parser.c --- srcbak/spell_parser.c 2004-09-27 15:02:36.000000000 -0400 +++ src/spell_parser.c 2004-09-27 15:11:27.000000000 -0400 @@ -229,6 +229,13 @@ int call_magic(struct char_data *caster, act("White light from no particular source suddenly fills the room, then vanishes.", FALSE, caster, 0, 0, TO_ROOM); return (0); } + + if (ROOM_ANTISPELL(IN_ROOM(caster), 0) == spellnum || ROOM_ANTISPELL(IN_ROOM(caster), 1) == spellnum || + ROOM_ANTISPELL(IN_ROOM(caster), 2) == spellnum || ROOM_ANTISPELL(IN_ROOM(caster), 3) == 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) { case CAST_STAFF: diff -BbuprN -x '*.0' srcbak/spells.c src/spells.c --- srcbak/spells.c 2004-09-27 15:02:36.000000000 -0400 +++ src/spells.c 2004-09-27 15:10:44.000000000 -0400 @@ -47,6 +47,13 @@ ASPELL(spell_create_water) return; /* level = MAX(MIN(level, LVL_IMPL), 1); - not used */ + if (ROOM_ANTISPELL(IN_ROOM(victim), 0) == SPELL_CREATE_WATER || ROOM_ANTISPELL(IN_ROOM(victim), 1) == SPELL_CREATE_WATER || + ROOM_ANTISPELL(IN_ROOM(victim), 2) == SPELL_CREATE_WATER || ROOM_ANTISPELL(IN_ROOM(victim), 3) == SPELL_CREATE_WATER) { + 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 +80,13 @@ ASPELL(spell_recall) if (victim == NULL || IS_NPC(victim)) return; + if (ROOM_ANTISPELL(IN_ROOM(victim), 0) == SPELL_WORD_OF_RECALL || ROOM_ANTISPELL(IN_ROOM(victim), 1) == SPELL_WORD_OF_RECALL || + ROOM_ANTISPELL(IN_ROOM(victim), 2) == SPELL_WORD_OF_RECALL || ROOM_ANTISPELL(IN_ROOM(victim), 3) == 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; + } + act("$n disappears.", TRUE, victim, 0, 0, TO_ROOM); char_from_room(victim); char_to_room(victim, real_room(CONFIG_MORTAL_START)); @@ -91,6 +105,13 @@ ASPELL(spell_teleport) if (victim == NULL || IS_NPC(victim)) return; + if (ROOM_ANTISPELL(IN_ROOM(ch), 0) == SPELL_TELEPORT || ROOM_ANTISPELL(IN_ROOM(ch), 1) == SPELL_TELEPORT || + ROOM_ANTISPELL(IN_ROOM(ch), 2) == SPELL_TELEPORT || ROOM_ANTISPELL(IN_ROOM(ch), 3) == 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; + } + do { to_room = rand_number(0, top_of_world); } while (ROOM_FLAGGED(to_room, ROOM_PRIVATE | ROOM_DEATH | ROOM_GODROOM)); @@ -119,6 +140,13 @@ 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)) { act("As the words escape your lips and $N travels\r\n" @@ -180,6 +208,13 @@ ASPELL(spell_locate_object) return; } + if (ROOM_ANTISPELL(IN_ROOM(ch), 0) == SPELL_LOCATE_OBJECT || ROOM_ANTISPELL(IN_ROOM(ch), 1) == SPELL_LOCATE_OBJECT || + ROOM_ANTISPELL(IN_ROOM(ch), 2) == SPELL_LOCATE_OBJECT || ROOM_ANTISPELL(IN_ROOM(ch), 3) == 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; @@ -216,6 +251,13 @@ ASPELL(spell_charm) if (victim == NULL || ch == NULL) return; + if (ROOM_ANTISPELL(IN_ROOM(ch), 0) == SPELL_CHARM || ROOM_ANTISPELL(IN_ROOM(ch), 1) == SPELL_CHARM || + ROOM_ANTISPELL(IN_ROOM(ch), 2) == SPELL_CHARM || ROOM_ANTISPELL(IN_ROOM(ch), 3) == 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"); else if (!IS_NPC(victim) && !PRF_FLAGGED(victim, PRF_SUMMONABLE)) @@ -267,6 +309,13 @@ ASPELL(spell_identify) int i, found; size_t len; + if (ROOM_ANTISPELL(IN_ROOM(ch), 0) == SPELL_IDENTIFY || ROOM_ANTISPELL(IN_ROOM(ch), 1) == SPELL_IDENTIFY || + ROOM_ANTISPELL(IN_ROOM(ch), 2) == SPELL_IDENTIFY || ROOM_ANTISPELL(IN_ROOM(ch), 3) == 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]; @@ -362,6 +411,13 @@ ASPELL(spell_enchant_weapon) if (ch == NULL || obj == NULL) return; + if (ROOM_ANTISPELL(IN_ROOM(ch), 0) == SPELL_ENCHANT_WEAPON || ROOM_ANTISPELL(IN_ROOM(ch), 1) == SPELL_ENCHANT_WEAPON || + ROOM_ANTISPELL(IN_ROOM(ch), 2) == SPELL_ENCHANT_WEAPON || ROOM_ANTISPELL(IN_ROOM(ch), 3) == 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; @@ -402,6 +458,13 @@ ASPELL(spell_enchant_weapon) ASPELL(spell_detect_poison) { + if (ROOM_ANTISPELL(IN_ROOM(ch), 0) == SPELL_DETECT_POISON || ROOM_ANTISPELL(IN_ROOM(ch), 1) == SPELL_DETECT_POISON || + ROOM_ANTISPELL(IN_ROOM(ch), 2) == SPELL_DETECT_POISON || ROOM_ANTISPELL(IN_ROOM(ch), 3) == 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)) @@ -440,6 +503,13 @@ ASPELL(spell_portal) if (ch == NULL || victim == NULL) return; + if (ROOM_ANTISPELL(IN_ROOM(ch), 0) == SPELL_PORTAL || ROOM_ANTISPELL(IN_ROOM(ch), 1) == SPELL_PORTAL || + ROOM_ANTISPELL(IN_ROOM(ch), 2) == SPELL_PORTAL || ROOM_ANTISPELL(IN_ROOM(ch), 3) == 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; + } + /* create the portal */ portal = read_object(portal_object, VIRTUAL); GET_OBJ_VAL(portal, 0) = GET_ROOM_VNUM(IN_ROOM(victim)); diff -BbuprN -x '*.0' srcbak/structs.h src/structs.h --- srcbak/structs.h 2004-09-27 15:02:36.000000000 -0400 +++ src/structs.h 2004-09-27 15:04:17.000000000 -0400 @@ -103,6 +103,7 @@ #define ROOM_UNDERGROUND 17 /* Room is below ground */ #define ROOM_CURRENT 18 #define ROOM_TIMED_DT 19 +#define ROOM_ANTI_SPELL 20 /* Exit info: used in room_data.dir_option.exit_info */ #define EX_ISDOOR (1 << 0) /* Exit is a door */ @@ -877,6 +878,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 */ + sh_int value[3]; /* 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 '*.0' srcbak/utils.h src/utils.h --- srcbak/utils.h 2004-09-27 15:02:36.000000000 -0400 +++ src/utils.h 2004-09-27 15:04:50.000000000 -0400 @@ -264,6 +264,7 @@ void update_pos(struct char_data *victim ((room_vnum)(VALID_ROOM_RNUM(rnum) ? world[(rnum)].number : NOWHERE)) #define GET_ROOM_SPEC(room) \ (VALID_ROOM_RNUM(room) ? world[(room)].func : NULL) +#define ROOM_ANTISPELL(loc, val) (world[(loc)].value[(val)]) /* char utils ************************************************************/