/* * Copyright (C) 1995-1997 Christopher D. Granz * * This header may not be removed. * * Refer to the file "License" included in this package for further * information and before using any of the following. */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include <ctype.h> #include <stdarg.h> #include <unistd.h> #include "sapphire.h" /* * Functions */ /* * Adds a character the character linked list (ppCharList.) */ void char_to_list( CHAR_DATA *pChar ) { int iHash = ( IS_NPC( pChar ) ? ( pChar->pNPCData->pNPCIndex->iNumber % iHashListSize ) : 0 ); pChar->pNext = ppCharList[iHash]; ppCharList[iHash] = pChar; } /* * Put a character into a room. */ void char_to_room( CHAR_DATA *pChar, ROOM_INDEX_DATA *pRoom ) { pChar->pInRoom = pRoom; pChar->pNextInRoom = pRoom->pPeople; pRoom->pPeople = pChar; } /* * Remove a character from the character list (ppCharList.) */ void char_from_list( CHAR_DATA *pChar ) { int iHash = ( IS_NPC( pChar ) ? ( pChar->pNPCData->pNPCIndex->iNumber % iHashListSize ) : 0 ); if ( pChar == ppCharList[iHash] ) ppCharList[iHash] = pChar->pNext; else { CHAR_DATA *pPrev; for ( pPrev = ppCharList[iHash]; pPrev; pPrev = pPrev->pNext ) { if ( pPrev->pNext == pChar ) { pPrev->pNext = pChar->pNext; break; } } #ifdef DEBUG if ( pPrev == NULL ) wcdebug( "Character not found." ); #endif } pChar->pNext = NULL; } /* * Take a character out of a room. */ void char_from_room( CHAR_DATA *pChar ) { if ( pChar->pInRoom == NULL ) return; if ( pChar == pChar->pInRoom->pPeople ) pChar->pInRoom->pPeople = pChar->pNextInRoom; else { CHAR_DATA *pPrev; for ( pPrev = pChar->pInRoom->pPeople; pPrev; pPrev = pPrev->pNextInRoom ) { if ( pPrev->pNextInRoom == pChar ) { pPrev->pNextInRoom = pChar->pNextInRoom; break; } } #ifdef DEBUG if ( pPrev == NULL ) wcdebug( "Character not found." ); #endif } pChar->pInRoom = NULL; pChar->pNextInRoom = NULL; } /* * Adds an object to the object linked list (ppObjList.) */ void obj_to_list( OBJ_DATA *pObj ) { int iHash = ( pObj->pObjIndex->iNumber % iHashListSize ); pObj->pNext = ppObjList[iHash]; ppObjList[iHash] = pObj; } /* * Put an object in a room. */ void obj_to_room( OBJ_DATA *pObj, ROOM_INDEX_DATA *pRoom ) { pObj->pInRoom = pRoom; pObj->pNextContent = pRoom->pContents; pRoom->pContents = pObj; } /* * Give an object to a character. */ void obj_to_char( OBJ_DATA *pObj, CHAR_DATA *pChar ) { pObj->pCarriedBy = pChar; pObj->pNextContent = pChar->pInven; pChar->pInven = pObj; } /* * Remove an object from the object linked list (pObjList.) */ void obj_from_list( OBJ_DATA *pObj ) { int iHash = ( pObj->pObjIndex->iNumber % iHashListSize ); if ( pObj == ppObjList[iHash] ) ppObjList[iHash] = pObj->pNext; else { OBJ_DATA *pPrev; for ( pPrev = ppObjList[iHash]; pPrev; pPrev = pPrev->pNext ) { if ( pPrev->pNext == pObj ) { pPrev->pNext = pObj->pNext; break; } } #ifdef DEBUG if ( pPrev == NULL ) wcdebug( "Object not found." ); #endif } pObj->pNext = NULL; } /* * Take an object out of a room. */ void obj_from_room( OBJ_DATA *pObj ) { if ( pObj->pInRoom == NULL ) return; if ( pObj == pObj->pInRoom->pContents ) pObj->pInRoom->pContents = pObj->pNextContent; else { OBJ_DATA *pPrev; for ( pPrev = pObj->pInRoom->pContents; pPrev; pPrev = pPrev->pNextContent ) { if ( pPrev->pNextContent == pObj ) { pPrev->pNextContent = pObj->pNextContent; break; } } #ifdef DEBUG if ( pPrev == NULL ) wcdebug( "Object not found." ); #endif } pObj->pInRoom = NULL; pObj->pNextContent = NULL; } /* * Take an object away from a character. */ void obj_from_char( OBJ_DATA *pObj ) { if ( pObj->pCarriedBy == NULL ) return; if ( pObj == pObj->pCarriedBy->pInven ) pObj->pCarriedBy->pInven = pObj->pNextContent; else { OBJ_DATA *pPrev; for ( pPrev = pObj->pCarriedBy->pInven; pPrev; pPrev = pPrev->pNextContent ) { if ( pPrev->pNextContent == pObj ) { pPrev->pNextContent = pObj->pNextContent; break; } } #ifdef DEBUG if ( pPrev == NULL ) wcdebug( "Object not found." ); #endif } pObj->pCarriedBy = NULL; pObj->pNextContent = NULL; } /* * Take an object out of an object. */ void obj_from_obj( OBJ_DATA *pObj ) { if ( pObj->pInObj == NULL ) return; if ( pObj == pObj->pInObj->pContains ) pObj->pInObj->pContains = pObj->pNextContent; else { OBJ_DATA *pPrev; for ( pPrev = pObj->pInObj->pContains; pPrev; pPrev = pPrev->pNextContent ) { if ( pPrev->pNextContent == pObj ) { pPrev->pNextContent = pObj->pNextContent; break; } } #ifdef DEBUG if ( pPrev == NULL ) wcdebug( "Object not found." ); #endif } pObj->pInObj = NULL; pObj->pNextContent = NULL; } /* * Create some random stats. */ void roll_stats( STAT_DATA *pStats ) { int iTotal; pStats->iStatStr = random_range( 20, 85 ); pStats->iStatInt = random_range( 20, 85 ); pStats->iStatWis = random_range( 20, 85 ); pStats->iStatDex = random_range( 20, 85 ); pStats->iStatCon = random_range( 20, 85 ); pStats->iStatCha = random_range( 20, 85 ); pStats->iStatLuc = random_range( 20, 85 ); pStats->iStatHP = ( random_range( 30, 200 ) + pStats->iStatCon / 4 ); pStats->iStatMP = ( random_range( 30, 200 ) + pStats->iStatWis / 4 ); pStats->iStatMV = ( random_range( 30, 200 ) + pStats->iStatDex / 4 ); /* * Make sure the stats are not to high. */ iTotal = ( pStats->iStatStr + pStats->iStatInt + pStats->iStatWis + pStats->iStatDex + pStats->iStatCon + pStats->iStatCha + pStats->iStatLuc + pStats->iStatHP + pStats->iStatMP + pStats->iStatMV ); while ( iTotal > 700 ) { if ( pStats->iStatStr > 25 ) pStats->iStatStr -= 5; if ( pStats->iStatInt > 25 ) pStats->iStatInt -= 5; if ( pStats->iStatWis > 25 ) pStats->iStatWis -= 5; if ( pStats->iStatDex > 25 ) pStats->iStatDex -= 5; if ( pStats->iStatCon > 25 ) pStats->iStatCon -= 5; if ( pStats->iStatCha > 25 ) pStats->iStatCha -= 5; if ( pStats->iStatLuc > 25 ) pStats->iStatLuc -= 5; if ( pStats->iStatHP > 35 ) pStats->iStatHP -= 5; if ( pStats->iStatMP > 35 ) pStats->iStatMP -= 5; if ( pStats->iStatMV > 35 ) pStats->iStatMV -= 5; iTotal -= 50; } } void modify_stats( STAT_DATA *pStats, int iRace ) { int i; for ( i = 0; rRaceTable[i].pName[0] != '\0'; i++ ) { if ( rRaceTable[i].iNumber == iRace ) { if ( pStats->iStatStr < 80 ) pStats->iStatStr += rRaceTable[i].iStatModifiers[0]; if ( pStats->iStatInt < 80 ) pStats->iStatInt += rRaceTable[i].iStatModifiers[1]; if ( pStats->iStatWis < 80 ) pStats->iStatWis += rRaceTable[i].iStatModifiers[2]; if ( pStats->iStatDex < 80 ) pStats->iStatDex += rRaceTable[i].iStatModifiers[3]; if ( pStats->iStatCon < 80 ) pStats->iStatCon += rRaceTable[i].iStatModifiers[4]; if ( pStats->iStatCha < 80 ) pStats->iStatCha += rRaceTable[i].iStatModifiers[5]; if ( pStats->iStatLuc < 80 ) pStats->iStatLuc += rRaceTable[i].iStatModifiers[6]; break; } } } /* * This function (format_string()) was taken from Jason Dinkel's OLC * for Envy. Thus, credit for this function goes to him rather then * myself. */ char *format_string( char *pOldStr ) { char *pOutput = new_buffer( ); char cBuf[MAX_STRING]; char cBuf2[MAX_STRING]; char *pBuf; bool bCap; int i; cBuf[0] = '\0'; cBuf2[0] = '\0'; bCap = TRUE; i = 0; for ( pBuf = pOldStr; *pBuf; pBuf++ ) { if ( *pBuf == '\n' ) { if ( cBuf[i - 1] != ' ' ) { cBuf[i] = ' '; i++; } } else if ( *pBuf == '\r' ) ; else if ( *pBuf == ' ' ) { if ( cBuf[i - 1] != ' ' ) { cBuf[i] = ' '; i++; } } else if ( *pBuf == ')' ) { if ( cBuf[i - 1] == ' ' && cBuf[ i - 2] == ' ' && ( cBuf[i - 3] == '.' || cBuf[i - 3] == '?' || cBuf[i - 3] == '!' ) ) { cBuf[i - 2] = ')'; cBuf[i - 1] = ' '; cBuf[i] = ' '; i++; } else { cBuf[i] = ')'; i++; } } else if ( *pBuf == '.' || *pBuf == '?' || *pBuf == '!' ) { if ( cBuf[i - 1] == ' ' && cBuf[i - 2] == ' ' && ( cBuf[i - 3] == '.' || cBuf[i - 3] == '?' || cBuf[i - 3] == '!' ) ) { cBuf[i - 2] = *pBuf; if ( *( pBuf + 1 ) != '\"' ) { cBuf[i - 1] = ' '; cBuf[i] = ' '; i++; } else { cBuf[i - 1] = '\"'; cBuf[i] = ' '; cBuf[i + 1] = ' '; i += 2; pBuf++; } } else { cBuf[i] = *pBuf; if ( *( pBuf + 1 ) != '\"' ) { cBuf[i + 1] = ' '; cBuf[i + 2] = ' '; i += 3; } else { cBuf[i + 1] = '\"'; cBuf[i + 2] = ' '; cBuf[i + 3] = ' '; i += 4; pBuf++; } } bCap = TRUE; } else { cBuf[i] = *pBuf; if ( bCap == TRUE ) { bCap = FALSE; cBuf[i] = UPPER( cBuf[i] ); } i++; } } cBuf[i] = '\0'; strcpy( cBuf2, cBuf ); pBuf = cBuf2; cBuf[0] = '\0'; for ( ; ; ) { for ( i = 0; i < 77; i++ ) { if ( ( *( pBuf + i ) ) == 0 ) break; } if ( i < 77 ) break; for ( i = ( cBuf[0] ? 76 : 73 ); i; i-- ) { if ( *( pBuf + i ) == ' ' ) break; } if ( i != 0 ) { *( pBuf + i ) = '\0'; strcat( cBuf, pBuf ); strcat( cBuf, "\n\r" ); pBuf += i + 1; while ( *pBuf == ' ' ) pBuf++; } else { wcerror( "Format string: No spaces in string." ); *(pBuf + 75) = '\0'; strcat( cBuf, pBuf ); strcat( cBuf, "-\n\r" ); pBuf += 76; } } while ( *( pBuf + i ) && ( *( pBuf + i ) == ' ' || *( pBuf + i ) == '\n' || *( pBuf + i ) == '\r' ) ) i--; *( pBuf + i + 1 ) = '\0'; strcat( cBuf, pBuf ); if ( ( i = ( strlen( cBuf ) - 2 ) ) >= 0 ) { if ( cBuf[i] == '\n' ) cBuf[i] = '\0'; } strcpy( pOutput, cBuf ); return ( pOutput ); } bool sp_legal_string( char *pStr ) { XWORD_DATA *pXWord; for ( pXWord = pXWordList; pXWord; pXWord = pXWord->pNext ) { if ( str_infix( pXWord->pWord, pStr ) == TRUE ) return ( FALSE ); } return ( TRUE ); } /* * See it an object is visable to a character. */ bool visable_object( OBJ_DATA *pObj, CHAR_DATA *pChar ) { if ( pChar->iLevel == IMP_LEVEL || ( ( ( !IS_SET( pObj->fObjFlags, FLAG_OBJECT_INVIS ) && ( pObj->pInRoom != NULL ? !IS_SET( pObj->pInRoom->fRoomFlags, FLAG_ROOM_INVIS ) : 1 ) ) || IS_SET( pChar->fActFlags, FLAG_ACT_SEE_INVIS ) ) && has_light( pChar ) == TRUE ) ) return ( TRUE ); return ( FALSE ); } /* * See if pChar1 is visable to pChar2. */ bool visable_char( CHAR_DATA *pChar1, CHAR_DATA *pChar2 ) { if ( pChar2->iLevel == IMP_LEVEL || ( ( ( !IS_SET( pChar1->fActFlags, FLAG_ACT_INVIS ) && ( pChar1->pInRoom != NULL ? !IS_SET( pChar1->pInRoom->fRoomFlags, FLAG_ROOM_INVIS ) : 1 ) ) || IS_SET( pChar2->fActFlags, FLAG_ACT_SEE_INVIS ) ) && ( has_light( pChar2 ) == TRUE || has_light( pChar1 ) == TRUE ) ) ) return ( TRUE ); return ( FALSE ); } /* * Returns TRUE if pChar has light. Returns FALSE otherwise. */ bool has_light( CHAR_DATA *pChar ) { ROOM_INDEX_DATA *pRoom = pChar->pInRoom; OBJ_DATA *pObj; if ( pRoom != NULL && !IS_SET( pRoom->fRoomFlags, FLAG_ROOM_DARK ) ) return ( TRUE ); for ( pObj = pChar->pInven; pObj != NULL; pObj = pObj->pNextContent ) { if ( IS_SET( pObj->fObjFlags, FLAG_OBJECT_LIT ) ) return ( TRUE ); } return ( FALSE ); } /* * Returns the weight of all the objects carried by a character (pChar.) */ int carry_weight( CHAR_DATA *pChar ) { OBJ_DATA *pObj; int i = 0; for ( pObj = pChar->pInven; pObj != NULL; pObj = pObj->pNextContent ) i += pObj->iWeight; return ( i ); } /* * Replaces special "prompt symbols" in a string with the currect values. */ char *format_prompt( CHAR_DATA *pChar, char *pPrompt ) { char *pOutput = new_buffer( ); int i, iPos; for ( i = 0, iPos = 0; pPrompt[i] != '\0'; i++, iPos++ ) { if ( pPrompt[i] == '%' ) { switch ( pPrompt[++i] ) { case '%' : pOutput[iPos] = '%'; break; case 'L' : case 'l' : sprintf( &pOutput[iPos], "%d", pChar->iLevel ); iPos = ( strlen( pOutput ) - 1 ); break; case 'H' : sprintf( &pOutput[iPos], "%d", pChar->pStats->iStatHP ); iPos = ( strlen( pOutput ) - 1 ); break; case 'h' : sprintf( &pOutput[iPos], "%d", pChar->iHP ); iPos = ( strlen( pOutput ) - 1 ); break; case 'M' : sprintf( &pOutput[iPos], "%d", pChar->pStats->iStatMP ); iPos = ( strlen( pOutput ) - 1 ); break; case 'm' : sprintf( &pOutput[iPos], "%d", pChar->iMP ); iPos = ( strlen( pOutput ) - 1 ); break; case 'V' : sprintf( &pOutput[iPos], "%d", pChar->pStats->iStatMV ); iPos = ( strlen( pOutput ) - 1 ); break; case 'v' : sprintf( &pOutput[iPos], "%d", pChar->iMV ); iPos = ( strlen( pOutput ) - 1 ); break; case 'G' : case 'g' : sprintf( &pOutput[iPos], "%ld", pChar->iGold ); iPos = ( strlen( pOutput ) - 1 ); break; case '\0': i--; default : iPos--; break; } } else if ( pPrompt[i] == '&' ) { switch ( pPrompt[++i] ) { case '&' : pOutput[iPos] = '&'; break; case 'n' : case 'N' : strcpy( &pOutput[iPos], make_ansi_code( ANSI_CODEREF_SGR_DSET, "0", NULL, pChar->pTerm ) ); iPos = ( strlen( pOutput ) - 1 ); break; case 'r' : strcpy( &pOutput[iPos], make_ansi_code( ANSI_CODEREF_SGR_DSET, "0;40;31", NULL, pChar->pTerm ) ); iPos = ( strlen( pOutput ) - 1 ); break; case 'R' : strcpy( &pOutput[iPos], make_ansi_code( ANSI_CODEREF_SGR_DSET, "0;1;40;31", NULL, pChar->pTerm ) ); iPos = ( strlen( pOutput ) - 1 ); break; case 'g' : strcpy( &pOutput[iPos], make_ansi_code( ANSI_CODEREF_SGR_DSET, "0;40;32", NULL, pChar->pTerm ) ); iPos = ( strlen( pOutput ) - 1 ); break; case 'G' : strcpy( &pOutput[iPos], make_ansi_code( ANSI_CODEREF_SGR_DSET, "0;1;40;32", NULL, pChar->pTerm ) ); iPos = ( strlen( pOutput ) - 1 ); break; case 'y' : strcpy( &pOutput[iPos], make_ansi_code( ANSI_CODEREF_SGR_DSET, "0;40;33", NULL, pChar->pTerm ) ); iPos = ( strlen( pOutput ) - 1 ); break; case 'Y' : strcpy( &pOutput[iPos], make_ansi_code( ANSI_CODEREF_SGR_DSET, "0;1;40;33", NULL, pChar->pTerm ) ); iPos = ( strlen( pOutput ) - 1 ); break; case 'b' : strcpy( &pOutput[iPos], make_ansi_code( ANSI_CODEREF_SGR_DSET, "0;40;34", NULL, pChar->pTerm ) ); iPos = ( strlen( pOutput ) - 1 ); break; case 'B' : strcpy( &pOutput[iPos], make_ansi_code( ANSI_CODEREF_SGR_DSET, "0;1;40;34", NULL, pChar->pTerm ) ); iPos = ( strlen( pOutput ) - 1 ); break; case 'm' : strcpy( &pOutput[iPos], make_ansi_code( ANSI_CODEREF_SGR_DSET, "0;40;35", NULL, pChar->pTerm ) ); iPos = ( strlen( pOutput ) - 1 ); break; case 'M' : strcpy( &pOutput[iPos], make_ansi_code( ANSI_CODEREF_SGR_DSET, "0;1;40;35", NULL, pChar->pTerm ) ); iPos = ( strlen( pOutput ) - 1 ); break; case 'c' : strcpy( &pOutput[iPos], make_ansi_code( ANSI_CODEREF_SGR_DSET, "0;40;36", NULL, pChar->pTerm ) ); iPos = ( strlen( pOutput ) - 1 ); break; case 'C' : strcpy( &pOutput[iPos], make_ansi_code( ANSI_CODEREF_SGR_DSET, "0;1;40;36", NULL, pChar->pTerm ) ); iPos = ( strlen( pOutput ) - 1 ); break; case 'w' : strcpy( &pOutput[iPos], make_ansi_code( ANSI_CODEREF_SGR_DSET, "0;40;37", NULL, pChar->pTerm ) ); iPos = ( strlen( pOutput ) - 1 ); break; case 'W' : strcpy( &pOutput[iPos], make_ansi_code( ANSI_CODEREF_SGR_DSET, "0;1;40;37", NULL, pChar->pTerm ) ); iPos = ( strlen( pOutput ) - 1 ); break; case '\0': i--; default : iPos--; break; } } else pOutput[iPos] = pPrompt[i]; } pOutput[iPos] = '\0'; strcat( pOutput, make_ansi_code( ANSI_CODEREF_SGR_DSET, "0", NULL, pChar->pTerm ) ); return ( pOutput ); } int count_race( ROOM_INDEX_DATA *pRoom, intt iRace ) { CHAR_DATA *pChar; int iCount = 0; for ( pChar = pRoom->pPeople; pChar; pChar = pChar->pNextInRoom ) { if ( pChar->iRace == iRace ) iCount++; } return ( iCount ); } int count_npcs( ROOM_INDEX_DATA *pRoom, NPC_DATA *pNPCData ) { CHAR_DATA *pChar; int iCount = 0; for ( pChar = pRoom->pPeople; pChar; pChar = pChar->pNextInRoom ) { if ( IS_NPC( pChar ) && ( pChar->pNPCData->pNPCIndex == pNPCData->pNPCIndex || str_compare( pChar->pNPCData->sShortDesc, pNPCData->sShortDesc ) == TRUE ) ) iCount++; } return ( iCount ); } void introduce_char( CHAR_DATA *pChar, CHAR_DATA *pIntroduceChar ) { KNOWN_PERSON_DATA *pKnownPerson; if ( IS_NPC( pChar ) || IS_NPC( pIntroduceChar ) || IS_GUEST( pIntroduceChar ) || pChar->iLevel >= BUILDER_LEVEL || pChar == pIntroduceChar ) return; pKnownPerson = alloc_mem( sizeof( *pKnownPerson ) ); pKnownPerson->sName = save_string( ( IS_NPC( pIntroduceChar ) ? pIntroduceChar->pNPCData->pNameList[0] : pIntroduceChar->pPCData->sName ) ); pKnownPerson->tIntroduced = tCurrentTime; pKnownPerson->pNext = pChar->pPCData->pKnownPeople; pChar->pPCData->pKnownPeople = pKnownPerson; } bool knows_char( CHAR_DATA *pChar, CHAR_DATA *pKnowChar ) { KNOWN_PERSON_DATA *pKnownPerson; if ( IS_NPC( pChar ) || IS_NPC( pKnowChar ) || IS_GUEST( pKnowChar ) || pChar->iLevel >= BUILDER_LEVEL || pChar == pKnowChar ) return ( TRUE ); for ( pKnownPerson = pChar->pPCData->pKnownPeople; pKnownPerson; pKnownPerson = pKnownPerson->pNext ) { if ( str_compare( pKnownPerson->sName, ( IS_NPC( pKnowChar ) ? pKnowChar->pNPCData->pNameList[0] : pKnowChar->pPCData->sName ) ) == TRUE ) return ( TRUE ); } return ( FALSE ); } void find_exit( CHAR_DATA *pChar, ROOM_INDEX_DATA *pRoom, intt iDir ) { KNOWN_EXIT_DATA *pKnownExit; if ( IS_NPC( pChar ) || pChar->iLevel >= BUILDER_LEVEL ) return; pKnownExit = alloc_mem( sizeof( *pKnownExit ) ); pKnownExit->pRoom = pRoom; pKnownExit->iDir = iDir; pKnownExit->tDiscovered = tCurrentTime; pKnownExit->pNext = pChar->pPCData->pKnownExits; pChar->pPCData->pKnownExits = pKnownExit; } bool knows_exit( CHAR_DATA *pChar, ROOM_INDEX_DATA *pRoom, intt iDir ) { KNOWN_EXIT_DATA *pKnownExit; if ( IS_NPC( pChar ) || pChar->iLevel >= BUILDER_LEVEL ) return ( TRUE ); for ( pKnownExit = pChar->pPCData->pKnownExits; pKnownExit != NULL; pKnownExit = pKnownExit->pNext ) { if ( pKnownExit->pRoom == pRoom && pKnownExit->iDir == iDir ) return ( TRUE ); } return ( FALSE ); } char *npc_flags_string( flags fNPC ) { char *pOutput = new_buffer( ); int i; bool b = FALSE; for ( i = 0; snNPCFlagsTable[i].pName[0] != '\0'; i++ ) { if ( IS_SET( fNPC, snNPCFlagsTable[i].iNumber ) ) { strcat( pOutput, snNPCFlagsTable[i].pName ); b = TRUE; } } if ( b == FALSE ) return ( EMPTY_STRING ); else return ( pOutput ); } char *part_flags_string( flags fParts ) { char *pOutput = new_buffer( ); int i; bool b = FALSE; for ( i = 0; snPartFlagsTable[i].pName[0] != '\0'; i++ ) { if ( IS_SET( fParts, snPartFlagsTable[i].iNumber ) ) { strcat( pOutput, snPartFlagsTable[i].pName ); b = TRUE; } } if ( b == FALSE ) return ( EMPTY_STRING ); else return ( pOutput ); } char *act_flags_string( flags fAct ) { char *pOutput = new_buffer( ); int i; bool b = FALSE; for ( i = 0; snActFlagsTable[i].pName[0] != '\0'; i++ ) { if ( IS_SET( fAct, snActFlagsTable[i].iNumber ) ) { strcat( pOutput, snActFlagsTable[i].pName ); b = TRUE; } } if ( b == FALSE ) return ( EMPTY_STRING ); else return ( pOutput ); } char *obj_flags_string( flags fObj ) { char *pOutput = new_buffer( ); int i; bool b = FALSE; for ( i = 0; snObjectFlagsTable[i].pName[0] != '\0'; i++ ) { if ( IS_SET( fObj, snObjectFlagsTable[i].iNumber ) ) { strcat( pOutput, snObjectFlagsTable[i].pName ); b = TRUE; } } if ( b == FALSE ) return ( EMPTY_STRING ); else return ( pOutput ); } char *room_flags_string( flags fRoom ) { char *pOutput = new_buffer( ); int i; bool b = FALSE; for ( i = 0; snRoomFlagsTable[i].pName[0] != '\0'; i++ ) { if ( IS_SET( fRoom, snRoomFlagsTable[i].iNumber ) ) { strcat( pOutput, snRoomFlagsTable[i].pName ); b = TRUE; } } if ( b == FALSE ) return ( EMPTY_STRING ); else return ( pOutput ); } char *door_flags_string( flags fDoor ) { char *pOutput = new_buffer( ); if ( IS_SET( fDoor, FLAG_DOOR_CLOSED ) ) strcat( pOutput, " CLOSED" ); if ( IS_SET( fDoor, FLAG_DOOR_LOCKED ) ) strcat( pOutput, " LOCKED" ); if ( IS_SET( fDoor, FLAG_DOOR_HIDDEN ) ) strcat( pOutput, " HIDDEN" ); if ( pOutput[0] == '\0' ) return ( EMPTY_STRING ); else return ( &pOutput[1] ); } /* * End of misc.c */