#include "common.h" sBody* ShowObjet; int ShowBody; int ShowBeta; s16 currentInventory = 0; s16 numObjInInventoryTable[NUM_MAX_INVENTORY]; s16 inHandTable[NUM_MAX_INVENTORY]; s16 inventoryTable[NUM_MAX_INVENTORY][INVENTORY_SIZE]; int statusLeft; int statusTop; int statusRight; int statusBottom; int numInventoryActions; s16 inventoryActionTable[5]; int DrawListObjets(int startIdx, int selectIdx, int selectColor) { int y = WindowY1+1; int var_6 = startIdx; int var_8; int i; int currentObj; tWorldObject* objPtr; if(g_gameId <= JACK) { AffBigCadre(160,50,320,100); y = WindowY1+1; } else { SetClip(27,25,292,98); AffRect(27,25,292,98,0); WindowX1 = 30; WindowY1 = 27; WindowX2 = 288; WindowY2 = 95; y = 28; } for(i=0;i<5;i++) { if(startIdx>=numObjInInventoryTable[currentInventory]) break; currentObj = inventoryTable[currentInventory][startIdx]; objPtr = &ListWorldObjets[currentObj]; if(startIdx == selectIdx) { if(g_gameId <= JACK) { if(selectColor == 15) { AffRect(0xA,y,0x135,y+0x10,0x64); } SelectedMessage(160,y,objPtr->foundName,selectColor,4); } else { SimpleMessage(160,y,objPtr->foundName,selectColor); } var_8 = currentObj; } else { SimpleMessage(160,y,objPtr->foundName,4); } y += fontHeight; startIdx++; } if(var_6>0) { AffSpfI(298,10,10,PtrCadre); } if(var_6+5 < numObjInInventoryTable[currentInventory]) { AffSpfI(298,74,9,PtrCadre); } return(var_8); } void renderInventoryObject(int arg) { SetClip(statusLeft,statusTop,statusRight,statusBottom); AffRect(statusLeft,statusTop,statusRight,statusBottom,0); ShowBeta -= 8; setCameraTarget(0,0,0,60,ShowBeta,0,24000); AffObjet(0,0,0,0,0,0,ShowObjet); if(arg!=-1) { u8 buffer[256]; SetFont(PtrFont,4); sprintf((char*)buffer,"%d",vars[arg]); PrintFont(statusLeft+4,statusTop+4,logicalScreen,buffer); } switch(g_gameId) { case AITD2: redrawInventorySpriteAITD2(); break; default: break; } menuWaitVSync(); } void drawInventoryActions(int arg) { int y = 0; if(g_gameId <= JACK) { AffBigCadre(240,150,160,100); y = 150 - ((numInventoryActions<<4)/2); } else { SetClip(162,100,292,174); AffRect(162,100,292,174, 0); WindowX1 = 166; WindowY1 = 104; WindowX2 = 288; WindowY2 = 170; y = 139 - ((numInventoryActions*fontHeight)/2); } for(int i=0;i0) { selectedObjectIdx--; } if(localJoyD&2 && selectedObjectIdx < (numObjInInventoryTable[currentInventory]-1)) { selectedObjectIdx++; } if(firstObjectDisplayedIdx+5 <= selectedObjectIdx) { firstObjectDisplayedIdx++; } if(selectedObjectIdx < firstObjectDisplayedIdx) { firstObjectDisplayedIdx--; } if(localKey || localJoyD || localClick) { if(antiBounce==0) { antiBounce = 1; startChrono(&chrono); } } } } else { if(antiBounce == 1) { if(evalChrono(&chrono)>0x280000) { antiBounce = -1; } } } if(lastSelectedObjectIdx!=selectedObjectIdx) { selectedWorldObjectIdx = DrawListObjets(firstObjectDisplayedIdx,selectedObjectIdx,15); ShowBody = ListWorldObjets[selectedWorldObjectIdx].foundBody; ShowObjet = HQR_Get(HQ_Bodys,ShowBody); var_C = ListWorldObjets[selectedWorldObjectIdx].foundFlag; numInventoryActions = 0; numActionForObject = 0; while(numActionForObject<11) { if(var_C & (1<0) { selectedActions --; } if(localJoyD&2 && selectedActions<(numInventoryActions-1)) { selectedActions++; } if(localKey || localJoyD || localClick) { if(antiBounce==0) { antiBounce = 1; startChrono(&chrono); } } } else { if(antiBounce==1) { if(evalChrono(&chrono)>0x280000) { antiBounce = -1; } } if(lastSelectedObjectIdx != selectedActions) { lastSelectedObjectIdx = selectedActions; drawInventoryActions(lastSelectedObjectIdx); menuWaitVSync(); } } } renderInventoryObject(ListWorldObjets[selectedWorldObjectIdx].floorLife); if(firstTime) { firstTime = 0; if(lightOff) { FadeInPhys(0x40,0); } } osystem_CopyBlockPhys((unsigned char*)logicalScreen,0,0,320,200); //osystem_flip(NULL); } RestoreTimerAnim(); FlagInitView = 1; while(Click || key || JoyD) { process_events(); } localJoyD = 0; localKey = 0; localClick = 0; if(choice == 1) { executeFoundLife(selectedObjectIdx); } //updateShaking(); } void cleanClip() { for (int x = clipLeft; x < clipRight; x++) { for (int y = clipTop; y < clipBottom; y++) { logicalScreen[y * 320 + x] = 0; uiLayer[y * 320 + x] = 0; } } } void DrawFoundWindow(int menuState, int objectName, int zoomFactor) { cleanClip(); setCameraTarget(0, 0, 0, 60, ShowBeta, 0, zoomFactor); AffObjet(0, 0, 0, 0, 0, 0, HQR_Get(HQ_Bodys, ShowBody)); SimpleMessage(160, WindowY1, 20, 1); SimpleMessage(160, WindowY1 + 16, objectName, 1); SimpleMessage(160, WindowY1 + 16, objectName, 1); switch (menuState) { case 0: { SelectedMessage(130, WindowY2 - 16, 21, 1, 4); SimpleMessage(190, WindowY2 - 16, 22, 4); break; } case 1: { SimpleMessage(130, WindowY2 - 16, 21, 4); SelectedMessage(190, WindowY2 - 16, 22, 1, 4); break; } case 2: { SelectedMessage(160, WindowY2 - 16, 10, 1, 4); break; } } } void FoundObjet(int objIdx, int param) { tWorldObject* objPtr; if (objIdx < 0) return; if (param == 2) { printf("foundObject with param == 2\n"); } objPtr = &ListWorldObjets[objIdx]; if (param != 0 && (objPtr->foundFlag & 0xC000)) { return; } if (objPtr->trackNumber) { if (timer - objPtr->trackNumber < 300) // prevent from reopening the window every frame return; } objPtr->trackNumber = 0; SaveTimerAnim(); // setupShaking(1000); // probably to remove the shaking when in foundObject screen int weight = 0; for (int i = 0; i < numObjInInventoryTable[currentInventory]; i++) { weight += ListWorldObjets[inventoryTable[currentInventory][i]].positionInTrack; } int choix = 1; if (objPtr->positionInTrack + weight > CVars[getCVarsIdx(MAX_WEIGHT_LOADABLE)] || numObjInInventoryTable[currentInventory] + 1 == 30) { choix = 3; } ShowBody = objPtr->foundBody; ShowObjet = HQR_Get(HQ_Bodys, ShowBody); SetProjection(160, 100, 128, 300, 298); int zoom = 15000; int stepzoom = -200; ShowBeta = 0; memset(frontBuffer, 0, 320 * 200); FastCopyScreen(frontBuffer, logicalScreen); AffBigCadre(160, 100, 240, 120); DrawFoundWindow(choix, objPtr->foundName, zoom); osystem_flip(NULL); AntiRebond = 1; int exitflag = 0; while (!exitflag) { osystem_CopyBlockPhys((unsigned char*)logicalScreen, 0, 0, 320, 200); process_events(); osystem_drawBackground(); localKey = key; localJoyD = JoyD; localClick = Click; if (!AntiRebond) { if (localKey == 1) { if (choix != 2) { choix = 0; } exitflag = 1; } if (choix != 2) { if (localJoyD & 4) { choix = 0; } if (localJoyD & 8) { choix = 1; } } if (localKey == 28 || localClick != 0) { while (key) { process_events(); } exitflag = 1; } } else { if (!localKey && !localJoyD && !localClick) AntiRebond = 0; } ShowBeta -= 8; zoom += stepzoom; // zoom / dezoom if (zoom > 8000) // zoom management stepzoom = -stepzoom; if (zoom < 25000) stepzoom = -stepzoom; DrawFoundWindow(choix, objPtr->foundName, zoom); // menuWaitVSync(); } RestoreTimerAnim(); if (choix == 1) { take(objIdx); } else { objPtr->trackNumber = timer; } while (key && Click) { process_events(); } localJoyD = 0; localKey = 0; localClick = 0; // if(mainLoopVar1 != 0) { //setupShaking(-600); } FlagInitView = 1; }