void BuildItemPoolList() { ITEM_POOL *temp; IPListNode *tail = NULL; INT32 i; KillItemPoolList(); for( i = 0; i < WORLD_MAX; i++ ) { if( GetItemPoolFromGround( i, &temp ) ) { if( !pIPHead ) { pIPHead = (IPListNode*)MemAlloc( sizeof( IPListNode ) ); Assert( pIPHead ); tail = pIPHead; } else { tail->next = (IPListNode*)MemAlloc( sizeof( IPListNode ) ); Assert( tail->next ); tail = tail->next; } ShowItemCursor( i ); tail->sGridNo = i; tail->next = NULL; } } gpCurrItemPoolNode = pIPHead; SpecifyItemToEdit( NULL, -1 ); }
void SelectNextItemInPool() { if( gpItemPool ) { if( gpItemPool->pNext ) { gpItemPool = gpItemPool->pNext; } else { GetItemPoolFromGround( gpItemPool->sGridNo, &gpItemPool ); } SpecifyItemToEdit( &gWorldItems[ gpItemPool->iItemIndex ].object, gpItemPool->sGridNo ); MarkWorldDirty(); } }
void ExecuteItemStatsCmd( UINT8 ubAction ) { switch( ubAction ) { case ITEMSTATS_APPLY: if( gpItem && gpItem->usItem == ACTION_ITEM ) { ExtractAndUpdateActionItemsGUI(); } else if( gpItem && gpItem->usItem == SWITCH ) { ExtractAndUpdateTriggersGUI(); } else if( gpItem && gpItem->usItem == OWNERSHIP ) { ExtractAndUpdateOwnershipGUI(); } else switch( gbEditingMode ) { case EDITING_GUNS: ExtractAndUpdateGunGUI(); break; case EDITING_AMMO: ExtractAndUpdateAmmoGUI(); break; case EDITING_ARMOUR: ExtractAndUpdateArmourGUI(); break; case EDITING_EQUIPMENT: ExtractAndUpdateEquipGUI(); break; case EDITING_EXPLOSIVES: ExtractAndUpdateExplosivesGUI(); break; case EDITING_MONEY: ExtractAndUpdateMoneyGUI(); break; case EDITING_KEYS: ExtractAndUpdateKeysGUI(); break; } SetActiveField( 0 ); gfRenderTaskbar = TRUE; break; case ITEMSTATS_CANCEL: SpecifyItemToEdit( gpItem, gsItemGridNo ); SetActiveField( 0 ); break; case ITEMSTATS_DEFAULT: break; case ITEMSTATS_DELETE: DeleteSelectedItem(); break; case ITEMSTATS_SHOW: ShowSelectedItem(); break; case ITEMSTATS_HIDE: HideSelectedItem(); break; } }
void HandleRightClickOnItem( INT32 sGridNo ) { ITEM_POOL *pItemPool; IPListNode *pIPCurr; if( gsItemGridNo == sGridNo ) { //Clicked on the same gridno as the selected item. Automatically select the next //item in the same pool. pItemPool = gpItemPool->pNext; if( !pItemPool ) { //currently selected item was last node, so select the head node even if it is the same. GetItemPoolFromGround( sGridNo, &pItemPool ); } } else if( !GetItemPoolFromGround( sGridNo, &pItemPool ) ) { //possibly relocate selected item to this gridno? return; } gpItemPool = pItemPool; //set up the item pool pointer to point to the same mapindex node pIPCurr = pIPHead; gpCurrItemPoolNode = NULL; while( pIPCurr ) { if( pIPCurr->sGridNo == sGridNo ) { gpCurrItemPoolNode = pIPCurr; break; } pIPCurr = pIPCurr->next; } Assert( gpCurrItemPoolNode ); SpecifyItemToEdit( &gWorldItems[ gpItemPool->iItemIndex ].object, gpItemPool->sGridNo ); }
void SelectNextItemPool() { if( !gpCurrItemPoolNode ) return; //remove the current hilight. if( gpItemPool ) { MarkMapIndexDirty( gpItemPool->sGridNo ); } //go to the next node. If at end of list, choose pIPHead if( gpCurrItemPoolNode->next ) gpCurrItemPoolNode = gpCurrItemPoolNode->next; else gpCurrItemPoolNode = pIPHead; //get the item pool at this node's gridno. GetItemPoolFromGround( gpCurrItemPoolNode->sGridNo, &gpItemPool ); MarkMapIndexDirty( gpItemPool->sGridNo ); SpecifyItemToEdit( &gWorldItems[ gpItemPool->iItemIndex ].object, gpItemPool->sGridNo ); if( gsItemGridNo != -1 ) { CenterScreenAtMapIndex( gsItemGridNo ); } }
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; } }
void SelectNextPressureAction() { IPListNode *curr; OBJECTTYPE *pObject; if( gpItemPool ) { curr = pIPHead; while( curr ) { //skip quickly to the same gridno as the item pool if( curr->sGridNo == gWorldItems[ gpItemPool->iItemIndex ].sGridNo ) { gpItemPool = gpItemPool->pNext; while( gpItemPool ) { pObject = &gWorldItems[ gpItemPool->iItemIndex ].object; if( pObject->usItem == ACTION_ITEM && (*pObject)[0]->data.misc.bDetonatorType == BOMB_PRESSURE ) { SpecifyItemToEdit( pObject, gWorldItems[ gpItemPool->iItemIndex ].sGridNo ); CenterScreenAtMapIndex( gsItemGridNo ); return; //success! (another item in same itempool) } gpItemPool = gpItemPool->pNext; } curr = curr->next; break; } curr = curr->next; } while( curr ) { //search to the end of the list GetItemPoolFromGround( curr->sGridNo, &gpItemPool ); while( gpItemPool ) { pObject = &gWorldItems[ gpItemPool->iItemIndex ].object; if( pObject->usItem == ACTION_ITEM && (*pObject)[0]->data.misc.bDetonatorType == BOMB_PRESSURE ) { SpecifyItemToEdit( pObject, gWorldItems[ gpItemPool->iItemIndex ].sGridNo ); CenterScreenAtMapIndex( gsItemGridNo ); return; //success! (found another item before reaching the end of the list) } gpItemPool = gpItemPool->pNext; } curr = curr->next; } } curr = pIPHead; while( curr ) { //search to the end of the list GetItemPoolFromGround( curr->sGridNo, &gpItemPool ); while( gpItemPool ) { pObject = &gWorldItems[ gpItemPool->iItemIndex ].object; if( pObject->usItem == ACTION_ITEM && (*pObject)[0]->data.misc.bDetonatorType == BOMB_PRESSURE ) { SpecifyItemToEdit( pObject, gWorldItems[ gpItemPool->iItemIndex ].sGridNo ); CenterScreenAtMapIndex( gsItemGridNo ); return; //success! (found first item in the list) } gpItemPool = gpItemPool->pNext; } curr = curr->next; } }
void SelectNextTriggerWithFrequency( UINT16 usItem, INT8 bFrequency ) { IPListNode *curr; OBJECTTYPE *pObject; if( gpItemPool ) { curr = pIPHead; while( curr ) { //skip quickly to the same gridno as the item pool if( curr->sGridNo == gWorldItems[ gpItemPool->iItemIndex ].sGridNo ) { gpItemPool = gpItemPool->pNext; while( gpItemPool ) { pObject = &gWorldItems[ gpItemPool->iItemIndex ].object; if( pObject->usItem == usItem && (*pObject)[0]->data.misc.bFrequency == bFrequency ) { SpecifyItemToEdit( pObject, gWorldItems[ gpItemPool->iItemIndex ].sGridNo ); CenterScreenAtMapIndex( gsItemGridNo ); return; //success! (another item in same itempool) } gpItemPool = gpItemPool->pNext; } curr = curr->next; break; } curr = curr->next; } while( curr ) { //search to the end of the list GetItemPoolFromGround( curr->sGridNo, &gpItemPool ); while( gpItemPool ) { pObject = &gWorldItems[ gpItemPool->iItemIndex ].object; if( pObject->usItem == usItem && (*pObject)[0]->data.misc.bFrequency == bFrequency ) { SpecifyItemToEdit( pObject, gWorldItems[ gpItemPool->iItemIndex ].sGridNo ); CenterScreenAtMapIndex( gsItemGridNo ); return; //success! (found another item before reaching the end of the list) } gpItemPool = gpItemPool->pNext; } curr = curr->next; } } curr = pIPHead; while( curr ) { //search to the end of the list GetItemPoolFromGround( curr->sGridNo, &gpItemPool ); while( gpItemPool ) { pObject = &gWorldItems[ gpItemPool->iItemIndex ].object; if( pObject->usItem == usItem && (*pObject)[0]->data.misc.bFrequency == bFrequency ) { SpecifyItemToEdit( pObject, gWorldItems[ gpItemPool->iItemIndex ].sGridNo ); CenterScreenAtMapIndex( gsItemGridNo ); return; //success! (found first item in the list) } gpItemPool = gpItemPool->pNext; } curr = curr->next; } }
void SelectNextKeyOfType( UINT8 ubKeyID ) { IPListNode *curr; OBJECTTYPE *pObject; if( gpItemPool ) { curr = pIPHead; while( curr ) { //skip quickly to the same gridno as the item pool if( curr->sGridNo == gWorldItems[ gpItemPool->iItemIndex ].sGridNo ) { gpItemPool = gpItemPool->pNext; while( gpItemPool ) { pObject = &gWorldItems[ gpItemPool->iItemIndex ].object; if( Item[ pObject->usItem ].usItemClass == IC_KEY && (*pObject)[0]->data.key.ubKeyID == ubKeyID ) { SpecifyItemToEdit( pObject, gWorldItems[ gpItemPool->iItemIndex ].sGridNo ); CenterScreenAtMapIndex( gsItemGridNo ); return; //success! (another item in same itempool) } gpItemPool = gpItemPool->pNext; } curr = curr->next; break; } curr = curr->next; } while( curr ) { //search to the end of the list GetItemPoolFromGround( curr->sGridNo, &gpItemPool ); while( gpItemPool ) { pObject = &gWorldItems[ gpItemPool->iItemIndex ].object; if( Item[ pObject->usItem ].usItemClass == IC_KEY && (*pObject)[0]->data.key.ubKeyID == ubKeyID ) { SpecifyItemToEdit( pObject, gWorldItems[ gpItemPool->iItemIndex ].sGridNo ); CenterScreenAtMapIndex( gsItemGridNo ); return; //success! (found another item before reaching the end of the list) } gpItemPool = gpItemPool->pNext; } curr = curr->next; } } curr = pIPHead; while( curr ) { //search to the end of the list GetItemPoolFromGround( curr->sGridNo, &gpItemPool ); while( gpItemPool ) { pObject = &gWorldItems[ gpItemPool->iItemIndex ].object; if( Item[ pObject->usItem ].usItemClass == IC_KEY && (*pObject)[0]->data.key.ubKeyID == ubKeyID ) { SpecifyItemToEdit( pObject, gWorldItems[ gpItemPool->iItemIndex ].sGridNo ); CenterScreenAtMapIndex( gsItemGridNo ); return; //success! (found first item in the list) } gpItemPool = gpItemPool->pNext; } curr = curr->next; } }
void DeleteSelectedItem() { SpecifyItemToEdit( NULL, -1 ); //First, check to see if there even is a currently selected item. if( iCurrentTaskbar == TASK_MERCS ) { DeleteSelectedMercsItem(); return; } if( gpItemPool ) { //Okay, we have a selected item... INT32 sGridNo; //save the mapindex if( gpItemPool->pNext ) { SpecifyItemToEdit( &gWorldItems[ gpItemPool->pNext->iItemIndex ].object, gpItemPool->sGridNo ); } sGridNo = gpItemPool->sGridNo; //remove the item if( gWorldItems[ gpItemPool->iItemIndex ].object.usItem == ACTION_ITEM ) { if( gWorldItems[ gpItemPool->iItemIndex ].object[0]->data.misc.bActionValue == ACTION_ITEM_SMALL_PIT ) Remove3X3Pit( gWorldItems[ gpItemPool->iItemIndex ].sGridNo ); else if( gWorldItems[ gpItemPool->iItemIndex ].object[0]->data.misc.bActionValue == ACTION_ITEM_LARGE_PIT ) Remove5X5Pit( gWorldItems[ gpItemPool->iItemIndex ].sGridNo ); } if( gpEditingItemPool == gpItemPool ) gpEditingItemPool = NULL; RemoveItemFromPool( sGridNo, gpItemPool->iItemIndex, 0 ); gpItemPool = NULL; //determine if there are still any items at this location if( !GetItemPoolFromGround( sGridNo, &gpItemPool ) ) { //no items left, so remove the node from the list. IPListNode *pIPPrev, *pIPCurr; pIPCurr = pIPHead; pIPPrev = NULL; while( pIPCurr ) { if( pIPCurr->sGridNo == sGridNo ) { if( pIPPrev ) //middle of list pIPPrev->next = pIPCurr->next; else //head of list pIPHead = pIPHead->next; //move the curr item pool to the next one. if( pIPCurr->next ) gpCurrItemPoolNode = pIPCurr->next; else gpCurrItemPoolNode = pIPHead; if( gpCurrItemPoolNode ) { GetItemPoolFromGround( gpCurrItemPoolNode->sGridNo, &gpItemPool ); Assert( gpItemPool ); } //remove node HideItemCursor( sGridNo ); MemFree( pIPCurr ); pIPCurr = NULL; return; } pIPPrev = pIPCurr; pIPCurr = pIPCurr->next; } } } }
//Because loading and saving the map takes a few seconds, we want to post a message //on the screen and then update it which requires passing the screen back to the main loop. //When we come back for the next frame, we then actually save or load the map. So this //process takes two full screen cycles. UINT32 ProcessFileIO() { INT16 usStartX, usStartY; CHAR8 ubNewFilename[50]; BOOLEAN fAltMap;//dnl ch31 150909 switch( gbCurrentFileIOStatus ) { case INITIATE_MAP_SAVE: //draw save message StartFrameBufferRender( ); SaveFontSettings(); SetFont( HUGEFONT ); SetFontForeground( FONT_LTKHAKI ); SetFontShadow( FONT_DKKHAKI ); SetFontBackground( 0 ); swprintf( zOrigName, L"Saving map: %s", gzFilename ); usStartX = iScreenWidthOffset + 320 - StringPixLength( zOrigName, LARGEFONT1 ) / 2; usStartY = iScreenHeightOffset + 180 - GetFontHeight( LARGEFONT1 ) / 2; mprintf( usStartX, usStartY, zOrigName ); InvalidateScreen( ); EndFrameBufferRender( ); gbCurrentFileIOStatus = SAVING_MAP; return LOADSAVE_SCREEN; case SAVING_MAP: //save map sprintf( ubNewFilename, "%S", gzFilename ); RaiseWorldLand(); if( gfShowPits ) RemoveAllPits(); OptimizeSchedules(); ShowHighGround(4);//dnl ch41 210909 //dnl ch33 091009 BOOLEAN fRet; if(gfVanillaMode && iNewMapWorldRows == OLD_WORLD_ROWS && iNewMapWorldCols == OLD_WORLD_COLS) fRet = SaveWorld(ubNewFilename, VANILLA_MAJOR_MAP_VERSION, VANILLA_MINOR_MAP_VERSION); else fRet = SaveWorld(ubNewFilename); if(!fRet) { //dnl ch37 150909 gfSaveError = TRUE; if(gfErrorCatch) { InitErrorCatchDialog(); return(EDIT_SCREEN); } gbCurrentFileIOStatus = IOSTATUS_NONE; CreateMessageBox((STR16)(_BS(L" Error saving ") << (const char*)ubNewFilename << L" file. Try another filename? " << _BS::wget).c_str() ); return(guiCurrentScreen); } if( gfShowPits ) AddAllPits(); GetSectorFromFileName(gzFilename, gWorldSectorX, gWorldSectorY, gbWorldSectorZ, fAltMap);//dnl ch31 140909 if( gfGlobalSummaryExists ) UpdateSectorSummary( gzFilename, gfUpdateSummaryInfo ); else//dnl ch30 150909 ReEvaluateWorld(ubNewFilename); iCurrentAction = ACTION_NULL; gbCurrentFileIOStatus = IOSTATUS_NONE; gfRenderWorld = TRUE; gfRenderTaskbar = TRUE; fEnteringLoadSaveScreen = TRUE; RestoreFontSettings(); if( gfErrorCatch ) { InitErrorCatchDialog(); return EDIT_SCREEN; } fNewMapSaved = TRUE; return EDIT_SCREEN; case INITIATE_MAP_LOAD: //draw load message SaveFontSettings(); gbCurrentFileIOStatus = LOADING_MAP; if( gfEditMode && iCurrentTaskbar == TASK_MERCS ) IndicateSelectedMerc( SELECT_NO_MERC ); SpecifyItemToEdit( NULL, -1 ); return LOADSAVE_SCREEN; case LOADING_MAP: //load map DisableUndo(); sprintf( ubNewFilename, "%S", gzFilename ); RemoveMercsInSector( ); // Want to override crash, so user can do something else. if(!ReEvaluateWorld(ubNewFilename) || !LoadWorld(ubNewFilename))//dnl ch36 140909 { EnableUndo(); gbCurrentFileIOStatus = IOSTATUS_NONE; gfGlobalError = FALSE; gfLoadError = TRUE; CreateMessageBox((STR16)(_BS(L" Error loading ") << (const char*)ubNewFilename << L" file. Try another filename? " << _BS::wget).c_str()); return(guiCurrentScreen); } //ADB these are NOT set yet! but they need to be, duh CompileWorldMovementCosts(); GetSectorFromFileName(gzFilename, gWorldSectorX, gWorldSectorY, gbWorldSectorZ, fAltMap);//dnl ch31 140909 RestoreFontSettings(); //Load successful, update necessary information. //ATE: Any current mercs are transfered here... //UpdateMercsInSector( gWorldSectorX, gWorldSectorY, gbWorldSectorZ ); AddSoldierInitListTeamToWorld( ENEMY_TEAM, 255 ); AddSoldierInitListTeamToWorld( CREATURE_TEAM, 255 ); AddSoldierInitListTeamToWorld( MILITIA_TEAM, 255 ); AddSoldierInitListTeamToWorld( CIV_TEAM, 255 ); iCurrentAction = ACTION_NULL; gbCurrentFileIOStatus = IOSTATUS_NONE; if( !gfCaves && !gfBasement ) { gusLightLevel = 12; if( ubAmbientLightLevel != 4 ) { ubAmbientLightLevel = 4; LightSetBaseLevel( ubAmbientLightLevel ); } } else gusLightLevel = (UINT16)(EDITOR_LIGHT_MAX - ubAmbientLightLevel ); gEditorLightColor = gpLightColors[ 0 ]; gfRenderWorld = TRUE; gfRenderTaskbar = TRUE; fEnteringLoadSaveScreen = TRUE; InitJA2SelectionWindow(); ShowEntryPoints(); EnableUndo(); RemoveAllFromUndoList(); SetEditorSmoothingMode( gMapInformation.ubEditorSmoothingType ); if( gMapInformation.ubEditorSmoothingType == SMOOTHING_CAVES ) AnalyseCaveMapForStructureInfo(); AddLockedDoorCursors(); gubCurrRoomNumber = gubMaxRoomNumber; UpdateRoofsView(); UpdateWallsView(); ShowLightPositionHandles(); SetMercTeamVisibility( ENEMY_TEAM, gfShowEnemies ); SetMercTeamVisibility( CREATURE_TEAM, gfShowCreatures ); SetMercTeamVisibility( MILITIA_TEAM, gfShowRebels ); SetMercTeamVisibility( CIV_TEAM, gfShowCivilians ); BuildItemPoolList(); gpItemPool = NULL;//dnl ch26 210909 fShowHighGround = FALSE;//dnl ch2 210909 fRaiseWorld = FALSE;//dnl ch3 210909 ShowHighGround(4);//dnl ch41 210909 SetRenderCenter(WORLD_COLS/2, WORLD_ROWS/2);//dnl ch43 280909 if( gfShowPits ) AddAllPits(); if( iCurrentTaskbar == TASK_MAPINFO ) { //We have to temporarily remove the current textinput mode, //update the disabled text field values, then restore the current //text input fields. SaveAndRemoveCurrentTextInputMode(); UpdateMapInfoFields(); RestoreSavedTextInputMode(); } return EDIT_SCREEN; } gbCurrentFileIOStatus = IOSTATUS_NONE; return LOADSAVE_SCREEN; }
//Because loading and saving the map takes a few seconds, we want to post a message //on the screen and then update it which requires passing the screen back to the main loop. //When we come back for the next frame, we then actually save or load the map. So this //process takes two full screen cycles. UINT32 ProcessFileIO() { INT16 usStartX, usStartY; UINT8 ubNewFilename[50]; switch( gbCurrentFileIOStatus ) { case INITIATE_MAP_SAVE: //draw save message StartFrameBufferRender( ); SaveFontSettings(); SetFont( HUGEFONT ); SetFontForeground( FONT_LTKHAKI ); SetFontShadow( FONT_DKKHAKI ); SetFontBackground( 0 ); swprintf( zOrigName, L"Saving map: %s", gzFilename ); usStartX = 320 - StringPixLength( zOrigName, LARGEFONT1 ) / 2; usStartY = 180 - GetFontHeight( LARGEFONT1 ) / 2; mprintf( usStartX, usStartY, zOrigName ); InvalidateScreen( ); EndFrameBufferRender( ); gbCurrentFileIOStatus = SAVING_MAP; return LOADSAVE_SCREEN; case SAVING_MAP: //save map sprintf( ubNewFilename, "%S", gzFilename ); RaiseWorldLand(); if( gfShowPits ) RemoveAllPits(); OptimizeSchedules(); if ( !SaveWorld( ubNewFilename ) ) { if( gfErrorCatch ) { InitErrorCatchDialog(); return EDIT_SCREEN; } return ERROR_SCREEN; } if( gfShowPits ) AddAllPits(); SetGlobalSectorValues( gzFilename ); if( gfGlobalSummaryExists ) UpdateSectorSummary( gzFilename, gfUpdateSummaryInfo ); iCurrentAction = ACTION_NULL; gbCurrentFileIOStatus = IOSTATUS_NONE; gfRenderWorld = TRUE; gfRenderTaskbar = TRUE; fEnteringLoadSaveScreen = TRUE; RestoreFontSettings(); if( gfErrorCatch ) { InitErrorCatchDialog(); return EDIT_SCREEN; } if( gMapInformation.ubMapVersion != gubMinorMapVersion ) ScreenMsg( FONT_MCOLOR_RED, MSG_ERROR, L"Map data has just been corrupted!!! What did you just do? KM : 0" ); return EDIT_SCREEN; case INITIATE_MAP_LOAD: //draw load message SaveFontSettings(); gbCurrentFileIOStatus = LOADING_MAP; if( gfEditMode && iCurrentTaskbar == TASK_MERCS ) IndicateSelectedMerc( SELECT_NO_MERC ); SpecifyItemToEdit( NULL, -1 ); return LOADSAVE_SCREEN; case LOADING_MAP: //load map DisableUndo(); sprintf( ubNewFilename, "%S", gzFilename ); RemoveMercsInSector( ); if( !LoadWorld( ubNewFilename ) ) { //Want to override crash, so user can do something else. EnableUndo(); SetPendingNewScreen( LOADSAVE_SCREEN ); gbCurrentFileIOStatus = IOSTATUS_NONE; gfGlobalError = FALSE; gfLoadError = TRUE; //RemoveButton( iTempButton ); CreateMessageBox( L" Error loading file. Try another filename?" ); return LOADSAVE_SCREEN; } SetGlobalSectorValues( gzFilename ); RestoreFontSettings(); //Load successful, update necessary information. //ATE: Any current mercs are transfered here... //UpdateMercsInSector( gWorldSectorX, gWorldSectorY, gbWorldSectorZ ); AddSoldierInitListTeamToWorld( ENEMY_TEAM, 255 ); AddSoldierInitListTeamToWorld( CREATURE_TEAM, 255 ); AddSoldierInitListTeamToWorld( MILITIA_TEAM, 255 ); AddSoldierInitListTeamToWorld( CIV_TEAM, 255 ); iCurrentAction = ACTION_NULL; gbCurrentFileIOStatus = IOSTATUS_NONE; if( !gfCaves && !gfBasement ) { gusLightLevel = 12; if( ubAmbientLightLevel != 4 ) { ubAmbientLightLevel = 4; LightSetBaseLevel( ubAmbientLightLevel ); } } else gusLightLevel = (UINT16)(EDITOR_LIGHT_MAX - ubAmbientLightLevel ); gEditorLightColor = gpLightColors[ 0 ]; gfRenderWorld = TRUE; gfRenderTaskbar = TRUE; fEnteringLoadSaveScreen = TRUE; InitJA2SelectionWindow(); ShowEntryPoints(); EnableUndo(); RemoveAllFromUndoList(); SetEditorSmoothingMode( gMapInformation.ubEditorSmoothingType ); if( gMapInformation.ubEditorSmoothingType == SMOOTHING_CAVES ) AnalyseCaveMapForStructureInfo(); AddLockedDoorCursors(); gubCurrRoomNumber = gubMaxRoomNumber; UpdateRoofsView(); UpdateWallsView(); ShowLightPositionHandles(); SetMercTeamVisibility( ENEMY_TEAM, gfShowEnemies ); SetMercTeamVisibility( CREATURE_TEAM, gfShowCreatures ); SetMercTeamVisibility( MILITIA_TEAM, gfShowRebels ); SetMercTeamVisibility( CIV_TEAM, gfShowCivilians ); BuildItemPoolList(); if( gfShowPits ) AddAllPits(); if( iCurrentTaskbar == TASK_MAPINFO ) { //We have to temporarily remove the current textinput mode, //update the disabled text field values, then restore the current //text input fields. SaveAndRemoveCurrentTextInputMode(); UpdateMapInfoFields(); RestoreSavedTextInputMode(); } return EDIT_SCREEN; } gbCurrentFileIOStatus = IOSTATUS_NONE; return LOADSAVE_SCREEN; }
void HideItemStatsPanel() { HideEditorButtons( FIRST_ITEMSTATS_BUTTON, LAST_ITEMSTATS_BUTTON ); SpecifyItemToEdit( NULL, -1 ); gfShowItemStatsPanel = FALSE; }