Mercurial > mm7
changeset 1292:24bc24b64ec2
Слияние
author | Ritor1 |
---|---|
date | Fri, 14 Jun 2013 16:06:30 +0600 |
parents | 1577d75db258 (current diff) 33e360a9b4bf (diff) |
children | 557c0c3cc314 |
files | Events.cpp Indoor.cpp Indoor_stuff.h UIHouses.cpp UITransition.cpp mm7_1.cpp mm7_3.cpp mm7_4.cpp |
diffstat | 64 files changed, 1479 insertions(+), 2716 deletions(-) [+] |
line wrap: on
line diff
--- a/Actor.cpp Fri Jun 14 16:06:20 2013 +0600 +++ b/Actor.cpp Fri Jun 14 16:06:30 2013 +0600 @@ -5,7 +5,7 @@ #include <assert.h> -#include "VideoPlayer.h" +#include "mm7_data.h" #include "DecalBuilder.h" #include "Sprites.h"
--- a/Allocator.cpp Fri Jun 14 16:06:20 2013 +0600 +++ b/Allocator.cpp Fri Jun 14 16:06:30 2013 +0600 @@ -4,7 +4,6 @@ #include <string.h> #include <stdio.h> -#include "OSAPI.h" #include "Allocator.h"
--- a/Arcomage.cpp Fri Jun 14 16:06:20 2013 +0600 +++ b/Arcomage.cpp Fri Jun 14 16:06:30 2013 +0600 @@ -5,7 +5,7 @@ #include <string> #include <assert.h> -#include "LightmapBuilder.h" +#include "Render.h" #include "Arcomage.h" #include "VideoPlayer.h" #include "AudioPlayer.h" @@ -20,39 +20,39 @@ #include "VectorTypes.h" #include "texts.h" #include <windef.h> +#include "mm7_data.h" void SetStartConditions(); - - void SetStartGameData(); void FillPlayerDeck(); void InitalHandsFill(); void GetNextCardFromDeck(int player_num); int GetEmptyCardSlotIndex(int player_num); void IncreaseResourcesInTurn(int player_num); -void __cdecl am_40A383(); -bool IsGameOver(); -char __thiscall am_40A560(unsigned int _this); -void DrawGameUI(int a1); // idb -void am_40AA4E(); +void TurnChange(); +bool IsGameOver(); +int CalculateCardPower(ArcomagePlayer* player, ArcomagePlayer* enemy, ArcomageCard* pCard, int mastery); +char PlayerTurn(int player_num); +void DrawGameUI(int animation_stage); +void DrawSparks(); void DrawRectanglesForText(); void DrawPlayersText(); -void DrawPlayerLevels(int a1, char *text, POINT *pXY); // idb -void DrawBricksCount(int a1, char* text, POINT *pXY); // idb +void DrawPlayerLevels(int a1, char *text, POINT *pXY); +void DrawBricksCount(int a1, char* text, POINT *pXY); void DrawGemsCount(int a1, char* text, POINT* pXY); -void DrawBeastsCount(int a1, char *text, POINT *pXY); // idb +void DrawBeastsCount(int a1, char *text, POINT *pXY); void DrawPlayersTowers(); void DrawPlayersWall(); void DrawCards(); void DrawCardAnimation(int a1); int GetPlayerHandCardCount(int player_num); signed int DrawCardsRectangles(int player_num); -bool am_40BCFB(int player_num, signed int card_slot_index); +bool DiscardCard(int player_num, signed int card_slot_index); bool PlayCard(int player_num, signed int card_slot_num); bool CanCardBePlayed(int player_num, int hand_card_indx); -void ApplyCardToPlayer(int player_num, unsigned int uCardID); // idb +void ApplyCardToPlayer(int player_num, unsigned int uCardID); int am_40D2B4(POINT* a1, int a2); // weak int ApplyDamageToBuildings(int player_num, int damage); // weak void GameResultsApply(); @@ -62,9 +62,10 @@ void __fastcall Blt_Chroma(RECT *pSrcXYZW, POINT *pTargetXY, int a3, int a4); void Blt_Copy(RECT *pSrcRect, POINT *pTargetXY, int a3); void __cdecl am_EndScene(); -void __fastcall DrawRect(RECT *pXYZW, unsigned __int16 uColor, char bSolidFill); // idb -void SetPixel(POINT *pTargetXY, unsigned __int16 uColor); -int __fastcall rand_interval(int a, int b); // idb +void DrawRect(RECT *pXYZW, unsigned __int16 uColor, char bSolidFill); +void SetPixel2sq( POINT *pTargetXY, unsigned __int16 uColor ); +void SetPixel(POINT *pTargetXY, unsigned __int16 uColor); +int rand_interval(int min, int max); // idb void __fastcall intToString(int val, char *pOut); /* 388 */ @@ -81,10 +82,10 @@ __int16 bricks_amount; __int16 gems_amount; __int16 beasts_amount; - int field_14; + int mastery_lvl; }; #pragma pack(pop) -ArcomageStartConditions start_conditions[13] = +const ArcomageStartConditions start_conditions[13] = { { 30, 100, 15, 5, 2, 2, 2, 10, 10, 10, 0}, { 50, 150, 20, 5, 2, 2, 2, 5, 5, 5, 1}, @@ -127,17 +128,28 @@ int x; int y; - char field_8; - char field_9; - char field_A; - char field_B; + char curr_mouse_left; + char mouse_left_state_changed; + char curr_mouse_right; + char mouse_right_state_changed; }; #pragma pack(pop) +#pragma pack(push, 1) +struct am_2 + { + int slot_index; + int card_power; + }; +#pragma pack(pop) + +am_2 cards_power[10]; +std::array<__int16, 12> am_sounds; + char byte_4E185C = 1; // weak char am_byte_4E185D = 1; // weak -char byte_4E185E = 1; // weak +char use_start_bonus = 1; // weak int start_tower_height; int start_wall_height; @@ -154,13 +166,13 @@ int max_tower_height = 50; int max_resources_amount = 100 ; -int dword_4DF3A4; // weak +int opponent_mastery = 1 ; // weak char byte_4FAA2C; // weak char byte_4FAA2D; // weak int current_player_num; // idb -char hand_full; // weak +char need_to_discard_card; // weak signed int current_card_slot_index; int played_card_id; // idb 4FABC0 @@ -182,6 +194,24 @@ int dword_4FABB8; // weak +char byte_4FAA00; // weak + +int amuint_4FAA34; // weak +int amuint_4FAA38; // weak +int amuint_4FAA4C; // weak + +char byte_4FAA2E; // weak + +int dword_4FAA70; // weak +char byte_4FAA74; // weak +char am_byte_4FAA75; // weak +char am_byte_4FAA76; // weak + +int amuint_4FABC4; // weak + + +char byte_505880; // weak +char byte_505881; // weak //----- (0040DD2F) -------------------------------------------------------- bool stru273::_40DD2F() @@ -189,12 +219,12 @@ this->x = pArcomageGame->mouse_x; this->y = pArcomageGame->mouse_y; - this->field_8 = pArcomageGame->mouse_left; - this->field_9 = pArcomageGame->mouse_left == pArcomageGame->field_F7; - this->field_A = pArcomageGame->mouse_right; - this->field_B = pArcomageGame->mouse_right == pArcomageGame->field_F8; - pArcomageGame->field_F7 = pArcomageGame->mouse_left; - pArcomageGame->field_F8 = pArcomageGame->mouse_right; + this->curr_mouse_left = pArcomageGame->mouse_left; + this->mouse_left_state_changed = pArcomageGame->mouse_left == pArcomageGame->prev_mouse_left; + this->curr_mouse_right = pArcomageGame->mouse_right; + this->mouse_right_state_changed = pArcomageGame->mouse_right == pArcomageGame->prev_mouse_right; + pArcomageGame->prev_mouse_left = pArcomageGame->mouse_left; + pArcomageGame->prev_mouse_right = pArcomageGame->mouse_right; return true; } @@ -213,7 +243,7 @@ v2 = (stru272_stru0 *)malloc(0x5Cu); *a1 = v2; v2->signature = SIG_trpg; - v2->field_8 = 0; + v2->position_in_sparks_arr = 0; v2->field_30 = 0.0; v2->field_58 = 0; v2->field_59 = 0; @@ -235,16 +265,16 @@ } //----- (0040E01A) -------------------------------------------------------- -int stru272_stru0::_40E01A( stru272_stru2* a2 ) +int stru272_stru0::StartFill( stru272_stru2* a2 ) { auto a1 = this; if ( a1->signature == SIG_trpg ) { a1->field_4 = a2->field_20; - a1->field_C = a2->field_0 << 16; - a1->field_10 = a2->field_4 << 16; - a1->field_14 = a2->field_8 << 16; - a1->field_18 = a2->field_C << 16; + a1->field_C = a2->effect_area.left << 16; + a1->field_10 = a2->effect_area.top << 16; + a1->field_14 = a2->effect_area.right << 16; + a1->field_18 = a2->effect_area.bottom << 16; a1->field_1C = a2->field_10; a1->field_20 = a2->field_14; a1->field_24 = a2->field_18; @@ -254,7 +284,7 @@ a1->field_38 = (int)(a2->field_2Cf * 65536.0); a1->field_3C = a2->field_30; a1->field_40 = a2->field_34; - a1->field_54 = a2->field_38; + a1->field_54 = a2->sparks_array; a1->field_59 = 1; return 0; @@ -270,14 +300,14 @@ { if ( a2 ) { - field_8 = 0; + position_in_sparks_arr = 0; field_30 = 0.0; } if ( field_59 && a3 ) { for (int i=0; i<field_4; ++i) - field_54[i].field_0 = 0; + field_54[i].have_spark = 0; field_58 = 0; } return 0; @@ -287,7 +317,7 @@ } //----- (0040E133) -------------------------------------------------------- -int stru272_stru0::_40E133() +int stru272_stru0::DrawEffect() { stru272_stru0 *v1; // edi@1 @@ -315,7 +345,7 @@ v1 = this; if ( this->signature != SIG_trpg ) return 2; - v3 = this->field_8; + v3 = this->position_in_sparks_arr; v22 = this->field_30; v4 = v3; if ( v3 > 0 ) @@ -331,28 +361,29 @@ v7 = this->field_54; v20 = this->field_28; v21 = this->field_4; - while ( v7->field_0 <= 0 ) + while ( v7->have_spark <= 0 ) { if ( v22 >= 1.0 ) { v12 = v1->field_40; v13 = v1->field_3C; - v7->field_0 = v13 + rand() % (v12 - v13 + 1); + v7->have_spark = rand_interval(v13,v12); v7->field_14 = (rand() % 17 - 8) << 16; v7->field_18 = (rand() % 17 - 8) << 16; + v14 = v1->field_14 - 1; v15 = v1->field_C; - v16 = v15 + rand() % (v14 - v15 + 1); + v16 = rand_interval(v15,v14); v7->field_C = v16; - v7->field_4.x = v16 >> 16; + v7->spark_position.x = v16 >> 16; v17 = v1->field_18 - 1; v18 = v1->field_10; - v22 = v22 - 1.0; - v19 = v18 + rand() % (v17 - v18 + 1); + v19 = rand_interval(v17, v18); v7->field_10 = v19; - v7->field_4.y = v19 >> 16; - --v1->field_8; + v7->spark_position.y = v19 >> 16; + --v1->position_in_sparks_arr; + v22 = v22 - 1.0; goto LABEL_13; } LABEL_14: @@ -366,17 +397,17 @@ } } v8 = v7->field_14; - --v7->field_0; + --v7->have_spark; v9 = v8 + v7->field_C; v10 = v20 + v7->field_18; v7->field_C = v9; - v7->field_4.x = v9 >> 16; + v7->spark_position.x = v9 >> 16; v11 = v10 + v7->field_10; v7->field_18 = v10; v7->field_10 = v11; - v7->field_4.y = v11 >> 16; + v7->spark_position.y = v11 >> 16; LABEL_13: v6 = 1; goto LABEL_14; @@ -390,7 +421,7 @@ if (signature == SIG_trpg ) { - if ( field_8 <= 0 ) + if ( position_in_sparks_arr <= 0 ) return field_58 != 0 ? 2 : 0; else return 1; @@ -428,9 +459,9 @@ pTargetPoint.x = 0; pTargetPoint.y = 0; - pSrcRect.left = 0; - pSrcRect.right = 640; - pSrcRect.top = 0; + pSrcRect.left = 0; + pSrcRect.top = 0; + pSrcRect.right = 640; pSrcRect.bottom = 480; pRenderer->BeginScene(); @@ -758,793 +789,441 @@ return true; } +int CalculateCardPower(ArcomagePlayer* player, ArcomagePlayer* enemy, ArcomageCard* pCard, int mastery) + { + enum V_INDX{ + P_TOWER_M10, + P_WALL_M10, + E_TOWER, + E_WALL, + E_BUILDINGS, + E_QUARRY, + E_MAGIC, + E_ZOO, + E_RES, + V_INDEX_MAX + }; + + const int mastery_coeff[V_INDEX_MAX][2]= {{10, 5}, //P_TOWER_M10 + {2, 1}, //P_WALL_M10 + {1, 10}, //E_TOWER + {1, 3}, //E_WALL + {1, 7}, //E_BUILDINGS + {1, 5}, //E_QUARRY + {1, 40}, //E_MAGIC + {1, 40}, //E_ZOO + {1, 2} //E_RES + }; + int card_power= 0; + int element_power; + + + if ( pCard->to_player_tower == 99 || pCard->to_pl_enm_tower == 99|| + pCard->to_player_tower2 == 99 || pCard->to_pl_enm_tower2 == 99 ) + element_power = enemy->tower_height - player->tower_height; + else + element_power = pCard->to_player_tower + pCard->to_pl_enm_tower + pCard->to_player_tower2 + pCard->to_pl_enm_tower2; + + if ( player->tower_height >= 10 ) + card_power += mastery_coeff[P_TOWER_M10][mastery]*element_power; + else + card_power += 20*element_power; + + + if ( pCard->to_player_wall == 99 || pCard->to_pl_enm_wall == 99 || + pCard->to_player_wall2 == 99 || pCard->to_pl_enm_wall2 == 99 ) + element_power = enemy->wall_height - player->wall_height; + else + element_power = pCard->to_player_wall + pCard->to_pl_enm_wall + + pCard->to_player_wall2 + pCard->to_pl_enm_wall2; + if ( player->wall_height >= 10 ) + card_power += mastery_coeff[P_WALL_M10][mastery]*element_power; //1 + else + card_power += 5*element_power; + + + card_power += 7 * (pCard->to_player_buildings + pCard->to_pl_enm_buildings + + pCard->to_player_buildings2 + pCard->to_pl_enm_buildings2); + + if ( pCard->to_player_quarry_lvl == 99 || pCard->to_pl_enm_quarry_lvl == 99 || + pCard->to_player_quarry_lvl2 == 99 || pCard->to_pl_enm_quarry_lvl2 == 99 ) + element_power = enemy->quarry_level - player->quarry_level; + else + element_power = pCard->to_player_quarry_lvl + pCard->to_pl_enm_quarry_lvl + + pCard->to_player_quarry_lvl2 + pCard->to_pl_enm_quarry_lvl; + + card_power += 40 * element_power; + + if ( pCard->to_player_magic_lvl == 99 || pCard->to_pl_enm_magic_lvl == 99 || + pCard->to_player_magic_lvl2 == 99 || pCard->to_pl_enm_magic_lvl2 == 99 ) + element_power = enemy->magic_level - player->magic_level; + else + element_power = pCard->to_player_magic_lvl + pCard->to_pl_enm_magic_lvl + + pCard->to_player_magic_lvl2 + pCard->to_pl_enm_magic_lvl2; + card_power += 40 *element_power; + + if ( pCard->to_player_zoo_lvl == 99 || pCard->to_pl_enm_zoo_lvl == 99 || + pCard->to_player_zoo_lvl2 == 99 || pCard->to_pl_enm_zoo_lvl2 == 99 ) + element_power = enemy->zoo_level - player->zoo_level; + else + element_power = pCard->to_player_zoo_lvl + pCard->to_pl_enm_zoo_lvl + + pCard->to_player_zoo_lvl2 + pCard->to_pl_enm_zoo_lvl2; + card_power += 40 *element_power; + + if ( pCard->to_player_bricks == 99 || pCard->to_pl_enm_bricks == 99 || + pCard->to_player_bricks2 == 99 || pCard->to_pl_enm_bricks2 == 99 ) + element_power = enemy->resource_bricks - player->resource_bricks; + else + element_power = pCard->to_player_bricks + pCard->to_pl_enm_bricks + + pCard->to_player_bricks2 + pCard->to_pl_enm_bricks2; + card_power += 2 *element_power; + + + if ( pCard->to_player_gems == 99 || pCard->to_pl_enm_gems == 99 || + pCard->to_player_gems2 == 99 || pCard->to_pl_enm_gems2 == 99 ) + element_power = enemy->resource_gems - player->resource_gems; + else + element_power = pCard->to_player_gems + pCard->to_pl_enm_gems + + pCard->to_player_gems2 + pCard->to_pl_enm_gems2; + card_power += 2 *element_power; + + if ( pCard->to_player_beasts == 99 || pCard->to_pl_enm_beasts == 99 || + pCard->to_player_beasts2 == 99 || pCard->to_pl_enm_beasts2 == 99 ) + element_power = enemy->resource_beasts - player->resource_beasts; + else + element_power = pCard->to_player_beasts + pCard->to_pl_enm_beasts + + pCard->to_player_beasts2 + pCard->to_pl_enm_beasts2; + card_power += 2 *element_power; + + if ( pCard->to_enemy_tower == 99 || pCard->to_enemy_tower2 == 99 ) + element_power = player->tower_height - enemy->tower_height; + else + element_power = -(pCard->to_enemy_tower + pCard->to_enemy_tower2); + card_power += mastery_coeff[E_TOWER][mastery]*element_power; + + if ( pCard->to_enemy_wall == 99 || pCard->to_enemy_wall2 == 99 ) + element_power = player->wall_height - enemy->wall_height; + else + element_power = -(pCard->to_enemy_wall + pCard->to_enemy_wall2); + card_power += mastery_coeff[E_WALL][mastery]*element_power; + + card_power -= mastery_coeff[E_BUILDINGS][mastery]*(pCard->to_enemy_buildings + pCard->to_enemy_buildings2); + + if ( pCard->to_enemy_quarry_lvl == 99 || pCard->to_enemy_quarry_lvl2 == 99 ) + element_power = player->quarry_level - enemy->quarry_level; //5 + else + element_power = -(pCard->to_enemy_quarry_lvl + pCard->to_enemy_quarry_lvl2); //5 + card_power += mastery_coeff[E_QUARRY][mastery]*element_power; + + if ( pCard->to_enemy_magic_lvl == 99 || pCard->to_enemy_magic_lvl2 == 99 ) + element_power = player->magic_level - enemy->magic_level; //40 + else + element_power = -(pCard->to_enemy_magic_lvl + pCard->to_enemy_magic_lvl2); + card_power += mastery_coeff[E_MAGIC][mastery]*element_power; + + if ( pCard->to_enemy_zoo_lvl == 99 || pCard->to_enemy_zoo_lvl2 == 99 ) + element_power = player->zoo_level - enemy->zoo_level; //40 + else + element_power = -(pCard->to_enemy_zoo_lvl + pCard->to_enemy_zoo_lvl2); + card_power += mastery_coeff[E_ZOO][mastery]*element_power; + + if ( pCard->to_enemy_bricks == 99 || pCard->to_enemy_bricks2 == 99 ) + element_power = player->resource_bricks - enemy->resource_bricks; //2 + else + element_power = -(pCard->to_enemy_bricks + pCard->to_enemy_bricks2); + card_power += mastery_coeff[E_RES][mastery]*element_power; + + if ( pCard->to_enemy_gems == 99 || pCard->to_enemy_gems2 == 99 ) + element_power = player->resource_gems - enemy->resource_gems; //2 + else + element_power = -(pCard->to_enemy_gems + pCard->to_enemy_gems2); + card_power += mastery_coeff[E_RES][mastery]*element_power; + + if ( pCard->to_enemy_beasts == 99 || pCard->to_enemy_beasts2 == 99 ) + element_power = player->resource_beasts - enemy->resource_beasts; //2 + else + element_power = -(pCard->to_enemy_beasts + pCard->to_enemy_beasts2); + card_power += mastery_coeff[E_RES][mastery]*element_power; + + if ( pCard->field_30 || pCard->field_4D ) + card_power *= 10; + + if ( pCard->field_24 == 1 ) + element_power = player->resource_bricks - pCard->needed_bricks; + else if ( pCard->field_24 == 2 ) + element_power = player->resource_gems - pCard->needed_gems; + else if (pCard->field_24 == 3) + element_power = player->resource_beasts - pCard->needed_beasts; + if ( element_power > 3 ) + element_power = 3; + card_power += 5 * element_power; + + if ( enemy->tower_height <= pCard->to_enemy_tower2 + pCard->to_enemy_tower ) + card_power += 9999; + + if (pCard->to_enemy_tower2 + pCard->to_enemy_tower + + pCard->to_enemy_wall + pCard->to_enemy_wall2 + + pCard->to_enemy_buildings + pCard->to_enemy_buildings2 >= enemy->wall_height + enemy->tower_height) + card_power += 9999; + + if ( (pCard->to_player_tower2 + pCard->to_pl_enm_tower2 + + pCard->to_player_tower + pCard->to_pl_enm_tower + player->tower_height) >= max_tower_height ) + card_power += 9999; + + return card_power; + } + + //----- (00408BB4) -------------------------------------------------------- -bool __fastcall am_408BB4(int a1) +bool OpponentsAITurn(int player_num) { -// char result; // al@3 -// signed int v3; // ebx@8 -// int v4; // esi@8 -// int v5; // eax@9 -// int v6; // edi@9 -// int v7; // eax@11 -// signed int v8; // eax@11 -// int v9; // ebx@5 -// int v10; // eax@5 -// int v11; // ecx@18 -// char v12; // bl@20 -// int v13; // eax@20 -// ArcomageCard *v14; // ecx@20 -// char v15; // dl@20 -// char v16; // dl@24 -// int v17; // edx@25 -// int v18; // edx@27 -// char v19; // dl@31 -// int v20; // edx@32 -// char v21; // dl@35 -// char v22; // dl@39 -// int v23; // edx@40 -// char v24; // dl@45 -// int v25; // edx@46 -// char v26; // dl@52 -// int v27; // edx@53 -// char v28; // dl@58 -// int v29; // edx@59 -// char v30; // dl@64 -// int v31; // edx@65 -// char v32; // dl@70 -// int v33; // edx@71 -// char v34; // dl@76 -// int v35; // edx@77 -// char v36; // dl@82 -// int v37; // edx@83 -// char v38; // dl@86 -// char v39; // dl@90 -// int v40; // edi@93 -// char v41; // dl@93 -// int v42; // esi@93 -// char v43; // bl@94 -// int v44; // esi@95 -// char v45; // dl@99 -// char v46; // dl@103 -// char v47; // dl@107 -// char v48; // dl@111 -// char v49; // dl@115 -// ArcomagePlayer *v50; // ebx@116 -// ArcomagePlayer *v51; // edx@116 -// int v52; // esi@124 -// int v53; // edx@124 -// int v54; // edx@127 -// int v55; // esi@130 -// int v56; // edi@138 -// int l; // esi@138 -// int v58; // eax@140 -// int v59; // ecx@142 -// int v60; // edx@142 -// int v61; // ebx@142 -// int v62; // eax@145 -// int v63; // esi@146 -// int v64; // ebx@4 -// int v65; // eax@4 -// int v66; // ecx@168 -// char v67; // bl@170 -// int v68; // eax@170 -// ArcomageCard *v69; // ecx@170 -// char v70; // dl@170 -// char v71; // dl@174 -// int v72; // edx@175 -// int v73; // edx@177 -// char v74; // dl@181 -// char v75; // dl@184 -// char v76; // dl@188 -// int v77; // edx@189 -// char v78; // dl@194 -// char v79; // dl@200 -// int v80; // edx@201 -// char v81; // dl@206 -// int v82; // edx@207 -// char v83; // dl@212 -// int v84; // edx@213 -// char v85; // dl@218 -// int v86; // edx@219 -// char v87; // dl@224 -// int v88; // edx@225 -// char v89; // dl@230 -// int v90; // edx@231 -// char v91; // dl@234 -// int v92; // edx@235 -// char v93; // dl@238 -// int v94; // edx@239 -// int v95; // esi@241 -// char v96; // dl@241 -// int v97; // esi@241 -// char v98; // bl@242 -// int v99; // edi@243 -// int v100; // edx@245 -// int v101; // edi@246 -// char v102; // dl@247 -// int v103; // edx@248 -// char v104; // dl@251 -// int v105; // edx@252 -// char v106; // dl@255 -// int v107; // edx@256 -// char v108; // dl@259 -// int v109; // edx@260 -// char v110; // dl@263 -// ArcomagePlayer *v111; // ebx@264 -// ArcomagePlayer *v112; // edx@264 -// int v113; // esi@272 -// int v114; // edx@272 -// int v115; // edx@275 -// int v116; // esi@278 -// int v117; // edi@286 -// int j; // esi@286 -// int v119; // eax@288 -// int v120; // ecx@290 -// int v121; // edx@290 -// int v122; // ebx@290 -// int v123; // eax@293 -// int v124; // esi@294 -// int v125; // [sp-28h] [bp-28h]@130 -// int v126; // [sp-28h] [bp-28h]@278 -// int k; // [sp-24h] [bp-24h]@18 -// int i; // [sp-24h] [bp-24h]@168 -// int v129; // [sp-20h] [bp-20h]@5 -// int v130; // [sp-20h] [bp-20h]@4 -// int v131; // [sp-1Ch] [bp-1Ch]@17 -// int v132; // [sp-1Ch] [bp-1Ch]@140 -// int v133; // [sp-1Ch] [bp-1Ch]@167 -// int v134; // [sp-1Ch] [bp-1Ch]@288 -// int v135; // [sp-18h] [bp-18h]@5 -// int v136; // [sp-18h] [bp-18h]@4 -// signed int v137; // [sp-14h] [bp-14h]@0 -// int v138; // [sp-14h] [bp-14h]@93 -// int v139; // [sp-14h] [bp-14h]@130 -// int v140; // [sp-14h] [bp-14h]@241 -// int v141; // [sp-14h] [bp-14h]@278 -// ArcomagePlayer *v142; // [sp-10h] [bp-10h]@5 -// ArcomagePlayer *v143; // [sp-10h] [bp-10h]@4 -// ArcomagePlayer *v144; // [sp-Ch] [bp-Ch]@5 -// ArcomagePlayer *v145; // [sp-Ch] [bp-Ch]@4 -// char v146; // [sp-8h] [bp-8h]@35 -// char v147; // [sp-8h] [bp-8h]@184 -// char v148; // [sp-5h] [bp-5h]@20 -// char v149; // [sp-5h] [bp-5h]@170 -// -// byte_4FAA00 = 1; -// if ( dword_4DF3A4 ) -// { -// if ( dword_4DF3A4 != 1 ) -// { -// result = dword_4DF3A4 - 2; -// if ( dword_4DF3A4 != 2 ) -// return result != 0; -// v64 = a1; -// v145 = &stru_505708[a1]; -// v130 = a1; -// v143 = &stru_505708[(a1 + 1) % 2]; -// v136 = GetPlayerHandCardCount(a1); -// v65 = 0; -// do -// { -// if ( v65 >= v136 ) -// { -// dword_4FA9B0[2 * v65] = -1; -// dword_4FA9B4[2 * v65] = -9999; -// } -// else -// { -// dword_4FA9B0[2 * v65] = v65; -// dword_4FA9B4[2 * v65] = 0; -// } -// ++v65; -// } -// while ( v65 < 10 ); -// v133 = 0; -// if ( v136 > 0 ) -// { -// v66 = 47 * v64; -// for ( i = 47 * v64; ; v66 = i ) -// { -// v67 = 99; -// v68 = 2 * v133; -// v69 = &pCards[stru_505708[0].cards_at_hand[v66 + dword_4FA9B0[2 * v133]]]; -// v70 = v69->field_38[2]; -// v149 = v69->field_38[2]; -// if ( v145->field_24 >= 10 ) -// { -// if ( v70 == 99 -// || v69->field_48[4] == 99 -// || v69->field_48[15] == 99 -// || (v74 = BYTE1(v69->field_68), v74 == 99) ) -// v73 = 5 * (v143->field_24 - v145->field_24); -// else -// v73 = 5 * (v149 + v69->field_48[4] + v69->field_48[15] + v74); -// } -// else -// { -// if ( v70 == 99 -// || v69->field_48[4] == 99 -// || v69->field_48[15] == 99 -// || (v71 = BYTE1(v69->field_68), v71 == 99) ) -// v72 = 5 * (v143->field_24 - v145->field_24); -// else -// v72 = 5 * (v149 + v69->field_48[4] + v69->field_48[15] + v71); -// v73 = 4 * v72; -// } -// dword_4FA9B4[v68] += v73; -// v75 = v69->field_38[1]; -// v147 = v69->field_38[1]; -// if ( v145->field_28 >= 10 ) -// { -// if ( v75 == 99 -// || v69->field_48[3] == 99 -// || v69->field_48[14] == 99 -// || (v78 = LOBYTE(v69->field_68), v78 == 99) ) -// v77 = v143->field_28 - v145->field_28; -// else -// v77 = v147 + v69->field_48[3] + v69->field_48[14] + v78; -// } -// else -// { -// if ( v75 == 99 -// || v69->field_48[3] == 99 -// || v69->field_48[14] == 99 -// || (v76 = LOBYTE(v69->field_68), v76 == 99) ) -// v77 = 5 * (v143->field_28 - v145->field_28); -// else -// v77 = 5 * (v147 + v69->field_48[3] + v69->field_48[14] + v76); -// } -// dword_4FA9B4[v68] += v77; -// dword_4FA9B4[v68] += 7 * (v69->field_38[0] + v69->field_48[2] + v69->field_48[13] + v69->field_58[15]); -// if ( BYTE2(v69->field_30) == 99 -// || v69->field_38[12] == 99 -// || v69->field_48[7] == 99 -// || (v79 = v69->field_58[9], v79 == 99) ) -// v80 = 5 * (v143->field_2C - v145->field_2C); -// else -// v80 = 5 * (BYTE2(v69->field_30) + v69->field_38[12] + v69->field_48[7] + v79); -// dword_4FA9B4[v68] += 8 * v80; -// if ( BYTE3(v69->field_30) == 99 -// || v69->field_38[13] == 99 -// || v69->field_48[8] == 99 -// || (v81 = v69->field_58[10], v81 == 99) ) -// v82 = 5 * (v143->field_30 - v145->field_30); -// else -// v82 = 5 * (BYTE3(v69->field_30) + v69->field_38[13] + v69->field_48[8] + v81); -// dword_4FA9B4[v68] += 8 * v82; -// if ( LOBYTE(v69->field_34) == 99 -// || v69->field_38[14] == 99 -// || v69->field_48[9] == 99 -// || (v83 = v69->field_58[11], v83 == 99) ) -// v84 = 5 * (v143->field_34 - v145->field_34); -// else -// v84 = 5 * (LOBYTE(v69->field_34) + v69->field_38[14] + v69->field_48[9] + v83); -// dword_4FA9B4[v68] += 8 * v84; -// if ( BYTE1(v69->field_34) == 99 -// || v69->field_38[15] == 99 -// || v69->field_48[10] == 99 -// || (v85 = v69->field_58[12], v85 == 99) ) -// v86 = v143->field_38 - v145->field_38; -// else -// v86 = BYTE1(v69->field_34) + v69->field_38[15] + v69->field_48[10] + v85; -// dword_4FA9B4[v68] += 2 * v86; -// if ( BYTE2(v69->field_34) == 99 -// || v69->field_48[0] == 99 -// || v69->field_48[11] == 99 -// || (v87 = v69->field_58[13], v87 == 99) ) -// v88 = v143->field_3C - v145->field_3C; -// else -// v88 = BYTE2(v69->field_34) + v69->field_48[0] + v69->field_48[11] + v87; -// dword_4FA9B4[v68] += 2 * v88; -// if ( BYTE3(v69->field_34) == 99 -// || v69->field_48[1] == 99 -// || v69->field_48[12] == 99 -// || (v89 = v69->field_58[14], v89 == 99) ) -// v90 = v143->field_40 - v145->field_40; -// else -// v90 = BYTE3(v69->field_34) + v69->field_48[1] + v69->field_48[12] + v89; -// dword_4FA9B4[v68] += 2 * v90; -// if ( v69->field_38[11] == 99 || (v91 = v69->field_58[8], v91 == 99) ) -// v92 = 10 * (v145->field_24 - v143->field_24); -// else -// v92 = -10 * (v69->field_38[11] + v91); -// dword_4FA9B4[v68] += v92; -// if ( v69->field_38[10] == 99 || (v93 = v69->field_58[7], v93 == 99) ) -// v94 = 3 * (v145->field_28 - v143->field_28); -// else -// v94 = -3 * (v69->field_38[10] + v93); -// dword_4FA9B4[v68] += v94; -// v95 = v69->field_38[9]; -// v140 = v95; -// v96 = v69->field_38[3]; -// dword_4FA9B4[v68] += -7 * (v69->field_58[6] + v95); -// v97 = dword_4FA9B4[v68]; -// if ( v96 == 99 ) -// goto LABEL_245; -// v98 = v69->field_58[0]; -// if ( v98 == 99 ) -// break; -// v99 = v96 + v98; -// v67 = 99; -// dword_4FA9B4[v68] = v97 - 5 * v99; -//LABEL_246: -// v101 = v140; -// if ( v69->field_38[4] == v67 || (v102 = v69->field_58[1], v102 == v67) ) -// v103 = 5 * (v145->field_30 - v143->field_30); -// else -// v103 = -5 * (v69->field_38[4] + v102); -// dword_4FA9B4[v68] += v103; -// if ( v69->field_38[5] == v67 || (v104 = v69->field_58[2], v104 == v67) ) -// v105 = 5 * (v145->field_34 - v143->field_34); -// else -// v105 = -5 * (v69->field_38[5] + v104); -// dword_4FA9B4[v68] += v105; -// if ( v69->field_38[6] == v67 || (v106 = v69->field_58[3], v106 == v67) ) -// v107 = v145->field_38 - v143->field_38; -// else -// v107 = -(v69->field_38[6] + v106); -// dword_4FA9B4[v68] += 2 * v107; -// if ( v69->field_38[7] == v67 || (v108 = v69->field_58[4], v108 == v67) ) -// v109 = v145->field_3C - v143->field_3C; -// else -// v109 = -(v69->field_38[7] + v108); -// dword_4FA9B4[v68] += 2 * v109; -// if ( v69->field_38[8] == v67 || (v110 = v69->field_58[5], v110 == v67) ) -// { -// v112 = v145; -// v111 = v143; -// dword_4FA9B4[v68] += 2 * (v145->field_40 - v143->field_40); -// } -// else -// { -// v111 = v143; -// dword_4FA9B4[v68] += -2 * (v69->field_38[8] + v110); -// v112 = v145; -// } -// if ( LOBYTE(v69->field_30) || v69->field_48[5] ) -// dword_4FA9B4[v68] *= 10; -// if ( LOBYTE(v69->field_24) == 1 ) -// { -// v113 = LOBYTE(v69->field_28); -// v114 = v112->field_38; -// } -// else -// { -// if ( LOBYTE(v69->field_24) == 2 ) -// { -// v113 = BYTE1(v69->field_28); -// v114 = v112->field_3C; -// } -// else -// { -// if ( LOBYTE(v69->field_24) != 3 ) -// goto LABEL_278; -// v113 = BYTE2(v69->field_28); -// v114 = v112->field_40; -// } -// } -// v115 = v114 - v113; -// if ( v115 > 3 ) -// v115 = 3; -// dword_4FA9B4[v68] += 5 * v115; -//LABEL_278: -// v116 = v69->field_58[8]; -// v141 = v111->field_24; -// v126 = v69->field_38[11]; -// if ( v141 <= v116 + v126 ) -// dword_4FA9B4[v68] += 9999; -// v137 = v111->field_28 + v141; -// if ( v137 <= v116 + v126 + v69->field_58[6] + v69->field_58[7] + v101 + v69->field_38[10] ) -// dword_4FA9B4[v68] += 9999; -// if ( v69->field_48[15] + (signed int)BYTE1(v69->field_68) + v145->field_24 + v69->field_48[4] + v149 >= dword_4E1884 ) -// dword_4FA9B4[v68] += 9999; -// ++v133; -// if ( v133 >= v136 ) -// { -// v64 = v130; -// goto LABEL_286; -// } -// } -// v67 = 99; -//LABEL_245: -// v100 = v145->field_2C - v143->field_2C; -// dword_4FA9B4[v68] = v97 + 4 * v100 + v100; -// goto LABEL_246; -// } -//LABEL_286: -// v117 = v136 - 1; -// for ( j = v136 - 1; j >= 0; --j ) -// { -// v137 = 0; -// if ( j > 0 ) -// { -// v119 = (int)dword_4FA9B0; -// v134 = j; -// v137 = j; -// do -// { -// if ( *(unsigned int *)(v119 + 4) < *(unsigned int *)(v119 + 12) ) -// { -// v120 = *(unsigned int *)v119; -// v121 = *(unsigned int *)(v119 + 4); -// *(unsigned int *)v119 = *(unsigned int *)(v119 + 8); -// v122 = *(unsigned int *)(v119 + 12); -// *(unsigned int *)(v119 + 8) = v120; -// *(unsigned int *)(v119 + 4) = v122; -// v64 = v130; -// *(unsigned int *)(v119 + 12) = v121; -// } -// v119 += 8; -// --v134; -// } -// while ( v134 ); -// } -// } -// v123 = v136 - 1; -// if ( am_byte_4FAA77 ) -// { -// if ( v117 >= 0 ) -// { -// while ( !BYTE3(pCards[stru_505708[0].cards_at_hand[47 * v64 + dword_4FA9B0[2 * v123]]].field_28) ) -// { -// --v123; -// if ( v123 < 0 ) -// return am_40BCFB(v64, v137) != 0; -// } -// v137 = dword_4FA9B0[2 * v123]; -// } -// } -// else -// { -// v124 = 0; -// if ( v117 >= 0 ) -// { -// while ( !BYTE3(pCards[stru_505708[0].cards_at_hand[47 * v64 + dword_4FA9B0[2 * v123]]].field_28) ) -// { -// --v123; -// if ( v123 < 0 ) -// goto LABEL_299; -// } -// v137 = dword_4FA9B0[2 * v123]; -// } -//LABEL_299: -// if ( v136 > 0 ) -// { -// while ( !am_40BF15(v64, dword_4FA9B0[2 * v124]) || dword_4FA9B4[2 * v124] < 0 ) -// { -// ++v124; -// if ( v124 >= v136 ) -// return am_40BCFB(v64, v137) != 0; -// } -// return am_40BE0E(v64, dword_4FA9B0[2 * v124]) != 0; -// } -// } -// return am_40BCFB(v64, v137) != 0; -// } -// v9 = a1; -// v144 = &stru_505708[a1]; -// v129 = a1; -// v142 = &stru_505708[(a1 + 1) % 2]; -// v135 = GetPlayerHandCardCount(a1); -// v10 = 0; -// do -// { -// if ( v10 >= v135 ) -// { -// dword_4FA9B0[2 * v10] = -1; -// dword_4FA9B4[2 * v10] = -9999; -// } -// else -// { -// dword_4FA9B0[2 * v10] = v10; -// dword_4FA9B4[2 * v10] = 0; -// } -// ++v10; -// } -// while ( v10 < 10 ); -// v131 = 0; -// if ( v135 > 0 ) -// { -// v11 = 47 * v9; -// for ( k = 47 * v9; ; v11 = k ) -// { -// v12 = 99; -// v13 = 2 * v131; -// v14 = &pCards[stru_505708[0].cards_at_hand[v11 + dword_4FA9B0[2 * v131]]]; -// v15 = v14->field_38[2]; -// v148 = v14->field_38[2]; -// if ( v144->field_24 >= 10 ) -// { -// if ( v15 == 99 || v14->field_48[4] == 99 || v14->field_48[15] == 99 || (v19 = BYTE1(v14->field_68), v19 == 99) ) -// v20 = 5 * (v142->field_24 - v144->field_24); -// else -// v20 = 5 * (v148 + v14->field_48[4] + v14->field_48[15] + v19); -// v18 = 2 * v20; -// } -// else -// { -// if ( v15 == 99 || v14->field_48[4] == 99 || v14->field_48[15] == 99 || (v16 = BYTE1(v14->field_68), v16 == 99) ) -// v17 = 5 * (v142->field_24 - v144->field_24); -// else -// v17 = 5 * (v148 + v14->field_48[4] + v14->field_48[15] + v16); -// v18 = 4 * v17; -// } -// dword_4FA9B4[v13] += v18; -// v21 = v14->field_38[1]; -// v146 = v14->field_38[1]; -// if ( v144->field_28 >= 10 ) -// { -// if ( v21 == 99 -// || v14->field_48[3] == 99 -// || v14->field_48[14] == 99 -// || (v24 = LOBYTE(v14->field_68), v24 == 99) ) -// v25 = v142->field_28 - v144->field_28; -// else -// v25 = v146 + v14->field_48[3] + v14->field_48[14] + v24; -// v23 = 2 * v25; -// } -// else -// { -// if ( v21 == 99 -// || v14->field_48[3] == 99 -// || v14->field_48[14] == 99 -// || (v22 = LOBYTE(v14->field_68), v22 == 99) ) -// v23 = 5 * (v142->field_28 - v144->field_28); -// else -// v23 = 5 * (v146 + v14->field_48[3] + v14->field_48[14] + v22); -// } -// dword_4FA9B4[v13] += v23; -// dword_4FA9B4[v13] += 7 * (v14->field_38[0] + v14->field_48[2] + v14->field_48[13] + v14->field_58[15]); -// if ( BYTE2(v14->field_30) == 99 -// || v14->field_38[12] == 99 -// || v14->field_48[7] == 99 -// || (v26 = v14->field_58[9], v26 == 99) ) -// v27 = 5 * (v142->field_2C - v144->field_2C); -// else -// v27 = 5 * (BYTE2(v14->field_30) + v14->field_38[12] + v14->field_48[7] + v26); -// dword_4FA9B4[v13] += 8 * v27; -// if ( BYTE3(v14->field_30) == 99 -// || v14->field_38[13] == 99 -// || v14->field_48[8] == 99 -// || (v28 = v14->field_58[10], v28 == 99) ) -// v29 = 5 * (v142->field_30 - v144->field_30); -// else -// v29 = 5 * (BYTE3(v14->field_30) + v14->field_38[13] + v14->field_48[8] + v28); -// dword_4FA9B4[v13] += 8 * v29; -// if ( LOBYTE(v14->field_34) == 99 -// || v14->field_38[14] == 99 -// || v14->field_48[9] == 99 -// || (v30 = v14->field_58[11], v30 == 99) ) -// v31 = 5 * (v142->field_34 - v144->field_34); -// else -// v31 = 5 * (LOBYTE(v14->field_34) + v14->field_38[14] + v14->field_48[9] + v30); -// dword_4FA9B4[v13] += 8 * v31; -// if ( BYTE1(v14->field_34) == 99 -// || v14->field_38[15] == 99 -// || v14->field_48[10] == 99 -// || (v32 = v14->field_58[12], v32 == 99) ) -// v33 = v142->field_38 - v144->field_38; -// else -// v33 = BYTE1(v14->field_34) + v14->field_38[15] + v14->field_48[10] + v32; -// dword_4FA9B4[v13] += 2 * v33; -// if ( BYTE2(v14->field_34) == 99 -// || v14->field_48[0] == 99 -// || v14->field_48[11] == 99 -// || (v34 = v14->field_58[13], v34 == 99) ) -// v35 = v142->field_3C - v144->field_3C; -// else -// v35 = BYTE2(v14->field_34) + v14->field_48[0] + v14->field_48[11] + v34; -// dword_4FA9B4[v13] += 2 * v35; -// if ( BYTE3(v14->field_34) == 99 -// || v14->field_48[1] == 99 -// || v14->field_48[12] == 99 -// || (v36 = v14->field_58[14], v36 == 99) ) -// v37 = v142->field_40 - v144->field_40; -// else -// v37 = BYTE3(v14->field_34) + v14->field_48[1] + v14->field_48[12] + v36; -// dword_4FA9B4[v13] += 2 * v37; -// if ( v14->field_38[11] == 99 || (v38 = v14->field_58[8], v38 == 99) ) -// dword_4FA9B4[v13] += v144->field_24 - v142->field_24; -// else -// dword_4FA9B4[v13] -= v14->field_38[11] + v38; -// if ( v14->field_38[10] == 99 || (v39 = v14->field_58[7], v39 == 99) ) -// dword_4FA9B4[v13] += v144->field_28 - v142->field_28; -// else -// dword_4FA9B4[v13] -= v14->field_38[10] + v39; -// v40 = v14->field_38[9]; -// v138 = v14->field_38[9]; -// dword_4FA9B4[v13] -= v40 + v14->field_58[6]; -// v41 = v14->field_38[3]; -// v42 = dword_4FA9B4[v13]; -// if ( v41 == 99 ) -// goto LABEL_97; -// v43 = v14->field_58[0]; -// if ( v43 == 99 ) -// break; -// v44 = v42 - v43; -// v12 = 99; -// dword_4FA9B4[v13] = v44 - v41; -//LABEL_98: -// if ( v14->field_38[4] == v12 || (v45 = v14->field_58[1], v45 == v12) ) -// dword_4FA9B4[v13] += v144->field_30 - v142->field_30; -// else -// dword_4FA9B4[v13] -= v14->field_38[4] + v45; -// if ( v14->field_38[5] == v12 || (v46 = v14->field_58[2], v46 == v12) ) -// dword_4FA9B4[v13] += v144->field_34 - v142->field_34; -// else -// dword_4FA9B4[v13] -= v14->field_38[5] + v46; -// if ( v14->field_38[6] == v12 || (v47 = v14->field_58[3], v47 == v12) ) -// dword_4FA9B4[v13] += v144->field_38 - v142->field_38; -// else -// dword_4FA9B4[v13] -= v14->field_38[6] + v47; -// if ( v14->field_38[7] == v12 || (v48 = v14->field_58[4], v48 == v12) ) -// dword_4FA9B4[v13] += v144->field_3C - v142->field_3C; -// else -// dword_4FA9B4[v13] -= v14->field_38[7] + v48; -// if ( v14->field_38[8] == v12 || (v49 = v14->field_58[5], v49 == v12) ) -// { -// v51 = v144; -// v50 = v142; -// dword_4FA9B4[v13] += v144->field_40 - v142->field_40; -// } -// else -// { -// v50 = v142; -// dword_4FA9B4[v13] -= v14->field_38[8] + v49; -// v51 = v144; -// } -// if ( LOBYTE(v14->field_30) || v14->field_48[5] ) -// dword_4FA9B4[v13] *= 10; -// if ( LOBYTE(v14->field_24) == 1 ) -// { -// v52 = LOBYTE(v14->field_28); -// v53 = v51->field_38; -// } -// else -// { -// if ( LOBYTE(v14->field_24) == 2 ) -// { -// v52 = BYTE1(v14->field_28); -// v53 = v51->field_3C; -// } -// else -// { -// if ( LOBYTE(v14->field_24) != 3 ) -// goto LABEL_130; -// v52 = BYTE2(v14->field_28); -// v53 = v51->field_40; -// } -// } -// v54 = v53 - v52; -// if ( v54 > 3 ) -// v54 = 3; -// dword_4FA9B4[v13] += 5 * v54; -//LABEL_130: -// v55 = v14->field_58[8]; -// v139 = v50->field_24; -// v125 = v14->field_38[11]; -// if ( v139 <= v55 + v125 ) -// dword_4FA9B4[v13] += 9999; -// v137 = v50->field_28 + v139; -// if ( v137 <= v55 + v125 + v14->field_58[6] + v14->field_58[7] + v40 + v14->field_38[10] ) -// dword_4FA9B4[v13] += 9999; -// if ( v14->field_48[15] + (signed int)BYTE1(v14->field_68) + v144->field_24 + v14->field_48[4] + v148 >= dword_4E1884 ) -// dword_4FA9B4[v13] += 9999; -// ++v131; -// if ( v131 >= v135 ) -// { -// v9 = v129; -// goto LABEL_138; -// } -// } -// v12 = 99; -//LABEL_97: -// v40 = v138; -// dword_4FA9B4[v13] = v42 + v144->field_2C - v142->field_2C; -// goto LABEL_98; -// } -//LABEL_138: -// v56 = v135 - 1; -// for ( l = v135 - 1; l >= 0; --l ) -// { -// v137 = 0; -// if ( l > 0 ) -// { -// v58 = (int)dword_4FA9B0; -// v132 = l; -// v137 = l; -// do -// { -// if ( *(unsigned int *)(v58 + 4) < *(unsigned int *)(v58 + 12) ) -// { -// v59 = *(unsigned int *)v58; -// v60 = *(unsigned int *)(v58 + 4); -// *(unsigned int *)v58 = *(unsigned int *)(v58 + 8); -// v61 = *(unsigned int *)(v58 + 12); -// *(unsigned int *)(v58 + 8) = v59; -// *(unsigned int *)(v58 + 4) = v61; -// v9 = v129; -// *(unsigned int *)(v58 + 12) = v60; -// } -// v58 += 8; -// --v132; -// } -// while ( v132 ); -// } -// } -// v62 = v135 - 1; -// if ( am_byte_4FAA77 ) -// { -// if ( v56 >= 0 ) -// { -// while ( !BYTE3(pCards[stru_505708[0].cards_at_hand[47 * v9 + dword_4FA9B0[2 * v62]]].field_28) ) -// { -// --v62; -// if ( v62 < 0 ) -// return am_40BCFB(v9, v137) != 0; -// } -// v137 = dword_4FA9B0[2 * v62]; -// } -// } -// else -// { -// v63 = 0; -// if ( v56 >= 0 ) -// { -// while ( !BYTE3(pCards[stru_505708[0].cards_at_hand[47 * v9 + dword_4FA9B0[2 * v62]]].field_28) ) -// { -// --v62; -// if ( v62 < 0 ) -// goto LABEL_151; -// } -// v137 = dword_4FA9B0[2 * v62]; -// } -//LABEL_151: -// if ( v135 > 0 ) -// { -// while ( !am_40BF15(v9, dword_4FA9B0[2 * v63]) || dword_4FA9B4[2 * v63] < 0 ) -// { -// ++v63; -// if ( v63 >= v135 ) -// return am_40BCFB(v9, v137) != 0; -// } -// return am_40BE0E(v9, dword_4FA9B0[2 * v63]) != 0; -// } -// } -// return am_40BCFB(v9, v137) != 0; -// } -// v3 = 0; -// v4 = a1; -// if ( am_byte_4FAA77 ) -// { -//LABEL_11: -// v7 = GetPlayerHandCardCount(v4); -// v8 = rand_interval(0, v7 - 1); -// result = am_40BCFB(v4, v8); -// } -// else -// { -// while ( 1 ) -// { -// v5 = GetPlayerHandCardCount(v4); -// v6 = rand_interval(0, v5 - 1); -// if ( am_40BF15(v4, v6) ) -// break; -// ++v3; -// if ( v3 >= 10 ) -// goto LABEL_11; -// } -// result = am_40BE0E(v4, v6); -// } + + char result; // al@3 + signed int v2; // ebx@8 + int v3; // esi@8 + int all_player_cards_count; // eax@9 + int random_card_slot; // edi@9 + int v6; // eax@11 + signed int v7; // eax@11 + int v8; // ebx@5 + int v9; // eax@5 + int v10; // ecx@18 + int v11; // eax@20 + ArcomageCard *v12; // ecx@20 + char v13; // dl@20 + char v14; // dl@24 + int v15; // edx@25 + int v16; // edx@27 + char v17; // dl@31 + int v18; // edx@32 + char v19; // dl@35 + char v20; // dl@39 + int v21; // edx@40 + char v22; // dl@45 + int v23; // edx@46 + char v24; // dl@52 + int v25; // edx@53 + char v26; // dl@58 + int v27; // edx@59 + char v28; // dl@64 + int v29; // edx@65 + char v30; // dl@70 + int v31; // edx@71 + char v32; // dl@76 + int v33; // edx@77 + char v34; // dl@82 + int v35; // edx@83 + char v36; // dl@86 + char v37; // dl@90 + int v38; // edi@93 + char v39; // dl@93 + int v40; // esi@93 + char v41; // bl@94 + char v42; // dl@98 + char v43; // dl@102 + char v44; // dl@106 + char v45; // dl@110 + char v46; // dl@114 + ArcomagePlayer *v47; // ebx@115 + ArcomagePlayer *v48; // edx@115 + int v49; // esi@123 + int v50; // edx@123 + int v51; // edx@126 + int v52; // esi@129 + int v53; // edi@137 + int j; // esi@137 + am_2 *v55; // eax@139 + int v56; // ecx@141 + int v57; // edx@141 + int v58; // ebx@141 + int v59; // eax@144 + int v60; // esi@145 + int v61; // ebx@4 + int v62; // eax@4 + int v63; // ecx@167 + int v64; // eax@169 + ArcomageCard *pCard; // ecx@169 + char v66; // dl@169 + char v67; // dl@173 + int v68; // edx@174 + int v69; // edx@176 + char v70; // dl@180 + char v71; // dl@183 + char v72; // dl@187 + int v73; // edx@188 + char v74; // dl@193 + char v75; // dl@199 + int v76; // edx@200 + char v77; // dl@205 + int v78; // edx@206 + char v79; // dl@211 + int v80; // edx@212 + char v81; // dl@217 + int v82; // edx@218 + char v83; // dl@223 + int v84; // edx@224 + char v85; // dl@229 + int v86; // edx@230 + char v87; // dl@233 + int v88; // edx@234 + char v89; // dl@237 + int v90; // edx@238 + int v91; // esi@240 + char v92; // dl@240 + int v93; // esi@240 + char v94; // bl@241 + int v95; // edx@243 + int v96; // edi@244 + char v97; // dl@245 + int v98; // edx@246 + char v99; // dl@249 + int v100; // edx@250 + char v101; // dl@253 + int v102; // edx@254 + char v103; // dl@257 + int v104; // edx@258 + char v105; // dl@261 + ArcomagePlayer *v106; // ebx@262 + ArcomagePlayer *v107; // edx@262 + int v108; // esi@270 + int v109; // edx@270 + int v110; // edx@273 + int v111; // esi@276 + int v112; // edi@284 + // int j; // esi@284 + am_2 *v114; // eax@286 + int v115; // ecx@288 + int v116; // edx@288 + int v117; // ebx@288 + int v118; // eax@291 + int v119; // esi@292 + int v120; // [sp-28h] [bp-28h]@129 + int v121; // [sp-28h] [bp-28h]@276 + int k; // [sp-24h] [bp-24h]@18 + int i; // [sp-24h] [bp-24h]@167 + int v124; // [sp-20h] [bp-20h]@5 + int v125; // [sp-20h] [bp-20h]@4 + int v126; // [sp-1Ch] [bp-1Ch]@17 + int v127; // [sp-1Ch] [bp-1Ch]@139 + int v128; // [sp-1Ch] [bp-1Ch]@166 + int v129; // [sp-1Ch] [bp-1Ch]@286 + int v130; // [sp-18h] [bp-18h]@5 + int cards_count; // [sp-18h] [bp-18h]@4 + int v132; // [sp-14h] [bp-14h]@0 + int v133; // [sp-14h] [bp-14h]@93 + int v134; // [sp-14h] [bp-14h]@129 + int v135; // [sp-14h] [bp-14h]@240 + int v136; // [sp-14h] [bp-14h]@276 + ArcomagePlayer *enemy; // [sp-10h] [bp-10h]@5 + ArcomagePlayer *enemy1; // [sp-10h] [bp-10h]@4 + ArcomagePlayer *player; // [sp-Ch] [bp-Ch]@5 + ArcomagePlayer *player1; // [sp-Ch] [bp-Ch]@4 + char v141; // [sp-8h] [bp-8h]@35 + char v142; // [sp-8h] [bp-8h]@183 + char v143; // [sp-5h] [bp-5h]@20 + char v144; // [sp-5h] [bp-5h]@169 + + byte_4FAA00 = 1; + if ( opponent_mastery == 0) + { + if ( need_to_discard_card==0 ) //am_byte_4FAA77 + { + for(int i = 0; i<10 ; ++i ) + { + all_player_cards_count = GetPlayerHandCardCount(player_num); + random_card_slot = rand_interval(0, all_player_cards_count - 1); + if ( CanCardBePlayed(player_num, random_card_slot) ) + return PlayCard(player_num, random_card_slot); + } + } + all_player_cards_count = GetPlayerHandCardCount(player_num); + random_card_slot= rand_interval(0, all_player_cards_count - 1); + return DiscardCard(player_num, random_card_slot); + } + else if (( opponent_mastery == 1 )|| ( opponent_mastery == 2 )) + { + player = &am_Players[player_num]; + enemy = &am_Players[(player_num + 1) % 2]; + all_player_cards_count = GetPlayerHandCardCount(player_num); + for(int i = 0; i<10 ; ++i ) + { + if ( i >= all_player_cards_count ) + { + cards_power[i].slot_index = -1; + cards_power[i].card_power = -9999; + } + else + { + cards_power[i].slot_index = i; + cards_power[i].card_power = 0; + } + } + for(int i = 0; i< all_player_cards_count ; ++i ) + { + v12 = &pCards[am_Players[player_num].cards_at_hand[cards_power[i].slot_index]]; + cards_power[i].card_power = CalculateCardPower(player, enemy, v12, opponent_mastery-1); + } + + for (int j = all_player_cards_count - 1; j >= 0; --j ) + { + for (int m=0; m<j; ++m ) + { + if ( cards_power[m].card_power < cards_power[m+1].card_power ) + { + v56 = cards_power[m].slot_index; + v57 = cards_power[m].card_power; + cards_power[m].slot_index = cards_power[m+1].slot_index; + cards_power[m].card_power = cards_power[m+1].card_power; + cards_power[m+1].slot_index = v56; + cards_power[m+1].card_power = v57; + } + } + } + v59 = all_player_cards_count - 1; + if ( need_to_discard_card ) + { + if ( all_player_cards_count - 1 >= 0 ) + { + while ( !pCards[am_Players[player_num].cards_at_hand[cards_power[v59].slot_index]].can_be_discarded ) + { + --v59; + if ( v59 < 0 ) + return DiscardCard(player_num, v132); + } + v132 = cards_power[v59].slot_index; + } + } + else + { + v60 = 0; + if ( all_player_cards_count - 1 >= 0 ) + { + while ( !pCards[am_Players[player_num].cards_at_hand[cards_power[v59].slot_index]].can_be_discarded ) + { + --v59; + if ( v59 < 0 ) + goto LABEL_150; + } + v132 = cards_power[v59].slot_index; + } +LABEL_150: + if ( (all_player_cards_count - 1)> 0 ) + { + while ( !CanCardBePlayed(player_num, cards_power[v60].slot_index) || cards_power[v60].card_power < 0 ) + { + ++v60; + if ( v60 >= all_player_cards_count - 1 ) + return DiscardCard(player_num, v132); + } + return PlayCard(player_num, cards_power[v60].slot_index); + } + } + return DiscardCard(player_num, v132); + } + + return true;//result != 0; } -// 408BB4: could not find valid save-restore pair for ebp -// 4DF3A4: using guessed type int dword_4DF3A4; -// 4E1884: using guessed type int dword_4E1884; -// 4FA9B0: using guessed type int dword_4FA9B0[]; -// 4FA9B4: using guessed type int dword_4FA9B4[]; -// 4FAA00: using guessed type char byte_4FAA00; -// 4FAA77: using guessed type char am_byte_4FAA77; @@ -1569,18 +1248,18 @@ GetNextCardFromDeck(current_player_num); while ( 1 ) { - byte_4FAA24 = am_40A560(current_player_num); + byte_4FAA24 = PlayerTurn(current_player_num); if ( GetPlayerHandCardCount(current_player_num) <= minimum_cards_at_hand ) break; - hand_full = 1; + need_to_discard_card = 1; if ( pArcomageGame->field_F4 ) goto LABEL_8; } - hand_full = 0; + need_to_discard_card = 0; } pArcomageGame->GameOver = IsGameOver(); if ( !pArcomageGame->GameOver ) - am_40A383(); + TurnChange(); if ( pArcomageGame->field_F4 ) pArcomageGame->GameOver = 1; } @@ -1658,16 +1337,15 @@ am_Players[i].cards_at_hand[j] = -1; if ( am_byte_4E185D ) { - am_Players[i].arr_6C[j].field_0 = -1; - am_Players[i].arr_6C[j].field_4 = -1; + am_Players[i].card_shift[j].x = -1; + am_Players[i].card_shift[j].y = -1; } else { - am_Players[i].arr_6C[j].field_0 = 0; - am_Players[i].arr_6C[j].field_4 = 0; + am_Players[i].card_shift[j].x = 0; + am_Players[i].card_shift[j].y = 0; } - } - + } } strcpy(deckMaster.name, pDeckMaster); for (i=0, card_dispenser_counter=-2, card_id_counter=0; i<DECK_SIZE; ++i, ++card_dispenser_counter) @@ -1709,11 +1387,9 @@ //----- (0040A198) -------------------------------------------------------- void FillPlayerDeck() { - - signed int v3; // eax@4 - int v6; // edx@13 - char v7; // eax@13 - char card_taken_flags[DECK_SIZE]; // [sp+8h] [bp-6Ch]@1 + signed int m; + int rand_deck_pos; + char card_taken_flags[DECK_SIZE]; int i,j; ArcomageGame::PlaySound(20); @@ -1726,11 +1402,11 @@ { if ( am_Players[i].cards_at_hand[j] > -1 ) { - for (v3 = 0; v3<DECK_SIZE; ++v3) + for (m = 0; m<DECK_SIZE; ++m) { - if (deckMaster.cards_IDs[v3] == am_Players[i].cards_at_hand[j] && deckMaster.cardsInUse[v3] == 0) + if (deckMaster.cards_IDs[m] == am_Players[i].cards_at_hand[j] && deckMaster.cardsInUse[m] == 0) { - deckMaster.cardsInUse[v3] = 1; + deckMaster.cardsInUse[m] = 1; break; } } @@ -1741,14 +1417,12 @@ for (i=0; i<DECK_SIZE; ++i) { do - { - v6 = rand() % DECK_SIZE; - v7 = card_taken_flags[v6]; - } - while ( v7 == 1 ); - card_taken_flags[v6]=1; - playDeck.cards_IDs[i] = deckMaster.cards_IDs[v6]; - playDeck.cardsInUse[i] = deckMaster.cardsInUse[v6]; + rand_deck_pos = rand() % DECK_SIZE; + while (card_taken_flags[rand_deck_pos] == 1 ); + + card_taken_flags[rand_deck_pos]=1; + playDeck.cards_IDs[i] = deckMaster.cards_IDs[rand_deck_pos]; + playDeck.cardsInUse[i] = deckMaster.cardsInUse[rand_deck_pos]; } deck_walk_index = 0; @@ -1802,8 +1476,8 @@ { amuint_4FAA4C = card_slot_indx; am_Players[player_num].cards_at_hand[card_slot_indx] = new_card_id; - am_Players[player_num].arr_6C[card_slot_indx].field_0 = rand_interval(-4, 4); - am_Players[player_num].arr_6C[card_slot_indx].field_4 = rand_interval(-4, 4); + am_Players[player_num].card_shift[card_slot_indx].x = rand_interval(-4, 4); + am_Players[player_num].card_shift[card_slot_indx].y = rand_interval(-4, 4); pArcomageGame->field_F6 = 1; byte_4FAA2D = 1; } @@ -1831,20 +1505,16 @@ { am_Players[player_num].resource_bricks += quarry_bonus + am_Players[player_num].quarry_level; am_Players[player_num].resource_gems += magic_bonus + am_Players[player_num].magic_level; - am_Players[player_num].resource_beasts += zoo_bonus + am_Players[player_num].zoo_level; + am_Players[player_num].resource_beasts += zoo_bonus + am_Players[player_num].zoo_level; } //----- (0040A383) -------------------------------------------------------- -void __cdecl am_40A383() -{ - int v0; // eax@4 - int v1; // ecx@4 - unsigned __int8 v2; // sf@4 - unsigned __int8 v3; // of@4 - int v4; // eax@6 - char Dest[64]; // [sp+4h] [bp-64h]@4 - RECT v6; // [sp+44h] [bp-24h]@6 +void TurnChange() + { + + char player_name[64]; // [sp+4h] [bp-64h]@4 + // RECT v6; // [sp+44h] [bp-24h]@6 ArcomageGame_stru1 v10; // [sp+54h] [bp-14h]@7 POINT v11; // [sp+60h] [bp-8h]@4 @@ -1863,23 +1533,20 @@ //nullsub_1(); // v11.x = 0; // v11.y = 0; - strcpy(Dest,"The Next Player is: ");//"" + strcpy(player_name,"The Next Player is: ");//"" // v0 = 0; v11.y = 200; v11.x = 320; // - 12 * v0 / 2; - pPrimaryWindow_draws_text(-1, Dest, &v11); + pPrimaryWindow_draws_text(-1, player_name, &v11); am_byte_4FAA75 = 1; - v1 = ++current_player_num; - if ( v1 >= 2 ) - { - v1 = 0; + ++current_player_num; + if ( current_player_num >= 2 ) current_player_num = 0; - } - strcpy(Dest, am_Players[v1].pPlayerName); + strcpy(player_name, am_Players[current_player_num].pPlayerName); // v4 = 0; v11.y = 260; v11.x = 320;// - 12 * v4 / 2; - pPrimaryWindow_draws_text(-1, Dest, &v11); + pPrimaryWindow_draws_text(-1, player_name, &v11); /* v6.left = 0; v6.right = 640; v6.top = 0; @@ -1888,28 +1555,25 @@ CallRenderPresent(); //nullsub_1(); while ( 1 ) - { - while ( 1 ) - { + { while ( !ArcomageGame::MsgLoop(20, &v10) ) ; - if ( v10.field_0 != 1 ) - break; - if ( v10.field_4 ) - goto LABEL_13; - //nullsub_1(); - } - if ( v10.field_0 > 4 ) - { - if ( v10.field_0 <= 8 ) - goto LABEL_13; - if ( v10.field_0 == 10 ) - break; - } + if ( v10.field_0 == 1 ) + { + if ( v10.field_4 ) + break; + //nullsub_1(); + continue; + } + if (( v10.field_0 > 4 )&& ( v10.field_0 <= 8 )) + break; + if ( v10.field_0 == 10 ) + { + pArcomageGame->field_F4 = 1; + byte_4FAA74 = 1; + break; + } } - pArcomageGame->field_F4 = 1; - byte_4FAA74 = 1; -LABEL_13: /* v11.x = 0; v11.y = 0; v6.left = 0; @@ -1948,8 +1612,8 @@ //----- (0040A560) -------------------------------------------------------- -char am_40A560(unsigned int player_num) -{ +char PlayerTurn( int player_num ) + { int v1; // ebp@0 unsigned __int64 v2; // qax@3 unsigned __int64 v3; // kr00_8@3 @@ -1961,13 +1625,13 @@ int v10[4]; // [sp+80h] [bp-30h]@69 POINT pTargetXY; // [sp+90h] [bp-20h]@75 ArcomageGame_stru1 a2; // [sp+98h] [bp-18h]@8 - int v13; // [sp+A4h] [bp-Ch]@1 + int animation_stage; // [sp+A4h] [bp-Ch]@1 char v15; // [sp+AEh] [bp-2h]@63 - char v16; // [sp+AFh] [bp-1h]@1 + bool break_loop; // [sp+AFh] [bp-1h]@1 uCardID = -1; - v16 = 0; - v13 = 20; + break_loop = false; + animation_stage = 20; byte_4FAA00 = 0; dword_4FAA68 = 0; amuint_4FAA38 = 10; @@ -1985,7 +1649,7 @@ pArcomageGame->event_timer_time = (unsigned int )pEventTimer->Time(); if ( pArcomageGame->field_F4 ) - v16 = 1; + break_loop = 1; ArcomageGame::MsgLoop(0, &a2); switch ( a2.field_0 ) { @@ -1994,7 +1658,7 @@ { pAudioPlayer->StopChannels(-1, -1); dword_4FAA68 = 0; - v16 = 1; + break_loop = true; pArcomageGame->field_F4 = 1; } break; @@ -2004,16 +1668,17 @@ case 10: pAudioPlayer->StopChannels(-1, -1); byte_4FAA74 = 1; - v16 = 1; + break_loop = true; pArcomageGame->field_F4 = 1; break; } - if (am_Players[current_player_num].IsHisTurn != 1 && !byte_4FAA00 && !byte_4FAA2E && !byte_4FAA2D ) + if (am_Players[current_player_num].IsHisTurn != 1 && + !byte_4FAA00 && !byte_4FAA2E && !byte_4FAA2D ) { if ( am_byte_4FAA75 ) am_byte_4FAA76 = 1; - am_408BB4(current_player_num); + OpponentsAITurn(current_player_num); byte_4FAA2E = 1; } if ( amuint_4FAA4C != -1 && amuint_4FAA38 > 10 ) @@ -2028,13 +1693,13 @@ { byte_4FAA2D = 0; amuint_4FAA38 = 10; - v16 = 0; + break_loop = false; } } if ( byte_4FAA2E ) { - --v13; - if ( v13 < 0 ) + --animation_stage; + if ( animation_stage < 0 ) { if ( dword_4FAA68 > 1 ) { @@ -2043,36 +1708,36 @@ } else { - v16 = 1; + break_loop = true; } byte_4FAA2E = 0; - v13 = 20; + animation_stage = 20; } } } else { - if ( hand_full ) + if ( need_to_discard_card ) { - if ( a2.field_0 == 7 && am_40BCFB(player_num, current_card_slot_index) ) + if ( a2.field_0 == 7 && DiscardCard(player_num, current_card_slot_index) ) { if ( am_byte_4FAA75 ) am_byte_4FAA76 = 1; if ( dword_4FAA64 > 0 ) { --dword_4FAA64; - hand_full = GetPlayerHandCardCount(player_num) > minimum_cards_at_hand; + need_to_discard_card = GetPlayerHandCardCount(player_num) > minimum_cards_at_hand; } byte_4FAA2E = 1; } - if ( a2.field_0 == 8 && am_40BCFB(player_num, current_card_slot_index) ) + if ( a2.field_0 == 8 && DiscardCard(player_num, current_card_slot_index) ) { if ( am_byte_4FAA75 ) am_byte_4FAA76 = 1; if ( dword_4FAA64 > 0 ) { --dword_4FAA64; - hand_full = GetPlayerHandCardCount(player_num) > minimum_cards_at_hand; + need_to_discard_card = GetPlayerHandCardCount(player_num) > minimum_cards_at_hand; } byte_4FAA2E = 1; } @@ -2090,7 +1755,7 @@ } if ( a2.field_0 == 8 ) { - if ( am_40BCFB(player_num, current_card_slot_index) ) + if ( DiscardCard(player_num, current_card_slot_index) ) { byte_4FAA2E = 1; if ( am_byte_4FAA75 ) @@ -2135,12 +1800,12 @@ //} if ( dword_4FABB8 != DrawCardsRectangles(player_num) ) { - dword_4FABB8 = DrawCardsRectangles(player_num); - pArcomageGame->field_F6 = 1; + dword_4FABB8 = DrawCardsRectangles(player_num); + pArcomageGame->field_F6 = 1; } if ( pArcomageGame->field_F6 ) { - DrawGameUI(v13); + DrawGameUI(animation_stage); DoBlt_Copy(pArcomageGame->pBackgroundPixels); pArcomageGame->field_F6 = 0; } @@ -2155,18 +1820,18 @@ am_BeginScene(pArcomageGame->pBackgroundPixels, -1, 1); Blt_Copy(&pSrcXYZW, &pTargetXY, 2); am_EndScene(); - DrawGameUI(v13); + DrawGameUI(animation_stage); pRenderer->Present(); pArcomageGame->field_F9 = 0; } } - while ( !v16 ); + while ( !break_loop ); return dword_4FAA68 > 0; } //----- (0040A9AF) -------------------------------------------------------- -void DrawGameUI( int a1 ) +void DrawGameUI( int animation_stage ) { am_BeginScene(pArcomageGame->pSpritesPixels, -1, 1); @@ -2181,54 +1846,41 @@ am_EndScene(); am_BeginScene(pArcomageGame->pSpritesPixels, -1, 1); - DrawCardAnimation(a1); + DrawCardAnimation(animation_stage); for( int i=0; i<10; ++i) { - if (array_4FABD0[i].field_0) - array_4FABD0[i].field_40->_40E133(); + if (array_4FABD0[i].have_effect) + array_4FABD0[i].field_40->DrawEffect(); } current_card_slot_index = DrawCardsRectangles(current_player_num); - am_40AA4E(); + DrawSparks(); am_EndScene(); } //----- (0040AA4E) -------------------------------------------------------- -void am_40AA4E() +void DrawSparks() { - int v5; // [sp-4h] [bp-2Ch]@4 - unsigned int v7; - int v8; // [sp+14h] [bp-14h]@10 - int v9; // [sp+18h] [bp-10h]@10 - RECT pXYZW; - - v9 = 0x0000FF00; - v8 = 0x000000FF; + int rgb_pixel_color; // [sp-4h] [bp-2Ch]@4 + unsigned int pixel_color; for (int i=0; i<10; ++i) { - if(array_4FABD0[i].field_0 && (array_4FABD0[i].field_40->_40E2A7()==2)) + if(array_4FABD0[i].have_effect && (array_4FABD0[i].field_40->_40E2A7()==2)) { - - v5 = v9; - if ( !array_4FABD0[i].field_1 ) - v5 = v8; - - v7 = R8G8B8_to_TargetFormat(v5); + rgb_pixel_color = 0x0000FF00; + if ( !array_4FABD0[i].effect_sign ) + rgb_pixel_color = 0x000000FF; + + pixel_color = R8G8B8_to_TargetFormat(rgb_pixel_color); for(int j=0; j<150; ++j ) { - if (array_4FABD0[i].field_44[j].field_0 > 0) + if (array_4FABD0[i].effect_sparks[j].have_spark > 0) { if (j%2) - SetPixel(&array_4FABD0[i].field_44[j].field_4, v7); + SetPixel(&array_4FABD0[i].effect_sparks[j].spark_position, pixel_color); else - { - pXYZW.left = array_4FABD0[i].field_44[j].field_4.x; - pXYZW.right = pXYZW.left + 2; - pXYZW.top = array_4FABD0[i].field_44[j].field_4.y; - pXYZW.bottom = pXYZW.top + 2; - DrawRect(&pXYZW, v7, 1); - } + SetPixel2sq(&array_4FABD0[i].effect_sparks[j].spark_position, pixel_color); } } } @@ -2243,8 +1895,8 @@ RECT pSrcRect; // [sp+Ch] [bp-18h]@1 POINT pTargetXY; // [sp+1Ch] [bp-8h]@1 //resources rectangles + pSrcRect.left = 765; pSrcRect.top = 0; - pSrcRect.left = 765; pSrcRect.right = 843; pSrcRect.bottom = 216; @@ -2258,8 +1910,8 @@ //players name rectangle pSrcRect.left = 283; + pSrcRect.top = 166; pSrcRect.right = 361; - pSrcRect.top = 166; pSrcRect.bottom = 190; pTargetXY.x = 8; pTargetXY.y = 13; @@ -2271,8 +1923,8 @@ //tower height rectangle pSrcRect.left = 234; + pSrcRect.top = 166; pSrcRect.right = 283; - pSrcRect.top = 166; pSrcRect.bottom = 190; pTargetXY.x = 100; pTargetXY.y = 296; @@ -2283,9 +1935,9 @@ Blt_Chroma(&pSrcRect, &pTargetXY, pArcomageGame->field_54, 2); //wall height rectangle - pSrcRect.left = 192; + pSrcRect.left = 192; + pSrcRect.top = 166; pSrcRect.right = 234; - pSrcRect.top = 166; pSrcRect.bottom = 190; pTargetXY.x = 168; pTargetXY.y = 296; @@ -2304,7 +1956,7 @@ char text_buff[32]; // [sp+Ch] [bp-28h]@2 POINT text_position; // [sp+2Ch] [bp-8h]@2 - if ( hand_full ) + if ( need_to_discard_card ) { strcpy(text_buff, pGlobalTXT_LocalizationStrings[266]);// DISCARD A CARD text_position.x = 320 - pArcomageGame->pfntArrus->GetLineWidth(text_buff) / 2; @@ -2346,7 +1998,7 @@ pPrimaryWindow_draws_text(-1, text_buff, &text_position); res_value = am_Players[0].quarry_level; - if ( byte_4E185E ) + if ( use_start_bonus ) res_value =am_Players[0].quarry_level + quarry_bonus; intToString(res_value, text_buff); text_position.x = 14;// - 6 * 0 / 2; @@ -2354,7 +2006,7 @@ DrawPlayerLevels(-1, text_buff, &text_position); res_value = am_Players[1].quarry_level; - if ( byte_4E185E ) + if ( use_start_bonus ) res_value = am_Players[1].quarry_level + quarry_bonus; intToString(res_value, text_buff); // v2 = 0; @@ -2363,7 +2015,7 @@ DrawPlayerLevels(-1, text_buff, &text_position); res_value = am_Players[0].magic_level; - if ( byte_4E185E ) + if ( use_start_bonus ) res_value = am_Players[0].magic_level + magic_bonus; intToString(res_value, text_buff); // v4 = 0; @@ -2372,8 +2024,8 @@ DrawPlayerLevels(-1, text_buff, &text_position); res_value = am_Players[1].magic_level; - if ( byte_4E185E ) - res_value = am_Players[1].magic_level+magic_bonus; + if ( use_start_bonus ) + res_value = am_Players[1].magic_level + magic_bonus; intToString(res_value, text_buff); // v6 = 0; text_position.y = 164; @@ -2381,7 +2033,7 @@ DrawPlayerLevels(-1, text_buff, &text_position); res_value = am_Players[0].zoo_level; - if ( byte_4E185E ) + if ( use_start_bonus ) res_value = am_Players[0].zoo_level + zoo_bonus; intToString(res_value, text_buff); // v8 = 0; @@ -2390,7 +2042,7 @@ DrawPlayerLevels(-1, text_buff, &text_position); res_value = am_Players[1].zoo_level; - if ( byte_4E185E ) + if ( use_start_bonus ) res_value = am_Players[1].zoo_level + zoo_bonus; intToString(res_value, text_buff); // v10 = 0; @@ -2708,8 +2360,8 @@ if ( am_byte_4E185D) { - pTargetXY.x += am_Players[current_player_num].arr_6C[v2].field_0 ; - pTargetXY.y += am_Players[current_player_num].arr_6C[v2].field_4; + pTargetXY.x += am_Players[current_player_num].card_shift[v2].x ; + pTargetXY.y += am_Players[current_player_num].card_shift[v2].y; } v7 = am_Players[current_player_num].cards_at_hand[v2]; if ( v7 == -1 ) @@ -2743,8 +2395,8 @@ LABEL_15: if ( am_byte_4E185D ) { - pTargetXY.x -= am_Players[current_player_num].arr_6C[v2].field_0 ; - pTargetXY.y -= am_Players[current_player_num].arr_6C[v2].field_4 ; + pTargetXY.x -= am_Players[current_player_num].card_shift[v2].x ; + pTargetXY.y -= am_Players[current_player_num].card_shift[v2].y ; } ++v2; } @@ -2853,8 +2505,8 @@ { // v3 = 188 * current_player_num + 8 * amuint_4FAA4C; // amuint_4FAA3C_blt_xy.x = (amuint_4FAA4C * v2 + *(am_Players[0].arr_6C[0] + v3) - 120) / 10; - amuint_4FAA3C_blt_xy.x=(amuint_4FAA4C * v2 + am_Players[current_player_num].arr_6C[amuint_4FAA4C].field_0-120)/10; - v4 = (am_Players[current_player_num].arr_6C[amuint_4FAA4C].field_4+309) /10;//(*(&am_Players[0].arr_6C[0][1] + v3) + 309) / 10; + amuint_4FAA3C_blt_xy.x=(amuint_4FAA4C * v2 + am_Players[current_player_num].card_shift[amuint_4FAA4C].x-120)/10; + v4 = (am_Players[current_player_num].card_shift[amuint_4FAA4C].y+309) /10;//(*(&am_Players[0].arr_6C[0][1] + v3) + 309) / 10; } else { @@ -2966,17 +2618,7 @@ if (shown_cards[v17].uCardId==-1) break; } - /* v17 = 0; - do - { - if ( v7->uCardId == -1 ) - break; - ++v7; - ++v17; - } - while ( v7 < &dword_4FABB8 );*/ - // v26 = 32 * v17; - + amuint_4FAA54_blt_xy.x = (shown_cards[v17].field_8.x - 272) / 5; amuint_4FAA54_blt_xy.y = (shown_cards[v17].field_8.y - 173) / 5; pArcomageGame->GetCardRect(played_card_id, &pSrcXYZW); @@ -3140,8 +2782,8 @@ if ( am_byte_4E185D ) { // v9 = v3 + 8 * v7; - v10 = am_Players[player_num].arr_6C[v7].field_0;//*(am_player[0].arr_6C[0] + v9); - v11 = am_Players[player_num].arr_6C[v7].field_4;//*(&am_player[0].arr_6C[0][1] + v9); + v10 = am_Players[player_num].card_shift[v7].x;//*(am_player[0].arr_6C[0] + v9); + v11 = am_Players[player_num].card_shift[v7].y;//*(&am_player[0].arr_6C[0][1] + v9); pXYZW.left += v10; pXYZW.right += v10; pXYZW.top += v11; @@ -3157,8 +2799,8 @@ pXYZW.right += var18; if ( am_byte_4E185D ) { - v16 = am_Players[player_num].arr_6C[v30].field_0;//*(am_player[0].arr_6C[0] + v15); - v17 = am_Players[player_num].arr_6C[v30].field_4;//*(&am_player[0].arr_6C[0][1] + v15); + v16 = am_Players[player_num].card_shift[v30].x;//*(am_player[0].arr_6C[0] + v15); + v17 = am_Players[player_num].card_shift[v30].y;//*(&am_player[0].arr_6C[0][1] + v15); pXYZW.left -= v16; pXYZW.right -= v16; pXYZW.top -= v17; @@ -3193,7 +2835,7 @@ // 4E185D: using guessed type char am_byte_4E185D; //----- (0040BCFB) -------------------------------------------------------- -bool am_40BCFB( int player_num, signed int card_slot_index ) +bool DiscardCard( int player_num, signed int card_slot_index ) { int v2; // esi@2 signed int v3; // edi@2 @@ -3225,13 +2867,13 @@ } } - if ( pCards[am_Players[player_num].cards_at_hand[i]].attack_or_defence) + if ( pCards[am_Players[player_num].cards_at_hand[i]].can_be_discarded) { ArcomageGame::PlaySound(22); v8 = GetPlayerHandCardCount(current_player_num); - v10=am_Players[player_num].arr_6C[i].field_0 + (640 - 96 * v8) / (v8 + 1); + v10=am_Players[player_num].card_shift[i].x + (640 - 96 * v8) / (v8 + 1); amuint_4FAA5C_blt_xy.x = v10; - amuint_4FAA5C_blt_xy.y = am_Players[player_num].arr_6C[i].field_4 + 327;//v11; + amuint_4FAA5C_blt_xy.y = am_Players[player_num].card_shift[i].y + 327;//v11; v12 = 0; if ( !am_byte_4FAA75 ) @@ -3245,21 +2887,15 @@ pArcomageGame->field_F6 = 1; amuint_4FAA54_blt_xy.x = (shown_cards[v12].field_8.x - v10) / 10; amuint_4FAA54_blt_xy.y = (shown_cards[v12].field_8.y - 327) / 10; - uCardID = am_Players[player_num].cards_at_hand[i]; am_Players[player_num].cards_at_hand[i] = -1; - hand_full = 0; + need_to_discard_card = 0; return true; } else return false; } -// 4FAA75: using guessed type char am_byte_4FAA75; -// 4FAA77: using guessed type char am_byte_4FAA77; -// 4FAA78: using guessed type int amuint_4FAA78[]; -// 4FAA80: using guessed type int amuint_4FAA80[]; -// 4FAA84: using guessed type int amuint_4FAA84[]; -// 4FABB8: using guessed type int dword_4FABB8; + //----- (0040BE0E) -------------------------------------------------------- bool PlayCard( int player_num, signed int card_slot_num ) @@ -3268,25 +2904,25 @@ int v3; // ebp@1 int v4; // ecx@2 ArcomagePlayer *v5; // esi@2 - int v6; // edi@2 + int card_index; // edi@2 int v7; // eax@2 int v8; // ebx@8 - int v9; // eax@8 + int cards_at_hand; // eax@8 int v10; // ebx@8 int v11; // ebp@8 int v12; // ecx@8 int v13; // eax@8 - ArcomageCard *v14; // eax@8 + ArcomageCard *pCard; // eax@8 int v15; // ecx@8 int v16; // ecx@8 if ( card_slot_num <= -1 ) return false; + v4 = 0; - - for (v6=0; v6<10; ++v6) + for (card_index=0; card_index<10; ++card_index) { - if ( am_Players[player_num].cards_at_hand[v6] != -1 ) + if ( am_Players[player_num].cards_at_hand[card_index] != -1 ) { if ( card_slot_num == v4 ) break; @@ -3294,28 +2930,29 @@ } } - if (CanCardBePlayed(player_num, v6) ) + if (CanCardBePlayed(player_num, card_index) ) { ArcomageGame::PlaySound(23); - v9 = GetPlayerHandCardCount(current_player_num); - // v10 = 188 * v8 + 8 * v6; - // v11 = v6 + 47 * v3; + cards_at_hand = GetPlayerHandCardCount(current_player_num); pArcomageGame->field_F6 = 1; - v12 = am_Players[player_num].arr_6C[v6].field_0 + (640 - 96 * v9) / (v9 + 1)+ 96 * v6 +(640 - 96 * v9) / (v9 + 1); + v12 = am_Players[player_num].card_shift[card_index].x + + (640 - 96 * cards_at_hand) / (cards_at_hand + 1)+ + 96 * card_index ; + // v13 = *(int *)((char *)&am_Players[0].arr_6C[0][1] + v10) + 327; amuint_4FAA5C_blt_xy.x = v12;//v12; - amuint_4FAA5C_blt_xy.y = am_Players[player_num].arr_6C[v6].field_4 + 327;//v13; + amuint_4FAA5C_blt_xy.y = am_Players[player_num].card_shift[card_index].y + 327;//v13; amuint_4FAA54_blt_xy.x = (272 - v12) / 5; amuint_4FAA54_blt_xy.y = -30; - v14 = &pCards[am_Players[player_num].cards_at_hand[v6]]; - am_Players[player_num].resource_bricks -= v14->needed_bricks; - am_Players[player_num].resource_beasts -= v14->needed_beasts; - am_Players[player_num].resource_gems -= v14->needed_gems; - played_card_id = am_Players[player_num].cards_at_hand[v6]; - am_Players[player_num].cards_at_hand[v6] = -1; - return true;; + pCard = &pCards[am_Players[player_num].cards_at_hand[card_index]]; + am_Players[player_num].resource_bricks -= pCard->needed_bricks; + am_Players[player_num].resource_beasts -= pCard->needed_beasts; + am_Players[player_num].resource_gems -= pCard->needed_gems; + played_card_id = am_Players[player_num].cards_at_hand[card_index]; + am_Players[player_num].cards_at_hand[card_index] = -1; + return true; } else return false; @@ -3471,76 +3108,87 @@ v5 = player->quarry_level; v7 = __OFSUB__(v5, enemy->quarry_level); v6 = v5 - enemy->quarry_level < 0; - goto LABEL_18; + v18 = v6 ^ v7; + goto LABEL_25; case 3: v8 = player->magic_level; v7 = __OFSUB__(v8, enemy->magic_level); v6 = v8 - enemy->magic_level < 0; - goto LABEL_18; + v18 = v6 ^ v7; + goto LABEL_25; case 4: v9 = player->zoo_level; v7 = __OFSUB__(v9, enemy->zoo_level); v6 = v9 - enemy->zoo_level < 0; - goto LABEL_18; + v18 = v6 ^ v7; + goto LABEL_25; case 5: v10 = player->quarry_level == enemy->quarry_level; - goto LABEL_21; + v18 = v10; + goto LABEL_25; case 6: v10 = player->magic_level == enemy->magic_level; - goto LABEL_21; + v18 = v10; + goto LABEL_25; case 7: v10 = player->zoo_level == enemy->zoo_level; - goto LABEL_21; + v18 = v10; + goto LABEL_25; case 8: v11 = player->quarry_level; v14 = __OFSUB__(v11, enemy->quarry_level); v12 = v11 == enemy->quarry_level; v13 = v11 - enemy->quarry_level < 0; - goto LABEL_24; + v18 = !((v13 ^ v14) | v12); + goto LABEL_25; case 9: v15 = player->magic_level; v14 = __OFSUB__(v15, enemy->magic_level); v12 = v15 == enemy->magic_level; v13 = v15 - enemy->magic_level < 0; - goto LABEL_24; + v18 = !((v13 ^ v14) | v12); + goto LABEL_25; case 10: v16 = player->zoo_level; v14 = __OFSUB__(v16, enemy->zoo_level); v12 = v16 == enemy->zoo_level; v13 = v16 - enemy->zoo_level < 0; - goto LABEL_24; + v18 = !((v13 ^ v14) | v12); + goto LABEL_25; case 11: v10 = player->wall_height == 0; - goto LABEL_21; + v18 = v10; + goto LABEL_25; case 12: v17 = player->wall_height == 0; - goto LABEL_15; + v18 = !v17; + goto LABEL_25; case 13: v10 = enemy->wall_height == 0; - goto LABEL_21; + v18 = v10; + goto LABEL_25; case 14: v17 = enemy->wall_height == 0; -LABEL_15: v18 = !v17; goto LABEL_25; case 15: v19 = player->wall_height; v7 = __OFSUB__(v19, enemy->wall_height); v6 = v19 - enemy->wall_height < 0; - goto LABEL_18; + v18 = v6 ^ v7; + goto LABEL_25; case 16: v20 = player->tower_height; v7 = __OFSUB__(v20, enemy->tower_height); v6 = v20 - enemy->tower_height < 0; -LABEL_18: v18 = v6 ^ v7; goto LABEL_25; case 17: v10 = player->wall_height == enemy->wall_height; - goto LABEL_21; + v18 = v10; + goto LABEL_25; case 18: v10 = player->tower_height == enemy->tower_height; -LABEL_21: v18 = v10; goto LABEL_25; case 19: @@ -3548,13 +3196,13 @@ v14 = __OFSUB__(v21, enemy->wall_height); v12 = v21 == enemy->wall_height; v13 = v21 - enemy->wall_height < 0; - goto LABEL_24; + v18 = !((v13 ^ v14) | v12); + goto LABEL_25; case 20: v22 = player->tower_height; v14 = __OFSUB__(v22, enemy->tower_height); v12 = v22 == enemy->tower_height; v13 = v22 - enemy->tower_height < 0; -LABEL_24: v18 = !((v13 ^ v14) | v12); LABEL_25: if ( v18 ) @@ -3562,7 +3210,7 @@ goto LABEL_231; default: LABEL_26: - v23 = pCard->can_draw_extra_card; + v23 = pCard->draw_extra_card_count; v24 = 0; dword_4FAA68 = v23 + (pCard->field_30 == 1); dword_4FAA64 = v23; @@ -3573,10 +3221,10 @@ GetNextCardFromDeck(player_num); ++v24; } - while ( v24 < pCard->can_draw_extra_card ); + while ( v24 < pCard->draw_extra_card_count ); } - hand_full = GetPlayerHandCardCount(player_num) > minimum_cards_at_hand; + need_to_discard_card = GetPlayerHandCardCount(player_num) > minimum_cards_at_hand; APPLY_TO_PLAYER(player, enemy, quarry_level, pCard->to_player_quarry_lvl, quarry_p); @@ -3639,7 +3287,7 @@ while ( v104 < pCard->can_draw_extra_card2 ); } - hand_full = GetPlayerHandCardCount(player_num) > minimum_cards_at_hand; + need_to_discard_card = GetPlayerHandCardCount(player_num) > minimum_cards_at_hand; APPLY_TO_PLAYER(player, enemy, quarry_level, pCard->to_player_quarry_lvl2, quarry_p); APPLY_TO_PLAYER(player, enemy, magic_level, pCard->to_player_magic_lvl2, magic_p); @@ -3978,7 +3626,7 @@ //----- (0040D2B4) -------------------------------------------------------- -int am_40D2B4( POINT* a1, int a2 ) +int am_40D2B4( POINT* startXY, int effect_value ) { int v2; // ebp@1 POINT *v3; // edi@1 @@ -3989,14 +3637,14 @@ v11 = 0; - v2 = a2; - v3 = a1; - while ( array_4FABD0[v11].field_0 ) + v2 = effect_value; + + while ( array_4FABD0[v11].have_effect ) { result = array_4FABD0[v11].field_40->_40E2A7(); if ( !result ) { - array_4FABD0[v11].field_0 = 0; + array_4FABD0[v11].have_effect = 0; --v11; } ++v11; @@ -4004,20 +3652,20 @@ return result; } v6 = v11; - array_4FABD0[v11].field_0 = 1; - if ( v2 <= 0 ) + array_4FABD0[v11].have_effect = 1; + if ( effect_value <= 0 ) { - array_4FABD0[v6].field_1 = 0; - v2 = -v2; + array_4FABD0[v6].effect_sign = 0; + effect_value = -effect_value; } else { - array_4FABD0[v6].field_1 = 1; + array_4FABD0[v6].effect_sign = 1; } - array_4FABD0[v6].field_4.field_0 = v3->x - 20; - array_4FABD0[v6].field_4.field_8 = v3->x + 20; - array_4FABD0[v6].field_4.field_4 = v3->y - 20; - array_4FABD0[v6].field_4.field_C = v3->y + 20; + array_4FABD0[v6].field_4.effect_area.left = startXY->x - 20; + array_4FABD0[v6].field_4.effect_area.right = startXY->x + 20; + array_4FABD0[v6].field_4.effect_area.top = startXY->y - 20; + array_4FABD0[v6].field_4.effect_area.bottom = startXY->y + 20; array_4FABD0[v6].field_4.field_10 = -60; array_4FABD0[v6].field_4.field_14 = 60; array_4FABD0[v6].field_4.field_18 = 180; @@ -4028,17 +3676,17 @@ array_4FABD0[v6].field_4.field_2Cf = 8.0; array_4FABD0[v6].field_4.field_30 = 5; array_4FABD0[v6].field_4.field_34 = 15; - array_4FABD0[v6].field_4.field_38 = &array_4FABD0[v6].field_44[0]; + array_4FABD0[v6].field_4.sparks_array = &array_4FABD0[v6].effect_sparks[0]; v8 = array_4FABD0[v6].field_40; - v8->_40E01A(&array_4FABD0[v6].field_4); - if ( 10 * v2 > 150 ) - v2 = 15; + v8->StartFill(&array_4FABD0[v6].field_4); + if ( 10 * effect_value > 150 ) + effect_value = 15; if ( v8->signature != SIG_trpg ) return 2; if ( !v8->field_59 ) return 3; - v8->field_8 = 10 * v2; + v8->position_in_sparks_arr = 10 * effect_value; v8->field_30 = 0.0; v8->field_58 = 0; v8->field_44 = 0; @@ -4046,7 +3694,7 @@ v8->field_48 = 0; v8->field_50 = 0; for (int i=0; i<v8->field_4; ++i) - v8->field_54[i].field_0=0; + v8->field_54[i].have_spark=0; return 0; } @@ -4357,9 +4005,8 @@ for (int i=0; i<12; ++i) am_sounds[i] = pSoundList->LoadSound(v4++, 0); - for (int i=0; i<10; ++i) - array_4FABD0[i].field_40->Ctor(&array_4FABD0[i].field_40); + stru272_stru0::Ctor(&array_4FABD0[i].field_40); current_card_slot_index = -1; amuint_4FAA4C = -1; @@ -4368,7 +4015,7 @@ byte_4FAA2C = 0; byte_505880 = 0; dword_4FAA70 = 0; - hand_full = 0; + need_to_discard_card = 0; SetStartGameData(); InitalHandsFill(); //nullsub_1(); @@ -4389,14 +4036,10 @@ } - - - - //----- (00409BE8) -------------------------------------------------------- void SetStartConditions() { - ArcomageStartConditions *st_cond; // eax@1 + const ArcomageStartConditions *st_cond; // eax@1 st_cond = &start_conditions[window_SpeakInHouse->par1C - 108]; start_tower_height = st_cond->tower_height; @@ -4411,7 +4054,7 @@ max_tower_height = st_cond->max_tower; max_resources_amount = st_cond->max_resources; - dword_4DF3A4 = st_cond->field_14; + opponent_mastery = st_cond->mastery_lvl; start_bricks_amount = st_cond->bricks_amount; start_gems_amount = st_cond->gems_amount; @@ -4423,14 +4066,12 @@ //----- (0040D75D) -------------------------------------------------------- void pPrimaryWindow_draws_text( int a1, const char *pText, POINT *pXY ) { - int v4; // qax@1 - v4 = pFontComic->uFontHeight - 3; - pPrimaryWindow->DrawText( pFontComic, pXY->x, pXY->y - (v4 >> 1) + 3, 0, pText, 0, 0, 0); + pPrimaryWindow->DrawText( pFontComic, pXY->x, pXY->y - ((pFontComic->uFontHeight - 3) >> 1) + 3, 0, pText, 0, 0, 0); } //----- (0040DB27) -------------------------------------------------------- -void __fastcall DrawRect(RECT *pXYZW, unsigned __int16 uColor, char bSolidFill) +void DrawRect( RECT *pXYZW, unsigned __int16 uColor, char bSolidFill ) { RECT *v3; // esi@1 @@ -4452,6 +4093,23 @@ pRenderer->EndScene(); } +void SetPixel2sq( POINT *pTargetXY, unsigned __int16 uColor ) + { + pRenderer->BeginScene(); + if ( pRenderer->uNumSceneBegins ) + { + int xVal = pTargetXY->x; + int yVal = pTargetXY->y; + if ( xVal >= 0 && xVal <= 639 && yVal >= 0 && yVal <= 479) + { + pRenderer->pTargetSurface[xVal + pRenderer->uTargetSurfacePitch * yVal] = uColor; + pRenderer->pTargetSurface[xVal+1 + pRenderer->uTargetSurfacePitch * yVal] = uColor; + pRenderer->pTargetSurface[xVal + pRenderer->uTargetSurfacePitch * (yVal+1)] = uColor; + pRenderer->pTargetSurface[xVal+1 + pRenderer->uTargetSurfacePitch * (yVal+1)] = uColor; + } + pRenderer->EndScene(); + } + } //----- (0040DBD3) -------------------------------------------------------- void SetPixel( POINT *pTargetXY, unsigned __int16 uColor ) @@ -4471,9 +4129,9 @@ //----- (0040DDB1) -------------------------------------------------------- -int __fastcall rand_interval(int a, int b) +int rand_interval( int min, int max ) { - return a + rand() % (b - a + 1); + return min + rand() % (max - min + 1); }
--- a/Arcomage.h Fri Jun 14 16:06:20 2013 +0600 +++ b/Arcomage.h Fri Jun 14 16:06:30 2013 +0600 @@ -3,13 +3,6 @@ #include "Texture.h" -#pragma pack(push, 1) -struct am_st1 -{ - int field_0; - int field_4; -}; -#pragma pack(pop) /* 401 */ #pragma pack(push, 1) @@ -38,10 +31,10 @@ char needed_bricks; char needed_gems; char needed_beasts; - char attack_or_defence; + char can_be_discarded; int compare_param; char field_30; - char can_draw_extra_card; + char draw_extra_card_count; char to_player_quarry_lvl; char to_player_magic_lvl; char to_player_zoo_lvl; @@ -120,7 +113,7 @@ int resource_gems; int resource_beasts; int cards_at_hand[10]; - am_st1 arr_6C[10]; + POINT card_shift[10]; }; #pragma pack(pop) @@ -172,8 +165,7 @@ struct GUIFont *pfntComic;//ptr_48; struct GUIFont *pfntArrus;//ptr_4C; int field_50; - __int16 field_54; - __int16 field_56; + int field_54; RGBTexture pGameBackground; RGBTexture pSprites; int event_timer_time; @@ -184,8 +176,8 @@ char field_F4; char GameOver; char field_F6; - char field_F7; - char field_F8; + char prev_mouse_left; + char prev_mouse_right; char field_F9; char bGameInProgress; }; @@ -202,8 +194,8 @@ #pragma pack(push, 1) struct stru272_stru1 { - int field_0; - POINT field_4; + int have_spark; + POINT spark_position; int field_C; int field_10; int field_14; @@ -215,10 +207,11 @@ #pragma pack(push, 1) struct stru272_stru2 { - int field_0; - int field_4; - int field_8; - int field_C; +/*int field_0; +int field_4; +int field_8; +int field_C;*/ + RECT effect_area; int field_10; int field_14; int field_18; @@ -229,7 +222,7 @@ float field_2Cf; int field_30; int field_34; - stru272_stru1* field_38; + stru272_stru1* sparks_array; }; #pragma pack(pop) @@ -240,14 +233,14 @@ { static void Ctor(stru272_stru0 **a1); int Dtor(); - int _40E01A(stru272_stru2* a2); + int StartFill(stru272_stru2* a2); int Empty(char a2, char a3); - int _40E133(); + int DrawEffect(); int _40E2A7(); int signature; int field_4; - int field_8; + int position_in_sparks_arr; int field_C; int field_10; int field_14; @@ -289,13 +282,13 @@ #pragma pack(push, 1) struct stru272 { - char field_0; - char field_1; + char have_effect; + char effect_sign; char _pad_2; char _pad_3; stru272_stru2 field_4; stru272_stru0 *field_40; - stru272_stru1 field_44[150]; + stru272_stru1 effect_sparks[150]; }; #pragma pack(pop)
--- a/AudioPlayer.cpp Fri Jun 14 16:06:20 2013 +0600 +++ b/AudioPlayer.cpp Fri Jun 14 16:06:30 2013 +0600 @@ -7,6 +7,7 @@ #include "stru11.h" +#include "mm7_data.h" #include "VideoPlayer.h" #include "AudioPlayer.h" #include "Allocator.h" @@ -54,7 +55,7 @@ std::array<float, 10> pSoundVolumeLevels = { 0.0000000f, 0.1099999f, 0.2199999f, 0.3300000f, 0.4399999f, - 0.5500000f, 0.6600000f, 0.7699999f, 0.8799999f, 0.9900000f + 0.5500000f, 0.6600000f, 0.7699999f, 0.8799999f, 0.9700000f //changed 0.9900000f to 0.9700000f. for some reason it only works for values below this }; @@ -2255,9 +2256,11 @@ do { v11 = v14[v10]; - v10++; + v12 = 16 * (v14[v10++] + 47); pMixerChannels[v11].uSourceTrackID = 0; - pMixerChannels[v11].hSample = NULL; + v13 = __OFSUB__(v10, num_same_sound_on_channels); + v6 = v10 - num_same_sound_on_channels < 0; + *(unsigned int *)((char *)&bEAXSupported + v12) = 0; } while (v10<num_same_sound_on_channels); }
--- a/BSPModel.h Fri Jun 14 16:06:20 2013 +0600 +++ b/BSPModel.h Fri Jun 14 16:06:30 2013 +0600 @@ -34,7 +34,7 @@ char pModelName2[32]; int field_40; struct BSPVertexBuffer pVertices; - unsigned int uNumFaces; + int uNumFaces; unsigned int uNumConvexFaces; struct ODMFace *pFaces; unsigned __int16 *pFacesOrdering;
--- a/CShow.cpp Fri Jun 14 16:06:20 2013 +0600 +++ b/CShow.cpp Fri Jun 14 16:06:30 2013 +0600 @@ -2,6 +2,7 @@ #include "CShow.h" +#include "mm7_data.h" #include "VideoPlayer.h" #include "Mouse.h"
--- a/Events.cpp Fri Jun 14 16:06:20 2013 +0600 +++ b/Events.cpp Fri Jun 14 16:06:30 2013 +0600 @@ -5,12 +5,14 @@ #include <assert.h> #include <stdlib.h> +#include "Texture.h" +#include "mm7_data.h" #include "VideoPlayer.h" #include "Mouse.h" #include "MapInfo.h" #include "Game.h" -#include "Outdoor.h" +#include "Render.h" #include "GUIWindow.h" #include "GUIProgressBar.h" #include "Chest.h"
--- a/GUIButton.cpp Fri Jun 14 16:06:20 2013 +0600 +++ b/GUIButton.cpp Fri Jun 14 16:06:30 2013 +0600 @@ -1,7 +1,6 @@ #include "GUIWindow.h" #include "GUIFont.h" -#include "mm7_data.h"
--- a/GUIFont.h Fri Jun 14 16:06:20 2013 +0600 +++ b/GUIFont.h Fri Jun 14 16:06:30 2013 +0600 @@ -12,6 +12,8 @@ #pragma pack(pop) /* 170 */ +#pragma warning( push ) +#pragma warning( disable : 4200 ) #pragma pack(push, 1) struct GUIFont { @@ -43,8 +45,10 @@ GUICharMetric pMetrics[256]; int font_pixels_offset[256]; unsigned char pFontData[0]; //array of font pixels + }; #pragma pack(pop) +#pragma warning( pop ) GUIFont *LoadFont(const char *pFontFile, const char *pFontPalette, ...); char * FitTextInAWindow(const char *pInString, GUIFont *pFont, GUIWindow *pWindow, signed int uX, int a5);
--- a/GUIProgressBar.h Fri Jun 14 16:06:20 2013 +0600 +++ b/GUIProgressBar.h Fri Jun 14 16:06:30 2013 +0600 @@ -41,9 +41,9 @@ RGBTexture field_68; RGBTexture field_90; RGBTexture field_B8; - Texture field_E0; - Texture pBardata; - Texture pLoadingProgress; + struct Texture field_E0; + struct Texture pBardata; + struct Texture pLoadingProgress; }; #pragma pack(pop)
--- a/GUIWindow.h Fri Jun 14 16:06:20 2013 +0600 +++ b/GUIWindow.h Fri Jun 14 16:06:30 2013 +0600 @@ -5,6 +5,7 @@ + enum UIMessageType: unsigned __int32 { UIMSG_0 = 0, @@ -324,7 +325,7 @@ } GUIButton *CreateButton(unsigned int uX, unsigned int uY, unsigned int uWidth, unsigned int uHeight, int a6, int a7, - UIMessageType msg, unsigned int msg_param, unsigned __int8 uHotkey, const char *pName, Texture *pTextures, ...); + UIMessageType msg, unsigned int msg_param, unsigned __int8 uHotkey, const char *pName, struct Texture *pTextures, ...); void DrawFlashingInputCursor(signed int a3, int a4, struct GUIFont *a2); int DrawTextInRect(GUIFont *a2, unsigned int uX, unsigned int uY, unsigned int uColor, const char *Str1, int Source, int a8); void DrawText(GUIFont *a2, signed int uX, int uY, unsigned int uFontColor, const char *Str, int a7, int a8, unsigned int uFontShadowColor);
--- a/Game.cpp Fri Jun 14 16:06:20 2013 +0600 +++ b/Game.cpp Fri Jun 14 16:06:30 2013 +0600 @@ -38,6 +38,8 @@ #include "texts.h" #include "GUIFont.h" #include "Log.h" +#include "Lights.h" +#include "mm7_data.h" //#include "MM7.h"
--- a/Indoor.cpp Fri Jun 14 16:06:20 2013 +0600 +++ b/Indoor.cpp Fri Jun 14 16:06:30 2013 +0600 @@ -6,7 +6,6 @@ #include "LightmapBuilder.h" #include "DecalBuilder.h" -#include "ParticleEngine.h" #include "stru9.h" #include "stru10.h" #include "stru367.h" @@ -34,6 +33,7 @@ #include "PaletteManager.h" #include "MapInfo.h" #include "IndoorCamera.h" +#include "Lights.h" #include "mm7_data.h" #include "MM7.h"
--- a/Indoor.h Fri Jun 14 16:06:20 2013 +0600 +++ b/Indoor.h Fri Jun 14 16:06:30 2013 +0600 @@ -1,6 +1,7 @@ #pragma once #include "VectorTypes.h" #include "Weather.h" +#include "Indoor_stuff.h" @@ -128,17 +129,6 @@ -/* 291 */ -enum PolygonType : __int8 -{ - POLYGON_Invalid = 0x0, - POLYGON_VerticalWall = 0x1, - POLYGON_unk = 0x2, - POLYGON_Floor = 0x3, - POLYGON_InBetweenFloorAndWall = 0x4, - POLYGON_Ceiling = 0x5, - POLYGON_InBetweenCeilingAndWall = 0x6, -}; /* 90 */ #pragma pack(push, 1) @@ -576,5 +566,3 @@ - -#include "Indoor_stuff.h" \ No newline at end of file
--- a/Indoor_stuff.h Fri Jun 14 16:06:20 2013 +0600 +++ b/Indoor_stuff.h Fri Jun 14 16:06:30 2013 +0600 @@ -370,6 +370,17 @@ extern stru337 stru_F81018; +/* 291 */ +enum PolygonType : __int8 +{ + POLYGON_Invalid = 0x0, + POLYGON_VerticalWall = 0x1, + POLYGON_unk = 0x2, + POLYGON_Floor = 0x3, + POLYGON_InBetweenFloorAndWall = 0x4, + POLYGON_Ceiling = 0x5, + POLYGON_InBetweenCeilingAndWall = 0x6, +}; /* 147 */
--- a/Keyboard.cpp Fri Jun 14 16:06:20 2013 +0600 +++ b/Keyboard.cpp Fri Jun 14 16:06:30 2013 +0600 @@ -2,7 +2,6 @@ #define _CRT_SECURE_NO_WARNINGS #endif -#include "OSAPI.h" #include "Keyboard.h" #include "GUIWindow.h"
--- a/LOD.h Fri Jun 14 16:06:20 2013 +0600 +++ b/LOD.h Fri Jun 14 16:06:30 2013 +0600 @@ -150,13 +150,13 @@ bool LoadIconsOrEvents(const char *pLODFilename); void ReleaseAll(); unsigned int LoadTexture(const char *pContainer, enum TEXTURE_TYPE uTextureType = TEXTURE_DEFAULT); - Texture *LoadTexturePtr(const char *pContainer, enum TEXTURE_TYPE uTextureType = TEXTURE_DEFAULT); - int LoadTextureFromLOD(Texture *pOutTex, const char *pContainer, enum TEXTURE_TYPE eTextureType); - int ReloadTexture(Texture *pDst, const char *pContainer, int mode); + struct Texture *LoadTexturePtr(const char *pContainer, enum TEXTURE_TYPE uTextureType = TEXTURE_DEFAULT); + int LoadTextureFromLOD(struct Texture *pOutTex, const char *pContainer, enum TEXTURE_TYPE eTextureType); + int ReloadTexture(struct Texture *pDst, const char *pContainer, int mode); void ReleaseHardwareTextures(); void ReleaseLostHardwareTextures(); void _410423_move_textures_to_device(); - int _410522(Texture *pDst, const char *pContainer, unsigned int uTextureType); + int _410522(struct Texture *pDst, const char *pContainer, unsigned int uTextureType); void SetupPalettes(unsigned int uTargetRBits, unsigned int uTargetGBits, unsigned int uTargetBBits); void ReleaseAll2(); void _4114F2(); @@ -165,7 +165,7 @@ void _inlined_sub1(); void _inlined_sub2(); - inline Texture *GetTexture(int idx) + inline struct Texture *GetTexture(int idx) { assert(idx < 1000); if (idx == -1) return nullptr; // we need to return dummy texture here
--- a/LightmapBuilder.cpp Fri Jun 14 16:06:20 2013 +0600 +++ b/LightmapBuilder.cpp Fri Jun 14 16:06:30 2013 +0600 @@ -5,6 +5,7 @@ #include "Log.h" #include "OutdoorCamera.h" +#include "Lights.h" #include "mm7_data.h"
--- a/LightmapBuilder.h Fri Jun 14 16:06:20 2013 +0600 +++ b/LightmapBuilder.h Fri Jun 14 16:06:30 2013 +0600 @@ -1,8 +1,9 @@ #pragma once #include <vector> #include "Render.h" -#include "Lights.h" +struct LightsStack_StationaryLight_; +struct LightsStack_MobileLight_; /* 115 */ #pragma pack(push, 1)
--- a/LightsStack.cpp Fri Jun 14 16:06:20 2013 +0600 +++ b/LightsStack.cpp Fri Jun 14 16:06:30 2013 +0600 @@ -1,7 +1,6 @@ #include <string> #include "Lights.h" -#include "mm7_data.h" //----- (00467D88) -------------------------------------------------------- bool LightsStack_MobileLight_::AddLight(__int16 x, __int16 y, __int16 z, __int16 uSectorID, int uRadius, unsigned __int8 r, unsigned __int8 g, unsigned __int8 b, char uLightType)
--- a/Math.h Fri Jun 14 16:06:20 2013 +0600 +++ b/Math.h Fri Jun 14 16:06:30 2013 +0600 @@ -2,6 +2,9 @@ #include <cassert> #include <limits> #include <float.h> +#include <cmath> +#include <cstdlib> +#include <ciso646> /* 186 */ @@ -35,9 +38,6 @@ #define ROUNDING_EPSILON 0.0000001 #endif -#include <cmath> -#include <cstdlib> -#include <ciso646> template <typename FloatType> int bankersRounding(
--- a/Mouse.cpp Fri Jun 14 16:06:20 2013 +0600 +++ b/Mouse.cpp Fri Jun 14 16:06:30 2013 +0600 @@ -2,10 +2,10 @@ #define _CRT_SECURE_NO_WARNINGS #endif -#include "OSAPI.h" -#include "VideoPlayer.h" -#include "Vis.h" +#include "Texture.h" +#include "mm7_data.h" +#include "Render.h" #include "Mouse.h" #include "Items.h" #include "Party.h"
--- a/Outdoor.cpp Fri Jun 14 16:06:20 2013 +0600 +++ b/Outdoor.cpp Fri Jun 14 16:06:30 2013 +0600 @@ -30,6 +30,7 @@ #include "mm7_data.h" #include "MM7.h" +#include "Lights.h" #include "MapInfo.h"
--- a/Outdoor.h Fri Jun 14 16:06:20 2013 +0600 +++ b/Outdoor.h Fri Jun 14 16:06:30 2013 +0600 @@ -2,8 +2,7 @@ #include "Indoor.h" #include "TileFrameTable.h" -#include "Weather.h" -#include "BSPModel.h" +#include "Outdoor_stuff.h" #define DAY_ATTRIB_FOG 1 @@ -193,7 +192,7 @@ char pSkyTextureName[32]; char pGroundTileset[32]; OutdoorLocationTileType pTileTypes[4]; // [3] road tileset - unsigned int uNumBModels; + int uNumBModels; struct OutdoorLocationTerrain pTerrain; void *pCmap; BSPModel *pBModels; @@ -273,5 +272,3 @@ - -#include "Outdoor_stuff.h" \ No newline at end of file
--- a/Outdoor_stuff.h Fri Jun 14 16:06:20 2013 +0600 +++ b/Outdoor_stuff.h Fri Jun 14 16:06:30 2013 +0600 @@ -32,7 +32,7 @@ __int16 field_32; int field_34; struct stru149 *ptr_38; - Texture *pTexture; + struct Texture *pTexture; struct Span *prolly_head; struct Span *prolly_tail; int **ptr_48;
--- a/Party.h Fri Jun 14 16:06:20 2013 +0600 +++ b/Party.h Fri Jun 14 16:06:30 2013 +0600 @@ -1,7 +1,6 @@ #pragma once #include "Player.h" #include "NPC.h" -#include "Spells.h" #include "VectorTypes.h"
--- a/Player.cpp Fri Jun 14 16:06:20 2013 +0600 +++ b/Player.cpp Fri Jun 14 16:06:30 2013 +0600 @@ -7,7 +7,6 @@ #include "stru6.h" -#include "OSAPI.h" #include "Player.h" #include "PlayerFrameTable.h" #include "AudioPlayer.h" @@ -7871,15 +7870,15 @@ void Player::SetVariable(enum VariableType var_type, signed int var_value) { signed int currPlayerId; // ebx@1 - Player *v4; // esi@1 - unsigned int v5; // edi@1 + Player *v4_unused; // esi@1 + unsigned int v5_unused; // edi@1 unsigned int v6; // esi@13 unsigned int v7; // esi@14 - signed int v8; // eax@17 + signed int v8_unused; // eax@17 ItemGen *v9; // ecx@17 int v10; // eax@21 signed int v11; // eax@30 - Player *v12; // ecx@44 + Player *unused12; // ecx@44 char *v13; // ecx@45 Player *v14; // ecx@49 int v15; // ecx@86 @@ -7894,23 +7893,22 @@ DDM_DLV_Header *v24; // ecx@148 signed int v25; // eax@172 int v26; // [sp-8h] [bp-3Ch]@84 - signed int v27; // [sp-4h] [bp-38h]@4 - int v28; // [sp-4h] [bp-38h]@84 + signed int unused27; // [sp-4h] [bp-38h]@4 + int v28_unused; // [sp-4h] [bp-38h]@84 ItemGen item; // [sp+Ch] [bp-28h]@52 - char v30; // [sp+32h] [bp-2h]@1 - char v31; // [sp+33h] [bp-1h]@1 - - currPlayerId = 0; - v30 = 0; - v31 = 0; - v4 = this; - v5 = 0; - if ( this == pPlayers[2] ) - currPlayerId = 1; - else if ( this == pPlayers[3] ) - currPlayerId = 2; - else if ( this == pPlayers[4] ) - currPlayerId = 3; + char v30_unused; // [sp+32h] [bp-2h]@1 + char v31_unused; // [sp+33h] [bp-1h]@1 + + currPlayerId = -1; + for (int i = 1; i <= 4; i++) //TODO: add a member variable for playerid in the future + { + if ( this == pPlayers[i] ) + { + currPlayerId = i - 1; + break; + } + } + assert(currPlayerId != -1); if ( var_type > VAR_AutoNotes ) { if ( var_type <= VAR_GoldInBank ) @@ -7976,50 +7974,36 @@ return; bFlashHistoryBook = 1; } -LABEL_172: v25 = 8 * currPlayerId + 400; LOBYTE(v25) = PID(OBJECT_Player,currPlayerId - 112); - pAudioPlayer->PlaySound(SOUND_20001, v25, v5, -1, v5, v5, v5, v5); + pAudioPlayer->PlaySound(SOUND_20001, v25, 0, -1, 0, 0, 0, 0); return; } - if ( var_type != 307 ) - { - switch ( var_type ) - { - case 308: - pParty->uNumBountiesCollected = var_value; - break; - case 309: - pParty->uNumPrisonTerms = var_value; - break; - case 310: - pParty->uNumArenaPageWins = var_value; - break; - case 311: - pParty->uNumArenaSquireWins = var_value; - break; - case 312: - pParty->uNumArenaKnightWins = var_value; - break; - case 313: - pParty->uNumArenaLordWins = var_value; - break; - } - return; - } - pParty->uNumDeaths = var_value; -LABEL_168: - if ( v30 != 1 ) - { -LABEL_170: - if ( v31 != 1 ) - return; - v5 = 0; - goto LABEL_172; - } -LABEL_169: - pGame->pStru6Instance->SetPlayerBuffAnim(0x96u, currPlayerId); - goto LABEL_170; + switch ( var_type ) + { + case VAR_NumDeaths: + pParty->uNumDeaths = var_value; + break; + case VAR_NumBounties: + pParty->uNumBountiesCollected = var_value; + break; + case VAR_PrisonTerms: + pParty->uNumPrisonTerms = var_value; + break; + case VAR_ArenaWinsPage: + pParty->uNumArenaPageWins = var_value; + break; + case VAR_ArenaWinsSquire: + pParty->uNumArenaSquireWins = var_value; + break; + case VAR_ArenaWinsKnight: + pParty->uNumArenaKnightWins = var_value; + break; + case VAR_ArenaWinsLord: + pParty->uNumArenaLordWins = var_value; + break; + } + return; } if ( var_type == VAR_AutoNotes ) { @@ -8028,219 +8012,210 @@ && pAutonoteTxt[var_value-1].pText ) { v20 = pPlayers[currPlayerId + 1]; - v30 = 1; v20->PlaySound(SPEECH_96, 0); v21 = pAutonoteTxt[var_value-1].eType;// dword_72371C[2 * a3]; bFlashAutonotesBook = 1; _506568_autonote_type = v21; + DrawPlayerBuffAnimBasedOnCondition(currPlayerId); } _449B7E_toggle_bit(pParty->_autonote_bits, var_value, 1u); - v31 = 1; - goto LABEL_168; - } - if ( var_type <= VAR_ActualMight ) - { - if ( var_type != VAR_ActualMight ) - { - switch ( var_type ) - { - case VAR_RandomGold: - v6 = rand() % var_value + 1; - Party::SetGold(v6); - sprintf(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[500], v6);// You have %lu gold - ShowStatusBarString(pTmpBuf.data(), 2u); - GameUI_DrawFoodAndGold(); - return; - case VAR_RandomFood: - v7 = rand() % var_value + 1; - Party::SetFood(v7); - sprintf(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[501], v7);// You have %lu food - ShowStatusBarString(pTmpBuf.data(), 2u); - GameUI_DrawFoodAndGold(); - goto LABEL_124; - case VAR_Sex: - this->uSex = (PLAYER_SEX)var_value; - goto LABEL_124; - case VAR_Class: - this->classType = (PLAYER_CLASS_TYPE)var_value; - if ( (char)var_value != 35 ) - goto LABEL_124; - v8 = 0; - v9 = this->pInventoryItems; - break; - case VAR_CurrentHP: - this->sHealth = var_value; - goto LABEL_124; - case VAR_MaxHP: - this->sHealth = GetMaxHealth(); - return; - case VAR_CurrentSP: - this->sMana = var_value; - goto LABEL_124; - case VAR_MaxSP: - this->sMana = GetMaxMana(); - return; - case VAR_ACModifier: - this->sACModifier = (unsigned __int8)var_value; - goto LABEL_124; - case VAR_BaseLevel: - this->uLevel = (unsigned __int8)var_value; - goto LABEL_124; - case VAR_LevelModifier: - this->sLevelModifier = (unsigned __int8)var_value; - goto LABEL_124; - case VAR_Age: - this->sAgeModifier = var_value; - return; - case VAR_Award: - if ( !((unsigned __int8)(0x80u >> ((signed __int16)var_value - 1) % 8) & - pPlayers[currPlayerId + 1]->_guilds_member_bits[((signed __int16)var_value - 1)/ 8]) - //&& dword_723E80_award_related[2 * a3] ) - && pAwards[var_value].pText ) + PlaySoundBasedOnCondition(currPlayerId); + return; + } + if ( var_type <= VAR_BaseLuck ) + { + switch ( var_type ) + { + case VAR_Sex: + this->uSex = (PLAYER_SEX)var_value; + goto LABEL_124; + case VAR_Class: + this->classType = (PLAYER_CLASS_TYPE)var_value; + if ( (char)var_value == PLAYER_CLASS_LICH ) + { + v9 = NULL; + for (int i = 0; i < 138; i++) + { + v9 = &this->pInventoryItems[i]; + if (v9->uItemID == 615) + break; + } + if (v9 != NULL || v9->uItemID != 615) { - v30 = 1; - v31 = 1; - pPlayers[currPlayerId + 1]->PlaySound(SPEECH_96, 0); + v10 = (int)((char *)this + 36 * 138); //originally 36 * v8. the code got to this condition only if v8 was equal to 138 + *(int *)(v10 + 532) = 601; + *(char *)(v10 + 558) = currPlayerId + 1; } - _449B7E_toggle_bit((unsigned char *)v4->_guilds_member_bits, var_value, 1u); - goto LABEL_168; - case VAR_Experience: - this->uExperience = var_value; - goto LABEL_124; - case VAR_QBits_QuestsDone: - if ( !((unsigned __int8)(0x80u >> ((signed __int16)var_value - 1) % 8) & pParty->_quest_bits[((signed __int16)var_value - 1) >> 3]) - // && (&dword_722F10)[4 * a3] ) - && pQuestTable[var_value-1] ) + if ( this->sResFireBase < 20 ) + this->sResFireBase = 20; + if ( this->sResAirBase < 20 ) + this->sResAirBase = 20; + if ( this->sResWaterBase < 20 ) + this->sResWaterBase = 20; + if ( this->sResEarthBase < 20 ) + this->sResEarthBase = 20; + this->sResMindBase = 200; + this->sResBodyBase = 200; + v11 = this->GetSexByVoice(); + this->uPrevVoiceID = this->uVoiceID; + this->uPrevFace = this->uCurrentFace; + if ( v11 ) { - v14 = pPlayers[currPlayerId + 1]; - bFlashQuestBook = 1; - v30 = 1; - v31 = 1; - v14->PlaySound(SPEECH_93, 0); + this->uCurrentFace = 21; + this->uVoiceID = 21; + } + else + { + this->uCurrentFace = 20; + this->uVoiceID = 20; } - v13 = (char *)pParty->_quest_bits; -LABEL_51: - _449B7E_toggle_bit((unsigned char *)v13, var_value, 1u); - if (( v30 != 1 )&&( v31 != 1 )) - return; - else - pGame->pStru6Instance->SetPlayerBuffAnim(0x96u, currPlayerId); - if ( v31 != 1 ) - return; - v25 = 8 * currPlayerId + 400; - LOBYTE(v25) = PID(OBJECT_Player,currPlayerId - 112); - pAudioPlayer->PlaySound(SOUND_20001, v25, 0, -1, 0, 0, 0, 0); - return; - case VAR_PlayerItemInHands: - item.Reset(); - item.Reset(); - item.uItemID = var_value; - item.uAttributes = 1; - pParty->SetHoldingItem(&item); - if ( var_value >= ITEM_ARTIFACT_PUCK && var_value <= ITEM_RELIC_MEKORIGS_HAMMER ) - pParty->pIsArtifactFound[var_value-500] = 1; - return; - case VAR_FixedGold: - Party::SetGold(var_value); - return; - case VAR_BaseMight: - this->uMight = (unsigned __int8)var_value; - goto LABEL_84; - case VAR_BaseIntellect: - this->uIntelligence = (unsigned __int8)var_value; - goto LABEL_84; - case VAR_BasePersonality: - this->uWillpower = (unsigned __int8)var_value; - goto LABEL_84; - case VAR_BaseEndurance: - this->uEndurance = (unsigned __int8)var_value; - goto LABEL_84; - case VAR_BaseSpeed: - this->uSpeed = (unsigned __int8)var_value; - goto LABEL_84; - case VAR_BaseAccuracy: - this->uAccuracy = (unsigned __int8)var_value; - goto LABEL_84; - case VAR_BaseLuck: - this->uLuck = (unsigned __int8)var_value; - goto LABEL_84; - case VAR_FixedFood: - Party::SetFood(var_value); - goto LABEL_124; - case VAR_MightBonus: - goto LABEL_64; - case VAR_IntellectBonus: - goto LABEL_68; - case VAR_PersonalityBonus: - goto LABEL_69; - case VAR_EnduranceBonus: - goto LABEL_70; - case VAR_SpeedBonus: - goto LABEL_71; - case VAR_AccuracyBonus: - goto LABEL_72; - case VAR_LuckBonus: - goto LABEL_73; - default: - return; - } - while ( v9->uItemID != 615 ) - { - ++v8; - ++v9; - if ( v8 >= 138 ) - goto LABEL_22; - } - v10 = (int)((char *)v4 + 36 * v8); - *(int *)(v10 + 532) = 601; - *(char *)(v10 + 558) = currPlayerId + 1; -LABEL_22: - if ( v4->sResFireBase < 20 ) - v4->sResFireBase = 20; - if ( v4->sResAirBase < 20 ) - v4->sResAirBase = 20; - if ( v4->sResWaterBase < 20 ) - v4->sResWaterBase = 20; - if ( v4->sResEarthBase < 20 ) - v4->sResEarthBase = 20; - v4->sResMindBase = 200; - v4->sResBodyBase = 200; - v11 = v4->GetSexByVoice(); - v4->uPrevVoiceID = v4->uVoiceID; - v4->uPrevFace = v4->uCurrentFace; - if ( v11 ) - { - v4->uCurrentFace = 21; - v4->uVoiceID = 21; - } - else - { - v4->uCurrentFace = 20; - v4->uVoiceID = 20; - } - ReloadPlayerPortraits(currPlayerId, v4->uCurrentFace); - goto LABEL_124; - } -LABEL_64: - this->uMightBonus = (unsigned __int8)var_value; + ReloadPlayerPortraits(currPlayerId, this->uCurrentFace); + } + goto LABEL_124; + case VAR_CurrentHP: + this->sHealth = var_value; + goto LABEL_124; + case VAR_MaxHP: + this->sHealth = GetMaxHealth(); + return; + case VAR_CurrentSP: + this->sMana = var_value; + goto LABEL_124; + case VAR_MaxSP: + this->sMana = GetMaxMana(); + return; + case VAR_ACModifier: + this->sACModifier = (unsigned __int8)var_value; + goto LABEL_124; + case VAR_BaseLevel: + this->uLevel = (unsigned __int8)var_value; + goto LABEL_124; + case VAR_LevelModifier: + this->sLevelModifier = (unsigned __int8)var_value; + goto LABEL_124; + case VAR_Age: + this->sAgeModifier = var_value; + return; + case VAR_Award: + if ( !((unsigned __int8)(0x80u >> ((signed __int16)var_value - 1) % 8) & + pPlayers[currPlayerId + 1]->_guilds_member_bits[((signed __int16)var_value - 1)/ 8]) + //&& dword_723E80_award_related[2 * a3] ) + && pAwards[var_value].pText ) + { + pPlayers[currPlayerId + 1]->PlaySound(SPEECH_96, 0); + DrawPlayerBuffAnimBasedOnCondition(currPlayerId); + PlaySoundBasedOnCondition(currPlayerId); + } + _449B7E_toggle_bit((unsigned char *)this->_guilds_member_bits, var_value, 1u); + return; + case VAR_Experience: + this->uExperience = var_value; + goto LABEL_124; + case VAR_QBits_QuestsDone: + if ( !((unsigned __int8)(0x80u >> ((signed __int16)var_value - 1) % 8) & pParty->_quest_bits[((signed __int16)var_value - 1) >> 3]) + // && (&dword_722F10)[4 * a3] ) + && pQuestTable[var_value-1] ) + { + v14 = pPlayers[currPlayerId + 1]; + bFlashQuestBook = 1; + v14->PlaySound(SPEECH_93, 0); + DrawPlayerBuffAnimBasedOnCondition(currPlayerId); + PlaySoundBasedOnCondition(currPlayerId); + } + v13 = (char *)pParty->_quest_bits; + _449B7E_toggle_bit((unsigned char *)v13, var_value, 1u); + return; + case VAR_PlayerItemInHands: + item.Reset(); + item.Reset(); + item.uItemID = var_value; + item.uAttributes = 1; + pParty->SetHoldingItem(&item); + if ( var_value >= ITEM_ARTIFACT_PUCK && var_value <= ITEM_RELIC_MEKORIGS_HAMMER ) + pParty->pIsArtifactFound[var_value-500] = 1; + return; + case VAR_FixedGold: + Party::SetGold(var_value); + return; + case VAR_RandomGold: + v6 = rand() % var_value + 1; + Party::SetGold(v6); + sprintf(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[500], v6);// You have %lu gold + ShowStatusBarString(pTmpBuf.data(), 2u); + GameUI_DrawFoodAndGold(); + return; + case VAR_FixedFood: + Party::SetFood(var_value); + goto LABEL_124; + case VAR_RandomFood: + v7 = rand() % var_value + 1; + Party::SetFood(v7); + sprintf(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[501], v7);// You have %lu food + ShowStatusBarString(pTmpBuf.data(), 2u); + GameUI_DrawFoodAndGold(); + goto LABEL_124; + case VAR_MightBonus: + goto LABEL_64; + case VAR_IntellectBonus: + goto LABEL_68; + case VAR_PersonalityBonus: + goto LABEL_69; + case VAR_EnduranceBonus: + goto LABEL_70; + case VAR_SpeedBonus: + goto LABEL_71; + case VAR_AccuracyBonus: + goto LABEL_72; + case VAR_LuckBonus: + goto LABEL_73; + case VAR_BaseMight: + this->uMight = (unsigned __int8)var_value; + v26 = 92; + goto LABEL_112; + case VAR_BaseIntellect: + this->uIntelligence = (unsigned __int8)var_value; + v26 = 92; + goto LABEL_112; + case VAR_BasePersonality: + this->uWillpower = (unsigned __int8)var_value; + v26 = 92; + goto LABEL_112; + case VAR_BaseEndurance: + this->uEndurance = (unsigned __int8)var_value; + v26 = 92; + goto LABEL_112; + case VAR_BaseSpeed: + this->uSpeed = (unsigned __int8)var_value; + v26 = 92; + goto LABEL_112; + case VAR_BaseAccuracy: + this->uAccuracy = (unsigned __int8)var_value; + v26 = 92; + goto LABEL_112; + case VAR_BaseLuck: + this->uLuck = (unsigned __int8)var_value; + v26 = 92; + goto LABEL_112; + default: + return; + } LABEL_111: - v28 = 0; v26 = SPEECH_91; LABEL_112: v19 = pPlayers[currPlayerId + 1]; - v31 = 1; - v19->PlaySound((PlayerSpeech)v26, v28); - goto LABEL_169; - } - if ( var_type <= VAR_FireResistanceBonus ) - { - if ( var_type == VAR_FireResistanceBonus ) - { - this->sResFireBonus = (unsigned __int8)var_value; - goto LABEL_111; - } + v19->PlaySound((PlayerSpeech)v26, 0); + DrawPlayerBuffAnimBasedOnCondition(currPlayerId); + PlaySoundBasedOnCondition(currPlayerId); + return; + } + if ( var_type <= VAR_MagicResistance ) + { switch ( var_type ) { + case VAR_ActualMight: +LABEL_64: + this->uMightBonus = (unsigned __int8)var_value; + goto LABEL_111; case VAR_ActualIntellect: LABEL_68: this->uIntelligenceBonus = (unsigned __int8)var_value; @@ -8267,35 +8242,42 @@ goto LABEL_111; case VAR_FireResistance: this->sResFireBase = (unsigned __int8)var_value; - goto LABEL_84; + v26 = 92; + goto LABEL_112; case VAR_AirResistance: this->sResAirBase = (unsigned __int8)var_value; - goto LABEL_84; + v26 = 92; + goto LABEL_112; case VAR_WaterResistance: this->sResWaterBase = (unsigned __int8)var_value; - goto LABEL_84; + v26 = 92; + goto LABEL_112; case VAR_EarthResistance: this->sResEarthBase = (unsigned __int8)var_value; - goto LABEL_84; + v26 = 92; + goto LABEL_112; case VAR_SpiritResistance: this->sResSpiritBase = (unsigned __int8)var_value; - goto LABEL_84; + v26 = 92; + goto LABEL_112; case VAR_MindResistance: this->sResMindBase = (unsigned __int8)var_value; - goto LABEL_84; + v26 = 92; + goto LABEL_112; case VAR_BodyResistance: this->sResBodyBase = (unsigned __int8)var_value; - goto LABEL_84; + v26 = 92; + goto LABEL_112; case VAR_LightResistance: this->sResLightBase = (unsigned __int8)var_value; - goto LABEL_84; + v26 = 92; + goto LABEL_112; case VAR_DarkResistance: this->sResDarkBase = (unsigned __int8)var_value; - goto LABEL_84; + v26 = 92; + goto LABEL_112; case VAR_MagicResistance: this->sResMagicBase = (unsigned __int8)var_value; -LABEL_84: - v28 = 0; v26 = 92; goto LABEL_112; default: @@ -8312,7 +8294,7 @@ return; if ( var_type <= VAR_Eradicated ) { - v4->SetCondition(var_type - 105, 1); + this->SetCondition(var_type - 105, 1); } else { @@ -8322,94 +8304,94 @@ byte_5E4C15[var_type] = var_value; return; } - memset(v4, 0, 0xA0u); + memset(this, 0, 0xA0u); } -LABEL_124: - v31 = 1; - goto LABEL_169; - } -LABEL_106: - v16 = (int)((char *)&v4->pConditions[16] + 2 * var_type); - v17 = *(char *)v16; - if ( var_value <= VAR_BodyResistanceBonus ) - { - LOWORD(v15) = (unsigned __int8)var_value; - v18 = v15 | v17 & VAR_BodyResistanceBonus; } else { - LOWORD(v18) = (unsigned __int8)(var_value | v17 & 0xC0); - } - *(short *)v16 = v18; - goto LABEL_124; - } - if ( var_type == VAR_DisarmTrapSkill ) - if ( v30 != 1 ) - { - if ( v31 != 1 ) - return; - v5 = 0; - goto LABEL_172; - } - pGame->pStru6Instance->SetPlayerBuffAnim(0x96u, currPlayerId); - goto LABEL_170; - if ( var_type <= VAR_BodyResistanceBonus ) + v16 = (int)((char *)&this->pConditions[16] + 2 * var_type); + v17 = *(char *)v16; + if ( var_value <= VAR_BodyResistanceBonus ) + { + LOWORD(v15) = (unsigned __int8)var_value; + v18 = v15 | v17 & VAR_BodyResistanceBonus; + } + else + { + LOWORD(v18) = (unsigned __int8)(var_value | v17 & 0xC0); + } + *(short *)v16 = v18; + } +LABEL_124: + DrawPlayerBuffAnimBasedOnCondition(currPlayerId); + PlaySoundBasedOnCondition(currPlayerId); + return; + } + if ( var_type <= VAR_MagicResistanceBonus ) { switch ( var_type ) { - case VAR_BodyResistanceBonus: - v4->sResBodyBonus = (unsigned __int8)var_value; + case VAR_FireResistanceBonus: + this->sResFireBonus = (unsigned __int8)var_value; break; case VAR_AirResistanceBonus: - v4->sResAirBonus = (unsigned __int8)var_value; + this->sResAirBonus = (unsigned __int8)var_value; break; case VAR_WaterResistanceBonus: - v4->sResWaterBonus = (unsigned __int8)var_value; + this->sResWaterBonus = (unsigned __int8)var_value; break; case VAR_EarthResistanceBonus: - v4->sResEarthBonus = (unsigned __int8)var_value; + this->sResEarthBonus = (unsigned __int8)var_value; break; case VAR_SpiritResistanceBonus: - v4->sResSpiritBonus = (unsigned __int8)var_value; + this->sResSpiritBonus = (unsigned __int8)var_value; + break; + case VAR_MindResistanceBonus: + this->sResMindBonus = (unsigned __int8)var_value; + break; + case VAR_BodyResistanceBonus: + this->sResBodyBonus = (unsigned __int8)var_value; + break; + case VAR_LightResistanceBonus: + this->sResLightBonus = (unsigned __int8)var_value; + break; + case VAR_DarkResistanceBonus: + this->sResDarkBonus = (unsigned __int8)var_value; + break; + case VAR_PhysicalResistanceBonus: + assert("VAR_PhysicalResistanceBonus variable unsupported" && false); + return; + break; + case VAR_MagicResistanceBonus: + this->sResMagicBonus = (unsigned __int8)var_value; break; default: - if ( var_type != 62 ) + assert("Unexpected var_type" && false); return; - v4->sResMindBonus = (unsigned __int8)var_value; break; } goto LABEL_111; } - if ( var_type == VAR_LightResistanceBonus ) - { - v4->sResLightBonus = (unsigned __int8)var_value; - goto LABEL_111; - } - if ( var_type == VAR_DarkResistanceBonus ) - { - v4->sResDarkBonus = (unsigned __int8)var_value; - goto LABEL_111; - } - if ( var_type == VAR_MagicResistanceBonus ) - { - v4->sResMagicBonus = (unsigned __int8)var_value; - goto LABEL_111; - } - if ( var_type > VAR_MagicResistanceBonus && var_type <= VAR_DiplomacySkill ) - if ( v30 != 1 ) - { - if ( v31 != 1 ) - return; - v5 = 0; - v25 = 8 * currPlayerId + 400; - LOBYTE(v25) = PID(OBJECT_Player,currPlayerId - 112); - pAudioPlayer->PlaySound(SOUND_20001, v25, 0, -1, 0, 0, 0, 0); - return; - } - pGame->pStru6Instance->SetPlayerBuffAnim(0x96u, currPlayerId); - goto LABEL_170; -} - + if ( var_type > VAR_MagicResistanceBonus && var_type <= VAR_DiplomacySkill || var_type == VAR_DisarmTrapSkill) //VAR_ThieverySkill wasn't present in the original function + { + return; + } +} + + +//----- (new function) -------------------------------------------------------- +void Player::PlaySoundBasedOnCondition(int currPlayerId) +{ + signed int v25 = 8 * currPlayerId + 400; + LOBYTE(v25) = PID(OBJECT_Player,currPlayerId - 112); + pAudioPlayer->PlaySound(SOUND_20001, v25, 0, -1, 0, 0, 0, 0); +} + +//----- (new function) -------------------------------------------------------- +void Player::DrawPlayerBuffAnimBasedOnCondition(int currPlayerId) +{ + pGame->pStru6Instance->SetPlayerBuffAnim(0x96u, currPlayerId); +} //----- (0044AFFB) -------------------------------------------------------- void Player::AddVariable(enum VariableType var_type, signed int val)
--- a/Player.h Fri Jun 14 16:06:20 2013 +0600 +++ b/Player.h Fri Jun 14 16:06:30 2013 +0600 @@ -590,6 +590,8 @@ void SalesProcess(unsigned int inventory_idnx, int item_index, int _2devent_idx);//0x4BE2DD bool Recover(signed int a2); bool CanCastSpell(unsigned int uRequiredMana); + void PlaySoundBasedOnCondition(int currPlayerId); + void DrawPlayerBuffAnimBasedOnCondition(int currPlayerId); inline bool Weak() {return pConditions[Condition_Weak] != 0;} inline bool Dead() {return pConditions[Condition_Dead] != 0;} @@ -619,7 +621,6 @@ - __int64 pConditions[20]; unsigned __int64 uExperience; char pName[16];
--- a/PlayerFrameTable.h Fri Jun 14 16:06:20 2013 +0600 +++ b/PlayerFrameTable.h Fri Jun 14 16:06:30 2013 +0600 @@ -1,5 +1,4 @@ #pragma once -#include "Player.h" /* 46 */
--- a/Random.cpp Fri Jun 14 16:06:20 2013 +0600 +++ b/Random.cpp Fri Jun 14 16:06:30 2013 +0600 @@ -1,8 +1,7 @@ #include <math.h> #include "Random.h" - -#include "mm7_data.h" +#include "Math.h" @@ -50,13 +49,11 @@ double v3; // ST04_8@1 int floored_random; // ecx@1 - v1 = this; v2 = GetRandom() * (double)this->range; - v3 = v2 + 6.7553994e15; - floored_random = LODWORD(v3); - if ( SLODWORD(v3) >= v1->range ) - floored_random = v1->range; - return floored_random + v1->min; + floored_random = bankersRounding(v2); + if ( floored_random >= this->range ) + floored_random = this->range; + return floored_random + this->min; } //----- (004BE65D) --------------------------------------------------------
--- a/Render.cpp Fri Jun 14 16:06:20 2013 +0600 +++ b/Render.cpp Fri Jun 14 16:06:30 2013 +0600 @@ -36,6 +36,7 @@ #include "texts.h" #include "mm7_data.h" #include "MM7.h" +#include "Lights.h" #pragma comment(lib, "lib\\legacy_dx\\lib\\ddraw.lib") #pragma comment(lib, "lib\\legacy_dx\\lib\\dxguid.lib")
--- a/Render.h Fri Jun 14 16:06:20 2013 +0600 +++ b/Render.h Fri Jun 14 16:06:30 2013 +0600 @@ -323,7 +323,7 @@ void DrawTerrainPolygon(unsigned int uNumVertices, stru148 *a4, IDirect3DTexture2 *a5, bool transparent, bool clampAtTextureBorders); void DrawSkyPolygon(unsigned int uNumVertices, stru148 *a3, IDirect3DTexture2 *pTexture); void _4A2ED5(signed int a2, stru148 *a3, IDirect3DTexture2 *pHwTex); - void DrawIndoorPolygon(unsigned int uNumVertices, struct BLVFace *a3, IDirect3DTexture2 *pHwTex, Texture *pTex, int uPackedID, unsigned int uColor, int a8); + void DrawIndoorPolygon(unsigned int uNumVertices, struct BLVFace *a3, IDirect3DTexture2 *pHwTex, struct 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 dimming_level, RenderBillboard *pBillboard); @@ -340,20 +340,20 @@ void ResetTextureClipRect(); void DrawTextureRGB(unsigned int uOutX, unsigned int uOutY, RGBTexture *a4); void _4A5D33(unsigned int a2, unsigned int a3, int a4, int a5, RGBTexture *pTexture); - void DrawTextureIndexed(unsigned int uX, unsigned int uY, Texture *a4); - void ZBuffer_Fill_2(signed int a2, signed int a3, Texture *pTexture, int a5); - void DrawMaskToZBuffer(signed int uOutX, unsigned int uOutY, Texture *pTexture, int zVal); - void DrawTextureTransparent(unsigned int uX, unsigned int uY, Texture *pTexture); - void _4A63E6(unsigned int a2, unsigned int a3, Texture *a4, Texture *a5, int a6, int a7, int a8); - void _4A65CC(unsigned int x, unsigned int y, Texture *a4, Texture *a5, int a6, int a7, int a8); - void DrawTransparentRedShade(unsigned int a2, unsigned int a3, Texture *a4); - void DrawTransparentGreenShade(signed int a2, signed int a3, Texture *pTexture); - void _4A6A68(unsigned int a2, unsigned int a3, Texture *a4, __int16 height); + void DrawTextureIndexed(unsigned int uX, unsigned int uY, struct Texture *a4); + void ZBuffer_Fill_2(signed int a2, signed int a3, struct Texture *pTexture, int a5); + void DrawMaskToZBuffer(signed int uOutX, unsigned int uOutY, struct Texture *pTexture, int zVal); + void DrawTextureTransparent(unsigned int uX, unsigned int uY, struct Texture *pTexture); + void _4A63E6(unsigned int a2, unsigned int a3, struct Texture *a4, struct Texture *a5, int a6, int a7, int a8); + void _4A65CC(unsigned int x, unsigned int y, struct Texture *a4, struct Texture *a5, int a6, int a7, int a8); + void DrawTransparentRedShade(unsigned int a2, unsigned int a3, struct Texture *a4); + void DrawTransparentGreenShade(signed int a2, signed int a3, struct Texture *pTexture); + void _4A6A68(unsigned int a2, unsigned int a3, struct Texture *a4, __int16 height); void DrawTextPalette(int x, int y, int a4, int a5, unsigned int uFontHeight, unsigned __int16 *pPalette, int a8); void DrawText(signed int uOutX, signed int uOutY, unsigned __int8 *pFontPixels, unsigned int uCharWidth, unsigned int uCharHeight, unsigned __int16 *pFontPalette, unsigned __int16 uFaceColor, unsigned __int16 uShadowColor); void FillRectFast(unsigned int uX, unsigned int uY, unsigned int uWidth, unsigned int uHeight, unsigned int uColor16); int _4A6DF5(unsigned __int16 *pBitmap, unsigned int uBitmapPitch, struct Vec2_int_ *pBitmapXY, unsigned __int16 *pTarget, unsigned int uTargetPitch, Vec4_int_ *a7); - void _4A6E7E(unsigned int a2, unsigned int a3, Texture *a4); + void _4A6E7E(unsigned int a2, unsigned int a3, struct Texture *a4); char DrawBuildingsD3D(); struct BSPModel *DrawBuildingsSW(); int OnOutdoorRedrawSW();
--- a/SpriteObject.cpp Fri Jun 14 16:06:20 2013 +0600 +++ b/SpriteObject.cpp Fri Jun 14 16:06:30 2013 +0600 @@ -227,7 +227,7 @@ int v33; // eax@62 int v34; // ecx@62 int v35; // eax@63 - Actor *v36; // ecx@67 + int v36; // ecx@67 __int16 v37; // ax@67 int v38; // eax@72 int v39; // eax@72 @@ -250,8 +250,8 @@ int v56; // [sp+94h] [bp-14h]@11 int v57; // [sp+98h] [bp-10h]@1 int v58; // [sp+9Ch] [bp-Ch]@1 - int v59; // [sp+A0h] [bp-8h]@1 - Actor *v60; // [sp+A4h] [bp-4h]@11 + int on_water; // [sp+A0h] [bp-8h]@1 + int v60; // [sp+A4h] [bp-4h]@11 uLayingItemID_ = uLayingItemID; v1 = &pSpriteObjects[uLayingItemID]; @@ -262,20 +262,19 @@ v4 = v1->vPosition.x; v5 = v2->uHeight; v55 = 0; - v6 = ODM_GetFloorLevel(v4, v3, v1->vPosition.z, v5, &v59, &v55, 0); + v6 = ODM_GetFloorLevel(v4, v3, v1->vPosition.z, v5, &on_water, &v55, 0); v7 = v6; v54 = v6; v8 = v6 + 1; if ( v1->vPosition.z <= v6 + 1 ) { - if ( v59 ) + if ( on_water ) { v9 = v6 + 60; if ( v55 ) v9 = v7 + 30; sub_42F960_create_object(v1->vPosition.x, v1->vPosition.y, v9); SpriteObject::OnInteraction(uLayingItemID_); - v7 = v54; } } else @@ -283,7 +282,7 @@ v58 = 1; } v10 = v2->uFlags; - if ( !(v10 & 0x20) ) + if ( !(v2->uFlags & OBJECT_DESC_NO_GRAVITY) ) { if ( v58 ) { @@ -298,11 +297,11 @@ 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); + v60 = ((unsigned __int64)(v56 * (signed __int64)v51.x) >> 16); v1->vVelocity.x += (unsigned int)(v56 * v51.x) >> 16; - v60 = (Actor *)((unsigned __int64)(v56 * (signed __int64)v51.y) >> 16); + v60 = ((unsigned __int64)(v56 * (signed __int64)v51.y) >> 16); v1->vVelocity.y += (unsigned int)(v56 * v51.y) >> 16; - v60 = (Actor *)((unsigned __int64)(v56 * (signed __int64)v51.z) >> 16); + v60 = ((unsigned __int64)(v56 * (signed __int64)v51.z) >> 16); v1->vVelocity.z += (unsigned int)(v56 * v51.z) >> 16; LABEL_12: v7 = v54; @@ -316,75 +315,64 @@ return; } v1->vPosition.z = v8; - if ( !(v2->uFlags & 0x80) || (v21 = -v1->vVelocity.z >> 1, v1->vVelocity.z = v21, (signed __int16)v21 < 10) ) + if ( !(v2->uFlags & OBJECT_DESC_BOUNCE) || (v21 = -v1->vVelocity.z >> 1, v1->vVelocity.z = v21, (signed __int16)v21 < 10) ) v1->vVelocity.z = 0; - v60 = (Actor *)v1->vVelocity.x; - v55 = 58500; - v60 = (Actor *)((unsigned __int64)(58500i64 * (signed int)v60) >> 16); - v1->vVelocity.x = (signed __int16)v60; - v60 = (Actor *)v1->vVelocity.y; - v60 = (Actor *)((unsigned __int64)(v55 * (signed __int64)(signed int)v60) >> 16); - v55 = 58500; - v1->vVelocity.y = (signed __int16)v60; - v60 = (Actor *)v1->vVelocity.z; - v60 = (Actor *)((unsigned __int64)(v55 * (signed __int64)(signed int)v60) >> 16); - v22 = v1->vVelocity.x; - v1->vVelocity.z = (signed __int16)v60; - if ( v1->vVelocity.y * v1->vVelocity.y + v22 * v22 >= 400 ) - goto LABEL_12; + + v1->vVelocity.x = (signed __int16)((unsigned __int64)(58500i64 * (signed __int64)(signed int)v1->vVelocity.x) >> 16); + v1->vVelocity.y = (signed __int16)((unsigned __int64)(58500i64 * (signed __int64)(signed int)v1->vVelocity.y) >> 16); + v1->vVelocity.z = (signed __int16)((unsigned __int64)(58500i64 * (signed __int64)(signed int)v1->vVelocity.z) >> 16); + + if ( (v1->vVelocity.y * v1->vVelocity.y + v1->vVelocity.x * v1->vVelocity.x) < 400 ) + { + v1->vVelocity.y = 0; v1->vVelocity.x = 0; - if ( !(HIBYTE(v2->uFlags) & 1) ) - return; memset(&Dst, 0, 0x68u); - v23 = v2->uFlags; Dst.x = (double)v1->vPosition.x; Dst.y = (double)v1->vPosition.y; Dst.z = (double)v1->vPosition.z; Dst.flt_10 = 0.0; Dst.flt_14 = 0.0; Dst.flt_18 = 0.0; - if ( HIBYTE(v23) & 2 ) + if (v2->uFlags & OBJECT_DESC_TRIAL_FIRE ) { Dst.type = ParticleType_Bitmap | ParticleType_Rotating | ParticleType_8; Dst.uDiffuse = 0xFF3C1E; - v24 = rand(); - v48 = (TEXTURE_TYPE)0; -LABEL_83: - v47 = "effpar01"; + Dst.timeToLive = (unsigned __int8)(rand() & 0x80) + 128; + Dst.uTextureID = pBitmaps_LOD->LoadTexture("effpar01", TEXTURE_DEFAULT); + Dst.flt_28 = 1.0; + pGame->pParticleEngine->AddParticle(&Dst); } - else + else if ( v2->uFlags & OBJECT_DESC_TRIAL_LINE) { - if ( HIBYTE(v23) & 4 ) - { + Dst.type = ParticleType_Line; Dst.uDiffuse = rand(); Dst.timeToLive = 64; Dst.uTextureID = 0; -LABEL_89: Dst.flt_28 = 1.0; pGame->pParticleEngine->AddParticle(&Dst); - return; } + else if ( v2->uFlags & OBJECT_DESC_TRIAL_PARTICLE ) + { Dst.type = ParticleType_Bitmap | ParticleType_8; Dst.uDiffuse = rand(); - v24 = rand(); - v48 = (TEXTURE_TYPE)0; -LABEL_87: - v47 = "effpar03"; + Dst.timeToLive = (unsigned __int8)(rand() & 0x80) + 128; + Dst.uTextureID = pBitmaps_LOD->LoadTexture("effpar03", TEXTURE_DEFAULT); + Dst.flt_28 = 1.0; + pGame->pParticleEngine->AddParticle(&Dst); } - Dst.timeToLive = (unsigned __int8)(v24 & 0x80) + 128; - Dst.uTextureID = pBitmaps_LOD->LoadTexture(v47, v48); - goto LABEL_89; + return; + } } LABEL_13: if ( v1->vPosition.z > v7 - && (v13 = v1->vPosition.x, v13 >= -32768) - && v13 <= 32768 - && (v14 = v1->vPosition.y, v14 >= -32768) - && v14 <= 32768 + && (v13 = v1->vPosition.x, v13 >= -0x8000) + && v13 <= 0x8000 + && (v14 = v1->vPosition.y, v14 >= -0x8000) + && v14 <= 0x8000 && v1->vPosition.z <= 13000 - || !(v2->uFlags & 0x40) ) + || !(v2->uFlags & OBJECT_DESC_INTERACTABLE) ) goto LABEL_92; if ( v1->vPosition.z < v7 ) v1->vPosition.z = v8; @@ -414,34 +402,23 @@ return; _46E889_collide_against_bmodels(0); v16 = WorldPosToGridCellZ(v1->vPosition.y); - v17 = v1->vPosition.x; - v58 = v16; - v18 = WorldPosToGridCellX(v17); - _46E26D_collide_against_sprites(v18, v58); + v18 = WorldPosToGridCellX(v1->vPosition.x); + _46E26D_collide_against_sprites(v18, v16); if (PID_TYPE(v1->spell_caster_pid) != OBJECT_Player) _46EF01_collision_chech_player(0); if (PID_TYPE(v1->spell_caster_pid) == OBJECT_Actor) { v19 = PID_ID(v1->spell_caster_pid); - if ( v19 >= 0 ) + if (( v19 >= 0 )&&( v19 < (signed int)(uNumActors - 1) )) { - if ( v19 < (signed int)(uNumActors - 1) ) - { - v56 = 0; - if ( (signed int)uNumActors > 0 ) - { - v60 = pActors.data(); - v20 = &pActors[v19]; - do + + v20 = &pActors[v19]; + for (v56 =0; v56 < uNumActors; ++v56) { - if ( v20->GetActorsRelation(v60) ) + if ( v20->GetActorsRelation(&pActors[v56]) ) _46DF1A_collide_against_actor(v56, 0); - ++v56; - ++v60; + } - while ( v56 < (signed int)uNumActors ); - } - } } } else @@ -458,7 +435,7 @@ &v49, &v50, 0); - if ( v59 && v26 < v27 + 60 ) + if ( on_water && v26 < v27 + 60 ) { if ( v50 ) v44 = v27 + 30; @@ -474,50 +451,55 @@ v1->vPosition.y = stru_721530.normal2.y; v1->vPosition.z = stru_721530.normal2.z - stru_721530.prolly_normal_d - 1; v1->uSectorID = LOWORD(stru_721530.uSectorID); - if ( !(HIBYTE(v2->uFlags) & 1) ) - return; memset(&Dst, 0, 0x68u); - v45 = v2->uFlags; Dst.x = (double)v1->vPosition.x; Dst.y = (double)v1->vPosition.y; Dst.z = (double)v1->vPosition.z; Dst.flt_10 = 0.0; Dst.flt_14 = 0.0; Dst.flt_18 = 0.0; - if ( HIBYTE(v45) & 2 ) + if ( v2->uFlags & OBJECT_DESC_TRIAL_FIRE ) { Dst.type = ParticleType_Bitmap | ParticleType_Rotating | ParticleType_8; Dst.uDiffuse = 0xFF3C1E; - v24 = rand(); - v48 = (TEXTURE_TYPE)0; - goto LABEL_83; + Dst.timeToLive = (unsigned __int8)( rand() & 0x80) + 128; + Dst.uTextureID = pBitmaps_LOD->LoadTexture("effpar01", TEXTURE_DEFAULT); + Dst.flt_28 = 1.0; + pGame->pParticleEngine->AddParticle(&Dst); + return; } - if ( HIBYTE(v45) & 4 ) + else if ( v2->uFlags & OBJECT_DESC_TRIAL_LINE ) { Dst.type = ParticleType_Line; - v46 = rand(); Dst.uTextureID = 0; - Dst.uDiffuse = v46; + Dst.uDiffuse = rand(); Dst.timeToLive = 64; - goto LABEL_89; + Dst.flt_28 = 1.0; + pGame->pParticleEngine->AddParticle(&Dst); + return; } - Dst.type = ParticleType_Bitmap | ParticleType_8; - Dst.uDiffuse = rand(); - v24 = rand(); - v48 = (TEXTURE_TYPE)0; - goto LABEL_87; + else if ( v2->uFlags & OBJECT_DESC_TRIAL_PARTICLE) + { + Dst.type = ParticleType_Bitmap | ParticleType_8; + Dst.uDiffuse = rand(); + Dst.timeToLive = (unsigned __int8)(rand() & 0x80) + 128; + Dst.uTextureID = pBitmaps_LOD->LoadTexture("effpar03", TEXTURE_DEFAULT); + Dst.flt_28 = 1.0; + pGame->pParticleEngine->AddParticle(&Dst); + } + return; } - v60 = (Actor *)((unsigned __int64)(stru_721530.field_7C * (signed __int64)stru_721530.field_58.x) >> 16); + v60 = ((unsigned __int64)(stru_721530.field_7C * (signed __int64)stru_721530.field_58.x) >> 16); v1->vPosition.x += (unsigned __int64)(stru_721530.field_7C * (signed __int64)stru_721530.field_58.x) >> 16; - v60 = (Actor *)((unsigned __int64)(stru_721530.field_7C * (signed __int64)stru_721530.field_58.y) >> 16); + v60 = ((unsigned __int64)(stru_721530.field_7C * (signed __int64)stru_721530.field_58.y) >> 16); v1->vPosition.y += (unsigned __int64)(stru_721530.field_7C * (signed __int64)stru_721530.field_58.y) >> 16; - v60 = (Actor *)((unsigned __int64)(stru_721530.field_7C * (signed __int64)stru_721530.field_58.z) >> 16); + v60 = ((unsigned __int64)(stru_721530.field_7C * (signed __int64)stru_721530.field_58.z) >> 16); v28 = LOWORD(stru_721530.uSectorID); v1->vPosition.z += (unsigned __int64)(stru_721530.field_7C * (signed __int64)stru_721530.field_58.z) >> 16; v29 = v1->vPosition.z; v1->uSectorID = v28; stru_721530.field_70 += stru_721530.field_7C; - if ( v2->uFlags & 0x40 ) + if ( v2->uFlags & OBJECT_DESC_INTERACTABLE ) { if ( v29 < v54 ) v1->vPosition.z = v54 + 1; @@ -541,8 +523,8 @@ v57 = (unsigned __int64)(v56 * (signed __int64)v57) >> 16; v58 = v32->pFacePlane.vNormal.y; v58 = (unsigned __int64)(v56 * (signed __int64)v58) >> 16; - v60 = (Actor *)v32->pFacePlane.vNormal.z; - v60 = (Actor *)((unsigned __int64)(v56 * (signed __int64)(signed int)v60) >> 16); + v60 = v32->pFacePlane.vNormal.z; + v60 = ((unsigned __int64)(v56 * (signed __int64)(signed int)v60) >> 16); v1->vVelocity.x += 2 * v57; v1->vVelocity.y += 2 * v58; if ( v32->pFacePlane.vNormal.z <= 32000 ) @@ -552,10 +534,9 @@ else { v36 = v60; - v57 = 32000; v1->vVelocity.z += (signed __int16)v60; - v58 = (unsigned __int64)(v57 * (signed __int64)(signed int)v36) >> 16; - v37 = (unsigned int)(v57 * (int)v36) >> 16; + v58 = (unsigned __int64)(32000 * (signed __int64)(signed int)v36) >> 16; + v37 = (unsigned int)(32000 * v36) >> 16; } v1->vVelocity.z += v37; LABEL_70: @@ -574,21 +555,14 @@ goto LABEL_73; } LABEL_74: - v58 = v1->vVelocity.x; - v57 = 58500; - v58 = (unsigned __int64)(58500i64 * v58) >> 16; - v1->vVelocity.x = v58; - v58 = v1->vVelocity.y; - v58 = (unsigned __int64)(v57 * (signed __int64)v58) >> 16; - v57 = 58500; - v1->vVelocity.y = v58; - v58 = v1->vVelocity.z; - v58 = (unsigned __int64)(v57 * (signed __int64)v58) >> 16; + v1->vVelocity.x = (signed __int16)((unsigned __int64)(58500i64 * (signed __int64)(signed int)v1->vVelocity.x) >> 16); + v1->vVelocity.y = (signed __int16)((unsigned __int64)(58500i64 * (signed __int64)(signed int)v1->vVelocity.y) >> 16); + v1->vVelocity.z = (signed __int16)((unsigned __int64)(58500i64 * (signed __int64)(signed int)v1->vVelocity.z) >> 16); + ++v55; - v43 = __OFSUB__(v55, 100); - v42 = v55 - 100 < 0; - v1->vVelocity.z = v58; - if ( !(v42 ^ v43) ) + //v43 = __OFSUB__(v55, 100); + // v42 = v55 - 100 < 0; + if (v55>=100 )//!(v42 ^ v43) return; } v57 = integer_sqrt(v1->vVelocity.y * v1->vVelocity.y + v1->vVelocity.x * v1->vVelocity.x); @@ -597,12 +571,12 @@ v1->vPosition.y - pLevelDecorations[v30].vPosition.y); v56 = v38; v39 = stru_5C6E00->Cos(v38); - v60 = (Actor *)v39; + // v60 = v39; v40 = v39 * (signed __int64)v57; v58 = v40 >> 16; v1->vVelocity.x = WORD1(v40); v41 = stru_5C6E00->Sin(v56 - stru_5C6E00->uIntegerHalfPi); - v60 = (Actor *)v41; + // v60 = v41; v35 = (unsigned __int64)(v41 * (signed __int64)v57) >> 16; v58 = v35; LABEL_73:
--- a/SpriteObject.h Fri Jun 14 16:06:20 2013 +0600 +++ b/SpriteObject.h Fri Jun 14 16:06:30 2013 +0600 @@ -1,5 +1,4 @@ #pragma once -#include "VectorTypes.h" #include "Items.h" enum
--- a/Texture.cpp Fri Jun 14 16:06:20 2013 +0600 +++ b/Texture.cpp Fri Jun 14 16:06:30 2013 +0600 @@ -192,6 +192,8 @@ unsigned int uTextureID_BACKDOLL; // weak unsigned int uTextureID_BACKHAND; // weak +stru355 stru_4E82A4 = {0x20, 0x41, 0, 0x20, 0xFF0000, 0xFF00, 0xFF, 0xFF000000}; +stru355 stru_4EFCBC = {0x20, 0x41, 0, 0x10, 0x7C00, 0x3E0, 0x1F, 0x8000}; Texture pTex_F7CE30;
--- a/Texture.h Fri Jun 14 16:06:20 2013 +0600 +++ b/Texture.h Fri Jun 14 16:06:30 2013 +0600 @@ -125,51 +125,49 @@ - - extern std::array<struct RGBTexture, 45> pSavegameThumbnails; -extern std::array<Texture *, 2> pTexture_LloydBeacons; -extern Texture *pTexture_50635C; -extern Texture *pTexture_506368; -extern Texture *pTexture_50636C; -extern Texture *pTexture_506370; -extern Texture *pTexture_506374; -extern Texture *pTexture_506378; -extern Texture *pTexture_50637C; -extern Texture *pTexture_506380; -extern Texture *pTexture_506384; -extern Texture *pTexture_506388; -extern Texture *pTexture_50638C; -extern Texture *pTexture_506390; -extern Texture *pTexture_506394; -extern Texture *pTex_tab_an_7a__zoot_off; -extern Texture *pTex_tab_an_6a__zoom_off; -extern Texture *pTex_tab_an_7b__zoot_on; -extern Texture *pTex_tab_an_6b__zoom_on; -extern std::array<Texture *, 6> pTexture_TownPortalIcons; // [0]Harmonale, [1]Pierpont, [2]Nighon, [3]Evenmorn Island, [4]Celestia, [5]The Pit +extern std::array<struct Texture *, 2> pTexture_LloydBeacons; +extern struct Texture *pTexture_50635C; +extern struct Texture *pTexture_506368; +extern struct Texture *pTexture_50636C; +extern struct Texture *pTexture_506370; +extern struct Texture *pTexture_506374; +extern struct Texture *pTexture_506378; +extern struct Texture *pTexture_50637C; +extern struct Texture *pTexture_506380; +extern struct Texture *pTexture_506384; +extern struct Texture *pTexture_506388; +extern struct Texture *pTexture_50638C; +extern struct Texture *pTexture_506390; +extern struct Texture *pTexture_506394; +extern struct Texture *pTex_tab_an_7a__zoot_off; +extern struct Texture *pTex_tab_an_6a__zoom_off; +extern struct Texture *pTex_tab_an_7b__zoot_on; +extern struct Texture *pTex_tab_an_6b__zoom_on; +extern std::array<struct Texture *, 6> pTexture_TownPortalIcons; // [0]Harmonale, [1]Pierpont, [2]Nighon, [3]Evenmorn Island, [4]Celestia, [5]The Pit -extern std::array<Texture *, 12> dword_5063D8; -extern std::array<Texture *, 12> dword_506408; -extern Texture *pTexture_50643C; // idb -extern Texture *ptr_506440; -extern Texture *pTexture_506444; -extern Texture *pTexture_506448; // idb -extern std::array<std::array<Texture *, 2>, 9> pTextures_tabs; -extern Texture *pTexture_mapbordr; // idb -extern Texture *pTexture_pagemask; // idb -extern std::array<Texture *, 9> pSpellBookPagesTextr; -extern Texture *pSpellBookPagesTextr_9; -extern Texture *pSpellBookPagesTextr_10; -extern Texture *pSpellBookPagesTextr_11; -extern Texture *pSpellBookPagesTextr_12; -extern Texture *pSpellBookPagesTextr_13; -extern Texture *pTexture_AutonotesBook; -extern Texture *pTexture_CurrentBook; -extern Texture *pTex_moon_new; -extern Texture *pTex_moon_4; -extern Texture *pTex_moon_2; -extern Texture *pTex_moon_2_2; -extern Texture *pTex_moon_ful; +extern std::array<struct Texture *, 12> dword_5063D8; +extern std::array<struct Texture *, 12> dword_506408; +extern struct Texture *pTexture_50643C; // idb +extern struct Texture *ptr_506440; +extern struct Texture *pTexture_506444; +extern struct Texture *pTexture_506448; // idb +extern std::array<std::array<struct Texture *, 2>, 9> pTextures_tabs; +extern struct Texture *pTexture_mapbordr; // idb +extern struct Texture *pTexture_pagemask; // idb +extern std::array<struct Texture *, 9> pSpellBookPagesTextr; +extern struct Texture *pSpellBookPagesTextr_9; +extern struct Texture *pSpellBookPagesTextr_10; +extern struct Texture *pSpellBookPagesTextr_11; +extern struct Texture *pSpellBookPagesTextr_12; +extern struct Texture *pSpellBookPagesTextr_13; +extern struct Texture *pTexture_AutonotesBook; +extern struct Texture *pTexture_CurrentBook; +extern struct Texture *pTex_moon_new; +extern struct Texture *pTex_moon_4; +extern struct Texture *pTex_moon_2; +extern struct Texture *pTex_moon_2_2; +extern struct Texture *pTex_moon_ful; @@ -211,16 +209,16 @@ extern unsigned int uTextureID_BUTTMAKE; extern unsigned int uTextureID_BUTTYES2; extern unsigned int uTextureID_x_ok_u; -extern std::array<Texture *, 22> pPlayerPortraits; -extern std::array<Texture *, 9> pTexture_IC_KNIGHT; -extern Texture *pTexture_MAKESKY; -extern Texture *pTexture_MAKETOP; -extern std::array<Texture *, 20> pTextures_arrowr; -extern std::array<Texture *, 20> pTextures_arrowl; -extern Texture *pTexture_presleft; -extern Texture *pTexture_pressrigh; -extern Texture *pTexture_buttminu; -extern Texture *pTexture_buttplus; +extern std::array<struct Texture *, 22> pPlayerPortraits; +extern std::array<struct Texture *, 9> pTexture_IC_KNIGHT; +extern struct Texture *pTexture_MAKESKY; +extern struct Texture *pTexture_MAKETOP; +extern std::array<struct Texture *, 20> pTextures_arrowr; +extern std::array<struct Texture *, 20> pTextures_arrowl; +extern struct Texture *pTexture_presleft; +extern struct Texture *pTexture_pressrigh; +extern struct Texture *pTexture_buttminu; +extern struct Texture *pTexture_buttplus; extern unsigned int uTextureID_Quit1; extern unsigned int uTextureID_Resume1; extern unsigned int uTextureID_Controls1; @@ -269,9 +267,9 @@ extern unsigned int uTextureID_right_panel_loop; // weak -extern Texture *pTexture_Leather; -extern Texture *pTexture_RestUI_CurrentSkyFrame; // idb -extern Texture *pTexture_RestUI_CurrentHourglassFrame; // idb +extern struct Texture *pTexture_Leather; +extern struct Texture *pTexture_RestUI_CurrentSkyFrame; // idb +extern struct Texture *pTexture_RestUI_CurrentHourglassFrame; // idb extern std::array<unsigned int, 5> uTextureID_Optkb; @@ -315,12 +313,13 @@ extern unsigned int uTextureID_BACKHAND; // weak -extern Texture pTex_F7CE30; +extern struct Texture pTex_F7CE30; extern RGBTexture stru_5773C4; // idb - +extern struct stru355 stru_4E82A4;// = {0x20, 0x41, 0, 0x20, 0xFF0000, 0xFF00, 0xFF, 0xFF000000}; moved to texture.h +extern struct stru355 stru_4EFCBC;// = {0x20, 0x41, 0, 0x10, 0x7C00, 0x3E0, 0x1F, 0x8000}; moved to texture.h @@ -347,15 +346,15 @@ struct stru350 { stru350 *_450DDE(); - bool _450DF1(const stru355 *p1, const stru355 *p2); + bool _450DF1(const struct stru355 *p1, const struct stru355 *p2); unsigned int _450F55(int a2); int _450FB1(int a2); int sub_451007_scale_image_bicubic(unsigned short *pSrc, int srcWidth, int srcHeight, int srcPitch, unsigned short *pDst, int dstWidth, int dstHeight, int dstPitch, int a9, int a10); - stru355 field_0; - stru355 field_20; + struct stru355 field_0; + struct stru355 field_20; int field_40; int field_44; int field_48;
--- a/Time.cpp Fri Jun 14 16:06:20 2013 +0600 +++ b/Time.cpp Fri Jun 14 16:06:30 2013 +0600 @@ -1,10 +1,9 @@ -#include "OSAPI.h" #include "Time.h" #include "Keyboard.h" #include "Log.h" -#include "mm7_data.h" +#include "OSAPI.h"
--- a/UICharacter.cpp Fri Jun 14 16:06:20 2013 +0600 +++ b/UICharacter.cpp Fri Jun 14 16:06:30 2013 +0600 @@ -15,7 +15,7 @@ #include "GUIProgressBar.h" #include "Party.h" #include "AudioPlayer.h" -#include "Outdoor.h" +#include "Render.h" #include "IndoorCamera.h" #include "LOD.h" #include "Viewport.h"
--- a/UIHouses.cpp Fri Jun 14 16:06:20 2013 +0600 +++ b/UIHouses.cpp Fri Jun 14 16:06:30 2013 +0600 @@ -2,9 +2,10 @@ #define _CRT_SECURE_NO_WARNINGS #endif +#include "Texture.h" +#include "mm7_data.h" #include "UIHouses.h" #include "Party.h" -#include "Player.h" #include "texts.h" #include "Events.h" #include "Arcomage.h" @@ -14,20 +15,15 @@ #include "GUIFont.h" #include "Events2D.h" #include "Overlays.h" -#include "Render.h" -#include "Indoor.h" #include "Outdoor.h" #include "AudioPlayer.h" #include "VideoPlayer.h" #include "Monsters.h" #include "Viewport.h" #include "Keyboard.h" -#include "NPC.h" #include "IndoorCamera.h" #include "MapInfo.h" #include "Log.h" -#include "MM7.h" -#include "mm7_data.h" #include "Game.h" #include "stru159.h"
--- a/UIMainMenu.cpp Fri Jun 14 16:06:20 2013 +0600 +++ b/UIMainMenu.cpp Fri Jun 14 16:06:30 2013 +0600 @@ -4,48 +4,18 @@ #include <assert.h> -#include "MM7.h" #include "Mouse.h" #include "Keyboard.h" -#include "MapInfo.h" -#include "Game.h" #include "GUIWindow.h" #include "GUIFont.h" -#include "GUIProgressBar.h" -#include "Party.h" #include "AudioPlayer.h" -#include "Outdoor.h" -#include "IndoorCamera.h" -#include "Overlays.h" -#include "Monsters.h" -#include "Arcomage.h" +#include "Render.h" #include "LOD.h" -#include "Actor.h" #include "Allocator.h" -#include "Events.h" -#include "Viewport.h" -#include "FrameTableInc.h" -#include "Math.h" -#include "SpriteObject.h" -#include "ObjectList.h" -#include "Chest.h" #include "PaletteManager.h" -#include "DecorationList.h" -#include "SaveLoad.h" -#include "stru123.h" -#include "Time.h" #include "IconFrameTable.h" -#include "Awards.h" -#include "Autonotes.h" -#include "stru160.h" -#include "TurnEngine.h" -#include "CastSpellInfo.h" -#include "Weather.h" -#include "stru298.h" -#include "StorylineTextTable.h" -#include "Events2D.h" #include "texts.h" #include "mm7_data.h"
--- a/UIOptions.cpp Fri Jun 14 16:06:20 2013 +0600 +++ b/UIOptions.cpp Fri Jun 14 16:06:30 2013 +0600 @@ -6,46 +6,13 @@ #include "IndoorCameraD3D.h" #include "CShow.h" #include "GammaControl.h" -#include "stru6.h" -#include "stru9.h" +#include "Render.h" -#include "MapInfo.h" #include "Game.h" #include "GUIWindow.h" #include "GUIFont.h" -#include "GUIProgressBar.h" -#include "Party.h" #include "AudioPlayer.h" -#include "Outdoor.h" -#include "IndoorCamera.h" -#include "Overlays.h" -#include "Monsters.h" -#include "Arcomage.h" #include "LOD.h" -#include "Actor.h" -#include "Allocator.h" -#include "Events.h" -#include "Viewport.h" -#include "FrameTableInc.h" -#include "Math.h" -#include "SpriteObject.h" -#include "ObjectList.h" -#include "Chest.h" -#include "PaletteManager.h" -#include "DecorationList.h" -#include "SaveLoad.h" -#include "stru123.h" -#include "Time.h" -#include "IconFrameTable.h" -#include "Awards.h" -#include "Autonotes.h" -#include "stru160.h" -#include "TurnEngine.h" -#include "CastSpellInfo.h" -#include "Weather.h" -#include "stru298.h" -#include "StorylineTextTable.h" -#include "Events2D.h" #include "texts.h" #include "mm7_data.h"
--- a/UIPartyCreation.cpp Fri Jun 14 16:06:20 2013 +0600 +++ b/UIPartyCreation.cpp Fri Jun 14 16:06:30 2013 +0600 @@ -4,59 +4,20 @@ #include <assert.h> -#include "MM7.h" -#include "LightmapBuilder.h" -#include "DecalBuilder.h" -#include "ParticleEngine.h" #include "Mouse.h" #include "Keyboard.h" -#include "IndoorCameraD3D.h" -#include "CShow.h" -#include "GammaControl.h" -#include "stru6.h" -#include "stru9.h" -#include "stru10.h" -#include "stru11.h" -#include "stru12.h" -#include "MapInfo.h" #include "Game.h" #include "GUIWindow.h" #include "GUIFont.h" -#include "GUIProgressBar.h" #include "Party.h" #include "AudioPlayer.h" -#include "Outdoor.h" -#include "IndoorCamera.h" -#include "Overlays.h" -#include "Monsters.h" -#include "Arcomage.h" +#include "Render.h" #include "LOD.h" -#include "Actor.h" #include "Allocator.h" -#include "Events.h" -#include "Viewport.h" -#include "FrameTableInc.h" -#include "Math.h" -#include "SpriteObject.h" -#include "ObjectList.h" -#include "Chest.h" -#include "PaletteManager.h" -#include "DecorationList.h" -#include "SaveLoad.h" -#include "stru123.h" #include "Time.h" #include "IconFrameTable.h" -#include "Awards.h" -#include "Autonotes.h" -#include "stru160.h" -#include "TurnEngine.h" -#include "CastSpellInfo.h" -#include "Weather.h" -#include "stru298.h" -#include "StorylineTextTable.h" -#include "Events2D.h" #include "texts.h" #include "mm7_data.h"
--- a/UIPopup.cpp Fri Jun 14 16:06:20 2013 +0600 +++ b/UIPopup.cpp Fri Jun 14 16:06:30 2013 +0600 @@ -10,43 +10,19 @@ #include "Sprites.h" #include "Vis.h" -#include "MapInfo.h" #include "Game.h" #include "GUIWindow.h" #include "GUIFont.h" -#include "GUIProgressBar.h" #include "Party.h" #include "AudioPlayer.h" -#include "Outdoor.h" -#include "IndoorCamera.h" -#include "Overlays.h" -#include "Monsters.h" -#include "Arcomage.h" #include "LOD.h" #include "Actor.h" -#include "Allocator.h" -#include "Events.h" #include "Viewport.h" -#include "FrameTableInc.h" -#include "Math.h" #include "SpriteObject.h" #include "ObjectList.h" #include "Chest.h" #include "PaletteManager.h" -#include "DecorationList.h" -#include "SaveLoad.h" -#include "stru123.h" #include "Time.h" -#include "IconFrameTable.h" -#include "Awards.h" -#include "Autonotes.h" -#include "stru160.h" -#include "TurnEngine.h" -#include "CastSpellInfo.h" -#include "Weather.h" -#include "stru298.h" -#include "StorylineTextTable.h" -#include "Events2D.h" #include "texts.h" #include "mm7_data.h"
--- a/UIRest.cpp Fri Jun 14 16:06:20 2013 +0600 +++ b/UIRest.cpp Fri Jun 14 16:06:30 2013 +0600 @@ -4,46 +4,15 @@ #include <assert.h> -#include "MM7.h" -#include "MapInfo.h" -#include "Game.h" -#include "Player.h" #include "GUIWindow.h" #include "GUIFont.h" -#include "GUIProgressBar.h" #include "Party.h" #include "AudioPlayer.h" #include "Outdoor.h" -#include "IndoorCamera.h" -#include "Overlays.h" -#include "Monsters.h" -#include "Arcomage.h" #include "LOD.h" -#include "Actor.h" -#include "Allocator.h" -#include "Events.h" #include "Viewport.h" -#include "FrameTableInc.h" -#include "Math.h" -#include "SpriteObject.h" -#include "ObjectList.h" -#include "Chest.h" -#include "PaletteManager.h" -#include "DecorationList.h" -#include "SaveLoad.h" -#include "stru123.h" #include "Time.h" -#include "IconFrameTable.h" -#include "Awards.h" -#include "Autonotes.h" -#include "stru160.h" -#include "TurnEngine.h" -#include "CastSpellInfo.h" -#include "Weather.h" -#include "stru298.h" -#include "StorylineTextTable.h" -#include "Events2D.h" #include "texts.h" #include "mm7_data.h"
--- a/UISaveLoad.cpp Fri Jun 14 16:06:20 2013 +0600 +++ b/UISaveLoad.cpp Fri Jun 14 16:06:30 2013 +0600 @@ -6,46 +6,16 @@ #include <io.h> #include "MM7.h" -#include "Mouse.h" #include "Keyboard.h" #include "MapInfo.h" -#include "Game.h" #include "GUIWindow.h" #include "GUIFont.h" -#include "GUIProgressBar.h" -#include "Party.h" -#include "AudioPlayer.h" -#include "Outdoor.h" +#include "Render.h" #include "IndoorCamera.h" -#include "Overlays.h" -#include "Monsters.h" -#include "Arcomage.h" #include "LOD.h" -#include "Actor.h" #include "Allocator.h" -#include "Events.h" -#include "Viewport.h" -#include "FrameTableInc.h" -#include "Math.h" -#include "SpriteObject.h" -#include "ObjectList.h" -#include "Chest.h" -#include "PaletteManager.h" -#include "DecorationList.h" #include "SaveLoad.h" -#include "stru123.h" -#include "Time.h" -#include "IconFrameTable.h" -#include "Awards.h" -#include "Autonotes.h" -#include "stru160.h" -#include "TurnEngine.h" -#include "CastSpellInfo.h" -#include "Weather.h" -#include "stru298.h" -#include "StorylineTextTable.h" -#include "Events2D.h" #include "texts.h" #include "mm7_data.h"
--- a/UITransition.cpp Fri Jun 14 16:06:20 2013 +0600 +++ b/UITransition.cpp Fri Jun 14 16:06:30 2013 +0600 @@ -5,52 +5,22 @@ #include <assert.h> #include <io.h> -#include "Mouse.h" -#include "Keyboard.h" +#include "mm7_data.h" #include "VideoPlayer.h" #include "MapInfo.h" -#include "Game.h" #include "GUIWindow.h" #include "GUIFont.h" #include "GUIProgressBar.h" #include "Party.h" #include "AudioPlayer.h" #include "Outdoor.h" -#include "IndoorCamera.h" -#include "Overlays.h" -#include "Monsters.h" -#include "Arcomage.h" #include "LOD.h" -#include "Actor.h" -#include "Allocator.h" -#include "Events.h" -#include "Viewport.h" -#include "FrameTableInc.h" -#include "Math.h" -#include "SpriteObject.h" -#include "ObjectList.h" -#include "Chest.h" -#include "PaletteManager.h" -#include "DecorationList.h" -#include "SaveLoad.h" -#include "stru123.h" #include "Time.h" -#include "IconFrameTable.h" -#include "Awards.h" -#include "Autonotes.h" #include "stru159.h" -#include "stru160.h" -#include "TurnEngine.h" -#include "CastSpellInfo.h" -#include "Weather.h" -#include "stru298.h" -#include "StorylineTextTable.h" #include "Events2D.h" #include "texts.h" #include "UIHouses.h" -#include "mm7_data.h" -
--- a/UiGame.cpp Fri Jun 14 16:06:20 2013 +0600 +++ b/UiGame.cpp Fri Jun 14 16:06:30 2013 +0600 @@ -4,66 +4,36 @@ #include <assert.h> +#include "Texture.h" #include "MM7.h" -#include "BSPModel.h" -#include "LightmapBuilder.h" -#include "DecalBuilder.h" -#include "ParticleEngine.h" #include "Mouse.h" #include "Keyboard.h" -#include "IndoorCameraD3D.h" -#include "CShow.h" -#include "GammaControl.h" -#include "stru6.h" -#include "stru9.h" -#include "stru10.h" -#include "stru11.h" -#include "stru12.h" +#include "mm7_data.h" #include "Vis.h" #include "MapInfo.h" #include "Game.h" #include "GUIWindow.h" #include "GUIFont.h" -#include "GUIProgressBar.h" #include "Party.h" #include "AudioPlayer.h" #include "Outdoor.h" -#include "IndoorCamera.h" -#include "Overlays.h" -#include "Monsters.h" -#include "Arcomage.h" #include "LOD.h" #include "Actor.h" -#include "Allocator.h" -#include "Events.h" #include "Viewport.h" -#include "FrameTableInc.h" -#include "Math.h" #include "SpriteObject.h" #include "ObjectList.h" -#include "Chest.h" -#include "PaletteManager.h" #include "DecorationList.h" #include "PlayerFrameTable.h" -#include "SaveLoad.h" #include "stru123.h" #include "Time.h" #include "IconFrameTable.h" -#include "Awards.h" -#include "Autonotes.h" -#include "stru160.h" #include "TurnEngine.h" -#include "CastSpellInfo.h" -#include "Weather.h" -#include "stru298.h" -#include "StorylineTextTable.h" -#include "Events2D.h" #include "texts.h" #include "UIHouses.h" +#include "BSPModel.h" -#include "mm7_data.h"
--- a/VideoPlayer.cpp Fri Jun 14 16:06:20 2013 +0600 +++ b/VideoPlayer.cpp Fri Jun 14 16:06:30 2013 +0600 @@ -2,10 +2,10 @@ #define _CRT_SECURE_NO_WARNINGS #endif -#include "OSAPI.h" #include "Bink_Smacker.h" +#include "mm7_data.h" #include "CShow.h" #include "Mouse.h" @@ -19,10 +19,8 @@ #include "Allocator.h" #include "Time.h" #include "Log.h" +#include "texts.h" #include "UIHouses.h" -#include "texts.h" -#include "MM7.h" -#include "mm7_data.h" VideoPlayer *pVideoPlayer = nullptr; @@ -1173,4 +1171,17 @@ bStopBeforeSchedule = 0; pResetflag = 0; pGame->pCShow->PlayMovie(MOVIE_Death, 1); -} \ No newline at end of file +} + +//----- (004BE6F5) -------------------------------------------------------- +VideoPlayer::VideoPlayer() : + field_54(0), + pBinkMovie(nullptr), pBinkBuffer(nullptr), + pSmackerMovie(nullptr), pSmackerBuffer(nullptr), pSmackMovieBlit(nullptr) +{ + //RGBTexture::RGBTexture(&pVideoPlayer->pVideoFrame); + bStopBeforeSchedule = false; + pResetflag = 0; + byte_F8BC0C = 0; + //pBinkMovie = nullptr; +}
--- a/VideoPlayer.h Fri Jun 14 16:06:20 2013 +0600 +++ b/VideoPlayer.h Fri Jun 14 16:06:30 2013 +0600 @@ -1,8 +1,7 @@ #pragma once #include "OSAPI.h" +#include "Texture.h" -#include "Texture.h" -#include "mm7_data.h" @@ -113,18 +112,7 @@ #pragma pack(push, 1) struct VideoPlayer { - //----- (004BE6F5) -------------------------------------------------------- - inline VideoPlayer(): - field_54(0), - pBinkMovie(nullptr), pBinkBuffer(nullptr), - pSmackerMovie(nullptr), pSmackerBuffer(nullptr), pSmackMovieBlit(nullptr) - { - //RGBTexture::RGBTexture(&pVideoPlayer->pVideoFrame); - bStopBeforeSchedule = false; - pResetflag = 0; - byte_F8BC0C = 0; - //pBinkMovie = nullptr; - } + VideoPlayer(); //----- (004BECBD) -------------------------------------------------------- virtual ~VideoPlayer() {
--- a/Viewport.cpp Fri Jun 14 16:06:20 2013 +0600 +++ b/Viewport.cpp Fri Jun 14 16:06:30 2013 +0600 @@ -1,9 +1,7 @@ #include "Viewport.h" #include "Party.h" -#include "VectorTypes.h" #include "Indoor.h" -#include "Render.h" #include "Math.h" #include "mm7_data.h"
--- a/Vis.cpp Fri Jun 14 16:06:20 2013 +0600 +++ b/Vis.cpp Fri Jun 14 16:06:30 2013 +0600 @@ -1,8 +1,8 @@ #include <assert.h> -#include "BSPModel.h" #include "Vis.h" #include "Outdoor.h" +#include "BSPModel.h" #include "Game.h" #include "Actor.h" #include "IndoorCamera.h"
--- a/Weather.cpp Fri Jun 14 16:06:20 2013 +0600 +++ b/Weather.cpp Fri Jun 14 16:06:30 2013 +0600 @@ -4,7 +4,7 @@ #include "Viewport.h" #include "Render.h" -#include "mm7_data.h" +#include "mm7_data.h" ////TODO: remove this once LOWORD/HIWRD stuff is refactored
--- a/mm7_1.cpp Fri Jun 14 16:06:20 2013 +0600 +++ b/mm7_1.cpp Fri Jun 14 16:06:30 2013 +0600 @@ -11,6 +11,8 @@ //#include <defs.h> #include <assert.h> +#include "Texture.h" +#include "mm7_data.h" #include "VideoPlayer.h" #include "BSPModel.h" #include "Mouse.h" @@ -38,7 +40,6 @@ #include "TurnEngine.h" #include "texts.h" #include "UIHouses.h" -#include "mm7_data.h" #include "stru367.h" int __stdcall aWinProc(HWND hWnd, UINT Msg, WPARAM wParam, unsigned int lParam);
--- a/mm7_2.cpp Fri Jun 14 16:06:20 2013 +0600 +++ b/mm7_2.cpp Fri Jun 14 16:06:30 2013 +0600 @@ -8,6 +8,8 @@ #include <windows.h> +#include "Texture.h" +#include "mm7_data.h" #include "VideoPlayer.h" #include "Sprites.h" #include "BSPModel.h" @@ -63,8 +65,8 @@ #include "Log.h" #include "UIHouses.h" #include "texts.h" -#include "mm7_data.h" #include "MM7.h" +#include "Lights.h" //----- (004BB756) -------------------------------------------------------- signed int __fastcall sub_4BB756(signed int a1) @@ -5607,43 +5609,46 @@ pIcons_LOD->_4114F2(); } +void set_stru1_field_8_InArcomage(int inValue) +{ + switch(inValue) + { + case 91:LOBYTE(pArcomageGame->stru1.field_8) = 123;break; + case 92:LOBYTE(pArcomageGame->stru1.field_8) = 124;break; + case 93:LOBYTE(pArcomageGame->stru1.field_8) = 125;break; + case 96:LOBYTE(pArcomageGame->stru1.field_8) = 126;break; + case 61:LOBYTE(pArcomageGame->stru1.field_8) = 43;break; + case 55:LOBYTE(pArcomageGame->stru1.field_8) = 38;break; + case 56:LOBYTE(pArcomageGame->stru1.field_8) = 42;break; + case 57:LOBYTE(pArcomageGame->stru1.field_8) = 40;break; + case 59:LOBYTE(pArcomageGame->stru1.field_8) = 58;break; + case 54:LOBYTE(pArcomageGame->stru1.field_8) = 94;break; + case 50:LOBYTE(pArcomageGame->stru1.field_8) = 64;break; + case 51:LOBYTE(pArcomageGame->stru1.field_8) = 35;break; + case 52:LOBYTE(pArcomageGame->stru1.field_8) = 36;break; + case 53:LOBYTE(pArcomageGame->stru1.field_8) = 37;break; + case 49:LOBYTE(pArcomageGame->stru1.field_8) = 33;break; + case 39:LOBYTE(pArcomageGame->stru1.field_8) = 34;break; + case 44:LOBYTE(pArcomageGame->stru1.field_8) = 60;break; + case 46:LOBYTE(pArcomageGame->stru1.field_8) = 62;break; + case 47:LOBYTE(pArcomageGame->stru1.field_8) = 63;break; + case 48:LOBYTE(pArcomageGame->stru1.field_8) = 41;break; + default:LOBYTE(pArcomageGame->stru1.field_8) = inValue;break; + } +} + + //----- (004637EB) -------------------------------------------------------- int __stdcall aWinProc(HWND hWnd, UINT Msg, WPARAM wParam, unsigned int lParam) { - //unsigned int v4; // esi@1 - Render *v5; // ecx@14 HANDLE v6; // eax@32 - Keyboard *v7; // eax@33 - //HDC v9; // edi@41 HDC v10; // edi@50 int v11; // esi@50 - //char v12; // zf@132 signed int v13; // eax@135 - int v14; // eax@139 - int v15; // eax@140 - int v16; // eax@141 - int v17; // eax@142 - int v18; // eax@150 - int v19; // eax@151 - int v20; // eax@152 - int v21; // eax@161 - int v22; // eax@162 - int v23; // eax@163 - int v24; // eax@170 - int v25; // eax@171 - int v26; // eax@172 - char v27; // al@174 - //bool v28; // ebx@201 char v29; // dl@209 - char v30; // cl@210 bool v31; // ebx@211 - void *v32; // ebx@214 float v33; // ST04_4@246 float v34; // ST04_4@254 - HWND v35; // [sp+8h] [bp-64h]@103 - UINT v36; // [sp+Ch] [bp-60h]@103 - WPARAM v37; // [sp+10h] [bp-5Ch]@103 - LPARAM v38; // [sp+14h] [bp-58h]@103 struct tagPAINTSTRUCT Paint; // [sp+24h] [bp-48h]@13 int pXY[2]; // [sp+64h] [bp-8h]@261 int a2; // [sp+7Ch] [bp+10h]@50 @@ -5881,7 +5886,6 @@ ArcomageGame::OnMouseClick(1, 1); return DefWindowProcA(hWnd, Msg, wParam, lParam); case WM_LBUTTONUP: - v32 = 0; if ( !pArcomageGame->bGameInProgress ) //goto LABEL_218; { @@ -5892,7 +5896,6 @@ ArcomageGame::OnMouseClick(0, 0); return DefWindowProcA(hWnd, Msg, wParam, lParam); case WM_RBUTTONUP: - v32 = 0; if ( !pArcomageGame->bGameInProgress ) { //LABEL_218: @@ -5901,10 +5904,7 @@ return DefWindowProcA(hWnd, Msg, wParam, lParam); } pArcomageGame->stru1.field_0 = 4; - v29 = 0; - //goto LABEL_262; - v30 = 1; - ArcomageGame::OnMouseClick(v30, v29 != 0); + ArcomageGame::OnMouseClick(1, false); return DefWindowProcA(hWnd, Msg, wParam, lParam); case WM_LBUTTONDBLCLK: @@ -6003,30 +6003,19 @@ { if ( Msg == WM_WINDOWPOSCHANGED ) { - if (pVideoPlayer) - { - if (pVideoPlayer->AnyMovieLoaded() && pVideoPlayer->pBinkBuffer) - { - BinkBufferSetOffset(pVideoPlayer->pBinkBuffer, 0, 0); - return DefWindowProcA(hWnd, Msg, wParam, lParam); - } - } - //goto _def_wnd_proc; + if (pVideoPlayer && pVideoPlayer->AnyMovieLoaded() && pVideoPlayer->pBinkBuffer) + { + BinkBufferSetOffset(pVideoPlayer->pBinkBuffer, 0, 0); + } return DefWindowProcA(hWnd, Msg, wParam, lParam); } if ( Msg != WM_KEYFIRST ) { - if ( Msg == WM_KEYUP ) - { - if ( wParam == VK_CONTROL ) - { - dword_507B98_ctrl_pressed = 0; - return DefWindowProcA(hWnd, Msg, wParam, lParam); - } - //goto _def_wnd_proc; - return DefWindowProcA(hWnd, Msg, wParam, lParam); - } - return DefWindowProcA(hWnd, Msg, wParam, lParam); + if ( Msg == WM_KEYUP && wParam == VK_CONTROL ) + { + dword_507B98_ctrl_pressed = 0; + } + return DefWindowProcA(hWnd, Msg, wParam, lParam); } if ( uGameMenuUI_CurentlySelectedKeyIdx != -1 ) { @@ -6074,508 +6063,23 @@ if ( pCurrentScreen != SCREEN_GAME && pCurrentScreen != SCREEN_PRESS_ESCAPE_MESSAGE ) return 0; } + pArcomageGame->stru1.field_0 = 1; - if ( (unsigned __int16)GetAsyncKeyState(VK_SHIFT) >> 8 >= 0 ) - v27 = MapVirtualKeyA((unsigned __int16)wParam, 2u); - else - { - v13 = (unsigned __int16)MapVirtualKeyA((unsigned __int16)wParam, 2u); - if ( (signed int)(unsigned __int16)v13 > 54 ) - { - if ( v13 > 61 ) - { - if ( v13 == 91 ) - { - LOBYTE(pArcomageGame->stru1.field_8) = 123; - //goto LABEL_181; - if ( wParam == 27 ) - { - pArcomageGame->GameOver = 1; - pArcomageGame->field_F4 = 1; - pArcomageGame->uGameResult = 2; - pArcomageGame->field_B0 = -2; - //goto _def_wnd_proc; - return DefWindowProcA(hWnd, Msg, wParam, lParam); - } - if ( wParam != 114 ) - { - if ( wParam == 115 && !pVideoPlayer->AnyMovieLoaded() ) - SendMessageA(hWnd, 0x111u, 0x68u, 0); - //goto _def_wnd_proc; - return DefWindowProcA(hWnd, Msg, wParam, lParam); - } - SendMessageA(hWnd, WM_COMMAND, 103, 0); - return 0; - } - if ( v13 == 92 ) - { - LOBYTE(pArcomageGame->stru1.field_8) = 124; - //goto LABEL_181; - if ( wParam == 27 ) - { - pArcomageGame->GameOver = 1; - pArcomageGame->field_F4 = 1; - pArcomageGame->uGameResult = 2; - pArcomageGame->field_B0 = -2; - //goto _def_wnd_proc; - return DefWindowProcA(hWnd, Msg, wParam, lParam); - } - if ( wParam != 114 ) - { - if ( wParam == 115 && !pVideoPlayer->AnyMovieLoaded() ) - SendMessageA(hWnd, 0x111u, 0x68u, 0); - //goto _def_wnd_proc; - return DefWindowProcA(hWnd, Msg, wParam, lParam); - } - SendMessageA(hWnd, WM_COMMAND, 103, 0); - return 0; - } - if ( v13 == 93 ) - { - LOBYTE(pArcomageGame->stru1.field_8) = 125; - //goto LABEL_181; - if ( wParam == 27 ) - { - pArcomageGame->GameOver = 1; - pArcomageGame->field_F4 = 1; - pArcomageGame->uGameResult = 2; - pArcomageGame->field_B0 = -2; - //goto _def_wnd_proc; - return DefWindowProcA(hWnd, Msg, wParam, lParam); - } - if ( wParam != 114 ) - { - if ( wParam == 115 && !pVideoPlayer->AnyMovieLoaded() ) - SendMessageA(hWnd, 0x111u, 0x68u, 0); - //goto _def_wnd_proc; - return DefWindowProcA(hWnd, Msg, wParam, lParam); - } - SendMessageA(hWnd, WM_COMMAND, 103, 0); - return 0; - } - if ( v13 == 96 ) - { - LOBYTE(pArcomageGame->stru1.field_8) = 126; - //goto LABEL_181; - if ( wParam == 27 ) - { - pArcomageGame->GameOver = 1; - pArcomageGame->field_F4 = 1; - pArcomageGame->uGameResult = 2; - pArcomageGame->field_B0 = -2; - //goto _def_wnd_proc; - return DefWindowProcA(hWnd, Msg, wParam, lParam); - } - if ( wParam != 114 ) - { - if ( wParam == 115 && !pVideoPlayer->AnyMovieLoaded() ) - SendMessageA(hWnd, 0x111u, 0x68u, 0); - //goto _def_wnd_proc; - return DefWindowProcA(hWnd, Msg, wParam, lParam); - } - SendMessageA(hWnd, WM_COMMAND, 103, 0); - return 0; - } - } - else - { - if ( v13 == 61 ) - { - LOBYTE(pArcomageGame->stru1.field_8) = 43; - //goto LABEL_181; - if ( wParam == 27 ) - { - pArcomageGame->GameOver = 1; - pArcomageGame->field_F4 = 1; - pArcomageGame->uGameResult = 2; - pArcomageGame->field_B0 = -2; - //goto _def_wnd_proc; - return DefWindowProcA(hWnd, Msg, wParam, lParam); - } - if ( wParam != 114 ) - { - if ( wParam == 115 && !pVideoPlayer->AnyMovieLoaded() ) - SendMessageA(hWnd, 0x111u, 0x68u, 0); - //goto _def_wnd_proc; - return DefWindowProcA(hWnd, Msg, wParam, lParam); - } - SendMessageA(hWnd, WM_COMMAND, 103, 0); - return 0; - } - if ( v13 == 55 ) - { - LOBYTE(pArcomageGame->stru1.field_8) = 38; - //goto LABEL_181; - if ( wParam == 27 ) - { - pArcomageGame->GameOver = 1; - pArcomageGame->field_F4 = 1; - pArcomageGame->uGameResult = 2; - pArcomageGame->field_B0 = -2; - //goto _def_wnd_proc; - return DefWindowProcA(hWnd, Msg, wParam, lParam); - } - if ( wParam != 114 ) - { - if ( wParam == 115 && !pVideoPlayer->AnyMovieLoaded() ) - SendMessageA(hWnd, 0x111u, 0x68u, 0); - //goto _def_wnd_proc; - return DefWindowProcA(hWnd, Msg, wParam, lParam); - } - SendMessageA(hWnd, WM_COMMAND, 103, 0); - return 0; - } - if ( v13 == 56 ) - { - LOBYTE(pArcomageGame->stru1.field_8) = 42; - //goto LABEL_181; - if ( wParam == 27 ) - { - pArcomageGame->GameOver = 1; - pArcomageGame->field_F4 = 1; - pArcomageGame->uGameResult = 2; - pArcomageGame->field_B0 = -2; - //goto _def_wnd_proc; - return DefWindowProcA(hWnd, Msg, wParam, lParam); - } - if ( wParam != 114 ) - { - if ( wParam == 115 && !pVideoPlayer->AnyMovieLoaded() ) - SendMessageA(hWnd, 0x111u, 0x68u, 0); - //goto _def_wnd_proc; - return DefWindowProcA(hWnd, Msg, wParam, lParam); - } - SendMessageA(hWnd, WM_COMMAND, 103, 0); - return 0; - } - if ( v13 == 57 ) - { - LOBYTE(pArcomageGame->stru1.field_8) = 40; - //goto LABEL_181; - if ( wParam == 27 ) - { - pArcomageGame->GameOver = 1; - pArcomageGame->field_F4 = 1; - pArcomageGame->uGameResult = 2; - pArcomageGame->field_B0 = -2; - //goto _def_wnd_proc; - return DefWindowProcA(hWnd, Msg, wParam, lParam); - } - if ( wParam != 114 ) - { - if ( wParam == 115 && !pVideoPlayer->AnyMovieLoaded() ) - SendMessageA(hWnd, 0x111u, 0x68u, 0); - //goto _def_wnd_proc; - return DefWindowProcA(hWnd, Msg, wParam, lParam); - } - SendMessageA(hWnd, WM_COMMAND, 103, 0); - return 0; - } - if ( v13 == 59 ) - { - LOBYTE(pArcomageGame->stru1.field_8) = 58; - //goto LABEL_181; - if ( wParam == 27 ) - { - pArcomageGame->GameOver = 1; - pArcomageGame->field_F4 = 1; - pArcomageGame->uGameResult = 2; - pArcomageGame->field_B0 = -2; - //goto _def_wnd_proc; - return DefWindowProcA(hWnd, Msg, wParam, lParam); - } - if ( wParam != 114 ) - { - if ( wParam == 115 && !pVideoPlayer->AnyMovieLoaded() ) - SendMessageA(hWnd, 0x111u, 0x68u, 0); - //goto _def_wnd_proc; - return DefWindowProcA(hWnd, Msg, wParam, lParam); - } - SendMessageA(hWnd, WM_COMMAND, 103, 0); - return 0; - } - } - } - else - { - if ( (unsigned __int16)v13 == 54 ) - { - LOBYTE(pArcomageGame->stru1.field_8) = 94; - //goto LABEL_181; - if ( wParam == 27 ) - { - pArcomageGame->GameOver = 1; - pArcomageGame->field_F4 = 1; - pArcomageGame->uGameResult = 2; - pArcomageGame->field_B0 = -2; - //goto _def_wnd_proc; - return DefWindowProcA(hWnd, Msg, wParam, lParam); - } - if ( wParam != 114 ) - { - if ( wParam == 115 && !pVideoPlayer->AnyMovieLoaded() ) - SendMessageA(hWnd, 0x111u, 0x68u, 0); - //goto _def_wnd_proc; - return DefWindowProcA(hWnd, Msg, wParam, lParam); - } - SendMessageA(hWnd, WM_COMMAND, 103, 0); - return 0; - } - if ( v13 > 49 ) - { - if ( v13 == 50 ) - { - LOBYTE(pArcomageGame->stru1.field_8) = 64; - //goto LABEL_181; - if ( wParam == 27 ) - { - pArcomageGame->GameOver = 1; - pArcomageGame->field_F4 = 1; - pArcomageGame->uGameResult = 2; - pArcomageGame->field_B0 = -2; - //goto _def_wnd_proc; - return DefWindowProcA(hWnd, Msg, wParam, lParam); - } - if ( wParam != 114 ) - { - if ( wParam == 115 && !pVideoPlayer->AnyMovieLoaded() ) - SendMessageA(hWnd, 0x111u, 0x68u, 0); - //goto _def_wnd_proc; - return DefWindowProcA(hWnd, Msg, wParam, lParam); - } - SendMessageA(hWnd, WM_COMMAND, 103, 0); - return 0; - } - if ( v13 == 51 ) - { - LOBYTE(pArcomageGame->stru1.field_8) = 35; - //goto LABEL_181; - if ( wParam == 27 ) - { - pArcomageGame->GameOver = 1; - pArcomageGame->field_F4 = 1; - pArcomageGame->uGameResult = 2; - pArcomageGame->field_B0 = -2; - //goto _def_wnd_proc; - return DefWindowProcA(hWnd, Msg, wParam, lParam); - } - if ( wParam != 114 ) - { - if ( wParam == 115 && !pVideoPlayer->AnyMovieLoaded() ) - SendMessageA(hWnd, 0x111u, 0x68u, 0); - //goto _def_wnd_proc; - return DefWindowProcA(hWnd, Msg, wParam, lParam); - } - SendMessageA(hWnd, WM_COMMAND, 103, 0); - return 0; - } - if ( v13 == 52 ) - { - LOBYTE(pArcomageGame->stru1.field_8) = 36; - //goto LABEL_181; - if ( wParam == 27 ) - { - pArcomageGame->GameOver = 1; - pArcomageGame->field_F4 = 1; - pArcomageGame->uGameResult = 2; - pArcomageGame->field_B0 = -2; - //goto _def_wnd_proc; - return DefWindowProcA(hWnd, Msg, wParam, lParam); - } - if ( wParam != 114 ) - { - if ( wParam == 115 && !pVideoPlayer->AnyMovieLoaded() ) - SendMessageA(hWnd, 0x111u, 0x68u, 0); - //goto _def_wnd_proc; - return DefWindowProcA(hWnd, Msg, wParam, lParam); - } - SendMessageA(hWnd, WM_COMMAND, 103, 0); - return 0; - } - if ( v13 == 53 ) - { - LOBYTE(pArcomageGame->stru1.field_8) = 37; - //goto LABEL_181; - if ( wParam == 27 ) - { - pArcomageGame->GameOver = 1; - pArcomageGame->field_F4 = 1; - pArcomageGame->uGameResult = 2; - pArcomageGame->field_B0 = -2; - //goto _def_wnd_proc; - return DefWindowProcA(hWnd, Msg, wParam, lParam); - } - if ( wParam != 114 ) - { - if ( wParam == 115 && !pVideoPlayer->AnyMovieLoaded() ) - SendMessageA(hWnd, 0x111u, 0x68u, 0); - //goto _def_wnd_proc; - return DefWindowProcA(hWnd, Msg, wParam, lParam); - } - SendMessageA(hWnd, WM_COMMAND, 103, 0); - return 0; - } - } - else - { - if ( v13 == 49 ) - { - LOBYTE(pArcomageGame->stru1.field_8) = 33; - //goto LABEL_181; - if ( wParam == 27 ) - { - pArcomageGame->GameOver = 1; - pArcomageGame->field_F4 = 1; - pArcomageGame->uGameResult = 2; - pArcomageGame->field_B0 = -2; - //goto _def_wnd_proc; - return DefWindowProcA(hWnd, Msg, wParam, lParam); - } - if ( wParam != 114 ) - { - if ( wParam == 115 && !pVideoPlayer->AnyMovieLoaded() ) - SendMessageA(hWnd, 0x111u, 0x68u, 0); - //goto _def_wnd_proc; - return DefWindowProcA(hWnd, Msg, wParam, lParam); - } - SendMessageA(hWnd, WM_COMMAND, 103, 0); - return 0; - } - if ( v13 == 39 ) - { - LOBYTE(pArcomageGame->stru1.field_8) = 34; - //goto LABEL_181; - if ( wParam == 27 ) - { - pArcomageGame->GameOver = 1; - pArcomageGame->field_F4 = 1; - pArcomageGame->uGameResult = 2; - pArcomageGame->field_B0 = -2; - //goto _def_wnd_proc; - return DefWindowProcA(hWnd, Msg, wParam, lParam); - } - if ( wParam != 114 ) - { - if ( wParam == 115 && !pVideoPlayer->AnyMovieLoaded() ) - SendMessageA(hWnd, 0x111u, 0x68u, 0); - //goto _def_wnd_proc; - return DefWindowProcA(hWnd, Msg, wParam, lParam); - } - SendMessageA(hWnd, WM_COMMAND, 103, 0); - return 0; - } - if ( v13 == 44 ) - { - LOBYTE(pArcomageGame->stru1.field_8) = 60; - //goto LABEL_181; - if ( wParam == 27 ) - { - pArcomageGame->GameOver = 1; - pArcomageGame->field_F4 = 1; - pArcomageGame->uGameResult = 2; - pArcomageGame->field_B0 = -2; - //goto _def_wnd_proc; - return DefWindowProcA(hWnd, Msg, wParam, lParam); - } - if ( wParam != 114 ) - { - if ( wParam == 115 && !pVideoPlayer->AnyMovieLoaded() ) - SendMessageA(hWnd, 0x111u, 0x68u, 0); - //goto _def_wnd_proc; - return DefWindowProcA(hWnd, Msg, wParam, lParam); - } - SendMessageA(hWnd, WM_COMMAND, 103, 0); - return 0; - } - if ( v13 == 46 ) - { - LOBYTE(pArcomageGame->stru1.field_8) = 62; - //goto LABEL_181; - if ( wParam == 27 ) - { - pArcomageGame->GameOver = 1; - pArcomageGame->field_F4 = 1; - pArcomageGame->uGameResult = 2; - pArcomageGame->field_B0 = -2; - //goto _def_wnd_proc; - return DefWindowProcA(hWnd, Msg, wParam, lParam); - } - if ( wParam != 114 ) - { - if ( wParam == 115 && !pVideoPlayer->AnyMovieLoaded() ) - SendMessageA(hWnd, 0x111u, 0x68u, 0); - //goto _def_wnd_proc; - return DefWindowProcA(hWnd, Msg, wParam, lParam); - } - SendMessageA(hWnd, WM_COMMAND, 103, 0); - return 0; - } - if ( v13 == 47 ) - { - LOBYTE(pArcomageGame->stru1.field_8) = 63; - //goto LABEL_181; - if ( wParam == 27 ) - { - pArcomageGame->GameOver = 1; - pArcomageGame->field_F4 = 1; - pArcomageGame->uGameResult = 2; - pArcomageGame->field_B0 = -2; - //goto _def_wnd_proc; - return DefWindowProcA(hWnd, Msg, wParam, lParam); - } - if ( wParam != 114 ) - { - if ( wParam == 115 && !pVideoPlayer->AnyMovieLoaded() ) - SendMessageA(hWnd, 0x111u, 0x68u, 0); - //goto _def_wnd_proc; - return DefWindowProcA(hWnd, Msg, wParam, lParam); - } - SendMessageA(hWnd, WM_COMMAND, 103, 0); - return 0; - } - if ( v13 == 48 ) - { - LOBYTE(pArcomageGame->stru1.field_8) = 41; -//LABEL_181: - if ( wParam == 27 ) - { - pArcomageGame->GameOver = 1; - pArcomageGame->field_F4 = 1; - pArcomageGame->uGameResult = 2; - pArcomageGame->field_B0 = -2; - //goto _def_wnd_proc; - return DefWindowProcA(hWnd, Msg, wParam, lParam); - } - if ( wParam != 114 ) - { - if ( wParam == 115 && !pVideoPlayer->AnyMovieLoaded() ) - SendMessageA(hWnd, 0x111u, 0x68u, 0); - //goto _def_wnd_proc; - return DefWindowProcA(hWnd, Msg, wParam, lParam); - } - SendMessageA(hWnd, WM_COMMAND, 103, 0); - return 0; - } - } - } - v27 = MapVirtualKeyA((unsigned __int16)wParam, 2u); - } - LOBYTE(pArcomageGame->stru1.field_8) = v27; - //goto LABEL_181; + + v13 = (unsigned __int16)MapVirtualKeyA((unsigned __int16)wParam, 2u); + set_stru1_field_8_InArcomage(v13); if ( wParam == 27 ) { pArcomageGame->GameOver = 1; pArcomageGame->field_F4 = 1; pArcomageGame->uGameResult = 2; pArcomageGame->field_B0 = -2; - //goto _def_wnd_proc; return DefWindowProcA(hWnd, Msg, wParam, lParam); } if ( wParam != 114 ) { if ( wParam == 115 && !pVideoPlayer->AnyMovieLoaded() ) - SendMessageA(hWnd, 0x111u, 0x68u, 0); - //goto _def_wnd_proc; + SendMessageA(hWnd, 0x111u, 0x68u, 0); return DefWindowProcA(hWnd, Msg, wParam, lParam); } SendMessageA(hWnd, WM_COMMAND, 103, 0); @@ -6704,7 +6208,6 @@ if ( pArcomageGame->bGameInProgress ) { pArcomageGame->field_F9 = 1; - v5 = pRenderer; } else { @@ -6714,7 +6217,6 @@ EndPaint(hWnd, &Paint); return 0; } - v5 = pRenderer; } pRenderer->Present(); //LABEL_20: @@ -7760,7 +7262,7 @@ if (!bNoSound) pAudioPlayer->Initialize(hWnd); - pVideoPlayer = new VideoPlayer; + pVideoPlayer = new VideoPlayer(); pVideoPlayer->Initialize(); dword_6BE364_game_settings_1 |= 0x4000;
--- a/mm7_3.cpp Fri Jun 14 16:06:20 2013 +0600 +++ b/mm7_3.cpp Fri Jun 14 16:06:30 2013 +0600 @@ -5,7 +5,8 @@ #include <assert.h> -#include "VideoPlayer.h" +#include "Texture.h" +#include "mm7_data.h" #include "Sprites.h" #include "BSPModel.h" #include "OutdoorCamera.h" @@ -15,7 +16,7 @@ #include "Mouse.h" #include "Keyboard.h" #include "stru6.h" - +#include "FactionTable.h" #include "MapInfo.h" #include "Game.h" #include "GUIWindow.h" @@ -46,9 +47,9 @@ #include "stru298.h" #include "texts.h" #include "Log.h" +#include "Lights.h" #include "MM7.h" -#include "mm7_data.h" //----- (0046E44E) -------------------------------------------------------- int __thiscall _46E44E_collide_against_faces_and_portals(unsigned int b1) @@ -14791,8 +14792,9 @@ if ( target_pid_type == OBJECT_Actor ) { v36 = v75.uDistance; - v37 = (unsigned __int8)*(&byte_5C8D1A[89 * (pActor->pMonsterInfo.uID - 1) / 3] - + (pActors[PID_ID(target_pid)].pMonsterInfo.uID - 1) / 3); + //v37 = (unsigned __int8)*(&byte_5C8D1A[89 * (pActor->pMonsterInfo.uID - 1) / 3] + // + (pActors[PID_ID(target_pid)].pMonsterInfo.uID - 1) / 3); + v37 =pFactionTable->relations[(pActor->pMonsterInfo.uID-1) / 3 + 1][(pActors[PID_ID(target_pid)].pMonsterInfo.uID - 1) / 3 + 1]; } else {
--- a/mm7_4.cpp Fri Jun 14 16:06:20 2013 +0600 +++ b/mm7_4.cpp Fri Jun 14 16:06:30 2013 +0600 @@ -4,6 +4,8 @@ #include <assert.h> +#include "Texture.h" +#include "mm7_data.h" #include "VideoPlayer.h" #include "Sprites.h" #include "BSPModel.h" @@ -43,7 +45,7 @@ #include "texts.h" #include "Log.h" #include "UIHouses.h" -#include "mm7_data.h" +#include "Lights.h" //----- (0046CC4B) -------------------------------------------------------- void __cdecl check_event_triggers() @@ -473,30 +475,25 @@ dword_721160[0] = -1; dword_721110[0] = -1; odm_floor_level[0] = GetTerrainHeightsAroundParty2(X, Y, pIsOnWater, bWaterWalk); - if ( (signed int)pOutdoor->uNumBModels <= 0 ) - { - *a6 = 0; - return odm_floor_level[0]; - } - v38 = 0; - for ( pBModelNum = 0; pBModelNum < (signed int)pOutdoor->uNumBModels; ++pBModelNum ) - { - pBModel = &pOutdoor->pBModels[v38]; - if ( X <= pBModel->sMaxX && X >= pBModel->sMinX && Y <= pBModel->sMaxY && Y >= pBModel->sMinY ) - { - if ( (signed int)pBModel->uNumFaces > 0 ) + + for ( pBModelNum = 0; pBModelNum < pOutdoor->uNumBModels; ++pBModelNum ) + { + pBModel = &pOutdoor->pBModels[pBModelNum]; + if ( X <= pBModel->sMaxX && X >= pBModel->sMinX && + Y <= pBModel->sMaxY && Y >= pBModel->sMinY ) + { + if ( pBModel->uNumFaces > 0 ) { v39 = 0; for ( pFaceNum = 0; pFaceNum < pBModel->uNumFaces; ++pFaceNum ) { - pFace = &pBModel->pFaces[v39]; + pFace = &pBModel->pFaces[pFaceNum]; if ( (pFace->uPolygonType == POLYGON_Floor || pFace->uPolygonType == POLYGON_InBetweenFloorAndWall) && !(pFace->uAttributes & 0x20000000) && X <= pFace->pBoundingBox.x2 && X >= pFace->pBoundingBox.x1 && Y <= pFace->pBoundingBox.y2 && Y >= pFace->pBoundingBox.y1 ) { - if ( pFace->uNumVertices ) - { + for ( uint i = 0; i < pFace->uNumVertices; ++i) { word_721040[2 * i] = pFace->pXInterceptDisplacements[i] + pBModel->pVertices.pVertices[pFace->pVertexIDs[i]].x; @@ -504,7 +501,6 @@ word_721040[2 * i + 1] = pFace->pXInterceptDisplacements[i] + pBModel->pVertices.pVertices[pFace->pVertexIDs[i + 1]].x; word_720F70[2 * i + 1] = pFace->pXInterceptDisplacements[i + 1] + pBModel->pVertices.pVertices[pFace->pVertexIDs[i + 1]].y; } - } word_721040[2 * pFace->uNumVertices] = word_721040[0]; word_720F70[2 * pFace->uNumVertices] = word_720F70[0]; v43 = word_720F70[0] >= Y; @@ -553,11 +549,10 @@ } } } - ++v39; + } } } - ++v38; } if ( v46 == 1 ) { @@ -852,10 +847,10 @@ 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_dx = (double)(grid_pos_x1 - grid_pos_x2); + side2_dz = 0.0;//(double)(grid_pos_z2 - grid_pos_z2); // bug? z2 - z2 + side1_dz = (double)(grid_pos_z1 - grid_pos_z2); // z1 - z2 yes + //Log::Warning(L"%S %S %u\n", __FILE__, __FUNCTION__, __LINE__); /* |\ side1 | \ |____\ @@ -866,8 +861,8 @@ 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_dx = (double)(grid_pos_x2 - grid_pos_x1); + side2_dz = 0.0;//(double)(grid_pos_z1 - grid_pos_z1); side1_dz = (double)(grid_pos_z2 - grid_pos_z1); /* side 2
--- a/mm7_5.cpp Fri Jun 14 16:06:20 2013 +0600 +++ b/mm7_5.cpp Fri Jun 14 16:06:30 2013 +0600 @@ -4,6 +4,8 @@ #include <assert.h> +#include "Texture.h" +#include "mm7_data.h" #include "VideoPlayer.h" #include "Sprites.h" #include "MapInfo.h" @@ -15,7 +17,8 @@ #include "Keyboard.h" #include "GammaControl.h" #include "stru11.h" - +#include "mm7_data.h" +#include "FactionTable.h" #include "Vis.h" #include "mm7.h" #include "Game.h" @@ -45,7 +48,8 @@ #include "texts.h" #include "Log.h" #include "UIHouses.h" -#include "mm7_data.h" +#include "Lights.h" +#include "Lights.h" //----- (004304E7) -------------------------------------------------------- void __cdecl GameUI_MsgProc() @@ -3625,6 +3629,50 @@ this->z = (1.0 / sqrt(this->x * this->x + this->y * this->y + this->z * this->z)) * this->z; } +//----- (00438526) -------------------------------------------------------- +stru11::stru11() +{ + stru11 *v1; // esi@1 + signed int v2; // eax@1 + char *v3; // edx@1 + + v1 = this; + v2 = 0; + this->cpuid_00000000_eax_numops = 0; + this->cpuid_00000001_eax = 0; + this->cpuid_00000001_edx = 0; + this->field_38 = 0; + this->field_3C = 0; + this->cpuid_80000000_edx = 0; + this->cpuid_80000001_eax = 0; + this->cpuid_80000001_edx = 0; + this->cpuid_80000005_ebx = 0; + this->cpuid_80000005_ecx = 0; + this->cpuid_80000005_edx = 0; + this->cpuid_80000006_ecx = 0; + this->field_AC = 0; + this->uProcessorManufacturer = 0; + LOBYTE(this->cpuid_80000002_registers2[0]) = 0; + v3 = (char *)&this->cpuid_00000002_eax; + do + { + if ( v2 < 3 ) + *((int *)v3 - 9) = 0; + if ( v2 < 4 ) + *(int *)v3 = 0; + if ( v2 < 12 ) + *((int *)v3 + 17) = 0; + if ( v2 < 13 ) + this->pCPUString[v2] = 0; + if ( v2 < 30 ) + *((char *)this->field_40 + v2) = 0; + *((char *)&this->cpuid_80000002_registers2[0] + v2++ + 1) = 0; + v3 += 4; + } + while ( v2 < 48 ); + CheckCPU(); +} + //----- (004385B5) -------------------------------------------------------- void stru11::CheckCPU() { @@ -6886,7 +6934,8 @@ v20 = 0; } if (PID_TYPE(v22) == OBJECT_Actor) - v10 = (unsigned __int8)*(&byte_5C8D1A[89 * (pMonsterStats->pInfos[pActors[PID_ID(v22)].pMonsterInfo.uID].uID - 1) / 3] + (v5->pMonsterInfo.uID - 1) / 3); + //v10 = (unsigned __int8)*(&byte_5C8D1A[89 * (pMonsterStats->pInfos[pActors[PID_ID(v22)].pMonsterInfo.uID].uID - 1) / 3] + (v5->pMonsterInfo.uID - 1) / 3); + v10 = pFactionTable->relations[(pMonsterStats->pInfos[pActors[PID_ID(v22)].pMonsterInfo.uID].uID) / 3 + 1][(v5->pMonsterInfo.uID - 1) / 3 + 1]; else v10 = 4; if ( v10 == 1 )
--- a/mm7_data.cpp Fri Jun 14 16:06:20 2013 +0600 +++ b/mm7_data.cpp Fri Jun 14 16:06:30 2013 +0600 @@ -61,8 +61,6 @@ int num_achieved_awards; int num_achieved_awards_2; -#include "stru159.h" - #include "stru160.h" std::array<stru160, 66> array_4EB8B8 = {{ @@ -572,8 +570,6 @@ int bWinNT4_0; // weak std::array<__int16, 11> word_4E8152 = {0, 0, 0, 90, 8, 2, 70, 20, 10, 50, 30}; -stru355 stru_4E82A4 = {0x20, 0x41, 0, 0x20, 0xFF0000, 0xFF00, 0xFF, 0xFF000000}; -stru355 stru_4EFCBC = {0x20, 0x41, 0, 0x10, 0x7C00, 0x3E0, 0x1F, 0x8000}; char byte_4E94D0 = 5; // weak char byte_4E94D1 = 9; // weak char _4E94D2_light_type = 6; // weak @@ -892,65 +888,15 @@ std::array<int, 500> ai_near_actors_distances; std::array<unsigned int, 500> ai_near_actors_ids; std::array<int, 121> dword_4F8580; // weak -int dword_4FA9B0[777]; // weak -int dword_4FA9B4[777]; // weak -char byte_4FAA00; // weak -std::array<__int16, 12> am_sounds; + + + _UNKNOWN unk_4FAA20; // weak char byte_4FAA24; // weak HWND dword_4FAA28; // idb -char byte_4FAA2E; // weak -int amuint_4FAA34; // weak -int amuint_4FAA38; // weak -int amuint_4FAA4C; // weak - - - - -int dword_4FAA70; // weak -char byte_4FAA74; // weak -char am_byte_4FAA75; // weak -char am_byte_4FAA76; // weak - - -char am_byte_4FAA7C[777]; // weak - -int amuint_4FAA88[777]; // weak -int amuint_4FAA8C[777]; // weak -int amuint_4FAA90[777][2]; - - - -int amuint_4FABC4; // weak - -char byte_4FABD0[777]; // weak -char byte_4FABD1[777]; // weak -_UNKNOWN unk_4FABD4; // weak -int dword_4FABD8[777]; // weak -int dword_4FABDC[777]; // weak -int dword_4FABE0[777]; // weak -int dword_4FABE4[777]; // weak -int dword_4FABE8[777]; // weak -int dword_4FABEC[777]; // weak -int dword_4FABF0[777]; // weak -int dword_4FABF4[777]; // weak -int dword_4FABF8[777]; // weak -int dword_4FABFC[777]; // weak -int dword_4FAC00[777]; // weak -int dword_4FAC04[777]; // weak -int dword_4FAC08[777]; // weak -int dword_4FAC0C[777]; // weak -_UNKNOWN unk_5052C8; // weak - - - - - -char byte_505880; // weak -char byte_505881; // weak int dword_505890; // weak std::array<unsigned int, 480> pSRZBufferLineOffsets; @@ -964,8 +910,8 @@ __int64 qword_506350; // weak char byte_506360; // weak int dword_506364; // weak -Texture *dword_506404[12]; // weak -Texture *dword_50640C[12]; // weak +//Texture *dword_506404[12]; // weak +//Texture *dword_50640C[12]; // weak unsigned int uExitCancelTextureId; int dword_50651C; // weak int dword_506528; // weak @@ -1191,7 +1137,7 @@ char *pSkillDescTXT_Raw; struct FactionTable *pFactionTable; -std::array<char, 777> byte_5C8D1A; // weak +//std::array<char, 777> byte_5C8D1A; // weak std::array<char, 777> byte_5E4C15; // weak std::array<char *, 14> pSomeItemsNames;
--- a/mm7_data.h Fri Jun 14 16:06:20 2013 +0600 +++ b/mm7_data.h Fri Jun 14 16:06:30 2013 +0600 @@ -3,9 +3,11 @@ #include "VectorTypes.h" #include "OSAPI.h" #include <array> +#include "Items.h" //TODO: remove this once sub_467E7F_EquipBody if moved to a class or something typedef char _UNKNOWN; + typedef unsigned int uint; @@ -463,9 +465,8 @@ extern int bWinNT4_0; // weak extern std::array<__int16, 11> word_4E8152; extern std::array< std::array<char, 14>, 7> byte_4E8168; -#include "Texture.h" -extern stru355 stru_4E82A4;// = {0x20, 0x41, 0, 0x20, 0xFF0000, 0xFF00, 0xFF, 0xFF000000}; -extern stru355 stru_4EFCBC;// = {0x20, 0x41, 0, 0x10, 0x7C00, 0x3E0, 0x1F, 0x8000}; +//extern stru355 stru_4E82A4;// = {0x20, 0x41, 0, 0x20, 0xFF0000, 0xFF00, 0xFF, 0xFF000000}; moved to texture.h +//extern stru355 stru_4EFCBC;// = {0x20, 0x41, 0, 0x10, 0x7C00, 0x3E0, 0x1F, 0x8000}; moved to texture.h extern char byte_4E94D0; // weak extern char _4E94D2_light_type; // weak extern char byte_4E94D3; // weak @@ -530,58 +531,12 @@ extern std::array<int, 121> dword_4F8580; // weak extern int dword_4FA9B0[]; // weak extern int dword_4FA9B4[]; // weak -extern char byte_4FAA00; // weak -extern std::array<__int16, 12> am_sounds; + extern _UNKNOWN unk_4FAA20; // weak extern char byte_4FAA24; // weak extern HWND dword_4FAA28; // idb -extern char byte_4FAA2E; // weak -extern int amuint_4FAA34; // weak -extern int amuint_4FAA38; // weak -extern int amuint_4FAA4C; // weak - - -extern int dword_4FAA70; // weak -extern char byte_4FAA74; // weak -extern char am_byte_4FAA75; // weak -extern char am_byte_4FAA76; // weak - - -extern char am_byte_4FAA7C[777]; // weak - -extern int amuint_4FAA88[777]; // weak -extern int amuint_4FAA8C[777]; // weak -extern int amuint_4FAA90[777][2]; - - - -extern int amuint_4FABC4; // weak - -extern char byte_4FABD0[]; // weak -extern char byte_4FABD1[]; // weak -extern _UNKNOWN unk_4FABD4; // weak -extern int dword_4FABD8[]; // weak -extern int dword_4FABDC[]; // weak -extern int dword_4FABE0[]; // weak -extern int dword_4FABE4[]; // weak -extern int dword_4FABE8[]; // weak -extern int dword_4FABEC[]; // weak -extern int dword_4FABF0[]; // weak -extern int dword_4FABF4[]; // weak -extern int dword_4FABF8[]; // weak -extern int dword_4FABFC[]; // weak -extern int dword_4FAC00[]; // weak -extern int dword_4FAC04[]; // weak -extern int dword_4FAC08[]; // weak -extern int dword_4FAC0C[]; // weak -extern _UNKNOWN unk_5052C8; // weak - -extern char byte_5054C8[32]; // idb - -extern char byte_505880; // weak -extern char byte_505881; // weak extern int dword_505890; // weak extern std::array<unsigned int, 480> pSRZBufferLineOffsets; @@ -595,7 +550,7 @@ extern __int64 qword_506350; // weak extern char byte_506360; // weak extern int dword_506364; // weak -extern Texture *dword_50640C[]; // weak +//extern Texture *dword_50640C[]; // weak extern unsigned int uExitCancelTextureId; extern int dword_50651C; // weak extern int dword_506528; // weak @@ -823,7 +778,7 @@ extern char *pStatsTXT_Raw; extern char *pSkillDescTXT_Raw; extern struct FactionTable *pFactionTable; -extern std::array<char, 777> byte_5C8D1A; // weak +//extern std::array<char, 777> byte_5C8D1A; // weak extern std::array<char, 777> byte_5E4C15; // weak extern std::array<char *, 14> pSomeItemsNames; @@ -1154,7 +1109,7 @@ int loc_40E4FC(); // weak void __fastcall ZBuffer_Fill(int *pZBuffer, int uTextureId, int iZValue); -void __fastcall ZBuffer_DoFill(int *pZBuffer, Texture *pTex, int uZValue); +void __fastcall ZBuffer_DoFill(int *pZBuffer, struct Texture *pTex, int uZValue); void __fastcall sub_40F92A(int *pZBuffer, struct Texture *a2, int a3); // idb void __cdecl SetMoonPhaseNames(); signed int __fastcall sub_410D99_get_map_index(int a1); @@ -1389,7 +1344,6 @@ enum MENU_STATE GetCurrentMenuID(); void *__thiscall output_debug_string(void *_this, std::string a2, const char *a3, int a4); std::string *__fastcall _4678E2_make_error_string(std::string *a1, int line, std::string file); -#include "Items.h" void sub_467E7F_EquipBody(ITEM_EQUIP_TYPE uEquipType); // idb void CreateMsgScrollWindow(signed int mscroll_id); void __cdecl free_book_subwindow();
--- a/stru11.h Fri Jun 14 16:06:20 2013 +0600 +++ b/stru11.h Fri Jun 14 16:06:30 2013 +0600 @@ -1,54 +1,12 @@ #pragma once -#include "mm7_data.h" /* 128 */ #pragma pack(push, 1) struct stru11 { - //----- (00438526) -------------------------------------------------------- - stru11() - { - stru11 *v1; // esi@1 - signed int v2; // eax@1 - char *v3; // edx@1 - v1 = this; - v2 = 0; - this->cpuid_00000000_eax_numops = 0; - this->cpuid_00000001_eax = 0; - this->cpuid_00000001_edx = 0; - this->field_38 = 0; - this->field_3C = 0; - this->cpuid_80000000_edx = 0; - this->cpuid_80000001_eax = 0; - this->cpuid_80000001_edx = 0; - this->cpuid_80000005_ebx = 0; - this->cpuid_80000005_ecx = 0; - this->cpuid_80000005_edx = 0; - this->cpuid_80000006_ecx = 0; - this->field_AC = 0; - this->uProcessorManufacturer = 0; - LOBYTE(this->cpuid_80000002_registers2[0]) = 0; - v3 = (char *)&this->cpuid_00000002_eax; - do - { - if ( v2 < 3 ) - *((int *)v3 - 9) = 0; - if ( v2 < 4 ) - *(int *)v3 = 0; - if ( v2 < 12 ) - *((int *)v3 + 17) = 0; - if ( v2 < 13 ) - this->pCPUString[v2] = 0; - if ( v2 < 30 ) - *((char *)this->field_40 + v2) = 0; - *((char *)&this->cpuid_80000002_registers2[0] + v2++ + 1) = 0; - v3 += 4; - } - while ( v2 < 48 ); - CheckCPU(); - } + stru11(); void CheckCPU(); void RunCPUID();
--- a/stru298.h Fri Jun 14 16:06:20 2013 +0600 +++ b/stru298.h Fri Jun 14 16:06:30 2013 +0600 @@ -1,5 +1,4 @@ #pragma once -#include "VectorTypes.h" /* 303 */ #pragma pack(push, 1)