From 7b633beda990e57aea4b3f6b648550c5e759c7d8 Mon Sep 17 00:00:00 2001 From: Alex Date: Sun, 28 Jun 2020 02:30:18 +0100 Subject: [PATCH 1/2] WIP: Various fixes * Fix faction rep import to at least work in SP ** Add UI for it. ** Make it remove existing avoidance lines. ** Make it check against -0.55 as that's the nodock value we use in Disco. *** TODO: should there be UI for this? ** TODO: Support for MP, and use of SP after use of MP. * Fix FLC crashing if you specify a very low maximum investment value. * Bump WindowsTargetPlatformVersion so it compiles on my system. --- Datas.cpp | 2 +- DynEconDlg.cpp | 86 ++++++++++++++++++++++---------------------- DynEconDlg.h | 2 +- FLCompanion.aps | Bin 391556 -> 391280 bytes FLCompanion.rc | 12 ++++--- FLCompanion.vcxproj | 2 +- FLCompanionDlg.cpp | 10 +++--- resource.h | 5 +-- 8 files changed, 61 insertions(+), 58 deletions(-) diff --git a/Datas.cpp b/Datas.cpp index 3041268..8a5e10b 100644 --- a/Datas.cpp +++ b/Datas.cpp @@ -1179,7 +1179,7 @@ BOOL LoadAppDatas(CWnd *wnd) GOODS_COUNT = 0; EQUIP_COUNT = 0; - //InitializeHashTable(); + InitializeHashTable(); DetectMod(); g_resourceProvider.Init(g_flAppPath); diff --git a/DynEconDlg.cpp b/DynEconDlg.cpp index 10f704e..7a8bb18 100644 --- a/DynEconDlg.cpp +++ b/DynEconDlg.cpp @@ -135,7 +135,7 @@ struct FlFactionInfo #define FLCREDITS_ADDR 0x00673364 #define FLPLAYERSHIP_ADDR 0x0067337C #define FLFACTIONS_ADDR 0x064018EC -#define FLPLAYERS_ADDR 0x064018C4 //0x064018C4 // FlTree des joueurs +#define FLPLAYERS_ADDR 0x064018C4 // FlTree des joueurs // 0x64018D8 = currentNode #define READFLMEM(structure,addr) if (!ReadProcessMemory(m_hflProcess, LPCVOID(addr), &structure, sizeof(structure), NULL)) return 0; #define READFLPTR(ptr,addr,size) if (!ReadProcessMemory(m_hflProcess, LPCVOID(addr), LPVOID(ptr), size, NULL)) return 0; @@ -371,63 +371,61 @@ int CGameInspect::DoTask(DWORD flags) } } } -#if 0 - if (true) //(flags & IMPORT_FACTIONS) + if (flags & IMPORT_FACTIONS) { - UINT changed = 0; + UINT removedAvoids = 0; + UINT addedAvoids = 0; CMap idFactionMap; UINT i; for (i = 0; i < FACTIONS_COUNT; i++) idFactionMap[FLFactionHash(g_factions[i].m_nickname)] = &g_factions[i]; - FlTree factionsTree; - READFLMEM(factionsTree, FLFACTIONS_ADDR); + DWORD player_id; + READFLMEM(player_id, FLCLIENTID_ADDR); - LPBYTE ptr; - READFLMEM(ptr, 0x61e0260); - DWORD player_id; - int oset = 0; - player_id = 0; - while (player_id==0) - { - READFLMEM(player_id, ptr + (4+ oset)); - oset += 4; - } + FlTree playersTree; + READFLMEM(playersTree, FLPLAYERS_ADDR); + FlNode playerNode; + READFLMEM(playerNode, playersTree._Head); + READFLMEM(playerNode, playerNode._Parent); + LPVOID playerPtr = TreeFind(playersTree, player_id); + if (playerPtr) + { + FlPlayer player; + READFLMEM(player, playerPtr); + int bytes = (reinterpret_cast(player._repsEnd) - reinterpret_cast(player._repsBegin)); + int count = bytes / sizeof(FlRep); + FlRep* reps = (FlRep*)malloc(bytes); + READFLPTR(reps, player._repsBegin, bytes); - FlTree playersTree; - READFLMEM(playersTree, FLPLAYERS_ADDR); - FlNode playerNode; - READFLMEM(playerNode, playersTree._Head); - READFLMEM(playerNode, playerNode._Parent); - LPVOID playerPtr = TreeFind(playersTree, 1); - if (playerPtr) - { - FlPlayer player; - READFLMEM(player, playerPtr); - int count = player._repsEnd-player._repsBegin; - //CScopedArray reps = new FlRep[count]; - //READFLPTR(reps,player._repsBegin, count*sizeof(FlRep)); - for (int index = 0; index < count; index++) - //if (reps[index]._rep <= -0.6) - { - //CFaction *faction = idFactionMap[reps[index]._faction_id]; - ////if (!faction->m_avoid) - { - changed++; - //faction->m_avoid = true; - } - } + for (i = 0; i < FACTIONS_COUNT; i++) { + if (g_factions[i].m_avoid) { + g_factions[i].m_avoid = false; + removedAvoids++; } - if (changed) + } + + for (int index = 0; index < count; index++) { + if (reps[index]._rep <= -0.55) { - Log(L"Imported from game: %d factions to avoid", changed); - g_mainDlg->Recalc(g_mainDlg->RECALC_PATHS); + CFaction *faction = idFactionMap[reps[index]._faction_id]; + if (faction != nullptr) + { + addedAvoids++; + faction->m_avoid = true; + } } - + } + free(reps); + } + if (removedAvoids > 0 || addedAvoids > 0) + { + Log(L"Imported from game: %d factions no longer avoided, %d new factions to avoid", removedAvoids, addedAvoids); + g_mainDlg->Recalc(g_mainDlg->RECALC_PATHS); + } } -#endif SetPriorityClass(m_hflProcess, dwPriorityClass); } return 1; diff --git a/DynEconDlg.h b/DynEconDlg.h index 747d420..2e2fb39 100644 --- a/DynEconDlg.h +++ b/DynEconDlg.h @@ -24,7 +24,7 @@ class CGameInspect IMPORT_PRICES = 0x01, IMPORT_CREDITS = 0x02, IMPORT_CARGOHOLD = 0x04, - //IMPORT_FACTIONS = 0x08, + IMPORT_FACTIONS = 0x08, }; int DoTask(DWORD flags); private: diff --git a/FLCompanion.aps b/FLCompanion.aps index 5f7daec2bf2ef2157c1ae30de0718a4483e9f3dc..ce79b1edc54b7bb14eafbbb086a75201163e382e 100644 GIT binary patch delta 4105 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 WN68SM+su-3?|PK@?B11Gi~j-=O#8|J diff --git a/FLCompanion.rc b/FLCompanion.rc index 8ef322b..4b2a42f 100644 --- a/FLCompanion.rc +++ b/FLCompanion.rc @@ -214,10 +214,10 @@ END ///////////////////////////////////////////////////////////////////////////// // -// IDConfig +// 256 // -IDR_MYTEXTFILE TEXTFILE "res\\IDHacks.ini" +IDR_MYTEXTFILE 256 "res\\IDHacks.ini" #endif // English (United States) resources ///////////////////////////////////////////////////////////////////////////// @@ -294,8 +294,7 @@ BEGIN PUSHBUTTON "Clear all",IDC_CLEAR_ALL_SYSTEMS,60,157,50,15 GROUPBOX "Exclude base by factions:",IDC_STATIC,125,15,110,160 RTEXT "Select Faction ID : ",IDC_STATIC,63,3,60,12 - COMBOBOX IDC_FACTION_ID, 125, 0, 150, 12, CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP - //LTEXT "[disabled]",IDC_STATIC,125,3,50,12 + COMBOBOX IDC_FACTION_ID,125,0,150,12,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP LISTBOX IDC_FACTIONS_LIST,130,25,100,131,LBS_SORT | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP PUSHBUTTON "Check all",IDC_CHECK_ALL_FACTIONS,130,157,50,15 PUSHBUTTON "Clear all",IDC_CLEAR_ALL_FACTIONS,180,157,50,15 @@ -399,6 +398,10 @@ BEGIN BOTTOMMARGIN, 69 END + IDD_LIMITATIONS_DIALOG, DIALOG + BEGIN + END + IDD_MININGBASE_DIALOG, DIALOG BEGIN LEFTMARGIN, 7 @@ -503,6 +506,7 @@ BEGIN MENUITEM "Bases prices (dynamic economy)", ID_GAME_IMPORT_PRICES, CHECKED MENUITEM "Your credits (max investment)", ID_GAME_IMPORT_CREDITS, CHECKED MENUITEM "Your ship's cargo hold size", ID_GAME_IMPORT_CARGOHOLD, CHECKED + MENUITEM "Your reputation (exclude hostile factions)", ID_GAME_IMPORT_FACTIONS, CHECKED MENUITEM SEPARATOR MENUITEM "Check/Uncheck all", ID_GAME_IMPORT_CHECKALL MENUITEM "About this feature...", ID_GAME_IMPORT_ABOUT diff --git a/FLCompanion.vcxproj b/FLCompanion.vcxproj index d950cec..ccdc2a1 100644 --- a/FLCompanion.vcxproj +++ b/FLCompanion.vcxproj @@ -15,7 +15,7 @@ MFCProj {919DA618-8031-401C-BAA1-0C4EC4219FCE} - 10.0.14393.0 + 10.0.17763.0 diff --git a/FLCompanionDlg.cpp b/FLCompanionDlg.cpp index 8dd89e1..6827126 100644 --- a/FLCompanionDlg.cpp +++ b/FLCompanionDlg.cpp @@ -155,9 +155,9 @@ BEGIN_MESSAGE_MAP(CFLCompanionDlg, CDialog) ON_UPDATE_COMMAND_UI(ID_MOD_INFO, OnUpdateModInfo) ON_BN_CLICKED(IDC_JUMPS, OnJumps) ON_BN_CLICKED(IDC_OPENMAP, OnMap) - ON_UPDATE_COMMAND_UI_RANGE(ID_GAME_IMPORT_PRICES, ID_GAME_IMPORT_CARGOHOLD, OnUpdateGameImport) + ON_UPDATE_COMMAND_UI_RANGE(ID_GAME_IMPORT_PRICES, ID_GAME_IMPORT_FACTIONS, OnUpdateGameImport) ON_COMMAND(ID_GAME_IMPORT_ABOUT, OnGameImportAbout) - ON_COMMAND_RANGE(ID_GAME_IMPORT_PRICES, ID_GAME_IMPORT_CARGOHOLD, OnGameImport) + ON_COMMAND_RANGE(ID_GAME_IMPORT_PRICES, ID_GAME_IMPORT_FACTIONS, OnGameImport) ON_COMMAND(ID_GAME_IMPORT_CHECKALL, OnGameImportCheckall) ON_UPDATE_COMMAND_UI(ID_GAME_IMPORT_CHECKALL, OnUpdateGameImportCheckall) ON_WM_ACTIVATEAPP() @@ -627,10 +627,10 @@ void CFLCompanionDlg::AddSolution(int goodIndex, double destbuy, double srcsell, { LONG profit; UINT units = m_cargoSize == 1 ? 1 : UINT(m_cargoSize/g_goods[goodIndex].m_volume); - if (units == 0) - return; if ((m_maxInvestment > 0) && (srcsell*units > m_maxInvestment)) units = UINT(m_maxInvestment/srcsell); + if (units == 0) + return; if (g_goods[goodIndex].m_decay_time == 0) profit = UINT(destbuy-srcsell)*units; else @@ -2010,7 +2010,7 @@ void CFLCompanionDlg::OnGameImportCheckall() if (m_importFromGame) m_importFromGame = 0; else - m_importFromGame = (1<<(ID_GAME_IMPORT_CARGOHOLD-ID_GAME_IMPORT_PRICES+1))-1; + m_importFromGame = (1<<(ID_GAME_IMPORT_FACTIONS-ID_GAME_IMPORT_PRICES+1))-1; theApp.WriteProfileInt(L"Settings", L"ImportFromGame", m_importFromGame); g_triggeredImport = true; ImportFromGame(); diff --git a/resource.h b/resource.h index a457ad4..998e686 100644 --- a/resource.h +++ b/resource.h @@ -2,6 +2,7 @@ // Microsoft Visual C++ generated include file. // Used by FLCompanion.rc // +#define IDR_MYTEXTFILE 101 #define IDD_FLCOMPANION_DIALOG 102 #define IDD_SPEEDDELAYS_DIALOG 103 #define IDD_SYSTEMMAP_DIALOG 104 @@ -20,7 +21,6 @@ #define IDI_JUMP 138 #define IDI_SWITCH_ARROW 139 #define TEXTFILE 256 -#define IDR_MYTEXTFILE 101 #define IDC_BASE_COMBO 1000 #define IDC_ROUTES 1001 #define IDC_SYSTEM_COMBO 1002 @@ -134,6 +134,7 @@ #define ID_GAME_IMPORT_PRICES 32800 #define ID_GAME_IMPORT_CREDITS 32801 #define ID_GAME_IMPORT_CARGOHOLD 32802 +#define ID_GAME_IMPORT_FACTIONS 32803 #define ID_VIEW_LOG 32811 #define ID_CLIENTREFRESH 32812 #define IDC_AVOIDGATES 32813 @@ -148,7 +149,7 @@ #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_3D_CONTROLS 1 #define _APS_NEXT_RESOURCE_VALUE 141 -#define _APS_NEXT_COMMAND_VALUE 32812 +#define _APS_NEXT_COMMAND_VALUE 32814 #define _APS_NEXT_CONTROL_VALUE 1068 #define _APS_NEXT_SYMED_VALUE 114 #endif From 65b2e3fdf4a0721ee9b6cfb6ea02fb59325a5798 Mon Sep 17 00:00:00 2001 From: Alex Date: Thu, 23 Jul 2020 20:25:51 +0100 Subject: [PATCH 2/2] WIP progress towards MP support for faction import --- DynEconDlg.cpp | 24 +++++++++++++++++++++--- DynEconDlg.h | 1 + 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/DynEconDlg.cpp b/DynEconDlg.cpp index 7a8bb18..94d6a86 100644 --- a/DynEconDlg.cpp +++ b/DynEconDlg.cpp @@ -277,6 +277,24 @@ HANDLE OpenGameProcess() return NULL; } +UINT CGameInspect::FoundPlayer(DWORD id, LPVOID ptr) +{ + FlPlayer player; + READFLMEM(player, ptr); + Log(L"Found player (ID %d): %s", id, player._playerName); + +/* + LPVOID playerPtr = TreeFind(playersTree, player_id); + if (playerPtr) + { + FlPlayer player; + READFLMEM(player, playerPtr); +*/ + + Log(L"Done with a found player"); + return 0; +} + int CGameInspect::DoTask(DWORD flags) { if (g_triggeredImport) @@ -386,9 +404,9 @@ int CGameInspect::DoTask(DWORD flags) FlTree playersTree; READFLMEM(playersTree, FLPLAYERS_ADDR); - FlNode playerNode; - READFLMEM(playerNode, playersTree._Head); - READFLMEM(playerNode, playerNode._Parent); + + TreeForEach(playersTree, &CGameInspect::FoundPlayer); + LPVOID playerPtr = TreeFind(playersTree, player_id); if (playerPtr) { diff --git a/DynEconDlg.h b/DynEconDlg.h index 2e2fb39..344b53e 100644 --- a/DynEconDlg.h +++ b/DynEconDlg.h @@ -29,6 +29,7 @@ class CGameInspect int DoTask(DWORD flags); private: UINT CollectGoodPrice(DWORD id, LPVOID ptr); + UINT FoundPlayer(DWORD id, LPVOID ptr); UINT CollectFactions(DWORD id, LPVOID ptr); UINT CGameInspect::TreeForEachRecurse(FlNode* nodePtr, FlNode* nodeNil, UINT (CGameInspect::*callback)(DWORD id, LPVOID ptr)); UINT TreeForEach(FlTree& tree, UINT (CGameInspect::*callback)(DWORD id, LPVOID ptr));