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 ); }
// 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 )); } } }
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); }
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; }
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); }
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); }
// 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); }
/***************************************************************************** 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; }
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 ); }
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; }
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; }
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; }
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; }
/* 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; }
// 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; }
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; }
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; }
/* 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; }
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; }
/* * 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( ¤t_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; }
/***************************************************************************** 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 */
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); }