Beispiel #1
0
void new_save_affect( AFFECT_DATA *paf, FILE *fp ) {
  //    Affect = ( 'enchant armor', -1, 110, 0, ('permanent'),
  //	 	 ( 'char', 'damroll', 0, 50 ),
  //             ( 'char', 'hitroll', 0, 50 ) );
  char buf[MAX_STRING_LENGTH*2];
  sprintf( buf, "  Affect = ( %s, %d, %d, %d, (%s)", 
	   paf->type >= 0 ? quotify(ability_table[paf->type].name) : "'none'",
	   paf->duration, paf->level, paf->casting_level,
	   list_flag_string( paf->flags, affect_data_flags, "'", ", " ) );
  if ( paf->list != NULL ) {
    strcat( buf, ",\n" );
    for ( AFFECT_LIST *laf = paf->list; laf != NULL; laf = laf->next ) {
      char buf2[MAX_STRING_LENGTH];
      char loc[MAX_STRING_LENGTH];
      char mod[MAX_STRING_LENGTH];
      switch (laf->where) {
      case AFTO_CHAR: 
	strcpy( loc, quotify(flag_string(attr_flags,laf->location)) );
	if (attr_table[laf->location].bits == NULL)
	  sprintf( mod, "%ld", laf->modifier);
	else
	  sprintf( mod, "(%s)", list_flag_string(laf->modifier,attr_table[laf->location].bits));
	break;
      case AFTO_ROOM:
	strcpy( loc, quotify(flag_string(room_attr_flags,laf->location)) );
	if (room_attr_table[laf->location].bits == NULL)
	  sprintf( mod, "%ld", laf->modifier);
	else
	  sprintf( mod, "(%s)", list_flag_string(laf->modifier,room_attr_table[laf->location].bits));
	break;
      case AFTO_OBJVAL:
	sprintf( loc, "%d", laf->location );
	sprintf( mod, "%ld", laf->modifier);
	break;
      case AFTO_WEAPON:
	sprintf( loc, "'weapon'" );
	sprintf( mod,"(%s)", list_flag_string( laf->modifier, weapon_type2 ) );
	break;
      case AFTO_OBJECT:
	strcpy( loc, "'extra'" );
	sprintf( mod,"(%s)", list_flag_string( laf->modifier, extra_flags) );
	break;
      }
      //sprintf( buf2, "            ( %s, %s, %d, %ld )",
      sprintf( buf2, "            ( %s, %s, %d, %s )",
	       quotify(flag_string(afto_type,laf->where)),
	       loc,
	       laf->op,
	       //laf->modifier);
	       mod );
      strcat( buf, buf2 );
      if ( laf->next != NULL )
	strcat( buf, ",\n");
    }
  }
  strcat( buf, " );\n");
  sh_fprintf( fp, buf );
}
Beispiel #2
0
// format restrictions into a buffer
void restrstring( char *buf, RESTR_DATA *restr ) {
  // Added by SinaC 2000 for skill/spell restriction
  //if ( restr->ability_r ) {
  if ( restr->type == RESTR_ABILITY ) {
    if ( restr->not_r == FALSE )
      sprintf( buf, "requires                  at least %4d%%  in      %22s\n\r",
	       restr->value, 
	       ability_table[restr->sn].name );
    else
      sprintf( buf, "requires                 less than %4d%%  in      %22s\n\r",
	       restr->value, 
	       ability_table[restr->sn].name );
  }
  else {
    // Modified by SinaC 2000
    // >=         str, int, wis, dex, con         if not_r not set
    // <                                          if not_r set
    if ( restr_table[restr->type].bits == NULL ) {
      if ( restr->not_r == FALSE )
	sprintf( buf, "requires                  at least %5d  in      %22s\n\r",
		 restr->value, 
		 restr_table[restr->type].name );
      else
	sprintf( buf, "requires                 less than %5d  in      %22s\n\r",
		 restr->value, 
		 restr_table[restr->type].name );
    }
    // =          race, sex, [--size]                if not_r not set
    // !=                                        if not_r set
    else if ( is_stat( restr_table[restr->type].bits ) ) {
      if ( restr->not_r == FALSE )
	sprintf( buf, "requires                  %14s  equals to    %17s\n\r",
		 restr_table[restr->type].name,
		 flag_string( restr_table[restr->type].bits, restr->value ) );
      else
	sprintf( buf, "requires                  %14s  not equals to %16s\n\r",
		 restr_table[restr->type].name,
		 flag_string( restr_table[restr->type].bits, restr->value ) );
    }
    // or         parts, classes, form           if not_r not set
    // nor                                       if not_r set
    else {
      if ( restr->not_r == FALSE )
	sprintf( buf, "requires                  %14s  has      %21s\n\r",
		 restr_table[restr->type].name,
		 flag_string( restr_table[restr->type].bits, restr->value ));
      else
	sprintf( buf, "requires                  %14s  has not  %21s\n\r",
		 restr_table[restr->type].name,
		 flag_string( restr_table[restr->type].bits, restr->value ));
    }
  }
}
Beispiel #3
0
int main(int argc, const char **argv) {
    // Default parameters
    const char* tileX = "19294";
    const char* tileY = "24642";
    int tileZ = 16;
    float offsetX = 0.f;
    float offsetY = 0.f;
    int aoAtlasSize = 512;
    int aoSamples = 256;
    int aoBaking = 0;
    int splitMeshes = 0;
    int append = 0;
    int terrain = 0;
    int terrainSubdivision = 64;
    float terrainExtrusionScale = 1.f;
    int buildings = 1;
    float buildingsExtrusionScale = 1.f;
    const char* name = NULL;
    const char* apiKey = "vector-tiles-qVaBcRA";

    // Parse params
    flag_usage("[options]");
    flag_string(&name, "name", "File name");
    flag_string(&apiKey, "apikey", "Developer API key (https://mapzen.com/developers/)");
    flag_int(&splitMeshes, "splitMeshes", "Generate one mesh per feature in wavefront file");
    flag_string(&tileX, "tilex", "Tile X (can be a tile range: 19294/19295)");
    flag_string(&tileY, "tiley", "Tile Y (can be a tile range: 24642/24643)");
    flag_int(&tileZ, "tilez", "Tile Z (zoom)");
    flag_float(&offsetX, "offsetx", "Global tile Offset on X coordinate");
    flag_float(&offsetY, "offsety", "Global tile Offset on Y coordinate");
    flag_int(&append, "append", "Append the obj to an existing obj file");
    flag_int(&buildings, "buildings", "Whether to export building geometry");
    flag_float(&buildingsExtrusionScale, "buildingsExtrusionScale", "Building height scale factor");
    flag_int(&terrain, "terrain", "Generate terrain elevation topography");
    flag_int(&terrainSubdivision, "terrainSubdivision", "Terrain mesh subdivision");
    flag_float(&terrainExtrusionScale, "terrainExtrusionScale", "Terrain mesh extrusion scale");
    flag_int(&aoBaking, "aoBaking", "Generate ambiant occlusion baked atlas");
    flag_int(&aoAtlasSize, "aoAtlasSize", "Controls resolution of atlas");
    flag_int(&aoSamples, "aoSamples", "Number of samples for ambient occlusion");
    flag_parse(argc, argv, "v" "0.1.0", 0);

    if (append && aoBaking) {
        printf("Can't use options --append and --bakeAO altogether");
        printf("Those option are currently exclusive");
        return EXIT_FAILURE;
    }

    struct Params parameters = {&name[0], &apiKey[0], tileX, tileY, tileZ, {offsetX, offsetY},
        (bool)splitMeshes, aoAtlasSize, aoSamples, (bool)aoBaking, (bool)append, (bool)terrain,
        terrainSubdivision, terrainExtrusionScale, (bool)buildings, buildingsExtrusionScale};

    return vectiler(parameters);
}
Beispiel #4
0
char * shop2str( void * point )
{
	SHOP_DATA *pShop = *(SHOP_DATA **) point;
	int iTrade;
static	char buf[MSL];
	char tmpbuf[MIL];

	sprintf( buf,
	  "Gain when selling: %d%%\n\r"
	  "Gain when buying : %d%%\n\r"
	  "Hours : %d to %d\n\r",
		pShop->profit_buy, pShop->profit_sell,
		pShop->open_hour, pShop->close_hour );

	for ( iTrade = 0; iTrade < MAX_TRADE; iTrade++ )
	{
	    if ( pShop->buy_type[iTrade] != 0 )
	    {
		if ( iTrade == 0 )
		    strcat( buf, "N Type\n\r" );
		sprintf( tmpbuf, "%d %s\n\r", iTrade,
			flag_string( type_flags, pShop->buy_type[iTrade] ) );
		strcat(buf,tmpbuf);
	    }
	}

	return buf;
}
Beispiel #5
0
int main(int argc, const char **argv)
{
    char const* outmesh = "result.obj";
    char const* atlas = "result.png";
    char const* mtl = "result.mtl";
    int sizehint = 32;
    int nsamples = 128;
    bool gbuffer = false;
    bool chartinfo = false;
    float multiply = 1.0;
    flag_usage("[options] input_mesh.obj");
    flag_string(&outmesh, "outmesh", "OBJ file to produce");
    flag_string(&atlas, "atlas", "PNG file to produce");
    flag_string(&mtl, "material", "MTL file to produce");
    flag_int(&sizehint, "sizehint", "Controls resolution of atlas");
    flag_int(&nsamples, "nsamples", "Quality of ambient occlusion");
    flag_bool(&gbuffer, "gbuffer", "Generate diagnostic images");
    flag_bool(&chartinfo, "ids", "Group faces by charts, add alpha channel");
    flag_float(&multiply, "multiply", "Scales the AO values be a constant");
    flag_parse(argc, argv, "v" AOBAKER_VERSION, 1);
    char const* inmesh = flagset_singleton()->argv[0];
    return aobaker_bake(inmesh, outmesh, mtl, atlas, sizehint, nsamples, gbuffer,
        chartinfo, multiply);
}
Beispiel #6
0
void Forge::NameWeapon(CHAR_DATA & ch, const char * argument)
{
    // Check for name effect
    AFFECT_DATA * paf(FindNameEffect(ch));
    if (paf == NULL)
    {
        send_to_char("You have no weapon waiting to receive a Name.\n", &ch);
        return;
    }

    // Verify the object
    OBJ_DATA * obj(FindNameableObject(ch, *paf));
    affect_remove(&ch, paf);
    if (obj == NULL)
    {
        send_to_char("You are no longer carrying the weapon you empowered to receive a Name.\n", &ch);
        return;
    }

    // Object exists and is carried by the char, so name it according to the argument
    act("You pass your hand over $p, willing the Name into it.", &ch, obj, NULL, TO_CHAR);
    act("$n passes $s hand over $p, murmuring softly.", &ch, obj, NULL, TO_ROOM);

    // Echo about the naming
    std::ostringstream mess;
    mess << "A deep rush of power sweeps over $p as it claims the Name \"" << argument << "\"!";
    act(mess.str().c_str(), &ch, &obj, NULL, TO_ALL);

    // Add the name to the short desc
    std::string shortDesc(obj->short_descr);
    shortDesc += ", \"";
    shortDesc += argument;
    shortDesc += '"';
    SetBasicDescs(*obj, shortDesc.c_str(), true);

    // Create lore
    static char *his_her       [] = { "its", "his", "her" };
    const char * ch_name(IS_NPC(&ch) ? ch.short_descr : ch.name);
    std::ostringstream lore;
    lore << "Forged by the " << race_table[ch.race].name << " smith " << ch_name;
    lore << ", this mighty " << flag_string(weapon_class, obj->value[0]) << " was given its Name by the same.";
    lore << "Imbuing it with " << his_her[ch.sex] << " own power, " << ch_name << " marked \"" << argument;
    lore << "\" as an extension of " << his_her[ch.sex] << " very being.";
    copy_string(obj->lore, lore.str().c_str());
    obj->lore = format_string(obj->lore);
}
Beispiel #7
0
// Convert a flag into a string each word inside '' and separated by ,
const char *list_flag_string( const long flag, struct flag_type *flag_table, const char *quote, const char *separator ) {
  char buf2[MAX_STRING_LENGTH];
  static char buf[MAX_STRING_LENGTH];
  strcpy( buf2, flag_string( flag_table, flag ) );

  if ( !str_cmp( buf2, "none") )
    return str_dup( quotify("none",quote) );

  int nb_space = 1;             // if not bitvector -> only 1 value
  if ( !is_stat( flag_table ) ) // if bitvector -> count bit
    nb_space = count_bit( flag ); // number of words

  //  log_stringf("table: %s  nb_space: %d   buf2: %s   flag: %ld", get_flag_table_name(flag_table), nb_space, buf2, flag );

  buf[0] = '\0';
  char *s = buf2;
  char* tok = strsep(&s, " " );
  int i = 0;
  while ( tok != NULL ) {
    if ( tok[0] != '\0' ) {
      //strcat( buf, bracket);
      //strcat( buf, tok );
      //strcat( buf, bracket);
      strcat( buf, quotify( tok, quote ) );
      if ( i < nb_space-1 )
	   //	   && tok != NULL && tok[0] != NULL )
	strcat( buf, separator );
      i++;
    }

    tok = strsep(&s, " " );
  }
  if ( i != nb_space && !is_stat(flag_table) ) {
    bug("List_Flag_String: invalid number of word: %d, number of bits %d [flag = %ld] [table: %s]",
	i, nb_space, flag, get_flag_table_name(flag_table) );
    buf[strlen(buf)-strlen(separator)] = '\0';
  }

  return str_dup(buf);
}
Beispiel #8
0
/*****************************************************************************
 Name:		save_resets
 Purpose:	Saves the #RESETS section of an area file.
                New format thanks to Rac.
 Called by:	save_area(olc_save.c)
 ****************************************************************************/
void vsave_resets( FILE *fp, AREA_DATA *pArea )
{
    RESET_DATA *pReset;
    MOB_INDEX_DATA *pLastMob = NULL;
    OBJ_INDEX_DATA *pLastObj;
    ROOM_INDEX_DATA *pRoomIndex;
    char buf[MAX_STRING_LENGTH];
    int vnum;

    fprintf( fp, "#RESETS\n" );

    for( vnum = pArea->lvnum; vnum <= pArea->uvnum; vnum++ )
    {
        if( ( pRoomIndex = get_room_index(vnum) ) )
        {
            if ( pRoomIndex->area == pArea )
            {
                for ( pReset = pRoomIndex->reset_first; pReset; pReset = pReset->next )
                {
                    switch ( pReset->command )
                    {
                        default:
                            bug( "Save_resets: bad command %c.", pReset->command );
                            break;

                        case 'M':
                            pLastMob = get_mob_index( pReset->arg1 );
                            fprintf( fp, "M 0 %d %2d %-5d \t; %s to %s\n",
                                pReset->arg1,
                                pReset->arg2,
                                pReset->arg3,
                                pLastMob->short_descr,
                                pRoomIndex->name );
                            break;

                        case 'O':
                            pLastObj = get_obj_index( pReset->arg1 );
                            fprintf( fp, "O 0 %d  0 %-5d \t; %s to %s\n",
                                pReset->arg1,
                                pReset->arg3,
                                capitalize(pLastObj->short_descr),
                                pRoomIndex->name );
                            break;

                        case 'P':
                            pLastObj = get_obj_index( pReset->arg1 );
                            fprintf( fp, "P 0 %d  0 %-5d \t; %s inside %s\n",
                                pReset->arg1,
                                pReset->arg3,
                                capitalize(get_obj_index( pReset->arg1 )->short_descr),
                                pLastObj ? pLastObj->short_descr : "!NO_OBJ!" );

                            if ( !pLastObj )                /* Thanks Rac! */
                            {
                                sprintf( buf, "Save_resets: P with !NO_OBJ! in [%s]", pArea->filename );
                                bug( buf, 0 );
                            }

                            break;

                        case 'G':
                            pLastObj = get_obj_index( pReset->arg1 );
                            fprintf( fp, "G 0 %d  0      \t;   %s\n",
                                pReset->arg1,
                                capitalize(pLastObj->short_descr) );

                            if ( !pLastMob )
                            {
                                sprintf( buf, "Save_resets: !NO_MOB! in [%s]", pArea->filename );
                                bug( buf, 0 );
                            }
                            break;

                        case 'E':
                            fprintf( fp, "E 0 %d  0 %-5d \t;   %s %s\n",
                                pReset->arg1,
                                pReset->arg3,
                                capitalize(get_obj_index( pReset->arg1 )->short_descr),
                                flag_string( wear_loc_strings, pReset->arg3 ) );
                            if ( !pLastMob )
                            {
                                sprintf( buf, "Save_resets: !NO_MOB! in [%s]", pArea->filename );
                                bug( buf, 0 );
                            }
                            break;

                        case 'D':
                            break;

                        case 'R':
                            fprintf( fp, "R 0 %d %2d      \t; Randomize %s\n",
                                pReset->arg1,
                                pReset->arg2,
                                pRoomIndex->name );
                            break;
                    }                                       /* End switch */
                }                                           /* End for pReset */
            }                                               /* End if correct area */
        }                                                   /* End if pRoomIndex */
    }                                                       /* End for vnum */
    fprintf( fp, "S\n\n\n\n" );
    return;
}
Beispiel #9
0
void UpdateOLCScreen(DESCRIPTOR_DATA *d)
{
	char buf[MSL*2], buf2[MSL*2];
	void * point;
const	struct olc_show_table_type * table;
	int blah, i, largo, x, y, j;
extern	ROOM_INDEX_DATA xRoom;
	STRFUNC * func;
	char * tmpstr;
const	struct flag_type * flagt;

	if (d->screenmap == NULL || d->oldscreenmap == NULL)
		InitScreenMap(d);

	switch(d->editor)
	{
		default:	return;
		case ED_ROOM:	table = redit_olc_show_table;
				blah = (int) &xRoom;
				break;
		case ED_MOBILE:	table = medit_olc_show_table;
				blah = (int) &xMob;
				break;
		case ED_OBJECT:	table = oedit_olc_show_table;
				blah = (int) &xObj;
				break;
	}

	write_to_buffer( d, VT_CURSAVE, 0 );

	tmpstr		= d->oldscreenmap;
	d->oldscreenmap	= d->screenmap;
	d->screenmap	= tmpstr;

	for ( i = 0; table[i].name != NULL; i++ )
	{
		point = (void *) ((int) table[i].point - (int) blah + (int) d->pEdit);

		if (table[i].page != d->page)
			continue;

		switch(table[i].type)
		{
			default:break;
			case OLCS_STRING:
			strcpy(buf, *(char **) point);
			break;

			case OLCS_INT:
			strcpy(buf, itos(*(int *)point));
			break;

			case OLCS_SHINT:
			strcpy(buf, itos(*(sh_int *)point));
			break;

			case OLCS_STRFUNC:
			func = (STRFUNC *) table[i].func;
			tmpstr = (*func) (point);
			strcpy(buf, tmpstr ? tmpstr : "" );
			break;

			case OLCS_FLAGSTR_INT:
			flagt = (const struct flag_type *) table[i].func;
			strcpy(buf, flag_string(flagt, *(int *)point));
			break;

			case OLCS_FLAGSTR_SHINT:
			flagt = (const struct flag_type *) table[i].func;
			strcpy(buf, flag_string(flagt, *(sh_int *) point));
			break;

			case OLCS_BOOL:
			strcpy(buf, *(bool *) point == TRUE ? "S" : "N");
			break;

			case OLCS_TAG:
			buf[0] = '\0';
			break;
		}

		strcpy(buf2, table[i].desc);
		strcat(buf2, buf);
		largo = strlen(buf2);
		x = table[i].x;
		y = table[i].y;
		for ( j = 0; j < largo; j++ )
		{
			if (buf2[j] == '\r')
			{
				x = table[i].x;
				continue;
			}
			if (buf2[j] == '\n')
			{
				y++;
				continue;
			}
			if ((table[i].largox < 1 && x > 79)
			||  (table[i].largox > 0 && x >= table[i].x + table[i].largox + strlen(table[i].desc)))
			{
				y++;
				x = table[i].x;
			}
			if ((table[i].largoy < 1 && y > d->character->lines-3)
			||  (table[i].largoy > 0 && y >= table[i].y + table[i].largoy))
				break;
			if (((y-1)*80+(x-1)) >= 80*(d->character->lines-3))
				break;
			d->screenmap[(y-1)*80+(x++-1)] = buf2[j];
		}
	}

	// mandamos solo las diferencias
	largo = strlen(d->screenmap);
	i = j = 0;
	buf[0] = '\0';
	while(i<largo)
	{
		if ( d->screenmap[i] == d->oldscreenmap[i] )
		{
			i++;
			continue;
		}
		sprintf(buf2, VT_CURSPOS "%c", i/80+1, i%80, d->screenmap[i++] );
		strcat(buf, buf2);
		j += strlen(buf2);
		while ( d->screenmap && d->screenmap[i] != d->oldscreenmap[i] )
			buf[j++] = d->screenmap[i++];
		buf[j] = '\0';
	}

	write_to_buffer( d, buf, j );
	write_to_buffer( d, VT_CURREST, 0 );
}
Beispiel #10
0
void do_demote( CHAR_DATA *ch, char *argument )
{
    CHAR_DATA *victim;
    CLAN_DATA *clan;
    char       arg [ MAX_INPUT_LENGTH ];
    char       buf [ MAX_STRING_LENGTH ];
    int        newrank;

    one_argument( argument, arg );

    if ( arg[0] == '\0' )
    {
        send_to_char( "Demote whom?\n\r", ch );
        return;
    }

    if ( !is_clan( ch )
        || ch->pcdata->rank != RANK_OVERLORD )
    {
        send_to_char( "You don't have the power to do this.\n\r", ch );
        return;
    }

    clan = ch->pcdata->clan;

    if ( !( victim = get_char_room( ch, arg ) ) )
    {
        send_to_char( "They aren't here.\n\r", ch );
        return;
    }

    if ( IS_NPC( victim ) || victim == ch )
        return;

    if ( !is_same_clan( ch, victim ) )
    {
        act( "$N isn't even from $t.", ch, clan->name, victim, TO_CHAR );
        return;
    }

    switch ( victim->pcdata->rank )
    {
    default:
	return;
	break;
    case RANK_CLANSMAN:
	send_to_char( "He's as low as they can get.\n\r", ch );
	return;
	break;
    case RANK_CLANHERO:
	clan->clanheros--;
	break;
    case RANK_SUBCHIEF:
	clan->clanheros++;
	clan->subchiefs--;
	break;
    case RANK_CHIEFTAIN:
	clan->subchiefs++;
	free_string( clan->chieftain );
	break;
    case RANK_OVERLORD:
	send_to_char( "You may not demote an Overlord!?\n\r", ch );
	return;
	break;
    }

    victim->pcdata->rank--;
    newrank = victim->pcdata->rank;

    sprintf( buf, "Log %s: demoting %s to %s",
	    ch->name,
	    victim->name,
	    ch->pcdata->clan->name  );
    log_clan( buf );

    sprintf( buf,
	    "The grand Overlord %s says:\n\r\n\r"
	    "'I hereby demote you %s to %s!!!'\n\r"
	    "You should make more efforts to improve!",
	    ch->name,
	    victim->name,
	    flag_string( rank_flags, newrank ) );
    send_to_char( buf, victim );

    act( "You have demoted $N to $t.",
	ch, flag_string( rank_flags, newrank ), victim, TO_CHAR );
    save_char_obj( victim );
    
    return;
}
Beispiel #11
0
char * exits2str( void * point )
{
    EXIT_DATA **pexitarray = (EXIT_DATA **) point;
    EXIT_DATA *pexit;
static char buf[MSL];
    char word[MIL], reset_state[MIL], tmpbuf[MIL];
    char *state;
    int i, length, j;

    buf[0] = '\0';

    for ( j = 0; j < MAX_DIR; j++ )
    {
	    if ((pexit = pexitarray[j]) == NULL)
	    	continue;

	    sprintf( tmpbuf, "-%-5.5s to [%5d] ",
		capitalize(dir_name[j]),
		pexit->u1.to_room ? pexit->u1.to_room->vnum : 0 );
	    strcat( buf, tmpbuf );

	    if (pexit->key > 0)
	    {
	    	sprintf(tmpbuf, "Key:%d ", pexit->key);
	    	strcat(buf, tmpbuf);
	    }

	    /*
	     * Format up the exit info.
	     * Capitalize all flags that are not part of the reset info.
	     */
	    strcpy( reset_state, flag_string( exit_flags, pexit->rs_flags ) );
	    state = flag_string( exit_flags, pexit->exit_info );
	    strcat( buf, "Flags: [" );
	    for (; ;)
	    {
		state = one_argument( state, word );

		if ( word[0] == '\0' )
		{
		    int end;

		    end = strlen(buf) - 1;
		    buf[end] = ']';
		    if (pexit->keyword)
		    	strcat(buf, "(K)");
		    if (pexit->description)
		    	strcat(buf, "(D)");
		    strcat( buf, "\n\r" );
		    break;
		}

		if ( str_infix( word, reset_state ) )
		{
		    length = strlen(word);
		    for (i = 0; i < length; i++)
			word[i] = UPPER(word[i]);
		}

		strcat( buf, word );
		strcat( buf, " " );
	    }

/*	    if ( pexit->keyword && pexit->keyword[0] != '\0' )
	    {
		sprintf( tmpbuf, "Kwds: [%s]\n\r", pexit->keyword );
		strcat( buf, tmpbuf );
	    }
	    if ( pexit->description && pexit->description[0] != '\0' )
	    {
		sprintf( tmpbuf, "%s", pexit->description );
		strcat( buf, tmpbuf );
	    } */
    }

    return buf;
}
Beispiel #12
0
void do_initiate( CHAR_DATA *ch, char *argument )
{
    CHAR_DATA *victim;
    CLAN_DATA *clan;
    OBJ_DATA  *card;
    OBJ_DATA  *ring;
    char       arg [ MAX_INPUT_LENGTH ];
    char       buf [ MAX_STRING_LENGTH ];

    one_argument( argument, arg );

    if ( arg[0] == '\0' )
    {
        send_to_char( "Initiate whom?\n\r", ch );
        return;
    }

    if ( !( victim = get_char_room( ch, arg ) ) )
    {
        send_to_char( "They aren't here.\n\r", ch );
        return;
    }

    if ( !is_clan( ch )
        || ch->pcdata->rank < RANK_CHIEFTAIN
        || victim->level > ch->level )
    {
        send_to_char( "You don't have the power to do this.\n\r", ch );
        return;
    }

    clan = ch->pcdata->clan;

    if ( victim == ch )
        return;

    card = get_eq_char( victim, WEAR_HOLD );
    if ( is_clan( victim )
	 || IS_NPC( victim )
         || !card
         || card->pIndexData->vnum != OBJ_VNUM_CLAN_CARD
	 || victim->pcdata->rank == RANK_EXILED
         || victim->level < 20 )
    {
        act( "$N hasn't what's required to be initiated.",
	    ch, NULL, victim, TO_CHAR );
        act( "You can't be initiated to $t!",
	    ch, clan->name, victim, TO_VICT );
        return;
    }

    if ( clan->clan_type == CLAN_GUILD && clan->cclass != victim->cclass[0] )
	send_to_char( "You may only initiate those of your class.\n\r", ch );

    victim->pcdata->clan      = clan;
    victim->pcdata->rank      = RANK_CLANSMAN;
    clan->members++;

    ring = create_object( get_obj_index( clan->clanobj1 ), victim->level );

    if ( ring )
	obj_to_char( ring, victim );

    sprintf( buf, "Log %s: initiated %s to %s",
	    ch->name,
	    victim->name,
	    clan->name  );
    log_clan( buf );

    sprintf( buf, "'I %s %s, hereby declare you %s a member of %s!'\n\r"
		  "Take %s as a symbol of this union for all time.\n\r"
		  "Forever remember our motto: \"%s\"\n\r",
		  flag_string( rank_flags, ch->pcdata->rank ),
		  ch->name,
		  victim->name,
		  clan->name,
		  ring ? ring->short_descr : "my handshake",
		  clan->motto );

    send_to_char( buf, victim );

    act( "$N has been initiated to $t!", ch, clan->name, victim, TO_ROOM );
    act( "You have initiated $N to $t!", ch, clan->name, victim, TO_CHAR );
    save_char_obj( victim );

    clan->score += 5;
    
    return;
}
Beispiel #13
0
bool casino_three_card_monty( CHAR_DATA *ch, CHAR_DATA *dealer, int card )
{
 char buf[MAX_STRING_LENGTH];
 CARD_DATA l;
 CARD_DATA m;
 CARD_DATA r;

 CARD_DATA *left;
 CARD_DATA *middle;
 CARD_DATA *right;
 int rand = dice( 1, 4 );

 l.value = 12;
 m.value = 12;
 r.value = 12;

 switch( rand )
 {
  case 1:
   l.suit = 2;
   m.suit = 1;
   r.suit = 3;
   break;
  case 2:
   l.suit = 3;
   m.suit = 2;
   r.suit = 1;
   break;
  case 3:
   l.suit = 1;
   m.suit = 3;
   r.suit = 2;
   break;
  case 4:
   l.suit = 1;
   m.suit = 3;
   r.suit = 1;
   break;
  }

  left   = &l;
  middle = &m;
  right  = &r;

 sprintf( buf, "Left card:   &G%s&X of ",
  flag_string( card_faces, left->value ) );
 send_to_char( AT_WHITE, buf, ch );

 sprintf( buf, "&G%s&X\n\r",
  flag_string( card_suits, left->suit ) );
 send_to_char( AT_WHITE, buf, ch );

 sprintf( buf, "Middle card: &G%s&X of ",
  flag_string( card_faces, middle->value ) );
 send_to_char( AT_WHITE, buf, ch );

 sprintf( buf, "&G%s&X\n\r",
  flag_string( card_suits, middle->suit ) );
 send_to_char( AT_WHITE, buf, ch );

 sprintf( buf, "Right card:  &G%s&X of ",
  flag_string( card_faces, right->value ) );
 send_to_char( AT_WHITE, buf, ch );

 sprintf( buf, "&G%s&X\n\r",
  flag_string( card_suits, right->suit ) );
 send_to_char( AT_WHITE, buf, ch );


 if ( card == rand )
  return TRUE;

 return FALSE;
}
Beispiel #14
0
/* Display class information -Thoric */
void do_showclass( CHAR_DATA *ch, char *argument )
{
    char                    arg1[MIL],
                            arg2[MIL];
    struct class_type      *Class;
    int                     cl,
                            low,
                            hi,
                            ct,
                            i;

    set_pager_color( AT_PLAIN, ch );
    argument = one_argument( argument, arg1 );
    argument = one_argument( argument, arg2 );
    if ( !VLD_STR( arg1 ) ) {
        do_classes( ch, ( char * ) "" );
        send_to_char( "Syntax: showclass <class> [level range]\r\n", ch );
        return;
    }
    if ( is_number( arg1 ) && ( cl = atoi( arg1 ) ) >= 0 && cl < MAX_CLASS )
        Class = class_table[cl];
    else {
        Class = NULL;
        for ( cl = 0; cl < MAX_CLASS && class_table[cl]; cl++ )
            if ( !str_cmp( class_table[cl]->who_name, arg1 ) ) {
                Class = class_table[cl];
                break;
            }
    }
    if ( !Class ) {
        send_to_char( "No such class.\r\n", ch );
        return;
    }
    pager_printf( ch, "&wCLASS: &W%s\r\n&w",
                  VLD_STR( Class->who_name ) ? Class->who_name : "(Not set)" );
    pager_printf( ch, "&wFilename: &W%s\r\n&w",
                  VLD_STR( Class->filename ) ? Class->filename : "(Not set)" );
    pager_printf( ch, "&wPrime Attribute:     &W%-14s\r\n", a_types[Class->attr_prime] );
    pager_printf( ch, "&wSecond Attribute:    &W%-14s\r\n", a_types[Class->attr_second] );
    pager_printf( ch, "&wDeficient Attribute: &W%-14s\r\n", a_types[Class->attr_deficient] );
    ct = 0;
    send_to_pager( "&wDisallowed Races:&W\r\n", ch );
    for ( i = 0; i < MAX_RACE; i++ ) {
        if ( IS_SET( Class->race_restriction, 1 << i ) ) {
            ct++;
            pager_printf( ch, "%10s ", race_table[i]->race_name );
            if ( ct % 6 == 0 )
                send_to_pager( "\r\n", ch );
        }
    }
    if ( ( ct % 6 != 0 ) || ( ct == 0 ) )
        send_to_pager( "\r\n", ch );
    ct = 0;
    send_to_pager( "&wAllowed Races:&W\r\n", ch );
    for ( i = 0; i < MAX_RACE; i++ ) {
        if ( !IS_SET( Class->race_restriction, 1 << i ) ) {
            ct++;
            pager_printf( ch, "%10s ", race_table[i]->race_name );
            if ( ct % 6 == 0 )
                send_to_pager( "\r\n", ch );
        }
    }

    // Added in combo restrictions by: Taon...
/*
  if((ct % 6 != 0) || (ct == 0))
    send_to_pager("\r\n", ch);
  ct = 0;

  send_to_pager("&wAllowed combos:&W\r\n", ch);
  for(i = 0; i < MAX_CLASS; i++)
  {
    ct++;

    if(!IS_SET(Class->combo_restriction, 1 << i))
    {
      pager_printf(ch, "%10s ", class_table[i]->who_name);
      send_to_pager("\r\n", ch);
    }
  }
  if((ct % 6 != 0) || (ct == 0))
    send_to_pager("\r\n", ch);
  ct = 0;

  send_to_pager("&wNot Allowed combos:&W\r\n", ch);
  for(i = 0; i < MAX_CLASS; i++)
  {
    ct++;
    if(IS_SET(Class->combo_restriction, 1 << i))
    {
      pager_printf(ch, "%10s ", class_table[i]->who_name);
      send_to_pager("\r\n", ch);
    }
  }
*/
    send_to_char( "\r\n", ch );
    pager_printf( ch,
                  "&wMax Skill Adept: &W%-3d             &wThac0 : &W%-5d     &wThac32: &W%d\r\n",
                  Class->skill_adept, Class->thac0_00, Class->thac0_32 );
    pager_printf( ch,
                  "&wHp Min/Hp Max  : &W%-2d/%-2d     &wMana Min/Max: &W%-2d/%-2d &wExpBase: &W%d\r\n",
                  Class->hp_min, Class->hp_max, Class->mana_min, Class->mana_max, Class->exp_base );
    pager_printf( ch, "&W%s &wClass\r\n", Class->starting ? "Starting" : "Non-Starting" );
    pager_printf( ch, "&wAffected by:  &W%s\r\n",
                  !xIS_EMPTY( Class->affected ) ? ext_flag_string( &Class->affected,
                                                                   a_flags ) : "Nothing" );
    pager_printf( ch, "&wResistant to: &W%s\r\n", flag_string( Class->resist, ris_flags ) );
    pager_printf( ch, "&wSusceptible to: &W%s\r\n", flag_string( Class->suscept, ris_flags ) );
    pager_printf( ch, "&wCrafting Base: &W%d\r\n", Class->craft_base );

    /*
     * These are no longer in use. -Taon if(Class->reclass1 > 0) pager_printf(ch, "%s ",
     * class_table[class->reclass1]->who_name); if(Class->reclass2 > 0) pager_printf(ch,
     * "%s ", class_table[class->reclass2]->who_name); if(Class->reclass3 > 0)
     * pager_printf(ch, "%s ", class_table[class->reclass3]->who_name);
     * send_to_pager("\r\n", ch); 
     */

/*
  if(VLD_STR(arg2))
  {
    int x, y, cnt;

    low = UMAX(0, atoi(arg2));
    hi = URANGE(low, atoi(argument), MAX_LEVEL);
    for(x = low; x <= hi; x++)
    {
      set_pager_color(AT_LBLUE, ch);
      pager_printf(ch, "Male: %-30s Female: %s\r\n", title_table[cl][x][0], title_table[cl][x][1]);
      cnt = 0;
      set_pager_color(AT_BLUE, ch);
      for(y = gsn_first_spell; y < gsn_top_sn; y++)
        if(skill_table[y]->skill_level[cl] == x)
        {
          pager_printf(ch, "  %-7s %-19s%3d     ", skill_tname[skill_table[y]->type], skill_table[y]->name, skill_table[y]->skill_adept[cl]);
          if(++cnt % 2 == 0)
            send_to_pager("\r\n", ch);
          if(cnt % 2 != 0)
            send_to_pager("\r\n", ch);
          send_to_pager("\r\n", ch);
        }
    }
  }
*/

    if ( arg2 && arg2[0] != '\0' ) {
        int                     x,
                                y,
                                cnt;

        low = UMAX( 0, atoi( arg2 ) );
        hi = URANGE( low, atoi( argument ), MAX_LEVEL );
        for ( x = low; x <= hi; x++ ) {
            pager_printf( ch, "&wMale: &W%-30s &wFemale: &W%s\r\n", title_table[cl][x][0],
                          title_table[cl][x][1] );
            cnt = 0;
            for ( y = gsn_first_spell; y < gsn_top_sn; y++ )
                if ( skill_table[y]->skill_level[cl] == x ) {
                    pager_printf( ch, "  &[skill]%-7s %-19s%3d     ",
                                  skill_tname[skill_table[y]->type], skill_table[y]->name,
                                  skill_table[y]->skill_adept[cl] );
                    if ( ++cnt % 2 == 0 )
                        send_to_pager( "\r\n", ch );
                }
            if ( cnt % 2 != 0 )
                send_to_pager( "\r\n", ch );
            send_to_pager( "\r\n", ch );
        }
    }

    return;
}
Beispiel #15
0
// General data parsing method
bool parse_affect( DATAData *pafD, AFFECT_DATA *paf ) {
//    Affect = ( 'enchant armor', -1, 110, 0, ('permanent'),
//		( 'char', 'damroll', 0, 50 ),
//              ( 'char', 'hitroll', 0, 50 ) );
  ValueList *list = pafD->value->eval().asList();
  // Minimum 5 elements but revelant affects have at least 6 elements
  if ( list->size < 5 ) {
    bug("Wrong number of elements in affect [<name>]<where><location><op><modifier><duraction><level><casting level>");
    return FALSE;
  }
  // ability, duration, level, casting, (flags),
  //  ( where, loc, op, modifier ),
  // ..
  const char *s = list->elems[0].asStr();
  int sn;
  if ( !str_cmp( s, "none" ) ) // not an ability affect
    sn = -1;
  else {
    sn = ability_lookup( s );
    if ( sn < 0 ) {
      bug("Invalid ability name %s", s );
      return FALSE;
   }
  }
  int dur = list->elems[1].asInt();
  int level = list->elems[2].asInt();
  int casting = list->elems[3].asInt();
  long flags = list_flag_value_complete(list->elems[4].asList(),affect_data_flags);
  if ( flags == NO_FLAG ) {
    flags = ( sn == -1 ) ? AFFECT_INHERENT : AFFECT_ABILITY;
    bug("Invalid affect flag, assuming %s", flag_string( affect_data_flags, flags ) );
  }

  createaff( *paf, dur, level, sn, casting, flags );
  //if ( list->size == 5 )
  //bug("Irrevelant affect: %d %d %s %d %ld", dur, level, s, casting, flags );


  for ( int i = 5; i < list->size; i++ ) { // now, extract affect_list
    ValueList *alist = list->elems[i].asList();
    // where, loc, op, modifier
    s = alist->elems[0].asStr(); int where = flag_value( afto_type, s );
    if ( where == NO_FLAG ) {
      bug("Invalid where name %s", s );
      return FALSE;
    }
    int loc = ATTR_NA;
    int mod = 0;
    switch (where) {
    case AFTO_CHAR: 
      s = alist->elems[1].asStr(); loc = flag_value( attr_flags, s );
      if ( loc == NO_FLAG ) {
	bug("Invalid location name %s", s );
	return FALSE;
      }
      if (attr_table[loc].bits == NULL)
	mod = alist->elems[3].asInt();
      else
	mod = list_flag_value_complete( alist->elems[3].asList(), attr_table[loc].bits );
      break;
    case AFTO_ROOM:
      s = alist->elems[1].asStr(); loc = flag_value( room_attr_flags, s );
      if ( loc == NO_FLAG ) {
	bug("Invalid location name %s", s );
	return FALSE;
      }
      if (room_attr_table[loc].bits == NULL)
	mod = alist->elems[3].asInt();
      else
	mod = list_flag_value_complete( alist->elems[3].asList(), room_attr_table[loc].bits );
      break;
    case AFTO_OBJVAL:
      loc = alist->elems[1].asInt();
      mod = alist->elems[3].asInt();
      break;
    case AFTO_WEAPON:
      // loc  not revelant
      mod = list_flag_value_complete( alist->elems[3].asList(), weapon_type2 );
      break;
    case AFTO_OBJECT:
      // loc  not revelant
      mod = list_flag_value_complete( alist->elems[3].asList(), extra_flags );
      break;
    default:
      bug("Invalid where: %s", s );
      break;
    }
    int op = alist->elems[2].asInt();
    //int mod = alist->elems[3].asInt();
    addaff2(*paf,where,loc,op,mod);
  }
  list->explicit_free();
  return TRUE;
}
Beispiel #16
0
void do_promote( CHAR_DATA *ch, char *argument )
{
    CHAR_DATA *victim;
    CLAN_DATA *clan;
    OBJ_DATA  *obj;
    char       arg [ MAX_INPUT_LENGTH ];
    char       buf [ MAX_STRING_LENGTH ];
    int        newrank;

    one_argument( argument, arg );

    if ( arg[0] == '\0' )
    {
        send_to_char( "Promote whom?\n\r", ch );
        return;
    }

    if ( !is_clan( ch )
        || ch->pcdata->rank != RANK_OVERLORD )
    {
        send_to_char( "You don't have the power to do this.\n\r", ch );
        return;
    }

    clan = ch->pcdata->clan;

    if ( !( victim = get_char_room( ch, arg ) ) )
    {
        send_to_char( "They aren't here.\n\r", ch );
        return;
    }

    if ( IS_NPC( victim ) || victim == ch )
        return;

    if ( !is_same_clan( ch, victim ) )
    {
        act( "$N isn't even from $t.", ch, clan->name, victim, TO_CHAR );
        return;
    }

    obj = NULL;

    switch ( victim->pcdata->rank )
    {
    default:
	return;
	break;
    case RANK_CLANSMAN:
	if ( clan->clanheros >= clan->members / 3 )
	{
	    send_to_char( "You may have only 1 clanhero per 3 clansmen.\n\r", ch );
	    return;
	}
	obj = create_object( get_obj_index( clan->clanobj2 ), victim->level );
	clan->clanheros++;
	clan->score		+= 5;
    	break;
    case RANK_CLANHERO:
	if ( clan->subchiefs >= clan->members / 6 )
	{
	    send_to_char( "You may have only 1 subchief per 6 clansmen.\n\r", ch );
	    return;
	}
	obj = create_object( get_obj_index( clan->clanobj3 ), victim->level );
	clan->clanheros--;
	clan->subchiefs++;
	clan->score		+= 15;
	break;
    case RANK_SUBCHIEF:
	if ( clan->chieftain[0] != '\0' )
	{
	    send_to_char( "You may have only 1 chieftain.\n\r", ch );
	    return;
	}
	else if ( clan->members < 9 )
	{
	    send_to_char( "You need to have 9 clansmen before you can have a chieftain.\n\r", ch );
	    return;
	}

	clan->subchiefs--;
	clan->chieftain = str_dup( victim->name );
	clan->score		+= 45;
	break;
    case RANK_CHIEFTAIN:
    case RANK_OVERLORD:
	send_to_char( "You may not promote any further that person.\n\r", ch );
	return;
	break;
    }

    victim->pcdata->rank++;
    newrank = victim->pcdata->rank;

    if ( obj )
	obj_to_char( obj, victim );

    sprintf( buf, "Log %s: promoting %s to %s",
	    ch->name,
	    victim->name,
	    ch->pcdata->clan->name  );
    log_clan( buf );

    sprintf( buf,
	    "The grand Overlord %s says:\n\r\n\r"
	    "'I hereby promote you %s to %s!'\n\r"
	    "Take %s as a prize for your superb performance.\n\r"
	    "%s\n\r",
	    ch->name,
	    victim->name,
	    flag_string( rank_flags, newrank ),
	    obj ? obj->short_descr : "this promotion",
	    clan->motto );

    send_to_char( buf, victim );

    act( "You have promoted $N to $t.",
	ch, flag_string( rank_flags, newrank ), victim, TO_CHAR );
    save_char_obj( victim );
    
    return;
}
Beispiel #17
0
char *sprint_reset( RESET_DATA * pReset, short *num )
{
	RESET_DATA *tReset, *gReset;
	static char buf[MAX_STRING_LENGTH];
	char mobname[MAX_STRING_LENGTH], roomname[MAX_STRING_LENGTH], objname[MAX_STRING_LENGTH];
	static ROOM_INDEX_DATA *room;
	static OBJ_INDEX_DATA *obj, *obj2;
	static MOB_INDEX_DATA *mob;

	switch ( pReset->command )
	{
		default:
			snprintf( buf, MAX_STRING_LENGTH, "%2d) *** BAD RESET: %c %d %d %d %d ***\r\n", *num, pReset->command, pReset->extra, pReset->arg1, pReset->arg2, pReset->arg3 );
			break;

		case 'M':
			mob = get_mob_index( pReset->arg1 );
			room = get_room_index( pReset->arg3 );
			if ( mob )
				strncpy( mobname, mob->player_name, MAX_STRING_LENGTH );
			else
				strncpy( mobname, "Mobile: *BAD VNUM*", MAX_STRING_LENGTH );
			if ( room )
				strncpy( roomname, room->name, MAX_STRING_LENGTH );
			else
				strncpy( roomname, "Room: *BAD VNUM*", MAX_STRING_LENGTH );
			snprintf( buf, MAX_STRING_LENGTH, "%2d) %s (%d) -> %s Room: %d [%d] %s\r\n", *num, mobname, pReset->arg1,
				roomname, pReset->arg3, pReset->arg2, pReset->sreset ? "[Not Reset]" : "[Reset]" );

			for ( tReset = pReset->first_reset; tReset; tReset = tReset->next_reset )
			{
				( *num )++;
				switch ( tReset->command )
				{
					case 'E':
						if ( !mob )
							strncpy( mobname, "* ERROR: NO MOBILE! *", MAX_STRING_LENGTH );
						if ( !( obj = get_obj_index( tReset->arg1 ) ) )
							strncpy( objname, "Object: *BAD VNUM*", MAX_STRING_LENGTH );
						else
							strncpy( objname, obj->name, MAX_STRING_LENGTH );
						snprintf( buf + strlen( buf ), MAX_STRING_LENGTH - strlen( buf ),
							"%2d) (equip) %s (%d) -> %s (%s) [%d]\r\n", *num, objname, tReset->arg1, mobname, wear_locs[tReset->arg3], tReset->arg2 );
						break;

					case 'G':
						if ( !mob )
							strncpy( mobname, "* ERROR: NO MOBILE! *", MAX_STRING_LENGTH );
						if ( !( obj = get_obj_index( tReset->arg1 ) ) )
							strncpy( objname, "Object: *BAD VNUM*", MAX_STRING_LENGTH );
						else
							strncpy( objname, obj->name, MAX_STRING_LENGTH );
						snprintf( buf + strlen( buf ), MAX_STRING_LENGTH - strlen( buf ), "%2d) (carry) %s (%d) -> %s [%d]\r\n", *num, objname, tReset->arg1, mobname, tReset->arg2 );
						break;
				}
				if ( tReset->first_reset )
				{
					for ( gReset = tReset->first_reset; gReset; gReset = gReset->next_reset )
					{
						( *num )++;
						switch ( gReset->command )
						{
							case 'P':
								if ( !( obj2 = get_obj_index( gReset->arg1 ) ) )
									strncpy( objname, "Object1: *BAD VNUM*", MAX_STRING_LENGTH );
								else
									strncpy( objname, obj2->name, MAX_STRING_LENGTH );
								if ( gReset->arg3 > 0 && ( obj = get_obj_index( gReset->arg3 ) ) == NULL )
									strncpy( roomname, "Object2: *BAD VNUM*", MAX_STRING_LENGTH );
								else if ( !obj )
									strncpy( roomname, "Object2: *NULL obj*", MAX_STRING_LENGTH );
								else
									strncpy( roomname, obj->name, MAX_STRING_LENGTH );
								snprintf( buf + strlen( buf ), MAX_STRING_LENGTH - strlen( buf ),
									"%2d) (put) %s (%d) -> %s (%d) [%d]\r\n", *num, objname, gReset->arg1, roomname, obj ? obj->vnum : gReset->arg3, gReset->arg2 );
								break;
						}
					}
				}
			}
			break;

		case 'O':
			if ( !( obj = get_obj_index( pReset->arg1 ) ) )
				strncpy( objname, "Object: *BAD VNUM*", MAX_STRING_LENGTH );
			else
				strncpy( objname, obj->name, MAX_STRING_LENGTH );
			room = get_room_index( pReset->arg3 );
			if ( !room )
				strncpy( roomname, "Room: *BAD VNUM*", MAX_STRING_LENGTH );
			else
				strncpy( roomname, room->name, MAX_STRING_LENGTH );
			snprintf( buf, MAX_STRING_LENGTH, "%2d) (object) %s (%d) -> %s Room: %d [%d]\r\n", *num, objname, pReset->arg1, roomname, pReset->arg3, pReset->arg2 );

			for ( tReset = pReset->first_reset; tReset; tReset = tReset->next_reset )
			{
				( *num )++;
				switch ( tReset->command )
				{
					case 'P':
						if ( !( obj2 = get_obj_index( tReset->arg1 ) ) )
							strncpy( objname, "Object1: *BAD VNUM*", MAX_STRING_LENGTH );
						else
							strncpy( objname, obj2->name, MAX_STRING_LENGTH );
						if ( tReset->arg3 > 0 && ( obj = get_obj_index( tReset->arg3 ) ) == NULL )
							strncpy( roomname, "Object2: *BAD VNUM*", MAX_STRING_LENGTH );
						else if ( !obj )
							strncpy( roomname, "Object2: *NULL obj*", MAX_STRING_LENGTH );
						else
							strncpy( roomname, obj->name, MAX_STRING_LENGTH );
						snprintf( buf + strlen( buf ), MAX_STRING_LENGTH - strlen( buf ), "%2d) (put) %s (%d) -> %s (%d) [%d]\r\n",
							*num, objname, tReset->arg1, roomname, obj ? obj->vnum : tReset->arg3, tReset->arg2 );
						break;

					case 'T':
						snprintf( buf + strlen( buf ), MAX_STRING_LENGTH - strlen( buf ),
							"%2d) (trap) %d %d %d %d (%s) -> %s (%d)\r\n", *num, tReset->extra, tReset->arg1, tReset->arg2,
							tReset->arg3, flag_string( tReset->extra, trap_flags ), objname, obj ? obj->vnum : 0 );
						break;

					case 'H':
						snprintf( buf + strlen( buf ), MAX_STRING_LENGTH - strlen( buf ), "%2d) (hide) -> %s\r\n", *num, objname );
						break;
				}
			}
			break;

		case 'D':
			if ( pReset->arg2 < 0 || pReset->arg2 > MAX_DIR + 1 )
				pReset->arg2 = 0;
			if ( !( room = get_room_index( pReset->arg1 ) ) )
			{
				strncpy( roomname, "Room: *BAD VNUM*", MAX_STRING_LENGTH );
				snprintf( objname, MAX_STRING_LENGTH, "%s (no exit)", dir_name[pReset->arg2] );
			}
			else
			{
				strncpy( roomname, room->name, MAX_STRING_LENGTH );
				snprintf( objname, MAX_STRING_LENGTH, "%s%s", dir_name[pReset->arg2], get_exit( room, pReset->arg2 ) ? "" : " (NO EXIT!)" );
			}
			switch ( pReset->arg3 )
			{
				default:
					strncpy( mobname, "(* ERROR *)", MAX_STRING_LENGTH );
					break;
				case 0:
					strncpy( mobname, "Open", MAX_STRING_LENGTH );
					break;
				case 1:
					strncpy( mobname, "Close", MAX_STRING_LENGTH );
					break;
				case 2:
					strncpy( mobname, "Close and lock", MAX_STRING_LENGTH );
					break;
			}
			snprintf( buf, MAX_STRING_LENGTH, "%2d) %s [%d] the %s [%d] door %s (%d)\r\n", *num, mobname, pReset->arg3, objname, pReset->arg2, roomname, pReset->arg1 );
			break;

		case 'R':
			if ( !( room = get_room_index( pReset->arg1 ) ) )
				strncpy( roomname, "Room: *BAD VNUM*", MAX_STRING_LENGTH );
			else
				strncpy( roomname, room->name, MAX_STRING_LENGTH );
			snprintf( buf, MAX_STRING_LENGTH, "%2d) Randomize exits 0 to %d -> %s (%d)\r\n", *num, pReset->arg2, roomname, pReset->arg1 );
			break;

		case 'T':
			if ( !( room = get_room_index( pReset->arg3 ) ) )
				strncpy( roomname, "Room: *BAD VNUM*", MAX_STRING_LENGTH );
			else
				strncpy( roomname, room->name, MAX_STRING_LENGTH );
			snprintf( buf, MAX_STRING_LENGTH, "%2d) Trap: %d %d %d %d (%s) -> %s (%d)\r\n",
				*num, pReset->extra, pReset->arg1, pReset->arg2, pReset->arg3, flag_string( pReset->extra, trap_flags ), roomname, room ? room->vnum : 0 );
			break;
	}
	return buf;
}
Beispiel #18
0
/* Affects-at-a-glance, Blodkai */
void do_affected( CHAR_DATA* ch, const char* argument)
{
   char arg[MAX_INPUT_LENGTH];
   AFFECT_DATA *paf;
   SKILLTYPE *skill;

   if( IS_NPC( ch ) )
      return;

   set_char_color( AT_SCORE, ch );

   argument = one_argument( argument, arg );
   if( !str_cmp( arg, "by" ) )
   {
      send_to_char_color( "\r\n&BImbued with:\r\n", ch );
      ch_printf_color( ch, "&C%s\r\n", !xIS_EMPTY( ch->affected_by ) ? affect_bit_name( &ch->affected_by ) : "nothing" );
      if( ch->level >= 20 )
      {
         send_to_char( "\r\n", ch );
         if( ch->resistant > 0 )
         {
            send_to_char_color( "&BResistances:  ", ch );
            ch_printf_color( ch, "&C%s\r\n", flag_string( ch->resistant, ris_flags ) );
         }
         if( ch->immune > 0 )
         {
            send_to_char_color( "&BImmunities:   ", ch );
            ch_printf_color( ch, "&C%s\r\n", flag_string( ch->immune, ris_flags ) );
         }
         if( ch->susceptible > 0 )
         {
            send_to_char_color( "&BSuscepts:     ", ch );
            ch_printf_color( ch, "&C%s\r\n", flag_string( ch->susceptible, ris_flags ) );
         }
      }
      return;
   }

   if( !ch->first_affect )
   {
      send_to_char_color( "\r\n&CNo cantrip or skill affects you.\r\n", ch );
   }
   else
   {
      send_to_char( "\r\n", ch );
      for( paf = ch->first_affect; paf; paf = paf->next )
         if( ( skill = get_skilltype( paf->type ) ) != NULL )
         {
            set_char_color( AT_BLUE, ch );
            send_to_char( "Affected:  ", ch );
            set_char_color( AT_SCORE, ch );
            if( ch->level >= 20 || IS_PKILL( ch ) )
            {
               if( paf->duration < 25 )
                  set_char_color( AT_WHITE, ch );
               if( paf->duration < 6 )
                  set_char_color( AT_WHITE + AT_BLINK, ch );
               ch_printf( ch, "(%5d)   ", paf->duration );
            }
            ch_printf( ch, "%-18s\r\n", skill->name );
         }
   }
   return;
}
Beispiel #19
0
void do_affected( CHAR_DATA * ch, const char *argument )
{
   char arg[MAX_INPUT_LENGTH];
   AFFECT_DATA *paf;
   SKILLTYPE *skill;
   int x;

   if( IS_NPC( ch ) )
      return;

   argument = one_argument( argument, arg );

   if( !str_cmp( arg, "by" ) )
   {
      set_char_color( AT_BLUE, ch );
      send_to_char( "\r\nImbued with:\r\n", ch );
      set_char_color( AT_SCORE, ch );
      ch_printf( ch, "%s\r\n", affect_bit_name( &ch->affected_by ) );
      if( ch->top_level >= 20 )
      {
         send_to_char( "\r\n", ch );
         if( ch->resistant > 0 )
         {
            set_char_color( AT_BLUE, ch );
            send_to_char( "Resistances:  ", ch );
            set_char_color( AT_SCORE, ch );
            ch_printf( ch, "%s\r\n", flag_string( ch->resistant, ris_flags ) );
         }
         if( ch->immune > 0 )
         {
            set_char_color( AT_BLUE, ch );
            send_to_char( "Immunities:   ", ch );
            set_char_color( AT_SCORE, ch );
            ch_printf( ch, "%s\r\n", flag_string( ch->immune, ris_flags ) );
         }
         if( ch->susceptible > 0 )
         {
            set_char_color( AT_BLUE, ch );
            send_to_char( "Suscepts:     ", ch );
            set_char_color( AT_SCORE, ch );
            ch_printf( ch, "%s\r\n", flag_string( ch->susceptible, ris_flags ) );
         }
      }
      return;
   }

   if( !ch->first_affect && xIS_EMPTY( ch->affected_by ) )
   {
      set_char_color( AT_SCORE, ch );
      send_to_char( "\r\nNo cantrip or skill affects you.\r\n", ch );
   }
   else
   {
      send_to_char( "\r\n", ch );
      for( paf = ch->first_affect; paf; paf = paf->next )
         if( ( skill = get_skilltype( paf->type ) ) != NULL )
         {
            set_char_color( AT_BLUE, ch );
            send_to_char( "Affected:  ", ch );
            set_char_color( AT_SCORE, ch );
            if( ch->top_level >= 20 )
            {
               if( paf->duration < 25 )
                  set_char_color( AT_WHITE, ch );
               if( paf->duration < 6 )
                  set_char_color( AT_WHITE + AT_BLINK, ch );
               ch_printf( ch, "(%5d)   ", paf->duration );
            }
            ch_printf( ch, "%-18s\r\n", skill->name );
         }
      send_to_char( "\r\nAFF_Flags:", ch );
      for( x = 0; x < MAX_AFF; x++ )
         if( xIS_SET( ch->affected_by, x ) )
            ch_printf( ch, " %s,", a_flags[x] );
      send_to_char( "\r\n", ch );
   }
   return;
}
Beispiel #20
0
/*
 * New score command by Haus
 */
void do_score( CHAR_DATA * ch, const char *argument )
{
   AFFECT_DATA *paf;
   int iLang, x;

   if( IS_NPC( ch ) )
   {
      do_oldscore( ch, argument );
      return;
   }

   ch_printf( ch, "\r\n&zScore for %s.\r\n", ch->pcdata->title );
   if( get_trust( ch ) != ch->top_level )
      ch_printf( ch, "You are trusted at level %d.\r\n", get_trust( ch ) );

   send_to_char( "&r----------------------------------------------------------------------------&z\r\n", ch );
   ch_printf( ch, "&r|&zRace      &r:&W %-3d&z year old %-10.10s      Log In&r:&W %-25.24s&r|\r\n",
              get_age( ch ), capitalize( get_race( ch ) ), ctime( &( ch->logon ) ) );
   ch_printf( ch, "&r|&zHitroll   &r: &W%-5d    &zDamroll&r:&W %-5d      &zSaved &r:&W %-25.24s&r|\r\n",
              GET_HITROLL( ch ), GET_DAMROLL( ch ), ch->save_time ? ctime( &( ch->save_time ) ) : "no" );
   ch_printf( ch, "&r|&zGlobal AC &r: &W%-5d    &zEvasion&r: &W%-5d      &zTime  &r: &W%-25.24s&r|\r\n",
              GET_ARMOR( ch ), GET_EVASION( ch ), ctime( &current_time ) );
   ch_printf( ch, "&r|&zAlign     &r: &W%-5d    &zWimpy  &r:&W %-3d                                         &r|\r\n",
              ch->alignment, ch->wimpy  );
   send_to_char( "&r----------------------------------------------------------------------------&z\r\n", ch );
   send_to_char( " &zBarehand Damtypes&r:", ch );
   for( x = 0; x < MAX_DAMTYPE; x++ )
      if( xIS_SET( ch->damtype, x ) )
         ch_printf( ch, " &W%s&r,", d_type[x] );
   send_to_char( "\r\n", ch );
   ch_printf( ch, " &r&zHit Points&r: &W%d&z of&W %d &z    Move&r: &W%d&z of&W %d   &z  Force&r:&W %d&z of&W %d&z\r\n",
                 ch->hit, ch->max_hit, ch->move, ch->max_move, ch->mana, ch->max_mana );

   ch_printf( ch, " &zStr&r: &W%2d  &zDex&r:&W %2d  &zCon&r: &W%2d  &zAgi&r:&W %2d &z Int&r:&W %2d  &zWis&r:&W %2d&z  Cha&r: &w%2d&z\r\n",
              get_curr_str( ch ), get_curr_dex( ch ), get_curr_con( ch ), get_curr_agi( ch ), get_curr_int( ch ), get_curr_wis( ch ),
              get_curr_cha( ch ) );


   send_to_char( "&r----------------------------------------------------------------------------&z\r\n", ch );

   {
      int ability;

      for( ability = 0; ability < MAX_ABILITY; ability++ )
      {
          if( ch->skill_level[ability] < 1 )
             continue;
          ch_printf( ch, " &W%-15s   &zLevel&r: &W%-3d   &zMax&r: &W%-3d   &zExp&r: &W%-10ld   &zNext&r: &W%-10ld&z\r\n",
                     ability_name[ability], ch->skill_level[ability], max_level( ch, ability ), ch->experience[ability],
                     exp_level( ch->skill_level[ability] + 1 ) );
          if( ability == COMBAT_ABILITY )
          {
             for( x = 0; x < MAX_DISCIPLINE; x++ )
                if( ch->known_disciplines[x] != NULL )
                   ch_printf( ch, " - %s%s&g\r\n",
                              is_discipline_set( ch, ch->known_disciplines[x] ) ? "&z" : "&W",
                              ch->known_disciplines[x]->name );
          }
      }
   }

   send_to_char( "&r----------------------------------------------------------------------------\r\n", ch );
   send_to_char( "&r|&zDamage &zType      &r|    &zPenetrate     &r|      &zResist      &r|     &zPotency      &r|\r\n", ch );
   send_to_char( "&r----------------------------------------------------------------------------\r\n", ch );
   for( x = 0; x < MAX_DAMTYPE; x++ )
      ch_printf( ch, "&r|%-19.19s&r:       &W%3d        &r|       &W%3d        &r|       &W%3d        &r|\r\n",
             d_type_score[x], ch->penetration[x], ch->resistance[x], ch->damtype_potency[x] );
   send_to_char( "&r----------------------------------------------------------------------------&z\r\n", ch );

   ch_printf( ch, "&zCREDITS&r:&W %-10d   &zBANK&r: &W%-10d    &zPkills&r: &W%-5.5d   &zMkills&r:&W %-5.5d\r\n",
              ch->gold, ch->pcdata->bank, ch->pcdata->pkills, ch->pcdata->mkills );

   ch_printf( ch, "&zWeight&r: &W%5.5d &r(&zmax&W %7.7d&r)&z    Items&r: &W%5.5d &r(&zmax&W %5.5d&r)\r\n",
              ch->carry_weight, can_carry_w( ch ), ch->carry_number, can_carry_n( ch ) );

   ch_printf( ch, "&zPager&r: &r(&W%c&r)&W %3d &z  AutoExit&r(&W%c&r) &z AutoLoot&r(&W%c&r)&z  Autosac&r(&W%c&r)\r\n",
              IS_SET( ch->pcdata->flags, PCFLAG_PAGERON ) ? 'X' : ' ',
              ch->pcdata->pagerlen, IS_SET( ch->act, PLR_AUTOEXIT ) ? 'X' : ' ',
              IS_SET( ch->act, PLR_AUTOLOOT ) ? 'X' : ' ', IS_SET( ch->act, PLR_AUTOSAC ) ? 'X' : ' ' );

   send_to_char( "\r\n&zLanguages&r: ", ch );
   for( iLang = 0; lang_array[iLang] != LANG_UNKNOWN; iLang++ )
      if( knows_language( ch, lang_array[iLang], ch ) || ( IS_NPC( ch ) && ch->speaks == 0 ) )
      {
         if( lang_array[iLang] & ch->speaking || ( IS_NPC( ch ) && !ch->speaking ) )
            set_char_color( AT_RED, ch );
         send_to_char( lang_names[iLang], ch );
         send_to_char( " ", ch );
         set_char_color( AT_SCORE, ch );
      }

   send_to_char( "\r\n", ch );
   ch_printf( ch, "&zWANTED ON&r: &W%s\r\n", flag_string( ch->pcdata->wanted_flags, planet_flags ) );

   if( ch->pcdata->bestowments && ch->pcdata->bestowments[0] != '\0' )
      ch_printf( ch, "&zYou are bestowed with the command&r(&zs&r):&W %s.\r\n", ch->pcdata->bestowments );

   if( ch->pcdata->clan )
   {
      send_to_char( "&r----------------------------------------------------------------------------\r\n", ch );
      ch_printf( ch, "&zORGANIZATION&r:&W %-35s &zPkills&r/&zDeaths&r: &W%3.3d&r/&W%3.3d",
                 ch->pcdata->clan->name, ch->pcdata->clan->pkills, ch->pcdata->clan->pdeaths );
      send_to_char( "\r\n", ch );
   }
   if( IS_IMMORTAL( ch ) )
   {
      send_to_char( "&r----------------------------------------------------------------------------&z\r\n", ch );

      ch_printf( ch, "IMMORTAL DATA:  Wizinvis [%s]  Wizlevel (%d)\r\n",
                 IS_SET( ch->act, PLR_WIZINVIS ) ? "X" : " ", ch->pcdata->wizinvis );

      ch_printf( ch, "Bamfin:  %s\r\n", ( ch->pcdata->bamfin[0] != '\0' )
                 ? ch->pcdata->bamfin : "%s appears in a swirling mist.", ch->name );
      ch_printf( ch, "Bamfout: %s\r\n", ( ch->pcdata->bamfout[0] != '\0' )
                 ? ch->pcdata->bamfout : "%s leaves in a swirling mist.", ch->name );


      /*
       * Area Loaded info - Scryn 8/11
       */
      if( ch->pcdata->area )
      {
         ch_printf( ch, "Vnums:   Room (%-5.5d - %-5.5d)   Object (%-5.5d - %-5.5d)   Mob (%-5.5d - %-5.5d)\r\n",
                    ch->pcdata->area->low_r_vnum, ch->pcdata->area->hi_r_vnum,
                    ch->pcdata->area->low_o_vnum, ch->pcdata->area->hi_o_vnum,
                    ch->pcdata->area->low_m_vnum, ch->pcdata->area->hi_m_vnum );
         ch_printf( ch, "Area Loaded [%s]\r\n", ( IS_SET( ch->pcdata->area->status, AREA_LOADED ) ) ? "yes" : "no" );
      }
   }
   if( ch->first_affect )
   {
      int i;
      const char *skname;

      i = 0;
      send_to_char( "&r----------------------------------------------------------------------------&z\r\n", ch );
      send_to_char( "&zAFFECT DATA&r:\r\n", ch );
      for( paf = ch->first_affect; paf; paf = paf->next )
      {
         skname = paf->from;

         if( paf->modifier == 0 )
            ch_printf( ch, "&r[&W%-63.64s&r;&W%5d &zrds&r]", skname, (int)paf->duration );
         else if( paf->modifier > 999 )
            ch_printf( ch, "&r[&W%-54.55s&r; &W%7.7s&r;&W%5d &zrds&r]",
                       skname, tiny_affect_loc_name( paf->location ), (int)paf->duration );
         else
            ch_printf( ch, "&r[&W%-51.52s&r;&W%+-3.3d %7.7s&r;%5d &zrds&r]",
                       skname, paf->modifier, tiny_affect_loc_name( paf->location ), (int)paf->duration );
         if( i == 0 )
            i = 1;
         if( ( ++i % 1 ) == 0 )
            send_to_char( "\r\n", ch );
      }
   }
   send_to_char( "\r\n&w", ch );
   return;
}
Beispiel #21
0
/*****************************************************************************
 Name:		save_resets
 Purpose:	Saves the #RESETS section of an area file.
 Called by:	save_area(olc_save.c)
 ****************************************************************************/
void save_resets( FILE *fp, AREA_DATA *pArea )
{
    RESET_DATA *pReset;
    MOB_INDEX_DATA *pLastMob = NULL;
    OBJ_INDEX_DATA *pLastObj;
    ROOM_INDEX_DATA *pRoom;
    char buf[MAX_STRING_LENGTH];
    int iHash;

    fprintf( fp, "#RESETS\n" );

    save_door_resets( fp, pArea );

    for( iHash = 0; iHash < MAX_KEY_HASH; iHash++ )
    {
        for( pRoom = room_index_hash[iHash]; pRoom; pRoom = pRoom->next )
        {
            if ( pRoom->area == pArea )
	    {
    for ( pReset = pRoom->reset_first; pReset; pReset = pReset->next )
    {
	switch ( pReset->command )
	{
	default:
	    bug( "Save_resets: bad command %c.", pReset->command );
	    break;

#if defined( VERBOSE )
	case 'M':
            pLastMob = get_mob_index( pReset->arg1 );
	    fprintf( fp, "M 0 %d %d %d %d Load %s\n", 
	        pReset->arg1,
                pReset->arg2,
                pReset->arg3,
		pReset->arg4,
                pLastMob->short_descr );
            break;

	case 'O':
            pLastObj = get_obj_index( pReset->arg1 );
            pRoom = get_room_index( pReset->arg3 );
	    fprintf( fp, "O 0 %d 0 %d %s loaded to %s\n", 
	        pReset->arg1,
                pReset->arg3,
                capitalize(pLastObj->short_descr),
                pRoom->name );
            break;

	case 'P':
            pLastObj = get_obj_index( pReset->arg1 );
	    fprintf( fp, "P 0 %d %d %d %d %s put inside %s\n", 
	        pReset->arg1,
	        pReset->arg2,
                pReset->arg3,
                pReset->arg4,
                capitalize(get_obj_index( pReset->arg1 )->short_descr),
                pLastObj->short_descr );
            break;

	case 'G':
	    fprintf( fp, "G 0 %d 0 %s is given to %s\n",
	        pReset->arg1,
	        capitalize(get_obj_index( pReset->arg1 )->short_descr),
                pLastMob ? pLastMob->short_descr : "!NO_MOB!" );
            if ( !pLastMob )
            {
                sprintf( buf, "Save_resets: !NO_MOB! in [%s]", pArea->file_name );
                bug( buf, 0 );
            }
            break;

	case 'E':
	    fprintf( fp, "E 0 %d 0 %d %s is loaded %s of %s\n",
	        pReset->arg1,
                pReset->arg3,
                capitalize(get_obj_index( pReset->arg1 )->short_descr),
                flag_string( wear_loc_strings, pReset->arg3 ),
                pLastMob ? pLastMob->short_descr : "!NO_MOB!" );
            if ( !pLastMob )
            {
                sprintf( buf, "Save_resets: !NO_MOB! in [%s]", pArea->file_name );
                bug( buf, 0 );
            }
            break;

	case 'D':
            break;

	case 'R':
            pRoom = get_room_index( pReset->arg1 );
	    fprintf( fp, "R 0 %d %d Randomize %s\n", 
	        pReset->arg1,
                pReset->arg2,
                pRoom->name );
            break;
            }
#endif
#if !defined( VERBOSE )
	case 'M':
            pLastMob = get_mob_index( pReset->arg1 );
	    fprintf( fp, "M 0 %d %d %d %d\n", 
	        pReset->arg1,
                pReset->arg2,
                pReset->arg3,
                pReset->arg4 );
            break;

	case 'O':
            pLastObj = get_obj_index( pReset->arg1 );
            pRoom = get_room_index( pReset->arg3 );
	    fprintf( fp, "O 0 %d 0 %d\n", 
	        pReset->arg1,
                pReset->arg3 );
            break;

	case 'P':
            pLastObj = get_obj_index( pReset->arg1 );
	    fprintf( fp, "P 0 %d %d %d %d\n", 
	        pReset->arg1,
	        pReset->arg2,
                pReset->arg3,
                pReset->arg4 );
            break;

	case 'G':
	    fprintf( fp, "G 0 %d 0\n", pReset->arg1 );
            if ( !pLastMob )
            {
                sprintf( buf,
                    "Save_resets: !NO_MOB! in [%s]", pArea->file_name );
                bug( buf, 0 );
            }
            break;

	case 'E':
	    fprintf( fp, "E 0 %d 0 %d\n",
	        pReset->arg1,
                pReset->arg3 );
            if ( !pLastMob )
            {
                sprintf( buf,
                    "Save_resets: !NO_MOB! in [%s]", pArea->file_name );
                bug( buf, 0 );
            }
            break;

	case 'D':
            break;

	case 'R':
            pRoom = get_room_index( pReset->arg1 );
	    fprintf( fp, "R 0 %d %d\n", 
	        pReset->arg1,
                pReset->arg2 );
            break;
            }
#endif
        }
	    }	/* End if correct area */
	}	/* End for pRoom */
    }	/* End for iHash */
Beispiel #22
0
void do_specialize( CHAR_DATA *ch, const char *argument ) {
  int iClass, iWeapon;
  //  char arg[MAX_INPUT_LENGTH];

  if (IS_NPC(ch)){
    send_to_char("Mobs can't specialize!\n\r",ch);
    return;
  }

  // find a practicer
  CHAR_DATA *practicer;
  for ( practicer = ch->in_room->people; practicer != NULL; practicer = practicer->next_in_room)
    if (IS_NPC(practicer) && IS_SET(practicer->act,ACT_PRACTICE))
      break;
  
  if (practicer == NULL || !can_see(ch,practicer)) {
    send_to_char("You can't do that here.\n\r",ch);
    return;
  }

  //  argument = one_argument(argument,arg);

  // No arg
  if (argument[0] == 0) {
    Value *v = get_extra_field( ch, "specialized_weapon" );
    if ( v != NULL ) { // extra field found
      int specialized = v->asInt();
      send_to_charf(ch, "You are specialized in %s.\n\r", flag_string(weapon_class,specialized));
    }
    else
      specialize_syntax( ch );
  }
  // List available classes
  else if ( !str_cmp( argument, "list" ) ) {
    bool found = FALSE;
    char buf[MAX_STRING_LENGTH];
    char buf2[MAX_STRING_LENGTH];
    buf[0] = '\0';
    for ( int i = 0; i < MAX_CLASS; i++ ) {
      if ( class_table[i].name == NULL ) continue;
      if ( (1 << i) & ch->bstat(classes) ) continue;                     // already has that class
      if ( class_table[i].parent_class == i ) continue;                  // not a sub-class
      if ( !check_class_god( i, ch->pcdata->god ) ) continue;            // god doesn't like that class
      if ( !check_class_race( ch, i ) ) continue;                        // race can't be that class
      if (class_table[i].parent_class != i                               // doesn't have parent class
	  && !((1<<class_table[i].parent_class) & ch->bstat(classes)) ) continue;
      if ( class_table[i].choosable == CLASS_CHOOSABLE_NEVER ) continue; // can't be picked
      if ( ch->isWildMagic                                               // can't get non-wild magic
	   && IS_SET( class_table[i].type, CLASS_MAGIC )                 //  class if wild mage
	   && !IS_SET( class_table[i].type, CLASS_WILDABLE ) ) continue;

      sprintf(buf2,"  %s\n\r", class_table[i].name );
      strcat(buf,buf2);
      found = TRUE;
    }
    
    if (found) {
      send_to_char("Available classes to specialize in:\n\r",ch);
      send_to_char(buf,ch);
    }
    else
      send_to_char("You can't specialize in a class.\n\r", ch );
  }
  // List weapon available weapon
  else if ( !str_cmp( argument, "weapon" ) ) {
    if ( get_ability( ch, gsn_specialization ) == 0 ) {
      send_to_char("You don't know how to specialize in a weapon type.\n\r", ch );
      return;
    }
    bool found = FALSE;
    char buf[MAX_STRING_LENGTH];
    char buf2[MAX_STRING_LENGTH];
    buf[0] = '\0';
    for (int type = 0; weapon_table[type].name != NULL; type++)
      if ( weapon_table[type].gsn != NULL 
	   && get_ability( ch, *(weapon_table[type].gsn) ) == 100 ) {
	found = TRUE;
	sprintf(buf2,"  %s\n\r", weapon_table[type].name );
	strcat(buf,buf2);
      }
    if ( found ) {
      send_to_char("Available weapons to specialize in:\n\r",ch);
      send_to_char(buf,ch);
    }
    else
      send_to_char("You are not proficient enough in any weapon type.\n\r", ch );
  }
  // Weapon
  else if ( ( iWeapon = weapon_lookup(argument) ) >= 0 ) {
    if ( get_ability( ch, gsn_specialization ) == 0 ) {
      send_to_char("You don't know how to specialize in a weapon type.\n\r", ch );
      return;
    }
    if ( weapon_table[iWeapon].gsn
	 && get_ability( ch, *(weapon_table[iWeapon].gsn) ) != 100 ) {
      send_to_charf(ch,"You are not proficient enough in %s.\n\r", weapon_table[iWeapon].name );
      return;
    }
    Value *sp = get_extra_field( ch, "specialized_weapon" );
    if ( sp != NULL ) {
      int w = sp->asInt();
      send_to_charf(ch,"You already specialized in %s.\n\r", w>=0?weapon_table[w].name:"Unknown" );
      return;
    }
    // Add an extra field storing in which weapon the player is specialized
    Value v = add_extra_field( ch, "specialized_weapon" );
    v.setValue( weapon_table[iWeapon].type );
    send_to_charf(ch,"You are now specialized in %s.\n\r", weapon_table[iWeapon].name );
  }
  // Class
  else if ( ( iClass = class_lookup(argument, TRUE) ) >= 0 ) {
    if ((1<<iClass) & ch->bstat(classes)) {
      send_to_char("Choose a class that you don't already have.\n\r",ch);
      return;
    }
    if ( class_table[iClass].parent_class == iClass ) {
      send_to_char("This is not a sub-class.\n\r", ch );
      return;
    }
    if ( !check_class_god( iClass, ch->pcdata->god ) ){
      send_to_charf(ch,
		    "%s doesn't allow that class.\n\r",
		    god_name(ch->pcdata->god));
      return;
    }
    if ( !check_class_race( ch, iClass ) ){
      send_to_char( "You can't choose that class because of your race.\n\r", ch );
      return;
    }
    if ( class_table[iClass].parent_class != iClass
	 && !((1<<class_table[iClass].parent_class) & ch->bstat(classes))) {
      send_to_char("You can't choose this sub-class because you don't have the parent class.\n\r", ch );
      return;
    }
    // Added by SinaC 2003 to determine if a class can be picked during creation/multiclass
    if ( class_table[iClass].choosable == CLASS_CHOOSABLE_NEVER ) {
      send_to_char("This class cannot be picked.\n\r", ch );
      return;
    }
    if ( ch->isWildMagic                                                 // can't get non-wild magic class
	 && IS_SET( class_table[iClass].type, CLASS_MAGIC )              //  if wild mage
	 && !IS_SET( class_table[iClass].type, CLASS_WILDABLE ) ) {
      send_to_charf(ch,"This class cannot be picked by a wild-mage.\n\r");
      return;
    }

    // Remove parent class
    REMOVE_BIT( ch->bstat(classes), 1<<class_table[iClass].parent_class );
    // Add sub-class
    SET_BIT( ch->bstat(classes), 1<<iClass );
    
    send_to_charf(ch,"You specialize yourself as %s.\n\r", class_table[iClass].name );
    recompute(ch);
  }
  else
    specialize_syntax(ch);
}