# HG changeset patch # User Ritor1 # Date 1360671394 -21600 # Node ID 8e0e2991f9d1be88229c87964bb22dac2580e09b # Parent 2cb13d295f4b357cda3bde9604d00b000ff46319# Parent 86a2637ba12549f381cefe6686614ef29814772a Слияние diff -r 2cb13d295f4b -r 8e0e2991f9d1 Actor.cpp --- a/Actor.cpp Tue Feb 12 18:16:18 2013 +0600 +++ b/Actor.cpp Tue Feb 12 18:16:34 2013 +0600 @@ -2143,7 +2143,7 @@ } else { - if ( (edx0 & 7) == 3 ) + if ( (edx0 & 7) == OBJECT_Actor) { v8 = edx0 >> 3; v6 = (AIDirection *)pActors[v8].vPosition.x; @@ -2152,7 +2152,7 @@ } else { - if ( (edx0 & 7) == 4 ) + if ( (edx0 & 7) == OBJECT_Player) { v6 = (AIDirection *)pParty->vPosition.x; v7 = (AIDirection *)pParty->vPosition.y; @@ -2176,7 +2176,7 @@ v13 = 0; if ( !arg0 ) { - v14 = Actor::GetDirectionInfo(8 * v24 | 3, a2, &a3, 0); + v14 = Actor::GetDirectionInfo(8 * v24 | OBJECT_Actor, a2, &a3, 0); v12 = &v20; memcpy(&v20, v14, sizeof(v20)); v13 = 0; @@ -2542,7 +2542,7 @@ v22 = uActorID; v3 = &pActors[uActorID]; a2 = edx0; - if ( (edx0 & 7) == 3 ) + if ( (edx0 & 7) == OBJECT_Actor) { v6 = edx0 >> 3; v4 = (AIDirection *)pActors[v6].vPosition.x; @@ -2551,7 +2551,7 @@ } else { - if ( (edx0 & 7) == 4 ) + if ( (edx0 & 7) == OBJECT_Player) { v4 = (AIDirection *)pParty->vPosition.x; v5 = (AIDirection *)pParty->vPosition.y; @@ -2573,7 +2573,7 @@ v10 = 0; if ( !pDir ) { - v11 = Actor::GetDirectionInfo(8 * v22 | 3, a2, &a3, 0); + v11 = Actor::GetDirectionInfo(8 * v22 | OBJECT_Actor, a2, &a3, 0); v9 = &v18; memcpy(&v18, v11, sizeof(v18)); v10 = 0; @@ -2654,7 +2654,7 @@ v22 = uActorID; v3 = &pActors[uActorID]; a2 = edx0; - if ( (edx0 & 7) == 3 ) + if ( (edx0 & 7) == OBJECT_Actor) { v6 = edx0 >> 3; v4 = (AIDirection *)pActors[v6].vPosition.x; @@ -2663,7 +2663,7 @@ } else { - if ( (edx0 & 7) == 4 ) + if ( (edx0 & 7) == OBJECT_Player) { v4 = (AIDirection *)pParty->vPosition.x; v5 = (AIDirection *)pParty->vPosition.y; @@ -2685,7 +2685,7 @@ v10 = 0; if ( !pDir ) { - v11 = Actor::GetDirectionInfo(8 * v22 | 3, a2, &a3, 0); + v11 = Actor::GetDirectionInfo(8 * v22 | OBJECT_Actor, a2, &a3, 0); v9 = &v18; memcpy(&v18, v11, sizeof(v18)); v10 = 0; @@ -2765,7 +2765,7 @@ v21 = uActorID; v3 = &pActors[uActorID]; a2 = edx0; - if ( (edx0 & 7) == 3 ) + if ( (edx0 & 7) == OBJECT_Actor) { v6 = edx0 >> 3; v4 = (AIDirection *)pActors[v6].vPosition.x; @@ -2774,7 +2774,7 @@ } else { - if ( (edx0 & 7) == 4 ) + if ( (edx0 & 7) == OBJECT_Player) { v4 = (AIDirection *)pParty->vPosition.x; v5 = (AIDirection *)pParty->vPosition.y; @@ -2796,7 +2796,7 @@ v10 = 0; if ( !pDir ) { - v11 = Actor::GetDirectionInfo(8 * v21 | 3, a2, &a3, 0); + v11 = Actor::GetDirectionInfo(8 * v21 | OBJECT_Actor, a2, &a3, 0); v9 = &v17; memcpy(&v17, v11, sizeof(v17)); v10 = 0; @@ -2861,7 +2861,7 @@ v21 = uActorID; v3 = &pActors[uActorID]; a2 = edx0; - if ( (edx0 & 7) == 3 ) + if ( (edx0 & 7) == OBJECT_Actor) { v6 = edx0 >> 3; v4 = pActors[v6].vPosition.x; @@ -2870,7 +2870,7 @@ } else { - if ( (edx0 & 7) == 4 ) + if ( (edx0 & 7) == OBJECT_Player) { v4 = pParty->vPosition.x; v5 = pParty->vPosition.y; @@ -2900,7 +2900,7 @@ v11 = 0; if ( !pDir ) { - v12 = Actor::GetDirectionInfo(8 * v21 | 3, a2, &a3, 0); + v12 = Actor::GetDirectionInfo(8 * v21 | OBJECT_Actor, a2, &a3, 0); v10 = &v18; memcpy(&v18, v12, sizeof(v18)); v11 = 0; @@ -3483,7 +3483,7 @@ memcpy(&a3, Actor::GetDirectionInfo(v7, 4u, &v10, 0), sizeof(a3)); memcpy(&v13, &a3, sizeof(v13)); if ( MonsterStats::BelongsToSupertype(v5->pMonsterInfo.uID, MONSTER_SUPERTYPE_TREANT) - || (a2 & 7) == 3 && (double)(signed int)v13.uDistance < 307.2 ) + || (a2 & 7) == OBJECT_Actor && (double)(signed int)v13.uDistance < 307.2 ) { if ( !uActionLength ) uActionLength = 256; diff -r 2cb13d295f4b -r 8e0e2991f9d1 Actor.h --- a/Actor.h Tue Feb 12 18:16:18 2013 +0600 +++ b/Actor.h Tue Feb 12 18:16:34 2013 +0600 @@ -40,8 +40,8 @@ /* 361 */ enum ACTOR_BUFF_INDEX { - ACTOR_BUFF_STONED = 0x5, - ACTOR_BUFF_PARALYZED = 0x6, + ACTOR_BUFF_STONED = 5, + ACTOR_BUFF_PARALYZED = 6, }; @@ -52,7 +52,7 @@ enum ObjectType { OBJECT_unk0 = 0x0, - OBJECT_unk1 = 0x1, + OBJECT_BLVDoor = 0x1, OBJECT_Item = 0x2, OBJECT_Actor = 0x3, OBJECT_Player = 0x4, @@ -88,16 +88,16 @@ Fleeing = 0x7, Stunned = 0x8, Fidgeting = 0x9, - Interacting = 0xA, - Removed = 0xB, + Interacting = 10, + Removed = 11, AttackingRanged2 = 0xC, AttackingRanged3 = 0xD, Stoned = 0xE, Paralyzed = 0xF, - Resurrected = 0x10, - Summoned = 0x11, - AttackingRanged4 = 0x12, - Disabled = 0x13, + Resurrected = 16, + Summoned = 17, + AttackingRanged4 = 18, + Disabled = 19, }; /* 265 */ diff -r 2cb13d295f4b -r 8e0e2991f9d1 AudioPlayer.cpp --- a/AudioPlayer.cpp Tue Feb 12 18:16:18 2013 +0600 +++ b/AudioPlayer.cpp Tue Feb 12 18:16:34 2013 +0600 @@ -90,7 +90,7 @@ do { sprintf(pSoundName, "%s", pSounds[v2].pSoundName); - // pSoundList->pSounds[v2].pSoundData[0] = ::LoadSound(pSoundName, (SoundData *)0xFFFFFFFF, pSounds[v2].uSoundID); Ritor1: it's error - result: no sound + // pSoundList->pSounds[v2].pSoundData[0] = ::LoadSound(pSoundName, (SoundData *)0xFFFFFFFF, pSounds[v2].uSoundID); //Ritor1: it's error - result: no sound pSoundDesc = &pSoundList->pSounds[v2]; if ( pSoundList->pSounds[v2].eType != SOUND_DESC_SYSTEM || (sprintf(pSoundName, "%s", pSounds[v2].pSoundName), pSoundList->pSounds[v2].pSoundData[0] = ::LoadSound(pSoundName, (SoundData *)0xFFFFFFFF, pSounds[v2].uSoundID), @@ -1758,8 +1758,7 @@ signed int v2; // eax@1 v2 = stru_5C6E00->uDoublePiMask & (stru_5C6E00->Atan2(a1 - pParty->vPosition.x, a2 - pParty->vPosition.y) - - stru_5C6E00->uIntegerHalfPi - - pParty->sRotationY); + - stru_5C6E00->uIntegerHalfPi - pParty->sRotationY); if ( v2 > (signed int)stru_5C6E00->uIntegerPi ) v2 = 2 * stru_5C6E00->uIntegerPi - v2; return (v2 >> 3) - (v2 >> 10); diff -r 2cb13d295f4b -r 8e0e2991f9d1 GUIWindow.cpp --- a/GUIWindow.cpp Tue Feb 12 18:16:18 2013 +0600 +++ b/GUIWindow.cpp Tue Feb 12 18:16:34 2013 +0600 @@ -474,7 +474,7 @@ pAudioPlayer->StopChannels(-1, -1); InitializeBookFonts(); v1->CreateButton(0x1DBu, 0x1BDu, 0x9Eu, 0x22u, 1, 0, 0x71u, 0, 0, pGlobalTXT_LocalizationStrings[79], 0); - pCurrentScreen = 3; + pCurrentScreen = SCREEN_BOOKS; dword_506524 = 0; dword_506528 = 0; dword_50651C = 0; @@ -978,7 +978,7 @@ LoadSpellbook(pPlayer->pNumSpellBookPage); v3 = 0; a2 = 0; - v7 = (int)(&pPlayer->spellbook.pFireSpellbook + pPlayer->pNumSpellBookPage); + v7 = (int)&pPlayer->spellbook.pChapters[pPlayer->pNumSpellBookPage]; do { if ( *(char *)(v7 + v3) ) @@ -1156,12 +1156,10 @@ goto LABEL_56; } v4 = (char *)array_5913D8[6] - 1; - pRenderer->DrawTextureIndexed( - _4E5E50_transui_x - 4, - _4E5EE0_transui_y - 4, + pRenderer->DrawTextureIndexed(_4E5E50_transui_x - 4, _4E5EE0_transui_y - 4, (Texture *)(uTextureID_50795C != -1 ? &pIcons_LOD->pTextures[uTextureID_50795C] : 0)); pRenderer->DrawTextureIndexed(_4E5E50_transui_x, _4E5EE0_transui_y, pDialogueNPCPortraits[(signed int)v4]); - if ( pCurrentScreen == 14 ) + if ( pCurrentScreen == SCREEN_E ) { CharacterUI_InventoryTab_Draw(uActiveCharacter, 1); goto LABEL_58; @@ -1859,7 +1857,7 @@ break; case WINDOW_A: pMainScreenNum = pCurrentScreen; - pCurrentScreen = 4; + pCurrentScreen = SCREEN_NPC_DIALOGUE; pBtn_ExitCancel = pWindow->CreateButton(0x1D7u, 0x1BDu, 0xA9u, 0x23u, 1, 0, 0x71u, 0, 0, pGlobalTXT_LocalizationStrings[79], //"Exit" (Texture *)(uTextureID_506438 != -1 ? &pIcons_LOD->pTextures[uTextureID_506438] : 0), 0); if ( pWindow->ptr_1C != (void *)1 ) @@ -1957,7 +1955,7 @@ break; case WINDOW_ChangeLocation: pMainScreenNum = pCurrentScreen; - pCurrentScreen = 17; + pCurrentScreen = SCREEN_CHANGE_LOCATION; pBtn_ExitCancel = pWindow->CreateButton(0x236u, 0x1BDu, 0x4Bu, 0x21u, 1, 0, 0x5Bu, 0, 0x4Eu, pGlobalTXT_LocalizationStrings[156],// (Texture *)(uTextureID_BUTTDESC2 != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_BUTTDESC2] : 0), 0); pBtn_YES = pWindow->CreateButton(0x1E6u, 0x1BDu, 0x4Bu, 0x21u, 1, 0, 0x5Au, 0, 0x59u, pWindow->Hint, @@ -1972,7 +1970,7 @@ case WINDOW_GreetingNPC: // pMainScreenNum = pCurrentScreen; pKeyActionMap->EnterText(0, 15, pWindow); - pCurrentScreen = 19; + pCurrentScreen = SCREEN_BRANCHLESS_NPC_DIALOG; break; } return pWindow; @@ -1987,7 +1985,7 @@ } if (eWindowType == WINDOW_HouseInterior) { - pCurrentScreen = 13; + pCurrentScreen = SCREEN_HOUSE; pBtn_ExitCancel = pWindow->CreateButton(0x1D7u, 0x1BDu, 0xA9u, 0x23u, 1, 0, 0x71u, 0, 0, pGlobalTXT_LocalizationStrings[80],// (Texture *)(uTextureID_506438 != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_506438] : 0), 0); v25 = uNumDialogueNPCPortraits; @@ -2032,7 +2030,7 @@ if (eWindowType == WINDOW_1A) { pMainScreenNum = pCurrentScreen; - pCurrentScreen = 18; + pCurrentScreen = SCREEN_INPUT_BLV; pBtn_ExitCancel = pWindow->CreateButton(0x236u, 0x1BDu, 0x4Bu, 0x21u, 1, 0, 0x19Cu, 0, 0x4Eu, pGlobalTXT_LocalizationStrings[34],// (Texture *)(uTextureID_BUTTDESC2 != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_BUTTDESC2] : 0), 0); pBtn_YES = pWindow->CreateButton(0x1E6u, 0x1BDu, 0x4Bu, 0x21u, 1, 0, 0x19Bu, 0, 0x59u, pWindow->Hint, @@ -2067,7 +2065,7 @@ ShowStatusBarString(pGlobalTXT_LocalizationStrings[39], 2);// ++pIcons_LOD->uTexturePacksCount; pWindowList_at_506F50_minus1_indexing_buttons____and_an_int_[0] = 103; - pCurrentScreen = 23; + pCurrentScreen = SCREEN_CASTING; if ( !pIcons_LOD->uNumPrevLoadedFiles ) pIcons_LOD->uNumPrevLoadedFiles = pIcons_LOD->uNumLoadedFiles; } diff -r 2cb13d295f4b -r 8e0e2991f9d1 GUIWindow.h --- a/GUIWindow.h Tue Feb 12 18:16:18 2013 +0600 +++ b/GUIWindow.h Tue Feb 12 18:16:34 2013 +0600 @@ -136,8 +136,17 @@ { UIMSG_00 = 0x0, UIMSG_ChangeGameState = 0x5, + UIMSG_A = 0xA, + UIMSG_C = 0xC, + UIMSG_E = 0xE, + UIMSG_F = 0xF, UIMSG_11 = 0x11, + UIMSG_17 = 0x17, + UIMSG_19 = 0x19, + UIMSG_1B = 0x1B, + UIMSG_1C = 0x1C, UIMSG_PlayArcomage = 0x1D, + UIMSG_33 = 0x33, UIMSG_MainMenu_ShowPartyCreationWnd = 0x36, UIMSG_MainMenu_ShowLoadWindow = 0x37, UIMSG_ShowCredits = 0x38, @@ -150,38 +159,74 @@ UIMSG_PlayerCreationSelectClass = 0x41, UIMSG_PlayerCreationClickOK = 0x42, UIMSG_PlayerCreationClickReset = 0x43, + UIMSG_45 = 0x45, + UIMSG_46 = 0x46, + UIMSG_AutonotesBook = 0x47, UIMSG_PlayerCreationRemoveUpSkill = 0x4A, UIMSG_PlayerCreationRemoveDownSkill = 0x4B, - UIMSG_4B = 0x4B, + UIMSG_4E = 0x4E, + UIMSG_4F = 0x4F, + UIMSG_51 = 0x51, UIMSG_LoadGame = 0x52, UIMSG_SaveGame = 0x53, + UIMSG_54 = 0x54, + UIMSG_55 = 0x55, + UIMSG_56 = 0x56, + UIMSG_57 = 0x57, + UIMSG_58 = 0x58, + UIMSG_5A = 0x5A, + UIMSG_5B = 0x5B, UIMSG_ShowStatus_DateTime = 0x5C, UIMSG_ShowStatus_ManaHP = 0x5D, UIMSG_ShowStatus_Player = 0x5E, + UIMSG_Wait5Minutes = 0x5F, + UIMSG_Wait1Hour = 0x60, + UIMSG_61 = 0x61, UIMSG_ShowStatus_Food = 0x64, UIMSG_ShowStatus_Funds = 0x65, + UIMSG_68 = 0x68, + UIMSG_69 = 0x69, UIMSG_QuickReference = 0x6A, UIMSG_6B = 0x6B, + UIMSG_AlreadyResting = 0x6D, UIMSG_SelectCharacter = 0x6E, UIMSG_ChangeSoundVolume = 0x6F, UIMSG_ChangeMusicVolume = 0x70, UIMSG_Escape = 0x71, + UIMSG_72 = 0x72, + UIMSG_73 = 0x73, + UIMSG_74 = 0x74, + UIMSG_75 = 0x75, UIMSG_PlayerCreationSelectQuality = 0x76, + UIMSG_InventoryLeftClick = 0x78, UIMSG_SkillUp = 0x79, + UIMSG_7A = 0x7A, + UIMSG_7B = 0x7B, UIMSG_StartNewGame = 0x7C, UIMSG_Game_OpenLoadGameDialog = 0x7D, + UIMSG_Game_OpenSaveGameDialog = 0x7E, UIMSG_Game_OpenOptionsDialog = 0x7F, + UIMSG_80 = 0x80, UIMSG_SetGraphicsMode = 0x83, UIMSG_Quit = 0x84, + UIMSG_85 = 0x85, + UIMSG_86 = 0x86, + UIMSG_87 = 0x87, + UIMSG_88 = 0x88, + UIMSG_8C = 0x8C, + UIMSG_8D = 0x8D, + UIMSG_8E = 0x8E, + UIMSG_8F = 0x8F, UIMSG_PlayerCreationVoiceBack = 0x90, UIMSG_PlayerCreationVoiceForward = 0x91, + UIMSG_92 = 0x92, UIMSG_StartNPCDialogue = 0xA1, UIMSG_ArrowUp = 0xA2, UIMSG_DownArrow = 0xA3, UIMSG_LoadSlot = 0xA4, UIMSG_SelectLoadSlot = 0xA5, UIMSG_Cancel = 0xA6, - UIMSG_A7 = 0xA7, + UIMSG_ExitRest = 0xA7, UIMSG_A8 = 0xA8, UIMSG_A9 = 0xA9, UIMSG_AA = 0xAA, @@ -229,19 +274,63 @@ UIMSG_D4 = 0xD4, UIMSG_D5 = 0xD5, UIMSG_D6 = 0xD6, + UIMSG_DD = 0xDD, UIMSG_OpenHistoryBook = 0xE0, UIMSG_ToggleAlwaysRun = 0xE1, UIMSG_ToggleFlipOnExit = 0xE2, + UIMSG_16F = 0x16F, + UIMSG_170 = 0x170, + UIMSG_194 = 0x194, + UIMSG_195 = 0x195, UIMSG_OpenRestUI = 0x199, + UIMSG_19A = 0x19A, + UIMSG_19B = 0x19B, + UIMSG_19C = 0x19C, UIMSG_OpenKeyMappingOptions = 0x19F, + UIMSG_1A0 = 0x1A0, + UIMSG_1A1 = 0x1A1, UIMSG_ResetKeyMapping = 0x1A2, + UIMSG_1A3 = 0x1A3, UIMSG_OpenVideoOptions = 0x1A5, UIMSG_ToggleBloodsplats = 0x1A6, UIMSG_ToggleColoredLights = 0x1A7, UIMSG_ToggleTint = 0x1A8, + UIMSG_1A9 = 0x1A9, }; - +enum CURRENT_SCREEN +{ + SCREEN_GAME = 0x0, + SCREEN_MENU = 0x1, + SCREEN_OPTIONS = 0x2, + SCREEN_BOOKS = 0x3, + SCREEN_NPC_DIALOGUE = 0x4, + SCREEN_REST = 0x5, + SCREEN_CHARACTERS = 0x7, + SCREEN_SPELL_BOOK = 0x8, + SCREEN_CREATORS = 0x9, + SCREEN_CHEST = 0xA, + SCREEN_SAVEGAME = 0xB, + SCREEN_LOADGAME = 0xC, + SCREEN_HOUSE = 0xD, + SCREEN_E = 0xE, + SCREEN_F = 0xF, + SCREEN_VIDEO = 0x10, + SCREEN_CHANGE_LOCATION = 0x11, + SCREEN_INPUT_BLV = 0x12, + SCREEN_BRANCHLESS_NPC_DIALOG = 0x13, + SCREEN_PARTY_CREATION = 0x15, + SCREEN_PRESS_ESCAPE_MESSAGE = 0x16, + SCREEN_CASTING = 0x17, + SCREEN_19 = 0x19, + SCREEN_KEYBOARD_OPTIONS = 0x1A, + SCREEN_1B = 0x1B, + SCREEN_VIDEO_OPTIONS = 0x1C, + SCREEN_63 = 0x63, + SCREEN_64 = 0x64, + SCREEN_67 = 0x67, + SCREEN_QUICK_REFERENCE = 0x68, +}; diff -r 2cb13d295f4b -r 8e0e2991f9d1 Game.cpp --- a/Game.cpp Tue Feb 12 18:16:18 2013 +0600 +++ b/Game.cpp Tue Feb 12 18:16:34 2013 +0600 @@ -50,10 +50,10 @@ //----- (0044103C) -------------------------------------------------------- void Game::Draw() { - float v2; // ST24_4@11 + //float v2; // ST24_4@11 //double v3; // ST28_8@11 int v4; // edi@26 - int v5; // eax@35 + //int v5; // eax@35 uFlags2 &= 0xFFFFFFFDu; if ( pParty->_497FC5_check_party_perception_against_level() ) @@ -96,7 +96,7 @@ { if ( pRenderer->pRenderD3D ) { - v2 = (double)(((signed int)pMiscTimer->uTotalGameTimeElapsed >> 2) & 0x1F) * 0.032258064 * 6.0; + float v2 = (double)(((signed int)pMiscTimer->uTotalGameTimeElapsed >> 2) & 0x1F) * 0.032258064 * 6.0; //v3 = v2 + 6.7553994e15; //pRenderer->field_1036A8_bitmapid = LODWORD(v3); pRenderer->field_1036A8_bitmapid = floorf(v2 + 0.5f); @@ -121,8 +121,8 @@ pRenderer->BeginScene(); if (pRenderer->pRenderD3D) pMouse->DrawCursorToTarget(); - if (pOtherOverlayList->field_3EC) - viewparams->bRedrawGameUI = 1; + if (pOtherOverlayList->bRedraw) + viewparams->bRedrawGameUI = true; v4 = viewparams->bRedrawGameUI; GameUI_DrawStatusBar(); if (!viewparams->bRedrawGameUI) @@ -140,15 +140,17 @@ GameUI_DrawMinimap(488, 16, 625, 133, viewparams->uMinimapZoom, pParty->uFlags & 2); if (v4) { - if ( !sub_4226C2() && pRenderer->pRenderD3D) + if ( !sub_4226C2() && pRenderer->pRenderD3D) // clear game viewport with transparent color pRenderer->FillRectFast(pViewport->uViewportX, pViewport->uViewportY, pViewport->uViewportZ - pViewport->uViewportX, - pViewport->uViewportW - pViewport->uViewportY + 1, pRenderer->uTargetGMask | pRenderer->uTargetBMask);//0x0000FFFF/*pRenderer->uTargetGMask | pRenderer->uTargetBMask*/ - white window + pViewport->uViewportW - pViewport->uViewportY + 1, + pRenderer->uTargetGMask | pRenderer->uTargetBMask); viewparams->field_48 = 0; } } - v5 = pOtherOverlayList->field_3EC; - pOtherOverlayList->field_3EC = 0; - viewparams->bRedrawGameUI = v5; + + viewparams->bRedrawGameUI = pOtherOverlayList->bRedraw; + pOtherOverlayList->bRedraw = 0; + GameUI_DrawPartySpells(); if (v4 || pParty->pHirelings[0]._anim_end_time || pParty->pHirelings[1]._anim_end_time ) DrawHiredNPCs(); @@ -246,7 +248,7 @@ dword_6BE364_game_settings_1 |= 0x80; dword_6BE340 = 2; // uGame_if_0_else_ui_id__11_save__else_load__8_drawSpellInfoPopup__22_final_window__26_keymapOptions__2_options__28_videoOptions = 0; - pCurrentScreen = 0; + pCurrentScreen = SCREEN_GAME; if (pAsyncMouse) pAsyncMouse->Resume(); if (pGame->pKeyboardInstance->bUsingAsynKeyboard && pAsyncKeyboard ) @@ -324,7 +326,7 @@ v16 = 0; viewparams->bRedrawGameUI = true; } - //pAudioPlayer->_4AAFCF();//Ritor1: it's temporarily, game crash + //pAudioPlayer->_4AAFCF();//Ritor1: it's temporarily, game crash. decorations sounds if (uGameState == 1) //goto LABEL_96; { @@ -488,7 +490,7 @@ } break; } - pCurrentScreen = 16;// + pCurrentScreen = SCREEN_VIDEO; sub_491E3A(); } diff -r 2cb13d295f4b -r 8e0e2991f9d1 GameUIs.cpp --- a/GameUIs.cpp Tue Feb 12 18:16:18 2013 +0600 +++ b/GameUIs.cpp Tue Feb 12 18:16:34 2013 +0600 @@ -48,7 +48,7 @@ if ( uDialogueType_ ) { pRenderer->DrawTextureIndexed(8, 8, (Texture *)(uTextureID_loadsave != -1 ? &pIcons_LOD->pTextures[uTextureID_loadsave] : 0)); - if ( pCurrentScreen == 11 )//save or load + if ( pCurrentScreen == SCREEN_SAVEGAME ) { v1 = uTextureID_save_up; v2 = uTextureID_LS_saveU; @@ -124,7 +124,7 @@ //LABEL_24: pLODFile.FreeSubIndexAndIO(); - if ( pCurrentScreen == 11 ) // save/load screen + if ( pCurrentScreen == SCREEN_SAVEGAME ) { v6 = pIcons_LOD->LoadTexture("x_d", TEXTURE_16BIT_PALETTE); v10 = (TEXTURE_TYPE)2; @@ -192,7 +192,7 @@ 8u, 8u, (Texture *)(uTextureID_loadsave != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_loadsave] : 0)); - if ( pCurrentScreen == 11 ) + if ( pCurrentScreen == SCREEN_SAVEGAME ) { v0 = uTextureID_save_up; v1 = uTextureID_LS_saveU; diff -r 2cb13d295f4b -r 8e0e2991f9d1 Indoor.cpp --- a/Indoor.cpp Tue Feb 12 18:16:18 2013 +0600 +++ b/Indoor.cpp Tue Feb 12 18:16:34 2013 +0600 @@ -4221,11 +4221,11 @@ v0->uSectorID = LOWORD(stru_721530.uSectorID); stru_721530.field_70 += stru_721530.field_7C; v37 = v36 >> 3; - if ( (v36 & 7) != 3 ) + if ( (v36 & 7) != OBJECT_Actor) { - if ( (v36 & 7) != 4 ) + if ( (v36 & 7) != OBJECT_Player) { - if ( (v36 & 7) == 5 ) + if ( (v36 & 7) == OBJECT_Decoration) { _this = sub_452A9E(v0->vVelocity.x * v0->vVelocity.x + v0->vVelocity.y * v0->vVelocity.y); v45 = stru_5C6E00->Atan2( @@ -4242,7 +4242,7 @@ v0->vVelocity.y = WORD1(v48); goto LABEL_119; } - if ( (v36 & 7) == 6 ) + if ( (v36 & 7) == OBJECT_BModel) { stru_721530.field_84 = v36 >> 3; v38 = &pIndoor->pFaces[v37]; diff -r 2cb13d295f4b -r 8e0e2991f9d1 Keyboard.cpp --- a/Keyboard.cpp Tue Feb 12 18:16:18 2013 +0600 +++ b/Keyboard.cpp Tue Feb 12 18:16:34 2013 +0600 @@ -953,28 +953,16 @@ //----- (0045B06E) -------------------------------------------------------- bool Keyboard::IsShiftHeld() { - bool result; // eax@2 - char v2; // zf@3 - if (bUsingAsynKeyboard) { if ( pAsyncKeyboard->_45B4EC(0x2Au) ) { -LABEL_6: - LOBYTE(result) = 1; - return result; + return true; } - v2 = pAsyncKeyboard->_45B4EC(0x36u) == 0; + return pAsyncKeyboard->_45B4EC(0x36u) != 0; } else - { - LOWORD(result) = GetAsyncKeyState(VK_SHIFT); - v2 = result == 0; - } - if ( !v2 ) - goto LABEL_6; - LOBYTE(result) = 0; - return result; + return GetAsyncKeyState(VK_SHIFT); } //----- (0045B0A9) -------------------------------------------------------- diff -r 2cb13d295f4b -r 8e0e2991f9d1 LOD.cpp --- a/LOD.cpp Tue Feb 12 18:16:18 2013 +0600 +++ b/LOD.cpp Tue Feb 12 18:16:34 2013 +0600 @@ -569,12 +569,12 @@ v3 = a2; v78 = this; - result = a2->field_10; - v58 = a2->field_10; + result = a2->_screenspace_x_scaler_packedfloat; + v58 = a2->_screenspace_x_scaler_packedfloat; if ( result <= 0 ) return result; - v5 = a2->field_14; - v6 = a2->field_10; + v5 = a2->_screenspace_y_scaler_packedfloat; + v6 = a2->_screenspace_x_scaler_packedfloat; v87 = (signed __int64)0x100000000ui64 / result; v48 = (signed __int64)0x100000000ui64 / result; v62 = (signed __int64)0x100000000ui64 / v5; diff -r 2cb13d295f4b -r 8e0e2991f9d1 Outdoor.cpp --- a/Outdoor.cpp Tue Feb 12 18:16:18 2013 +0600 +++ b/Outdoor.cpp Tue Feb 12 18:16:34 2013 +0600 @@ -126,17 +126,20 @@ pOutdoor->_47EF60(v5, v4, 1); } pGame->uFlags2 &= 0xFFFFFFFEu; - if ( pRenderer->pRenderD3D && pRenderer->bUsingSpecular ) + if (pRenderer->pRenderD3D && pRenderer->bUsingSpecular) pGame->pLightmapBuilder->uFlags |= 1u; else pGame->pLightmapBuilder->uFlags &= 0xFFFFFFFEu; + uNumDecorationsDrawnThisFrame = 0; _unused000 = 0; uNumSpritesDrawnThisFrame = 0; uNumBillboardsToDraw = 0; - DrawActors(); - if ( !pOutdoorCamera->bDoNotRenderDecorations ) - pRenderer->DrawDecorations(); + + PrepareActorsDrawList(); + if (!pOutdoorCamera->bDoNotRenderDecorations) + pRenderer->PrepareDecorationsRenderList_ODM(); + pRenderer->DrawLayingItems_Shooting_Magic_ODM(); pRenderer->TransformBillboardsAndSetPalettesODM();//Ritor1: do comment to test sub_485F53((Vec2_int_ *)unnamed_6BE060); @@ -315,7 +318,7 @@ signed int v11; // eax@23 int v12; // ST14_4@25 signed int v14; // [sp-4h] [bp-84h]@6 - char Str; // [sp+8h] [bp-78h]@3 + char Str[140]; // [sp+8h] [bp-78h]@3 int a5a; // [sp+94h] [bp+14h]@3 auto Source = this; @@ -323,9 +326,9 @@ v5 = Source; if ( a5 < 10 || strlen(Source->pLevelFilename) != 9 - || (strcpy(&Str, v5->pLevelFilename), - _strlwr(&Str), - v6 = strtok(&Str, "out"), + || (strcpy(Str, v5->pLevelFilename), + _strlwr(Str), + v6 = strtok(Str, "out"), v6[2] = 0, v7 = atoi(v6), v8 = v7, @@ -2894,16 +2897,16 @@ } //----- (0047B42C) -------------------------------------------------------- -unsigned int OutdoorLocation::DrawActors() +void OutdoorLocation::PrepareActorsDrawList() { unsigned int result; // eax@1 - Actor *v1; // edi@2 - __int16 v2; // ax@3 - int v3; // esi@5 + //Actor *v1; // edi@2 + //__int16 v2; // ax@3 + int z; // esi@5 float v4; // ST48_4@8 - double v5; // ST38_8@8 - float v6; // ST48_4@10 - double v7; // ST30_8@10 + //double v5; // ST38_8@8 + //float v6; // ST48_4@10 + //double v7; // ST30_8@10 unsigned int v8; // eax@11 int v9; // edx@11 __int16 v10; // dx@11 @@ -2925,7 +2928,7 @@ int v26; // ST54_4@45 int v27; // ecx@45 RenderBillboard *v28; // esi@45 - __int16 v29; // ax@46 + //__int16 v29; // ax@46 unsigned __int8 v30; // zf@46 unsigned __int8 v31; // sf@46 signed __int16 v32; // ax@49 @@ -2933,8 +2936,8 @@ int v34; // ecx@54 MonsterDesc *v35; // edx@54 int v36; // ecx@54 - unsigned __int8 v37; // zf@54 - unsigned __int8 v38; // sf@54 + //unsigned __int8 v37; // zf@54 + //unsigned __int8 v38; // sf@54 unsigned int v39; // [sp-8h] [bp-68h]@23 unsigned int v40; // [sp-4h] [bp-64h]@23 int v41; // [sp+24h] [bp-3Ch]@11 @@ -2950,70 +2953,64 @@ int v51; // [sp+34h] [bp-2Ch]@41 int v52; // [sp+34h] [bp-2Ch]@50 int v53; // [sp+38h] [bp-28h]@36 - int v54; // [sp+3Ch] [bp-24h]@2 + //int v54; // [sp+3Ch] [bp-24h]@2 int y; // [sp+40h] [bp-20h]@5 int x; // [sp+44h] [bp-1Ch]@5 int v57; // [sp+48h] [bp-18h]@45 int v58; // [sp+4Ch] [bp-14h]@45 - signed int v59; // [sp+50h] [bp-10h]@1 + //signed int v59; // [sp+50h] [bp-10h]@1 int X; // [sp+54h] [bp-Ch]@36 - __int16 v61; // [sp+58h] [bp-8h]@5 + //__int16 v61; // [sp+58h] [bp-8h]@5 signed __int16 v62; // [sp+5Ch] [bp-4h]@25 - result = 0; - v59 = 0; - if ( (signed int)uNumActors > 0 ) + //result = 0; + //v59 = 0; + for (int i = 0; i < uNumActors; ++i) { - v54 = 0; - v1 = pActors;//[0].vPosition.z; - do - { - v2 = v1->uAIState; - v1->uAttributes &= 0xFFFFFFF7u; - if ( v2 == 11 || v2 == 19 ) - goto LABEL_58; - v3 = v1->vPosition.z; + //v54 = 0; + //v1 = pActors;//[0].vPosition.z; + //do + //{ + auto actor = pActors + i; + //v2 = actor->uAIState; + + actor->uAttributes &= 0xFFFFFFF7u; + if (actor->uAIState == Removed || actor->uAIState == Disabled) + continue; + + z = actor->vPosition.z; v49 = 0; - x = v1->vPosition.x; - y = v1->vPosition.y; - v61 = v1->vPosition.z; - if ( v2 == 17 ) + x = actor->vPosition.x; + y = actor->vPosition.y; + if (actor->uAIState == Summoned) { - if ( (v1->uSummonerID & 7) != 3 || pActors[v1->uSummonerID >> 3].pMonsterInfo.uSpecialAbilityDamageDiceSides != 1 ) + if ((actor->uSummonerID & 7) != OBJECT_Actor || + pActors[actor->uSummonerID >> 3].pMonsterInfo.uSpecialAbilityDamageDiceSides != 1 ) { - v6 = (double)v1->uActorHeight * 0.5; - v7 = v6 + 6.7553994e15; - v3 += LODWORD(v7); - v61 = v3; + z += floorf(actor->uActorHeight * 0.5f + 0.5f); } else { v49 = 1; - pGame->pStru6Instance->_4A7F74(v1->vPosition.x, v1->vPosition.y, v3); - v4 = (1.0 - (double)*(signed int *)(v1 + 38) / (double)*((short *)v1 + 7)) - * (double)(2 * (signed int)v1->uActorHeight); - v5 = v4 + 6.7553994e15; - v3 -= LODWORD(v5); - v61 = v3; - if ( v3 > v1->vPosition.z ) - { - v61 = v1->vPosition.z; - v3 = v1->vPosition.z; - } + pGame->pStru6Instance->_4A7F74(actor->vPosition.x, actor->vPosition.y, z); + v4 = (1.0 - (double)actor->uCurrentActionTime / (double)actor->uCurrentActionLength) * + (double)(2 * actor->uActorHeight); + z -= floorf(v4 + 0.5f); + if ( z > actor->vPosition.z ) + z = actor->vPosition.z; } } - v8 = stru_5C6E00->Atan2( - v1->vPosition.x - pIndoorCamera->pos.x, - v1->vPosition.y - pIndoorCamera->pos.y); - LOWORD(v9) = v1->uYawAngle; + v8 = stru_5C6E00->Atan2(actor->vPosition.x - pIndoorCamera->pos.x, + actor->vPosition.y - pIndoorCamera->pos.y); + LOWORD(v9) = actor->uYawAngle; v41 = ((signed int)(stru_5C6E00->uIntegerPi + ((signed int)stru_5C6E00->uIntegerPi >> 3) + v9 - v8) >> 8) & 7; - v10 = v1->uCurrentActionAnimation; + v10 = actor->uCurrentActionAnimation; if ( pParty->bTurnBasedModeOn ) { if ( v10 != 1 ) { LABEL_17: - v12 = v1->uCurrentActionTime; + v12 = actor->uCurrentActionTime; goto LABEL_18; } v11 = pMiscTimer->uTotalGameTimeElapsed; @@ -3024,11 +3021,11 @@ goto LABEL_17; v11 = pEventTimer->uTotalGameTimeElapsed; } - v12 = v54 + v11; + v12 = 32 * i + v11; LABEL_18: - if ( (signed __int64)v1->pActorBuffs[5].uExpireTime > 0 || (signed __int64)v1->pActorBuffs[6].uExpireTime > 0 ) + if ( (signed __int64)actor->pActorBuffs[5].uExpireTime > 0 || (signed __int64)actor->pActorBuffs[6].uExpireTime > 0 ) v12 = 0; - v13 = v1->uAIState; + v13 = actor->uAIState; if ( v13 == 17 && !v49 ) { v40 = v12; @@ -3038,7 +3035,7 @@ goto LABEL_25; } v40 = v12; - v39 = v1->pSpriteIDs[v10]; + v39 = actor->pSpriteIDs[v10]; if ( v13 != 16 ) goto LABEL_24; v14 = pSpriteFrameTable->GetFrameBy_x(v39, v12); @@ -3057,7 +3054,7 @@ if ( v15->uGlowRadius ) { //LOBYTE(v16) = byte_4E94D3; - pMobileLightsStack->AddLight(x, y, v3, 0, v15->uGlowRadius, 0xFFu, 0xFFu, 0xFFu, byte_4E94D3); + pMobileLightsStack->AddLight(x, y, z, 0, v15->uGlowRadius, 0xFFu, 0xFFu, 0xFFu, byte_4E94D3); } v17 = (x - pIndoorCamera->pos.x) << 16; if ( pIndoorCamera->sRotationX ) @@ -3067,13 +3064,13 @@ + ((unsigned __int64)(v18 * (signed __int64)pOutdoorCamera->camera_rotation_y_int_sine) >> 16); v50 = (unsigned __int64)(v17 * (signed __int64)pOutdoorCamera->camera_rotation_y_int_sine) >> 16; v53 = (unsigned __int64)(v18 * (signed __int64)pOutdoorCamera->camera_rotation_y_int_cosine) >> 16; - v44 = (v3 - pIndoorCamera->pos.z) << 16; + v44 = (z - pIndoorCamera->pos.z) << 16; v19 = ((unsigned __int64)(v44 * (signed __int64)pOutdoorCamera->camera_rotation_x_int_sine) >> 16) + ((unsigned __int64)(v47 * (signed __int64)pOutdoorCamera->camera_rotation_x_int_cosine) >> 16); X = ((unsigned __int64)(v44 * (signed __int64)pOutdoorCamera->camera_rotation_x_int_sine) >> 16) + ((unsigned __int64)(v47 * (signed __int64)pOutdoorCamera->camera_rotation_x_int_cosine) >> 16); if ( v19 < 262144 || v19 > pOutdoorCamera->shading_dist_mist << 16 ) - goto LABEL_58; + continue; v20 = v53 - v50; v42 = v53 - v50; v21 = ((unsigned __int64)(v44 * (signed __int64)pOutdoorCamera->camera_rotation_x_int_cosine) >> 16) @@ -3086,12 +3083,12 @@ v22 = (unsigned __int64)(v48 * (signed __int64)pOutdoorCamera->camera_rotation_y_int_sine) >> 16; X = v22 + v51; if ( v22 + v51 < 262144 || v22 + v51 > pOutdoorCamera->shading_dist_mist << 16 ) - goto LABEL_58; + continue; v23 = (unsigned __int64)(((x - pIndoorCamera->pos.x) << 16) * (signed __int64)pOutdoorCamera->camera_rotation_y_int_sine) >> 16; v20 = ((unsigned __int64)(v48 * (signed __int64)pOutdoorCamera->camera_rotation_y_int_cosine) >> 16) - v23; v42 = ((unsigned __int64)(v48 * (signed __int64)pOutdoorCamera->camera_rotation_y_int_cosine) >> 16) - v23; - v21 = (v3 - pIndoorCamera->pos.z) << 16; + v21 = (z - pIndoorCamera->pos.z) << 16; } v45 = v21; v24 = abs(v20); @@ -3111,70 +3108,67 @@ v46 = pViewport->uScreenCenterY - ((signed int)(((unsigned __int64)(v25 / X * v45) >> 16) + 32768) >> 16); result = uNumBillboardsToDraw; v28 = &pBillboardRenderList[uNumBillboardsToDraw]; - if ( (signed int)uNumBillboardsToDraw >= 500 ) - return result; + if (uNumBillboardsToDraw >= 500) + return; ++uNumBillboardsToDraw; ++uNumSpritesDrawnThisFrame; - v1->uAttributes |= 8u; + actor->uAttributes |= 8u; v28->uHwSpriteID = v15->pHwSpriteIDs[v41]; - v29 = v15->uPaletteIndex; v28->uIndoorSectorID = 0; - v28->uPalette = v29; - v28->field_0 = (unsigned __int64)(v15->scale * (signed __int64)v58) >> 16; - v30 = HIDWORD(v1->pActorBuffs[3].uExpireTime) == 0; - v31 = SHIDWORD(v1->pActorBuffs[3].uExpireTime) < 0; - v28->field_4 = (unsigned __int64)(v15->scale * (signed __int64)v57) >> 16; - if ( v31 || v31 | v30 && LODWORD(v1->pActorBuffs[3].uExpireTime) <= 0u ) + v28->uPalette = v15->uPaletteIndex; + v28->_screenspace_x_scaler_packedfloat = (unsigned __int64)(v15->scale * (signed __int64)v58) >> 16; + v30 = HIDWORD(actor->pActorBuffs[3].uExpireTime) == 0; + v31 = SHIDWORD(actor->pActorBuffs[3].uExpireTime) < 0; + v28->_screenspace_y_scaler_packedfloat = (unsigned __int64)(v15->scale * (signed __int64)v57) >> 16; + if ( v31 || v31 | v30 && LODWORD(actor->pActorBuffs[3].uExpireTime) <= 0u ) { - if ( (signed __int64)v1->pActorBuffs[10].uExpireTime > 0i64 ) + if ( (signed __int64)actor->pActorBuffs[10].uExpireTime > 0i64 ) { - v52 = (unsigned __int64)(pGame->pStru6Instance->_4A806F(v1) - * (signed __int64)v28->field_4) >> 16; + v52 = (unsigned __int64)(pGame->pStru6Instance->_4A806F(actor) + * (signed __int64)v28->_screenspace_y_scaler_packedfloat) >> 16; LABEL_53: LOWORD(v27) = v43; - v28->field_4 = v52; + v28->_screenspace_y_scaler_packedfloat = v52; } } else { - v32 = v1->pActorBuffs[3].uPower; + v32 = actor->pActorBuffs[3].uPower; if ( v32 ) { - v33 = v1->pActorBuffs[3].uPower; - v28->field_0 = (unsigned __int64)(65536 / (unsigned __int16)v32 * (signed __int64)v28->field_0) >> 16; - v52 = (unsigned __int64)(65536 / v33 * (signed __int64)v28->field_4) >> 16; + v33 = actor->pActorBuffs[3].uPower; + v28->_screenspace_x_scaler_packedfloat = (unsigned __int64)(65536 / (unsigned __int16)v32 * (signed __int64)v28->_screenspace_x_scaler_packedfloat) >> 16; + v52 = (unsigned __int64)(65536 / v33 * (signed __int64)v28->_screenspace_y_scaler_packedfloat) >> 16; goto LABEL_53; } } v28->uScreenSpaceX = v27; + v28->uScreenSpaceY = v46; v28->some_x = x; - v28->uScreenSpaceY = v46; v28->some_y = y; - v28->some_z = v61; + v28->some_z = z; HIWORD(v34) = HIWORD(X); LOWORD(v34) = 0; v28->uPaletteSubindex = 0; - v28->sZValue = v34 + (8 * v59 | 3); - v28->field_14 = v59; + v28->sZValue = v34 + (8 * i | OBJECT_Actor); + v28->field_14_actor_id = i; v35 = pMonsterList->pMonsters; - v36 = v1->pMonsterInfo.uID; - v37 = HIDWORD(v1->pActorBuffs[5].uExpireTime) == 0; - v38 = SHIDWORD(v1->pActorBuffs[5].uExpireTime) < 0; + v36 = actor->pMonsterInfo.uID; v28->field_1E = v62 | 0x200; v28->pSpriteFrame = v15; v28->uTintColor = *((int *)&v35[v36] - 36); - if ( !v38 && (!(v38 | v37) || LODWORD(v1->pActorBuffs[5].uExpireTime)) ) + if (actor->pActorBuffs[ACTOR_BUFF_STONED].uExpireTime > 0) v28->field_1E = v62 | 0x200; } -LABEL_58: - ++v59; - v54 += 32; - result = v59; - ++v1; - } - while ( v59 < (signed int)uNumActors ); +//LABEL_58: + //++v59; + //v54 += 32; + //result = v59; + //++v1; + //} + //while ( v59 < (signed int)uNumActors ); } - return result; + //return result; } // 4E94D3: using guessed type char byte_4E94D3; // 5187E4: using guessed type int uNumSpritesDrawnThisFrame; diff -r 2cb13d295f4b -r 8e0e2991f9d1 Outdoor.h --- a/Outdoor.h Tue Feb 12 18:16:18 2013 +0600 +++ b/Outdoor.h Tue Feb 12 18:16:34 2013 +0600 @@ -140,7 +140,7 @@ } void ExecDraw(unsigned int bRedraw); - unsigned int DrawActors(); + void PrepareActorsDrawList(); void CreateDebugLocation(); void Release(); bool Load(const char *pFilename, ODMFace *File, size_t a4, int thisa); diff -r 2cb13d295f4b -r 8e0e2991f9d1 Overlays.cpp --- a/Overlays.cpp Tue Feb 12 18:16:18 2013 +0600 +++ b/Overlays.cpp Tue Feb 12 18:16:34 2013 +0600 @@ -38,7 +38,7 @@ { signed int v6; // edx@1 OtherOverlayList *v7; // eax@1 - signed int result; // eax@4 + //signed int result; // eax@4 signed int v9; // esi@6 __int16 v10; // dx@9 __int16 v11; // dx@11 @@ -81,9 +81,9 @@ v7->pOverlays[0].field_6 = v11; v7->pOverlays[0].field_10 = a5; v7->pOverlays[0].field_E = a6; - result = 1; - this->field_3EC = 1; - return result; + + bRedraw = true; + return true; } //----- (00441964) -------------------------------------------------------- diff -r 2cb13d295f4b -r 8e0e2991f9d1 Overlays.h --- a/Overlays.h Tue Feb 12 18:16:18 2013 +0600 +++ b/Overlays.h Tue Feb 12 18:16:34 2013 +0600 @@ -25,7 +25,7 @@ struct OtherOverlayList { inline OtherOverlayList(): //----- (0045848D) - field_3E8(0), field_3EC(0) + field_3E8(0), bRedraw(false) {} int _4418B1(int a2, int a3, int a4, int a5); @@ -34,7 +34,7 @@ OtherOverlay pOverlays[50]; int field_3E8; - int field_3EC; + int bRedraw; }; #pragma pack(pop) diff -r 2cb13d295f4b -r 8e0e2991f9d1 ParticleEngine.cpp --- a/ParticleEngine.cpp Tue Feb 12 18:16:18 2013 +0600 +++ b/ParticleEngine.cpp Tue Feb 12 18:16:34 2013 +0600 @@ -280,11 +280,11 @@ HIDWORD(v15) = pBLVRenderParams->field_40 >> 16; v16 = v15 / z; v17 = (unsigned __int64)(y * (signed __int64)pBLVRenderParams->sCosineY) >> 16; - pParticle->field_58 = v16; + pParticle->_screenspace_scale = v16; uParticleID = (unsigned __int64)(v16 * (signed __int64)(a6 + v17)) >> 16; LODWORD(v18) = pBLVRenderParams->uViewportCenterX - ((signed int)((unsigned __int64)(v16 * (signed __int64)(a6 + v17)) >> 16) >> 16); - v19 = pParticle->field_58; + v19 = pParticle->_screenspace_scale; pParticle->uScreenSpaceZ = v18; uParticleID = (unsigned __int64)(v19 * (signed __int64)(HIDWORD(v13) + HIDWORD(a5))) >> 16; v20 = pBLVRenderParams->uViewportCenterY @@ -329,11 +329,11 @@ HIDWORD(v30) = pBLVRenderParams->field_40 >> 16; v31 = v30 / z; v32 = (unsigned __int64)(y * (signed __int64)pBLVRenderParams->sCosineY) >> 16; - pParticle->field_58 = v31; + pParticle->_screenspace_scale = v31; uParticleID = (unsigned __int64)(v31 * (signed __int64)(v28 + v32)) >> 16; LODWORD(v33) = pBLVRenderParams->uViewportCenterX - ((signed int)((unsigned __int64)(v31 * (signed __int64)(v28 + v32)) >> 16) >> 16); - v34 = pParticle->field_58; + v34 = pParticle->_screenspace_scale; pParticle->uScreenSpaceZ = v33; v35 = pBLVRenderParams->uViewportCenterY - ((signed int)((unsigned __int64)(v34 * (signed __int64)v29) >> 16) >> 16); @@ -360,10 +360,10 @@ LODWORD(v40) = pBLVRenderParams->field_40 << 16; HIDWORD(v40) = pBLVRenderParams->field_40 >> 16; v41 = v40 / z; - pParticle->field_58 = v41; + pParticle->_screenspace_scale = v41; uParticleID = (unsigned __int64)(v41 * (signed __int64)a2) >> 16; v42 = pBLVRenderParams->uViewportCenterX - ((signed int)((unsigned __int64)(v41 * (signed __int64)a2) >> 16) >> 16); - v43 = pParticle->field_58; + v43 = pParticle->_screenspace_scale; pParticle->uScreenSpaceX = v42; v44 = v43 * (signed __int64)v24; uParticleID = v44 >> 16; @@ -372,9 +372,9 @@ v46 = pBLVRenderParams->uViewportCenterY - v44; pParticle->uScreenSpaceY = pBLVRenderParams->uViewportCenterY - v44; v47 = v45; - v48 = _48B561_mess_with_scaling_along_z(/*v46, */v47) * (signed __int64)pParticle->field_58; + v48 = _48B561_mess_with_scaling_along_z(/*v46, */v47) * (signed __int64)pParticle->_screenspace_scale; uParticleID = v48 >> 16; - pParticle->field_58 = v48 >> 16; + pParticle->_screenspace_scale = v48 >> 16; v10 = z; goto LABEL_19; } @@ -397,11 +397,11 @@ LODWORD(v6) = 0; HIDWORD(v6) = SLOWORD(v5); v7 = pParticle->flt_28; - pParticle->field_58 = v6 / (signed int)uParticleID; + pParticle->_screenspace_scale = v6 / (signed int)uParticleID; v8 = v7; pParticle->uScreenSpaceX = HIDWORD(a5); pParticle->uScreenSpaceY = a6; - pParticle->field_58 = (unsigned __int64)(_48B561_mess_with_scaling_along_z(/*v9, */v8) * (signed __int64)pParticle->field_58) >> 16; + pParticle->_screenspace_scale = (unsigned __int64)(_48B561_mess_with_scaling_along_z(/*v9, */v8) * (signed __int64)pParticle->_screenspace_scale) >> 16; v10 = uParticleID; LABEL_19: pParticle->sZValue = v10; @@ -497,8 +497,8 @@ LODWORD(v13) = 0; HIDWORD(v13) = SLOWORD(pOutdoorCamera->int_fov_rad); v14 = v13 / SHIDWORD(v12); - v6->field_58 = v14; - v15 = v6->field_58; + v6->_screenspace_scale = v14; + v15 = v6->_screenspace_scale; v6->uScreenSpaceX = pViewport->uScreenCenterX - ((signed int)((unsigned __int64)(v14 * (signed __int64)(signed int)(((unsigned __int64)(v10 * (signed __int64)v4) >> 16) @@ -536,8 +536,8 @@ v23 = v22 / (signed int)(((unsigned __int64)(v20 * (signed __int64)v5) >> 16) + ((unsigned __int64)(uIDf * (signed __int64)v4) >> 16)); - v6->field_58 = v23; - v24 = v6->field_58; + v6->_screenspace_scale = v23; + v24 = v6->_screenspace_scale; v6->uScreenSpaceX = pViewport->uScreenCenterX - ((signed int)((unsigned __int64)(v23 * (signed __int64)(signed int)(((unsigned __int64)(v20 * (signed __int64)v4) >> 16) @@ -565,8 +565,8 @@ LODWORD(v29) = 0; HIDWORD(v29) = SLOWORD(pOutdoorCamera->int_fov_rad); v30 = v29 / X_4; - v6->field_58 = v30; - v31 = v6->field_58; + v6->_screenspace_scale = v30; + v31 = v6->_screenspace_scale; v6->uScreenSpaceX = pViewport->uScreenCenterX - ((signed int)((unsigned __int64)(v30 * (signed __int64)v16) >> 16) >> 16); v32 = v6->flt_28; @@ -574,7 +574,7 @@ v34 = pViewport->uScreenCenterY - v33; v6->uScreenSpaceY = pViewport->uScreenCenterY - v33; v35 = v32; - v6->field_58 = (unsigned __int64)(_48B561_mess_with_scaling_along_z(/*v34, */v35) * (signed __int64)v6->field_58) >> 16; + v6->_screenspace_scale = (unsigned __int64)(_48B561_mess_with_scaling_along_z(/*v34, */v35) * (signed __int64)v6->_screenspace_scale) >> 16; v6->sZValue = X_4; v36 = v6->uScreenSpaceX; if ( v36 >= (signed int)pViewport->uViewportX ) @@ -625,8 +625,8 @@ if (p->uType & 0x0100) { v14 = &pParticles[i]; - v15.field_10 = v14->field_58 / 4; - v15.field_14 = v14->field_58 / 4; + v15._screenspace_x_scaler_packedfloat = v14->_screenspace_scale / 4; + v15._screenspace_y_scaler_packedfloat = v14->_screenspace_scale / 4; v15.uScreenSpaceX = v14->uScreenSpaceX; v15.uScreenSpaceY = v14->uScreenSpaceY; v15.sZValue = v14->sZValue; @@ -658,8 +658,8 @@ } if (p->uType & 0x0400) { - v15.field_10 = p->field_58; - v15.field_14 = p->field_58; + v15._screenspace_x_scaler_packedfloat = p->_screenspace_scale; + v15._screenspace_y_scaler_packedfloat = p->_screenspace_scale; v15.uScreenSpaceX = p->uScreenSpaceX; v15.uScreenSpaceY = p->uScreenSpaceY; v15.sZValue = p->sZValue; @@ -670,8 +670,8 @@ } if (p->uType & 0x0800) { - v15.field_10 = p->field_58; - v15.field_14 = p->field_58; + v15._screenspace_x_scaler_packedfloat = p->_screenspace_scale; + v15._screenspace_y_scaler_packedfloat = p->_screenspace_scale; v15.uScreenSpaceX = p->uScreenSpaceX; v15.uScreenSpaceY = p->uScreenSpaceY; v15.sZValue = p->sZValue; @@ -683,7 +683,7 @@ } else { - v11 = 13 * p->field_58 >> 16; + v11 = 13 * p->_screenspace_scale >> 16; if ( v11 > 30 ) v11 = 30; v12 = p->uScreenSpaceY - v11; @@ -743,8 +743,8 @@ if ( BYTE1(v8) & 1 ) { pParticle = &pParticleEngine->pParticles[pParticleNum]; - pBillboard.field_10 = pParticle->field_58 >> 2; - pBillboard.field_14 = pParticle->field_58 >> 2; + pBillboard._screenspace_x_scaler_packedfloat = pParticle->_screenspace_scale / 4; + pBillboard._screenspace_y_scaler_packedfloat = pParticle->_screenspace_scale / 4; pBillboard.uScreenSpaceX = pParticle->uScreenSpaceX; pBillboard.uScreenSpaceY = pParticle->uScreenSpaceY; pBillboard.sZValue = pParticle->sZValue; @@ -778,8 +778,8 @@ } if ( *(v7 - 81) & 4 ) { - pBillboard.field_10 = *(_DWORD *)(v7 + 6); - pBillboard.field_14 = *(_DWORD *)(v7 + 6); + pBillboard._screenspace_x_scaler_packedfloat = *(_DWORD *)(v7 + 6); + pBillboard._screenspace_y_scaler_packedfloat = *(_DWORD *)(v7 + 6); pBillboard.uScreenSpaceX = *(_DWORD *)(v7 - 18); pBillboard.uScreenSpaceY = *(_DWORD *)(v7 - 14); pBillboard.sZValue = *(_DWORD *)(v7 - 2); @@ -787,8 +787,8 @@ } if ( *(v7 - 81) & 8 ) { - pBillboard.field_10 = *(_DWORD *)(v7 + 6); - pBillboard.field_14 = *(_DWORD *)(v7 + 6); + pBillboard._screenspace_x_scaler_packedfloat = *(_DWORD *)(v7 + 6); + pBillboard._screenspace_y_scaler_packedfloat = *(_DWORD *)(v7 + 6); pBillboard.uScreenSpaceX = *(_DWORD *)(v7 - 18); pBillboard.uScreenSpaceY = *(_DWORD *)(v7 - 14); pBillboard.sZValue = *(_DWORD *)(v7 - 2); diff -r 2cb13d295f4b -r 8e0e2991f9d1 ParticleEngine.h --- a/ParticleEngine.h Tue Feb 12 18:16:18 2013 +0600 +++ b/ParticleEngine.h Tue Feb 12 18:16:34 2013 +0600 @@ -61,9 +61,17 @@ int uScreenSpaceY; int uScreenSpaceZ; // line end x int uScreenSpaceW; // line end y - int sZValue; + union + { + int sZValue; + struct + { + unsigned short object_pid; + short zbuffer_depth; + }; + }; int sZValue2; // line end z - int field_58; + int _screenspace_scale; float flt_5C; float flt_60; int uLightColor; diff -r 2cb13d295f4b -r 8e0e2991f9d1 Party.cpp --- a/Party.cpp Tue Feb 12 18:16:18 2013 +0600 +++ b/Party.cpp Tue Feb 12 18:16:34 2013 +0600 @@ -97,7 +97,7 @@ v12 = 0; if ( pParty->bTurnBasedModeOn == 1 ) { - if ( pTurnEngine->field_4 != 2 || (pTurnEngine->pQueue[0].uPackedID & 7) != 4 ) + if ( pTurnEngine->field_4 != 2 || (pTurnEngine->pQueue[0].uPackedID & 7) != OBJECT_Player) return 0; v2 = pTurnEngine->pQueue[0].uPackedID >> 3; return v2 + 1; diff -r 2cb13d295f4b -r 8e0e2991f9d1 Party.h --- a/Party.h Tue Feb 12 18:16:18 2013 +0600 +++ b/Party.h Tue Feb 12 18:16:34 2013 +0600 @@ -14,7 +14,11 @@ /* 355 */ -enum PARTY_FLAGS_2 : __int32 +enum PARTY_FLAGS_1: __int32 +{ + PARTY_FLAGS_1_LANDING = 0x100, +}; +enum PARTY_FLAGS_2: __int32 { PARTY_FLAGS_2_RUNNING = 0x2, }; @@ -174,6 +178,7 @@ inline bool ImmolationActive() {return pPartyBuffs[PARTY_BUFF_IMMOLATION].uExpireTime > 0;} inline bool ImmolationSkillLevel() {return pPartyBuffs[PARTY_BUFF_IMMOLATION].uSkill;} inline bool FeatherFallActive() {return pPartyBuffs[PARTY_BUFF_FEATHER_FALL].uExpireTime > 0;} + inline bool Invisible() {return pPartyBuffs[PARTY_BUFF_INVISIBILITY].uExpireTime > 0;} int field_0; diff -r 2cb13d295f4b -r 8e0e2991f9d1 Player.cpp --- a/Player.cpp Tue Feb 12 18:16:18 2013 +0600 +++ b/Player.cpp Tue Feb 12 18:16:34 2013 +0600 @@ -7688,7 +7688,7 @@ v21 = v67; goto LABEL_83; } - if ( pCurrentScreen == 23 ) + if ( pCurrentScreen == SCREEN_CASTING ) return; if ( !pParty->pPlayers[a2-1].CanAct() )//if ( !((Player *)&stru_AA1058[3].pSounds[6972 * a2 + 40552])->CanAct() ) goto LABEL_89; @@ -7704,7 +7704,7 @@ pMouse->RemoveHoldingItem(); pGUIWindow_CurrentMenu->Release(); pIcons_LOD->_4114F2(); - pCurrentScreen = 0; + pCurrentScreen = SCREEN_GAME; viewparams->bRedrawGameUI = 1; _42777D_CastSpell_UseWand_ShootArrow(v24, a2 - 1, 0x85u, 1, 0); } diff -r 2cb13d295f4b -r 8e0e2991f9d1 Render.cpp --- a/Render.cpp Tue Feb 12 18:16:18 2013 +0600 +++ b/Render.cpp Tue Feb 12 18:16:34 2013 +0600 @@ -1,3 +1,5 @@ +#include + #include "Render.h" #include "OutdoorCamera.h" #include "IndoorCamera.h" @@ -16,6 +18,7 @@ #include "DecorationList.h" #include "Allocator.h" #include "OSInfo.h" +#include "Actor.h" #include "Log.h" #include "mm7_data.h" @@ -195,8 +198,8 @@ soft_billboard.uScreenSpaceX = p->uScreenSpaceX; soft_billboard.uParentBillboardID = i; soft_billboard.uScreenSpaceY = p->uScreenSpaceY; - soft_billboard.field_10 = p->field_0; - soft_billboard.field_14 = p->field_4; + soft_billboard._screenspace_x_scaler_packedfloat = p->_screenspace_x_scaler_packedfloat; + soft_billboard._screenspace_y_scaler_packedfloat = p->_screenspace_y_scaler_packedfloat; soft_billboard.sZValue = p->sZValue; soft_billboard.uFlags = p->field_1E; soft_billboard.uTintColor = p->uTintColor; @@ -1761,8 +1764,8 @@ uStartX = 0, uEndX = 128; uStartZ = 64 - 16, uEndZ = 128; } -// uStartX = 0, uEndX = 128; -// uStartZ = 0, uEndZ = 128; + uStartX = 0, uEndX = 128; + uStartZ = 0, uEndZ = 128; static RenderVertexSoft pTerrainVertices[128 * 128]; for (unsigned int z = uStartZ; z < uEndZ; ++z) { @@ -1824,6 +1827,8 @@ memcpy(&array_50AC10[k], &array_73D150[k], sizeof(struct RenderVertexSoft)); array_50AC10[k].flt_20 = 1.0 / (array_73D150[k].vWorldViewPosition.x + 0.0000001000000011686097); } + + assert(v6 < 1000); // many random crashes here pRenderer->DrawTerrainPolygon(v8, pBitmaps_LOD->pHardwareTextures[v6]); --pOutdoorCamera->numStru148s; --pOutdoorCamera->field_44; @@ -2926,32 +2931,29 @@ goto LABEL_75; } } -// 47F44B: using guessed type int __stdcall WorldPosToGridCellX(int); -// 47F458: using guessed type int __stdcall WorldPosToGridCellZ(int); -// 4D864C: using guessed type char byte_4D864C; //----- (0047BACF) -------------------------------------------------------- void Render::TransformBillboardsAndSetPalettesODM() { - int v0; // edi@1 - char *v1; // esi@2 - unsigned int v2; // edx@3 - int v3; // eax@3 - int v4; // edi@3 - int v5; // eax@3 - __int16 v6; // di@3 - int v7; // eax@3 - int v8; // ebx@4 + //int v0; // edi@1 + //char *v1; // esi@2 + //unsigned int v2; // edx@3 + //int v3; // eax@3 + //int v4; // edi@3 + //int v5; // eax@3 + //__int16 v6; // di@3 + //int v7; // eax@3 + //int v8; // ebx@4 unsigned __int16 *v9; // eax@7 char v10; // zf@9 - DWORD v11; // eax@13 + //DWORD v11; // eax@13 int v12; // eax@13 int v13; // eax@14 RenderBillboardTransform_local0 billboard; // [sp+4h] [bp-60h]@1 int v15; // [sp+54h] [bp-10h]@13 - int v16; // [sp+58h] [bp-Ch]@1 - int v17; // [sp+5Ch] [bp-8h]@2 + //int v16; // [sp+58h] [bp-Ch]@1 + //int v17; // [sp+5Ch] [bp-8h]@2 int v18; // [sp+60h] [bp-4h]@13 billboard.uParentBillboardID = -1; @@ -2962,52 +2964,42 @@ billboard.uViewportY = pViewport->uViewportY; billboard.uViewportZ = pViewport->uViewportZ - 1; billboard.uViewportW = pViewport->uViewportW; - v0 = 0; pOutdoorCamera->uNumBillboards = uNumBillboardsToDraw; - v16 = 0; - if ( (signed int)uNumBillboardsToDraw > 0 ) - { - v17 = 0; - v1 = (char *)&pBillboardRenderList[0].uScreenSpaceY; - do - { - billboard.uScreenSpaceX = *((short *)v1 - 1); - v2 = *((short *)v1 - 5); - billboard.uScreenSpaceY = *(short *)v1; - v3 = *((int *)v1 - 10); - billboard.uParentBillboardID = v0; - v4 = *((int *)v1 + 1); - billboard.field_10 = v3; - v5 = *((int *)v1 - 9); - billboard.uTintColor = v4; - v6 = *((short *)v1 - 8); - billboard.field_14 = v5; - v7 = *((int *)v1 - 6); - billboard.sZValue = *((int *)v1 - 6); - billboard.uFlags = v2; - if ( v6 != -1 ) - { - v8 = *((short *)v1 + 1); - if ( pRenderer->pRenderD3D ) - { - billboard.sZValue = v7; - billboard.uFlags = v2; - pRenderer->TransformBillboard(&billboard, &pSprites_LOD->pHardwareSprites[v6], v8, (RenderBillboard *)(v1 - 40)); - } - else - { + + for (int i = 0; i < ::uNumBillboardsToDraw; ++i) + { + auto pBillboard = pBillboardRenderList + i; + + billboard.uScreenSpaceX = pBillboard->uScreenSpaceX; + billboard.uScreenSpaceY = pBillboard->uScreenSpaceY; + billboard.uParentBillboardID = i; + billboard._screenspace_x_scaler_packedfloat = pBillboard->_screenspace_x_scaler_packedfloat; + billboard.uTintColor = pBillboard->uTintColor; + billboard._screenspace_y_scaler_packedfloat = pBillboard->_screenspace_y_scaler_packedfloat; + billboard.sZValue = pBillboard->sZValue; + billboard.uFlags = pBillboard->field_1E; + if (pBillboard->uHwSpriteID != -1) + { + if (pRenderer->pRenderD3D) + pRenderer->TransformBillboard(&billboard, + &pSprites_LOD->pHardwareSprites[pBillboard->uHwSpriteID], + pBillboard->uPaletteSubindex, pBillboard); + else + { + assert(false); + + auto v1 = (char *)&pBillboard->uScreenSpaceY; if ( *(v1 - 10) & 2 ) v9 = PaletteManager::Get_Dark_or_Red_LUT(*((short *)v1 - 7), 0, 1); else - v9 = GetBillboardPalette((RenderBillboard *)(v1 - 40), *((short *)v1 - 7), v7, *((short *)v1 + 1)); + v9 = GetBillboardPalette((RenderBillboard *)(v1 - 40), *((short *)v1 - 7), pBillboard->sZValue, *((short *)v1 + 1)); v10 = (*(v1 - 9) & 1) == 0; billboard.pPalette = v9; if ( !v10 ) billboard.pPalette = pPaletteManager->field_261600[*((short *)v1 - 7)]; if ( !(billboard.uFlags & 0x40) && billboard.uFlags & 0x80 ) { - v11 = GetTickCount(); - v12 = stru_5C6E00->SinCos(v17 + v11); + v12 = stru_5C6E00->SinCos(i * 5 + GetTickCount()); v15 = abs(v12); v18 = (unsigned __int64)(15i64 * v15) >> 16; billboard.pPalette2 = PaletteManager::Get_Dark_or_Red_LUT(*((short *)v1 - 7), 15 - v18, 1); @@ -3015,14 +3007,8 @@ v13 = *((short *)v1 - 8); if ( v13 >= 0 ) pSprites_LOD->pSpriteHeaders[v13]._4ACC38(&billboard, 1); - } - } - v17 += 5; - v0 = v16 + 1; - v1 += 52; - ++v16; - } - while ( v16 < (signed int)uNumBillboardsToDraw ); + } + } } } @@ -3030,7 +3016,7 @@ //----- (0047AF11) -------------------------------------------------------- void Render::DrawLayingItems_Shooting_Magic_ODM() { - char *v0; // edi@2 + //char *v0; // edi@2 ObjectDesc *v1; // ebx@4 __int16 v2; // cx@5 RenderBillboard *v3; // esi@10 @@ -3071,19 +3057,20 @@ int a6; // [sp+20h] [bp-20h]@10 int a6a; // [sp+20h] [bp-20h]@23 int v40; // [sp+24h] [bp-1Ch]@25 - signed int v41; // [sp+28h] [bp-18h]@1 + //signed int v41; // [sp+28h] [bp-18h]@1 int v42; // [sp+2Ch] [bp-14h]@23 int y; // [sp+30h] [bp-10h]@10 int x; // [sp+34h] [bp-Ch]@10 int z; // [sp+38h] [bp-8h]@10 signed __int16 v46; // [sp+3Ch] [bp-4h]@12 - v41 = 0; - if ( (signed int)uNumLayingItems > 0 ) - { - v0 = (char *)&pLayingItems[0].uSectorID; - do - { + //v41 = 0; + for (int i = 0; i < uNumLayingItems; ++i) + { + auto v0 = (char *)&pLayingItems[i].uSectorID; + //v0 = (char *)&pLayingItems[0].uSectorID; + //do + //{ if ( *((short *)v0 - 13) ) { v1 = &pObjectList->pObjects[*((short *)v0 - 13)]; @@ -3096,7 +3083,7 @@ x = *((int *)v0 - 6); y = *((int *)v0 - 5); z = *((int *)v0 - 4); - v3 = &pBillboardRenderList[uNumBillboardsToDraw]; + v3 = &pBillboardRenderList[::uNumBillboardsToDraw]; v4 = pSpriteFrameTable->GetFrame(v1->uSpriteID, *((short *)v0 + 1)); v5 = v4; v28 = v4; @@ -3184,17 +3171,17 @@ - ((signed int)(((unsigned __int64)(v25 * (signed __int64)v40) >> 16) + 32768) >> 16); v32 = LOWORD(pViewport->uScreenCenterY) - (((unsigned int)((unsigned __int64)(v23 / v42 * v31) >> 16) + 32768) >> 16); - if ( (signed int)uNumBillboardsToDraw >= 500 ) + if (::uNumBillboardsToDraw >= 500) return; - ++uNumBillboardsToDraw; + ++::uNumBillboardsToDraw; ++uNumSpritesDrawnThisFrame; *(v0 - 2) |= 1u; v3->uPalette = v28->uPaletteIndex; v3->uIndoorSectorID = a5; - v3->field_0 = (unsigned __int64)(v28->scale * (signed __int64)v24) >> 16; + v3->_screenspace_x_scaler_packedfloat = (unsigned __int64)(v28->scale * (signed __int64)v24) >> 16; v26 = (unsigned __int64)(v28->scale * (signed __int64)v24) >> 16; v3->pSpriteFrame = v28; - v3->field_4 = v26; + v3->_screenspace_y_scaler_packedfloat = v26; v3->field_1E = v46; v3->some_x = x; v3->some_y = y; @@ -3204,7 +3191,7 @@ HIWORD(v26) = HIWORD(v42); LOWORD(v26) = 0; v27 = (*(v0 - 2) & 0x20) == 0; - v3->sZValue = v26 + (8 * v41 | 2); + v3->sZValue = v26 + (8 * i | OBJECT_Item); v3->uPaletteSubindex = 0; v3->uTintColor = 0; if ( !v27 ) @@ -3220,10 +3207,11 @@ } } LABEL_34: - ++v41; - v0 += 112; - } - while ( v41 < (signed int)uNumLayingItems ); + ; + //++v41; + //v0 += 112; + //} + //while ( v41 < (signed int)uNumLayingItems ); } } // 4E94D3: using guessed type char byte_4E94D3; @@ -3448,9 +3436,9 @@ //----- (0047A95E) -------------------------------------------------------- -void Render::DrawDecorations() -{ - char *v0; // esi@2 +void Render::PrepareDecorationsRenderList_ODM() +{ + //char *v0; // esi@2 DecorationDesc *v1; // ebx@6 __int16 v2; // ax@6 double v3; // st7@7 @@ -3485,7 +3473,7 @@ Particle_ local_0; // [sp+Ch] [bp-98h]@7 int x; // [sp+74h] [bp-30h]@9 int y; // [sp+78h] [bp-2Ch]@9 - int v35; // [sp+7Ch] [bp-28h]@1 + //int v35; // [sp+7Ch] [bp-28h]@1 int v36; // [sp+80h] [bp-24h]@9 unsigned __int16 *v37; // [sp+84h] [bp-20h]@9 int v38; // [sp+88h] [bp-1Ch]@9 @@ -3496,12 +3484,15 @@ int a5; // [sp+9Ch] [bp-8h]@9 int b; // [sp+A0h] [bp-4h]@22 - v35 = 0; - if ( (signed int)uNumLevelDecorations > 0 ) - { - v0 = (char *)&pLevelDecorations[0].vPosition.y; - do - { + //v35 = 0; + //if ( (signed int)uNumLevelDecorations > 0 ) + //{ + //v0 = (char *)&pLevelDecorations[0].vPosition.y; + //do + for (int i = 0; i < uNumLevelDecorations; ++i) + { + auto v0 = (char *)&pLevelDecorations[i].vPosition.y; + if ( (!(*(v0 - 6) & 0x40) || ((LevelDecoration *)(v0 - 8))->_47A825()) && !(*(v0 - 6) & 0x20) ) { v1 = &pDecorationList->pDecorations[*((short *)v0 - 4)]; @@ -3619,14 +3610,14 @@ } if ( b + v25 >= (signed int)pViewport->uViewportX && v25 - b <= (signed int)pViewport->uViewportZ ) { - if ( (signed int)uNumBillboardsToDraw >= 500 ) + if (::uNumBillboardsToDraw >= 500) return; - v27 = &pBillboardRenderList[uNumBillboardsToDraw++]; + v27 = &pBillboardRenderList[::uNumBillboardsToDraw++]; ++uNumDecorationsDrawnThisFrame; v27->uHwSpriteID = *v37; v28 = v9->uPaletteIndex; - v27->field_0 = v26; - v27->field_4 = v26; + v27->_screenspace_x_scaler_packedfloat = v26; + v27->_screenspace_y_scaler_packedfloat = v26; v29 = v38; v27->uScreenSpaceX = v25; HIBYTE(v29) |= 2u; @@ -3637,7 +3628,7 @@ v27->some_z = v36; v27->uScreenSpaceY = v40; HIWORD(v30) = HIWORD(v39); - v31 = 8 * v35 | 5; + v31 = 8 * i | OBJECT_Decoration; LOWORD(v30) = 0; v27->uIndoorSectorID = 0; v27->sZValue = v30 + v31; @@ -3688,11 +3679,11 @@ } } LABEL_38: - ++v35; - v0 += 32; - } - while ( v35 < (signed int)uNumLevelDecorations ); - } + ; + //++v35; + //v0 += 32; + } + //while ( v35 < (signed int)uNumLevelDecorations ); } // 4E94D0: using guessed type char byte_4E94D0; // 5187EC: using guessed type int uNumDecorationsDrawnThisFrame; @@ -7020,33 +7011,27 @@ { IDirectDrawSurface *pFront; // eax@3 IDirectDrawSurface *pBack; // [sp-Ch] [bp-Ch]@3 - RECT *v6; // [sp-8h] [bp-8h]@3 - DWORD v7; // [sp-4h] [bp-4h]@3 if ( pVersion->pVersionInfo.dwPlatformId != VER_PLATFORM_WIN32_NT || pVersion->pVersionInfo.dwMajorVersion != 4 ) { pFront = (IDirectDrawSurface *)this->pFrontBuffer4; - v7 = DDBLTFAST_WAIT; - v6 = a4; pBack = (IDirectDrawSurface *)this->pBackBuffer4; } else { pFront = (IDirectDrawSurface *)this->pFrontBuffer2; - v7 = DDBLTFAST_WAIT; - v6 = a4; pBack = (IDirectDrawSurface *)this->pBackBuffer2; } - pFront->BltFast(0, 0, pBack, v6, v7); + pFront->BltFast(0, 0, pBack, a4, DDBLTFAST_WAIT); } //----- (004A1B22) -------------------------------------------------------- -unsigned int Render::Billboard_ProbablyAddToListAndSortByZOrder(unsigned int a1) -{ - unsigned int v2; // ebx@1 - double v4; // st7@5 - unsigned int v5; // esi@5 - int v6; // ecx@5 +unsigned int Render::Billboard_ProbablyAddToListAndSortByZOrder(float z) +{ + //unsigned int v2; // ebx@1 + //double v4; // st7@5 + //unsigned int v5; // esi@5 + //int v6; // ecx@5 unsigned int v7; // edx@6 char *v8; // ecx@12 void *v9; // edi@16 @@ -7054,35 +7039,29 @@ void *v11; // edi@21 unsigned int v12; // eax@21 - v2 = pRenderer->uNumBillboardsToDraw; - if ( (signed int)pRenderer->uNumBillboardsToDraw >= 999 ) + //v2 = uNumBillboardsToDraw; + if (uNumBillboardsToDraw >= 999 ) return 0; - if ( !pRenderer->uNumBillboardsToDraw ) - { - pRenderer->uNumBillboardsToDraw = 1; + if (!uNumBillboardsToDraw) + { + uNumBillboardsToDraw = 1; return 0; } - v4 = *(float *)&a1; - v5 = pRenderer->uNumBillboardsToDraw; - v6 = 0; - if ( (signed int)pRenderer->uNumBillboardsToDraw <= 0 ) - { - v7 = a1; - } - else - { - do - { - v7 = v6 + (signed int)(v5 - v6) / 2; - if ( v4 <= pRenderer->pBillboardRenderListD3D[v6 + (signed int)(v5 - v6) / 2].flt_88 ) - v5 = v6 + (signed int)(v5 - v6) / 2; - else - v6 = v7 + 1; - } - while ( v6 < (signed int)v5 ); - } - v8 = (char *)&pRenderer->pBillboardRenderListD3D[v7].flt_88; - if ( v4 > *(float *)v8 ) + + //v4 = *(float *)&a1; + //v5 = pRenderer->uNumBillboardsToDraw; + //v6 = 0; + for (int left = 0, right = uNumBillboardsToDraw; left < right; ) // binsearch + { + v7 = left + (right - left) / 2; + if (z <= pRenderer->pBillboardRenderListD3D[v7].z_order) + right = v7; + else + left = v7 + 1; + } + + v8 = (char *)&pRenderer->pBillboardRenderListD3D[v7].z_order; + if (z > *(float *)v8 ) { if ( v7 == pRenderer->uNumBillboardsToDraw - 1 ) { @@ -7105,10 +7084,10 @@ ++v7; } LABEL_23: - pRenderer->uNumBillboardsToDraw = v2 + 1; + uNumBillboardsToDraw++; return v7; } - if ( v4 <= *(float *)v8 ) + if (z <= *(float *)v8 ) { if ( (signed int)pRenderer->uNumBillboardsToDraw > (signed int)v7 ) { @@ -7193,7 +7172,7 @@ if (pRenderD3D) { pGame->draw_debug_outlines(); - //DoRenderBillboards_D3D(); //Ritor1: it's temporarily + DoRenderBillboards_D3D(); //Ritor1: it's temporarily pGame->pStru6Instance->RenderSpecialEffects(); pRenderD3D->pDevice->EndScene(); } @@ -7991,7 +7970,7 @@ if ( this->uNumD3DSceneBegins ) { v4 = pSoftBillboard; - v5 = (double)HIWORD(pSoftBillboard->sZValue); + v5 = (double)pSoftBillboard->zbuffer_depth; pSoftBillboarda = v5; v6 = v5; v7 = Billboard_ProbablyAddToListAndSortByZOrder(LODWORD(v6)); @@ -8008,8 +7987,8 @@ pBillboardRenderListD3D[v9].uParentBillboardID = v4->uParentBillboardID; v25 = v4->uScreenSpaceX; v24 = v4->uScreenSpaceY; - a1 = (double)(v4->field_10 & 0xFFFF) * 0.000015260186 + (double)HIWORD(v4->field_10); - v29 = (double)(v4->field_14 & 0xFFFF) * 0.000015260186 + (double)HIWORD(v4->field_14); + a1 = (v4->_screenspace_x_scaler_packedfloat & 0xFFFF) * 0.000015260186 + HIWORD(v4->_screenspace_x_scaler_packedfloat); + v29 = (v4->_screenspace_y_scaler_packedfloat & 0xFFFF) * 0.000015260186 + HIWORD(v4->_screenspace_y_scaler_packedfloat); v31 = (double)((v10->uBufferWidth >> 1) - v10->uAreaX); v27 = (double)(v10->uBufferHeight - v10->uAreaY); if ( v4->uFlags & 4 ) @@ -8076,7 +8055,7 @@ pBillboardRenderListD3D[v9].pQuards[3].texcoord.y = 0.0; v23 = v10->pTexture; pBillboardRenderListD3D[v9].uNumVertices = 4; - pBillboardRenderListD3D[v9].flt_88 = pSoftBillboarda; + pBillboardRenderListD3D[v9].z_order = pSoftBillboarda; pBillboardRenderListD3D[v9].pTexture = v23; } } @@ -8131,9 +8110,9 @@ if ( this->uNumD3DSceneBegins ) { - if ( HIWORD(a2->sZValue) ) - { - v5 = (double)HIWORD(a2->sZValue); + if (a2->zbuffer_depth) + { + v5 = (double)a2->zbuffer_depth; v6 = v5; v7 = v5; v8 = Billboard_ProbablyAddToListAndSortByZOrder(LODWORD(v7)); @@ -8143,7 +8122,7 @@ pBillboardRenderListD3D[v8].uParentBillboardID = a2->uParentBillboardID; v9 = a2->uScreenSpaceX; v10 = a2->uScreenSpaceY; - v11 = (double)(a2->field_10 & 0xFFFF) * 0.000015260186 + (double)HIWORD(a2->field_10); + v11 = (a2->_screenspace_x_scaler_packedfloat & 0xFFFF) * 0.000015260186 + HIWORD(a2->_screenspace_x_scaler_packedfloat); v12 = (double)v9; v13 = v12; v14 = (double)(v10 - 12); @@ -8249,7 +8228,7 @@ pBillboardRenderListD3D[v8].pQuards[3].rhw = pBillboardRenderListD3D[v8].pQuards[0].rhw; pBillboardRenderListD3D[v8].pQuards[3].diffuse = uDiffuse; pBillboardRenderListD3D[v8].pTexture = a3; - pBillboardRenderListD3D[v8].flt_88 = v6; + pBillboardRenderListD3D[v8].z_order = v6; pBillboardRenderListD3D[v8].uNumVertices = 4; pBillboardRenderListD3D[v8].pQuards[3].pos.y = v45; pBillboardRenderListD3D[v8].pQuards[3].texcoord.x = 1.0; @@ -8307,7 +8286,7 @@ if ( this->uNumD3DSceneBegins ) { - v5 = (double)HIWORD(a2->sZValue); + v5 = (double)a2->zbuffer_depth; v6 = v5; v7 = v5; v8 = Billboard_ProbablyAddToListAndSortByZOrder(LODWORD(v7)); @@ -8317,7 +8296,7 @@ pBillboardRenderListD3D[v8].uParentBillboardID = a2->uParentBillboardID; v9 = a2->uScreenSpaceX; v10 = a2->uScreenSpaceY; - v11 = (double)(a2->field_10 & 0xFFFF) * 0.000015260186 + (double)HIWORD(a2->field_10); + v11 = (a2->_screenspace_x_scaler_packedfloat & 0xFFFF) * 0.000015260186 + HIWORD(a2->_screenspace_x_scaler_packedfloat); v12 = (double)v9; v13 = v12; v14 = (double)(v10 - 12); @@ -8423,7 +8402,7 @@ pBillboardRenderListD3D[v8].pQuards[3].rhw = v25; pBillboardRenderListD3D[v8].pQuards[3].diffuse = uDiffuse; pBillboardRenderListD3D[v8].pTexture = a3; - pBillboardRenderListD3D[v8].flt_88 = v6; + pBillboardRenderListD3D[v8].z_order = v6; pBillboardRenderListD3D[v8].uNumVertices = 4; pBillboardRenderListD3D[v8].pQuards[3].pos.y = v46; pBillboardRenderListD3D[v8].pQuards[3].texcoord.x = 1.0; @@ -8433,137 +8412,108 @@ //----- (004A4023) -------------------------------------------------------- -void Render::TransformBillboard(RenderBillboardTransform_local0 *a2, Sprite *pSprite, int a1a, RenderBillboard *pBillboard) -{ - RenderBillboardTransform_local0 *v5; // ebx@2 - double v6; // st7@2 - float v7; // ST08_4@2 +void Render::TransformBillboard(RenderBillboardTransform_local0 *a2, Sprite *pSprite, int paletteSubindex, RenderBillboard *pBillboard) +{ unsigned int v8; // esi@2 - Sprite *v9; // edi@5 - signed int v10; // eax@9 - signed int v11; // eax@9 - int v12; // eax@12 - double v13; // st7@12 double v14; // st6@14 double v15; // st5@14 - unsigned int v16; // ecx@16 - double v17; // st7@16 - double v18; // st5@16 - double v19; // st4@16 - double v20; // st5@18 - double v21; // st4@18 - IDirect3DTexture2 *v22; // eax@20 - signed int v23; // [sp+18h] [bp-18h]@5 - signed int v24; // [sp+1Ch] [bp-14h]@5 - float v25; // [sp+1Ch] [bp-14h]@12 - float v26; // [sp+20h] [bp-10h]@5 - float v27; // [sp+20h] [bp-10h]@12 - Render *a3; // [sp+24h] [bp-Ch]@1 + //unsigned int v16; // ecx@16 + //double v17; // st7@16 + //double v18; // st5@16 + //double v19; // st4@16 + //double v20; // st5@18 + //double v21; // st4@18 + //signed int v23; // [sp+18h] [bp-18h]@5 + //signed int v24; // [sp+1Ch] [bp-14h]@5 + //float v26; // [sp+20h] [bp-10h]@5 + //float v27; // [sp+20h] [bp-10h]@12 float v29; // [sp+28h] [bp-8h]@5 float v30; // [sp+2Ch] [bp-4h]@5 - float v31; // [sp+38h] [bp+8h]@2 - float pSpritea; // [sp+3Ch] [bp+Ch]@5 - float a1b; // [sp+40h] [bp+10h]@12 - float pBillboarda; // [sp+44h] [bp+14h]@12 - - auto a1 = this; - a3 = a1; - if ( a1->uNumD3DSceneBegins ) - { - v5 = a2; - v6 = (double)a2->sZValue; - v31 = v6; - v7 = v6; - v8 = Billboard_ProbablyAddToListAndSortByZOrder(v7); - if ( BYTE3(v5->uTintColor) ) - pBillboardRenderListD3D[v8].uOpacity = RenderBillboardD3D::Opaque_3; - else - pBillboardRenderListD3D[v8].uOpacity = RenderBillboardD3D::Transparent; - v9 = pSprite; - pBillboardRenderListD3D[v8].field_90 = v5->field_44; - pBillboardRenderListD3D[v8].sZValue = v5->sZValue; - pBillboardRenderListD3D[v8].uParentBillboardID = v5->uParentBillboardID; - v24 = v5->uScreenSpaceX; - v23 = v5->uScreenSpaceY; - v30 = (double)(v5->field_10 & 0xFFFF) * 0.000015260186 + (double)HIWORD(v5->field_10); - v29 = (double)(v5->field_14 & 0xFFFF) * 0.000015260186 + (double)HIWORD(v5->field_14); - pSpritea = (double)((v9->uBufferWidth >> 1) - v9->uAreaX); - v26 = (double)(v9->uBufferHeight - v9->uAreaY); - if ( v5->uFlags & 4 ) - pSpritea = pSpritea * -1.0; - if ( v5->uTintColor & 0xFFFFFF && a3->bTinting ) - { - v10 = GetActorTintColor(a1a, 0, v31, 0, pBillboard); - v11 = sub_4A19D8(v5->uTintColor, v10); - if ( BYTE3(v5->uTintColor) ) - v11 = (unsigned int)((char *)&array_77EC08[1852].pEdgeList1[17] + 3) & ((unsigned int)v11 >> 1); - } - else - { - v11 = GetActorTintColor(a1a, 0, v31, 0, pBillboard); - } - pBillboardRenderListD3D[v8].pQuards[0].diffuse = v11; - v12 = 0; - pBillboarda = (double)v24; - pBillboardRenderListD3D[v8].pQuards[0].pos.x = pBillboarda - pSpritea * v30; - a1b = (double)v23; - pBillboardRenderListD3D[v8].pQuards[0].pos.y = a1b - v26 * v29; - v27 = v31 * 1000.0; - v13 = 1.0; - pBillboardRenderListD3D[v8].pQuards[0].pos.z = 1.0 - 1.0 / (v27 / (double)pOutdoorCamera->shading_dist_mist); - v25 = 1.0 / v31; - pBillboardRenderListD3D[v8].pQuards[0].rhw = v25; - if ( a3->bUsingSpecular ) - { - v12 = sub_47C3D7_get_fog_related_stuff(0, 0, v31); - v13 = 1.0; - } - pBillboardRenderListD3D[v8].pQuards[0].specular = v12; - pBillboardRenderListD3D[v8].pQuards[0].texcoord.x = 0.0; - pBillboardRenderListD3D[v8].pQuards[0].texcoord.y = 0.0; - v14 = (double)((v9->uBufferWidth >> 1) - v9->uAreaX); - v15 = (double)(v9->uBufferHeight - v9->uAreaHeight - v9->uAreaY); - if ( v5->uFlags & 4 ) + //float pSpritea; // [sp+3Ch] [bp+Ch]@5 + + if (!uNumD3DSceneBegins) + return; + + v8 = Billboard_ProbablyAddToListAndSortByZOrder(a2->zbuffer_depth); + + v30 = (a2->_screenspace_x_scaler_packedfloat & 0xFFFF) / 65530.0 + HIWORD(a2->_screenspace_x_scaler_packedfloat); + v29 = (a2->_screenspace_y_scaler_packedfloat & 0xFFFF) / 65530.0 + HIWORD(a2->_screenspace_y_scaler_packedfloat); + + unsigned int diffuse = GetActorTintColor(paletteSubindex, 0, a2->zbuffer_depth, 0, pBillboard); + if (a2->uTintColor & 0x00FFFFFF && bTinting) + { + diffuse = sub_4A19D8(a2->uTintColor, diffuse); + if (a2->uTintColor & 0xFF000000) + diffuse = 0x007F7F7F & ((unsigned int)diffuse >> 1); + } + + unsigned int specular = 0; + if (bUsingSpecular) + specular = sub_47C3D7_get_fog_related_stuff(0, 0, a2->zbuffer_depth); + + v14 = (double)((int)pSprite->uBufferWidth / 2 - pSprite->uAreaX); + v15 = (double)((int)pSprite->uBufferHeight - pSprite->uAreaY); + if (a2->uFlags & 4) + v14 *= -1.0; + pBillboardRenderListD3D[v8].pQuards[0].diffuse = diffuse; + pBillboardRenderListD3D[v8].pQuards[0].pos.x = (double)a2->uScreenSpaceX - v14 * v30; + pBillboardRenderListD3D[v8].pQuards[0].pos.y = (double)a2->uScreenSpaceY - v15 * v29; + pBillboardRenderListD3D[v8].pQuards[0].pos.z = 1.0 - 1.0 / (a2->zbuffer_depth * 1000.0 / (double)pOutdoorCamera->shading_dist_mist); + pBillboardRenderListD3D[v8].pQuards[0].rhw = 1.0 / a2->zbuffer_depth; + pBillboardRenderListD3D[v8].pQuards[0].specular = specular; + pBillboardRenderListD3D[v8].pQuards[0].texcoord.x = 0.0; + pBillboardRenderListD3D[v8].pQuards[0].texcoord.y = 0.0; + + v14 = (double)((int)pSprite->uBufferWidth / 2 - pSprite->uAreaX); + v15 = (double)((int)pSprite->uBufferHeight - pSprite->uAreaHeight - pSprite->uAreaY); + if ( a2->uFlags & 4 ) v14 = v14 * -1.0; - v16 = pBillboardRenderListD3D[v8].pQuards[0].diffuse; - pBillboardRenderListD3D[v8].pQuards[1].specular = v12; - pBillboardRenderListD3D[v8].pQuards[1].diffuse = v16; - pBillboardRenderListD3D[v8].pQuards[1].pos.x = pBillboarda - v14 * v30; - pBillboardRenderListD3D[v8].pQuards[1].pos.y = a1b - v15 * v29; - v17 = v13 - v13 / (v27 / (double)pOutdoorCamera->shading_dist_mist); - pBillboardRenderListD3D[v8].pQuards[1].pos.z = v17; - pBillboardRenderListD3D[v8].pQuards[1].rhw = v25; + pBillboardRenderListD3D[v8].pQuards[1].specular = specular; + pBillboardRenderListD3D[v8].pQuards[1].diffuse = diffuse; + pBillboardRenderListD3D[v8].pQuards[1].pos.x = (double)a2->uScreenSpaceX - v14 * v30; + pBillboardRenderListD3D[v8].pQuards[1].pos.y = (double)a2->uScreenSpaceY - v15 * v29; + pBillboardRenderListD3D[v8].pQuards[1].pos.z = 1.0 - 1.0 / (a2->zbuffer_depth * 1000.0 / (double)pOutdoorCamera->shading_dist_mist); + pBillboardRenderListD3D[v8].pQuards[1].rhw = 1.0 / a2->zbuffer_depth; pBillboardRenderListD3D[v8].pQuards[1].texcoord.x = 0.0; pBillboardRenderListD3D[v8].pQuards[1].texcoord.y = 1.0; - v18 = (double)(v9->uAreaWidth + v9->uAreaX + (v9->uBufferWidth >> 1) - v9->uBufferWidth); - v19 = (double)(v9->uBufferHeight - v9->uAreaHeight - v9->uAreaY); - if ( v5->uFlags & 4 ) - v18 = v18 * -1.0; - pBillboardRenderListD3D[v8].pQuards[2].diffuse = v16; - pBillboardRenderListD3D[v8].pQuards[2].specular = v12; - pBillboardRenderListD3D[v8].pQuards[2].pos.x = v18 * v30 + pBillboarda; - pBillboardRenderListD3D[v8].pQuards[2].pos.y = a1b - v19 * v29; - pBillboardRenderListD3D[v8].pQuards[2].pos.z = v17; - pBillboardRenderListD3D[v8].pQuards[2].rhw = v25; + + v14 = (double)((int)pSprite->uAreaWidth + pSprite->uAreaX + pSprite->uBufferWidth / 2 - pSprite->uBufferWidth); + v15 = (double)((int)pSprite->uBufferHeight - pSprite->uAreaHeight - pSprite->uAreaY); + if ( a2->uFlags & 4 ) + v14 *= -1.0; + pBillboardRenderListD3D[v8].pQuards[2].diffuse = diffuse; + pBillboardRenderListD3D[v8].pQuards[2].specular = specular; + pBillboardRenderListD3D[v8].pQuards[2].pos.x = (double)a2->uScreenSpaceX + v14 * v30; + pBillboardRenderListD3D[v8].pQuards[2].pos.y = (double)a2->uScreenSpaceY - v15 * v29; + pBillboardRenderListD3D[v8].pQuards[2].pos.z = 1.0 - 1.0 / (a2->zbuffer_depth * 1000.0 / (double)pOutdoorCamera->shading_dist_mist); + pBillboardRenderListD3D[v8].pQuards[2].rhw = 1.0 / a2->zbuffer_depth; pBillboardRenderListD3D[v8].pQuards[2].texcoord.x = 1.0; pBillboardRenderListD3D[v8].pQuards[2].texcoord.y = 1.0; - v20 = (double)(v9->uAreaWidth + v9->uAreaX + (v9->uBufferWidth >> 1) - v9->uBufferWidth); - v21 = (double)(v9->uBufferHeight - v9->uAreaY); - if ( v5->uFlags & 4 ) - v20 = v20 * -1.0; - pBillboardRenderListD3D[v8].pQuards[3].diffuse = v16; - pBillboardRenderListD3D[v8].pQuards[3].specular = v12; - pBillboardRenderListD3D[v8].pQuards[3].pos.x = v20 * v30 + pBillboarda; - pBillboardRenderListD3D[v8].pQuards[3].pos.y = a1b - v21 * v29; - pBillboardRenderListD3D[v8].pQuards[3].pos.z = v17; - pBillboardRenderListD3D[v8].pQuards[3].rhw = v25; + + v14 = (double)((int)pSprite->uAreaWidth + pSprite->uAreaX + pSprite->uBufferWidth / 2 - pSprite->uBufferWidth); + v15 = (double)((int)pSprite->uBufferHeight - pSprite->uAreaY); + if ( a2->uFlags & 4 ) + v14 *= -1.0; + pBillboardRenderListD3D[v8].pQuards[3].diffuse = diffuse; + pBillboardRenderListD3D[v8].pQuards[3].specular = specular; + pBillboardRenderListD3D[v8].pQuards[3].pos.x = (double)a2->uScreenSpaceX + v14 * v30; + pBillboardRenderListD3D[v8].pQuards[3].pos.y = (double)a2->uScreenSpaceY - v15 * v29; + pBillboardRenderListD3D[v8].pQuards[3].pos.z = 1.0 - 1.0 / (a2->zbuffer_depth * 1000.0 / (double)pOutdoorCamera->shading_dist_mist); + pBillboardRenderListD3D[v8].pQuards[3].rhw = 1.0 / a2->zbuffer_depth; pBillboardRenderListD3D[v8].pQuards[3].texcoord.x = 1.0; pBillboardRenderListD3D[v8].pQuards[3].texcoord.y = 0.0; - v22 = v9->pTexture; - pBillboardRenderListD3D[v8].uNumVertices = 4; - pBillboardRenderListD3D[v8].pTexture = v22; - pBillboardRenderListD3D[v8].flt_88 = v31; - } + + pBillboardRenderListD3D[v8].uNumVertices = 4; + pBillboardRenderListD3D[v8].pTexture = pSprite->pTexture; + pBillboardRenderListD3D[v8].z_order = a2->zbuffer_depth; + pBillboardRenderListD3D[v8].field_90 = a2->field_44; + pBillboardRenderListD3D[v8].sZValue = a2->sZValue; + pBillboardRenderListD3D[v8].uParentBillboardID = a2->uParentBillboardID; + + if (a2->uTintColor & 0xFF000000) + pBillboardRenderListD3D[v8].uOpacity = RenderBillboardD3D::Opaque_3; + else + pBillboardRenderListD3D[v8].uOpacity = RenderBillboardD3D::Transparent; } @@ -8834,7 +8784,7 @@ v13 = a1->field_10; pBillboardRenderListD3D[v5].pTexture = 0; pBillboardRenderListD3D[v5].uNumVertices = v13; - LODWORD(pBillboardRenderListD3D[v5].flt_88) = v14; + LODWORD(pBillboardRenderListD3D[v5].z_order) = v14; } } @@ -8958,8 +8908,8 @@ Render *v3; // ebx@1 HWLTexture *result; // eax@1 HWLTexture *v5; // esi@1 - unsigned int v6; // ST18_4@2 - RenderD3D *v7; // ecx@2 + //unsigned int v6; // ST18_4@2 + //RenderD3D *v7; // ecx@2 Sprite *v8; // ebx@4 unsigned __int16 *v9; // edx@5 LPVOID v10; // eax@5 @@ -8982,9 +8932,9 @@ v2->uBufferHeight = result->field_1C; v2->uAreaWidth = result->field_20; v2->uAreaHeight = result->field_24; - v6 = v3->uMinDeviceTextureDim; - v7 = v3->pRenderD3D; - if ( !v7->CreateTexture(result->uWidth, result->uHeight, &v2->pTextureSurface, &v2->pTexture, 1u, 0, v6) ) + //v6 = v3->uMinDeviceTextureDim; + //v7 = v3->pRenderD3D; + if (!pRenderD3D->CreateTexture(result->uWidth, result->uHeight, &v2->pTextureSurface, &v2->pTexture, 1u, 0, uMinDeviceTextureDim)) Abortf("HiScreen16::LoadTexture - D3Drend->CreateTexture() failed: %x", 0); //pSprite = v2->pTextureSurface; //pSprite = (Sprite *)pSprite->pName; @@ -11329,18 +11279,51 @@ ErrD3D(pRenderer->pRenderD3D->pDevice->SetTextureStageState(0, D3DTSS_ADDRESS, 3u)); ErrD3D(pRenderer->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_ALPHABLENDENABLE, 1u)); ErrD3D(pRenderer->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_ZWRITEENABLE, 0)); - ErrD3D(pRenderer->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_CULLMODE, 1u)); + ErrD3D(pRenderer->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_CULLMODE, D3DCULL_NONE)); + + /*if (pRenderer->uNumBillboardsToDraw) + { + auto p = &pRenderer->pBillboardRenderListD3D[0]; + for (int i = 0; i < p->uNumVertices; ++i) + { + p->pQuards[i].pos.z -= p->pQuards[i].pos.z * 0.6; + //p->pQuards[i].rhw = + 0.8 * (1.0f - p->pQuards[i].rhw); + } + p->pQuards[0].pos.x = 10; + p->pQuards[0].pos.y = 10; + + p->pQuards[1].pos.x = 10; + p->pQuards[1].pos.y = 200; + + p->pQuards[2].pos.x = 100; + p->pQuards[2].pos.y = 200; + + p->pQuards[3].pos.x = 100; + p->pQuards[3].pos.y = 10; + + if (p->uOpacity != RenderBillboardD3D::NoBlend) + SetBillboardBlendOptions(p->uOpacity); + + pRenderer->pRenderD3D->pDevice->SetTexture(0, p->pTexture); + ErrD3D(pRenderer->pRenderD3D->pDevice->DrawPrimitive(D3DPT_TRIANGLEFAN, + D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_SPECULAR | D3DFVF_TEX1, + p->pQuards, p->uNumVertices, + D3DDP_DONOTLIGHT | D3DDP_DONOTUPDATEEXTENTS)); + + }*/ for (uint i = pRenderer->uNumBillboardsToDraw - 1; i != (uint)-1; --i) { auto p = &pRenderer->pBillboardRenderListD3D[i]; - if (p->uOpacity != RenderBillboardD3D::InvalidOpacity) + if (p->uOpacity != RenderBillboardD3D::NoBlend) SetBillboardBlendOptions(p->uOpacity); pRenderer->pRenderD3D->pDevice->SetTexture(0, p->pTexture); - ErrD3D(pRenderer->pRenderD3D->pDevice->DrawPrimitive(D3DPT_TRIANGLEFAN, D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_SPECULAR | D3DFVF_TEX1, - p->pQuards, p->uNumVertices, D3DDP_DONOTLIGHT | D3DDP_DONOTUPDATEEXTENTS)); + ErrD3D(pRenderer->pRenderD3D->pDevice->DrawPrimitive(D3DPT_TRIANGLEFAN, + D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_SPECULAR | D3DFVF_TEX1, + p->pQuards, p->uNumVertices, + D3DDP_DONOTLIGHT | D3DDP_DONOTUPDATEEXTENTS)); } if (pRenderer->bFogEnabled) @@ -11404,6 +11387,7 @@ default: Log::Warning(L"SetBillboardBlendOptions: invalid opacity type (%u)", a1); + assert(false); break; } } diff -r 2cb13d295f4b -r 8e0e2991f9d1 Render.h --- a/Render.h Tue Feb 12 18:16:18 2013 +0600 +++ b/Render.h Tue Feb 12 18:16:34 2013 +0600 @@ -52,12 +52,12 @@ #pragma pack(push, 1) struct RenderBillboard { - int field_0; - int field_4; + int _screenspace_x_scaler_packedfloat; + int _screenspace_y_scaler_packedfloat; float fov_x; float fov_y; int sZValue; - int field_14; + int field_14_actor_id; unsigned __int16 uHwSpriteID; __int16 uPalette; __int16 uIndoorSectorID; @@ -177,13 +177,13 @@ Opaque_1 = 1, Opaque_2 = 2, Opaque_3 = 3, - InvalidOpacity = 0xFFFFFFFF + NoBlend = 0xFFFFFFFF }; IDirect3DTexture2 *pTexture; unsigned int uNumVertices; RenderVertexD3D3 pQuards[4]; - float flt_88; + float z_order; OpacityType uOpacity; int field_90; int sZValue; @@ -301,7 +301,7 @@ void PresentRect(RECT *a2, RECT *a3); void BltToFront(RECT *pDstRect, IDirectDrawSurface *pSrcSurface, RECT *pSrcRect, unsigned int uBltFlags); void BltBackToFontFast(int a2, int a3, RECT *a4); - unsigned int Billboard_ProbablyAddToListAndSortByZOrder(unsigned int a1); + unsigned int Billboard_ProbablyAddToListAndSortByZOrder(float z); unsigned int GetBillboardDrawListSize(); unsigned int GetParentBillboardID(unsigned int uBillboardID); void BeginSceneD3D(); @@ -316,7 +316,7 @@ void DrawIndoorPolygon(unsigned int uNumVertices, struct BLVFace *a3, IDirect3DTexture2 *pHwTex, Texture *pTex, int uPackedID, unsigned int uColor, int a8); void MakeParticleBillboardAndPush_BLV(RenderBillboardTransform_local0 *a2, IDirect3DTexture2 *a3, unsigned int uDiffuse, int angle); void MakeParticleBillboardAndPush_ODM(RenderBillboardTransform_local0 *a2, IDirect3DTexture2 *a3, unsigned int uDiffuse, int angle); - void TransformBillboard(RenderBillboardTransform_local0 *a2, Sprite *pSprite, int a1a, RenderBillboard *pBillboard); + void TransformBillboard(RenderBillboardTransform_local0 *a2, Sprite *pSprite, int paletteSubindex, RenderBillboard *pBillboard); void DrawBillboard_Indoor(RenderBillboardTransform_local0 *pSoftBillboard, Sprite *a3, int uPaletteSubindex); int MakeParticleBillboardAndPush_BLV_Software(int screenSpaceX, int screenSpaceY, int z, int lightColor, int a6); void DrawProjectile(float srcX, float srcY, float a3, float a4, float dstX, float dstY, float a7, float a8, IDirect3DTexture2 *a9); @@ -349,7 +349,7 @@ int OnOutdoorRedrawSW(); void DrawSkyD3D(); int DrawSkySW(struct Span *a1, stru148 *a2, int a3); - void DrawDecorations(); + void PrepareDecorationsRenderList_ODM(); void DrawLayingItems_Shooting_Magic_ODM(); void TransformBillboardsAndSetPalettesODM(); float DrawBezierTerrain(); @@ -462,13 +462,21 @@ int *pTargetZ; int uScreenSpaceX; int uScreenSpaceY; - int field_10; - int field_14; + int _screenspace_x_scaler_packedfloat; + int _screenspace_y_scaler_packedfloat; char field_18[8]; unsigned __int16 *pPalette; unsigned __int16 *pPalette2; - int sZValue; - unsigned int uFlags; + union + { + int sZValue; + struct + { + unsigned short object_pid; + short zbuffer_depth; + }; + }; + unsigned int uFlags; // & 4 - mirror horizontally unsigned int uTargetPitch; unsigned int uViewportX; unsigned int uViewportY; diff -r 2cb13d295f4b -r 8e0e2991f9d1 SaveLoad.cpp --- a/SaveLoad.cpp Tue Feb 12 18:16:18 2013 +0600 +++ b/SaveLoad.cpp Tue Feb 12 18:16:34 2013 +0600 @@ -191,7 +191,7 @@ pGUIWindow_CurrentMenu->Release(); - pCurrentScreen = 0; + pCurrentScreen = SCREEN_GAME; viewparams->bRedrawGameUI = true; @@ -325,7 +325,7 @@ strcpy(pDir.pFilename, "image.pcx"); pRenderer->_49F5A2((int)pScreenshot, 150, 112, DstBuf, 1000000, (int)&pDir.uDataSize); free(pScreenshot); - if (pCurrentScreen == 11) //SaveScreen + if (pCurrentScreen == SCREEN_SAVEGAME) { pRenderer->DrawTextureIndexed(8, 8, (Texture *)(uTextureID_loadsave != -1 ? &pIcons_LOD->pTextures[uTextureID_loadsave] : 0)); pRenderer->DrawTextureIndexed(0x12, 0x8D, (Texture *)(uTextureID_save_up != -1 ? &pIcons_LOD->pTextures[uTextureID_save_up] : 0)); @@ -636,7 +636,7 @@ } GUI_UpdateWindows(); pGUIWindow_CurrentMenu->Release(); - pCurrentScreen = 0; + pCurrentScreen = SCREEN_GAME; v3 = pSavegameThumbnails; viewparams->bRedrawGameUI = 1; do diff -r 2cb13d295f4b -r 8e0e2991f9d1 Spells.cpp --- a/Spells.cpp Tue Feb 12 18:16:18 2013 +0600 +++ b/Spells.cpp Tue Feb 12 18:16:34 2013 +0600 @@ -51,7 +51,7 @@ if ( v2 ) { ((OtherOverlay *)&stru_5E4C90._decor_events[20 * v2 + 105])->Reset(); - pOtherOverlayList->field_3EC = 1; + pOtherOverlayList->bRedraw = true; v1->uOverlayID = 0; } } @@ -100,7 +100,7 @@ if ( (unsigned __int16)v8 != a5 ) { ((OtherOverlay *)&stru_5E4C90._decor_events[20 * v8 + 105])->Reset(); - pOtherOverlayList->field_3EC = 1; + pOtherOverlayList->bRedraw = true; v6->uOverlayID = 0; } } diff -r 2cb13d295f4b -r 8e0e2991f9d1 VideoPlayer.cpp --- a/VideoPlayer.cpp Tue Feb 12 18:16:18 2013 +0600 +++ b/VideoPlayer.cpp Tue Feb 12 18:16:34 2013 +0600 @@ -360,7 +360,7 @@ pRenderer->ClearTarget(0); pRenderer->EndScene(); } - pCurrentScreen = 16; // + pCurrentScreen = SCREEN_VIDEO; if ( pVideoPlayer->uMovieFormat == 2 ) { if ( pVideoPlayer->pBinkMovie ) @@ -419,11 +419,11 @@ } } if ( uGameState == GAME_FINISHED ) - pCurrentScreen = 0;//MainMenuScreen + pCurrentScreen = SCREEN_GAME; pVideoPlayer->bPlayingMovie = 0; ShowCursor(1); - if ( pCurrentScreen == 16 )// - pCurrentScreen = 0; + if ( pCurrentScreen == SCREEN_VIDEO ) + pCurrentScreen = SCREEN_GAME; } } diff -r 2cb13d295f4b -r 8e0e2991f9d1 mm7_1.cpp --- a/mm7_1.cpp Tue Feb 12 18:16:18 2013 +0600 +++ b/mm7_1.cpp Tue Feb 12 18:16:34 2013 +0600 @@ -883,7 +883,7 @@ if ( !(v16 & 0xF0) ) { if ( v16 & 1 - || pCurrentScreen != 13 ) + || pCurrentScreen != SCREEN_HOUSE ) { if ( v16 & 2 ) pRenderer->_4A6776(uCellX, uCellY, v7); @@ -1257,8 +1257,7 @@ //----- (0041AD6E) -------------------------------------------------------- void __cdecl GameUI_DrawRightPanelItems() { - if ( (signed int)((pParty->uTimePlayed - qword_507CC8) >> 32) <= 0 - && (((pParty->uTimePlayed - qword_507CC8) >> 32) & 0x80000000u) != 0i64 ) + if ( (signed int)((pParty->uTimePlayed - qword_507CC8) >> 32) <= 0 && (((pParty->uTimePlayed - qword_507CC8) >> 32) & 0x80000000u) != 0i64 ) qword_507CC8 = 0i64; if ( (((pParty->uTimePlayed - qword_507CC8) >> 32) & 0x80000000u) == 0i64 && (!(SHIDWORD(pParty->uTimePlayed) < (LODWORD(pParty->uTimePlayed) < (unsigned int)qword_507CC8) @@ -1267,24 +1266,14 @@ { qword_507CC8 = pParty->uTimePlayed; byte_50697C = byte_50697C == 0; - if ( byte_50697C - && pCurrentScreen != 5 ) + if ( byte_50697C && pCurrentScreen != SCREEN_REST ) { if ( bFlashQuestBook ) - pRenderer->DrawTextureTransparent( - 493u, - 355u, - (Texture *)(uTextureID_ib_td1_A != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_ib_td1_A] : 0)); + pRenderer->DrawTextureTransparent(493, 355, (Texture *)(uTextureID_ib_td1_A != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_ib_td1_A] : 0)); if ( bFlashAutonotesBook ) - pRenderer->DrawTextureTransparent( - 527u, - 353u, - (Texture *)(uTextureID_ib_td2_A != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_ib_td2_A] : 0)); + pRenderer->DrawTextureTransparent(527, 353, (Texture *)(uTextureID_ib_td2_A != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_ib_td2_A] : 0)); if ( bFlashHistoryBook ) - pRenderer->DrawTextureTransparent( - 600u, - 361u, - (Texture *)(uTextureID_ib_td5_A != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_ib_td5_A] : 0)); + pRenderer->DrawTextureTransparent(600, 361, (Texture *)(uTextureID_ib_td5_A != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_ib_td5_A] : 0)); } else { @@ -2088,7 +2077,7 @@ v12 = pWindowList[v3].field_34; if ( pWindowList[v3].pCurrentPosActiveItem - pWindowList[v3].pStartingPosActiveItem - v12 >= 0 ) { - v8 = pCurrentScreen == 21; + v8 = pCurrentScreen == SCREEN_PARTY_CREATION; pWindowList[v3].pCurrentPosActiveItem -= v12; if ( v8 ) { @@ -2128,7 +2117,7 @@ v7 = pWindowList[v3].pCurrentPosActiveItem + pWindowList[v3].field_34; if ( v7 < pWindowList[v3].pNumPresenceButton + pWindowList[v3].pStartingPosActiveItem ) { - v8 = pCurrentScreen == 21; + v8 = pCurrentScreen == SCREEN_PARTY_CREATION; pWindowList[v3].pCurrentPosActiveItem = v7; if ( v8 ) { @@ -2996,8 +2985,8 @@ v106.uViewportW = v12 + 128; v106.uViewportZ = v106.uViewportX + 128; v106.uScreenSpaceX = (signed int)(v106.uViewportX + 128 + v106.uViewportX) / 2; - v106.field_10 = 65536; - v106.field_14 = 65536; + v106._screenspace_x_scaler_packedfloat = 65536; + v106._screenspace_y_scaler_packedfloat = 65536; v106.uScreenSpaceY = v115 + v12 + *(short *)(v11 + 18); v106.pPalette = PaletteManager::Get_Dark_or_Red_LUT(v10->uPaletteIndex, 0, 1); v106.sZValue = 0; @@ -3672,7 +3661,7 @@ pTexture_RestUI_CurrentSkyFrame = 0; pIcons_LOD->_4114F2(); pIcons_LOD->_40F9C5(); - pCurrentScreen = 0; + pCurrentScreen = SCREEN_GAME; viewparams->bRedrawGameUI = 1; if ( uCurrentlyLoadedLevelType == LEVEL_Outdoor) { @@ -3701,7 +3690,7 @@ if ( pCurrentScreen ) { pGUIWindow_CurrentMenu->Release(); - pCurrentScreen = 0; + pCurrentScreen = SCREEN_GAME; viewparams->bRedrawGameUI = 1; } pEventTimer->Pause(); @@ -3740,7 +3729,7 @@ ++pIcons_LOD->uTexturePacksCount; if ( !pIcons_LOD->uNumPrevLoadedFiles ) pIcons_LOD->uNumPrevLoadedFiles = pIcons_LOD->uNumLoadedFiles; - pCurrentScreen = 5; + pCurrentScreen = SCREEN_REST; _507CD4_RestUI_hourglass_anim_controller = 0; uTextureID_RestUI_restmain = pIcons_LOD->LoadTexture("restmain", TEXTURE_16BIT_PALETTE); uTextureID_RestUI_restb1 = pIcons_LOD->LoadTexture("restb1", TEXTURE_16BIT_PALETTE); @@ -4406,7 +4395,7 @@ v5 = rand() % 4; v6 = dword_5B5920 >> 3; v35 = v5; - if ( (dword_5B5920 & 7) == 5 ) + if ( (dword_5B5920 & 7) == OBJECT_Decoration) { v16 = v6; v14 = pLevelDecorations[v6].vPosition.x; @@ -4416,7 +4405,7 @@ } else { - if ( (dword_5B5920 & 7) != 6 ) + if ( (dword_5B5920 & 7) != OBJECT_BModel) goto LABEL_12; if ( uCurrentlyLoadedLevelType == LEVEL_Outdoor) { @@ -4550,7 +4539,7 @@ (Texture *)(uTextureID_506438 != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_506438] : 0), 0); pChestWindow->CreateButton(7u, 8u, 460u, 343u, 1, 0, 0xCu, 0, 0, "", 0); - pCurrentScreen = 10; + pCurrentScreen = SCREEN_CHEST; pEventTimer->Pause(); return 1; } @@ -5063,7 +5052,7 @@ uLastPointedObjectID = pMouse->uPointingObjectID; return; } - if ( (v18 & 7) == 6 ) // bmodel + if ( (v18 & 7) == OBJECT_BModel) { if ( v18 < (signed int)0x2000000u ) { @@ -5213,7 +5202,7 @@ if ( uNumVisibleWindows <= 0 ) { LABEL_38: - if ( pCurrentScreen == 10 ) // ChestScreen + if ( pCurrentScreen == SCREEN_CHEST ) { sub_42038D(); //goto _return; @@ -5228,7 +5217,7 @@ uLastPointedObjectID = pMouse->uPointingObjectID; return; } - if ( pCurrentScreen == 13 ) // HouseScreen + if ( pCurrentScreen == SCREEN_HOUSE ) { if ( dword_F8B19C != 2 || (v16 = pRenderer->pActiveZBuffer[pX + pSRZBufferLineOffsets[pY]], v16 == 0) @@ -5616,7 +5605,7 @@ pAudioPlayer->StopChannels(-1, -1); bRingsShownInCharScreen = 0; CharacterUI_LoadPaperdollTextures(); - pCurrentScreen = 23; + pCurrentScreen = SCREEN_CASTING; v2 = GUIWindow::Create(0, 0, 640, 480, (WindowType)(WINDOW_HouseInterior|WINDOW_Options), v1, 0); pCharacterScreen_ExitBtn = v2->CreateButton( 394u, @@ -5786,16 +5775,16 @@ pGUIWindow_CurrentMenu = GameUI_InitializeCharacterWindow(v5); return; } - if ( pCurrentScreen == 8 ) + if ( pCurrentScreen == SCREEN_SPELL_BOOK ) return; - if ( pCurrentScreen == 10 ) + if ( pCurrentScreen == SCREEN_CHEST ) { //LABEL_23: viewparams->bRedrawGameUI = 1; if ( uActiveCharacter == v1 ) { pWindowList_at_506F50_minus1_indexing_buttons____and_an_int_[0] = 103; - pCurrentScreen = 15; + pCurrentScreen = SCREEN_F; //goto LABEL_28; uActiveCharacter = v1; return; @@ -5807,15 +5796,15 @@ uActiveCharacter = v1; return; } - if ( pCurrentScreen != 13 ) - { - if ( pCurrentScreen == 14 ) + if ( pCurrentScreen != SCREEN_HOUSE ) + { + if ( pCurrentScreen == SCREEN_E ) { //LABEL_28: uActiveCharacter = v1; return; } - if ( pCurrentScreen != 15 ) + if ( pCurrentScreen != SCREEN_F ) { viewparams->bRedrawGameUI = 1; uActiveCharacter = v1; @@ -5828,7 +5817,7 @@ if ( uActiveCharacter == v1 ) { pWindowList_at_506F50_minus1_indexing_buttons____and_an_int_[0] = 103; - pCurrentScreen = 15; + pCurrentScreen = SCREEN_F; //goto LABEL_28; uActiveCharacter = v1; return; @@ -6003,7 +5992,7 @@ v1 = pMouse->GetCursorPos(&a2); v0 = pRenderer->pActiveZBuffer[v1->x + pSRZBufferLineOffsets[pMouse->GetCursorPos(&v25)->y]]; } - if ( (v0 & 7) == 2 ) + if ( (v0 & 7) == OBJECT_Item) { a2.y = (signed int)(unsigned __int16)v0 >> 3; v21 = (signed int)(unsigned __int16)v0 >> 3; @@ -6035,9 +6024,9 @@ } goto LABEL_13; } - if ( (v0 & 7) != 3 ) - { - if ( (v0 & 7) == 5 ) + if ( (v0 & 7) != OBJECT_Actor) + { + if ( (v0 & 7) == OBJECT_Decoration) { v13 = &pLevelDecorations[(signed int)(unsigned __int16)v0 >> 3]; if ( (signed int)(((unsigned int)v0 >> 16) - pDecorationList->pDecorations[v13->uDecorationDescID].uRadius) >= 512 ) @@ -6058,7 +6047,7 @@ } else { - if ( (v0 & 7) != 6 || (unsigned int)v0 >= 0x2000000 ) + if ( (v0 & 7) != OBJECT_BModel || (unsigned int)v0 >= 0x2000000 ) goto LABEL_13; v2 = (signed int)(unsigned __int16)v0 >> 3; if ( uCurrentlyLoadedLevelType == LEVEL_Indoor) @@ -6216,12 +6205,12 @@ bool __cdecl sub_4226C2() { if ( pCurrentScreen - && pCurrentScreen != 4 - && pCurrentScreen != 17 ) - { - if ( pCurrentScreen == 18 ) + && pCurrentScreen != SCREEN_NPC_DIALOGUE + && pCurrentScreen != SCREEN_CHANGE_LOCATION ) + { + if ( pCurrentScreen == SCREEN_INPUT_BLV ) return pVideoPlayer->pSmackerMovie != 0; - if ( pCurrentScreen != 19 ) + if ( pCurrentScreen != SCREEN_BRANCHLESS_NPC_DIALOG ) return 1; } return 0; diff -r 2cb13d295f4b -r 8e0e2991f9d1 mm7_2.cpp --- a/mm7_2.cpp Tue Feb 12 18:16:18 2013 +0600 +++ b/mm7_2.cpp Tue Feb 12 18:16:34 2013 +0600 @@ -3249,7 +3249,7 @@ do { v2 = v1->uAIState; - if ( v1->uAIState == 5 || v2 == 11 || v2 == 19 || (v3 = v1->uSummonerID) != 0 && (v3 & 7) == 4 ) + if ( v1->uAIState == Dead || v2 == Removed || v2 == Disabled || (v3 = v1->uSummonerID) != 0 && (v3 & 7) == OBJECT_Player) ++v0; ++v1; --v7; @@ -4518,7 +4518,7 @@ v0 = pPlayers[uActiveCharacter]; v77 = pPlayers[uActiveCharacter]; - if ( pCurrentScreen == 14 ) + if ( pCurrentScreen == SCREEN_E ) goto LABEL_73; if ( !sub_4B1784_check_if_player_concious__draw_warning_else_mess_with_dlg_win() ) { @@ -12038,7 +12038,7 @@ GUIButton *pButton2; // [sp+0h] [bp-3Ch]@27 GUIWindow *pWindow; // [sp+4h] [bp-38h]@11 - pCurrentScreen = 0; // + pCurrentScreen = SCREEN_GAME; if (pAsyncMouse) pAsyncMouse->Resume(); if ( LOBYTE(pGame->pKeyboardInstance->bUsingAsynKeyboard) && pAsyncKeyboard ) @@ -12074,12 +12074,12 @@ pWindow = pWindow_MainMenu; if ( GetCurrentMenuID() == MENU_SAVELOAD)// { - if ( pCurrentScreen != 12 )// + if ( pCurrentScreen != SCREEN_LOADGAME ) { pTexture_PCX.Release(); pTexture_PCX.Load("lsave640.pcx", 0); pGUIWindow2 = GUIWindow::Create(0, 0, 640, 480, WINDOW_MainMenu, 0, 0); - pCurrentScreen = 12; // + pCurrentScreen = SCREEN_LOADGAME; GameUI_DrawLoadMenu(0);// } pWindow = pGUIWindow_CurrentMenu; @@ -12114,7 +12114,7 @@ pIcons_LOD->_4114F2(); pGUIWindow_CurrentMenu->Release(); pGUIWindow_CurrentMenu = 0; - pCurrentScreen = 0; + pCurrentScreen = SCREEN_GAME; viewparams->bRedrawGameUI = 1; } } @@ -12497,7 +12497,7 @@ goto LABEL_104; } if ( pCurrentScreen - && pCurrentScreen != 21 ) + && pCurrentScreen != SCREEN_PRESS_ESCAPE_MESSAGE ) return 0; } if ( !viewparams->field_4C ) @@ -13485,6 +13485,7 @@ pParty = new Party; + memset(&pParty->pHirelings, 0, sizeof(pParty->pHirelings)); pParty->uWalkSpeed = GetPrivateProfileIntW(L"debug", L"walkspeed", 384, pMM6IniFile); pParty->uDefaultEyelevel = GetPrivateProfileIntW(L"party", L"eyelevel", 160, pMM6IniFile); pParty->sEyelevel = pParty->uDefaultEyelevel; @@ -15597,7 +15598,7 @@ } while ( v6 < v22 ); } - if ( (v7 & 7) == 5 ) + if ( (v7 & 7) == OBJECT_Decoration) { v16 = (unsigned int)v7 >> 3; if ( (signed int)(((unsigned int)*v21 >> 16) @@ -15696,7 +15697,7 @@ v2 = a1; switch ( a1 & 7 ) { - case 2: + case OBJECT_Item: v17 = a1 >> 3; v26 = a1 >> 3; v18 = a1 >> 3; @@ -15729,7 +15730,8 @@ } LayingItem::_42F933(v21); break; - case 3: + + case OBJECT_Actor: v12 = a1 >> 3; v13 = &pActors[a1 >> 3]; v14 = v13->uAIState; @@ -15771,7 +15773,8 @@ } } break; - case 5: + + case OBJECT_Decoration: v8 = &pLevelDecorations[a1 >> 3]; v9 = v8->field_16_event_id; if ( v9 ) @@ -15791,10 +15794,11 @@ _5C3420_pDecoration = 0; } break; + default: - if ( (a1 & 7) != 6 ) - { - MessageBoxW(nullptr, L"Warning: Invalid ID reached!", L"E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\Mouse.cpp:2020", 0); + if ( (a1 & 7) != OBJECT_BModel) + { + MessageBoxW(nullptr, L"Warning: Invalid ID reached!", L"E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\Mouse.cpp:2020", 0); return 1; } if ( uCurrentlyLoadedLevelType != LEVEL_Indoor ) @@ -15816,7 +15820,7 @@ } if ( v5 & 0x100000 || (v6 = pIndoor->pFaceExtras[v4->uFaceExtraID].uEventID) == 0 ) return 1; - if ( pCurrentScreen != 19 ) + if ( pCurrentScreen != SCREEN_BRANCHLESS_NPC_DIALOG ) goto LABEL_13; break; } @@ -15865,7 +15869,7 @@ v6 = ((v12 - v4 - 1) >> 1) + 1; do { - if ( (*(char *)v5 & 7) == 3 ) + if ( (*(char *)v5 & 7) == OBJECT_Actor) { if ( *v5 <= a3 << 16 ) { @@ -15936,7 +15940,7 @@ v3 = pRenderer->GetParentBillboardID(a1a); v4 = pBillboardRenderList[v3].sZValue; v5 = (unsigned __int16)pBillboardRenderList[v3].sZValue; - if ( (v5 & 7) == 3 ) + if ( (v5 & 7) == OBJECT_Actor) { if ( v4 <= (unsigned int)(a3 << 16) ) { @@ -16195,7 +16199,7 @@ { v19 = dword_720020_zvalues[v18] & 0xFFFF; v20 = (dword_720020_zvalues[v18] & 0xFFFFu) >> 3; - if ( (dword_720020_zvalues[v18] & 7) == 2 ) + if ( (dword_720020_zvalues[v18] & 7) == OBJECT_Item) { if ( v20 >= 0x3E8 ) return 0; @@ -16208,16 +16212,16 @@ } goto LABEL_41; } - if ( (dword_720020_zvalues[v18] & 7) == 3 ) + if ( (dword_720020_zvalues[v18] & 7) == OBJECT_Actor) { if ( v20 >= 0xBB8 ) return 0; v24 = (const char *)&pActors[v20]; goto LABEL_51; } - if ( (dword_720020_zvalues[v18] & 7) == 5 ) + if ( (dword_720020_zvalues[v18] & 7) == OBJECT_Decoration) break; - if ( (dword_720020_zvalues[v18] & 7) == 6 ) + if ( (dword_720020_zvalues[v18] & 7) == OBJECT_BModel) { if ( uCurrentlyLoadedLevelType == LEVEL_Indoor ) { @@ -16340,7 +16344,7 @@ UI_CreateTravelDialogue(); } } - //UpdateActors_ODM();Ritor1: it's temporarily + UpdateActors_ODM();//Ritor1: it's temporarily _46CC4B_check_event_triggers(); } @@ -16549,14 +16553,14 @@ v3 = &pObjectList->pObjects[v2->uObjectDescID]; v145 = a2; v151 = a2 & 7; - if ( (a2 & 7) == 3 ) - { - if ( (v2->field_58 & 7) == 3 && !pActors[v2->field_58 >> 3].GetActorsRelation(&pActors[a2 >> 3]) ) + if ( (a2 & 7) == OBJECT_Actor) + { + if ( (v2->field_58 & 7) == OBJECT_Actor && !pActors[v2->field_58 >> 3].GetActorsRelation(&pActors[a2 >> 3]) ) return 1; } else { - if ( (a2 & 7) == 4 && (v2->field_58 & 7) == 4 ) + if ( (a2 & 7) == OBJECT_Player && (v2->field_58 & 7) == OBJECT_Player) return 1; } if ( pParty->bTurnBasedModeOn == 1 ) @@ -16568,7 +16572,7 @@ v2->uAttributes = v5 & 0xFFFB; } } - if ( v151 == 6 && (v2->field_58 & 7) != 4 ) + if ( v151 == OBJECT_BModel && (v2->field_58 & 7) != OBJECT_Player) BYTE2(pActors[v2->field_58 >> 3].uAttributes) |= 4u; v6 = v2->uItemType; v7 = v2->uItemType; @@ -16625,7 +16629,7 @@ break; } v138 = 1; - if ( v151 != 3 ) + if ( v151 != OBJECT_Actor) { if ( v6 != 9030 || v2->field_50 != 4 ) goto LABEL_246; diff -r 2cb13d295f4b -r 8e0e2991f9d1 mm7_3.cpp --- a/mm7_3.cpp Tue Feb 12 18:16:18 2013 +0600 +++ b/mm7_3.cpp Tue Feb 12 18:16:34 2013 +0600 @@ -959,7 +959,7 @@ signed int v60; // eax@107 int v61; // eax@124 Vec3_int_ v62; // [sp+Ch] [bp-44h]@42 - char v63; // [sp+18h] [bp-38h]@64 + int v63; // [sp+18h] [bp-38h]@64 int v64; // [sp+1Ch] [bp-34h]@64 int v65; // [sp+20h] [bp-30h]@2 int v66; // [sp+24h] [bp-2Ch]@2 @@ -995,7 +995,7 @@ v74 = v4; if ( !v0->CanAct() ) v74 = 0; - v70 = GetTerrainHeightsAroundParty(v0->vPosition.x, v0->vPosition.y); + v70 = IsTerrainSlopeTooHigh(v0->vPosition.x, v0->vPosition.y); v5 = sub_46D49E_prolly_get_world_y_under_party( v0->vPosition.x, v0->vPosition.y, @@ -1088,7 +1088,7 @@ v18 = v0->vPosition.y; v19 = v0->vPosition.x; v0->vPosition.z = v7; - _46DCC8_get_gravity_direction_outdoor(v19, v18, &v62); + ODM_GetTerrainNormalAt(v19, v18, &v62); v20 = GetGravityStrength(); v21 = v62.y; v22 = v62.z; @@ -1337,8 +1337,8 @@ v70 = v0->vVelocity.z; v70 = (unsigned __int64)(v71 * (signed __int64)(signed int)v70) >> 16; ++v69; - v54 = __OFSUB__(v69, 100); - v10 = ((v69 - 100) & 0x80000000u) != 0; + v54 = v69 < 100; + v10 = (v69 - 100) < 0; v0->vVelocity.z = v70; if ( !(v10 ^ v54) ) break; @@ -1483,11 +1483,11 @@ { _46E44E_collide_against_faces_and_portals(0); _46E0B2_collide_against_decorations(); - if ( (v1->field_58 & 7) != 4 ) + if ( (v1->field_58 & 7) != OBJECT_Player) _46EF01_collision_chech_player(1); v13 = v1->field_58; v42 = v8; - if ( (v13 & 7) == 3 ) + if ( (v13 & 7) == OBJECT_Actor) { if ( (signed int)uNumActors > v8 ) { @@ -1575,7 +1575,7 @@ if ( v2->uFlags & 0x40 && !_46BFFA_check_object_intercept(uLayingItemID_, stru_721530.uFaceID) ) return; v15 = (signed int)stru_721530.uFaceID >> 3; - if ( (stru_721530.uFaceID & 7) == 5 ) + if ( (stru_721530.uFaceID & 7) == OBJECT_Decoration) { v40 = sub_452A9E(v1->vVelocity.x * v1->vVelocity.x + v1->vVelocity.y * v1->vVelocity.y); v23 = stru_5C6E00->Atan2( @@ -1593,7 +1593,7 @@ } else { - if ( (stru_721530.uFaceID & 7) != 6 ) + if ( (stru_721530.uFaceID & 7) != OBJECT_BModel) goto LABEL_64; stru_721530.field_84 = (signed int)stru_721530.uFaceID >> 3; v16 = &pIndoor->pFaces[v15]; @@ -1826,7 +1826,7 @@ v1 = &pLayingItems[uLayingItemID]; v58 = 0; v2 = &pObjectList->pObjects[v1->uObjectDescID]; - v57 = GetTerrainHeightsAroundParty(v1->vPosition.x, v1->vPosition.y); + v57 = IsTerrainSlopeTooHigh(v1->vPosition.x, v1->vPosition.y); v3 = v1->vPosition.y; v4 = v1->vPosition.x; v5 = v2->uHeight; @@ -1864,7 +1864,7 @@ v11 = v1->vPosition.y; v12 = v1->vPosition.x; v1->vPosition.z = v8; - _46DCC8_get_gravity_direction_outdoor(v12, v11, &v51); + ODM_GetTerrainNormalAt(v12, v11, &v51); v1->vVelocity.z -= LOWORD(pEventTimer->uTimeElapsed) * GetGravityStrength(); v56 = abs(v51.y * v1->vVelocity.y + v51.z * v1->vVelocity.z + v51.x * v1->vVelocity.x) >> 16; v60 = (Actor *)((unsigned __int64)(v56 * (signed __int64)v51.x) >> 16); @@ -1987,9 +1987,9 @@ v58 = v16; v18 = WorldPosToGridCellX(v17); _46E26D_collide_against_sprites(v18, v58); - if ( (v1->field_58 & 7) != 4 ) + if ( (v1->field_58 & 7) != OBJECT_Player) _46EF01_collision_chech_player(0); - if ( (v1->field_58 & 7) == 3 ) + if ( (v1->field_58 & 7) == OBJECT_Actor) { v19 = v1->field_58 >> 3; if ( v19 >= 0 ) @@ -2094,9 +2094,9 @@ return; } v30 = (signed int)stru_721530.uFaceID >> 3; - if ( (stru_721530.uFaceID & 7) == 5 ) + if ( (stru_721530.uFaceID & 7) == OBJECT_Decoration) break; - if ( (stru_721530.uFaceID & 7) == 6 ) + if ( (stru_721530.uFaceID & 7) == OBJECT_BModel) { v31 = &pOutdoor->pBModels[(signed int)stru_721530.uFaceID >> 9]; v32 = &v31->pFaces[v30 & 0x3F]; @@ -2814,7 +2814,7 @@ uSectorID = stru_721530.uSectorID; stru_721530.field_70 += stru_721530.field_7C; auto v87 = ((unsigned __int64)(stru_721530.field_7C * (signed __int64)stru_721530.field_58.z) >> 16) + new_party_z; - if ( (stru_721530.uFaceID & 7) == 3 ) + if ( (stru_721530.uFaceID & 7) == OBJECT_Actor) { if ( SHIDWORD(pParty->pPartyBuffs[11].uExpireTime) >= 0 && (SHIDWORD(pParty->pPartyBuffs[11].uExpireTime) > 0 || LODWORD(pParty->pPartyBuffs[11].uExpireTime)) ) @@ -2822,7 +2822,7 @@ viewparams->bRedrawGameUI = 1; goto LABEL_152; } - if ( (stru_721530.uFaceID & 7) == 5 ) + if ( (stru_721530.uFaceID & 7) == OBJECT_Decoration) { v53 = sub_452A9E(v2 * v2 + v1 * v1); v80 = v53; @@ -2835,7 +2835,7 @@ } else { - if ( (stru_721530.uFaceID & 7) == 6 ) + if ( (stru_721530.uFaceID & 7) == OBJECT_BModel) { v44 = &pIndoor->pFaces[(signed int)stru_721530.uFaceID >> 3]; v45 = v44->uPolygonType; @@ -2994,48 +2994,48 @@ //----- (00473893) -------------------------------------------------------- void __cdecl ODM_ProcessPartyActions() { - int _zero; // esi@1 + //int _zero; // esi@1 int v1; // edi@1 int v2; // ebx@1 int v3; // eax@14 - Player **v4; // esi@21 - int v5; // eax@24 + //Player **v4; // esi@21 + //int v5; // eax@24 int v6; // esi@45 ODMFace *v7; // ecx@45 //unsigned int v8; // eax@71 - double v9; // st7@72 + //double v9; // st7@72 //signed __int64 v10; // qax@74 - double v11; // st7@75 - int v12; // ecx@77 - int v13; // eax@84 - double v14; // st7@84 - int v15; // eax@87 - double v16; // st7@87 - int v17; // eax@88 - double v18; // st7@88 - int v19; // eax@89 - double v20; // st7@89 - int v21; // eax@92 - double v22; // st7@92 - int v23; // eax@96 - double v24; // st7@96 - int v25; // eax@97 - double v26; // st7@97 - int v27; // eax@98 - double v28; // st7@98 - signed __int64 v29; // qax@98 - unsigned int v30; // eax@103 + //double v11; // st7@75 + //int v12; // ecx@77 + //int v13; // eax@84 + //double v14; // st7@84 + //int v15; // eax@87 + //double v16; // st7@87 + //int v17; // eax@88 + //double v18; // st7@88 + //int v19; // eax@89 + //double v20; // st7@89 + //int v21; // eax@92 + //double v22; // st7@92 + //int v23; // eax@96 + //double v24; // st7@96 + //int v25; // eax@97 + //double v26; // st7@97 + //int v27; // eax@98 + //double v28; // st7@98 + //signed __int64 v29; // qax@98 + //unsigned int v30; // eax@103 int v31; // eax@130 - int v32; // ecx@141 + //int v32; // ecx@141 signed int v33; // eax@143 int v34; // esi@143 - unsigned int v35; // esi@147 + int v35; // esi@147 int v36; // eax@155 signed int v37; // esi@159 signed int v38; // eax@159 signed int i; // esi@159 int v40; // esi@162 - Player **v41; // esi@172 + //Player **v41; // esi@172 bool v42; // eax@180 signed int v43; // ecx@184 signed int v44; // edx@184 @@ -3087,14 +3087,15 @@ signed int v90; // [sp-14h] [bp-A8h]@246 signed int v91; // [sp-10h] [bp-A4h]@246 int v92; // [sp-Ch] [bp-A0h]@246 - int v93; // [sp-8h] [bp-9Ch]@104 + //int v93; // [sp-8h] [bp-9Ch]@104 unsigned int v94; // [sp-8h] [bp-9Ch]@246 - int v95; // [sp-4h] [bp-98h]@104 + //int v95; // [sp-4h] [bp-98h]@104 int v96; // [sp-4h] [bp-98h]@246 int v97; // [sp+Ch] [bp-88h]@180 - int v98; // [sp+10h] [bp-84h]@147 - int v99; // [sp+14h] [bp-80h]@147 - int v100; // [sp+18h] [bp-7Ch]@147 + Vec3_int_ v98; + //int v98; // [sp+10h] [bp-84h]@147 + //int v99; // [sp+14h] [bp-80h]@147 + //int v100; // [sp+18h] [bp-7Ch]@147 bool v101; // [sp+1Ch] [bp-78h]@33 int v102; // [sp+20h] [bp-74h]@1 int v103; // [sp+24h] [bp-70h]@1 @@ -3128,7 +3129,6 @@ v121 = pParty->uFallSpeed; v123 = pParty->vPosition.z; - _zero = 0; v1 = 0; v103 = 0; v2 = 0; @@ -3137,7 +3137,7 @@ v117 = pParty->vPosition.y; v113 = pParty->field_6F0; bJumping = 0; - v118 = GetTerrainHeightsAroundParty(pParty->vPosition.x, pParty->vPosition.y); + auto partyAtHighSlope = IsTerrainSlopeTooHigh(pParty->vPosition.x, pParty->vPosition.y); v114 = 0; v124 = 0; v108 = 0; @@ -3183,57 +3183,52 @@ v3 = pParty->uFallStartY; if ( v3 - v123 > 512 && !bFeatherFall && v123 <= v111 + 1 ) { - if ( BYTE1(pParty->uFlags) & 1 ) - { - BYTE1(pParty->uFlags) &= 0xFEu; - } - else - { - v4 = &pPlayers[1]; // receive falling damage - do - { - if ( !(*v4)->HasEnchantedItemEquipped(72) && !(*v4)->WearsItem(529, 8) ) - { - v105 = (*v4)->GetMaxHealth(); - (*v4)->ReceiveDamage( - (signed int)((pParty->uFallStartY - v123) * (unsigned __int64)(signed __int64)((double)v105 * 0.1)) / 256, + if (pParty->uFlags & PARTY_FLAGS_1_LANDING) + { + pParty->uFlags &= ~PARTY_FLAGS_1_LANDING; + } + else for (int _i = 0; _i < 4; ++_i) // receive falling damage + { + auto player = pParty->pPlayers + _i; + + if ( !player->HasEnchantedItemEquipped(72) && !player->WearsItem(529, 8) ) + { + player->ReceiveDamage( + (signed int)((pParty->uFallStartY - v123) * (unsigned __int64)(player->GetMaxHealth() / 10)) / 256, 4); - v5 = (*v4)->GetActualEndurance(); - v105 = 20 - (*v4)->_48EA1B_get_static_effect(v5); - (*v4)->SetRecoveryTime((signed __int64)((double)v105 * flt_6BE3A4_debug_recmod1 * 2.133333333333333)); - } - ++v4; - } - while ( (signed int)v4 <= (signed int)&pPlayers[4] ); - _zero = 0; + v105 = 20 - player->_48EA1B_get_static_effect(player->GetActualEndurance()); + player->SetRecoveryTime((signed __int64)((double)v105 * flt_6BE3A4_debug_recmod1 * 2.133333333333333)); + } + //} + //while ( (signed int)v4 <= (signed int)&pPlayers[4] ); } } v109 = -1; - if ( pParty->bFlying != _zero ) + if ( pParty->bFlying ) v109 = sub_46D8E3(v116, v117, v123 + pParty->uPartyHeight, (int)&v102); - v107 = v108 == _zero; + v107 = v108 == 0; v105 = v111 + 1; if ( v123 <= v111 + 1 ) { v109 = -1; - pParty->bFlying = _zero; + pParty->bFlying = false; } else { bJumping = 1; } v101 = v123 - v111 <= 32; - if ( bWalkSound != _zero && pParty->field_6F8 > _zero ) + if ( bWalkSound && pParty->field_6F8 > 0 ) pParty->field_6F8 -= pEventTimer->uTimeElapsed; - if ( !bUnderwater - && SHIDWORD(pParty->pPartyBuffs[7].uExpireTime) <= _zero - && (SHIDWORD(pParty->pPartyBuffs[7].uExpireTime) < _zero || LODWORD(pParty->pPartyBuffs[7].uExpireTime) <= _zero) ) - pParty->bFlying = _zero; - if ( bJumping == _zero ) + if (!bUnderwater + && SHIDWORD(pParty->pPartyBuffs[7].uExpireTime) <= 0 + && (SHIDWORD(pParty->pPartyBuffs[7].uExpireTime) < 0 || LODWORD(pParty->pPartyBuffs[7].uExpireTime) <= 0) ) + pParty->bFlying = false; + if (!bJumping) { if ( pParty->field_6F4_packedid != (8 * v108 | OBJECT_BModel) ) { - if ( v108 != _zero ) + if (v108) { if ( v108 >> 6 < pOutdoor->uNumBModels ) { @@ -3263,18 +3258,19 @@ * stru_5C6E00->uIntegerPi) / 180)) >> 16);*/ __int64 dturn = (unsigned __int64)(pEventTimer->dt_in_some_format * (signed __int64)((signed int)(pParty->y_rotation_speed * stru_5C6E00->uIntegerPi) / 180)) >> 16; -LABEL_118: - while ( pPartyActionQueue->uNumActions ) - { - switch ( pPartyActionQueue->Next() ) + while (pPartyActionQueue->uNumActions) + { + switch (pPartyActionQueue->Next()) { case PARTY_FlyUp: - if ( (signed __int64)pParty->pPartyBuffs[7].uExpireTime > 0 || bUnderwater == 1 ) - { - pParty->bFlying = 0; - if ( bUnderwater - || pParty->pPartyBuffs[7].uFlags & 1 - || pParty->pPlayers[pParty->pPartyBuffs[7].uCaster-1].sMana <= 0 )//*(int *)&pParty->pArtifactsFound[6972 * pParty->pPartyBuffs[7].uCaster + 10] > 0 ) + { + if (!pParty->FlyActive() && !bUnderwater) + break; + + pParty->bFlying = false; + if (bUnderwater || + pParty->pPartyBuffs[PARTY_BUFF_FLY].uFlags & 1 || + pParty->pPlayers[pParty->pPartyBuffs[PARTY_BUFF_FLY].uCaster - 1].sMana <= 0 ) { if ( pParty->vPosition.z < 4000 || bJumping ) { @@ -3306,10 +3302,11 @@ v127 = (BSPModel *)1; } } - } - goto LABEL_118; + } + break; + case PARTY_FlyDown: - if ( (signed __int64)pParty->pPartyBuffs[7].uExpireTime > 0 || bUnderwater == 1 ) + if (pParty->FlyActive() || bUnderwater) { pParty->bFlying = 0; if ( bUnderwater @@ -3329,245 +3326,222 @@ } } } - goto LABEL_118; + break; + case PARTY_TurnLeft: - //v8 = uTurnSpeed; - if ( uTurnSpeed ) - { - v12 = uTurnSpeed + _angle_y; - _angle_y = stru_5C6E00->uDoublePiMask & v12; - } - else - { - v9 = (double)dturn * fTurnSpeedMultiplier; - _angle_y = stru_5C6E00->uDoublePiMask & (_angle_y + (unsigned __int64)(signed __int64)v9); - } - break; + if (uTurnSpeed) + _angle_y += uTurnSpeed; //descrete turn + else + _angle_y += dturn * fTurnSpeedMultiplier; // time-based smooth turn + + _angle_y &= stru_5C6E00->uDoublePiMask; + break; case PARTY_TurnRight: - //LODWORD(v10) = uTurnSpeed; - if ( uTurnSpeed ) - { - v12 = _angle_y - uTurnSpeed; - _angle_y = stru_5C6E00->uDoublePiMask & v12; - } - else - { - v11 = (double)dturn * fTurnSpeedMultiplier; - v12 = _angle_y - (signed __int64)v11; - _angle_y = stru_5C6E00->uDoublePiMask & v12; - } - break; + if (uTurnSpeed) + _angle_y -= uTurnSpeed; + else + _angle_y -= dturn * fTurnSpeedMultiplier; + + _angle_y &= stru_5C6E00->uDoublePiMask; + break; case PARTY_FastTurnLeft: - if ( uTurnSpeed ) - { - v12 = uTurnSpeed + _angle_y; - _angle_y = stru_5C6E00->uDoublePiMask & v12; - } - else - { - v9 = (fTurnSpeedMultiplier + fTurnSpeedMultiplier) * (double)dturn; - _angle_y = stru_5C6E00->uDoublePiMask & (_angle_y + (unsigned __int64)(signed __int64)v9); - } - break; + if (uTurnSpeed) + _angle_y += uTurnSpeed; + else + _angle_y += 2.0f * fTurnSpeedMultiplier * (double)dturn; + + _angle_y &= stru_5C6E00->uDoublePiMask; + break; case PARTY_FastTurnRight: - if ( !uTurnSpeed ) - { - v11 = (fTurnSpeedMultiplier + fTurnSpeedMultiplier) * (double)dturn; - v12 = _angle_y - (signed __int64)v11; - _angle_y = stru_5C6E00->uDoublePiMask & v12; - } - else - { - v12 = _angle_y - uTurnSpeed; - _angle_y = stru_5C6E00->uDoublePiMask & v12; - } - break; + if (!uTurnSpeed) + _angle_y -= 2.0f * fTurnSpeedMultiplier * (double)dturn; + else + _angle_y -= uTurnSpeed; + + _angle_y &= stru_5C6E00->uDoublePiMask; + break; case PARTY_StrafeLeft: - v13 = stru_5C6E00->SinCos(_angle_y - stru_5C6E00->uIntegerHalfPi); - v14 = (double)_walk_speed; - v126 = v13; - *(float *)&v128 = v14; - v124 = (unsigned __int64)(v13 * (signed __int64)((signed int)(signed __int64)(v14 * fWalkSpeedMultiplier) >> 1)) >> 16; - v2 -= v124; - v126 = stru_5C6E00->SinCos(_angle_y); - v124 = (unsigned __int64)(v126 - * (signed __int64)((signed int)(signed __int64)(*(float *)&v128 * fWalkSpeedMultiplier) >> 1)) >> 16; - goto LABEL_85; + { + *(float *)&v128 = pParty->uWalkSpeed; + + float sin_y = sinf(2 * 3.141592653589 * _angle_y / 2048.0); + int dx = sin_y * pParty->uWalkSpeed * fWalkSpeedMultiplier; + v2 -= 3 * dx / 4; + + float cos_y = cosf(2 * 3.141592653589 * _angle_y / 2048.0); + int dy = cos_y * pParty->uWalkSpeed * fWalkSpeedMultiplier; + v1 += 3 * dy / 4; + + v128 = v1; + v124 = 1; + } + break; + case PARTY_StrafeRight: - v15 = stru_5C6E00->SinCos(_angle_y - stru_5C6E00->uIntegerHalfPi); - v16 = (double)_walk_speed; - v126 = v15; - *(float *)&v128 = v16; - v124 = (unsigned __int64)(v15 * (signed __int64)((signed int)(signed __int64)(v16 * fWalkSpeedMultiplier) >> 1)) >> 16; - v2 += v124; - v126 = stru_5C6E00->SinCos(_angle_y); - v124 = (unsigned __int64)(v126 - * (signed __int64)((signed int)(signed __int64)(*(float *)&v128 * fWalkSpeedMultiplier) >> 1)) >> 16; - goto LABEL_90; + { + *(float *)&v128 = pParty->uWalkSpeed; + + float sin_y = sinf(2 * 3.141592653589 * _angle_y / 2048.0); + int dx = sin_y * pParty->uWalkSpeed * fWalkSpeedMultiplier; + v2 += 3 * dx / 4; + + float cos_y = cosf(2 * 3.141592653589 * _angle_y / 2048.0); + int dy = cos_y * pParty->uWalkSpeed * fWalkSpeedMultiplier; + v1 -= 3 * dy / 4; + + v128 = v1; + v124 = 1; + } + break; + case PARTY_WalkForward: - v17 = stru_5C6E00->SinCos(_angle_y); - v18 = (double)_walk_speed; - v126 = v17; - *(float *)&v128 = v18; - v124 = (unsigned __int64)(v17 * (signed __int64)(signed int)(signed __int64)(v18 * fWalkSpeedMultiplier)) >> 16; - v2 += v124; - v126 = stru_5C6E00->SinCos(_angle_y - stru_5C6E00->uIntegerHalfPi); - v124 = (unsigned __int64)(v126 - * (signed __int64)(signed int)(signed __int64)(*(float *)&v128 * fWalkSpeedMultiplier)) >> 16; -LABEL_85: - v1 += v124; - goto LABEL_86; - case PARTY_WalkBackward: - v19 = stru_5C6E00->SinCos(_angle_y); - v20 = (double)_walk_speed; - v126 = v19; - *(float *)&v128 = v20; - v124 = (unsigned __int64)(v19 - * (signed __int64)(signed int)(signed __int64)(v20 * fBackwardWalkSpeedMultiplier)) >> 16; - v2 -= v124; - v126 = stru_5C6E00->SinCos(_angle_y - stru_5C6E00->uIntegerHalfPi); - v124 = (unsigned __int64)(v126 - * (signed __int64)(signed int)(signed __int64)(*(float *)&v128 - * fBackwardWalkSpeedMultiplier)) >> 16; -LABEL_90: - v1 -= v124; - goto LABEL_86; + { + *(float *)&v128 = _walk_speed; + + float sin_y = sinf(2 * 3.141592653589 * _angle_y / 2048.0), + cos_y = cosf(2 * 3.141592653589 * _angle_y / 2048.0); + + int dx = cos_y * pParty->uWalkSpeed * fWalkSpeedMultiplier; + v2 += dx; + + int dy = sin_y * pParty->uWalkSpeed * fWalkSpeedMultiplier; + v1 += dy; + + v128 = v1; + v124 = 1; + } + break; + case PARTY_RunForward: - if ( pParty->bFlying ) - { - v21 = stru_5C6E00->SinCos(_angle_y); - v22 = (double)_walk_speed; - v126 = v21; - *(float *)&v128 = v22; - v129 = (unsigned __int64)(v21 - * (signed __int64)(signed int)(4 - * (unsigned __int64)(signed __int64)(v22 - * fWalkSpeedMultiplier))) >> 16; - v2 += v129; - v126 = stru_5C6E00->SinCos(_angle_y - stru_5C6E00->uIntegerHalfPi); - v129 = (unsigned __int64)(v126 - * (signed __int64)(signed int)(4 - * (unsigned __int64)(signed __int64)(*(float *)&v128 - * fWalkSpeedMultiplier))) >> 16; - v1 += v129; - goto LABEL_93; - } - if ( v118 && !v108 ) - { - v23 = stru_5C6E00->SinCos(_angle_y); - v24 = (double)_walk_speed; - v126 = v23; - *(float *)&v128 = v24; - v129 = (unsigned __int64)(v23 * (signed __int64)(signed int)(signed __int64)(v24 * fWalkSpeedMultiplier)) >> 16; - v2 += v129; - v126 = stru_5C6E00->SinCos(_angle_y - stru_5C6E00->uIntegerHalfPi); - v129 = (unsigned __int64)(v126 - * (signed __int64)(signed int)(signed __int64)(*(float *)&v128 * fWalkSpeedMultiplier)) >> 16; - v1 += v129; - goto LABEL_86; - } - v25 = stru_5C6E00->SinCos(_angle_y); - v26 = (double)_walk_speed; - v114 = v25; - *(float *)&v128 = v26; - v129 = (unsigned __int64)(v25 - * (signed __int64)(signed int)(2 - * (unsigned __int64)(signed __int64)(v26 - * fWalkSpeedMultiplier))) >> 16; - v2 += v129; - v114 = stru_5C6E00->SinCos(_angle_y - stru_5C6E00->uIntegerHalfPi); - v129 = (unsigned __int64)((signed int)v114 - * (signed __int64)(signed int)(2 - * (unsigned __int64)(signed __int64)(*(float *)&v128 - * fWalkSpeedMultiplier))) >> 16; - v1 += v129; - v114 = 1; - v128 = v1; - break; - case PARTY_RunBackward: - v27 = stru_5C6E00->SinCos(_angle_y); - v28 = (double)_walk_speed; - v126 = v27; - *(float *)&v128 = v28; - v29 = (signed __int64)(v28 * fBackwardWalkSpeedMultiplier); - if ( pParty->bFlying ) - { - v129 = (unsigned __int64)(v126 * (signed __int64)(4 * (signed int)v29)) >> 16; - v2 -= v129; - v126 = stru_5C6E00->SinCos(_angle_y - stru_5C6E00->uIntegerHalfPi); - v129 = (unsigned __int64)(v126 - * (signed __int64)(signed int)(4 - * (unsigned __int64)(signed __int64)(*(float *)&v128 - * fBackwardWalkSpeedMultiplier))) >> 16; - v1 -= v129; -LABEL_93: + { + *(float *)&v128 = _walk_speed; + + float sin_y = sinf(2 * 3.141592653589 * _angle_y / 2048.0), + cos_y = cosf(2 * 3.141592653589 * _angle_y / 2048.0); + + int dx = cos_y * pParty->uWalkSpeed * fWalkSpeedMultiplier; + int dy = sin_y * pParty->uWalkSpeed * fWalkSpeedMultiplier; + + if (pParty->bFlying) + { + v2 += 4 * dx; + v1 += 4 * dy; + v128 = v1; } - else - { - v129 = (unsigned __int64)(v126 * (signed __int64)(signed int)v29) >> 16; - v2 -= v129; - v126 = stru_5C6E00->SinCos(_angle_y - stru_5C6E00->uIntegerHalfPi); - v129 = (unsigned __int64)(v126 - * (signed __int64)(signed int)(signed __int64)(*(float *)&v128 - * fBackwardWalkSpeedMultiplier)) >> 16; - v1 -= v129; -LABEL_86: + else if (partyAtHighSlope && !v108) + { + v2 += dx; + v1 += dy; + v128 = v1; v124 = 1; } - break; + else + { + v2 += 2 * dx; + v1 += 2 * dy; + + v128 = v1; + v114 = 1; + } + } + break; + + + case PARTY_WalkBackward: + { + *(float *)&v128 = _walk_speed; + + float sin_y = sinf(2 * 3.141592653589 * _angle_y / 2048.0), + cos_y = cosf(2 * 3.141592653589 * _angle_y / 2048.0); + + int dx = cos_y * pParty->uWalkSpeed * fBackwardWalkSpeedMultiplier; + v2 -= dx; + + int dy = sin_y * pParty->uWalkSpeed * fBackwardWalkSpeedMultiplier; + v1 -= dy; + + v128 = v1; + v124 = 1; + } + break; + + + case PARTY_RunBackward: + { + float sin_y = sinf(2 * 3.141592653589 * _angle_y / 2048.0), + cos_y = cosf(2 * 3.141592653589 * _angle_y / 2048.0); + + int dx = cos_y * pParty->uWalkSpeed * fBackwardWalkSpeedMultiplier; + int dy = sin_y * pParty->uWalkSpeed * fBackwardWalkSpeedMultiplier; + + if (pParty->bFlying) + { + v2 -= 4 * dx; + v1 -= 4 * dy; + v128 = v1; + } + else + { + v2 -= dx; + v1 -= dy; + + v128 = v1; + v124 = 1; + } + } + break; + + + case PARTY_CenterView: + _angle_x = 0; + break; + case PARTY_LookUp: _angle_x += (signed __int64)(flt_6BE150_look_up_down_dangle * 25.0); if ( _angle_x > 128 ) _angle_x = 128; - v30 = uActiveCharacter; - if ( !uActiveCharacter ) - goto LABEL_118; - v95 = 0; - v93 = 63; - goto _play_player_sound; + if (uActiveCharacter) + pPlayers[uActiveCharacter]->PlaySound(63, 0); + break; + case PARTY_LookDown: _angle_x += (signed __int64)(flt_6BE150_look_up_down_dangle * -25.0); if ( _angle_x < -128 ) _angle_x = -128; - v30 = uActiveCharacter; - if ( uActiveCharacter ) - { - v95 = 0; - v93 = 64; -_play_player_sound: - pPlayers[v30]->PlaySound(v93, v95); - } - goto LABEL_118; - case PARTY_CenterView: - _angle_x = 0; - goto LABEL_118; + if (uActiveCharacter) + pPlayers[uActiveCharacter]->PlaySound(64, 0); + break; + case PARTY_Jump: - if ( (!v118 || v108) && !bJumping && pParty->field_24 && !(pParty->uFlags & 4) && !(BYTE1(pParty->uFlags) & 2) ) + if ( (!partyAtHighSlope || v108) && !bJumping && pParty->field_24 && !(pParty->uFlags & 4) && !(BYTE1(pParty->uFlags) & 2) ) { v126 = pParty->field_24 << 6; bJumping = 1; v121 = (signed __int64)((double)(pParty->field_24 << 6) * 1.5 + (double)v121); } - goto LABEL_118; + break; + default: - goto LABEL_118; + assert(false); + case PARTY_Land: - if ( pParty->bFlying ) - { - BYTE1(pParty->uFlags) |= 1u; + if (pParty->bFlying) + { + pParty->uFlags |= PARTY_FLAGS_1_LANDING; pParty->uFallSpeed = 0; } - pParty->bFlying = 0; + pParty->bFlying = false; pPartyActionQueue->uNumActions = 0; - goto LABEL_123; - } - } + break; + } + } + LABEL_123: pParty->sRotationY = _angle_y; pParty->sRotationX = _angle_x; @@ -3582,8 +3556,7 @@ v123 = v113 + v129; if ( v127 ) v123 = v113; - if ( SHIDWORD(pParty->pPartyBuffs[7].uExpireTime) >= 0 - && (SHIDWORD(pParty->pPartyBuffs[7].uExpireTime) > 0 || LODWORD(pParty->pPartyBuffs[7].uExpireTime)) ) + if (pParty->FlyActive()) stru_5E4C90._decor_events[20 * pParty->pPartyBuffs[7].uOverlayID + 119] &= 0xFEu; pParty->uFallStartY = v123; goto LABEL_141; @@ -3597,70 +3570,70 @@ if ( pParty->bFlying ) goto LABEL_130; v113 = v123; - if ( SHIDWORD(pParty->pPartyBuffs[7].uExpireTime) >= 0 - && (SHIDWORD(pParty->pPartyBuffs[7].uExpireTime) > 0 || LODWORD(pParty->pPartyBuffs[7].uExpireTime)) ) + if (pParty->FlyActive()) stru_5E4C90._decor_events[20 * pParty->pPartyBuffs[7].uOverlayID + 119] |= 1u; + LABEL_141: - v32 = 0; - if ( bJumping && !pParty->bFlying ) + if (bJumping && !pParty->bFlying) { v33 = -(pEventTimer->uTimeElapsed * GetGravityStrength()); v34 = v121 + 2 * v33; v121 += 2 * v33; - goto LABEL_149; - } - if ( !v118 ) + goto LABEL_164; + } + if (!partyAtHighSlope) { v34 = v121; -LABEL_149: - if ( bJumping == v32 ) + if (!bJumping) goto LABEL_150; goto LABEL_164; } - if ( !bJumping ) + if (!bJumping) { if ( v108 ) goto LABEL_150; + + // rolling down the hill + // how it's done: you get a little bit pushed in the air along terrain normal, getting in the air + // and falling to the gravity, gradually sliding downwards. nice trick v123 = v111; - _46DCC8_get_gravity_direction_outdoor(v116, v117, (Vec3_int_ *)&v98); + ODM_GetTerrainNormalAt(v116, v117, &v98); v35 = v121 + -8 * pEventTimer->uTimeElapsed * GetGravityStrength(); - v129 = abs((signed __int64)v2 * (signed __int64)v98 + (signed __int64)v1 * (signed __int64)v99 + (signed __int64)v35 * (signed __int64)v100) >> 16; - v127 = (BSPModel *)((unsigned __int64)(v129 * (signed __int64)v98) >> 16); - v2 += (int)v127; - v127 = (BSPModel *)((unsigned __int64)(v129 * (signed __int64)v99) >> 16); - v1 += (int)v127; + v129 = abs((signed __int64)v2 * v98.x + (signed __int64)v1 * v98.y + (signed __int64)v35 * v98.z) >> 16; + v2 += (unsigned __int64)(v129 * (signed __int64)v98.x) >> 16; + v1 += (unsigned __int64)(v129 * (signed __int64)v98.y) >> 16; + v34 = v35 + ((unsigned __int64)(v129 * (signed __int64)v98.z) >> 16); v128 = v1; - v127 = (BSPModel *)((unsigned __int64)(v129 * (signed __int64)v100) >> 16); - v34 = (int)((char *)v127 + v35); - v32 = 0; v121 = v34; - goto LABEL_149; + if (!bJumping) + goto LABEL_150; + goto LABEL_164; } v34 = v121; + LABEL_164: - if ( !bUnderwater && v34 <= v32 ) + if ( !bUnderwater && v34 <= 0) { if ( v34 < -500 && !pParty->bFlying && pParty->vPosition.z - v111 > 1000 - && SHIDWORD(pParty->pPartyBuffs[5].uExpireTime) <= 0 - && (SHIDWORD(pParty->pPartyBuffs[5].uExpireTime) < 0 || !LODWORD(pParty->pPartyBuffs[5].uExpireTime)) ) - { - v41 = &pPlayers[1]; - do - { - if ( !(*v41)->HasEnchantedItemEquipped(72) && !(*v41)->WearsItem(529, 8) && (*v41)->CanAct() ) - (*v41)->PlaySound(66, 0); - ++v41; - } - while ( (signed int)v41 <= (signed int)&pPlayers[4] ); - } - goto LABEL_151; - } + && !pParty->FeatherFallActive()) + { // falling scream + for (int i = 0; i < 4; ++i) + { + auto player = pParty->pPlayers + i; + if (!player->HasEnchantedItemEquipped(72) && !player->WearsItem(529, 8) && player->CanAct()) + player->PlaySound(66, 0); + } + } + } + else + { LABEL_150: pParty->uFallStartY = v123; -LABEL_151: - if ( v2 * v2 + v1 * v1 < 400 && !v118 ) + } + + if ( v2 * v2 + v1 * v1 < 400 && !partyAtHighSlope ) { *(float *)&v128 = 0.0; v2 = 0; @@ -3720,8 +3693,8 @@ &v130, &v110, 0); - v127 = (BSPModel *)GetTerrainHeightsAroundParty(_angle_x, v117); - v42 = GetTerrainHeightsAroundParty(v116, _angle_y); + v127 = (BSPModel *)IsTerrainSlopeTooHigh(_angle_x, v117); + v42 = IsTerrainSlopeTooHigh(v116, _angle_y); v107 = 0; v118 = v42; if ( !v97 && !v110 && !v108 ) @@ -3746,7 +3719,7 @@ &v130, &v108, 0); - if ( GetTerrainHeightsAroundParty(_angle_x, _angle_y) && (signed int)v127 <= v123 ) + if ( IsTerrainSlopeTooHigh(_angle_x, _angle_y) && (signed int)v127 <= v123 ) { v43 = 1; LABEL_197: @@ -3772,15 +3745,15 @@ v117 = _angle_y; v45 = stru_721530.uFaceID; v123 = v40; - if ( (stru_721530.uFaceID & 7) == 3 ) - { - if ( SHIDWORD(pParty->pPartyBuffs[11].uExpireTime) >= 0 - && (SHIDWORD(pParty->pPartyBuffs[11].uExpireTime) > 0 || LODWORD(pParty->pPartyBuffs[11].uExpireTime)) ) - pParty->pPartyBuffs[11].Reset(); + if ( (stru_721530.uFaceID & 7) == OBJECT_Actor) + { + if (pParty->Invisible()) + pParty->pPartyBuffs[PARTY_BUFF_INVISIBILITY].Reset(); + viewparams->bRedrawGameUI = 1; goto LABEL_234; } - if ( (stru_721530.uFaceID & 7) == 5 ) + if ( (stru_721530.uFaceID & 7) == OBJECT_Decoration) { v56 = sub_452A9E(v2 * v2 + v128 * v128); v118 = v56; @@ -3801,7 +3774,7 @@ } else { - if ( (stru_721530.uFaceID & 7) == 6 ) + if ( (stru_721530.uFaceID & 7) == OBJECT_BModel) { pParty->bFlying = 0; v46 = &pOutdoor->pBModels[(signed int)stru_721530.uFaceID >> 9]; @@ -9430,77 +9403,95 @@ //----- (004823F4) -------------------------------------------------------- -bool __fastcall GetTerrainHeightsAroundParty(int a1, int a2) -{ - unsigned int v2; // ebx@1 - unsigned int v3; // edi@1 - int v4; // eax@1 - int v6; // esi@5 - int v7; // ecx@6 - int v8; // edx@6 - int v9; // eax@6 - int v10; // esi@10 - int v11; // [sp+14h] [bp-8h]@1 - int v12; // [sp+18h] [bp-4h]@1 - - v12 = a1; - v11 = a2; - v2 = WorldPosToGridCellX(a1); - v3 = WorldPosToGridCellZ(v11) - 1; - dword_76D568_terrain_cell_world_pos_around_party_x = GridCellToWorldPosX(v2); - dword_76D56C_terrain_cell_world_pos_around_party_x = GridCellToWorldPosX(v2 + 1); - dword_76D570_terrain_cell_world_pos_around_party_x = GridCellToWorldPosX(v2 + 1); - dword_76D574_terrain_cell_world_pos_around_party_x = GridCellToWorldPosX(v2); - dword_76D558_terrain_cell_world_pos_around_party_z = GridCellToWorldPosZ(v3); - dword_76D55C_terrain_cell_world_pos_around_party_z = GridCellToWorldPosZ(v3); - dword_76D560_terrain_cell_world_pos_around_party_z = GridCellToWorldPosZ(v3 + 1); - dword_76D564_terrain_cell_world_pos_around_party_z = GridCellToWorldPosZ(v3 + 1); - dword_76D548_terrain_cell_world_pos_around_party_y = pOutdoor->DoGetHeightOnTerrain(v2, v3); - dword_76D54C_terrain_cell_world_pos_around_party_y = pOutdoor->DoGetHeightOnTerrain(v2 + 1, v3); - dword_76D550_terrain_cell_world_pos_around_party_y = pOutdoor->DoGetHeightOnTerrain(v2 + 1, v3 + 1); - v4 = pOutdoor->DoGetHeightOnTerrain(v2, v3 + 1); - dword_76D554_terrain_cell_world_pos_around_party_y = v4; - if ( dword_76D548_terrain_cell_world_pos_around_party_y == dword_76D54C_terrain_cell_world_pos_around_party_y - && dword_76D54C_terrain_cell_world_pos_around_party_y == dword_76D550_terrain_cell_world_pos_around_party_y - && dword_76D550_terrain_cell_world_pos_around_party_y == v4 ) - return 0; - v6 = abs(v12 - dword_76D568_terrain_cell_world_pos_around_party_x); - if ( abs(dword_76D558_terrain_cell_world_pos_around_party_z - v11) >= v6 ) - { - v7 = dword_76D554_terrain_cell_world_pos_around_party_y; - v8 = dword_76D550_terrain_cell_world_pos_around_party_y; - v9 = dword_76D548_terrain_cell_world_pos_around_party_y; - } - else - { - v7 = dword_76D54C_terrain_cell_world_pos_around_party_y; - v8 = dword_76D548_terrain_cell_world_pos_around_party_y; - v9 = dword_76D550_terrain_cell_world_pos_around_party_y; - } - if ( v7 >= v8 ) - { - v10 = v8; - if ( v8 < v9 ) +bool IsTerrainSlopeTooHigh(int pos_x, int pos_z) +{ + //unsigned int v2; // ebx@1 + //unsigned int v3; // edi@1 + //int v4; // eax@1 + //int v6; // esi@5 + //int v7; // ecx@6 + //int v8; // edx@6 + //int v9; // eax@6 + //int v10; // esi@10 + //int v11; // [sp+14h] [bp-8h]@1 + //int v12; // [sp+18h] [bp-4h]@1 + + //v12 = a1; + //v11 = a2; + auto grid_x = WorldPosToGridCellX(pos_x); + auto grid_z = WorldPosToGridCellZ(pos_z) - 1; + + auto party_grid_x1 = GridCellToWorldPosX(grid_x); + //dword_76D56C_terrain_cell_world_pos_around_party_x = GridCellToWorldPosX(grid_x + 1); + //dword_76D570_terrain_cell_world_pos_around_party_x = GridCellToWorldPosX(grid_x + 1); + //dword_76D574_terrain_cell_world_pos_around_party_x = GridCellToWorldPosX(grid_x); + auto party_grid_z1 = GridCellToWorldPosZ(grid_z); + //dword_76D55C_terrain_cell_world_pos_around_party_z = GridCellToWorldPosZ(grid_z); + //dword_76D560_terrain_cell_world_pos_around_party_z = GridCellToWorldPosZ(grid_z + 1); + //dword_76D564_terrain_cell_world_pos_around_party_z = GridCellToWorldPosZ(grid_z + 1); + auto party_x1z1_y = pOutdoor->DoGetHeightOnTerrain(grid_x, grid_z); + auto party_x2z1_y = pOutdoor->DoGetHeightOnTerrain(grid_x + 1, grid_z); + auto party_x2z2_y = pOutdoor->DoGetHeightOnTerrain(grid_x + 1, grid_z + 1); + auto party_x1z2_y = pOutdoor->DoGetHeightOnTerrain(grid_x, grid_z + 1); + //dword_76D554_terrain_cell_world_pos_around_party_y = v4; + if (party_x1z1_y == party_x2z1_y && + party_x2z1_y == party_x2z2_y && + party_x2z2_y == party_x1z2_y ) + return false; + + auto dx = abs(pos_x - party_grid_x1), + dz = abs(party_grid_z1 - pos_z); + + int y1, y2, y3; + if (dz >= dx) + { + y1 = party_x1z2_y; // lower-left triangle + y2 = party_x2z2_y; // y3 | \ + y3 = party_x1z1_y; // | \ + /* | \ + |______ \ + y1 y2 */ + } + else + { + y1 = party_x2z1_y; // upper-right + y2 = party_x1z1_y; // y2_______ y1 + y3 = party_x2z2_y; // \ | + /* \ | + \ | + y3 */ + } + + int y_min = min(y1, min(y2, y3)), + y_max = max(y1, max(y2, y3)); + return y_max - y_min > 512; + + /*if ( y1 >= y2 ) + { + y_min = y2; + if ( y2 < y3 ) goto LABEL_13; LABEL_12: - v10 = v9; + y_min = y3; goto LABEL_13; } - if ( v7 >= v9 ) + else if ( y1 >= y3 ) goto LABEL_12; - v10 = v7; + else + y_min = y1; + LABEL_13: - if ( v7 <= v8 ) - { - if ( v8 > v9 ) - v9 = v8; - } - else - { - if ( v7 > v9 ) - v9 = v7; - } - return v9 - v10 > 512; + if ( y1 <= y2 ) + { + if ( y2 > y3 ) + y3 = y2; + } + else + { + if ( y1 > y3 ) + y3 = y1; + } + return y3 - v10 > 512;*/ } @@ -12928,7 +12919,7 @@ v37 = v21 / x; LODWORD(v31) = v12->scale; v37 = v21 / x; - v15->field_0 = (unsigned __int64)(SLODWORD(v31) * v21 / x) >> 16; + v15->_screenspace_x_scaler_packedfloat = (unsigned __int64)(SLODWORD(v31) * v21 / x) >> 16; v37 = (unsigned __int64)(v12->scale * (signed __int64)v37) >> 16; } else @@ -12945,7 +12936,7 @@ v37 = v20 / x; LODWORD(v31) = v12->scale; v37 = (unsigned __int64)(SLODWORD(v31) * v20 / x) >> 16; - v15->field_0 = (unsigned __int64)(SLODWORD(v31) * v20 / x) >> 16; + v15->_screenspace_x_scaler_packedfloat = (unsigned __int64)(SLODWORD(v31) * v20 / x) >> 16; v31 = v15->fov_y; v25 = v31 + 6.7553994e15; LODWORD(v20) = 0; @@ -12954,7 +12945,7 @@ v37 = (unsigned __int64)(v12->scale * v20 / x) >> 16; } HIWORD(v22) = HIWORD(x); - v15->field_4 = v37; + v15->_screenspace_y_scaler_packedfloat = v37; v15->field_1E = v30; v15->some_x = a1; v15->some_y = a2; @@ -13113,7 +13104,7 @@ LODWORD(v19) = pBLVRenderParams->field_40 << 16; HIDWORD(v19) = pBLVRenderParams->field_40 >> 16; v20 = v19 / x; - v3->field_0 = (unsigned __int64)(v24->scale * v19 / x) >> 16; + v3->_screenspace_x_scaler_packedfloat = (unsigned __int64)(v24->scale * v19 / x) >> 16; v31 = (unsigned __int64)(v24->scale * (signed __int64)v20) >> 16; } else @@ -13121,11 +13112,11 @@ v3->fov_x = pGame->pIndoorCameraD3D->fov_x; v3->fov_y = pGame->pIndoorCameraD3D->fov_y; v18 = (int)floorf(v3->fov_x + 0.5f) / x; - v3->field_0 = (unsigned __int64)(v24->scale * (__int64)v18) >> 16; + v3->_screenspace_x_scaler_packedfloat = (unsigned __int64)(v24->scale * (__int64)v18) >> 16; v31 = (unsigned __int64)(v24->scale * (__int64)v18) >> 16; } HIWORD(v21) = HIWORD(x); - v3->field_4 = v31; + v3->_screenspace_y_scaler_packedfloat = v31; v3->field_1E = v34; v3->some_x = a1; v3->some_y = a2; @@ -13302,13 +13293,13 @@ //----- (0044100D) -------------------------------------------------------- bool __cdecl sub_44100D() { - return pCurrentScreen == 4 - || pCurrentScreen == 7 - || pCurrentScreen > 12 - && (pCurrentScreen <= 14 - || pCurrentScreen > 16 - && (pCurrentScreen <= 18 - || pCurrentScreen == 23)); + return pCurrentScreen == SCREEN_NPC_DIALOGUE + || pCurrentScreen == SCREEN_CHARACTERS + || pCurrentScreen > SCREEN_LOADGAME + && (pCurrentScreen <= SCREEN_E + || pCurrentScreen > SCREEN_VIDEO + && (pCurrentScreen <= SCREEN_INPUT_BLV + || pCurrentScreen == SCREEN_CASTING)); } // 4E28F8: using guessed type int pCurrentScreen; @@ -13321,16 +13312,16 @@ IconFrame *v3; // eax@19 if ( !pCurrentScreen - || pCurrentScreen == 1 - || pCurrentScreen == 2 - || pCurrentScreen == 5 - || pCurrentScreen == 8 - || pCurrentScreen == 10 - || pCurrentScreen == 11 - || pCurrentScreen == 12 - || pCurrentScreen == 15 - || pCurrentScreen == 3 - || pCurrentScreen == 19 ) + || pCurrentScreen == SCREEN_MENU + || pCurrentScreen == SCREEN_OPTIONS + || pCurrentScreen == SCREEN_REST + || pCurrentScreen == SCREEN_SPELL_BOOK + || pCurrentScreen == SCREEN_CHEST + || pCurrentScreen == SCREEN_SAVEGAME + || pCurrentScreen == SCREEN_LOADGAME + || pCurrentScreen == SCREEN_F + || pCurrentScreen == SCREEN_BOOKS + || pCurrentScreen == SCREEN_BRANCHLESS_NPC_DIALOG ) { if ( SHIDWORD(pParty->pPartyBuffs[16].uExpireTime) >= 0 && (SHIDWORD(pParty->pPartyBuffs[16].uExpireTime) > 0 || LODWORD(pParty->pPartyBuffs[16].uExpireTime)) ) @@ -13421,7 +13412,7 @@ } while ( v1 < 14 ); if ( !pCurrentScreen - || pCurrentScreen == 4 ) + || pCurrentScreen == SCREEN_NPC_DIALOGUE ) { if ( (signed __int64)pParty->pPartyBuffs[7].uExpireTime > 0 ) { @@ -13536,8 +13527,8 @@ v13 = (unsigned __int64)(v11 * (signed __int64)v13) >> 16; v10.uScreenSpaceX = *((short *)v3 - 2); v10.uScreenSpaceY = *((short *)v3 - 1); - v10.field_10 = v13; - v10.field_14 = v13; + v10._screenspace_x_scaler_packedfloat = v13; + v10._screenspace_y_scaler_packedfloat = v13; v10.pPalette = PaletteManager::Get_Dark_or_Red_LUT(v6->uPaletteIndex, 0, 1); v8 = *((short *)v3 - 5); v10.sZValue = 0; @@ -13562,30 +13553,21 @@ //----- (00441D38) -------------------------------------------------------- -void GameUI_DrawMinimap(unsigned int uX, unsigned int uY, unsigned int uZ, unsigned int uW, unsigned int uZoom, unsigned int flags) +void GameUI_DrawMinimap(unsigned int uX, unsigned int uY, unsigned int uZ, unsigned int uW, unsigned int uZoom, unsigned int bRedrawOdmMinimap) { int uHeight; // ebx@6 - //unsigned int v9; // edx@9 - //unsigned int v10; // ebx@10 __int16 v11; // cx@11 - //BLVFace *v12; // ecx@17 - //unsigned int v13; // ecx@21 unsigned int v14; // ebx@23 int v15; // eax@23 - //unsigned int *v16; // ecx@28 __int16 v17; // di@30 double v18; // st7@30 float v19; // ST38_4@30 double v20; // st7@30 double v21; // st6@30 double v22; // st5@33 - //unsigned __int16 *v26; // edx@37 signed int v27; // eax@37 unsigned __int16 *v28; // ecx@37 signed int v29; // edi@40 - //int v30; // eax@42 - //unsigned __int16 *v31; // ebx@43 - //signed int v32; // edi@46 signed int v33; // ebx@50 unsigned int v34; // eax@50 signed int v35; // ecx@50 @@ -13603,7 +13585,6 @@ int v47; // eax@108 unsigned int v48; // ebx@114 unsigned int v49; // ST64_4@114 - //double v50; // ST20_8@117 unsigned int v51; // [sp-10h] [bp-64h]@79 unsigned int v52; // [sp-10h] [bp-64h]@100 unsigned int v53; // [sp-Ch] [bp-60h]@79 @@ -13615,9 +13596,7 @@ unsigned __int16 v59; // [sp-4h] [bp-58h]@100 unsigned __int16 v60; // [sp+10h] [bp-44h]@66 unsigned int v61; // [sp+10h] [bp-44h]@85 - //unsigned __int16 *v62; // [sp+14h] [bp-40h]@30 unsigned int v63; // [sp+14h] [bp-40h]@85 - //int v64; // [sp+18h] [bp-3Ch]@39 unsigned int v65; // [sp+18h] [bp-3Ch]@85 unsigned int lPitch; // [sp+20h] [bp-34h]@1 unsigned int lPitcha; // [sp+20h] [bp-34h]@23 @@ -13627,34 +13606,24 @@ unsigned __int16 uBlue; // [sp+28h] [bp-2Ch]@1 signed int uBluea; // [sp+28h] [bp-2Ch]@37 int v73; // [sp+2Ch] [bp-28h]@30 - //unsigned __int8 *v74; // [sp+30h] [bp-24h]@30 int v76; // [sp+34h] [bp-20h]@91 int v77; // [sp+34h] [bp-20h]@108 - //signed int v78; // [sp+38h] [bp-1Ch]@37 int v79; // [sp+38h] [bp-1Ch]@72 - //signed int a2b; // [sp+40h] [bp-14h]@41 char *a2c; // [sp+40h] [bp-14h]@68 - //int a3a; // [sp+44h] [bp-10h]@40 signed int uCenterY; // [sp+48h] [bp-Ch]@1 signed int uCenterX; // [sp+4Ch] [bp-8h]@1 - //signed int uZb; // [sp+5Ch] [bp+8h]@27 signed int uWidth; // [sp+5Ch] [bp+8h]@30 - //signed int uZd; // [sp+5Ch] [bp+8h]@45 signed int uZe; // [sp+5Ch] [bp+8h]@67 signed int uZf; // [sp+5Ch] [bp+8h]@85 signed int uZg; // [sp+5Ch] [bp+8h]@105 unsigned int uWa; // [sp+60h] [bp+Ch]@23 float uWb; // [sp+60h] [bp+Ch]@30 - //unsigned __int16 *uWc; // [sp+60h] [bp+Ch]@37 unsigned int uWd; // [sp+60h] [bp+Ch]@95 float uZooma; // [sp+64h] [bp+10h]@117 - //signed int flagsa; // [sp+68h] [bp+14h]@42 unsigned int flagsb; // [sp+68h] [bp+14h]@66 Actor *flagsc; // [sp+68h] [bp+14h]@86 unsigned int flagsd; // [sp+68h] [bp+14h]@105 - //a3 = uY; - //a2 = uX; uCenterX = (uX + uZ) / 2; uCenterY = (uY + uW) / 2; lPitch = pRenderer->uTargetSurfacePitch; @@ -13710,78 +13679,46 @@ default: assert(false); } -//LABEL_37: - //v23 = v20 * 65536.0; - //v24 = v23 + 6.7553994e15; + assert(sizeof(pOdmMinimap) == 137 * 117 * sizeof(short)); + v70 = floorf(v20 * 65536.0 + 0.5f);//LODWORD(v24); - //uWe = uWb * 65536.0; - //v25 = uWe + 6.7553994e15; - //v78 = v70; uBluea = floorf(uWb * 65536.0 + 0.5f);//LODWORD(v25); v27 = uBluea >> 16; v28 = &pRenderer->pTargetSurface[uX + uY * lPitch]; - if ( flags && pMapLod0) - { - auto pMinimap = (unsigned __int16 *)_56EFD8_minimap; - //if ( v74 ) - //{ + if (pMapLod0 && bRedrawOdmMinimap) + { + assert(uWidth == 137 && uHeight == 117); + //auto pMinimap = (unsigned __int16 *)pOdmMinimap; + auto mapWidth = pIcons_LOD->pTextures[viewparams->uTextureID_LocationMap].uTextureWidth; - //if ( uHeight > 0 ) - //{ - //a3a = uHeight; + v29 = v70 >> 16; - //do + for (int y = 0; y < uHeight; ++y) { - //a2b = 0; - //if ( uWidth > 0 ) - //{ auto pMapLod0Line = &pMapLod0[v27 * mapWidth]; - //flagsa = uWidth; - //a2b = uWidth; for (int x = 0; x < uWidth; ++x) - //do - { - //v31 = uWc; - //++uWc; - *pMinimap++ = pPal[pMapLod0Line[v29]]; - //v78 += v73; + { + //*pMinimap++ = pPal[pMapLod0Line[v29]]; + pOdmMinimap[y][x] = pPal[pMapLod0Line[v29]]; v29 = (v70 + x * v73) >> 16; - //--flagsa; - } - //while ( flagsa ); - //} - //v78 = v70; + } + v29 = v70 >> 16; v28 += 137 - uWidth; uBluea += v73; v27 = uBluea >> 16; - //--a3a; - } - //while ( a3a ); - //} - //} - } - - auto pMinimap = (unsigned __int16 *)_56EFD8_minimap; - //uZd = 117; - //do + } + } + for (int y = 0; y < 117; ++y) { - //v32 = 137; - //do for (int x = 0; x < 137; ++x) { - *v28++ = *pMinimap++; - //++v28; - //++v26; - //--v32; - } - //while ( v32 ); + *v28++ = pOdmMinimap[y][x]; + } v28 += lPitch - 137; - //--uZd; - } - //while ( uZd ); + } uNumBlueFacesInBLVMinimap = 0; } else @@ -13919,7 +13856,7 @@ v36 = 255; flagsb = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0, 0, 0xFFu); v60 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0, 0); - if ( bWizardEyeActive ) + if ( bWizardEyeActive = true) { uZe = 0; //for (uint i = 0; i < uNumLayingItems; ++i) @@ -16342,7 +16279,7 @@ do { v30 = *v55; - if ( *v55 == 5 || v30 == 11 || v30 == 19 || (v31 = *((int *)v55 + 159)) != 0 && (v31 & 7) == 4 ) + if ( *v55 == Dead || v30 == Removed || v30 == Disabled || (v31 = *((int *)v55 + 159)) != 0 && (v31 & 7) == OBJECT_Player) ++pInString; v55 += 418; --*(int *)v54; @@ -17997,7 +17934,7 @@ pGameLoadingUI_ProgressBar->uType = (GUIProgressBar::Type)((_5C3420_pDecoration == 0) + 1); sub_44987B(v99, 0); v133 = 1; - if ( pCurrentScreen == 13 ) + if ( pCurrentScreen == SCREEN_HOUSE ) { if ( uGameState == 2 ) { @@ -18010,7 +17947,7 @@ ptr_507BC0 = 0; if ( pMessageQueue_50CBD0->uNumMessages ) pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; - pCurrentScreen = 0; + pCurrentScreen = SCREEN_GAME; viewparams->bRedrawGameUI = 1; array_5913D8[6] = 0; pDialogueWindow->Release(); @@ -19500,7 +19437,7 @@ dword_5B65C0 = 0; pGameLoadingUI_ProgressBar->uType = GUIProgressBar::TYPE_Fullscreen; sub_44987B("nwc.blv", 0); - pCurrentScreen = 0; + pCurrentScreen = SCREEN_GAME; result = 1; } return result; @@ -20442,12 +20379,12 @@ v21->pMonsterInfo.uHostilityType = MonsterInfo::Hostility_Friendly; a2 = *v20; v76 = a2 & 7; - if ( (a2 & 7) == 3 ) + if ( (a2 & 7) == OBJECT_Actor) v80 = 0.5; else v80 = 1.0; v22 = v21->uAIState; - if ( v22 == 4 || v22 == 5 || v22 == 11 || v22 == 19 || v22 == 17 ) + if ( v22 == Dying || v22 == Dead || v22 == Removed || v22 == Disabled || v22 == Summoned) goto LABEL_254; if ( !v21->sCurrentHP ) Actor::Die(uActorID); @@ -20965,7 +20902,7 @@ v2 = this->pQueue; do { - if ( (v2->uPackedID & 7) == 3 ) + if ( (v2->uPackedID & 7) == OBJECT_Actor ) { v3 = &pActors[v2->uPackedID >> 3]; v4 = &pActors[v2->uPackedID >> 3]; @@ -20977,7 +20914,7 @@ LOBYTE(v3->uAttributes) &= 0x7Fu; } } - if ( (v2->uPackedID & 7) == 4 ) + if ( (v2->uPackedID & 7) == OBJECT_Player) { v5 = &pParty->pPlayers[v2->uPackedID >> 3]; if ( v5->pConditions[14] @@ -21013,7 +20950,7 @@ v10 = v7->field_4; if ( v9 < v10 || v9 == v10 - && ((v11 = v8->uPackedID & 7, v11 == 4) && (v7->uPackedID & 7) == 3 + && ((v11 = v8->uPackedID & 7, v11 == OBJECT_Player) && (v7->uPackedID & 7) == OBJECT_Actor || v11 == (v7->uPackedID & 7) && (v8->uPackedID & 0xFFFFFFF8) < (v7->uPackedID & 0xFFFFFFF8)) ) { v12 = v7->uPackedID; @@ -21042,7 +20979,7 @@ } v1->uActorQueueSize = v19; result = v1->pQueue[0].uPackedID; - if ( (v1->pQueue[0].uPackedID & 7) == 4 ) + if ( (v1->pQueue[0].uPackedID & 7) == OBJECT_Player) { result = (result >> 3) + 1; uActiveCharacter = result; @@ -21059,7 +20996,7 @@ v17 = v1->pQueue; do { - if ( (v17->uPackedID & 7) == 4 ) + if ( (v17->uPackedID & 7) == OBJECT_Player) pParty->pPlayers[v17->uPackedID >> 3].uTimeToRecovery = (signed __int64)((double)v17->field_4 * 0.46875); ++v22; ++v17; diff -r 2cb13d295f4b -r 8e0e2991f9d1 mm7_4.cpp --- a/mm7_4.cpp Tue Feb 12 18:16:18 2013 +0600 +++ b/mm7_4.cpp Tue Feb 12 18:16:34 2013 +0600 @@ -977,118 +977,80 @@ return dword_720F20[v22]; } + +//not sure if right- or left-handed coordinate space assumed, so this could be normal of inverse normal +// for a right-handed system, that would be an inverse normal //----- (0046DCC8) -------------------------------------------------------- -signed __int64 __fastcall _46DCC8_get_gravity_direction_outdoor(int a1, int a2, Vec3_int_ *a3) -{ - int v3; // ebx@1 - int v4; // ST4C_4@1 - unsigned int v5; // ST54_4@1 - unsigned int v6; // edi@1 - unsigned int v7; // ST50_4@1 - int v8; // edi@1 - int v9; // esi@1 - int v10; // ebx@1 - int v11; // ecx@2 - int v12; // eax@2 - int v13; // edx@2 - int v14; // ebx@2 - double v15; // st7@4 - double v16; // st6@4 - double v17; // st5@4 - float v18; // ST44_4@4 - float v19; // ST54_4@4 - double v20; // st4@4 - double v21; // st5@4 - float v22; // ST44_4@6 - double v23; // st7@4 - double v24; // st7@6 - signed __int64 result; // qax@6 - int v26; // [sp+14h] [bp-44h]@1 - int v27; // [sp+18h] [bp-40h]@1 - int v28; // [sp+20h] [bp-38h]@1 - int v29; // [sp+24h] [bp-34h]@1 - int v30; // [sp+28h] [bp-30h]@1 - int v31; // [sp+2Ch] [bp-2Ch]@1 - int v32; // [sp+30h] [bp-28h]@1 - int v33; // [sp+34h] [bp-24h]@1 - int v34; // [sp+38h] [bp-20h]@1 - int v35; // [sp+3Ch] [bp-1Ch]@1 - int v36; // [sp+40h] [bp-18h]@1 - int v37; // [sp+4Ch] [bp-Ch]@2 - float v38; // [sp+4Ch] [bp-Ch]@4 - int v39; // [sp+50h] [bp-8h]@2 - float v40; // [sp+50h] [bp-8h]@4 - int v41; // [sp+54h] [bp-4h]@2 - - v3 = a1; - v4 = a2; - v5 = WorldPosToGridCellX(a1); - v6 = WorldPosToGridCellZ(v4) - 1; - v33 = GridCellToWorldPosX(v5); - v34 = GridCellToWorldPosX(v5 + 1); - v35 = GridCellToWorldPosX(v5 + 1); - v36 = GridCellToWorldPosX(v5); - v29 = GridCellToWorldPosZ(v6); - v30 = GridCellToWorldPosZ(v6); - v7 = v6 + 1; - v31 = GridCellToWorldPosZ(v6 + 1); - v32 = GridCellToWorldPosZ(v6 + 1); - v26 = pOutdoor->DoGetHeightOnTerrain(v5, v6); - v27 = pOutdoor->DoGetHeightOnTerrain(v5 + 1, v6); - v8 = pOutdoor->DoGetHeightOnTerrain(v5 + 1, v6 + 1); - v28 = pOutdoor->DoGetHeightOnTerrain(v5, v7); - v9 = v29; - v10 = abs(v3 - v33); - if ( abs(v29 - v4) >= v10 ) - { - v11 = v33; - v37 = v28; - v39 = v36; - v12 = v35; - v41 = v32; - v13 = v31; - v14 = v8; - v8 = v26; - } - else - { - v11 = v35; - v41 = v30; - v39 = v34; - v12 = v33; - v13 = v29; - v9 = v31; - v37 = v27; - v14 = v26; - } - v15 = (double)(v12 - v39); - v16 = (double)(v13 - v41); - v17 = (double)(v14 - v37); - v18 = (double)(v11 - v39); - v19 = (double)(v9 - v41); - v20 = (double)(v8 - v37); - v38 = v20 * v16 - v19 * v17; - v40 = v18 * v17 - v20 * v15; - v21 = v19 * v15 - v18 * v16; - v23 = sqrt(v21 * v21 + v40 * v40 + v38 * v38); - if ( v23 == 0.0 ) - { - a3->y = 0; - a3->x = 0; - a3->z = 65536; - } - v24 = 1.0 / v23; - a3->x = (signed __int64)(v24 * v38 * 65536.0); - a3->y = (signed __int64)(v24 * v40 * 65536.0); - v22 = v21; - result = (signed __int64)(v24 * v22 * 65536.0); - a3->z = result; - return result; -} -// 47F44B: using guessed type int __stdcall WorldPosToGridCellX(int); -// 47F458: using guessed type int __stdcall WorldPosToGridCellZ(int); -// 47F469: using guessed type int __stdcall GridCellToWorldPosX(int); -// 47F476: using guessed type int __stdcall GridCellToWorldPosZ(int); +void ODM_GetTerrainNormalAt(int pos_x, int pos_z, Vec3_int_ *out) +{ + auto grid_x = WorldPosToGridCellX(pos_x); + auto grid_z = WorldPosToGridCellZ(pos_z) - 1; + + auto grid_pos_x1 = GridCellToWorldPosX(grid_x); + auto grid_pos_x2 = GridCellToWorldPosX(grid_x + 1); + auto grid_pos_z1 = GridCellToWorldPosZ(grid_z); + auto grid_pos_z2 = GridCellToWorldPosZ(grid_z + 1); + + auto x1z1_y = pOutdoor->DoGetHeightOnTerrain(grid_x, grid_z); + auto x2z1_y = pOutdoor->DoGetHeightOnTerrain(grid_x + 1, grid_z); + auto x2z2_y = pOutdoor->DoGetHeightOnTerrain(grid_x + 1, grid_z + 1); + auto x1z2_y = pOutdoor->DoGetHeightOnTerrain(grid_x, grid_z + 1); + + float side1_dx, side1_dy, side1_dz, + side2_dx, side2_dy, side2_dz; + + auto dx = abs(pos_x - grid_pos_x1), + dz = abs(grid_pos_z1 - pos_z); + if (dz >= dx) + { + side1_dy = (double)(x1z1_y - x1z2_y); + side2_dy = (double)(x2z2_y - x1z2_y); + side2_dx = (double)(grid_pos_x2 - grid_pos_x1); + side1_dx = (double)(grid_pos_x1 - grid_pos_x1); + side2_dz = (double)(grid_pos_z2 - grid_pos_z2); // bug? z2 - z2 + side1_dz = (double)(grid_pos_z2 - grid_pos_z2); // z1 - z2 + Log::Warning(L"%s %s %u\n", __FILE__, __FUNCTION__, __LINE__); + /* |\ + side1 | \ + |____\ + side 2 */ + } + else + { + side1_dy = (double)(x2z2_y - x2z1_y); + side2_dy = (double)(x1z1_y - x2z1_y); + side2_dx = (double)(grid_pos_x1 - grid_pos_x2); + side1_dx = (double)(grid_pos_x2 - grid_pos_x2); + side2_dz = (double)(grid_pos_z1 - grid_pos_z1); + side1_dz = (double)(grid_pos_z2 - grid_pos_z1); + + /* side 2 + _____ + \ | + \ | side 1 + \| */ + } + + float nx = side1_dy * side2_dz - side1_dz * side2_dy; + float ny = side1_dx * side2_dy - side1_dy * side2_dx; + float nz = side1_dz * side2_dx - side1_dx * side2_dz; + + float mag = sqrt(nx * nx + ny * ny + nz * nz); + if (fabsf(mag) < 1e-6f) + { + out->y = 0; + out->x = 0; + out->z = 65536; + } + else + { + float invmag = 1.0 / mag; + out->x = invmag * nx * 65536.0; + out->y = invmag * ny * 65536.0; + out->z = invmag * nz * 65536.0; + } +} + //----- (0046DEF2) -------------------------------------------------------- unsigned int __fastcall sub_46DEF2(signed int a2, unsigned int uLayingItemID) @@ -1303,7 +1265,7 @@ do { v4 = *v3; - if ( (v4 & 7) == 5 ) + if ( (v4 & 7) == OBJECT_Decoration) { v5 = &pLevelDecorations[(signed __int16)v4 >> 3]; if ( !(v5->field_2 & 0x20) ) @@ -3097,7 +3059,7 @@ for (uint i = 0; i < pNPCStats->uNumNewNPCs; ++i) { - if (pNPCStats->pNewNPCData[i].uFlags & 0x80) + if (pNPCStats->pNewNPCData[i].uFlags == 128) { if (!pParty->pHirelings[0].pName || strcmp(pNPCStats->pNewNPCData[i].pName, pParty->pHirelings[0].pName)) { @@ -3273,7 +3235,7 @@ { if ( pTurnEngine->field_4 != 1 ) { - if ( (pTurnEngine->pQueue[0].uPackedID & 7) == 4 ) + if ( (pTurnEngine->pQueue[0].uPackedID & 7) == OBJECT_Player) { //v14 = 0; if ( pTurnEngine->uActorQueueSize > 0 ) @@ -3283,7 +3245,7 @@ { auto pElem = pTurnEngine->pQueue + i; - if ( (pElem->uPackedID & 7) != 4 ) + if ( (pElem->uPackedID & 7) != OBJECT_Player) break; v16 = dword_5079D0; if ( pParty->uFlags & 0x10 ) @@ -4216,7 +4178,7 @@ v51 = v65; if ( v65 ) goto LABEL_135; - if ( pCurrentScreen != 5 ) + if ( pCurrentScreen != SCREEN_REST ) { v52 = (signed int)&pPlayers[1]; while ( 1 ) @@ -4232,13 +4194,13 @@ *(int *)(v53 + 20) = 0; v51 = 1; LABEL_135: - if ( pCurrentScreen != 5 + if ( pCurrentScreen != SCREEN_REST && (!v51 || dword_5C35C0) ) uGameState = 8; } if ( uActiveCharacter ) { - if ( pCurrentScreen != 5 ) + if ( pCurrentScreen != SCREEN_REST ) { v54 = pPlayers[uActiveCharacter]; if ( v54->pConditions[2] @@ -5743,7 +5705,7 @@ ++pIcons_LOD->uTexturePacksCount; if ( !pIcons_LOD->uNumPrevLoadedFiles ) pIcons_LOD->uNumPrevLoadedFiles = pIcons_LOD->uNumLoadedFiles; - pCurrentScreen = 21;// + pCurrentScreen = SCREEN_PARTY_CREATION; uPlayerCreationUI_ArrowAnim = 0; uPlayerCreationUI_SkySliderPos = 0; uPlayerCreationUI_SelectedCharacter = 0; @@ -6245,7 +6207,7 @@ free(pString); pWindow_MainMenu = GUIWindow::Create(0, 0, 640, 480, WINDOW_MainMenu, 0, (int)ptr); pWindow_MainMenu->CreateButton(0, 0, 0, 0, 1, 0, 0x71u, 0, 0x1Bu, "", 0); - pCurrentScreen = 9; // Credits + pCurrentScreen = SCREEN_CREATORS; SetCurrentMenuID(MENU_Credits); do { @@ -6274,7 +6236,7 @@ if ( a5 >= (signed __int16)pTexture2.uHeight ) SetCurrentMenuID(MENU_MAIN); pRenderer->Present(); - pCurrentScreen = 0;//Ritor1: temporarily, must be corrected GUI_MainMenuMessageProc() + pCurrentScreen = SCREEN_GAME;//Ritor1: temporarily, must be corrected GUI_MainMenuMessageProc() GUI_MainMenuMessageProc(); } } @@ -9708,7 +9670,8 @@ } Party::TakeGold(v21); } - LOBYTE(v2->uFlags) |= 0x80u; + //LOBYTE(v2->uFlags) |= 0x80u; + v2->uFlags = 128; pParty->field_709 = 0; sub_44A56A(); if ( pParty->pHirelings[0].pName ) @@ -14728,7 +14691,7 @@ LODWORD(v20) = pBLVRenderParams->field_40 << 16; HIDWORD(v20) = pBLVRenderParams->field_40 >> 16; v21 = v20 / x; - v0->field_0 = (unsigned __int64)(v10->scale * v20 / x) >> 16; + v0->_screenspace_x_scaler_packedfloat = (unsigned __int64)(v10->scale * v20 / x) >> 16; a5a = (unsigned __int64)(v10->scale * (signed __int64)v21) >> 16; } else @@ -14742,15 +14705,15 @@ LODWORD(v18) = 0; HIDWORD(v18) = floorf(v16 + 0.5f); v19 = v18 / x; - v0->field_0 = (unsigned __int64)(v10->scale * v18 / x) >> 16; + v0->_screenspace_x_scaler_packedfloat = (unsigned __int64)(v10->scale * v18 / x) >> 16; a5a = (unsigned __int64)(v10->scale * (signed __int64)v19) >> 16; } - v0->field_4 = a5a; + v0->_screenspace_y_scaler_packedfloat = a5a; if ( (signed __int64)p->pActorBuffs[3].uExpireTime <= 0 ) { if ( (signed __int64)p->pActorBuffs[10].uExpireTime > 0 ) { - a5b = (unsigned __int64)(pGame->pStru6Instance->_4A806F(p) * (signed __int64)v0->field_4) >> 16; + a5b = (unsigned __int64)(pGame->pStru6Instance->_4A806F(p) * (signed __int64)v0->_screenspace_y_scaler_packedfloat) >> 16; goto LABEL_43; } } @@ -14759,12 +14722,12 @@ v22 = p->pActorBuffs[3].uPower; if ( v22 ) { - v23 = (unsigned __int64)(65536 / (unsigned __int16)v22 * (signed __int64)v0->field_0) >> 16; + v23 = (unsigned __int64)(65536 / (unsigned __int16)v22 * (signed __int64)v0->_screenspace_x_scaler_packedfloat) >> 16; v24 = p->pActorBuffs[3].uPower; - v0->field_0 = v23; - a5b = (unsigned __int64)(65536 / v24 * (signed __int64)v0->field_4) >> 16; + v0->_screenspace_x_scaler_packedfloat = v23; + a5b = (unsigned __int64)(65536 / v24 * (signed __int64)v0->_screenspace_y_scaler_packedfloat) >> 16; LABEL_43: - v0->field_4 = a5b; + v0->_screenspace_y_scaler_packedfloat = a5b; goto LABEL_44; } } diff -r 2cb13d295f4b -r 8e0e2991f9d1 mm7_5.cpp --- a/mm7_5.cpp Tue Feb 12 18:16:18 2013 +0600 +++ b/mm7_5.cpp Tue Feb 12 18:16:34 2013 +0600 @@ -332,8 +332,8 @@ //goto _actor_init_dlg; pActor->InitializeDialogue(v0); continue; - case UIMSG_Quit|0x2: - case 0x87: + case UIMSG_86: + case UIMSG_87: if ( bNoNPCHiring != 1 && !pCurrentScreen ) { if ( pMessageQueue_50CBD0->uNumMessages ) @@ -382,19 +382,19 @@ } } continue; - case 0x51: + case UIMSG_51: sub_4BDB56_buy_skill____(); continue; case UIMSG_AF: sub_4B2001(uMessageParam); continue; - case 0x195: + case UIMSG_195: sub_4BCACC_bounties(uMessageParam); continue; - case 0x88: + case UIMSG_88: sub_4BC49B(uMessageParam); continue; - case 0x19A: + case UIMSG_19A: _4B4224_UpdateNPCTopics(uMessageParam); continue; case UIMSG_StartNewGame: @@ -407,7 +407,7 @@ pGUIWindow_CurrentMenu->Release(); uGameState = 4; LABEL_188: - pCurrentScreen = 0; + pCurrentScreen = SCREEN_GAME; viewparams->bRedrawGameUI = v0; } else @@ -425,7 +425,7 @@ if ( pMessageQueue_50CBD0->uNumMessages ) pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; pGUIWindow_CurrentMenu->Release(); - pCurrentScreen = 12; + pCurrentScreen = SCREEN_LOADGAME; GameUI_DrawLoadMenu(v0); continue; case UIMSG_Quit: @@ -436,7 +436,7 @@ if ( pMessageQueue_50CBD0->uNumMessages ) pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; pGUIWindow_CurrentMenu->Release(); - pCurrentScreen = 0; + pCurrentScreen = SCREEN_GAME; viewparams->bRedrawGameUI = v0; if ( !uMessageParam ) pAudioPlayer->PlaySound((SoundID)(SOUND_EnteringAHouse|0x1), 0, 0, -1, 0, 0, 0, 0); @@ -451,11 +451,11 @@ //goto _release_tex_and_continue; stru_506E40.Release(); continue; - case 0x80: + case UIMSG_80: pIcons_LOD->_40F9C5(); pIcons_LOD->_4114F2(); pGUIWindow_CurrentMenu->Release(); - pCurrentScreen = 2; + pCurrentScreen = SCREEN_OPTIONS; v162 = 0; v148 = 0; pWindowType = (WindowType)8; @@ -517,7 +517,7 @@ case UIMSG_SelectLoadSlot: if ( pGUIWindow_CurrentMenu->field_40 == v0 ) pKeyActionMap->_459ED1(0); - if ( pCurrentScreen != 11 || uLoadGameUI_SelectedSlot != pSaveListPosition + uMessageParam ) + if ( pCurrentScreen != SCREEN_SAVEGAME || uLoadGameUI_SelectedSlot != pSaveListPosition + uMessageParam ) { v10 = pSaveListPosition + uMessageParam; if ( dword_6BE138 == pSaveListPosition + uMessageParam ) @@ -572,9 +572,9 @@ //goto _release_tex_and_continue; stru_506E40.Release(); continue; - case UIMSG_StartNewGame|0x2: + case UIMSG_Game_OpenSaveGameDialog: pGUIWindow_CurrentMenu->Release(); - pCurrentScreen = 11; + pCurrentScreen = SCREEN_SAVEGAME; GameUI_DrawSaveMenu(); continue; case UIMSG_Game_OpenOptionsDialog: @@ -582,7 +582,7 @@ pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; pGUIWindow_CurrentMenu->Release(); viewparams->field_48 = v0; - pCurrentScreen = 2; + pCurrentScreen = SCREEN_OPTIONS; uTextureID_507C60 = pIcons_LOD->LoadTexture("ControlBG", TEXTURE_16BIT_PALETTE); uTextureID_507C6C = pIcons_LOD->LoadTexture("con_16x", TEXTURE_16BIT_PALETTE); uTextureID_507C68 = pIcons_LOD->LoadTexture("con_32x", TEXTURE_16BIT_PALETTE); @@ -670,7 +670,7 @@ pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; pGUIWindow_CurrentMenu->Release(); viewparams->field_48 = 1; - pCurrentScreen = 26; + pCurrentScreen = SCREEN_KEYBOARD_OPTIONS; uTextureID_507BF4 = pIcons_LOD->LoadTexture("optkb", TEXTURE_16BIT_PALETTE); uTextureID_507BF8 = pIcons_LOD->LoadTexture("optkb_h", TEXTURE_16BIT_PALETTE); uTextureID_507BFC = pIcons_LOD->LoadTexture("resume1", TEXTURE_16BIT_PALETTE); @@ -707,7 +707,7 @@ continue; //default: //continue; - case UIMSG_ResetKeyMapping|0x1: + case UIMSG_1A3: if ( dword_506E68 != -1 ) goto LABEL_623; v14 = uMessageParam; @@ -756,7 +756,7 @@ case 0x1A0: dword_506F08 = v0; continue; - case UIMSG_StartNPCDialogue|0x100: + case UIMSG_1A1: dword_506F08 = 2; continue; case UIMSG_OpenVideoOptions: @@ -764,7 +764,7 @@ pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; pGUIWindow_CurrentMenu->Release(); viewparams->field_48 = v0; - pCurrentScreen = 28; + pCurrentScreen = SCREEN_VIDEO_OPTIONS; uTextureID_507C10 = pIcons_LOD->LoadTexture("optvid", TEXTURE_16BIT_PALETTE); uTextureID_507C14 = pIcons_LOD->LoadTexture("opvdH-bs", TEXTURE_16BIT_PALETTE); uTextureID_507C18 = pIcons_LOD->LoadTexture("opvdH-cl", TEXTURE_16BIT_PALETTE); @@ -817,11 +817,11 @@ } } continue; - case UIMSG_ToggleTint|0x1: + case UIMSG_1A9: if ( uMessageParam == 4 ) { - --uGammaPos; - if ( (uGammaPos & 0x80000000u) != 0 ) + //--uGammaPos; + if ( (uGammaPos -- -1) < 0 ) { uGammaPos = 0; //goto LABEL_128; @@ -1117,7 +1117,7 @@ } ModalWindow(pNPCTopics[453].pText, 0); continue; - case UIMSG_SkillUp|0x2: + case UIMSG_7B: pGUIWindow_CurrentMenu->Release(); pEventTimer->Resume(); goto LABEL_188; @@ -1192,9 +1192,9 @@ back_to_game(); if ( pMessageQueue_50CBD0->uNumMessages ) pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; - if ( pCurrentScreen > 15 ) - { - if ( pCurrentScreen >= 17 && (pCurrentScreen <= 18 || pCurrentScreen == 104) ) + if ( pCurrentScreen > SCREEN_F ) + { + if ( pCurrentScreen >= SCREEN_CHANGE_LOCATION && (pCurrentScreen <= SCREEN_INPUT_BLV || pCurrentScreen == SCREEN_QUICK_REFERENCE) ) { //LABEL_229: if ( dword_50CDC8 ) @@ -1207,7 +1207,7 @@ } else { - if ( pCurrentScreen >= 14 || pCurrentScreen == 4 || pCurrentScreen == 10 ) + if ( pCurrentScreen >= SCREEN_E || pCurrentScreen == SCREEN_NPC_DIALOGUE || pCurrentScreen == SCREEN_CHEST ) { //goto LABEL_229; if ( dword_50CDC8 ) @@ -1217,7 +1217,7 @@ uMessageParam = v0; goto LABEL_232; } - if ( pCurrentScreen == 13 && !dword_50CDC8 && !dword_5C35C8 ) + if ( pCurrentScreen == SCREEN_HOUSE && !dword_50CDC8 && !dword_5C35C8 ) { CloseWindowBackground(); dword_5C35C8 = 0; @@ -1234,18 +1234,18 @@ viewparams->field_48 = v0; if ( pCurrentScreen ) { - if ( pCurrentScreen > 103 ) + if ( pCurrentScreen > SCREEN_67 ) { - if ( pCurrentScreen == 104 ) + if ( pCurrentScreen == SCREEN_QUICK_REFERENCE ) goto LABEL_321; } else { - if ( pCurrentScreen < 100 ) + if ( pCurrentScreen < SCREEN_64 ) { switch ( pCurrentScreen ) { - case 23: + case SCREEN_CASTING: pIcons_LOD->_4114F2(); if ( some_active_character ) { @@ -1267,7 +1267,7 @@ //goto LABEL_322; if ( pGUIWindow_Settings ) { - if ( pCurrentScreen == 7 ) + if ( pCurrentScreen == SCREEN_CHARACTERS ) { pMouse->SetCursorBitmap("MICON2"); } @@ -1288,11 +1288,11 @@ ptr_507BC0 = 0; pGUIWindow_CurrentMenu = 0; pEventTimer->Resume(); - pCurrentScreen = 0; + pCurrentScreen = SCREEN_GAME; viewparams->bRedrawGameUI = v0; pIcons_LOD->_4355F7(); continue; - case 3: + case SCREEN_BOOKS: pBooksWindow->Release(); //crt_deconstruct_ptr_6A0118(); pBooksWindow = 0; @@ -1300,7 +1300,7 @@ //goto LABEL_322; if ( pGUIWindow_Settings ) { - if ( pCurrentScreen == 7 ) + if ( pCurrentScreen == SCREEN_CHARACTERS ) { pMouse->SetCursorBitmap("MICON2"); } @@ -1321,39 +1321,39 @@ ptr_507BC0 = 0; pGUIWindow_CurrentMenu = 0; pEventTimer->Resume(); - pCurrentScreen = 0; + pCurrentScreen = SCREEN_GAME; viewparams->bRedrawGameUI = v0; pIcons_LOD->_4355F7(); continue; - case 11: - case 12: + case SCREEN_SAVEGAME: + case SCREEN_LOADGAME: pIcons_LOD->_4114F2(); //crt_deconstruct_ptr_6A0118(); //goto LABEL_291; stru_506E40.Release(); break; - case 15: - pCurrentScreen = 10; + case SCREEN_F: + pCurrentScreen = SCREEN_CHEST; continue; - case 10: + case SCREEN_CHEST: pWindow2 = pChestWindow; //goto LABEL_249; pWindow2->Release(); pIcons_LOD->_4114F2(); - pCurrentScreen = 0; + pCurrentScreen = SCREEN_GAME; viewparams->bRedrawGameUI = v0; pEventTimer->Resume(); continue; - case 25: + case SCREEN_19: pWindow2 = ptr_507BC8; //LABEL_249: pWindow2->Release(); pIcons_LOD->_4114F2(); - pCurrentScreen = 0; + pCurrentScreen = SCREEN_GAME; viewparams->bRedrawGameUI = v0; pEventTimer->Resume(); continue; - case 2: + case SCREEN_OPTIONS: thisa = (signed int)&uTextureID_507C60; do { @@ -1408,7 +1408,7 @@ //LABEL_291: stru_506E40.Release(); break; - case 1: + case SCREEN_MENU: pIcons_LOD->_40F9C5(); pIcons_LOD->_4114F2(); pIcons_LOD->_40F9C5(); @@ -1416,7 +1416,7 @@ //goto LABEL_291; stru_506E40.Release(); break; - case 28: + case SCREEN_VIDEO_OPTIONS: if ( pRenderer->pRenderD3D ) { WriteWindowsRegistryInt("Colored Lights", pRenderer->bUseColoredLights); @@ -1435,7 +1435,7 @@ WriteWindowsRegistryInt(v31, v30); stru_506E40.Release(); break; - case 26: + case SCREEN_KEYBOARD_OPTIONS: v197 = 1; v32 = 0; while ( *((char *)word_506E6C + v32) != 1 ) @@ -1486,7 +1486,7 @@ } } goto LABEL_623; - case 5: + case SCREEN_REST: if ( dword_506F14 ) { Rest(_506F18_num_hours_to_sleep); @@ -1507,7 +1507,7 @@ //goto LABEL_322; if ( pGUIWindow_Settings ) { - if ( pCurrentScreen == 7 ) + if ( pCurrentScreen == SCREEN_CHARACTERS ) { pMouse->SetCursorBitmap("MICON2"); } @@ -1528,16 +1528,16 @@ ptr_507BC0 = 0; pGUIWindow_CurrentMenu = 0; pEventTimer->Resume(); - pCurrentScreen = 0; + pCurrentScreen = SCREEN_GAME; viewparams->bRedrawGameUI = v0; pIcons_LOD->_4355F7(); continue; - case 14: + case SCREEN_E: pGUIWindow_CurrentMenu->Release(); - pCurrentScreen = 13; + pCurrentScreen = SCREEN_HOUSE; pIcons_LOD->_4114F2(); continue; - case 13: + case SCREEN_HOUSE: if ( uDialogueType ) uDialogueType = 0; if ( uGameState == 2 ) @@ -1557,7 +1557,7 @@ //goto LABEL_322; if ( pGUIWindow_Settings ) { - if ( pCurrentScreen == 7 ) + if ( pCurrentScreen == SCREEN_CHARACTERS ) { pMouse->SetCursorBitmap("MICON2"); } @@ -1578,11 +1578,11 @@ ptr_507BC0 = 0; pGUIWindow_CurrentMenu = 0; pEventTimer->Resume(); - pCurrentScreen = 0; + pCurrentScreen = SCREEN_GAME; viewparams->bRedrawGameUI = v0; pIcons_LOD->_4355F7(); continue; - case 18: + case SCREEN_INPUT_BLV: if ( uCurrentHouse_Animation == 153 ) HousePlaySomeSound(0x99u, 3); pVideoPlayer->Unload(); @@ -1596,7 +1596,7 @@ dword_5B65CC = 0; } goto LABEL_317; - case 4: + case SCREEN_NPC_DIALOGUE: //LABEL_306: if ( dword_5B65CC ) { @@ -1607,11 +1607,11 @@ dword_5B65CC = 0; } goto LABEL_317; - case 19: + case SCREEN_BRANCHLESS_NPC_DIALOG: memset(GameUI_StatusBar_TimedString, 0, 0xC8u); sub_4452BB(); goto LABEL_317; - case 17: + case SCREEN_CHANGE_LOCATION: if ( pParty->vPosition.x < -22528 ) pParty->vPosition.x = -22528; if ( pParty->vPosition.x > 22528 ) @@ -1621,16 +1621,16 @@ if ( pParty->vPosition.y > 22528 ) pParty->vPosition.y = 22528; goto LABEL_317; - case 16: + case SCREEN_VIDEO: pVideoPlayer->Unload(); continue; - case 7: + case SCREEN_CHARACTERS: goto LABEL_319; default: //goto LABEL_322; if ( pGUIWindow_Settings ) { - if ( pCurrentScreen == 7 ) + if ( pCurrentScreen == SCREEN_CHARACTERS ) { pMouse->SetCursorBitmap("MICON2"); } @@ -1651,7 +1651,7 @@ ptr_507BC0 = 0; pGUIWindow_CurrentMenu = 0; pEventTimer->Resume(); - pCurrentScreen = 0; + pCurrentScreen = SCREEN_GAME; viewparams->bRedrawGameUI = v0; pIcons_LOD->_4355F7(); continue; @@ -1659,7 +1659,7 @@ //goto LABEL_322; if ( pGUIWindow_Settings ) { - if ( pCurrentScreen == 7 ) + if ( pCurrentScreen == SCREEN_CHARACTERS ) { pMouse->SetCursorBitmap("MICON2"); } @@ -1680,7 +1680,7 @@ ptr_507BC0 = 0; pGUIWindow_CurrentMenu = 0; pEventTimer->Resume(); - pCurrentScreen = 0; + pCurrentScreen = SCREEN_GAME; viewparams->bRedrawGameUI = v0; pIcons_LOD->_4355F7(); continue; @@ -1694,7 +1694,7 @@ //LABEL_322: if ( pGUIWindow_Settings ) { - if ( pCurrentScreen == 7 ) + if ( pCurrentScreen == SCREEN_CHARACTERS ) { pMouse->SetCursorBitmap("MICON2"); } @@ -1715,7 +1715,7 @@ ptr_507BC0 = 0; pGUIWindow_CurrentMenu = 0; pEventTimer->Resume(); - pCurrentScreen = 0; + pCurrentScreen = SCREEN_GAME; viewparams->bRedrawGameUI = v0; pIcons_LOD->_4355F7(); continue; @@ -1801,7 +1801,7 @@ } DrawHiredNPCs(); continue; - case UIMSG_OpenRestUI|0x2: + case UIMSG_19B: if ( pMessageQueue_50CBD0->uNumMessages ) pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; dword_50CDC8 = v0; @@ -1862,7 +1862,7 @@ if ( !_strcmpi(byte_6BE3B0, "d05.blv") ) pParty->uTimePlayed += 1474560i64; continue; - case 0x19C: + case UIMSG_19C: CloseWindowBackground(); pVideoPlayer->Unload(); sub_44603D(); @@ -1872,7 +1872,7 @@ v39 = GetAsyncKeyState(VK_SHIFT); v40 = CycleCharacter(v39); goto LABEL_421; - case UIMSG_LoadGame|0x8: + case UIMSG_5A: if ( pMessageQueue_50CBD0->uNumMessages ) pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; dword_50CDC8 = v0; @@ -1895,7 +1895,7 @@ pParty->vPosition.y = 22528; LABEL_317: sub_44603D(); - pCurrentScreen = 0; + pCurrentScreen = SCREEN_GAME; } else { @@ -1968,11 +1968,11 @@ sub_461103(); pEventTimer->Resume(); viewparams->bRedrawGameUI = 1; - pCurrentScreen = 0; + pCurrentScreen = SCREEN_GAME; pGameLoadingUI_ProgressBar->Release(); } goto LABEL_422; - case UIMSG_SaveGame|0x8: + case UIMSG_5B: goto LABEL_387; case UIMSG_BE: if ( pRenderer->pRenderD3D ) @@ -2083,9 +2083,9 @@ unk_50C9A0 = 0; back_to_game(); continue; - case UIMSG_ChangeGameState|0x40: - case 0x8D: - case 0x8F: + case UIMSG_45: + case UIMSG_8D: + case UIMSG_8F: if ( pMessageQueue_50CBD0->uNumMessages ) pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; if ( unk_50C9A0 ) @@ -2506,7 +2506,7 @@ uGameState = 0; strcpy((char *)pKeyActionMap->pPressedKeysBuffer, "2"); goto LABEL_524; - case UIMSG_D5|0x8: + case UIMSG_DD: LABEL_524: sprintf(pTmpBuf, "%s", pKeyActionMap->pPressedKeysBuffer); memcpy(&v216, texture_frame_table_txt_parser((const char *)pKeyActionMap->pPressedKeysBuffer, &v218), sizeof(v216)); @@ -2613,7 +2613,7 @@ v1 = ""; v0 = 1; continue; - case 0x19: + case UIMSG_19: if ( bUnderwater == 1 ) goto LABEL_682; if ( !uActiveCharacter || (pPlayer2 = pPlayers[uActiveCharacter], pPlayer2->uTimeToRecovery) ) @@ -2631,8 +2631,8 @@ //goto LABEL_679; _42777D_CastSpell_UseWand_ShootArrow(v79, v80, v147, v159, v175); continue; - case 0x46: - case UIMSG_Quit|0x8: + case UIMSG_46: + case UIMSG_8C: if ( pRenderer->pRenderD3D ) { v81 = pGame->pVisInstance->get_picked_object_zbuf_val(); @@ -2677,7 +2677,7 @@ unk_50C9A0 = 0; back_to_game(); continue; - case 0x1C: + case UIMSG_1C: if ( !uActiveCharacter || pCurrentScreen ) //goto LABEL_90; { @@ -2686,10 +2686,10 @@ continue; } ptr_507BC8 = GUIWindow::Create(0, 0, 640, 480, (enum WindowType)104, uMessageParam, 0); - pCurrentScreen = 25; + pCurrentScreen = SCREEN_19; pEventTimer->Pause(); continue; - case 0x1B: + case UIMSG_1B: if ( !uActiveCharacter ) //goto LABEL_90; { @@ -2747,7 +2747,7 @@ //LABEL_577: _42ECB5_PlayerAttacksActor(); continue; - case UIMSG_A7: + case UIMSG_ExitRest: v163 = (int)pGlobalTXT_LocalizationStrings[81];// "Exit Rest" pButton = pButton_RestUI_Exit; pButton2 = pButton_RestUI_Exit; @@ -2760,7 +2760,7 @@ v133 = 0; GUIWindow::Create(v9, v8, v133, v137, pWindowType1, (int)pButton2, v163); continue; - case UIMSG_ShowStatus_Player|0x1: + case UIMSG_Wait5Minutes: if ( dword_506F14 == 2 ) //goto LABEL_621; { @@ -2772,7 +2772,7 @@ dword_506F14 = v0; _506F18_num_hours_to_sleep = 5; continue; - case 0x60: + case UIMSG_Wait1Hour: if ( dword_506F14 == 2 ) //goto LABEL_621; { @@ -2800,7 +2800,7 @@ pParty->pPlayers[1].pConditions[2] = pParty->uTimePlayed; pParty->pPlayers[0].pConditions[2] = pParty->uTimePlayed; continue; - case 0x68: + case UIMSG_68: if ( pMessageQueue_50CBD0->uNumMessages ) pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; if ( pCurrentScreen ) @@ -2865,7 +2865,7 @@ v176 = 0; v160 = 13; goto LABEL_619; - case 0x61: + case UIMSG_61: if ( dword_506F14 ) //goto LABEL_621; { @@ -2945,7 +2945,7 @@ pParty->pPlayers[0].pConditions[2] = pParty->uTimePlayed; } continue; - case UIMSG_ShowStatus_Funds|0x8: + case UIMSG_AlreadyResting: if ( dword_506F14 == 2 ) { //LABEL_621: @@ -2958,7 +2958,7 @@ dword_506F14 = v0; _506F18_num_hours_to_sleep = 60 * v97 - pParty->uCurrentMinute; continue; - case 0x4E: + case UIMSG_4E: if ( dword_50654C && byte_506550 ) { v173 = pSpellStats->pInfos[dword_50654C + 11 * pPlayers[uActiveCharacter]->pNumSpellBookPage].pName; @@ -2977,7 +2977,7 @@ //_set_status_string_pTmpBuf_and_continue: sub_41C0B8_set_status_string(pTmpBuf); continue; - case 0x4F: + case UIMSG_4F: if ( !uActiveCharacter || (uNumSeconds = (unsigned int)pPlayers[uActiveCharacter], !*(char *)(uNumSeconds + 11 * *(char *)(uNumSeconds + 6734) + uMessageParam + 402)) ) continue; @@ -2999,7 +2999,7 @@ //goto LABEL_91; v0 = 1; continue; - case 0x58: + case UIMSG_58: GUIWindow::Create(pBtn_InstallRemoveSpell->uX, pBtn_InstallRemoveSpell->uY, 0, 0, (enum WindowType)90, (int)pBtn_InstallRemoveSpell, 0); if ( !uActiveCharacter ) continue; @@ -3025,7 +3025,7 @@ pPlayer10->PlaySound(12, 0); byte_506550 = 0; continue; - case 0x33: + case UIMSG_33: if ( !uActiveCharacter ) continue; pPlayer3 = pPlayers[uActiveCharacter]; @@ -3083,7 +3083,7 @@ v130 = 0; v127 = rand() % 2 + 204; goto _play_sound_and_continue; - case UIMSG_SaveGame|0x4: + case UIMSG_57: if ( pTurnEngine->field_4 == 3 || !uActiveCharacter || uMessageParam == pPlayers[uActiveCharacter]->pNumSpellBookPage ) continue; sub_41140B(); @@ -3098,7 +3098,7 @@ v130 = 0; v127 = rand() % 2 + 204; goto _play_sound_and_continue; - case UIMSG_LoadGame|0x4: + case UIMSG_56: if ( pTurnEngine->field_4 != 3 ) { if ( uActiveCharacter ) @@ -3111,7 +3111,7 @@ pGUIWindow_CurrentMenu->Release(); pEventTimer->Resume(); viewparams->bRedrawGameUI = v0; - pCurrentScreen = 0; + pCurrentScreen = SCREEN_GAME; pIcons_LOD->_4114F2(); v103 = dword_50654C + 11 * *(char *)(uNumSeconds + 6734); if ( dword_50C9E8 < 40 ) @@ -3131,7 +3131,7 @@ } } continue; - case 0x8E: + case UIMSG_8E: if ( pTurnEngine->field_4 == 3 ) continue; v175 = 0; @@ -3142,7 +3142,7 @@ v79 = uMessageParam; _42777D_CastSpell_UseWand_ShootArrow(v79, v80, v147, v159, v175); continue; - case 0x92: + case UIMSG_92: if ( pTurnEngine->field_4 != 3 ) { v175 = 0; @@ -3155,7 +3155,7 @@ _42777D_CastSpell_UseWand_ShootArrow(v79, v80, v147, v159, v175); } continue; - case 0x69: + case UIMSG_69: if ( pTurnEngine->field_4 == 3 ) continue; if ( bUnderwater == 1 ) @@ -3186,22 +3186,22 @@ //goto LABEL_693; { GUIWindow::Create(0x1DCu, 0x1C2u, 0, 0, (enum WindowType)90, (int)pBtn_CastSpell, 0); - pCurrentScreen = 8; + pCurrentScreen = SCREEN_SPELL_BOOK; pEventTimer->Pause(); pGUIWindow_CurrentMenu = GUIWindow::Create(0, 0, 640, 480, (enum WindowType)18, 0, 0); pAudioPlayer->PlaySound((SoundID)48, 0, 0, -1, 0, 0, 0, 0); viewparams->field_48 = v0; continue; } - if ( pCurrentScreen != 5 - && pCurrentScreen != 7 - && (pCurrentScreen <= 99 - || pCurrentScreen > 103) ) + if ( pCurrentScreen != SCREEN_REST + && pCurrentScreen != SCREEN_CHARACTERS + && (pCurrentScreen <= SCREEN_63 + || pCurrentScreen > SCREEN_67) ) { pGUIWindow_CurrentMenu->Release(); //LABEL_693: GUIWindow::Create(0x1DCu, 0x1C2u, 0, 0, (enum WindowType)90, (int)pBtn_CastSpell, 0); - pCurrentScreen = 8; + pCurrentScreen = SCREEN_SPELL_BOOK; pEventTimer->Pause(); pGUIWindow_CurrentMenu = GUIWindow::Create(0, 0, 640, 480, (enum WindowType)18, 0, 0); pAudioPlayer->PlaySound((SoundID)48, 0, 0, -1, 0, 0, 0, 0); @@ -3223,19 +3223,19 @@ viewparams->bRedrawGameUI = v0; pEventTimer->Pause(); pAudioPlayer->StopChannels(-1, -1); - pCurrentScreen = 104; + pCurrentScreen = SCREEN_QUICK_REFERENCE; pGUIWindow_CurrentMenu = GUIWindow::Create(0, 0, 640, 480, (enum WindowType)12, 5, 0); papredoll_dbrds[2] = pIcons_LOD->LoadTexture("BUTTEXI1", TEXTURE_16BIT_PALETTE); pBtn_ExitCancel = pGUIWindow_CurrentMenu->CreateButton(0x187u, 0x13Cu, 0x4Bu, 0x21u, v0, 0, 0x71u, 0, 0, pGlobalTXT_LocalizationStrings[79],// "Exit" (Texture *)(uTextureID_BUTTDESC2 != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_BUTTDESC2] : 0), 0); //, v179); continue; - case 0x6B: + case UIMSG_6B: if ( pCurrentScreen ) { pGUIWindow_CurrentMenu->Release(); pEventTimer->Resume(); - pCurrentScreen = 0; + pCurrentScreen = SCREEN_GAME; viewparams->bRedrawGameUI = v0; } stru_506E40.Release(); @@ -3268,7 +3268,7 @@ //LABEL_709: dword_506544 = v0; continue; - case 0x55: + case UIMSG_55: bRingsShownInCharScreen ^= v0; GUIButton::_41D0D8(pCharacterScreen_DetalizBtn); GUIButton::_41D0D8(pCharacterScreen_DollBtn); @@ -3291,10 +3291,10 @@ 0); pCharacterScreen_DollBtn = pGUIWindow_CurrentMenu->CreateButton(0x1DCu, 0, 0xA4u, 0x159u, v0, 0, 0x85u, 0, 0, v1, 0); goto LABEL_422; - case UIMSG_Quit|0x1: + case UIMSG_85: OnPaperdollLeftClick(); continue; - case UIMSG_Escape|0x2: + case UIMSG_73: pWindowList_at_506F50_minus1_indexing_buttons____and_an_int_[0] = 100; sub_4196A0(); sub_419379(); @@ -3310,7 +3310,7 @@ v133 = 0; GUIWindow::Create(v9, v8, v133, v137, pWindowType1, (int)pButton2, v163); continue; - case UIMSG_ChangeMusicVolume|0x2: + case UIMSG_72: pWindowList_at_506F50_minus1_indexing_buttons____and_an_int_[0] = 101; sub_4196A0(); sub_419379(); @@ -3358,7 +3358,7 @@ //_draw_status_string_and_continue: ShowStatusBarString(v87, 2u); continue; - case UIMSG_ChangeMusicVolume|0x4: + case UIMSG_74: pWindowList_at_506F50_minus1_indexing_buttons____and_an_int_[0] = 103; sub_419379(); sub_4196A0(); @@ -3388,7 +3388,7 @@ v133 = 0; GUIWindow::Create(v9, v8, v133, v137, pWindowType1, (int)pButton2, v163); continue; - case UIMSG_Escape|0x4: + case UIMSG_75: sub_419379(); sub_4196A0(); sub_419220(); @@ -3397,7 +3397,7 @@ (int)pCharacterScreen_AwardsBtn, 0); sub_419100(); continue; - case 71://0x47: + case UIMSG_AutonotesBook: switch ( uMessageParam ) { default: @@ -3517,18 +3517,18 @@ sprintf(pTmpBuf, "%d / %d %s %d / %d %s", v110->sHealth, v114, v113, v112, v111, v109); sub_41C0B8_set_status_string(pTmpBuf); continue; - case 0xC: - if ( pCurrentScreen == 15 ) + case UIMSG_C: + if ( pCurrentScreen == SCREEN_F ) { sub_421EA6_OnInventoryLeftClick(); continue; } sub_420E01(); continue; - case UIMSG_ChangeMusicVolume|0x8: + case UIMSG_InventoryLeftClick: sub_421EA6_OnInventoryLeftClick(); continue; - case 0xA: + case UIMSG_A: if ( !pRenderer->pRenderD3D ) //goto LABEL_772; { @@ -3578,13 +3578,13 @@ continue; } continue; - case 0xE: + case UIMSG_E: //LABEL_772: if ( pMessageQueue_50CBD0->uNumMessages ) pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; OnGameViewportClick(); continue; - case 0xF: + case UIMSG_F: if ( pRenderer->pRenderD3D ) { LOWORD(v116) = pGame->pVisInstance->get_picked_object_zbuf_val(); @@ -3605,7 +3605,7 @@ v133 = 0; GUIWindow::Create(v9, v8, v133, v137, pWindowType1, (int)pButton2, v163); continue; - case 0x54: + case UIMSG_54: v163 = 0; pButton2 = (GUIButton *)uMessageParam; pWindowType1 = (WindowType)22; @@ -3618,12 +3618,12 @@ //LABEL_733: GUIWindow::Create(v9, v8, v133, v137, pWindowType1, (int)pButton2, v163); continue; - case 0x194: + case UIMSG_194: if ( pMessageQueue_50CBD0->uNumMessages ) pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; OnPressSpace(); continue; - case UIMSG_ChangeSoundVolume|0x100: + case UIMSG_16F: if ( pCurrentScreen ) continue; pParty->uFlags |= 2u; @@ -3646,7 +3646,7 @@ goto LABEL_789; viewparams->field_28 = 11; goto LABEL_788; - case UIMSG_ChangeMusicVolume|0x100: + case UIMSG_170: if ( pCurrentScreen ) continue; pParty->uFlags |= 2u; @@ -3830,7 +3830,7 @@ //main menu save/load wnd clicking on savegame lines if (pGUIWindow_CurrentMenu->field_40 == 1) pKeyActionMap->_459ED1(0); - if ( pCurrentScreen != 11 || uLoadGameUI_SelectedSlot != uNum + pSaveListPosition ) + if ( pCurrentScreen != SCREEN_SAVEGAME || uLoadGameUI_SelectedSlot != uNum + pSaveListPosition ) { //load clicked line v26 = uNum + pSaveListPosition; @@ -3960,7 +3960,7 @@ { pGUIWindow_CurrentMenu->Release(); pEventTimer->Resume(); - pCurrentScreen = 0; + pCurrentScreen = SCREEN_GAME; viewparams->bRedrawGameUI = 1; } GUIWindow::Create(602, 450, 0, 0, (enum WindowType)92, (int)pBtn_GameSettings, 0); @@ -4023,7 +4023,7 @@ v17 = pCurrentScreen; if ( v16 && !pCurrentScreen ) goto LABEL_83; - if ( pCurrentScreen == 12 ) + if ( pCurrentScreen == SCREEN_LOADGAME ) { pIcons_LOD->_4114F2(); //crt_deconstruct_ptr_6A0118(); @@ -4036,24 +4036,24 @@ pGUIWindow2->Release(); pGUIWindow2 = 0; pEventTimer->Resume(); - pCurrentScreen = 0; + pCurrentScreen = SCREEN_GAME; viewparams->bRedrawGameUI = v15; continue; } - if ( pCurrentScreen == 16 ) + if ( pCurrentScreen == SCREEN_VIDEO ) { pVideoPlayer->Unload(); } else { - if ( pCurrentScreen != 27 ) + if ( pCurrentScreen != SCREEN_1B ) //goto LABEL_81; { pGUIWindow_CurrentMenu->Release(); pGUIWindow2->Release(); pGUIWindow2 = 0; pEventTimer->Resume(); - pCurrentScreen = 0; + pCurrentScreen = SCREEN_GAME; viewparams->bRedrawGameUI = v15; continue; } @@ -5221,7 +5221,7 @@ v61 = 0; v59 = 0; v62 = 0; - if ( (a1 & 7) == 2 ) + if ( (a1 & 7) == OBJECT_Item) { v4 = &pLayingItems[a1 >> 3]; uDamageAmount = (int)v4; @@ -6165,11 +6165,10 @@ //----- (0043AA99) -------------------------------------------------------- void __fastcall Vec3_int_::Rotate(int sDepth, int sRotY, int sRotX, Vec3_int_ v, int *outx, int *outy, int *outz) { - int v7; // ebx@1 +/* int v7; // ebx@1 int v8; // ST14_4@1 int v9; // edi@1 int anglea; // [sp+20h] [bp+8h]@1 - v7 = sRotX; v8 = sDepth; v9 = sRotY; @@ -6179,7 +6178,17 @@ + ((unsigned __int64)(stru_5C6E00->SinCos(v9 - stru_5C6E00->uIntegerHalfPi) * (signed __int64)anglea) >> 16); *outz = v.z - + ((unsigned __int64)(stru_5C6E00->SinCos(v7 - stru_5C6E00->uIntegerHalfPi) * (signed __int64)v8) >> 16); + + ((unsigned __int64)(stru_5C6E00->SinCos(v7 - stru_5C6E00->uIntegerHalfPi) * (signed __int64)v8) >> 16);*/ + + float cosf_x = cosf(3.14159265f * sRotX / 1024.0f), + cosf_y = cosf(3.14159265f * sRotY / 1024.0f), + sinf_x = sinf(3.14159265f * sRotX / 1024.0f), + sinf_y = sinf(3.14159265f * sRotY / 1024.0f); + + *outx = v.x + ((unsigned __int64)((double)sDepth * cosf_y * cosf_x) >> 16); + *outy = v.y + ((unsigned __int64)((double)sDepth * sinf_y * cosf_x) >> 16); + *outz = v.z + ((unsigned __int64)((double)sDepth * sinf_x) >> 16); + } //----- (0043AB61) -------------------------------------------------------- @@ -6293,7 +6302,7 @@ a2 = uObjID; if ( !pActors[uActorID].IsAlive() ) { - if ( (a2 & 7) == 2 ) + if ( (a2 & 7) == OBJECT_Item) { v4 = &pLayingItems[(signed int)a2 >> 3]; v5 = v4->field_48; @@ -6352,7 +6361,7 @@ v4 = 0; uActorID = a2; v17 = a1; - if ( (a1 & 7) == 2 ) + if ( (a1 & 7) == OBJECT_Item) { v5 = &pLayingItems[a1 >> 3]; v4 = v5->field_60_distance_related_prolly_lod; @@ -9437,7 +9446,7 @@ while ( 1 ) { v5 = v16->uPackedID; - if ( (v16->uPackedID & 7) == 4 ) + if ( (v16->uPackedID & 7) == OBJECT_Player) break; LABEL_8: ++v17; @@ -9480,7 +9489,7 @@ v8 = v1->pQueue; do { - if ( (v8->uPackedID & 7) == 3 && ai_array_4F7DB0_actor_ids[v20] == v8->uPackedID >> 3 ) + if ( (v8->uPackedID & 7) == OBJECT_Actor && ai_array_4F7DB0_actor_ids[v20] == v8->uPackedID >> 3 ) break; ++v18; ++v8; @@ -9559,7 +9568,7 @@ _404544(); v2 = v1->pQueue; v3 = 0; - if ( (v1->pQueue[0].uPackedID & 7) == 4 ) + if ( (v1->pQueue[0].uPackedID & 7) == OBJECT_Player) uActiveCharacter = (v1->pQueue[0].uPackedID >> 3) + 1; else uActiveCharacter = 0; @@ -9578,7 +9587,7 @@ goto LABEL_27; do { - if ( (v2->uPackedID & 7) != 4 ) + if ( (v2->uPackedID & 7) != OBJECT_Player) { v5 = &pActors[v2->uPackedID >> 3]; LOWORD(v6) = v5->uAIState; @@ -9636,7 +9645,7 @@ v9 = v1->pQueue; do { - if ( (v9->uPackedID & 7) != 4 ) + if ( (v9->uPackedID & 7) != OBJECT_Player) { v10 = v9->uPackedID >> 3; v11 = pActors[v10].uAIState; @@ -9688,7 +9697,7 @@ v4 = v1->pQueue[0].field_4; if ( v4 ) { - if ( (v1->pQueue[0].uPackedID & 7) == 4 ) + if ( (v1->pQueue[0].uPackedID & 7) == OBJECT_Player) { v5 = v1->uActorQueueSize; while ( 1 ) @@ -9769,7 +9778,7 @@ v2 = this; v3 = *(&this->field_0 + 4 * (a2 + 2)); - if ( (*((char *)&this->field_0 + 16 * (a2 + 2)) & 7) == 4 ) + if ( (*((char *)&this->field_0 + 16 * (a2 + 2)) & 7) == OBJECT_Player) { v4 = v3 >> 3; v5 = (char *)&pParty->pTurnBasedPlayerRecoveryTimes[v3 >> 3]; @@ -9787,7 +9796,7 @@ } v2->pQueue[a2].field_4 = v6; v2->_404544(); - if ( (v2->pQueue[0].uPackedID & 7) == 4 ) + if ( (v2->pQueue[0].uPackedID & 7) == OBJECT_Player) uActiveCharacter = (v2->pQueue[0].uPackedID >> 3) + 1; else uActiveCharacter = 0; @@ -9835,11 +9844,11 @@ { if ( !*(int *)v1 ) { - if ( (*(v1 - 4) & 7) == 4 ) + if ( (*(v1 - 4) & 7) == OBJECT_Player) return; v2 = &pActors[*((int *)v1 - 1) >> 3]; v3 = v2->uAIState; - if ( !v3 || v3 == 9 || v3 == 7 ) + if (v3 == Standing || v3 == Fleeing || v3 == Fidgeting) { v4 = pMonsterStats->pInfos[v2->pMonsterInfo.uID].uRecoveryTime; *(int *)v1 = v4; @@ -9866,7 +9875,7 @@ v1 = this; LOWORD(v2) = _404544(); if ( v1->pQueue[0].field_4 <= 0 - || ((_4063A1(), v2 = v1->pQueue[0].uPackedID, (v1->pQueue[0].uPackedID & 7) != 4) ? (uActiveCharacter = 0) : (v2 = (v2 >> 3) + 1, uActiveCharacter = v2), + || ((_4063A1(), v2 = v1->pQueue[0].uPackedID, (v1->pQueue[0].uPackedID & 7) != OBJECT_Player) ? (uActiveCharacter = 0) : (v2 = (v2 >> 3) + 1, uActiveCharacter = v2), viewparams->bRedrawGameUI = 1, v1->pQueue[0].field_4 <= 0) ) { @@ -9877,7 +9886,7 @@ do { v2 = *(int *)v4; - if ( (*(char *)v4 & 7) == 4 || *(int *)(v4 + 4) > 0 ) + if ( (*(char *)v4 & 7) == OBJECT_Player || *(int *)(v4 + 4) > 0 ) break; if ( *(int *)(v4 + 8) <= 0 ) { @@ -9935,7 +9944,7 @@ v1 = (TurnBased_QueueElem *)((char *)this + 16 * (a2 + 2)); v28 = v1; v3 = v1->uPackedID; - if ( (v1->uPackedID & 7) != 4 ) + if ( (v1->uPackedID & 7) != OBJECT_Player) { v4 = v3 >> 3; // turn based only stuff a2a = dword_4F6E08[v3 >> 3]; @@ -10099,7 +10108,7 @@ v9 = 0; v20 = 0; } - if ( (v22 & 7) == 3 ) + if ( (v22 & 7) == OBJECT_Actor) v10 = (unsigned __int8)*(&byte_5C8D1A[89 * (pMonsterStats->pInfos[pActors[v22 >> 3].pMonsterInfo.uID].uID - 1) / 3] @@ -10232,7 +10241,7 @@ while ( 1 ) { v5 = v10->uPackedID; - if ( (v10->uPackedID & 7) == 3 ) + if ( (v10->uPackedID & 7) == OBJECT_Actor) { v8 = dword_4F6E08[v5 >> 3]; memcpy(&v7, Actor::GetDirectionInfo(v5, v8, &a3, v2), sizeof(v7)); @@ -10271,7 +10280,7 @@ v2 = this->pQueue; do { - if ( (v2->uPackedID & 7) == 3 ) + if ( (v2->uPackedID & 7) == OBJECT_Actor) { v3 = v2->uPackedID >> 3; v8 = v3; @@ -10326,7 +10335,7 @@ { v4 = v14->uPackedID; a1 = v14->uPackedID; - if ( (a1 & 7) != 4 ) + if ( (a1 & 7) != OBJECT_Player) { v5 = v4 >> 3; v12 = v5; @@ -10410,7 +10419,7 @@ unsigned int a2a; // [sp+5Ch] [bp+8h]@7 v2 = *(&this->field_0 + 4 * (a2 + 2)); - if ( (v2 & 7) == 4 ) + if ( (v2 & 7) == OBJECT_Player) return 0; v3 = v2 >> 3; uActorID = v3; @@ -10604,7 +10613,7 @@ v14 = this->pQueue; do { - if ( (v3->uPackedID & 7) != 4 ) + if ( (v3->uPackedID & 7) != OBJECT_Player) { v4 = v3->uPackedID >> 3; uActorID = v4; @@ -14113,13 +14122,13 @@ viewparams->_443231(); if ( dword_506538 ) viewparams->_44323D(); - v6 = dword_506534; + //v6 = dword_506534; if ( dword_506534 ) { viewparams->_443225(); - v6 = dword_506534; - } - if ( dword_506548 | dword_506544 | dword_506540 | dword_50653C | dword_506538 | v6 ) + //v6 = dword_506534; + } + if ( dword_506548 | dword_506544 | dword_506540 | dword_50653C | dword_506538 | dword_506534 ) pAudioPlayer->PlaySound((SoundID)75, 0, 0, -1, 0, 0, 0, 0); dword_506548 = 0; dword_506544 = 0; @@ -14127,8 +14136,8 @@ dword_506538 = 0; dword_50653C = 0; dword_506540 = 0; - DrawSpellbook_Map_sub(0x61u, 0x31u, 0x169u, 313, 0); - pRenderer->DrawTextureTransparent(0x4Bu, 0x16u, pTexture_mapbordr); + DrawSpellbook_Map_sub(97, 49, 361, 313, 0); + pRenderer->DrawTextureTransparent(75, 22, pTexture_mapbordr); v22.uFrameWidth = 460; v22.uFrameHeight = 344; v22.uFrameX = 8; @@ -14354,7 +14363,7 @@ dword_506F0C[0] = pCurrentScreen; result = GUIWindow::Create(0, 0, 640, 480, WINDOW_FinalWindow, v3, (int)v2); ptr_507BDC = result; - pCurrentScreen = 22; + pCurrentScreen = SCREEN_PRESS_ESCAPE_MESSAGE; return result; } // 4E28F8: using guessed type int pCurrentScreen; @@ -15033,7 +15042,7 @@ if ( pHint && pHint != (char *)1 ) pGUIButton3->DrawLabel(pHint, pFontCreate, 0, 0); pWindow->Release(); - if (pCurrentScreen == 11)// + if (pCurrentScreen == SCREEN_SAVEGAME) pMessageQueue_50CBD0->SendMessage(UIMSG_SaveGame, 0, 0); else pMessageQueue_50CBD0->SendMessage(UIMSG_LoadGame, 0, 0); @@ -15100,7 +15109,7 @@ ItemGen2.Reset(); pWindow->Release(); pEventTimer->Resume(); - pCurrentScreen = 0; + pCurrentScreen = SCREEN_GAME; viewparams->bRedrawGameUI = 1; v39 = atoi((const char *)pKeyActionMap->pPressedKeysBuffer); if ( v39 > 0 ) @@ -15201,7 +15210,7 @@ pItemGen.Reset(); pWindow->Release(); pEventTimer->Resume(); - pCurrentScreen = 0; + pCurrentScreen = SCREEN_GAME; viewparams->bRedrawGameUI = 1; v26 = atoi((const char *)pKeyActionMap->pPressedKeysBuffer); if ( v26 > 0 ) @@ -15362,7 +15371,7 @@ } pEventTimer->Resume(); ptr_507BD0->Release(); - pCurrentScreen = 0; + pCurrentScreen = SCREEN_GAME; //goto LABEL_114; viewparams->bRedrawGameUI = 1; continue; @@ -15437,13 +15446,13 @@ } else//pWindowType == 20 (0x14) WINDOW_Chest { - if ( pCurrentScreen == 10 ) + if ( pCurrentScreen == SCREEN_CHEST ) { Chest::DrawChestUI((unsigned int)pWindow->ptr_1C); } else { - if ( pCurrentScreen == 15 ) + if ( pCurrentScreen == SCREEN_F ) { pRenderer->ClearZBuffer(0, 479); draw_leather(); @@ -16160,7 +16169,7 @@ unsigned int pX; // [sp+70h] [bp-8h]@3 unsigned int pY; // [sp+74h] [bp-4h]@3 - if ( pCurrentScreen == 16 )// + if ( pCurrentScreen == SCREEN_VIDEO ) return; if ( _this ) { @@ -16198,9 +16207,9 @@ //while ( v1 < 4 ); } pEventTimer->Pause(); - if ( pCurrentScreen <= 10 ) - { - if ( pCurrentScreen == 10 )// + if ( pCurrentScreen <= SCREEN_CHEST ) + { + if ( pCurrentScreen == SCREEN_CHEST ) { __debugbreak(); if ( !pPlayers[uActiveCharacter]->CanAct() ) @@ -16229,11 +16238,11 @@ { if ( pCurrentScreen ) { - if ( pCurrentScreen != 3 ) - { - if ( pCurrentScreen != 7 ) - { - if ( pCurrentScreen == 8 )// + if ( pCurrentScreen != SCREEN_BOOKS ) + { + if ( pCurrentScreen != SCREEN_CHARACTERS ) + { + if ( pCurrentScreen == SCREEN_SPELL_BOOK ) { if ( dword_507B00_spell_info_to_draw_in_popup ) DrawSpellDescriptionPopup((void *)(dword_507B00_spell_info_to_draw_in_popup - 1)); @@ -16241,7 +16250,7 @@ goto LABEL_132; } LABEL_119: - if ( (signed int)pX > 467 && pCurrentScreen != 14 ) + if ( (signed int)pX > 467 && pCurrentScreen != SCREEN_E ) { identify_item(); goto LABEL_132; @@ -16352,9 +16361,9 @@ else v5 = pRenderer->pActiveZBuffer[pX + pSRZBufferLineOffsets[pY]]; v6 = (unsigned __int16)v5; - if ( (v6 & 7) != 2 ) - { - if ( (v6 & 7) == 3 ) + if ( (v6 & 7) != OBJECT_Item) + { + if ( (v6 & 7) == OBJECT_Actor) { if ( pRenderer->uNumSceneBegins ) { @@ -16379,19 +16388,19 @@ GameUI_DrawItemInfo(v8); goto LABEL_132; } - if ( pCurrentScreen == 13 )// + if ( pCurrentScreen == SCREEN_HOUSE ) { if ( (signed int)pY < 345 && (signed int)pX < 469 ) sub_4B1A2D(); goto LABEL_132; } - if ( pCurrentScreen <= 13 ) + if ( pCurrentScreen <= SCREEN_HOUSE ) goto LABEL_132; - if ( pCurrentScreen <= 15 ) + if ( pCurrentScreen <= SCREEN_F ) goto LABEL_119; - if ( pCurrentScreen != 21 ) - { - v11 = pCurrentScreen == 23; + if ( pCurrentScreen != SCREEN_PARTY_CREATION ) + { + v11 = pCurrentScreen == SCREEN_CASTING; if ( !v11 ) goto LABEL_132; identify_item(); @@ -16484,7 +16493,7 @@ } //----- (004175C0) -------------------------------------------------------- -void __thiscall UI_OnMouseLeftClick(int *pXY) +void UI_OnMouseLeftClick(int *pXY) { int *pXY_; // esi@1 signed int y; // eax@7 @@ -16501,7 +16510,7 @@ unsigned int pY; // [sp+18h] [bp-4h]@7 pXY_ = pXY; - if ( pCurrentScreen == 16 + if ( pCurrentScreen == SCREEN_VIDEO || sub_4637E0_is_there_popup_onscreen() ) return; if ( pGUIWindow2 && pGUIWindow2->ptr_1C == (void *)33 ) @@ -16591,7 +16600,7 @@ else v5 = pRenderer->pActiveZBuffer[pX + pSRZBufferLineOffsets[pY]]; v6 = (unsigned __int16)v5; - if ( (v5 & 7) == 3 + if ( (v5 & 7) == OBJECT_Actor && uActiveCharacter && v5 < 33554432 && pPlayers[uActiveCharacter]->CanAct() diff -r 2cb13d295f4b -r 8e0e2991f9d1 mm7_6.cpp --- a/mm7_6.cpp Tue Feb 12 18:16:18 2013 +0600 +++ b/mm7_6.cpp Tue Feb 12 18:16:34 2013 +0600 @@ -3324,7 +3324,7 @@ v666 = v1; a2 = stru_50C198.FindClosesActor(5120, 1, v666); v6 = pMouse->uPointingObjectID; - if ( pMouse->uPointingObjectID != v1 && (v6 & 7) == 3 && pActors[v6 >> 3].CanAct() ) + if ( pMouse->uPointingObjectID != v1 && (v6 & 7) == OBJECT_Actor && pActors[v6 >> 3].CanAct() ) { v4 = pMouse->uPointingObjectID; LABEL_18: @@ -3333,9 +3333,9 @@ a1.uItemType = stru_4E3ACC[v3->spellnum].uItemType; if ( (short)a1.uItemType != (short)v1 ) { - if ( (a2 & 7) == 3 ) + if ( (a2 & 7) == OBJECT_Actor) { - memcpy(&v715, Actor::GetDirectionInfo((8 * v3->uPlayerID + 8) | 4, a2, &a3, 0), sizeof(v715)); + memcpy(&v715, Actor::GetDirectionInfo((8 * v3->uPlayerID + 8) | OBJECT_Player, a2, &a3, 0), sizeof(v715)); v2 = v723; v1 = 0; } @@ -3672,7 +3672,7 @@ goto LABEL_83; if ( a2 == v1 ) goto LABEL_200; - if ( (a2 & 7) != 3 ) + if ( (a2 & 7) != OBJECT_Actor) goto LABEL_1056; v699 = v1; v698 = v1; @@ -3750,7 +3750,7 @@ v47 = v38; goto LABEL_139; case 79: - if ( !pPlayer->CanCastSpell(uRequiredMana) || a2 == v1 || (a2 & 7) != 3 ) + if ( !pPlayer->CanCastSpell(uRequiredMana) || a2 == v1 || (a2 & 7) != OBJECT_Actor) goto LABEL_83; v730 = a2 >> 3; v693 = v1; @@ -3855,7 +3855,7 @@ if ( !pPlayer->CanCastSpell(uRequiredMana) ) goto LABEL_83; if ( a2 == v1 - || (a2 & 7) != 3 + || (a2 & 7) != OBJECT_Actor || (v730 = a2 >> 3, v721 = (int)&pActors[a2 >> 3], !stru_50C198.GetMagicalResistance(&pActors[a2 >> 3], 9u)) ) @@ -3897,7 +3897,7 @@ LODWORD(v733) = v57; if ( !pPlayer->CanCastSpell(uRequiredMana) ) goto LABEL_83; - if ( (a2 & 7) != 3 + if ( (a2 & 7) != OBJECT_Actor || (v721 = 836 * (a2 >> 3), LODWORD(v718) = (int)&pActors[a2 >> 3], !stru_50C198.GetMagicalResistance(&pActors[a2 >> 3], 3u)) ) @@ -4324,7 +4324,7 @@ while ( v730b <= &pParty->pPlayers[3] ); goto LABEL_1056; case 52: - if ( pPlayer->CanCastSpell(uRequiredMana) && a2 != v1 && (a2 & 7) == 3 ) + if ( pPlayer->CanCastSpell(uRequiredMana) && a2 != v1 && (a2 & 7) == OBJECT_Actor) { v730 = a2 >> 3; v112 = &pActors[a2 >> 3]; @@ -4511,7 +4511,7 @@ if ( !pPlayer->CanCastSpell(uRequiredMana) ) goto LABEL_83; LODWORD(v725) = a2 & 7; - if ( (a2 & 7) == 3 ) + if ( (a2 & 7) == OBJECT_Actor) { v152 = a2 >> 3; uRequiredMana = pActors[v152].vPosition.x; @@ -5820,7 +5820,7 @@ v27 = (char *)&pParty->pPlayers[v3->uPlayerID_2].pPlayerBuffs[4]; goto LABEL_104; } - if ( (v342 & 7) == 3 ) + if ( (v342 & 7) == OBJECT_Actor) { v343 = v342 >> 3; HIDWORD(v344) = v1 + ((pParty->uTimePlayed + 1280) >> 32); @@ -6211,7 +6211,7 @@ case 59: if ( !pPlayer->CanCastSpell(uRequiredMana) ) goto LABEL_83; - if ( a2 == v1 || (a2 & 7) != 3 ) + if ( a2 == v1 || (a2 & 7) != OBJECT_Actor) goto LABEL_1056; v417 = (int)&pActors[a2 >> 3]; v730 = v417; @@ -6303,7 +6303,7 @@ if ( !pPlayer->CanCastSpell(uRequiredMana) ) goto LABEL_83; v426 = a2 >> 3; - if ( (a2 & 7) != 3 ) + if ( (a2 & 7) != OBJECT_Actor) goto LABEL_1056; v730 = 836 * v426; if ( stru_50C198.GetMagicalResistance(&pActors[v426], 7u) ) @@ -6331,7 +6331,7 @@ goto LABEL_83; amount = 600 * v2; v427 = a2 >> 3; - if ( (a2 & 7) != 3 ) + if ( (a2 & 7) != OBJECT_Actor) goto LABEL_1056; v730 = 836 * v427; if ( MonsterStats::BelongsToSupertype(pActors[v427].pMonsterInfo.uID, MONSTER_SUPERTYPE_UNDEAD) ) @@ -6464,7 +6464,7 @@ if ( !pPlayer->CanCastSpell(uRequiredMana) ) goto LABEL_83; v445 = a2 >> 3; - if ( (a2 & 7) == 2 ) + if ( (a2 & 7) == OBJECT_Item) { v449 = (char *)&pLayingItems[v445].stru_24; v450 = *(int *)v449; @@ -6484,15 +6484,15 @@ } else { - if ( (a2 & 7) == 3 ) + if ( (a2 & 7) == OBJECT_Actor) { stru_50C198.LootActor(&pActors[v445]); } else { - if ( (a2 & 7) != 5 ) + if ( (a2 & 7) != OBJECT_Decoration) { - if ( (a2 & 7) != 6 ) + if ( (a2 & 7) != OBJECT_BModel) goto LABEL_1056; dword_507CD8 = 1; v677 = 1; @@ -6607,7 +6607,7 @@ } else { - if ( (v460 & 7) == 3 ) + if ( (v460 & 7) == OBJECT_Actor) { v461 = &pActors[v460 >> 3]; v462 = v461->uAIState; @@ -7431,7 +7431,7 @@ LODWORD(v733) = 29030400; LABEL_1082: v599 = a2 >> 3; - if ( (a2 & 7) != 3 ) + if ( (a2 & 7) != OBJECT_Actor) goto LABEL_1056; v730 = 836 * v599; if ( !MonsterStats::BelongsToSupertype(pActors[v599].pMonsterInfo.uID, MONSTER_SUPERTYPE_UNDEAD) ) @@ -7916,12 +7916,12 @@ v29 = 0; v28 = 0; v7 = pMouse->uPointingObjectID; - if ( (pMouse->uPointingObjectID & 7) != 3 || (v34 = pMouse->uPointingObjectID, !pActors[v7 >> 3].CanAct()) ) + if ( (pMouse->uPointingObjectID & 7) != OBJECT_Actor || (v34 = pMouse->uPointingObjectID, !pActors[v7 >> 3].CanAct()) ) v34 = stru_50C198.FindClosesActor(5120, 0, 0); a3.z = 0; a3.y = 0; a3.x = 0; - if ( (v34 & 7) == 3 ) + if ( (v34 & 7) == OBJECT_Actor) { a2 = v34 >> 3; v8 = &pActors[v34 >> 3]; @@ -8174,7 +8174,7 @@ { v22 = *v28; v11 = *v28 & 0xFFFF; - if ( (*(char *)v28 & 7) == 3 ) + if ( (*(char *)v28 & 7) == OBJECT_Actor) { v12 = &pActors[(unsigned int)v11 >> 3]; v13 = v12->uAIState; @@ -8921,7 +8921,7 @@ pParty->uFlags2 |= PARTY_FLAGS_2_RUNNING; } - pParty->uFlags2 |= PARTY_FLAGS_2_RUNNING; + //pParty->uFlags2 |= PARTY_FLAGS_2_RUNNING; LABEL_6: if ( !pEventTimer->bPaused ) { @@ -8949,7 +8949,7 @@ pTurnEngine->uActionPointsLeft -= 26; _do_move_forward: v5 = pActionQueue; - if ( pParty->uFlags2 & 2 ) + if ( pParty->uFlags2 & PARTY_FLAGS_2_RUNNING) partyAction = PARTY_RunForward; else partyAction = PARTY_WalkForward; @@ -9115,7 +9115,7 @@ { if (pParty->bTurnBasedModeOn) { - if ( pTurnEngine->field_4 == 3 || (pTurnEngine->pQueue[0].uPackedID & 7) == 4 ) + if ( pTurnEngine->field_4 == OBJECT_Actor || (pTurnEngine->pQueue[0].uPackedID & 7) == OBJECT_Player) { pParty->bTurnBasedModeOn = 0; pTurnEngine->End(true); @@ -9184,7 +9184,7 @@ pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)404; goto _send_message; } - if ( pCurrentScreen == 4 ) + if ( pCurrentScreen == SCREEN_NPC_DIALOGUE ) { v11 = pMessageQueue_50CBD0->uNumMessages; if ( pMessageQueue_50CBD0->uNumMessages ) @@ -9210,7 +9210,7 @@ break; case INPUT_CharCycle: //__debugbreak(); - if ( pCurrentScreen == 8 + if ( pCurrentScreen == SCREEN_SPELL_BOOK || dword_50C9E8 >= 40 ) break; dword_50C9EC[3 * dword_50C9E8] = 176; @@ -9311,8 +9311,8 @@ ++pMessageQueue_50CBD0->uNumMessages; goto LABEL_175; } - if ( pCurrentScreen == 4 - || pCurrentScreen == 19 ) + if ( pCurrentScreen == SCREEN_NPC_DIALOGUE + || pCurrentScreen == SCREEN_BRANCHLESS_NPC_DIALOG ) { v15 = pMessageQueue_50CBD0->uNumMessages; if ( pMessageQueue_50CBD0->uNumMessages ) diff -r 2cb13d295f4b -r 8e0e2991f9d1 mm7_data.cpp --- a/mm7_data.cpp Tue Feb 12 18:16:18 2013 +0600 +++ b/mm7_data.cpp Tue Feb 12 18:16:34 2013 +0600 @@ -1466,7 +1466,7 @@ int bRingsShownInCharScreen; // weak int _unused000; // weak -unsigned __int16 _56EFD8_minimap[117][137]; +unsigned __int16 pOdmMinimap[117][137]; unsigned int uNumBlueFacesInBLVMinimap; unsigned __int16 pBlueFacesInBLVMinimapIDs[50]; int pTextureIDs_isns[14]; @@ -1763,18 +1763,18 @@ int dword_76D53C_terrain_cell_world_pos_around_party_x; // weak int dword_76D540_terrain_cell_world_pos_around_party_x; // weak int dword_76D544_terrain_cell_world_pos_around_party_x; // weak -int dword_76D548_terrain_cell_world_pos_around_party_y; // weak -int dword_76D54C_terrain_cell_world_pos_around_party_y; // weak -int dword_76D550_terrain_cell_world_pos_around_party_y; // weak -int dword_76D554_terrain_cell_world_pos_around_party_y; // weak -int dword_76D558_terrain_cell_world_pos_around_party_z; // weak -int dword_76D55C_terrain_cell_world_pos_around_party_z; // weak -int dword_76D560_terrain_cell_world_pos_around_party_z; // weak -int dword_76D564_terrain_cell_world_pos_around_party_z; // weak -int dword_76D568_terrain_cell_world_pos_around_party_x; // weak -int dword_76D56C_terrain_cell_world_pos_around_party_x; // weak -int dword_76D570_terrain_cell_world_pos_around_party_x; // weak -int dword_76D574_terrain_cell_world_pos_around_party_x; // weak +//int dword_76D548_terrain_cell_world_pos_around_party_y; // weak +//int dword_76D54C_terrain_cell_world_pos_around_party_y; // weak +//int dword_76D550_terrain_cell_world_pos_around_party_y; // weak +//int dword_76D554_terrain_cell_world_pos_around_party_y; // weak +//int dword_76D558_terrain_cell_world_pos_around_party_z; // weak +//int dword_76D55C_terrain_cell_world_pos_around_party_z; // weak +//int dword_76D560_terrain_cell_world_pos_around_party_z; // weak +//int dword_76D564_terrain_cell_world_pos_around_party_z; // weak +//int dword_76D568_terrain_cell_world_pos_around_party_x; // weak +//int dword_76D56C_terrain_cell_world_pos_around_party_x; // weak +//int dword_76D570_terrain_cell_world_pos_around_party_x; // weak +//int dword_76D574_terrain_cell_world_pos_around_party_x; // weak struct unk_F7B60C stru_76D578; // struct @ MM7.exe::0076D578 struct unk_F7B60C stru_76D590; // struct @ MM7.exe::0076D590 struct unk_F7B60C stru_76D5A8; // struct @ MM7.exe::0076D5A8 diff -r 2cb13d295f4b -r 8e0e2991f9d1 mm7_data.h --- a/mm7_data.h Tue Feb 12 18:16:18 2013 +0600 +++ b/mm7_data.h Tue Feb 12 18:16:34 2013 +0600 @@ -1310,7 +1310,7 @@ extern int bRingsShownInCharScreen; // weak extern int _unused000; // weak -extern unsigned __int16 _56EFD8_minimap[117][137]; +extern unsigned __int16 pOdmMinimap[117][137]; extern unsigned int uNumBlueFacesInBLVMinimap; extern unsigned __int16 pBlueFacesInBLVMinimapIDs[50]; extern int pTextureIDs_isns[14]; @@ -1608,18 +1608,18 @@ extern int dword_76D53C_terrain_cell_world_pos_around_party_x; // weak extern int dword_76D540_terrain_cell_world_pos_around_party_x; // weak extern int dword_76D544_terrain_cell_world_pos_around_party_x; // weak -extern int dword_76D548_terrain_cell_world_pos_around_party_y; // weak -extern int dword_76D54C_terrain_cell_world_pos_around_party_y; // weak -extern int dword_76D550_terrain_cell_world_pos_around_party_y; // weak -extern int dword_76D554_terrain_cell_world_pos_around_party_y; // weak -extern int dword_76D558_terrain_cell_world_pos_around_party_z; // weak -extern int dword_76D55C_terrain_cell_world_pos_around_party_z; // weak -extern int dword_76D560_terrain_cell_world_pos_around_party_z; // weak -extern int dword_76D564_terrain_cell_world_pos_around_party_z; // weak -extern int dword_76D568_terrain_cell_world_pos_around_party_x; // weak -extern int dword_76D56C_terrain_cell_world_pos_around_party_x; // weak -extern int dword_76D570_terrain_cell_world_pos_around_party_x; // weak -extern int dword_76D574_terrain_cell_world_pos_around_party_x; // weak +//extern int dword_76D548_terrain_cell_world_pos_around_party_y; // weak +//extern int dword_76D54C_terrain_cell_world_pos_around_party_y; // weak +//extern int dword_76D550_terrain_cell_world_pos_around_party_y; // weak +//extern int dword_76D554_terrain_cell_world_pos_around_party_y; // weak +//extern int dword_76D558_terrain_cell_world_pos_around_party_z; // weak +//extern int dword_76D55C_terrain_cell_world_pos_around_party_z; // weak +//extern int dword_76D560_terrain_cell_world_pos_around_party_z; // weak +//extern int dword_76D564_terrain_cell_world_pos_around_party_z; // weak +//extern int dword_76D568_terrain_cell_world_pos_around_party_x; // weak +//extern int dword_76D56C_terrain_cell_world_pos_around_party_x; // weak +//extern int dword_76D570_terrain_cell_world_pos_around_party_x; // weak +//extern int dword_76D574_terrain_cell_world_pos_around_party_x; // weak extern char byte_76D5C0; extern struct unk_F7B60C stru_76D578; extern struct unk_F7B60C stru_76D590; @@ -1858,7 +1858,7 @@ void __cdecl identify_item(); void __thiscall sub_416B01(void *_this); void __thiscall sub_416D62_ShowPopupWindow_MonsterRecord_ItemInfo_etcsub_416D62(struct Vec2_int_ *_this); -void __thiscall UI_OnMouseLeftClick(int *pXY); // idb +void UI_OnMouseLeftClick(int *pXY); // idb void __thiscall sub_417871(int *pXY); void __cdecl sub_4178C4(); void __cdecl sub_4178E1(); @@ -2000,7 +2000,7 @@ void Load_isn_spells_21_27(); void GameUI_DrawPartySpells(); __int16 __fastcall sub_441A4E(int a1); -void GameUI_DrawMinimap(unsigned int uX, unsigned int uY, unsigned int uZ, unsigned int uW, unsigned int uZoom, unsigned int flags); +void GameUI_DrawMinimap(unsigned int uX, unsigned int uY, unsigned int uZ, unsigned int uW, unsigned int uZoom, unsigned int bRedrawOdmMinimap); int __fastcall DrawSpellbook_Map_sub(unsigned int x, unsigned int y, unsigned int a4, int a5, int _48074); // idb int __cdecl Initialize2DA(); unsigned int __fastcall LoadEventsToBuffer(const char *pContainerName, char *a2, unsigned int uBufferSize); @@ -2163,7 +2163,7 @@ int _46CEC3_get_floor_level(int x, int y, int z, unsigned int uSectorID, unsigned int *pFaceID); int __fastcall sub_46D49E_prolly_get_world_y_under_party(int a1, signed int a2, int a3, int a4, int *a5, int *a6, int a7); int __fastcall sub_46D8E3(int a1, signed int a2, int a3, int a4); -signed __int64 __fastcall _46DCC8_get_gravity_direction_outdoor(int a1, int a2, Vec3_int_ *a3); +void ODM_GetTerrainNormalAt(int pos_x, int pos_z, Vec3_int_ *out); unsigned int __fastcall sub_46DEF2(signed int a2, unsigned int uLayingItemID); int __fastcall _46DF1A_collide_against_actor(int, int); // weak void __cdecl _46E0B2_collide_against_decorations(); @@ -2225,7 +2225,7 @@ void __cdecl sub_481ED9_MessWithOutdoorCamera(); bool __fastcall sub_481EFA(RenderVertexSoft *a1, RenderVertexSoft *a2, RenderVertexSoft *a3, RenderVertexSoft *a4, int a5); signed int __fastcall sub_481FC9(RenderVertexSoft *_ECX, RenderVertexSoft *a2, RenderVertexSoft *a3, stru148 *a4); -bool __fastcall GetTerrainHeightsAroundParty(int a1, int a2); +bool IsTerrainSlopeTooHigh(int pos_x, int pos_y); int __fastcall GetTerrainHeightsAroundParty2(int a1, int a2, int *a3, int a4); struct stru148 *__fastcall sr_sub_4829B9(RenderVertexSoft *a1, RenderVertexSoft *a2, RenderVertexSoft *a3, stru148 *a4, int a5); signed int __cdecl const_1_0(); diff -r 2cb13d295f4b -r 8e0e2991f9d1 stru6.cpp --- a/stru6.cpp Tue Feb 12 18:16:18 2013 +0600 +++ b/stru6.cpp Tue Feb 12 18:16:34 2013 +0600 @@ -595,11 +595,11 @@ } //----- (004A7E89) -------------------------------------------------------- -int stru6::_4A7E89_sparkles_on_actor_after_it_casts_buff(Actor *pActor, unsigned int uDiffuse) +void stru6::_4A7E89_sparkles_on_actor_after_it_casts_buff(Actor *pActor, unsigned int uDiffuse) { Actor *v3; // edi@1 int v4; // ebx@3 - int result; // eax@5 + //int result; // eax@5 Particle_ Dst; // [sp+Ch] [bp-6Ch]@1 int v7; // [sp+74h] [bp-4h]@2 signed int pActora; // [sp+80h] [bp+8h]@1 @@ -632,7 +632,6 @@ --pActora; } while ( pActora ); - return result; } //----- (004A7F74) -------------------------------------------------------- @@ -1586,11 +1585,11 @@ v24 = 16777216; LODWORD(v18) = 0; HIDWORD(v18) = (signed __int16)(LOWORD(pViewport->uViewportZ) - LOWORD(pViewport->uViewportX)); - vsr.field_10 = v18 / 16777216; + vsr._screenspace_x_scaler_packedfloat = v18 / 0x1000000; LODWORD(v18) = 0; HIDWORD(v18) = (signed __int16)(LOWORD(pViewport->uViewportW) - LOWORD(pViewport->uViewportY)); v26 = v18 / 16777216; - vsr.field_14 = v18 / 16777216; + vsr._screenspace_y_scaler_packedfloat = v18 / 0x1000000; vsr.pPalette = PaletteManager::Get_Dark_or_Red_LUT(v70->uPaletteIndex, 0, 1); vsr.uTargetPitch = pRenderer->uTargetSurfacePitch; vsr.uParentBillboardID = -1; @@ -1633,7 +1632,7 @@ { v7 = pIconsFrameTable->GetFrame(*((int *)v2 + 2), v3); pRenderer->DrawTextureTransparent(*v1, 0x181u, &pIcons_LOD->pTextures[v7->uTextureID]); - pOtherOverlayList->field_3EC = 1; + pOtherOverlayList->bRedraw = true; } else { diff -r 2cb13d295f4b -r 8e0e2991f9d1 stru6.h --- a/stru6.h Tue Feb 12 18:16:18 2013 +0600 +++ b/stru6.h Tue Feb 12 18:16:34 2013 +0600 @@ -128,7 +128,7 @@ void _4A7A66_miltiple_spell_collision_partifles___like_after_sparks_or_lightning(LayingItem *a1, unsigned int uDiffuse, unsigned int uTextureID, float a4); void _4A7C07(struct LayingItem *a2); void AddProjectile(struct LayingItem *a2, int a3, unsigned int uTextureID); - int _4A7E89_sparkles_on_actor_after_it_casts_buff(struct Actor *pActor, unsigned int uDiffuse); + void _4A7E89_sparkles_on_actor_after_it_casts_buff(struct Actor *pActor, unsigned int uDiffuse); void _4A7F74(int x, int y, int z); int _4A806F(struct Actor *pActor); void _4A80DC_some_stuff_sw(struct LayingItem *a2);