コード例 #1
0
ファイル: commands.cpp プロジェクト: stefanludlow/shadows2011
void
command_interpreter (CHAR_DATA * ch, char *argument)
{
	char buf[MAX_STRING_LENGTH];
	char *command_args, *p, *social_args;
	int cmd_level = 0;
	int i = 0, echo = 1;
	AFFECTED_TYPE *craft_affect = NULL;
	AFFECTED_TYPE *af;
	ALIAS_DATA *alias;
	extern int second_affect_active;

	if (!ch)
		return;

	*buf = '\0';

	p = argument;

	while (*p == ' ')
		p++;

	if (strchr (p, '%'))
	{
		send_to_char ("Input with the '%' character is not permitted.\n", ch);
		return;
	}

	if (strchr (p, '#') && IS_MORTAL (ch) && strncmp (p, "ge", 2) != 0
		&& strncmp (p, "buy", 3) != 0)
	{
		send_to_char ("Input with the '#' character is not permitted.\n", ch);
		return;
	}

	if (IS_MORTAL (ch) && strchr (p, '$'))
	{
		send_to_char ("Input with the '$' character is not permitted.\n", ch);
		return;
	}

	std::multimap<int, room_prog>::iterator it;
	if (IS_NPC(ch))
		it = mob_prog_list.find(ch->mob->nVirtual); 
	if (IS_NPC(ch) && !get_second_affect (ch, SA_DOANYWAY, 0) && it != mob_prog_list.end())
	{
		if (m_prog(ch, p))
		{
			return;
		}
	}
	std::pair<std::multimap<int, room_prog>::iterator, std::multimap<int, room_prog>::iterator> pair;

	if (ch->right_hand && !get_second_affect (ch, SA_DOANYWAY, 0))
	{
		pair = obj_prog_list.equal_range(ch->right_hand->nVirtual);
		for (it = pair.first; it != pair.second; it++)
		{
			if (it->second.type != 1 && it->second.type != 3 && it->second.type != 5)
				continue;
			if (o_prog(ch, p, it->second))
				return;
		}
	}
	if (ch->left_hand && !get_second_affect (ch, SA_DOANYWAY, 0))
	{
		pair = obj_prog_list.equal_range(ch->left_hand->nVirtual);
		for (it = pair.first; it != pair.second; it++)
		{
			if (it->second.type != 1 && it->second.type != 3 && it->second.type != 5)
				continue;
			if (o_prog(ch, p, it->second))
				return;
		}
	}
	for (OBJ_DATA *tobj = ch->equip; tobj; tobj = tobj->next_content)
	{
		if (get_second_affect (ch, SA_DOANYWAY, 0))
			break;

		pair = obj_prog_list.equal_range(tobj->nVirtual);
		for (it = pair.first; it != pair.second; it++)
		{
			if (it->second.type != 2 && it->second.type != 3 && it->second.type != 5)
				continue;
			if (o_prog(ch, p, it->second))
				return;
		}

	}

	/* this is where it crashes on the hour - Grommit */

	if (!ch->room )
	{
		std::ostringstream stream;
		stream << "Error in command_interpreter:commands.cpp. Command \"" << 
			argument << "\" called by \"" << ch->tname << "\" with null room. Previously in "
			<< (ch->last_room) << " entering null room from the " << (dirs[ch->from_dir]) << ".";

		system_log(stream.str().c_str(),true);
		return;
	}

	/* end grommit diagnostics to avoid segfaulting on the below for loop */

	for (OBJ_DATA *tobj = ch->room->contents; tobj; tobj = tobj->next_content)
	{
		if (get_second_affect (ch, SA_DOANYWAY, 0))
			break;

		pair = obj_prog_list.equal_range(tobj->nVirtual);
		for (it = pair.first; it != pair.second; it++)
		{
			if (it->second.type != 4 && it->second.type != 5)
				continue;
			if (o_prog(ch, p, it->second))
				return;
		}

	}

	for (CHAR_DATA *temp_char = ch->room->people; temp_char; temp_char = temp_char->next_in_room)
	{
		if (get_second_affect (ch, SA_DOANYWAY, 0))
			break;

		if (temp_char == ch)
			continue;

		if (!IS_NPC(temp_char))
			continue;

		pair = mob_prog_list.equal_range(temp_char->mob->nVirtual);

		for (it = pair.first; it != pair.second; ++it)
		{
			if (m_prog(ch, p, it->second))
				return;
		}
	}

	if (ch->room && ch->room->prg && !get_second_affect(ch, SA_DOANYWAY, 0) && r_program (ch, p))
	{
		if (!IS_NPC (ch)
			|| (ch->desc && (ch->pc && str_cmp (ch->pc->account_name, "Guest"))))
		{
			player_log (ch, "[RPROG]", p);
		}
		if (!IS_SET (commands[i].flags, C_NWT))
			show_to_watchers (ch, argument);
		return;
	}
	if (get_second_affect(ch, SA_DOANYWAY, 0))
		remove_second_affect(get_second_affect(ch, SA_DOANYWAY, 0));

	if (!IS_MORTAL (ch) && !str_cmp (argument, "sho wl"))
	{
		send_to_char
			("Heh heh. Glad I added in this check, aren't we? No shouting for you.\n",
			ch);
		return;
	}

	if (ch->desc)
	{
		last_descriptor = ch->desc;
		sprintf (full_last_command, "Last Command Issued, by %s [%d]: %s",
			ch->tname, ch->in_room, argument);
		sprintf (last_command, "%s", argument);
	}

	social_args = argument;

	command_args = one_argument (argument, buf);

	if (!*buf)
		return;

	while (*command_args == ' ')
		command_args++;

	if (ch->pc && !GET_FLAG (ch, FLAG_ALIASING))
	{

		if ((alias = is_alias (ch, buf)))
		{

			ch->flags |= FLAG_ALIASING;

			while (alias)
			{

				command_interpreter (ch, alias->line);

				if (ch->deleted)
					return;

				alias = alias->next_line;
			}

			ch->flags &= ~FLAG_ALIASING;

			return;
		}
	}

	for (i = 1; *commands[i].command; i++)
		if (is_abbrev (buf, commands[i].command))
			break;

	if ((craft_affect = is_craft_command (ch, argument)))
		i = 0;

	if (IS_SET (commands[i].flags, C_IMP)) {
		cmd_level = 6;
	}
	else if (IS_SET (commands[i].flags, C_LV5)) {
		cmd_level = 5;
	}
	else if (IS_SET (commands[i].flags, C_LV4)) {
		cmd_level = 4;
	}
	else if (IS_SET (commands[i].flags, C_LV3)) {
		cmd_level = 3;
	}
	else if (IS_SET (commands[i].flags, C_LV2)) {
		cmd_level = 2;
	}
	else if (IS_SET (commands[i].flags, C_LV1)) {
		cmd_level = 1;
	}

	if (IS_SET (commands[i].flags, C_GDE)
		&& (IS_NPC (ch) || (!ch->pc->is_guide && !ch->pc->level)))
	{
		send_to_char ("Eh?\n\r", ch);
		return;
	}
	/* 
	Need to pass the CHAR_DATA pointer for the person who made the command and modify
	the following line to test the commanding char's trust against the trust level for
	the command.  - Methuselah
	*/

	if ((!*commands[i].command) 
		|| (cmd_level > GET_TRUST (ch)))
	{
		if (!social (ch, argument))
		{
			echo = number (1, 9);
			if (echo == 1)
				send_to_char ("Eh?\n\r", ch);
			else if (echo == 2)
				send_to_char ("Huh?\n\r", ch);
			else if (echo == 3)
				send_to_char ("I'm afraid that just isn't possible...\n\r", ch);
			else if (echo == 4)
				send_to_char ("I don't recognize that command.\n\r", ch);
			else if (echo == 5)
				send_to_char ("What?\n\r", ch);
			else if (echo == 6)
				send_to_char
				("Perhaps you should try typing it a different way?\n\r", ch);
			else if (echo == 7)
				send_to_char
				("Try checking your typing - I don't recognize it.\n\r", ch);
			else if (echo == 8)
				send_to_char
				("That isn't a recognized command, craft, or social.\n\r", ch);
			else
				send_to_char ("Hmm?\n\r", ch);
		}
		else
		{
			if (!IS_SET (commands[i].flags, C_NWT))
				show_to_watchers (ch, argument);
		}
		return;
	}

	if (ch->stun)
	{
		send_to_char ("You're still reeling.\n", ch);
		return;
	}

	if (ch->roundtime)
	{
		sprintf (buf, "You'll need to wait another %d seconds.\n",
			ch->roundtime);
		send_to_char (buf, ch);
		return;
	}

	if (IS_SET (commands[i].flags, C_WLK) &&
		(ch->moves || GET_FLAG (ch, FLAG_LEAVING)
		|| GET_FLAG (ch, FLAG_ENTERING)))
	{
		send_to_char ("Stop traveling first.\n\r", ch);
		return;
	}

	if (IS_SET (commands[i].flags, C_MNT) && IS_RIDER (ch))
	{
		send_to_char ("Get off your mount first.\n", ch);
		return;
	}

	if (commands[i].min_position > GET_POS (ch))
	{
		switch (GET_POS (ch))
		{
		case DEAD:
			if (IS_MORTAL (ch))
			{
				send_to_char ("You are dead.  You can't do that.\n\r", ch);
				return;
			}
		case UNCON:
		case MORT:
			send_to_char ("You're seriously wounded and unconscious.\n\r", ch);
			return;

		case STUN:
			send_to_char ("You're too stunned to do that.\n\r", ch);
			return;

		case SLEEP:
			send_to_char ("You can't do that while sleeping.\n\r", ch);
			return;

		case REST:
			send_to_char ("You can't do that while lying down.\n\r", ch);
			return;

		case SIT:
			send_to_char ("You can't do that while sitting.\n\r", ch);
			return;

		case FIGHT:
			send_to_char ("No way! You are fighting for your life!\n\r", ch);
			return;
		}

		return;
	}

	if (!IS_NPC (ch) && ch->pc->create_state == STATE_DIED &&
		!IS_SET (commands[i].flags, C_DOA))
	{
		send_to_char ("You can't do that when you're dead.\n\r", ch);
		return;
	}

	if (!IS_SET (commands[i].flags, C_BLD) && is_blind (ch))
	{
		if (get_equip (ch, WEAR_BLINDFOLD))
			send_to_char ("You can't do that while blindfolded.\n\r", ch);
		else
			send_to_char ("You can't do that while blind.\n\r", ch);
		return;
	}

	if ((af = get_affect (ch, MAGIC_AFFECT_PARALYSIS)) &&
		!IS_SET (commands[i].flags, C_PAR) && IS_MORTAL (ch))
	{
		send_to_char ("You can't move.\n", ch);
		return;
	}

	if (IS_SUBDUEE (ch) && !IS_SET (commands[i].flags, C_SUB) && !cmd_level)
	{
		act ("$N won't let you.", false, ch, 0, ch->subdue, TO_CHAR);
		return;
	}

	/* Most commands break delays */

	if (ch->delay && !IS_SET (commands[i].flags, C_DEL))
		break_delay (ch);

	/* Send this command to the log */
	if (!second_affect_active && (!IS_NPC (ch) || ch->desc))
	{
		if (IS_SET (commands[i].flags, C_NLG))
			;
		else if (i > 0)
		{			/* Log craft commands separately. */
			if (!str_cmp (commands[i].command, "."))
				player_log (ch, "say", command_args);
			else if (!str_cmp (commands[i].command, ","))
				player_log (ch, "emote", command_args);
			else if (!str_cmp (commands[i].command, ":"))
				player_log (ch, "emote", command_args);
			else if (!str_cmp (commands[i].command, ";"))
				player_log (ch, "wiznet", command_args);
			else
				player_log (ch, commands[i].command, command_args);
		}
	}

	if (IS_MORTAL (ch) && get_affect (ch, MAGIC_HIDDEN) &&
		!IS_SET (commands[i].flags, C_HID) &&
		skill_level (ch, SKILL_SNEAK, 0) < number (1, MAX(100, skill_level(ch, SKILL_SNEAK, 0))) &&
		would_reveal (ch))
	{
		remove_affect_type (ch, MAGIC_HIDDEN);
		act ("$n reveals $mself.", true, ch, 0, 0, TO_ROOM | _ACT_FORMAT);
		act ("Your actions have compromised your concealment.", true, ch, 0, 0,
			TO_CHAR);
	}

	/* Execute command */

	if (!IS_SET (commands[i].flags, C_NWT))
		show_to_watchers (ch, social_args);

	if (!i)			/* craft_command */
		craft_command (ch, command_args, craft_affect);
	else

		(*commands[i].proc) (ch, command_args, 0);

	last_descriptor = NULL;
}
コード例 #2
0
ファイル: somatics.cpp プロジェクト: nuggs/RPI-Engine
void
soma_ten_second_affect (CHAR_DATA * ch, AFFECTED_TYPE * af)
{
  int save = 0, stat = 0;
  char *locat = NULL;
  char buf2[MAX_STRING_LENGTH];
  char buf[MAX_STRING_LENGTH];
  
  stat = GET_CON (ch);
  if ((number (1, 1000) > af->a.soma.atm_power)
      || (number (1, (stat > 20) ? stat : 20) <= stat))
    return;

  switch (af->type)
    {
      /*    case SOMA_MUSCULAR_CRAMP:       sprintf(buf2,"a muscle cramp"); break;
         case SOMA_MUSCULAR_TWITCHING:      sprintf(buf2,"twitching"); break;
         case SOMA_MUSCULAR_TREMOR: sprintf(buf2,"tremors"); break;
         case SOMA_MUSCULAR_PARALYSIS:      sprintf(buf2,"paralysis"); break;
         case SOMA_DIGESTIVE_ULCER: sprintf(buf2,"stomach ulcer"); break; 
         case SOMA_DIGESTIVE_VOMITING:      sprintf(buf2,"vomiting"); break;
         case SOMA_DIGESTIVE_BLEEDING:      sprintf(buf2,"vomiting blood"); break; 
         case SOMA_EYE_BLINDNESS:   sprintf(buf2,"blindness"); break;
         case SOMA_EYE_BLURRED:             sprintf(buf2,"blurred vision"); break;
         case SOMA_EYE_DOUBLE:              sprintf(buf2,"double vision"); break;
         case SOMA_EYE_DILATION:            sprintf(buf2,"dilated pupils"); break; 
         case SOMA_EYE_CONTRACTION: sprintf(buf2,"contracted pupils"); break; 
         case SOMA_EYE_LACRIMATION: sprintf(buf2,"lacrimation"); break;
         case SOMA_EYE_PTOSIS:              sprintf(buf2,"ptosis"); break;
         case SOMA_EAR_TINNITUS:            sprintf(buf2,"tinnitus"); break;
         case SOMA_EAR_DEAFNESS:            sprintf(buf2,"deafness"); break;
         case SOMA_EAR_EQUILLIBRIUM:        sprintf(buf2,"ear imbalance"); break;
         case SOMA_NOSE_ANOSMIA:            sprintf(buf2,"anosmia"); break;
         case SOMA_NOSE_RHINITIS:   sprintf(buf2,"rhinitis"); break;
         case SOMA_MOUTH_SALIVATION:        sprintf(buf2,"salivation"); break;
         case SOMA_MOUTH_TOOTHACHE: sprintf(buf2,"toothache"); break;
         case SOMA_MOUTH_DRYNESS:   sprintf(buf2,"dry mouth"); break;
         case SOMA_MOUTH_HALITOSIS: sprintf(buf2,"halitosis"); break;
         case SOMA_CHEST_DIFFICULTY:        sprintf(buf2,"difficulty breathing"); break;
         case SOMA_CHEST_RAPIDBREATH:       sprintf(buf2,"rapid breathing"); break;
         case SOMA_CHEST_SLOWBREATH:        sprintf(buf2,"shallow breathing"); break;
         case SOMA_CHEST_FLUID:             sprintf(buf2,"fluidous lungs"); break;
         case SOMA_CHEST_PALPITATIONS:      sprintf(buf2,"heart palpitations"); break; */

    case SOMA_CHEST_COUGHING:

      stat = GET_WIL (ch);
      save = number (1, (stat > 20) ? stat : 20);

      if (get_affect (ch, MAGIC_HIDDEN) && would_reveal (ch))
	{
	  if (save > stat)
	    {
	      remove_affect_type (ch, MAGIC_HIDDEN);
	      act ("$n reveals $mself with an audible cough.", true, ch, 0, 0,
		   TO_ROOM);
	    }
	  else if (save > (stat / 2))
	    {
	      act ("You hear a muffled sound from somewhere nearby.", true,
		   ch, 0, 0, TO_ROOM);
	    }
	}
      else if ((save <= stat) && (save > (stat / 2)))
	{
	  act ("$n tries to stifle a cough.", true, ch, 0, 0, TO_ROOM);
	}

      if (save > stat)
	{
	  act ("You cough audibly.", true, ch, 0, 0, TO_CHAR);
	}
      else
	{
	  act ("You try to stifle a cough silently.", true, ch, 0, 0,
	       TO_CHAR);
	}
      break;

	case SOMA_CHEST_WHEEZING:

      stat = GET_WIL (ch);
      save = number (1, (stat > 20) ? stat : 20);

      if (get_affect (ch, MAGIC_HIDDEN) && would_reveal (ch))
	{
	  if (save > stat)
	    {
	      remove_affect_type (ch, MAGIC_HIDDEN);
	      act ("$n reveals $mself with an audible wheeze.", true, ch, 0, 0,
		   TO_ROOM);
	    }
	  else if (save > (stat / 2))
	    {
	      act ("You hear a muffled sound from somewhere nearby.", true,
		   ch, 0, 0, TO_ROOM);
	    }
	}
      else if ((save <= stat) && (save > (stat / 2)))
	{
	  act ("$n tries to stifle their wheezing.", true, ch, 0, 0, TO_ROOM);
	}

      if (save > stat)
	{
	  act ("You wheeze audibly.", true, ch, 0, 0, TO_CHAR);
	}
      else
	{
	  act ("You try to stifle your wheezing.", true, ch, 0, 0,
	       TO_CHAR);
	}
      break;


	case SOMA_NERVES_HEADACHE:

      stat = GET_WIL (ch);
      save = number (1, (stat > 20) ? stat : 20);

      if (save > stat)
	{
	  act ("Your head pounds with a headache.", true, ch, 0, 0, TO_CHAR);
	}
      else
	{
	  act ("You manage to ignore the pounding in your head.", true, ch, 0, 0,
	       TO_CHAR);
	}
      break;

	case SOMA_MUSCULAR_CRAMP:
	
			stat = GET_WIL (ch);
      save = number (1, (stat > 20) ? stat : 20);
			locat = expand_wound_loc(figure_location(ch, number(0,2)));

      if (save > stat)
				{
				sprintf(buf, "You get an intense cramp in your %s which persist for several minutes beofre finally relaxing\n", locat);
	  		act (buf, true, ch, 0, 0, TO_CHAR);
	  		 act ("$n suddenly cringes in pain.", true, ch, 0, 0, TO_ROOM);
				}
      else
				{
				sprintf(buf, "You get an intense cramp in your %s, but you shake it off quickly\n", locat);
	  		act (buf, true, ch, 0, 0, TO_CHAR);
	  		act ("$n suddenly cringes in pain, but quickly recovers.", true, ch, 0, 0, TO_ROOM);
				}
      break;

     
    case SOMA_MUSCULAR_TWITCHING:
    	stat = GET_WIL (ch);
      save = number (1, (stat > 20) ? stat : 20);
			locat = expand_wound_loc(figure_location(ch, number(0,2)));
			
      if (save > stat)
				{
				sprintf(buf, "You feel a strong twitching in your %s which persist for several minutes before finally relaxing\n", locat);
	  		act (buf, true, ch, 0, 0, TO_CHAR);
	  		sprintf(buf2, "$n suddenly cringes in pain, as $s %s twitches.", locat);
	  		act (buf2, true, ch, 0, 0, TO_ROOM);
				}
      else
				{
				sprintf(buf, "You feel a strong twitching in your %s, but you control it quickly\n", locat);
	  		act (buf, true, ch, 0, 0, TO_CHAR);
	  		sprintf(buf2, "$n cringes in pain, as $s %s twitches momentarily.", locat);
	  		act (buf2, true, ch, 0, 0, TO_ROOM);
	  		
				}
      break;      
      

      /*  case SOMA_CHEST_PNEUMONIA:      sprintf(buf2,"pneumonia"); break;
         case SOMA_NERVES_PSYCHOSIS:      sprintf(buf2,"psychosis"); break;
         case SOMA_NERVES_DELIRIUM:       sprintf(buf2,"delerium "); break;
         case SOMA_NERVES_COMA:           sprintf(buf2,"a comatose state"); break;
         case SOMA_NERVES_CONVULSIONS:    sprintf(buf2,"convulsions"); break;
         case SOMA_NERVES_CONFUSION:      sprintf(buf2,"confusion"); break;
         case SOMA_NERVES_PARETHESIAS:    sprintf(buf2,"parethesias"); break;
         case SOMA_NERVES_ATAXIA: sprintf(buf2,"ataxia"); break;
         case SOMA_NERVES_EQUILLIBRIUM:   sprintf(buf2,"nervous imbalance"); break;
         case SOMA_SKIN_CYANOSIS: sprintf(buf2,"cyanosis of the skin"); break;
         case SOMA_SKIN_DRYNESS:          sprintf(buf2,"dryness of the skin"); break;
         case SOMA_SKIN_CORROSION:        sprintf(buf2,"corrosion of the skin"); break;
         case SOMA_SKIN_JAUNDICE: sprintf(buf2,"jaundice of the skin"); break;
         case SOMA_SKIN_REDNESS:          sprintf(buf2,"redness of the skin"); break;
         case SOMA_SKIN_RASH:             sprintf(buf2,"a rash on the skin"); break;
         case SOMA_SKIN_HAIRLOSS: sprintf(buf2,"hairloss"); break;
         case SOMA_SKIN_EDEMA:            sprintf(buf2,"edema of the skin"); break;
         case SOMA_SKIN_BURNS:            sprintf(buf2,"burns on the skin"); break;
         case SOMA_SKIN_PALLOR:           sprintf(buf2,"pallor of the skin"); break;
         case SOMA_SKIN_SWEATING: sprintf(buf2,"the sweats"); break;
         case SOMA_GENERAL_WEIGHTLOSS:    sprintf(buf2,"weight loss"); break;
         case SOMA_GENERAL_LETHARGY:      sprintf(buf2,"lethargy"); break;
         case SOMA_GENERAL_APPETITELOSS:  sprintf(buf2,"appetite loss"); break;
         case SOMA_GENERAL_PRESSUREDROP:  sprintf(buf2,"low blood pressure"); break;
         case SOMA_GENERAL_PRESSURERISE:  sprintf(buf2,"high blood pressure"); break;
         case SOMA_GENERAL_FASTPULSE:     sprintf(buf2,"a fast pulse"); break;
         case SOMA_GENERAL_SLOWPULSE:     sprintf(buf2,"a slow pulse"); break;
         case SOMA_GENERAL_HYPERTHERMIA:  sprintf(buf2,"hyperthermia"); break;
         case SOMA_GENERAL_HYPOTHERMIA:   sprintf(buf2,"hypothermia"); break;
       */
    default:
      break;
    }
}