void UpdateActionItem( INT8 bActionItemIndex ) { gbActionItemIndex = bActionItemIndex; //used for future new actionitems as the default. if( !gpItemPool || !gpItem ) return; //If the previous item was a pit, remove it before changing it if( gpItem->usItem == ACTION_ITEM ) { if( gpItem->bActionValue == ACTION_ITEM_SMALL_PIT ) Remove3X3Pit( gWorldItems[ gpItemPool->iItemIndex ].sGridNo ); else if( gpItem->bActionValue == ACTION_ITEM_LARGE_PIT ) Remove5X5Pit( gWorldItems[ gpItemPool->iItemIndex ].sGridNo ); } ChangeActionItem( gpItem, gbActionItemIndex ); SpecifyButtonText( guiActionItemButton, GetActionItemName( gpItem ) ); //If the new item is a pit, add it so we can see how it looks. if( gpItem->usItem == ACTION_ITEM ) { if( gpItem->bActionValue == ACTION_ITEM_SMALL_PIT ) Add3X3Pit( gWorldItems[ gpItemPool->iItemIndex ].sGridNo ); else if( gpItem->bActionValue == ACTION_ITEM_LARGE_PIT ) Add5X5Pit( gWorldItems[ gpItemPool->iItemIndex ].sGridNo ); } }
void AddAllPits() { UINT32 i; for( i = 0; i < guiNumWorldItems; i++ ) { if( gWorldItems[ i ].o.usItem == ACTION_ITEM ) { if( gWorldItems[ i ].o.bActionValue == ACTION_ITEM_SMALL_PIT ) Add3X3Pit( gWorldItems[ i ].sGridNo ); else if( gWorldItems[ i ].o.bActionValue == ACTION_ITEM_LARGE_PIT ) Add5X5Pit( gWorldItems[ i ].sGridNo ); } } }
void AddSelectedItemToWorld( INT32 sGridNo ) { OBJECTTYPE *pObject; INVTYPE *pItem; ITEM_POOL *pItemPool; INT32 iItemIndex; INT8 bVisibility = INVISIBLE; BOOLEAN fFound = FALSE; IPListNode *pIPCurr, *pIPPrev; UINT16 usFlags; //Extract the currently selected item. SpecifyItemToEdit( NULL, -1 ); if( eInfo.uiItemType == TBAR_MODE_ITEM_KEYS ) { CreateKeyObject( &gTempObject, 1, (UINT8)eInfo.sSelItemIndex ); } else { CreateItem( eInfo.pusItemIndex[eInfo.sSelItemIndex], 100, &gTempObject ); } usFlags = 0; switch( gTempObject.usItem ) { case MINE: if ( bVisibility == BURIED ) { usFlags |= WORLD_ITEM_ARMED_BOMB; } break; case MONEY: case SILVER: case GOLD: gTempObject[0]->data.objectStatus = 100; gTempObject[0]->data.money.uiMoneyAmount = 100 + Random( 19901 ); break; case OWNERSHIP: gTempObject[0]->data.owner.ubOwnerProfile = NO_PROFILE; bVisibility = BURIED; break; case SWITCH: if( TriggerAtGridNo( sGridNo ) ) { //Restricted to one action per gridno. return; } bVisibility = BURIED; gTempObject[0]->data.objectStatus = 100; gTempObject[0]->data.misc.ubBombOwner = 1; if( eInfo.sSelItemIndex < 2 ) gTempObject[0]->data.misc.bFrequency = PANIC_FREQUENCY; else if( eInfo.sSelItemIndex < 4 ) gTempObject[0]->data.misc.bFrequency = PANIC_FREQUENCY_2; else if( eInfo.sSelItemIndex < 6 ) gTempObject[0]->data.misc.bFrequency = PANIC_FREQUENCY_3; else gTempObject[0]->data.misc.bFrequency = (INT8)(FIRST_MAP_PLACED_FREQUENCY + (eInfo.sSelItemIndex-4) / 2); usFlags |= WORLD_ITEM_ARMED_BOMB; break; case ACTION_ITEM: bVisibility = BURIED; gTempObject[0]->data.objectStatus = 100; gTempObject[0]->data.misc.ubBombOwner = 1; gTempObject[0]->data.bTrap = gbDefaultBombTrapLevel; if( eInfo.sSelItemIndex < PRESSURE_ACTION_ID ) { gTempObject[0]->data.misc.bDetonatorType = BOMB_REMOTE; if( eInfo.sSelItemIndex < 2 ) gTempObject[0]->data.misc.bFrequency = PANIC_FREQUENCY; else if( eInfo.sSelItemIndex < 4 ) gTempObject[0]->data.misc.bFrequency = PANIC_FREQUENCY_2; else if( eInfo.sSelItemIndex < 6 ) gTempObject[0]->data.misc.bFrequency = PANIC_FREQUENCY_3; else gTempObject[0]->data.misc.bFrequency = (INT8)(FIRST_MAP_PLACED_FREQUENCY + (eInfo.sSelItemIndex-4) / 2); } else { gTempObject[0]->data.misc.bDetonatorType = BOMB_PRESSURE; gTempObject[0]->data.misc.bDelay = 0; } ChangeActionItem( &gTempObject, gbActionItemIndex ); gTempObject.fFlags |= OBJECT_ARMED_BOMB; if( gbActionItemIndex == ACTIONITEM_SMPIT ) Add3X3Pit( sGridNo ); else if( gbActionItemIndex == ACTIONITEM_LGPIT ) Add5X5Pit( sGridNo ); usFlags |= WORLD_ITEM_ARMED_BOMB; break; } pObject = InternalAddItemToPool( &sGridNo, &gTempObject, bVisibility, 0, usFlags, 0, -1, &iItemIndex ); if( gTempObject.usItem != OWNERSHIP ) { gWorldItems[ iItemIndex ].ubNonExistChance = (UINT8)(100 - giDefaultExistChance); } else { gWorldItems[ iItemIndex ].ubNonExistChance = 0; } pItem = &( Item[ pObject->usItem ] ); if( pItem->usItemClass == IC_AMMO ) { if (Random( 2 )) { (*pObject)[0]->data.ubShotsLeft = Magazine[ pItem->ubClassIndex ].ubMagSize; } else { (*pObject)[0]->data.ubShotsLeft = (UINT8) Random( Magazine[ pItem->ubClassIndex ].ubMagSize ); } } else { if(gTempObject.usItem != OWNERSHIP)//dnl ch35 110909 (*pObject)[0]->data.objectStatus = (INT8)(70 + Random( 26 )); } if( pItem->usItemClass & IC_GUN ) { if ( pObject->usItem == ROCKET_LAUNCHER ) { (*pObject)[0]->data.gun.ubGunShotsLeft = 1; } else { (*pObject)[0]->data.gun.ubGunShotsLeft = (UINT8)(Random( Weapon[ pObject->usItem ].ubMagSize )); } } if( !GetItemPoolFromGround( sGridNo, &pItemPool ) ) Assert( 0 ); while( pItemPool ) { if( &(gWorldItems[ pItemPool->iItemIndex ].object) == pObject ) { fFound = TRUE; //ShowSelectedItem(); break; } pItemPool = pItemPool->pNext; } Assert( fFound ); gpItemPool = pItemPool; SpecifyItemToEdit( pObject, sGridNo ); //Get access to the itempool. //search for a current node in list containing same mapindex pIPCurr = pIPHead; pIPPrev = NULL; while( pIPCurr ) { pIPPrev = pIPCurr; if( pIPCurr->sGridNo == sGridNo ) { //found one, so we don't need to add it gpCurrItemPoolNode = pIPCurr; return; } pIPCurr = pIPCurr->next; } //there isn't one, so we will add it now. ShowItemCursor( sGridNo ); if( pIPPrev ) { pIPPrev->next = (IPListNode*)MemAlloc( sizeof( IPListNode ) ); Assert( pIPPrev->next ); pIPPrev = pIPPrev->next; pIPPrev->next = NULL; pIPPrev->sGridNo = sGridNo; gpCurrItemPoolNode = pIPPrev; } else { pIPHead = (IPListNode*)MemAlloc( sizeof( IPListNode ) ); Assert( pIPHead ); pIPHead->next = NULL; pIPHead->sGridNo = sGridNo; gpCurrItemPoolNode = pIPHead; } }