void MakeSound(int pulse) { struct char_data *ch; /* objects */ ForAllObjects(NULL,pulse,ObjNoise); /* mobiles */ for (ch = character_list; ch; ch = ch->next) { if (IS_NPC(ch) && (ch->player.sounds) && (number(0,5)==0)) { if (ch->specials.default_pos > POSITION_SLEEPING) { if (GET_POS(ch) > POSITION_SLEEPING) { /* Make the sound; */ MakeNoise(ch->in_room, ch->player.sounds, ch->player.distant_snds); } else if (GET_POS(ch) == POSITION_SLEEPING) { char buf[MAX_STRING_LENGTH]; /* snore */ sprintf(buf, "%s snores loudly.\n", ch->player.short_descr); MakeNoise(ch->in_room, buf, "You hear a loud snore nearby.\n"); } } else if (GET_POS(ch) == ch->specials.default_pos) { /* Make the sound */ MakeNoise(ch->in_room, ch->player.sounds, ch->player.distant_snds); } } } }
int cast_spell (struct char_data *ch, struct char_data *tch, struct obj_data *tobj, int spellnum) { if (spellnum < 0 || spellnum > TOP_SPELL_DEFINE) { log ("SYSERR: cast_spell trying to call spellnum %d/%d.\n", spellnum, TOP_SPELL_DEFINE); return (0); } if (GET_POS (ch) < SINFO.min_position) { switch (GET_POS (ch)) { case POS_SLEEPING: send_to_char ("You dream about great magical powers.\r\n", ch); break; case POS_RESTING: send_to_char ("You cannot concentrate while resting.\r\n", ch); break; case POS_SITTING: send_to_char ("You can't do this sitting!\r\n", ch); break; case POS_FIGHTING: send_to_char ("Impossible! You can't concentrate enough!\r\n", ch); break; default: send_to_char ("You can't do much of anything like this!\r\n", ch); break; } return (0); } if (AFF_FLAGGED (ch, AFF_CHARM) && (ch->master == tch)) { send_to_char ("You are afraid you might hurt your master!\r\n", ch); return (0); } if ((tch != ch) && IS_SET (SINFO.targets, TAR_SELF_ONLY)) { send_to_char ("You can only cast this spell upon yourself!\r\n", ch); return (0); } if ((tch == ch) && IS_SET (SINFO.targets, TAR_NOT_SELF)) { send_to_char ("You cannot cast this spell upon yourself!\r\n", ch); return (0); } if (IS_SET (SINFO.routines, MAG_GROUPS) && !AFF_FLAGGED (ch, AFF_GROUP)) { send_to_char ("You can't cast this spell if you're not in a group!\r\n", ch); return (0); } send_to_char (OK, ch); say_spell (ch, spellnum, tch, tobj); return (call_magic (ch, tch, tobj, spellnum, GET_LEVEL (ch), CAST_SPELL)); }
/* nb, also mess up anyone affected by AFF_POISON */ void pulse_heal(void) { CharData *ch; int gain = number(18,24); for (ch = character_list; ch; ch = ch->next) { if(ch->in_room == NOWHERE) continue; if(!(pvpFactor() > 1)) { if( GET_POS(ch) == POS_INCAP ) damage(ch, ch, 1, TYPE_SUFFERING); else if( GET_POS(ch) == POS_MORTALLYW ) damage(ch, ch, 2, TYPE_SUFFERING); else if( GET_POS(ch) == POS_DEAD) { if(IN_ARENA(ch) || IN_QUEST_FIELD(ch) || ZONE_FLAGGED(world[ch->in_room].zone, ZONE_ARENA) || ZONE_FLAGGED(world[ch->in_room].zone, ZONE_SLEEPTAG)) // If they're dying in the arena, they eventually get better (or killed by someone) { GET_HIT(ch) = number(GET_HIT(ch), 1); sendChar(ch, "You slowly recover.\r\n"); update_pos(ch); } else { raw_kill(ch, NULL); continue; } } } if (IS_AFFECTED(ch, AFF_PULSE_HIT)) if (GET_HIT(ch) < GET_MAX_HIT(ch)) GET_HIT(ch) += gain; if (IS_AFFECTED(ch, AFF_PULSE_MANA)) if (GET_MANA(ch) < GET_MAX_MANA(ch)) GET_MANA(ch) += gain; if (IS_AFFECTED(ch, AFF_POISON)) doPoison(ch); if (IS_AFFECTED(ch, AFF_DISEASE)) doDisease(ch); if (affected_by_spell(ch, SKILL_INVIGORATE)) doInvigorate(ch); if (IS_BOUNTY_HUNTER(ch) && GET_ADVANCE_LEVEL(ch) >= 1 && IS_AFFECTED(ch, AFF_HIDE)) GET_MOVE(ch) = MIN(GET_MOVE(ch) + 3*gain, GET_MAX_MOVE(ch)); if (IS_PRESTIDIGITATOR(ch)) GET_MANA(ch) = MIN(GET_MANA(ch) + GET_ADVANCE_LEVEL(ch) * 2, GET_MAX_MANA(ch)); if (affected_by_spell(ch, SPELL_HIPPOCRATIC_OATH)) GET_MANA(ch) = MIN(GET_MANA(ch) + 25, GET_MAX_MANA(ch)); if (affected_by_spell(ch, SKILL_PET_MEND)) GET_HIT(ch) = MIN(GET_HIT(ch) * 115 / 100, GET_MAX_HIT(ch)); if (IS_HOLY_PRIEST(ch)) GET_MANA(ch) = MIN(GET_MANA(ch) + 10 + 2*GET_ADVANCE_LEVEL(ch), GET_MAX_MANA(ch)); /* The room might be poisoned! (Or later, otherwise dangerous) */ if (ch->in_room != NOWHERE) { if (ROOM_FLAGGED(ch->in_room, ROOM_POISONED)) { if (!mag_savingthrow(ch, SAVING_SPELL)) { act("$n chokes and gags!", TRUE, ch, 0, 0, TO_ROOM); act("You choke and gag!", TRUE, ch, 0, 0, TO_CHAR); add_affect( ch, ch, SPELL_POISON, 30, APPLY_NONE, 0, 5 TICKS, AFF_POISON, FALSE, FALSE, FALSE, FALSE); } } } if(IS_DEFENDER(ch) && !affected_by_spell(ch, SKILL_DEFENDER_HEALTH)) add_affect(ch, ch, SKILL_DEFENDER_HEALTH, GET_LEVEL(ch), APPLY_HIT, GET_ADVANCE_LEVEL(ch)*5, -1, FALSE, FALSE, FALSE, FALSE, FALSE); } }
//--------------------------------------------------------- bool CMandelbrot::On_Execute_Position(CSG_Point ptWorld, TSG_Tool_Interactive_Mode Mode) { double d; switch( Mode ) { default: break; case TOOL_INTERACTIVE_LDOWN: case TOOL_INTERACTIVE_RDOWN: GET_POS(m_Down); return( true ); case TOOL_INTERACTIVE_LUP: GET_POS(m_Up); SET_POS(m_Up, m_Down); if( m_Up.Get_X() >= m_Down.Get_X() || m_Up.Get_Y() >= m_Down.Get_Y() ) { m_Extent.Inflate(50.0); m_Extent.Move(m_Up - m_Extent.Get_Center()); } else { m_Extent.Assign(m_Up, m_Down); } Calculate(); return( true ); case TOOL_INTERACTIVE_RUP: GET_POS(m_Up); SET_POS(m_Up, m_Down); if( m_Up.Get_X() >= m_Down.Get_X() || m_Up.Get_Y() >= m_Down.Get_Y() ) { m_Extent.Deflate(50.0); m_Extent.Move(m_Up - m_Extent.Get_Center()); } else { m_Extent.Deflate(100.0 * (m_Down.Get_X() - m_Up.Get_X()) / m_Extent.Get_XRange()); m_Extent.Move(m_Up - m_Extent.Get_Center()); } Calculate(); return( true ); } return( false ); }
/* dismount_char() / fr: Daniel Koepke ([email protected]) * If a character is mounted on something, we dismount them. If * someone is mounting our character, then we dismount that someone. * This is used for cleaning up after a mount is cancelled by * something (either intentionally or by death, etc.) */ void dismount_char(struct char_data *ch) { if (RIDING(ch)) { RIDDEN_BY(RIDING(ch)) = NULL; RIDING(ch) = NULL; GET_POS(ch) = POS_STANDING; } if (RIDDEN_BY(ch)) { RIDING(RIDDEN_BY(ch)) = NULL; RIDDEN_BY(ch) = NULL; GET_POS(ch) = POS_STANDING; } }
/* Common routine for the Castle Twins. */ int castle_twin_proc(struct char_data *ch, int cmd, char *arg, int ctlnum, const char *twinname) { struct char_data *king, *twin; if (!AWAKE(ch)) return (FALSE); if (cmd) return block_way(ch, cmd, arg, castle_virtual(ctlnum), 1); if ((king = find_npc_by_name(ch, "King Welmar", 11)) != NULL) { char actbuf[MAX_INPUT_LENGTH]; if (!ch->master) do_follow(ch, strcpy(actbuf, "King Welmar"), 0, 0); /* strcpy: OK */ if (FIGHTING(king)) do_npc_rescue(ch, king); } if ((twin = find_npc_by_name(ch, twinname, strlen(twinname))) != NULL) if (FIGHTING(twin) && 2 * GET_HIT(twin) < GET_HIT(ch)) do_npc_rescue(ch, twin); if (GET_POS(ch) != POS_FIGHTING) banzaii(ch); return (FALSE); }
void dream (CHAR_DATA *ch) { DREAM_DATA *dream; DREAM_DATA *dreamed; if ( !ch->pc || !ch->pc->dreams ) return; if ( GET_POS (ch) != POSITION_SLEEPING ) return; dream = ch->pc->dreams; ch->pc->dreams = dream->next; dream->next = NULL; if ( !ch->pc->dreamed ) ch->pc->dreamed = dream; else { for ( dreamed = ch->pc->dreamed; dreamed->next; ) dreamed = dreamed->next; dreamed->next = dream; } send_to_char ("While asleep, you have a dream.\n\n\r", ch); page_string (ch->desc, dream->dream); save_char (ch, TRUE); }
int cityguard(struct char_data *ch, int cmd, char *arg) { struct char_data *tch, *evil; int max_evil; if (cmd || !AWAKE(ch) || (GET_POS(ch) == POSITION_FIGHTING)) return (FALSE); max_evil = 300; evil = 0; for (tch=world[ch->in_room].people; tch; tch = tch->next_in_room) { if (tch->specials.fighting) { if ((GET_ALIGNMENT(tch) < max_evil) && (IS_NPC(tch) || IS_NPC(tch->specials.fighting))) { max_evil = GET_ALIGNMENT(tch); evil = tch; } } } if (evil && !IS_EVIL(evil->specials.fighting)) { act("$n screams 'PROTECT THE INNOCENT! BANZAI!!! CHARGE!!! ARARARAGGGHH!'", FALSE, ch, 0, 0, TO_ROOM); hit(ch, evil, TYPE_UNDEFINED); return(TRUE); } return(FALSE); }
/* remove a char from the list of fighting chars */ void stop_fighting(struct char_data *ch) { struct char_data *tmp; assert(ch->specials.fighting); if (ch == combat_next_dude) combat_next_dude = ch->next_fighting; if (combat_list == ch) combat_list = ch->next_fighting; else { for (tmp = combat_list; tmp && (tmp->next_fighting != ch); tmp = tmp->next_fighting); if (!tmp) { log("Char fighting not found Error (fight.c, stop_fighting)"); abort(); } tmp->next_fighting = ch->next_fighting; } ch->next_fighting = 0; ch->specials.fighting = 0; GET_POS(ch) = POSITION_STANDING; update_pos(ch); }
void InformMess( struct char_data *v) { if(DEBUG) dlog("InformMess"); switch (GET_POS(v)) { case POSITION_MORTALLYW: act("$n is mortally wounded, and will die soon, if not aided.", TRUE, v, 0, 0, TO_ROOM); act("You are mortally wounded, and will die soon, if not aided.", FALSE, v, 0, 0, TO_CHAR); break; case POSITION_INCAP: act("$n is incapacitated and will slowly die, if not aided.", TRUE, v, 0, 0, TO_ROOM); act("You are incapacitated and you will slowly die, if not aided.", FALSE, v, 0, 0, TO_CHAR); break; case POSITION_STUNNED: act("$n is stunned, but will probably regain consciousness.", TRUE, v, 0, 0, TO_ROOM); act("You're stunned, but you will probably regain consciousness.", FALSE, v, 0, 0, TO_CHAR); break; case POSITION_DEAD: act("$n is dead! R.I.P.", TRUE, v, 0, 0, TO_ROOM); act("You are dead! Sorry...", FALSE, v, 0, 0, TO_CHAR); break; default: /* >= POSITION SLEEPING */ break; } }
void do_tell (struct char_data *ch, char *argument, int cmd) { struct char_data *vict; char name[100], message[MAX_STRING_LENGTH], buf[MAX_STRING_LENGTH]; if (IS_SET (ch->specials.act, PLR_NOTELL)) { send_to_char ("Your message didn't get through!!\n\r", ch); return; } half_chop (argument, name, message); if (!*name || !*message) send_to_char ("Who do you wish to tell what??\n\r", ch); else if (!(vict = get_char_vis (ch, name))) send_to_char ("No-one by that name here..\n\r", ch); else if (ch == vict) send_to_char ("You try to tell yourself something.\n\r", ch); else if ((GET_POS (vict) == POSITION_SLEEPING) || IS_SET (vict->specials.act, PLR_NOTELL)) { act ("$E can't hear you.", FALSE, ch, 0, vict, TO_CHAR); } else { sprintf (buf, "%s tells you '%s'\n\r", (IS_NPC (ch) ? ch->player.short_descr : GET_NAME (ch)), message); send_to_char (buf, vict); send_to_char ("Ok.\n\r", ch); } }
int perform_move(struct char_data *ch, int dir, int need_specials_check) { room_rnum was_in; struct follow_type *k, *next; if (ch == NULL || dir < 0 || dir >= NUM_OF_DIRS || FIGHTING(ch)) return (0); else if ((!EXIT(ch, dir) && !buildwalk(ch, dir)) || EXIT(ch, dir)->to_room == NOWHERE) send_to_char(ch, "Alas, you cannot go that way...\r\n"); else if (EXIT_FLAGGED(EXIT(ch, dir), EX_CLOSED)) { if (EXIT(ch, dir)->keyword) send_to_char(ch, "The %s seems to be closed.\r\n", fname(EXIT(ch, dir)->keyword)); else send_to_char(ch, "It seems to be closed.\r\n"); } else { if (!ch->followers) return (do_simple_move(ch, dir, need_specials_check)); was_in = IN_ROOM(ch); if (!do_simple_move(ch, dir, need_specials_check)) return (0); for (k = ch->followers; k; k = next) { next = k->next; if ((IN_ROOM(k->follower) == was_in) && (GET_POS(k->follower) >= POS_STANDING)) { act("You follow $N.\r\n", FALSE, k->follower, 0, ch, TO_CHAR); perform_move(k->follower, dir, 1); } } return (1); } return (0); }
t_stat rs_mbrd (int32 *data, int32 ofs, int32 drv) { uint32 val, dtype, i; UNIT *uptr; rs_update_ds (0, drv); /* update ds */ uptr = rs_dev.units + drv; /* get unit */ if (uptr->flags & UNIT_DIS) { /* nx disk */ *data = 0; return MBE_NXD; } dtype = GET_DTYPE (uptr->flags); /* get drive type */ ofs = ofs & MBA_RMASK; /* mask offset */ switch (ofs) { /* decode offset */ case RS_CS1_OF: /* RSCS1 */ val = (rscs1[drv] & CS1_RW) | CS1_DVA; /* DVA always set */ break; case RS_DA_OF: /* RSDA */ val = rsda[drv]; break; case RS_DS_OF: /* RSDS */ val = rsds[drv] & ~DS_MBZ; break; case RS_ER_OF: /* RSER */ val = rser[drv] & ~ER_MBZ; break; case RS_AS_OF: /* RSAS */ val = 0; for (i = 0; i < RS_NUMDR; i++) { if (rsds[i] & DS_ATA) val |= (AS_U0 << i); } break; case RS_LA_OF: /* RSLA */ val = GET_POS (rs_wait); break; case RS_MR_OF: /* RSMR */ val = rsmr[drv]; break; case RS_DT_OF: /* RSDT */ val = dtype? RS04_ID: RS03_ID; break; default: /* all others */ *data = 0; return MBE_NXR; } *data = val; return SCPE_OK; }
/***************************************************************************** Chiunque veda il Verme della Morte, viene addormentato dal suo sguardo ipnotico, a meno con non azzecchi un tiro salvezza contro paralisi. *****************************************************************************/ int VermeDellaMorte( struct char_data *pChar, int nCmd, const char *szArg, struct char_data *pMob, int nType ) { if( nType == EVENT_TICK && AWAKE( pMob ) ) { struct room_data *pRoom; if( ( pRoom = real_roomp( pMob->in_room ) ) != NULL ) { struct char_data *pNext, *pTar; for( pTar = pRoom->people; pTar; pTar = pNext ) { pNext = pTar->next_in_room; if( CAN_SEE( pTar, pMob ) && ( ( IS_PC( pTar ) && !IS_SET( pTar->specials.act, PLR_NOHASSLE ) ) || ( IS_NPC( pTar ) && ( ( pTar->specials.zone != pMob->specials.zone && !strchr( zone_table[ pTar->specials.zone ].races, GET_RACE( pTar ) ) ) || IS_SET( pTar->specials.act, ACT_ANNOYING ) ) ) ) && GET_POS( pTar ) > POSITION_SLEEPING && !IsImmune( pTar, IMM_SLEEP ) ) { if( IsSusc( pTar, IMM_SLEEP ) || ( !saves_spell( pTar, SAVING_PARA ) && ( !IsResist( pTar, IMM_SLEEP ) || !saves_spell( pTar, SAVING_PARA ) ) ) ) { act( "$N ti guarda fisso. La tua vista si sdoppia.", FALSE, pTar, 0, pMob, TO_CHAR ); act( "$n cade a terra addormentat$b.", TRUE, pTar, 0, 0, TO_ROOM ); if( pTar->specials.fighting ) stop_fighting( pTar ); GET_POS( pTar ) = POSITION_SLEEPING; } } } } else mudlog( LOG_SYSERR, "pMob in invalid room in VermeDellaMorte( carceri.c )" ); } return FALSE; }
/* * message for doing damage with a spell or skill * C3.0: Also used for weapon damage on miss and death blows */ int skill_message(int dam, struct char_data * ch, struct char_data * vict, int attacktype) { int i, j, nr; struct message_type *msg; struct obj_data *weap = GET_EQ(ch, WEAR_WIELD); for (i = 0; i < MAX_MESSAGES; i++) { if (fight_messages[i].a_type == attacktype) { nr = dice(1, fight_messages[i].number_of_attacks); for (j = 1, msg = fight_messages[i].msg; (j < nr) && msg; j++) msg = msg->next; if (!IS_NPC(vict) && (GET_LEVEL(vict) >= LVL_IMMORT)) { act(msg->god_msg.attacker_msg, FALSE, ch, weap, vict, TO_CHAR); act(msg->god_msg.victim_msg, FALSE, ch, weap, vict, TO_VICT); act(msg->god_msg.room_msg, FALSE, ch, weap, vict, TO_NOTVICT); } else if (dam != 0) { if (GET_POS(vict) == POS_DEAD) { send_to_char(CCYEL(ch, C_CMP), ch); act(msg->die_msg.attacker_msg, FALSE, ch, weap, vict, TO_CHAR); send_to_char(CCNRM(ch, C_CMP), ch); send_to_char(CCRED(vict, C_CMP), vict); act(msg->die_msg.victim_msg, FALSE, ch, weap, vict, TO_VICT | TO_SLEEP); send_to_char(CCNRM(vict, C_CMP), vict); act(msg->die_msg.room_msg, FALSE, ch, weap, vict, TO_NOTVICT); } else { send_to_char(CCYEL(ch, C_CMP), ch); act(msg->hit_msg.attacker_msg, FALSE, ch, weap, vict, TO_CHAR); send_to_char(CCNRM(ch, C_CMP), ch); send_to_char(CCRED(vict, C_CMP), vict); act(msg->hit_msg.victim_msg, FALSE, ch, weap, vict, TO_VICT | TO_SLEEP); send_to_char(CCNRM(vict, C_CMP), vict); act(msg->hit_msg.room_msg, FALSE, ch, weap, vict, TO_NOTVICT); } } else if (ch != vict) { /* Dam == 0 */ send_to_char(CCYEL(ch, C_CMP), ch); act(msg->miss_msg.attacker_msg, FALSE, ch, weap, vict, TO_CHAR); send_to_char(CCNRM(ch, C_CMP), ch); send_to_char(CCRED(vict, C_CMP), vict); act(msg->miss_msg.victim_msg, FALSE, ch, weap, vict, TO_VICT | TO_SLEEP); send_to_char(CCNRM(vict, C_CMP), vict); act(msg->miss_msg.room_msg, FALSE, ch, weap, vict, TO_NOTVICT); } return (1); } } return (0); }
t_stat rs_go (int32 drv) { int32 fnc, dtype, t; UNIT *uptr; fnc = GET_FNC (rscs1[drv]); /* get function */ if (DEBUG_PRS (rs_dev)) fprintf (sim_deb, ">>RS%d STRT: fnc=%s, ds=%o, da=%o, er=%o\n", drv, rs_fname[fnc], rsds[drv], rsda[drv], rser[drv]); uptr = rs_dev.units + drv; /* get unit */ rs_clr_as (AS_U0 << drv); /* clear attention */ dtype = GET_DTYPE (uptr->flags); /* get drive type */ if ((fnc != FNC_DCLR) && (rsds[drv] & DS_ERR)) { /* err & ~clear? */ rs_set_er (ER_ILF, drv); /* not allowed */ rs_update_ds (DS_ATA, drv); /* set attention */ return MBE_GOE; } switch (fnc) { /* case on function */ case FNC_DCLR: /* drive clear */ rser[drv] = 0; /* clear errors */ case FNC_NOP: /* no operation */ return SCPE_OK; case FNC_SEARCH: /* search */ case FNC_WRITE: /* write */ case FNC_WCHK: /* write check */ case FNC_READ: /* read */ if ((uptr->flags & UNIT_ATT) == 0) { /* not attached? */ rs_set_er (ER_UNS, drv); /* unsafe */ break; } if (rsda[drv] & DA_INV) { /* bad address? */ rs_set_er (ER_IAE, drv); break; } rsds[drv] = rsds[drv] & ~DS_RDY; /* clr drive rdy */ if (fnc == FNC_SEARCH) /* search? */ rsds[drv] = rsds[drv] | DS_PIP; /* set PIP */ t = abs (rsda[drv] - GET_POS (rs_wait)); /* pos diff */ if (t < 1) /* min time */ t = 1; sim_activate (uptr, rs_wait * t); /* schedule */ return SCPE_OK; default: /* all others */ rs_set_er (ER_ILF, drv); /* not supported */ break; } rs_update_ds (DS_ATA, drv); /* set attn, req int */ return MBE_GOE; }
/* Banzaii. Makes a character banzaii on attackers of the castle staff. Used * by Guards, Tim, Tom, Dick, David, Peter, Master, and the King. */ int banzaii(struct char_data *ch) { struct char_data *chOpponent; if (!AWAKE(ch) || GET_POS(ch) == POS_FIGHTING || !(chOpponent = get_victim(ch))) return (FALSE); act("$n roars: 'Protect the Kingdom of Great King Welmar! BANZAIIII!!!'", FALSE, ch, 0, 0, TO_ROOM); hit(ch, chOpponent, TYPE_UNDEFINED); return (TRUE); }
/* Display main menu. */ static void medit_disp_menu(struct descriptor_data *d) { struct char_data *mob; char flags[MAX_STRING_LENGTH], flag2[MAX_STRING_LENGTH]; mob = OLC_MOB(d); get_char_colors(d->character); clear_screen(d); write_to_output(d, "-- Mob Number: [%s%d%s]\r\n" "%s1%s) Sex: %s%-7.7s%s %s2%s) Keywords: %s%s\r\n" "%s3%s) S-Desc: %s%s\r\n" "%s4%s) L-Desc:-\r\n%s%s\r\n" "%s5%s) D-Desc:-\r\n%s%s\r\n", cyn, OLC_NUM(d), nrm, grn, nrm, yel, genders[(int)GET_SEX(mob)], nrm, grn, nrm, yel, GET_ALIAS(mob), grn, nrm, yel, GET_SDESC(mob), grn, nrm, yel, GET_LDESC(mob), grn, nrm, yel, GET_DDESC(mob) ); sprintbitarray(MOB_FLAGS(mob), action_bits, AF_ARRAY_MAX, flags); sprintbitarray(AFF_FLAGS(mob), affected_bits, AF_ARRAY_MAX, flag2); write_to_output(d, "%s6%s) Position : %s%s\r\n" "%s7%s) Default : %s%s\r\n" "%s8%s) Attack : %s%s\r\n" "%s9%s) Stats Menu...\r\n" "%sA%s) NPC Flags : %s%s\r\n" "%sB%s) AFF Flags : %s%s\r\n" "%sS%s) Script : %s%s\r\n" "%sW%s) Copy mob\r\n" "%sX%s) Delete mob\r\n" "%sQ%s) Quit\r\n" "Enter choice : ", grn, nrm, yel, position_types[(int)GET_POS(mob)], grn, nrm, yel, position_types[(int)GET_DEFAULT_POS(mob)], grn, nrm, yel, attack_hit_text[(int)GET_ATTACK(mob)].singular, grn, nrm, grn, nrm, cyn, flags, grn, nrm, cyn, flag2, grn, nrm, cyn, OLC_SCRIPT(d) ?"Set.":"Not Set.", grn, nrm, grn, nrm, grn, nrm ); OLC_MODE(d) = MEDIT_MAIN_MENU; }
int Moribondo( struct char_data *pChar, int nCmd, const char *szArg, struct char_data *pMob, int nType ) { if( pMob == NULL || pChar == NULL ) { mudlog( LOG_SYSERR, "pMob == NULL || pChar == NULL in Moribondo( carceri.h )" ); return FALSE; } if( nType == EVENT_TICK ) { switch( pMob->generic ) { case 0: GET_HIT( pMob ) = -3; GET_POS( pMob ) = POSITION_INCAP; pMob->generic = 1; break; case 1: if( GET_HIT( pMob ) > 0 && !pMob->specials.fighting ) { do_say( pMob, "Grazie! Grazie! Chiunque sia stato.", 0 ); if( pMob->player.description ) free( pMob->player.description ); pMob->player.description = strdup( "Il piccolo nano e` contento e " "grato a chi lo ha aiutato.\n\r" ); pMob->generic = 2; } else if( !pMob->specials.fighting ) { MakeNoise( pMob->in_room, NULL, "Senti qualcuno lamentarsi.\n\r" ); } break; case 2: if( !pMob->specials.fighting ) { do_say( pMob, "Guardate vicino al letto. C'e` un passaggio segreto!", 0 ); pMob->generic = 3; } break; default: if( !number( 0, 5 ) && !pMob->specials.fighting ) { do_say( pMob, "Guardate vicino al letto. C'e` un passaggio segreto!", 0 ); } break; } } return FALSE; }
/* remove a char from the list of fighting chars */ void stop_fighting(struct char_data *ch) { struct char_data *temp; if (ch == next_combat_list) next_combat_list = ch->next_fighting; REMOVE_FROM_LIST(ch, combat_list, next_fighting); ch->next_fighting = NULL; FIGHTING(ch) = NULL; GET_POS(ch) = POS_STANDING; update_pos(ch); }
/* start one char fighting another (yes, it is horrible, I know... ) */ void set_fighting(struct char_data *ch, struct char_data *vict) { assert(!ch->specials.fighting); ch->next_fighting = combat_list; combat_list = ch; if(IS_AFFECTED(ch,AFF_SLEEP)) affect_from_char(ch,SPELL_SLEEP); ch->specials.fighting = vict; GET_POS(ch) = POSITION_FIGHTING; }
/* control the fights going on. Called every 2 seconds from comm.c. */ void perform_violence(void) { struct char_data *ch; for (ch = combat_list; ch; ch = next_combat_list) { next_combat_list = ch->next_fighting; if (FIGHTING(ch) == NULL || IN_ROOM(ch) != IN_ROOM(FIGHTING(ch))) { stop_fighting(ch); continue; } if (IS_NPC(ch)) { if (GET_MOB_WAIT(ch) > 0) { GET_MOB_WAIT(ch) -= PULSE_VIOLENCE; continue; } GET_MOB_WAIT(ch) = 0; if (GET_POS(ch) < POS_FIGHTING) { GET_POS(ch) = POS_FIGHTING; act("$n scrambles to $s feet!", TRUE, ch, 0, 0, TO_ROOM); } } if (GET_POS(ch) < POS_FIGHTING) { send_to_char(ch, "You can't fight while sitting!!\r\n"); continue; } if (hit(ch, FIGHTING(ch), TYPE_UNDEFINED) < -1) { continue; } if (MOB_FLAGGED(ch, MOB_SPEC) && GET_MOB_SPEC(ch) && !MOB_FLAGGED(ch, MOB_NOTDEADYET)) { char actbuf[MAX_INPUT_LENGTH] = ""; (GET_MOB_SPEC(ch)) (ch, ch, 0, actbuf, 0); } } }
int thief(struct char_data *ch, int cmd, char *arg) { struct char_data *cons; if(cmd) return FALSE; if(GET_POS(ch)!=POSITION_STANDING)return FALSE; for(cons = world[ch->in_room].people; cons; cons = cons->next_in_room ) if((!IS_NPC(cons)) && (GET_LEVEL(cons)<21) && (number(1,5)==1)) npc_steal(ch,cons); return TRUE; }
void trap_sleep(struct char_data *v) { struct affected_type af; if (!saves_spell(v, SAVING_SPELL)) { af.type = SPELL_SLEEP; af.duration = 12; af.modifier = 0; af.location = APPLY_NONE; af.bitvector = AFF_SLEEP; affect_join(v, &af, FALSE, FALSE); if (GET_POS(v) > POSITION_SLEEPING) { act("You feel very sleepy ..... zzzzzz", FALSE, v, 0, 0, TO_CHAR); act("$n goes to sleep.", TRUE, v, 0, 0, TO_ROOM); GET_POS(v) = POSITION_SLEEPING; } } else { send_to_char("You feel sleepy,but you recover\n\r", v); } }
/* control the fights going on. Called every 2 seconds from comm.c. */ void perform_violence(void) { struct char_data *ch; for (ch = combat_list; ch; ch = next_combat_list) { next_combat_list = ch->next_fighting; if (FIGHTING(ch) == NULL || (IN_ROOM(ch) != IN_ROOM(FIGHTING(ch))) || \ (!char_within_range_of_vict(ch, FIGHTING(ch)))) { stop_fighting(ch); continue; } if (IS_NPC(ch)) { if (GET_MOB_WAIT(ch) > 0) { GET_MOB_WAIT(ch) -= PULSE_VIOLENCE; continue; } GET_MOB_WAIT(ch) = 0; if (GET_POS(ch) < POS_FIGHTING) { GET_POS(ch) = POS_FIGHTING; act("$n scrambles to $s feet!", TRUE, ch, 0, 0, TO_ROOM); } } if (GET_POS(ch) < POS_FIGHTING) { send_to_char("You can't fight while sitting!!\r\n", ch); continue; } hit(ch, FIGHTING(ch), TYPE_UNDEFINED); /* XXX: Need to see if they can handle "" instead of NULL. */ if (MOB_FLAGGED(ch, MOB_SPEC) && mob_index[GET_MOB_RNUM(ch)].func != NULL) (mob_index[GET_MOB_RNUM(ch)].func) (ch, ch, 0, ""); } }
int bat_green(struct char_data *ch, int cmd, char *arg) { if(cmd) return FALSE; if(GET_POS(ch)!=POSITION_FIGHTING) return FALSE; if(!ch->specials.fighting) return FALSE; if(number(0,3)!=0) return FALSE; act("$n breathes gas.",1, ch, 0, 0, TO_ROOM); cast_gas_breath(GET_LEVEL(ch), ch, "", SPELL_TYPE_SPELL, 0, 0); return TRUE; }
void do_medit(struct char_data *ch, char *argument, int cmd) { char name[20]; struct char_data *mob; int i; if(IS_NPC(ch)) return; if ((IS_NPC(ch)) || (GetMaxLevel(ch)<CREATOR)) return; if (!ch->desc) /* someone is forced to do something. can be bad! */ return; /* the ch->desc->str field will cause problems... */ for (i = 0; *(argument + i) == ' '; i++); if (!*(argument + i)) { send_to_char("Medit who?\n\r", ch); return; } argument = one_argument(argument, name); if (!(mob = (struct char_data *)get_char_room_vis(ch, name))) { send_to_char("I don't see that mobile here.\n\r",ch); return; } if(IS_PC(mob)) { send_to_char("You can not mobedit players.\n\r",ch); return; } if (GetMaxLevel(ch) < GOD && !IS_SET(ch->player.user_flags,CAN_MOB_EDIT)) { send_to_char("You do not have access to edit mobiles.\n\r",ch); return; } ch->specials.mobedit=mob; ch->specials.medit = MOB_MAIN_MENU; ch->desc->connected = CON_MOB_EDITING; act("$n has begun editing a mobile.", FALSE, ch, 0, 0, TO_ROOM); GET_POS(ch)=POSITION_SLEEPING; UpdateMobMenu(ch); }
void update_pos( struct char_data *victim ) { if ((GET_HIT(victim) > 0) && (GET_POS(victim) > POSITION_STUNNED)) return; else if (GET_HIT(victim) > 0 ) GET_POS(victim) = POSITION_STANDING; else if (GET_HIT(victim) <= -11) GET_POS(victim) = POSITION_DEAD; else if (GET_HIT(victim) <= -6) GET_POS(victim) = POSITION_MORTALLYW; else if (GET_HIT(victim) <= -3) GET_POS(victim) = POSITION_INCAP; else GET_POS(victim) = POSITION_STUNNED; }
int calcManaMulti(CharData *ch) { int multi = 100; if(ROOM_FLAGGED(ch->in_room, ROOM_MANA_REGEN)) multi += 50; if(IS_AFFECTED(ch, AFF_WRAITHFORM)) multi += 25; if((GET_CLASS(ch) == CLASS_SHADOW_DANCER) && (IS_DARK(ch->in_room) || IS_AFFECTED(ch, AFF_SHADOW_SPHERE))) multi += 50; if(IS_AFFECTED(ch, AFF_POISON)) multi -= 100; if(!IS_NPC(ch)) { if( !IS_NPC(ch) && ROOM_FLAGGED(ch->in_room, ROOM_SUFFER) && ( GET_LEVEL(ch) < LVL_IMMORT )) multi -= 90; else if (!GET_COND(ch, THIRST) && IS_AMARA(ch)) multi -= 90; else if (IS_IZARTI(ch) && IS_EVIL(ch)) multi -= 90; else if (IS_DEMON(ch) && IS_GOOD(ch)) multi -= 90; } if(GET_RACE(ch) == RACE_STROLL) multi += 100; /* Position calculations */ switch (GET_POS(ch)) { case POS_MEDITATING: case POS_SLEEPING: multi += 120; break; case POS_RESTING: multi += 60; break; } multi += (int)GET_SKILL(ch, SKILL_DEVOTION); // Don't let a player's regeneration completely stagnate... multi = MAX(multi, 25); return multi; }
int write_mobile_record(mob_vnum mvnum, struct char_data *mob, FILE *fd) { char ldesc[MAX_STRING_LENGTH], ddesc[MAX_STRING_LENGTH]; ldesc[MAX_STRING_LENGTH - 1] = '\0'; ddesc[MAX_STRING_LENGTH - 1] = '\0'; strip_cr(strncpy(ldesc, GET_LDESC(mob), MAX_STRING_LENGTH - 1)); strip_cr(strncpy(ddesc, GET_DDESC(mob), MAX_STRING_LENGTH - 1)); fprintf(fd, "#%d\n" "%s%c\n" "%s%c\n" "%s%c\n" "%s%c\n", mvnum, GET_ALIAS(mob), STRING_TERMINATOR, GET_SDESC(mob), STRING_TERMINATOR, ldesc, STRING_TERMINATOR, ddesc, STRING_TERMINATOR ); fprintf(fd, "%ld %ld %d E\n" "%d %d %d %dd%d+%d %dd%d+%d\n", MOB_FLAGS(mob), AFF_FLAGS(mob), GET_ALIGNMENT(mob), GET_LEVEL(mob), 20 - GET_HITROLL(mob), GET_AC(mob) / 10, GET_HIT(mob), GET_MANA(mob), GET_MOVE(mob), GET_NDD(mob), GET_SDD(mob), GET_DAMROLL(mob) ); fprintf(fd, "%d %d\n" "%d %d %d\n", GET_GOLD(mob), GET_EXP(mob), GET_POS(mob), GET_DEFAULT_POS(mob), GET_SEX(mob) ); if (write_mobile_espec(mvnum, mob, fd) < 0) log("SYSERR: GenOLC: Error writing E-specs for mobile #%d.", mvnum); script_save_to_disk(fd, mob, MOB_TRIGGER); #if CONFIG_GENOLC_MOBPROG if (write_mobile_mobprog(mvnum, mob, fd) < 0) log("SYSERR: GenOLC: Error writing MobProgs for mobile #%d.", mvnum); #endif return TRUE; }