// Sorry, but *snicker* - Che #include "structs.h" #include "awake.h" #include "db.h" #include "comm.h" #include "interpreter.h" #include "handler.h" #include "utils.h" #include "screen.h" #include "constants.h" #include "olc.h" #include "newmagic.h" #define CH d->character #define PEDIT_MENU 0 #define PEDIT_TYPE 1 #define PEDIT_NAME 2 #define PEDIT_RATING 3 #define PEDIT_WOUND 4 extern void part_design(struct char_data *ch, struct obj_data *design); extern void spell_design(struct char_data *ch, struct obj_data *design); void pedit_disp_menu(struct descriptor_data *d) { CLS(CH); send_to_char(CH, "1) Name: ^c%s^n\r\n", d->edit_obj->restring); send_to_char(CH, "2) Type: ^c%s^n\r\n", programs[GET_OBJ_VAL(d->edit_obj, 0)].name); send_to_char(CH, "3) Rating: ^c%d^n\r\n", GET_OBJ_VAL(d->edit_obj, 1)); if (GET_OBJ_VAL(d->edit_obj, 0) == 5) { send_to_char(CH, "4) Damage: ^c%s^n\r\n", wound_name[GET_OBJ_VAL(d->edit_obj, 2)]); send_to_char(CH, "Size: ^c%d^n\r\n", (GET_OBJ_VAL(d->edit_obj, 1) * GET_OBJ_VAL(d->edit_obj, 1)) * attack_multiplier[GET_OBJ_VAL(d->edit_obj, 2)]); } else send_to_char(CH, "Size: ^c%d^n\r\n", (GET_OBJ_VAL(d->edit_obj, 1) * GET_OBJ_VAL(d->edit_obj, 1)) * programs[GET_OBJ_VAL(d->edit_obj, 0)].multiplier); send_to_char(CH, "q) Quit\r\nEnter your choice: "); d->edit_mode = PEDIT_MENU; } void pedit_disp_program_menu(struct descriptor_data *d) { CLS(CH); for (int counter = 1; counter < NUM_PROGRAMS; counter += 3) { send_to_char(CH, " %2d) %-15s %2d) %-15s %2d) %-15s\r\n", counter, programs[counter].name, counter + 1, counter + 1 < NUM_PROGRAMS ? programs[counter + 1].name : "", counter + 2, counter + 2 < NUM_PROGRAMS ? programs[counter + 2].name : ""); } send_to_char("Program type: ", d->character); d->edit_mode = PEDIT_TYPE; } void pedit_parse(struct descriptor_data *d, char *arg) { int number = atoi(arg); switch(d->edit_mode) { case PEDIT_MENU: switch (*arg) { case '1': send_to_char(CH, "What do you want to call this program: "); d->edit_mode = PEDIT_NAME; break; case '2': pedit_disp_program_menu(d); break; case '3': if (!GET_OBJ_VAL(d->edit_obj, 0)) send_to_char(CH, "Choose a program type first!\r\n"); else { send_to_char(CH,"Enter Rating: "); d->edit_mode = PEDIT_RATING; } break; case '4': if (GET_OBJ_VAL(d->edit_obj, 0) != 5) send_to_char(CH, "Invalid option!\r\n"); else { CLS(CH); send_to_char(CH, "1) Light\r\n2) Moderate\r\n3) Serious\r\n4) Deadly\r\nEnter your choice: "); d->edit_mode = PEDIT_WOUND; } break; case 'q': send_to_char(CH, "Design saved!\r\n"); if (GET_OBJ_VAL(d->edit_obj, 0) == 5) GET_OBJ_VAL(d->edit_obj, 4) = GET_OBJ_VAL(d->edit_obj, 1) * attack_multiplier[GET_OBJ_VAL(d->edit_obj, 2)]; else if (GET_OBJ_VAL(d->edit_obj, 0) == SOFT_RESPONSE) GET_OBJ_VAL(d->edit_obj, 4) = GET_OBJ_VAL(d->edit_obj, 1) * (GET_OBJ_VAL(d->edit_obj, 1) * GET_OBJ_VAL(d->edit_obj, 1)); else GET_OBJ_VAL(d->edit_obj, 4) = GET_OBJ_VAL(d->edit_obj, 1) * programs[GET_OBJ_VAL(d->edit_obj, 0)].multiplier; GET_OBJ_VAL(d->edit_obj, 6) = GET_OBJ_VAL(d->edit_obj, 1) * GET_OBJ_VAL(d->edit_obj, 4); GET_OBJ_VAL(d->edit_obj, 4) *= 20; GET_OBJ_TIMER(d->edit_obj) = GET_OBJ_VAL(d->edit_obj, 4); GET_OBJ_VAL(d->edit_obj, 9) = GET_IDNUM(CH); obj_to_char(d->edit_obj, CH); STATE(d) = CON_PLAYING; d->edit_obj = NULL; break; default: send_to_char(CH, "Invalid option!\r\n"); break; } break; case PEDIT_RATING: if (GET_OBJ_VAL(d->edit_obj, 0) <= SOFT_SENSOR && number > GET_SKILL(CH, SKILL_COMPUTER) * 1.5) send_to_char(CH, "You can't create a persona program of a higher rating than your computer skill times one and a half.\r\n" "Enter Rating: "); else if (GET_OBJ_VAL(d->edit_obj, 0) == SOFT_EVALUATE && number > GET_SKILL(CH, SKILL_DATA_BROKERAGE)) send_to_char(CH, "You can't create an evaluate program of a higher rating than your data brokerage skill.\r\n" "Enter Rating: "); else if (GET_OBJ_VAL(d->edit_obj, 0) > SOFT_SENSOR && number > GET_SKILL(CH, SKILL_COMPUTER)) send_to_char(CH, "You can't create a program of a higher rating than your computer skill.\r\n" "Enter Rating: "); else if (GET_OBJ_VAL(d->edit_obj, 0) == SOFT_RESPONSE && number > 3) send_to_char("You can't create a response increase of a rating higher than 3.\r\nEnter Rating: ", CH); else { GET_OBJ_VAL(d->edit_obj, 1) = number; pedit_disp_menu(d); } break; case PEDIT_NAME: if (strlen(arg) >= LINE_LENGTH) { pedit_disp_menu(d); return; } delete [] d->edit_obj->restring; d->edit_obj->restring = str_dup(arg); pedit_disp_menu(d); break; case PEDIT_WOUND: if (number < 1 || number > 4) send_to_char(CH, "Not a valid option!\r\nEnter your choice: "); else { GET_OBJ_VAL(d->edit_obj, 2) = number; pedit_disp_menu(d); } break; case PEDIT_TYPE: if (number < 1 || number >= NUM_PROGRAMS) send_to_char(CH, "Not a valid option!\r\nEnter your choice: "); else { GET_OBJ_VAL(d->edit_obj, 0) = number; GET_OBJ_VAL(d->edit_obj, 1) = 0; pedit_disp_menu(d); } break; } } void create_program(struct char_data *ch) { struct obj_data *design = read_object(107, VIRTUAL); STATE(ch->desc) = CON_PRO_CREATE; design->restring = str_dup("A blank program"); ch->desc->edit_obj = design; pedit_disp_menu(ch->desc); } ACMD(do_design) { struct obj_data *comp, *prog; if (!*argument) { if (AFF_FLAGS(ch).AreAnySet(AFF_DESIGN, AFF_PROGRAM, AFF_SPELLDESIGN, ENDBIT)) { send_to_char(ch, "You stop working on %s.\r\n", GET_OBJ_NAME(GET_BUILDING(ch))); STOP_WORKING(ch); } else send_to_char(ch, "Design what?\r\n"); return; } if (GET_POS(ch) > POS_SITTING) { send_to_char(ch, "You have to be sitting to do that.\r\n"); return; } if (IS_WORKING(ch)) { send_to_char(ch, "You are already working on something.\r\n"); return; } skip_spaces(&argument); prog = get_obj_in_list_vis(ch, argument, ch->carrying); if (prog) { if (GET_OBJ_TYPE(prog) == ITEM_PART) { part_design(ch, prog); return; } else if (GET_OBJ_TYPE(prog) == ITEM_SPELL_FORMULA) { spell_design(ch, prog); return; } } for (comp = world[ch->in_room].contents; comp; comp = comp->next_content) if (GET_OBJ_TYPE(comp) == ITEM_DECK_ACCESSORY && GET_OBJ_VAL(comp, 0) == 2) break; if (!comp) { send_to_char(ch, "There is no computer here for you to make a program design on.\r\n"); return; } for (struct char_data *vict = world[ch->in_room].people; vict; vict = vict->next_in_room) if (AFF_FLAGS(vict).AreAnySet(AFF_PROGRAM, AFF_DESIGN, ENDBIT)) { send_to_char(ch, "Someone is already using the computer.\r\n"); return; } for (prog = comp->contains; prog; prog = prog->next_content) if ((isname(argument, prog->text.keywords) || isname(argument, prog->restring)) && GET_OBJ_TYPE(prog) == ITEM_DESIGN) break; if (!prog) { send_to_char(ch, "The program design isn't on that computer.\r\n"); return; } if (GET_OBJ_VAL(prog, 3) || GET_OBJ_VAL(prog, 5)) { send_to_char(ch, "You can no longer make a design on that project.\r\n"); return; } if (GET_OBJ_VAL(prog, 9) && GET_OBJ_VAL(prog, 9) != GET_IDNUM(ch)) { send_to_char(ch, "Someone else has already started on this program.\r\n"); return; } int skill = 0, target = 4; if (GET_OBJ_VAL(prog, 1) < 5) target--; else if (GET_OBJ_VAL(prog, 1) > 9) target++; switch (GET_OBJ_VAL(prog,0)) { case SOFT_BOD: case SOFT_EVASION: case SOFT_MASKING: case SOFT_SENSOR: case SOFT_ASIST_COLD: case SOFT_ASIST_HOT: case SOFT_HARDENING: case SOFT_ICCM: case SOFT_ICON: case SOFT_MPCP: case SOFT_REALITY: case SOFT_RESPONSE: skill = get_skill(ch, SKILL_PROGRAM_CYBERTERM, target); break; case SOFT_ATTACK: case SOFT_SLOW: skill = get_skill(ch, SKILL_PROGRAM_COMBAT, target); break; case SOFT_CLOAK: case SOFT_LOCKON: case SOFT_MEDIC: case SOFT_ARMOUR: skill = get_skill(ch, SKILL_PROGRAM_DEFENSIVE, target); break; case SOFT_BATTLETEC: case SOFT_COMPRESSOR: case SOFT_SLEAZE: case SOFT_TRACK: case SOFT_SUITE: skill = get_skill(ch, SKILL_PROGRAM_SPECIAL, target); break; case SOFT_CAMO: case SOFT_CRASH: case SOFT_DEFUSE: case SOFT_EVALUATE: case SOFT_VALIDATE: case SOFT_SWERVE: case SOFT_SNOOPER: case SOFT_ANALYZE: case SOFT_DECRYPT: case SOFT_DECEPTION: case SOFT_RELOCATE: case SOFT_SCANNER: case SOFT_BROWSE: case SOFT_READ: case SOFT_COMMLINK: skill = get_skill(ch, SKILL_PROGRAM_OPERATIONAL, target); break; } if (!skill) { send_to_char(ch, "You have no idea how to go about creating a program design for that.\r\n"); return; } if (GET_OBJ_TIMER(prog) == GET_OBJ_VAL(prog, 4)) { send_to_char(ch, "You begin designing %s.\r\n", prog->restring); GET_OBJ_VAL(prog, 8) = success_test(skill, target); } else send_to_char(ch, "You continue to design %s.\r\n", prog->restring); AFF_FLAGS(ch).SetBit(AFF_DESIGN); GET_BUILDING(ch) = prog; } ACMD(do_program) { struct obj_data *comp, *prog; if (!*argument) { if (AFF_FLAGGED(ch, AFF_PROGRAM)) { AFF_FLAGS(ch).RemoveBit(AFF_PROGRAM); send_to_char(ch, "You stop working on %s.\r\n", ch->char_specials.programming->restring); ch->char_specials.programming = NULL; } else send_to_char(ch, "Program What?\r\n"); return; } if (GET_POS(ch) > POS_SITTING) { send_to_char(ch, "You have to be sitting to do that.\r\n"); return; } if (IS_WORKING(ch)) { send_to_char(ch, "You are already working on something.\r\n"); return; } skip_spaces(&argument); for (struct char_data *vict = world[ch->in_room].people; vict; vict = vict->next_in_room) if (AFF_FLAGS(vict).AreAnySet(AFF_PROGRAM, AFF_DESIGN, ENDBIT)) { send_to_char(ch, "Someone is already using the computer.\r\n"); return; } for (comp = world[ch->in_room].contents; comp; comp = comp->next_content) if (GET_OBJ_TYPE(comp) == ITEM_DECK_ACCESSORY && GET_OBJ_VAL(comp, 0) == 2) break; if (!comp) { send_to_char(ch, "There is no computer here for you to program on.\r\n"); return; } for (prog = comp->contains; prog; prog = prog->next_content) if ((isname(argument, prog->text.keywords) || isname(argument, prog->restring)) && GET_OBJ_TYPE(prog) == ITEM_DESIGN) break; if (!prog) { send_to_char(ch, "The program design isn't on that computer.\r\n"); return; } if (GET_OBJ_VAL(prog, 9) && GET_OBJ_VAL(prog, 9) != GET_IDNUM(ch)) { send_to_char(ch, "Someone else has already started on this program.\r\n"); return; } if (!GET_OBJ_VAL(prog, 5)) { send_to_char(ch, "You begin to program %s.\r\n", prog->restring); int target = GET_OBJ_VAL(prog, 1); if (GET_OBJ_VAL(comp, 1) >= GET_OBJ_VAL(prog, 6) * 2) target -= 2; if (GET_OBJ_VAL(prog, 8) != -1) target += 2; else target -= GET_OBJ_VAL(prog, 3); int skill = get_skill(ch, SKILL_COMPUTER, target); int success = success_test(skill, target); for (struct obj_data *suite = comp->contains; suite; suite = suite->next_content) if (GET_OBJ_TYPE(suite) == ITEM_PROGRAM && GET_OBJ_VAL(suite, 0) == SOFT_SUITE) { skill += MIN(GET_SKILL(ch, SKILL_COMPUTER), GET_OBJ_VAL(suite, 1)); break; } success += (int)(success_test(skill, target) / 2); if (success) { GET_OBJ_VAL(prog, 5) = GET_OBJ_VAL(prog, 6) / success; GET_OBJ_VAL(prog, 5) *= 60; GET_OBJ_TIMER(prog) = GET_OBJ_VAL(prog, 5); } else { GET_OBJ_VAL(prog, 5) = number(1, 6) + number(1, 6); GET_OBJ_TIMER(prog) = (GET_OBJ_VAL(prog, 6) * 60) / number(1, 3); GET_OBJ_VAL(prog, 7) = 1; } } else send_to_char(ch, "You continue to work on %s.\r\n", prog->restring); AFF_FLAGS(ch).SetBit(AFF_PROGRAM); GET_BUILDING(ch) = prog; } ACMD(do_copy) { struct obj_data *comp, *prog; if (!*argument) { send_to_char("What program do you want to copy?", ch); return; } if (IS_WORKING(ch)) { send_to_char("You are already working on something.\r\n", ch); return; } skip_spaces(&argument); for (struct char_data *vict = world[ch->in_room].people; vict; vict = vict->next_in_room) if (AFF_FLAGS(vict).AreAnySet(AFF_PROGRAM, AFF_DESIGN, ENDBIT)) { send_to_char("Someone is already using the computer.\r\n", ch); return; } for (comp = world[ch->in_room].contents; comp; comp = comp->next_content) if (GET_OBJ_TYPE(comp) == ITEM_DECK_ACCESSORY && GET_OBJ_VAL(comp, 0) == 2) break; if (!comp) { send_to_char("There is no computer here for you to program on.\r\n", ch); return; } for (prog = comp->contains; prog; prog = prog->next_content) if ((isname(argument, prog->text.keywords) || isname(argument, prog->restring)) && GET_OBJ_TYPE(prog) == ITEM_PROGRAM) break; if (!prog) send_to_char("The program isn't on that computer.\r\n", ch); else if (GET_OBJ_TIMER(prog)) send_to_char("You can't copy from an optical chip.\r\n", ch); else if (GET_OBJ_VAL(prog, 2) > GET_OBJ_VAL(comp, 2) - GET_OBJ_VAL(comp, 3)) send_to_char("There isn't enough space on there to copy that.\r\n", ch); else { switch (GET_OBJ_VAL(prog, 0)) { case SOFT_ASIST_COLD: case SOFT_ASIST_HOT: case SOFT_HARDENING: case SOFT_ICCM: case SOFT_ICON: case SOFT_MPCP: case SOFT_REALITY: case SOFT_RESPONSE: case SOFT_BOD: case SOFT_SENSOR: case SOFT_MASKING: case SOFT_EVASION: case SOFT_SUITE: send_to_char("You can't copy this program.\r\n", ch); return; } GET_OBJ_VAL(comp, 3) += GET_OBJ_VAL(prog, 2); struct obj_data *newp = read_object(108, VIRTUAL); newp->restring = str_dup(GET_OBJ_NAME(prog)); GET_OBJ_VAL(newp, 0) = GET_OBJ_VAL(prog, 0); GET_OBJ_VAL(newp, 1) = GET_OBJ_VAL(prog, 1); GET_OBJ_VAL(newp, 2) = GET_OBJ_VAL(prog, 2); GET_OBJ_VAL(newp, 3) = GET_OBJ_VAL(prog, 3); obj_to_obj(newp, comp); send_to_char(ch, "You copy %s.\r\n", GET_OBJ_NAME(prog)); } } #undef CH #define CH desc->character #define PROG GET_BUILDING(CH) void update_programs(void) { struct descriptor_data *next; for (struct descriptor_data *desc = descriptor_list; desc; desc = next) { next = desc->next; if (CH && STATE(desc) == CON_PLAYING) if (AFF_FLAGGED(desc->character, AFF_PART_BUILD)) { if (--GET_OBJ_VAL(PROG, 4) < 1) { if (GET_OBJ_TIMER(PROG) < 0) { send_to_char(desc->character, "You realise you have botched installing %s.\r\n", GET_OBJ_NAME(PROG)); extract_obj(PROG); } else { send_to_char(desc->character, "You finish installing %s into %s.\r\n", GET_OBJ_NAME(PROG), GET_OBJ_NAME(PROG->contains)); obj_from_char(PROG); obj_to_obj(PROG, PROG->contains); PROG->contains = NULL; GET_OBJ_VAL(PROG, 4) = -2; if (!GET_OBJ_VAL(PROG->in_obj, 0)) GET_OBJ_VAL(PROG->in_obj, 0) = GET_OBJ_VAL(PROG, 2); switch(GET_OBJ_VAL(PROG, 0)) { case PART_MPCP: GET_OBJ_VAL(PROG->in_obj, 0) = GET_OBJ_VAL(PROG, 2); break; case PART_RESPONSE: GET_OBJ_VAL(PROG->in_obj, 6) = GET_OBJ_VAL(PROG, 1); break; case PART_IO: GET_OBJ_VAL(PROG->in_obj, 4) = GET_OBJ_VAL(PROG, 1); break; case PART_STORAGE: GET_OBJ_VAL(PROG->in_obj, 3) = GET_OBJ_VAL(PROG, 1); break; case PART_HARDENING: GET_OBJ_VAL(PROG->in_obj, 1) = GET_OBJ_VAL(PROG, 1); break; case PART_ACTIVE: GET_OBJ_VAL(PROG->in_obj, 2) = GET_OBJ_VAL(PROG, 1); break; } if (GET_OBJ_VAL(PROG->in_obj, 9)) { int x = 0; for (struct obj_data *obj = PROG->in_obj->contains; obj; obj = obj->next_content) if (GET_OBJ_TYPE(obj) == ITEM_PART) switch (GET_OBJ_VAL(obj, 0)) { case PART_MPCP: case PART_ACTIVE: case PART_BOD: case PART_SENSOR: case PART_IO: case PART_MATRIX_INTERFACE: x++; } if (x == 6) GET_OBJ_VAL(PROG->in_obj, 9) = 0; } } STOP_WORKING(desc->character); } } else if (AFF_FLAGGED(desc->character, AFF_PART_DESIGN) && --GET_OBJ_VAL(PROG, 3) < 1) { send_to_char(desc->character, "You complete the design plan for %s.\r\n", GET_OBJ_NAME(PROG)); STOP_WORKING(CH); } else if (AFF_FLAGGED(desc->character, AFF_DESIGN)) { if (--GET_OBJ_VAL(PROG, 4) < 1) { send_to_char(desc->character, "You complete the design plan for %s.\r\n", GET_OBJ_NAME(PROG)); GET_OBJ_VAL(PROG, 3) = GET_OBJ_VAL(PROG, 8); GET_OBJ_VAL(PROG, 8) = -1; PROG = NULL; AFF_FLAGS(desc->character).RemoveBit(AFF_DESIGN); } } else if (AFF_FLAGGED(desc->character, AFF_PROGRAM)) { if (--GET_OBJ_VAL(PROG, 5) < 1) { if (GET_OBJ_VAL(PROG, 7)) send_to_char(desc->character, "You realise programming %s is a lost cause.\r\n", GET_OBJ_NAME(PROG)); else { send_to_char(desc->character, "You complete programming %s.\r\n", GET_OBJ_NAME(PROG)); struct obj_data *newp = read_object(108, VIRTUAL); newp->restring = str_dup(GET_OBJ_NAME(PROG)); GET_OBJ_VAL(newp, 0) = GET_OBJ_VAL(PROG, 0); GET_OBJ_VAL(newp, 1) = GET_OBJ_VAL(PROG, 1); GET_OBJ_VAL(newp, 2) = GET_OBJ_VAL(PROG, 6); GET_OBJ_VAL(newp, 3) = GET_OBJ_VAL(PROG, 2); obj_to_obj(newp, PROG->in_obj); GET_OBJ_VAL(PROG->in_obj, 3) += GET_OBJ_VAL(newp, 2); } GET_OBJ_VAL(PROG->in_obj, 3) -= GET_OBJ_VAL(PROG, 6) + (GET_OBJ_VAL(PROG, 6) / 10); extract_obj(PROG); PROG = NULL; AFF_FLAGS(desc->character).RemoveBit(AFF_PROGRAM); } } else if (AFF_FLAGGED(CH, AFF_BONDING) && --GET_OBJ_VAL(PROG, 9) < 1) { send_to_char(CH, "You complete the bonding ritual for %s.\r\n", GET_OBJ_NAME(PROG)); STOP_WORKING(CH); } else if (AFF_FLAGGED(CH, AFF_CONJURE) && --CH->char_specials.conjure[2] < 1) { if ((GET_OBJ_COST(PROG) -= CH->char_specials.conjure[1] * 1000) <= 0) extract_obj(PROG); STOP_WORKING(CH); int skill = GET_SKILL(CH, SKILL_CONJURING), target = CH->char_specials.conjure[1]; for (int i = 0; i < NUM_WEARS; i++) if (GET_EQ(CH, i) && GET_OBJ_TYPE(GET_EQ(CH, i)) == ITEM_FOCUS && GET_OBJ_VAL(GET_EQ(CH, i), 0) == FOCI_SPIRIT && GET_OBJ_VAL(GET_EQ(CH, i), 2) == GET_IDNUM(CH) && GET_OBJ_VAL(GET_EQ(CH, i), 3) == CH->char_specials.conjure[0] && GET_OBJ_VAL(GET_EQ(CH, i), 4)) { skill += GET_OBJ_VAL(GET_EQ(CH, i), 1); break; } if (world[CH->in_room].background[1] == AURA_POWERSITE) skill += world[CH->in_room].background[0]; else target += world[CH->in_room].background[0]; int success = success_test(skill, target); if (success < 1) { send_to_char(CH, "You fail to conjure the %s elemental.\r\n", elements[CH->char_specials.conjure[0]].name); continue; } int idnum = number(0, 1000); send_to_char(CH, "You summon a %s elemental.\r\n", elements[CH->char_specials.conjure[0]].name); struct char_data *mob = create_elemental(CH, CH->char_specials.conjure[0], CH->char_specials.conjure[1], idnum, TRAD_HERMETIC); act("$n appears just outside of the hermetic circle.", FALSE, mob, 0, 0, TO_ROOM); if (conjuring_drain(CH, CH->char_specials.conjure[1]) || !AWAKE(CH)) { if (success_test(GET_LEVEL(mob), 6) > 0) extract_char(mob); else { GET_ACTIVE(mob) = 0; MOB_FLAGS(mob).SetBit(MOB_AGGRESSIVE); stop_follower(mob); } continue; } struct spirit_data *spirit = new spirit_data; spirit->type = CH->char_specials.conjure[0]; spirit->force = CH->char_specials.conjure[1]; spirit->services = success; spirit->id = idnum; spirit->next = GET_SPIRIT(CH); spirit->called = TRUE; GET_SPIRIT(CH) = spirit; GET_NUM_SPIRITS(CH)++; GET_SPARE2(mob) = spirit->id; } else if (AFF_FLAGGED(CH, AFF_CIRCLE) && --GET_OBJ_VAL(PROG, 9) < 1) { send_to_char("You complete drawing the circle.\r\n", CH); act("$n finishes drawing the hermetic circle.\r\n", FALSE, CH, 0, 0, TO_ROOM); STOP_WORKING(CH); } else if (AFF_FLAGGED(CH, AFF_LODGE) && --GET_OBJ_VAL(PROG, 9) < 1) { send_to_char("You finish building the lodge.\r\n", CH); act("$n finishes building the lodge.\r\n", FALSE, CH, 0, 0, TO_ROOM); STOP_WORKING(CH); } else if (AFF_FLAGGED(CH, AFF_SPELLDESIGN) && --GET_OBJ_VAL(PROG, 6) < 1) { if (GET_OBJ_TIMER(PROG) == -3) { send_to_char("You realise you have lost your inspiration for this spell.\r\n", CH); extract_obj(PROG); } else { send_to_char(CH, "You successfully finish designing %s.\r\n", GET_OBJ_NAME(PROG)); GET_OBJ_TIMER(PROG) = 0; } STOP_WORKING(CH); } } }