Exemplo n.º 1
0
/* this procedure handles the input parsing for the skill generator */
bool parse_gen_groups(CHAR_DATA *ch,const char *argument) {
  char arg[MAX_INPUT_LENGTH];
  char buf[100];
  int gn,sn,i;

  if (argument[0] == '\0')
    return FALSE;

  argument = one_argument(argument,arg);

  if (!str_prefix(arg,"help")) {
    if (argument[0] == '\0') {
      do_help(ch,"group help");
      return TRUE;
    }
    
    do_help(ch,argument);
    return TRUE;
  }

  // Removed by SinaC 2001, replaced with help
  /*
  // Added by Sinac 1997
  if (!str_prefix(arg,"level")) {
    do_level(ch,argument);
    return TRUE;
  }
  */

  // Added by SinaC 2001, so spells can be gained one by one not only by group
  if (!str_prefix(arg,"spell")) {
    list_spell_costs(ch);
    return TRUE;
  }

  // Added by SinaC 2001, so powers can be gained one by one not only by group
  if (!str_prefix(arg,"power")) {
    list_power_costs(ch);
    return TRUE;
  }

  // Added by SinaC 2003
  if (!str_prefix(arg,"song")) {
    list_song_costs(ch);
    return TRUE;
  }

  if (!str_prefix(arg,"add")) {
    if (argument[0] == '\0') {
      send_to_char("You must provide a skill/spell or group name.\n\r",ch);
      return TRUE;
    }
    
    gn = group_lookup(argument);
    if (gn != -1) {
      if (ch->gen_data->group_chosen[gn]
	  ||  ch->pcdata->group_known[gn]) {
	send_to_char("You already know that group!\n\r",ch);
	return TRUE;
      }
      
      if (class_grouprating( ch->bstat(classes), gn ) <= 0
	  || god_grouprating( ch, gn ) <= 0 ) {
	send_to_char("That group is not available.\n\r",ch);
	return TRUE;
      }
    
      sprintf(buf,"{W%s group added.{x\n\r",group_table[gn].name);
      send_to_char(buf,ch);
      ch->gen_data->group_chosen[gn] = TRUE;
      ch->gen_data->points_chosen += class_grouprating( ch->bstat(classes), gn );
      gn_add(ch,gn);
      ch->pcdata->points += class_grouprating( ch->bstat(classes), gn );
      return TRUE;
    }
    
    sn = ability_lookup(argument);
    if (sn != -1) {
      // Modified by SinaC 2001 for god skill
      if (ch->gen_data->ability_chosen[sn]
	  || get_raceability( ch, sn )
	  || get_clanability( ch, sn )
	  /*|| get_godskill( ch, sn )  removed by SinaC 2003*/
	  ||  ch->pcdata->ability_info[sn].learned > 0) {
	send_to_char("You already know that skill/spell/power/song!\n\r",ch);
	return TRUE;
      }
      
      // Modified by SinaC 2003
      if (class_gainabilityrating(ch, sn, ch->pcdata->ability_info[sn].casting_level ) <= 0
	  // Removed by SinaC 2001 so spells can be gained one by one
	  //  not only by group
	  /*||  ability_table[sn].spell_fun != spell_null*/) {
	send_to_char("That skill/spell/power/song is not available.\n\r",ch);
	return TRUE;
      }

      // Added by SinaC 2001
      if ( !can_gain_creation( ch, sn ) ) {
 	send_to_charf( ch, "You don't fit the prereqs for %s.\n\r",
		       ability_table[sn].name);
	return TRUE;
      }


      sprintf(buf, "{W%s skill/spell/power/song added.{x\n\r",ability_table[sn].name);
      send_to_char(buf,ch);
      ch->gen_data->ability_chosen[sn] = TRUE;
      ch->gen_data->points_chosen += class_abilityrating( ch, sn, ch->pcdata->ability_info[sn].casting_level );
      //ch->pcdata->ability_info[sn].learned = 1;  SinaC 2003, casting level need to be set
      group_add( ch, ability_table[sn].name, FALSE );
      ch->pcdata->points += class_abilityrating( ch, sn, ch->pcdata->ability_info[sn].casting_level );
      return TRUE;
    }
    
    send_to_char("No skills/spells/powers/songs or groups by that name...\n\r",ch);
    return TRUE;
  }
  
  if (!str_cmp(arg,"drop")) {
    if (argument[0] == '\0') {
      send_to_char("You must provide a skill/spell/power/song or group to drop.\n\r",ch);
      return TRUE;
    }

    gn = group_lookup(argument);
    if (gn != -1 && ch->gen_data->group_chosen[gn]) {
      send_to_char("{WGroup dropped.{x\n\r",ch);
      ch->gen_data->group_chosen[gn] = FALSE;
      ch->gen_data->points_chosen -= class_grouprating( ch->bstat(classes), gn );
      gn_remove(ch,gn);
      for (i = 0; i < MAX_GROUP; i++) {
	if (ch->gen_data->group_chosen[gn])
	  gn_add(ch,gn);
      }
      ch->pcdata->points -= class_grouprating( ch->bstat(classes), gn );
      // To avoid losing basic abilities which would be included in the group we just removed
      //  we re-add basics
      group_add( ch, class_table[ class_firstclass( ch->bstat(classes) ) ].base_group, FALSE );
      return TRUE;
    }
    
    sn = ability_lookup(argument);
    if (sn != -1 && ch->gen_data->ability_chosen[sn]) {
      send_to_char("{WSkill/spell/power/song dropped.{x\n\r",ch);
      ch->gen_data->ability_chosen[sn] = FALSE;
      ch->gen_data->points_chosen -= class_abilityrating( ch, sn, ch->pcdata->ability_info[sn].casting_level );
      ch->pcdata->ability_info[sn].learned = 0;
      ch->pcdata->points -= class_abilityrating( ch, sn, ch->pcdata->ability_info[sn].casting_level );
      return TRUE;
    }
    
    send_to_char("You haven't bought any such skill/spell/power/song or group.\n\r",ch);
    return TRUE;
  }
  
  if (!str_prefix(arg,"premise")) {
    do_help(ch,"premise");
    return TRUE;
  }
  
  if (!str_prefix(arg,"list")) {
    list_group_costs(ch);
    return TRUE;
  }
  
  if (!str_prefix(arg,"learned")) {
    list_group_chosen(ch);
    return TRUE;
  }

  // Added by SinaC 2000
  if (!str_prefix(arg,"known")){
    list_group_known(ch);
  }
  
  if (!str_prefix(arg,"info")) {
    do_groups(ch,argument);
    return TRUE;
  }

  return FALSE;
}
Exemplo n.º 2
0
/* this procedure handles the input parsing for the skill generator */
bool parse_gen_groups(CHAR_DATA *ch,char *argument)
{
	char arg[MAX_INPUT_LENGTH]={'\0'};
	int gn,sn;

	if (argument[0] == '\0')
		return FALSE;

	argument = one_argument(argument,arg);

	if (!str_prefix(arg,"help"))
	{
		if (argument[0] == '\0')
		{
			do_function(ch, &do_help, "group help");
			return TRUE;
		}

		do_function(ch, &do_help, argument);
		return TRUE;
	}

	if (!str_prefix(arg,"add"))
	{
		if (argument[0] == '\0')
		{
			send_to_char("You must provide a skill name.\n\r",ch);
			return TRUE;
		}

		gn = group_lookup(argument);
		if (gn != -1)
		{
			if (ch->gen_data->group_chosen[gn]
				||  ch->pcdata->group_known[gn])
			{
				send_to_char("You already know that group!\n\r",ch);
				return TRUE;
			}

			if (group_table[gn].rating[ch->iclass] < 1)
			{
				send_to_char("That group is not available.\n\r",ch);
				return TRUE;
			}

		/* Close security hole */
			if (ch->gen_data->points_chosen + group_table[gn].rating[ch->iclass] > 300)
			{
				send_to_char( "You cannot take more than 300 creation points.\n\r", ch);
				return TRUE;
			}

			send_to_char( Format("%s group added\n\r",group_table[gn].name), ch);
			ch->gen_data->group_chosen[gn] = TRUE;
			ch->gen_data->points_chosen += group_table[gn].rating[ch->iclass];
			gn_add(ch,gn);
			ch->pcdata->points += group_table[gn].rating[ch->iclass];
			return TRUE;
		}

		sn = skill_lookup(argument);
		if (sn != -1)
		{
			if (ch->gen_data->skill_chosen[sn]
				||  ch->pcdata->learned[sn] > 0)
			{
				send_to_char("You already know that skill!\n\r",ch);
				return TRUE;
			}

			if (skill_table[sn].rating[ch->iclass] < 1
				||  skill_table[sn].spell_fun != spell_null)
			{
				send_to_char("That skill is not available.\n\r",ch);
				return TRUE;
			}

		/* Close security hole */
			if (ch->gen_data->points_chosen + skill_table[sn].rating[ch->iclass]
				> 300)
			{
				send_to_char("You cannot take more than 300 creation points.\n\r", ch);
				return TRUE;
			}
			send_to_char( Format("%s skill added\n\r",skill_table[sn].name), ch);
			ch->gen_data->skill_chosen[sn] = TRUE;
			ch->gen_data->points_chosen += skill_table[sn].rating[ch->iclass];
			ch->pcdata->learned[sn] = 1;
			ch->pcdata->points += skill_table[sn].rating[ch->iclass];
			return TRUE;
		}

		send_to_char("No skills or groups by that name...\n\r",ch);
		return TRUE;
	}

	if (!strcmp(arg,"drop"))
	{
		if (argument[0] == '\0')
		{
			send_to_char("You must provide a skill to drop.\n\r",ch);
			return TRUE;
		}

		gn = group_lookup(argument);
		if (gn != -1 && ch->gen_data->group_chosen[gn])
		{
			int i = 0;
			send_to_char("Group dropped.\n\r",ch);
			ch->gen_data->group_chosen[gn] = FALSE;
			ch->gen_data->points_chosen -= group_table[gn].rating[ch->iclass];
			gn_remove(ch,gn);
			for (i = 0; i < MAX_GROUP; i++)
			{
				if (ch->gen_data->group_chosen[gn])
					gn_add(ch,gn);
			}
			ch->pcdata->points -= group_table[gn].rating[ch->iclass];
			return TRUE;
		}

		sn = skill_lookup(argument);
		if (sn != -1 && ch->gen_data->skill_chosen[sn])
		{
			send_to_char("Skill dropped.\n\r",ch);
			ch->gen_data->skill_chosen[sn] = FALSE;
			ch->gen_data->points_chosen -= skill_table[sn].rating[ch->iclass];
			ch->pcdata->learned[sn] = 0;
			ch->pcdata->points -= skill_table[sn].rating[ch->iclass];
			return TRUE;
		}

		send_to_char("You haven't bought any such skill or group.\n\r",ch);
		return TRUE;
	}

	if (!str_prefix(arg,"premise"))
	{
		do_function(ch, &do_help, "premise");
		return TRUE;
	}

	if (!str_prefix(arg,"list"))
	{
		list_group_costs(ch);
		return TRUE;
	}

	if (!str_prefix(arg,"learned"))
	{
		list_group_chosen(ch);
		return TRUE;
	}

	if (!str_prefix(arg,"info"))
	{
		do_function(ch, &do_groups, argument);
		return TRUE;
	}

	return FALSE;
}