void AddLockedDoorCursors() { DOOR *pDoor; INT i; for( i = 0; i < gubNumDoors; i++ ) { pDoor = &DoorTable[ i ]; AddTopmostToHead( pDoor->sGridNo, ROTATINGKEY1 ); } }
void ExtractAndUpdateDoorInfo() { LEVELNODE* pNode; INT32 num; DOOR door; BOOLEAN fCursor = FALSE; BOOLEAN fCursorExists = FALSE; memset( &door, 0, sizeof( DOOR ) ); door.sGridNo = (INT16)iDoorMapIndex; num = min( GetNumericStrictValueFromField( 0 ), NUM_LOCKS-1 ); door.ubLockID = (UINT8)num; SetInputFieldStringWithNumericStrictValue( 0, num ); if( num >= 0 ) fCursor = TRUE; num = min( max( GetNumericStrictValueFromField( 1 ), 0 ), 10 ); door.ubTrapID = (UINT8)num; SetInputFieldStringWithNumericStrictValue( 1, num ); if( num ) fCursor = TRUE; num = min( max( GetNumericStrictValueFromField( 2 ), 0 ), 20 ); if( door.ubTrapID && !num ) num = 1; //Can't have a trap without a traplevel! door.ubTrapLevel = (UINT8)num; SetInputFieldStringWithNumericStrictValue( 2, num ); if( num ) fCursor = TRUE; if( ButtonList[ iDoorButton[ DOOR_LOCKED ] ]->uiFlags & BUTTON_CLICKED_ON ) { door.fLocked = TRUE; } else { door.fLocked = FALSE; } //Find out if we have a rotating key cursor (we will either add one or remove one) pNode = gpWorldLevelData[ iDoorMapIndex ].pTopmostHead; while( pNode ) { if( pNode->usIndex == ROTATINGKEY1 ) { fCursorExists = TRUE; break; } pNode = pNode->pNext; } if( fCursor ) { //we have a valid door, so add it (or replace existing) if( !fCursorExists ) AddTopmostToHead( iDoorMapIndex, ROTATINGKEY1 ); //If the door already exists, the new information will replace it. AddDoorInfoToTable( &door ); } else { //if a door exists here, remove it. if( fCursorExists ) RemoveAllTopmostsOfTypeRange( iDoorMapIndex, ROTATINGKEY, ROTATINGKEY ); RemoveDoorInfoFromTable( iDoorMapIndex ); } }
ANITILE *CreateAnimationTile( ANITILE_PARAMS *pAniParams ) { ANITILE *pAniNode; ANITILE *pNewAniNode; LEVELNODE *pNode; INT32 iCachedTile=-1; INT16 sGridNo; UINT8 ubLevel; INT16 usTileType; INT16 usTileIndex; INT16 sDelay; INT16 sStartFrame=-1; UINT32 uiFlags; LEVELNODE *pGivenNode; INT16 sX, sY, sZ; UINT8 ubTempDir; // Get some parameters from structure sent in... sGridNo = pAniParams->sGridNo; ubLevel = pAniParams->ubLevelID; usTileType = pAniParams->usTileType; usTileIndex = pAniParams->usTileIndex; sDelay = pAniParams->sDelay; sStartFrame = pAniParams->sStartFrame; uiFlags = pAniParams->uiFlags; pGivenNode = pAniParams->pGivenLevelNode; sX = pAniParams->sX; sY = pAniParams->sY; sZ = pAniParams->sZ; pAniNode = pAniTileHead; // Allocate head pNewAniNode = MemAlloc( sizeof( ANITILE ) ); if ( (uiFlags & ANITILE_EXISTINGTILE ) ) { pNewAniNode->pLevelNode = pGivenNode; pNewAniNode->pLevelNode->pAniTile = pNewAniNode; } else { if ( ( uiFlags & ANITILE_CACHEDTILE ) ) { iCachedTile = GetCachedTile( pAniParams->zCachedFile ); if ( iCachedTile == -1 ) { return( NULL ); } usTileIndex = iCachedTile + TILE_CACHE_START_INDEX; } // ALLOCATE NEW TILE switch( ubLevel ) { case ANI_STRUCT_LEVEL: pNode = ForceStructToTail( sGridNo, usTileIndex ); break; case ANI_SHADOW_LEVEL: AddShadowToHead( sGridNo, usTileIndex ); pNode = gpWorldLevelData[ sGridNo ].pShadowHead; break; case ANI_OBJECT_LEVEL: AddObjectToHead( sGridNo, usTileIndex ); pNode = gpWorldLevelData[ sGridNo ].pObjectHead; break; case ANI_ROOF_LEVEL: AddRoofToHead( sGridNo, usTileIndex ); pNode = gpWorldLevelData[ sGridNo ].pRoofHead; break; case ANI_ONROOF_LEVEL: AddOnRoofToHead( sGridNo, usTileIndex ); pNode = gpWorldLevelData[ sGridNo ].pOnRoofHead; break; case ANI_TOPMOST_LEVEL: AddTopmostToHead( sGridNo, usTileIndex ); pNode = gpWorldLevelData[ sGridNo ].pTopmostHead; break; default: return( NULL ); } // SET NEW TILE VALUES pNode->ubShadeLevel=DEFAULT_SHADE_LEVEL; pNode->ubNaturalShadeLevel=DEFAULT_SHADE_LEVEL; pNewAniNode->pLevelNode = pNode; if ( ( uiFlags & ANITILE_CACHEDTILE ) ) { pNewAniNode->pLevelNode->uiFlags |= ( LEVELNODE_CACHEDANITILE ); pNewAniNode->sCachedTileID = (INT16)iCachedTile; pNewAniNode->usCachedTileSubIndex = usTileType; pNewAniNode->pLevelNode->pAniTile = pNewAniNode; pNewAniNode->sRelativeX = sX; pNewAniNode->sRelativeY = sY; pNewAniNode->pLevelNode->sRelativeZ = sZ; } // Can't set relative X,Y,Z IF FLAGS ANITILE_CACHEDTILE set! else if ( (uiFlags & ANITILE_USEABSOLUTEPOS ) ) { pNewAniNode->pLevelNode->sRelativeX = sX; pNewAniNode->pLevelNode->sRelativeY = sY; pNewAniNode->pLevelNode->sRelativeZ = sZ; pNewAniNode->pLevelNode->uiFlags |= ( LEVELNODE_USEABSOLUTEPOS ); } } switch( ubLevel ) { case ANI_STRUCT_LEVEL: ResetSpecificLayerOptimizing( TILES_DYNAMIC_STRUCTURES ); break; case ANI_SHADOW_LEVEL: ResetSpecificLayerOptimizing( TILES_DYNAMIC_SHADOWS ); break; case ANI_OBJECT_LEVEL: ResetSpecificLayerOptimizing( TILES_DYNAMIC_OBJECTS ); break; case ANI_ROOF_LEVEL: ResetSpecificLayerOptimizing( TILES_DYNAMIC_ROOF ); break; case ANI_ONROOF_LEVEL: ResetSpecificLayerOptimizing( TILES_DYNAMIC_ONROOF ); break; case ANI_TOPMOST_LEVEL: ResetSpecificLayerOptimizing( TILES_DYNAMIC_TOPMOST ); break; } // SET FLAGS FOR LEVELNODE pNewAniNode->pLevelNode->uiFlags |= ( LEVELNODE_ANIMATION | LEVELNODE_USEZ | LEVELNODE_DYNAMIC ); if ( ( uiFlags & ANITILE_NOZBLITTER ) ) { pNewAniNode->pLevelNode->uiFlags |= LEVELNODE_NOZBLITTER; } if ( ( uiFlags & ANITILE_ALWAYS_TRANSLUCENT ) ) { pNewAniNode->pLevelNode->uiFlags |= LEVELNODE_REVEAL; } if ( ( uiFlags & ANITILE_USEBEST_TRANSLUCENT ) ) { pNewAniNode->pLevelNode->uiFlags |= LEVELNODE_USEBESTTRANSTYPE; } if ( ( uiFlags & ANITILE_ANIMATE_Z ) ) { pNewAniNode->pLevelNode->uiFlags |= LEVELNODE_DYNAMICZ; } if ( ( uiFlags & ANITILE_PAUSED ) ) { pNewAniNode->pLevelNode->uiFlags |= ( LEVELNODE_LASTDYNAMIC | LEVELNODE_UPDATESAVEBUFFERONCE ); pNewAniNode->pLevelNode->uiFlags &= (~LEVELNODE_DYNAMIC ); } if ( ( uiFlags & ANITILE_OPTIMIZEFORSMOKEEFFECT ) ) { pNewAniNode->pLevelNode->uiFlags |= LEVELNODE_NOWRITEZ; } // SET ANITILE VALUES pNewAniNode->ubLevelID = ubLevel; pNewAniNode->usTileIndex = usTileIndex; if ( ( uiFlags & ANITILE_CACHEDTILE ) ) { pNewAniNode->usNumFrames = gpTileCache[ iCachedTile ].ubNumFrames; } else { Assert( gTileDatabase[ usTileIndex ].pAnimData != NULL ); pNewAniNode->usNumFrames = gTileDatabase[ usTileIndex ].pAnimData->ubNumFrames; } if ( ( uiFlags & ANITILE_USE_DIRECTION_FOR_START_FRAME ) ) { // Our start frame is actually a direction indicator ubTempDir = gOneCDirection[ pAniParams->uiUserData3 ]; sStartFrame = (UINT16)sStartFrame + ( pNewAniNode->usNumFrames * ubTempDir ); } if ( ( uiFlags & ANITILE_USE_4DIRECTION_FOR_START_FRAME ) ) { // Our start frame is actually a direction indicator ubTempDir = gb4DirectionsFrom8[ pAniParams->uiUserData3 ]; sStartFrame = (UINT16)sStartFrame + ( pNewAniNode->usNumFrames * ubTempDir ); } pNewAniNode->usTileType = usTileType; pNewAniNode->pNext = pAniNode; pNewAniNode->uiFlags = uiFlags; pNewAniNode->sDelay = sDelay; pNewAniNode->sCurrentFrame = sStartFrame; pNewAniNode->uiTimeLastUpdate = GetJA2Clock( ); pNewAniNode->sGridNo = sGridNo; pNewAniNode->sStartFrame = sStartFrame; pNewAniNode->ubKeyFrame1 = pAniParams->ubKeyFrame1; pNewAniNode->uiKeyFrame1Code = pAniParams->uiKeyFrame1Code; pNewAniNode->ubKeyFrame2 = pAniParams->ubKeyFrame2; pNewAniNode->uiKeyFrame2Code = pAniParams->uiKeyFrame2Code; pNewAniNode->uiUserData = pAniParams->uiUserData; pNewAniNode->ubUserData2 = pAniParams->ubUserData2; pNewAniNode->uiUserData3 = pAniParams->uiUserData3; //Set head pAniTileHead = pNewAniNode; // Set some special stuff return( pNewAniNode ); }