bool summon_criminal_demons(struct creature *vict) { struct creature *mob; int vnum_base = (IS_EVIL(vict)) ? ARCHONIC_BASE : DEMONIC_BASE; int demon_num = GET_REMORT_GEN(vict) / 2 + 1; int idx; for (idx = 0; idx < demon_num; idx++) { mob = read_mobile(vnum_base + MIN(4, (GET_LEVEL(vict) / 9)) + number(0, 1)); if (!mob) { errlog("Unable to load mob in demonic_overmind"); return false; } start_hunting(mob, vict); SET_BIT(NPC_FLAGS(mob), NPC_SPIRIT_TRACKER); CREATE(mob->mob_specials.func_data, int, 1); *((int *)mob->mob_specials.func_data) = GET_IDNUM(vict); char_to_room(mob, vict->in_room, true); act("The air suddenly cracks open and $n steps out!", false, mob, NULL, NULL, TO_ROOM); } if (IS_EVIL(vict)) mudlog(GET_INVIS_LVL(vict), NRM, true, "%d archons dispatched to hunt down %s", demon_num, GET_NAME(vict)); else mudlog(GET_INVIS_LVL(vict), NRM, true, "%d demons dispatched to hunt down %s", demon_num, GET_NAME(vict)); return true; }
void perform_mob_flag_list(struct char_data * ch, char *arg) { int num, mob_flag, found = 0, len; struct char_data *mob; char buf[MAX_STRING_LENGTH]; mob_flag = atoi(arg); if (mob_flag < 0 || mob_flag > NUM_MOB_FLAGS) { send_to_char(ch, "Invalid flag number!\r\n"); return; } len = snprintf(buf, sizeof(buf), "Listing mobiles with %s%s%s flag set.\r\n", QYEL, action_bits[mob_flag], QNRM); for(num=0;num<=top_of_mobt;num++) { if(IS_SET_AR((mob_proto[num].char_specials.saved.act), mob_flag)) { if ((mob = read_mobile(num, REAL)) != NULL) { char_to_room(mob, 0); len += snprintf(buf + len, sizeof(buf) - len, "%s%3d. %s[%s%5d%s]%s Level %s%-3d%s %s%s\r\n", CCNRM(ch, C_NRM),++found, CCCYN(ch, C_NRM), CCYEL(ch, C_NRM), GET_MOB_VNUM(mob), CCCYN(ch, C_NRM), CCNRM(ch, C_NRM), CCYEL(ch, C_NRM), GET_LEVEL(mob), CCNRM(ch, C_NRM), GET_NAME(mob), CCNRM(ch, C_NRM)); extract_char(mob); /* Finished with the mob - remove it from the MUD */ if (len > sizeof(buf)) break; } } } if (!found) send_to_char(ch,"None Found!\r\n"); else page_string(ch->desc, buf, TRUE); return; }
void perform_mob_level_list(struct char_data * ch, char *arg) { int num, mob_level, found = 0, len; struct char_data *mob; char buf[MAX_STRING_LENGTH]; mob_level = atoi(arg); if (mob_level < 0 || mob_level > 99) { send_to_char(ch, "Invalid mob level!\r\n"); return; } len = snprintf(buf, sizeof(buf), "Listing mobiles of level %s%d%s\r\n", QYEL, mob_level, QNRM); for(num=0;num<=top_of_mobt;num++) { if((mob_proto[num].player.level) == mob_level) { if ((mob = read_mobile(num, REAL)) != NULL) { char_to_room(mob, 0); len += snprintf(buf + len, sizeof(buf) - len, "%s%3d. %s[%s%5d%s]%s %s%s\r\n", CCNRM(ch, C_NRM),++found, CCCYN(ch, C_NRM), CCYEL(ch, C_NRM), GET_MOB_VNUM(mob), CCCYN(ch, C_NRM), CCNRM(ch, C_NRM), GET_NAME(mob), CCNRM(ch, C_NRM)); extract_char(mob); /* Finished with the mob - remove it from the MUD */ if (len > sizeof(buf)) break; } } } if (!found) send_to_char(ch,"None Found!\r\n"); else page_string(ch->desc, buf, TRUE); return; }
static void event_scatter_goodies_zone(int rnum, struct room_data *rp, struct event_goodies *stuff) { int i = 0; int exit_found = 0; int gold = 0; struct char_data *monster = NULL; struct obj_data *object = NULL; struct obj_data *coins = NULL; if (DEBUG > 1) log_info("called %s with %d, %08zx, %08zx", __PRETTY_FUNCTION__, rnum, (size_t) rp, (size_t) stuff); if (!rp || rp->number < stuff->bottom || rp->number > stuff->top) return; if (IS_SET(rp->room_flags, (NO_MOB | PEACEFUL | PRIVATE))) return; exit_found = 0; for (i = 0; i < MAX_NUM_EXITS; i++) /* neswud */ if (rp->dir_option[i]) { exit_found = 1; break; } if (!exit_found) return; if (number(0, 99) >= stuff->chance) return; gold = dice(stuff->gold_dice, stuff->gold_die) + stuff->gold_mod; gold_count += gold; coins = create_money(gold); obj_to_room(coins, rnum); rprintf(rnum, "In a brilliant green flash, a pile of %s appears before you!\r\n", coins->short_description); if (number(0, 99) < stuff->mob_chance) { i = number(1, stuff->mob_count) - 1; if ((monster = read_mobile(stuff->mob_vnum[i], VIRTUAL))) { GET_GOLD(monster) = 0; mob_count++; char_to_room(monster, rnum); act("A rift of red light rips open and $N rushes out!", FALSE, monster, 0, monster, TO_ROOM); } } if (number(0, 99) < stuff->obj_chance) { i = number(1, stuff->obj_count) - 1; if ((object = read_object(stuff->obj_vnum[i], VIRTUAL))) { obj_count++; obj_to_room(object, rnum); rprintf(rnum, "In a shimmering of blue light, %s %s forms!\r\n", SANA(object), object->short_description); } } }
static void event_fill_zone_with_mobs(int rnum, struct room_data *rp, struct event_mob_in_zone *mobs) { int i = 0; int j = 0; int couldbe = 0; int exit_found = FALSE; struct char_data *monster = NULL; struct obj_data *object = NULL; if (DEBUG > 1) log_info("called %s with %d, %08zx, %08zx", __PRETTY_FUNCTION__, rnum, (size_t) rp, (size_t) mobs); if (!rp || rp->number < mobs->bottom || rp->number > mobs->top) return; if (IS_SET(rp->room_flags, (NO_MOB | PEACEFUL | PRIVATE))) return; exit_found = 0; for (i = 0; i < MAX_NUM_EXITS; i++) /* neswud */ if (rp->dir_option[i]) { exit_found = 1; break; } if (!exit_found) return; couldbe = number(mobs->atleast, mobs->atmost); for (j = 0; j < couldbe; j++) { if (number(0, 99) >= mobs->chance) continue; i = number(1, mobs->count) - 1; if (!(monster = read_mobile(mobs->mobset[i].vnum, VIRTUAL))) continue; monster->points.max_hit = dice(mobs->mobset[i].hp_dice, mobs->mobset[i].hp_die) + mobs->mobset[i].hp_mod; GET_HIT(monster) = GET_MAX_HIT(monster); GET_EXP(monster) = (dice(mobs->mobset[i].exp_dice, mobs->mobset[i].exp_die) + mobs->mobset[i].exp_mod) * GET_MAX_HIT(monster); GET_GOLD(monster) = number(mobs->mobset[i].gold_dice, mobs->mobset[i].gold_die) + mobs->mobset[i].gold_mod; if (mobs->mobset[i].obj_vnum >= 0) { if (number(0, 99) < mobs->mobset[i].obj_chance) { if ((object = read_object(mobs->mobset[i].obj_vnum, VIRTUAL))) obj_to_char(object, monster); } } char_to_room(monster, rnum); mob_count++; act("In a shimmering column of blue light, $N appears!", FALSE, monster, 0, monster, TO_ROOM); } }
static void event_zombie_master(struct char_data *ch, char *arg) { struct room_data *rp = NULL; struct char_data *master = NULL; struct char_data *mob = NULL; int i = 0; int j = 0; if (DEBUG > 1) log_info("called %s with %s, %s", __PRETTY_FUNCTION__, SAFE_NAME(ch), VNULL(arg)); if ((rp = real_roomp(ch->in_room))) { master = read_mobile(666, VIRTUAL); /* xenthia, lady of the dead */ j = dice(1, 4) + 3; if (IS_SET(ch->specials.act, PLR_STEALTH)) allprintf ("\r\nYou feel a darkening of the land.\r\nYou hear a low moaning wind arise nearby...\r\n\r\n"); else allprintf ("\r\n%s begins a low incantation, and a bolt of ebon lightning strikes %s upraised hands!\r\nYou hear a low moaning wind arise nearby...\r\n\r\n", GET_NAME(ch), HSHR(ch)); for (i = 0; i < j; i++) { mob = read_mobile(100, VIRTUAL); /* zombie */ char_to_room(mob, ch->in_room); SET_BIT(mob->specials.affected_by, AFF_CHARM); GET_EXP(mob) = number(300, 500); add_follower(mob, master); mob->points.max_hit = dice(4, 10) + 10; mob->points.hit = mob->points.max_hit; AddHatred(master->followers->follower, OP_VNUM, ZM_NEMESIS); SET_BIT(master->followers->follower->specials.act, ACT_GUARDIAN); SET_BIT(master->followers->follower->specials.act, ACT_USE_ITEM); SET_BIT(master->followers->follower->specials.affected_by, AFF_FLYING); } char_to_room(master, ch->in_room); } }
void do_mob_report (struct char_data *ch) { struct char_data *mob; FILE *reportfile; int i; if (!(reportfile = fopen("report.mob", "w"))) { mlog("SYSERR: Mob report file unavailable."); send_to_char ("Report.mob could not be generated.\r\n",ch); return; } sprintf(buf, "MOBS\n----\n"); for (i=0; i<top_of_mobt;i++) { mob=read_mobile(i, REAL); char_to_room(mob, 0); sprintf(buf+strlen(buf), "[%5d] %s Spec Proc: ", GET_MOB_VNUM(mob), GET_NAME(mob)); if (mob_index[GET_MOB_RNUM(mob)].func!=NULL) get_spec_name(GET_MOB_RNUM(mob), buf2,'m'); else sprintf(buf2, "none"); sprintf(buf+strlen(buf), "%s\n",buf2); sprintf(buf+strlen(buf),mob->player.description); sprintf(buf+strlen(buf),"Difficulty: %d XP: %d HP: %d Mana: %d Gold %d\n", GET_DIFFICULTY(mob), GET_EXP(mob), GET_MAX_HIT(mob), GET_MAX_MANA(mob), GET_GOLD(mob)); sprintf(buf+strlen(buf),"Passive Defense: %d Damage Reduction: %d ", GET_PD(mob), GET_REDUCTION(mob)); sprintf(buf+strlen(buf), "Attack Type: %s\n", attack_hit_text[mob->mob_specials.attack_type].singular); sprintbit(MOB_FLAGS(mob), action_bits, buf2, sizeof(buf2)); sprintf(buf+strlen(buf),"Flags: %s\n", buf2); sprintbit(AFF_FLAGS(mob), affected_bits, buf2, sizeof(buf2)); sprintf(buf+strlen(buf),"Affects: %s\n\n-------\n", buf2); extract_char(mob); fprintf(reportfile, buf); buf[0]='\0'; }/*for i=0...*/ fclose (reportfile); send_to_char ("report.mob printed\r\n",ch); }
void mag_summons(int level, struct char_data *ch, struct obj_data *obj, int spellnum, int savetype) { struct char_data *mob = NULL; struct obj_data *tobj, *next_obj; int pfail = 0, msg = 0, fmsg = 0, num = 1, handle_corpse = FALSE, i; mob_vnum mob_num; if (ch == NULL) return; switch (spellnum) { case SPELL_CLONE: msg = 10; fmsg = rand_number(2, 6); /* Random fail message. */ mob_num = MOB_CLONE; pfail = 50; /* 50% failure, should be based on something later. */ break; case SPELL_ANIMATE_DEAD: if (obj == NULL || !IS_CORPSE(obj)) { act(mag_summon_fail_msgs[7], FALSE, ch, 0, 0, TO_CHAR); return; } handle_corpse = TRUE; msg = 11; fmsg = rand_number(2, 6); /* Random fail message. */ mob_num = MOB_ZOMBIE; pfail = 10; /* 10% failure, should vary in the future. */ break; default: return; } if (AFF_FLAGGED(ch, AFF_CHARM)) { send_to_char(ch, "You are too giddy to have any followers!\r\n"); return; } if (rand_number(0, 101) < pfail) { send_to_char(ch, "%s", mag_summon_fail_msgs[fmsg]); return; } for (i = 0; i < num; i++) { if (!(mob = read_mobile(mob_num, VIRTUAL))) { send_to_char(ch, "You don't quite remember how to make that creature.\r\n"); return; } char_to_room(mob, IN_ROOM(ch)); IS_CARRYING_W(mob) = 0; IS_CARRYING_N(mob) = 0; SET_BIT(AFF_FLAGS(mob), AFF_CHARM); if (spellnum == SPELL_CLONE) { /* Don't mess up the prototype; use new string copies. */ mob->player.name = strdup(GET_NAME(ch)); mob->player.short_descr = strdup(GET_NAME(ch)); } act(mag_summon_msgs[msg], FALSE, ch, 0, mob, TO_ROOM); add_follower(mob, ch); } if (handle_corpse) { for (tobj = obj->contains; tobj; tobj = next_obj) { next_obj = tobj->next_content; obj_from_obj(tobj); obj_to_char(tobj, mob); } extract_obj(obj); } }
/* code borrowed from do_cast() */ void do_dg_cast(void *go, struct script_data *sc, trig_data *trig, int type, char *cmd) { struct char_data *caster = NULL; struct char_data *tch = NULL; struct obj_data *tobj = NULL; struct room_data *caster_room = NULL; char *s, *t; int spellnum, target = 0; /* need to get the caster or the room of the temporary caster */ switch (type) { case MOB_TRIGGER: caster = (struct char_data *)go; break; case WLD_TRIGGER: caster_room = (struct room_data *)go; break; case OBJ_TRIGGER: caster_room = dg_room_of_obj((struct obj_data *)go); if (!caster_room) { script_log("dg_do_cast: unknown room for object-caster!"); return; } break; default: script_log("dg_do_cast: unknown trigger type!"); return; } /* get: blank, spell name, target name */ s = strtok(cmd, "'"); if (s == NULL) { sprintf(buf2, "Trigger: %s, VNum %d. dg_cast needs spell name.", GET_TRIG_NAME(trig), GET_TRIG_VNUM(trig)); script_log(buf2); return; } s = strtok(NULL, "'"); if (s == NULL) { sprintf(buf2, "Trigger: %s, VNum %d. dg_cast needs spell name in `'s.", GET_TRIG_NAME(trig), GET_TRIG_VNUM(trig)); script_log(buf2); return; } t = strtok(NULL, "\0"); /* spellnum = search_block(s, spells, 0); */ spellnum = find_abil_num(s,spells); if ((spellnum < 1) || (spellnum > MAX_SPELLS)) { sprintf(buf2, "Trigger: %s, VNum %d. dg_cast: invalid spell name (%s)", GET_TRIG_NAME(trig), GET_TRIG_VNUM(trig), cmd); script_log(buf2); return; } /* Find the target */ if (t != NULL) { one_argument(strcpy(arg, t), t); skip_spaces(&t); } if (IS_SET(SINFO.targets, TAR_IGNORE)) { target = TRUE; } else if (t != NULL && *t) { if (!target && (IS_SET(SINFO.targets, TAR_CHAR_ROOM) || IS_SET(SINFO.targets, TAR_CHAR_WORLD))) { if ((tch = get_char(t)) != NULL) target = TRUE; } if (!target && (IS_SET(SINFO.targets, TAR_OBJ_INV) || IS_SET(SINFO.targets, TAR_OBJ_EQUIP) || IS_SET(SINFO.targets, TAR_OBJ_ROOM) || IS_SET(SINFO.targets, TAR_OBJ_WORLD))) { if ((tobj = get_obj(t)) != NULL) target = TRUE; } if (!target) { sprintf(buf2, "Trigger: %s, VNum %d. dg_cast: target not found (%s)", GET_TRIG_NAME(trig), GET_TRIG_VNUM(trig), cmd); script_log(buf2); return; } } if (IS_SET(SINFO.routines, MAG_GROUPS)) { sprintf(buf2, "Trigger: %s, VNum %d. dg_cast: group spells not permitted (%s)", GET_TRIG_NAME(trig), GET_TRIG_VNUM(trig), cmd); script_log(buf2); return; } if (!caster) { caster = read_mobile(DG_CASTER_PROXY, VIRTUAL); if (!caster) { script_log("dg_cast: Cannot load the caster mob!"); return; } /* set the caster's name to that of the object, or the gods.... */ /* take select pieces from char_to_room(); */ if (type==OBJ_TRIGGER) caster->player.short_descr = str_dup(((struct obj_data *)go)->short_description); else if (type==WLD_TRIGGER) caster->player.short_descr = str_dup("The gods"); caster->next_in_room = caster_room->people; caster_room->people = caster; caster->in_room = real_room(caster_room->number); call_magic(caster, tch, tobj, spellnum, ABT_SPELL, GET_LEVEL(caster), CAST_SPELL, FALSE); extract_char(caster); } else call_magic(caster, tch, tobj, spellnum, ABT_SPELL, GET_LEVEL(caster), CAST_SPELL, FALSE); }
/* ========================================================================= NAME : use_tattoo() DESCRIPTION: RETURNS : TRUE if a tattoo was used WARNINGS : HISTORY : Created by dlkarnes 970417 OTHER : ========================================================================= */ int use_tattoo( struct char_data *ch ) { void add_follower_quiet(struct char_data *ch, struct char_data *leader); if (ch && !IS_NPC(ch)) { if (TAT_TIMER(ch)) { char mybuf[256]; sprintf(mybuf, "You can't use your tattoo's magick for " "%d more hour%s.\r\n", TAT_TIMER(ch),TAT_TIMER(ch)>1?"s":""); send_to_char(mybuf, ch); return(FALSE); } switch (GET_TATTOO(ch)) { case TATTOO_NONE: send_to_char ("You don't have a tattoo.\r\n", ch); break; case TATTOO_SKULL: { struct char_data *skull = read_mobile(9, VIRTUAL); struct affected_type af; char_to_room(skull, ch->in_room); add_follower_quiet(skull, ch); IS_CARRYING_W(skull) = 0; IS_CARRYING_N(skull) = 0; af.type = SPELL_CHARM; af.duration = 20; af.modifier = 0; af.location = 0; af.bitvector = AFF_CHARM; affect_to_char(skull, &af); act("$n's tattoo glows brightly for a second, and $N appears!", TRUE, ch, 0, skull, TO_ROOM); act("Your tattoo glows brightly for a second, and $N appears!", TRUE, ch, 0, skull, TO_CHAR); } break; case TATTOO_EYE: call_magic(ch, ch, NULL, SPELL_GREATPERCEPT, DEFAULT_WAND_LVL, CAST_WAND); break; case TATTOO_SHIP: call_magic(ch, ch, NULL, SPELL_CHANGE_DENSITY, DEFAULT_WAND_LVL, CAST_WAND); break; case TATTOO_ANGEL: call_magic(ch, ch, NULL, SPELL_BLESS, DEFAULT_WAND_LVL, CAST_WAND); break; default: send_to_char("Your tattoo can't be 'use'd.\r\n", ch); return (FALSE); } TAT_TIMER(ch)=24; } return(FALSE); }
int Piovra( struct char_data *pChar, int nCmd, const char *szArg, struct char_data *pMob, int nType ) { struct room_data *pRoom; if( pMob == NULL ) { mudlog( LOG_SYSERR, "pMob == NULL in Piovra( carceri.h )" ); return FALSE; } if( ( pRoom = real_roomp( pMob->in_room ) ) != NULL ) { if( nType == EVENT_TICK && pMob->generic < 8 && AWAKE( pMob ) ) { struct char_data *pNext, *pTar; for( pTar = pRoom->people; pTar; pTar = pNext ) { pNext = pTar->next_in_room; if( IS_PC( pTar ) && IS_SET( pTar->specials.act, PLR_NOHASSLE ) ) continue; /* Ignora chi e` in NOHASSLE */ if( pTar->specials.fighting && mob_index[ pTar->specials.fighting->nr ].iVNum == TENTACOLI && CAN_SEE( pMob, pTar ) ) AddHated( pMob, pTar ); if( ( pTar->specials.fighting == pMob || Hates( pMob, pTar ) ) && CAN_SEE( pMob, pTar ) && ( !pTar->attackers || ( pTar->attackers == 1 && pMob->specials.fighting == pTar ) ) ) { struct char_data *pTentacolo = read_mobile( TENTACOLI, VIRTUAL ); if( pTentacolo ) { char_to_room( pTentacolo, pMob->in_room ); hit( pTentacolo, pTar, TYPE_CRUSH ); pMob->generic++; if( pMob->mult_att > 1 ) pMob->mult_att--; } else mudlog( LOG_ERROR, "Cannot load mob Tentacolo in Piovra(carceri.c)" ); } else if( mob_index[ pTar->nr ].iVNum == TENTACOLI && !pTar->specials.fighting && pTar->attackers <= 0 ) { extract_char( pTar ); pMob->generic--; if( pMob->mult_att < 6 ) pMob->mult_att++; } } } else if( nType == EVENT_DEATH ) { struct char_data *pNext, *pTar; for( pTar = pRoom->people; pTar; pTar = pNext ) { pNext = pTar->next_in_room; if( mob_index[ pTar->nr ].iVNum == TENTACOLI ) extract_char( pTar ); } } else if( nType == EVENT_COMMAND && nCmd == CMD_BASH ) { while( isspace( *szArg ) ) szArg++; if( ( !*szArg && pChar->specials.fighting == pMob ) || ( *szArg && get_char_room_vis( pChar, szArg ) == pMob ) ) { act( "Cerchi di colpire $N ma rimbalzi contro il suo corpo morbido.", TRUE, pChar, 0, pMob, TO_CHAR ); act( "$n cerca di colpire $N ma rimbalza contro il suo corpo morbido.", TRUE, pChar, 0, pMob, TO_ROOM ); WAIT_STATE( pChar, PULSE_VIOLENCE * 2 ); GET_POS( pChar ) = POSITION_SITTING; if( AWAKE( pMob ) ) AddHated( pMob, pChar ); return TRUE; } } } else mudlog( LOG_SYSERR, "pMob in invalid room in Piovra( carceri.c )" ); return FALSE; }
int pet_shops(struct char_data *ch, int cmd, char *arg) { char buf[MAX_STRING_LENGTH], pet_name[256]; int pet_room; struct char_data *pet; pet_room = ch->in_room+1; if (cmd==59) { /* List */ send_to_char("Available pets are:\n\r", ch); for(pet = world[pet_room].people; pet; pet = pet->next_in_room) { sprintf(buf, "%8d - %s\n\r", 3*GET_EXP(pet), pet->player.short_descr); send_to_char(buf, ch); } return(TRUE); } else if (cmd==56) { /* Buy */ arg = one_argument(arg, buf); arg = one_argument(arg, pet_name); /* Pet_Name is for later use when I feel like it */ if (!(pet = get_char_room(buf, pet_room))) { send_to_char("There is no such pet!\n\r", ch); return(TRUE); } if (GET_GOLD(ch) < (GET_EXP(pet)*3)) { send_to_char("You don't have enough gold!\n\r", ch); return(TRUE); } GET_GOLD(ch) -= GET_EXP(pet)*3; pet = read_mobile(pet->nr, REAL); GET_EXP(pet) = 0; SET_BIT(pet->specials.affected_by, AFF_CHARM); if (*pet_name) { sprintf(buf,"%s %s", pet->player.name, pet_name); free(pet->player.name); pet->player.name = strdup(buf); sprintf(buf,"%sA small sign on a chain around the neck says 'My Name is %s'\n\r", pet->player.description, pet_name); free(pet->player.description); pet->player.description = strdup(buf); } char_to_room(pet, ch->in_room); add_follower(pet, ch); /* Be certain that pet's can't get/carry/use/weild/wear items */ IS_CARRYING_W(pet) = 1000; IS_CARRYING_N(pet) = 100; send_to_char("May you enjoy your pet.\n\r", ch); act("$n bought $N as a pet.",FALSE,ch,0,pet,TO_ROOM); return(TRUE); } /* All commands except list and buy */ return(FALSE); }