From 490626cecbe4680484babfa1a1e7f30d7dda005f Mon Sep 17 00:00:00 2001 From: Eugeny Pliskovsky <67909922+ugeen4@users.noreply.github.com> Date: Sat, 12 Nov 2022 18:56:14 +0300 Subject: [PATCH 01/14] integrate all CCS-specific changes --- src/libs/island/src/island.cpp | 10 ++++++++-- src/libs/weather/src/lightning.cpp | 12 ++++++++++-- src/libs/weather/src/lightning.h | 1 + src/libs/weather/src/stars.cpp | 2 +- src/libs/weather/src/sun_glow.cpp | 3 ++- src/libs/xinterface/src/nodes/xi_table.cpp | 3 +++ .../xinterface/src/scr_shoter/scr_shoter.cpp | 19 ++++++++++--------- src/libs/xinterface/src/xinterface.cpp | 6 ++++-- 8 files changed, 39 insertions(+), 17 deletions(-) diff --git a/src/libs/island/src/island.cpp b/src/libs/island/src/island.cpp index 452932e94..8b69652d2 100644 --- a/src/libs/island/src/island.cpp +++ b/src/libs/island/src/island.cpp @@ -97,6 +97,8 @@ void ISLAND::Realize(uint32_t Delta_Time) auto *pModel = static_cast(core.GetEntityPointer(model_id)); Assert(pModel); + auto *pSeaBed = static_cast(core.GetEntityPointer(seabed_id)); // !! + uint32_t bFogEnable; uint32_t bLighting; pRS->GetRenderState(D3DRS_FOGENABLE, &bFogEnable); @@ -143,6 +145,10 @@ void ISLAND::Realize(uint32_t Delta_Time) pRS->SetNearFarPlane((j == 0) ? fOldNear : fOldFar * static_cast(j), fOldFar * static_cast(j + 1)); pModel->ProcessStage(Stage::realize, Delta_Time); + + if (pSeaBed) + pSeaBed->ProcessStage(Stage::realize, Delta_Time); // !! + pRS->SetRenderState(D3DRS_LIGHTING, true); D3DLIGHT9 lt, ltold; pRS->GetLight(0, <old); @@ -184,7 +190,7 @@ void ISLAND::Realize(uint32_t Delta_Time) pRS->SetRenderState(D3DRS_ZWRITEENABLE, true); } pRS->SetRenderState(D3DRS_FOGDENSITY, F2DW(fOldFogDensity)); - +/* pRS->SetNearFarPlane(fOldNear, fOldFar / 2.0f); if (!bDrawReflections) { @@ -197,7 +203,7 @@ void ISLAND::Realize(uint32_t Delta_Time) } pRS->SetNearFarPlane(fOldNear, fOldFar); - +*/ pRS->SetRenderState(D3DRS_LIGHTING, false); pRS->SetRenderState(D3DRS_FOGENABLE, bFogEnable); pRS->SetRenderState(D3DRS_AMBIENT, dwAmbientOld); diff --git a/src/libs/weather/src/lightning.cpp b/src/libs/weather/src/lightning.cpp index 0c79c41f9..25ee3ff86 100644 --- a/src/libs/weather/src/lightning.cpp +++ b/src/libs/weather/src/lightning.cpp @@ -6,6 +6,7 @@ LIGHTNING::LIGHTNING() { iLightningTexture = -1; iFlashTexture = -1; + bLightningEnable = false; } LIGHTNING::~LIGHTNING() @@ -79,7 +80,7 @@ void LIGHTNING::Realize(uint32_t Delta_Time) uint32_t i; RS_RECT rs_rect; - if (iLightningTexture >= 0) + if (iLightningTexture >= 0 && bLightningEnable) { pRS->TextureSet(0, iLightningTexture); for (i = 0; i < aLightnings.size(); i++) @@ -97,7 +98,7 @@ void LIGHTNING::Realize(uint32_t Delta_Time) } } - if (iFlashTexture >= 0) + if (iFlashTexture >= 0 && bLightningEnable) { pRS->TextureSet(0, iFlashTexture); for (i = 0; i < aLightnings.size(); i++) @@ -198,6 +199,13 @@ uint32_t LIGHTNING::AttributeChanged(ATTRIBUTES *pAttribute) return 0; } + if (*pAttribute == "Enable") + { + bLightningEnable = pAttribute->GetAttributeAsDword() != 0; + core.Trace("bLightningEnable = %d", bLightningEnable); + return 0; + } + if (*pAttribute == "Texture") { if (iLightningTexture >= 0) diff --git a/src/libs/weather/src/lightning.h b/src/libs/weather/src/lightning.h index cc560f490..8407452ad 100644 --- a/src/libs/weather/src/lightning.h +++ b/src/libs/weather/src/lightning.h @@ -35,6 +35,7 @@ class LIGHTNING : public Entity std::vector aLightnings; + bool bLightningEnable; uint32_t dwSubTexX, dwSubTexY; int32_t iLightningTexture, iFlashTexture; diff --git a/src/libs/weather/src/stars.cpp b/src/libs/weather/src/stars.cpp index 2acfda97a..8e43ace8b 100644 --- a/src/libs/weather/src/stars.cpp +++ b/src/libs/weather/src/stars.cpp @@ -279,7 +279,7 @@ void Astronomy::STARS::Realize(double dDeltaTime, double dHour) auto fMaxMag = Bring2Range(fTelescopeMagnitude, fVisualMagnitude, 0.14f, 1.285f, fFov); - if (fabsf(fFov - fPrevFov) > 1e-5f) +// if (fabsf(fFov - fPrevFov) > 1e-5f) { float fTmpK[5]; float fTmpRnd[7]; diff --git a/src/libs/weather/src/sun_glow.cpp b/src/libs/weather/src/sun_glow.cpp index 4746c5220..6b830ef30 100644 --- a/src/libs/weather/src/sun_glow.cpp +++ b/src/libs/weather/src/sun_glow.cpp @@ -306,7 +306,8 @@ void SUNGLOW::Realize(uint32_t Delta_Time) // RS_RECT * pRSR = &aRSR[aRSR.Add()]; RS_RECT rect; rect.dwColor = makeRGB(r, g, b); - rect.fAngle = 0.0f; + rect.fAngle = fAngle; + //rect.fAngle = 0.0f; rect.dwSubTexture = pF->dwSubTexIndex; rect.fSize = pF->fSize * Flares.fFlareScale; rect.vPos = vSun + vDelta * (1.0f - pF->fDist); diff --git a/src/libs/xinterface/src/nodes/xi_table.cpp b/src/libs/xinterface/src/nodes/xi_table.cpp index 06b6c05d7..6c0ac9649 100644 --- a/src/libs/xinterface/src/nodes/xi_table.cpp +++ b/src/libs/xinterface/src/nodes/xi_table.cpp @@ -723,6 +723,9 @@ uint32_t CXI_TABLE::MessageProc(int32_t msgcode, MESSAGE &message) case 1: // get the line number on which the mouse pointer is located (-1 - the pointer is out of bounds) return GetLineByPoint(ptrOwner->GetMousePoint()); break; + case 2: + SelectLine(message.Long()); + break; } return 0; diff --git a/src/libs/xinterface/src/scr_shoter/scr_shoter.cpp b/src/libs/xinterface/src/scr_shoter/scr_shoter.cpp index 53471f70a..5ce0c02c0 100644 --- a/src/libs/xinterface/src/scr_shoter/scr_shoter.cpp +++ b/src/libs/xinterface/src/scr_shoter/scr_shoter.cpp @@ -4,8 +4,8 @@ #include "core.h" #include "string_compare.hpp" -#define SS_TEXTURE_WIDTH 128 -#define SS_TEXTURE_HEIGHT 128 +#define SS_TEXTURE_WIDTH 256 +#define SS_TEXTURE_HEIGHT 256 #define SS_TEXTURE_FONECOLOR 0xFF000000 uint32_t GetA8R8G8B8_FromFMT(void *p, uint32_t fmt) @@ -122,8 +122,7 @@ bool SCRSHOTER::MakeScreenShot() // create a new screen shot if (hr == D3D_OK) { - textureIndex_ = - rs->TextureCreate(SS_TEXTURE_WIDTH, SS_TEXTURE_HEIGHT, 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED); + textureIndex_ = rs->TextureCreate(SS_TEXTURE_WIDTH, SS_TEXTURE_HEIGHT, 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED); texture_ = static_cast(rs->GetTextureFromID(textureIndex_)); } @@ -168,9 +167,9 @@ bool SCRSHOTER::MakeScreenShot() pRenderTarg->Release(); // Add a texture with a frame to the shot - const int nTextureID = rs->TextureCreate("interfaces\\EmptyBorder.tga"); - if (nTextureID >= 0) - { + //const int nTextureID = core.GetTargetEngineVersion() >= storm::ENGINE_VERSION::TO_EACH_HIS_OWN ? -1 : rs->TextureCreate("interfaces\\EmptyBorder.tga"); + const int nTextureID = -1; + IDirect3DTexture9 *pScrShotTex = nullptr; if (D3D_OK == rs->CreateTexture(SS_TEXTURE_WIDTH, SS_TEXTURE_HEIGHT, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &pScrShotTex)) @@ -208,9 +207,12 @@ bool SCRSHOTER::MakeScreenShot() rs->TextureSet(0, textureIndex_); rs->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, BI_SCRSHOTER_VERTEX_FORMAT, 2, vert, sizeof(BI_SCRSHOTER_VERTEX), "battle_icons"); + if (nTextureID >= 0) + { rs->TextureSet(0, nTextureID); rs->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, BI_SCRSHOTER_VERTEX_FORMAT, 2, vert, sizeof(BI_SCRSHOTER_VERTEX), "battle_icons"); + } rs->SetRenderTarget(pOldRenderTarg, pStencil); } if (pRenderTarg) @@ -232,8 +234,7 @@ bool SCRSHOTER::MakeScreenShot() rs->Release(pScrShotTex); } - rs->TextureRelease(nTextureID); - } + if (nTextureID >= 0) rs->TextureRelease(nTextureID); return hr == D3D_OK; } diff --git a/src/libs/xinterface/src/xinterface.cpp b/src/libs/xinterface/src/xinterface.cpp index 538de7169..3670c0b22 100644 --- a/src/libs/xinterface/src/xinterface.cpp +++ b/src/libs/xinterface/src/xinterface.cpp @@ -1596,8 +1596,10 @@ void XINTERFACE::SetTooltip(const char *pcHeader, const char *pcText1, uint32_t CXI_BORDER *pNodFrame = pTmpNod ? pTmpNod->m_nNodeType == NODETYPE_BORDER ? static_cast(pTmpNod) : nullptr : nullptr; pTmpNod = FindNode("tooltip_titlerect", nullptr); - CXI_RECTANGLE *pNodTitleRect = - pTmpNod ? pTmpNod->m_nNodeType == NODETYPE_RECTANGLE ? static_cast(pTmpNod) : nullptr +// CXI_RECTANGLE *pNodTitleRect = + CXI_VIDEO *pNodTitleRect = +// pTmpNod ? pTmpNod->m_nNodeType == NODETYPE_RECTANGLE ? static_cast(pTmpNod) : nullptr + pTmpNod ? pTmpNod->m_nNodeType == NODETYPE_VIDEO ? static_cast(pTmpNod) : nullptr : nullptr; pTmpNod = FindNode("tooltip_picture", nullptr); CXI_PICTURE *pNodPic = From 6a684fca0bff4d49f15b27500b7bef279e532fa3 Mon Sep 17 00:00:00 2001 From: Aleksey Komarov Date: Fri, 2 Dec 2022 13:56:08 +0300 Subject: [PATCH 02/14] core: add search for a suitable aspect ratio for PC_SCREEN interface The search is performed on sections named PC_SCREEN_$W:$H, where $W:$H can be 5:4, 4:3, 16:10, 16:9, 21:9 or other. The aspect ratio of game window may not match exactly, but it should fit in +3%/-3% of the aspect ratio = $W:$H. If suitable PC_SCREEN_$W:$H was not found, then fallback to default PC_SCREEN section. --- src/libs/xinterface/src/xinterface.cpp | 35 +++++++++++++++++++++----- 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/src/libs/xinterface/src/xinterface.cpp b/src/libs/xinterface/src/xinterface.cpp index 3670c0b22..5f253d086 100644 --- a/src/libs/xinterface/src/xinterface.cpp +++ b/src/libs/xinterface/src/xinterface.cpp @@ -1063,27 +1063,24 @@ void XINTERFACE::LoadIni() // GUARD(XINTERFACE::LoadIni()); char section[256]; - auto platform = "PC_SCREEN"; auto ini = fio->OpenIniFile(RESOURCE_FILENAME); if (!ini) throw std::runtime_error("ini file not found!"); + int sdlScreenWidth, sdlScreenHeight; #ifdef _WIN32 // FIX_LINUX GetWindowRect RECT Screen_Rect; GetWindowRect(static_cast(core.GetWindow()->OSHandle()), &Screen_Rect); + sdlScreenWidth = Screen_Rect.right - Screen_Rect.left; + sdlScreenHeight = Screen_Rect.bottom - Screen_Rect.top; #else - int sdlScreenWidth, sdlScreenHeight; SDL_GetWindowSize(reinterpret_cast(core.GetWindow()->OSHandle()), &sdlScreenWidth, &sdlScreenHeight); #endif fScale = 1.0f; const auto screenSize = core.GetScreenSize(); dwScreenHeight = screenSize.height; -#ifdef _WIN32 // FIX_LINUX GetWindowRect - dwScreenWidth = (Screen_Rect.right - Screen_Rect.left) * dwScreenHeight / (Screen_Rect.bottom - Screen_Rect.top); -#else dwScreenWidth = sdlScreenWidth * dwScreenHeight / sdlScreenHeight; -#endif if (dwScreenWidth < screenSize.width) dwScreenWidth = screenSize.width; GlobalScreenRect.top = 0; @@ -1091,6 +1088,32 @@ void XINTERFACE::LoadIni() GlobalScreenRect.left = (dwScreenWidth - screenSize.width) / 2; GlobalScreenRect.right = screenSize.width + GlobalScreenRect.left; + char platform[23]; + bool sectionFound = false; + if (ini->GetSectionName(platform, sizeof(platform) - 1)) + { + float windowRatio = (float)sdlScreenWidth / (float)sdlScreenHeight; + float iniRatio; + char splitPlatform[23], *platformW, *platformH; + do + { + if(starts_with(platform, "PC_SCREEN_")) + { + strcpy_s(splitPlatform, platform); + platformW = std::strtok(splitPlatform, "_:"); // PC + platformW = std::strtok(nullptr, "_:"); // SCREEN + platformW = std::strtok(nullptr, "_:"); // Width + platformH = std::strtok(nullptr, "_:"); // Height + iniRatio = (float)atoi(platformW) / (float)atoi(platformH); + // +- 3% + if (iniRatio*0.97 <= windowRatio && windowRatio <= iniRatio*1.03) + sectionFound = true; + } + } while (!sectionFound && ini->GetSectionNameNext(platform, sizeof(platform) - 1)); + } + if (!sectionFound) + strcpy_s(platform, "PC_SCREEN"); + core.Trace("Using %s parameters", platform); sprintf_s(section, "COMMON"); // set screen parameters From 0d939620967551947d8dc3744563277d191a531a Mon Sep 17 00:00:00 2001 From: Aleksey Komarov Date: Tue, 13 Dec 2022 22:00:45 +0300 Subject: [PATCH 03/14] worldmap: allow to hide Wind UI from scripts Just add this line in scripts to to hide Wind UI: SendMessage(&worldMap, "ll", MSG_WORLDMAP_WIND_UI_SET_SHOW, false); --- src/libs/shared_headers/include/shared/messages.h | 2 ++ src/libs/worldmap/src/wdm_objects.cpp | 1 + src/libs/worldmap/src/wdm_objects.h | 1 + src/libs/worldmap/src/wdm_wind_ui.cpp | 3 +++ src/libs/worldmap/src/world_map.cpp | 3 +++ 5 files changed, 10 insertions(+) diff --git a/src/libs/shared_headers/include/shared/messages.h b/src/libs/shared_headers/include/shared/messages.h index 52b7b7140..ddc4a0287 100644 --- a/src/libs/shared_headers/include/shared/messages.h +++ b/src/libs/shared_headers/include/shared/messages.h @@ -247,6 +247,8 @@ #define MSG_WORLDMAP_SET_NATION_FLAG 31150 // "ll" nation // Print line with coordinates #define MSG_WORLDMAP_SET_COORDINATES 31151 // "ls" coordinates string +// Show or hide WdmWindUI: wind, date, moral, supplies, coordinates, flag +#define MSG_WORLDMAP_WIND_UI_SET_SHOW 31152 // "l" // ============================================================================================ // Effects diff --git a/src/libs/worldmap/src/wdm_objects.cpp b/src/libs/worldmap/src/wdm_objects.cpp index 29180184c..f5a1b6a15 100644 --- a/src/libs/worldmap/src/wdm_objects.cpp +++ b/src/libs/worldmap/src/wdm_objects.cpp @@ -39,6 +39,7 @@ WdmObjects::WdmObjects() islands = nullptr; playerShip = nullptr; isDebug = false; + showWindUI = true; Clear(); enemyShip = nullptr; enableSkipEnemy = false; diff --git a/src/libs/worldmap/src/wdm_objects.h b/src/libs/worldmap/src/wdm_objects.h index 312098374..dcd7bd566 100644 --- a/src/libs/worldmap/src/wdm_objects.h +++ b/src/libs/worldmap/src/wdm_objects.h @@ -99,6 +99,7 @@ class WdmObjects bool isPause; bool isDebug; + bool showWindUI; void DrawCircle(const CVECTOR &pos, float radius, uint32_t color) const; void DrawCircle(CMatrix &mtx, float radius, uint32_t color) const; diff --git a/src/libs/worldmap/src/wdm_wind_ui.cpp b/src/libs/worldmap/src/wdm_wind_ui.cpp index 9cd0a58e4..3d99d8f1e 100644 --- a/src/libs/worldmap/src/wdm_wind_ui.cpp +++ b/src/libs/worldmap/src/wdm_wind_ui.cpp @@ -352,6 +352,9 @@ void WdmWindUI::SetAttributes(ATTRIBUTES *apnt) // Rendering void WdmWindUI::LRender(VDX9RENDER *rs) { + if (!wdmObjects->showWindUI) + return; + if (wdmObjects->isNextDayUpdate) { auto *data = core.Event("WorldMap_GetMoral"); diff --git a/src/libs/worldmap/src/world_map.cpp b/src/libs/worldmap/src/world_map.cpp index 7694a98d3..e0d89f0a2 100644 --- a/src/libs/worldmap/src/world_map.cpp +++ b/src/libs/worldmap/src/world_map.cpp @@ -604,6 +604,9 @@ uint64_t WorldMap::ProcessMessage(MESSAGE &message) case MSG_WORLDMAP_SET_COORDINATES: wdmObjects->coordinate = message.String(); break; + case MSG_WORLDMAP_WIND_UI_SET_SHOW: + wdmObjects->showWindUI = (message.Long() != 0); + break; } return 0; } From 10730806604a192cc48e9f99b70d477d8d69010f Mon Sep 17 00:00:00 2001 From: Eugeny Pliskovsky <67909922+ugeen4@users.noreply.github.com> Date: Sun, 15 Jan 2023 16:23:36 +0300 Subject: [PATCH 04/14] add last changes from main develop --- src/CMakeLists.txt | 3 + src/apps/engine/rsrc/icon1.ico | Bin 287934 -> 471248 bytes src/apps/engine/src/main.cpp | 2 +- .../include/{utils.h => bi_utils.h} | 4 +- .../{include => src}/active_perk_shower.h | 0 .../battle_interface/src/battle_command.cpp | 62 ++- .../{include => src}/battle_command.h | 20 +- src/libs/battle_interface/src/battle_sign.cpp | 2 +- .../{include => src}/battle_sign.h | 0 .../src/{utils.cpp => bi_utils.cpp} | 39 +- .../battle_interface/src/image/img_render.cpp | 2 + .../interface_group/sea_group.cpp | 2 +- .../src/interface_manager/mouse_pointer.cpp | 2 +- .../src/item_entity/item_entity.cpp | 2 +- .../battle_interface/src/land/battle_land.h | 2 +- .../src/land/battle_man_command.h | 2 +- .../src/land/battle_man_sign.cpp | 2 +- .../{include => src}/log_and_action.h | 2 +- .../battle_interface/src/message_icons.cpp | 2 +- .../{include => src}/message_icons.h | 0 .../src/sea/battle_navigator.cpp | 511 +++++++++++++++--- .../src/sea/battle_navigator.h | 60 +- .../src/sea/battle_ship_command.h | 2 +- .../src/sea/battle_ship_sign.cpp | 2 +- .../battle_interface/src/sea/i_battle.cpp | 4 +- src/libs/battle_interface/src/sea/i_battle.h | 2 +- .../src/sea/ship_info_images.cpp | 2 +- .../src/spyglass/spyglass.cpp | 2 +- src/libs/battle_interface/src/timer/timer.cpp | 2 +- .../src/world_map_interface/ship_command.h | 2 +- .../src/world_map_interface/ship_sign.cpp | 2 +- .../src/world_map_interface/ship_sign.h | 2 +- src/libs/core/include/attributes.h | 39 +- src/libs/core/include/core.h | 2 + src/libs/core/include/v_file_service.h | 1 - src/libs/core/src/attributes.cpp | 74 ++- src/libs/core/src/compiler.cpp | 72 ++- src/libs/core/src/compiler.h | 8 +- src/libs/core/src/core_impl.cpp | 74 +-- src/libs/core/src/core_impl.h | 4 +- src/libs/core/src/entity_manager.cpp | 137 ++--- src/libs/core/src/entity_manager.h | 66 ++- src/libs/core/src/expression.cpp | 8 +- src/libs/core/src/internal_functions.cpp | 29 +- src/libs/core/src/s_functab.cpp | 9 + src/libs/core/src/s_functab.h | 1 + src/libs/core/src/string_codec.cpp | 116 ---- src/libs/core/src/string_codec.h | 188 +++++++ src/libs/core/src/string_codec.hpp | 42 -- src/libs/dialog/src/dialog.cpp | 7 +- src/libs/geometry/include/geos.h | 2 +- src/libs/lighter/src/l_geometry.cpp | 2 +- src/libs/location/src/character.cpp | 22 +- src/libs/location/src/character.h | 6 +- src/libs/location/src/fader.cpp | 101 ++-- src/libs/location/src/fader.h | 2 +- src/libs/location/src/location.cpp | 9 + src/libs/location/src/model_array.cpp | 12 + src/libs/location/src/model_array.h | 2 + src/libs/location/src/np_character.cpp | 15 +- src/libs/location/src/supervisor.h | 1 + src/libs/model/src/model.cpp | 2 +- .../particles/src/k2_wrapper/particles.cpp | 1 - src/libs/renderer/include/dx9render.h | 27 +- src/libs/renderer/src/font.cpp | 4 +- src/libs/renderer/src/s_device.cpp | 105 ++-- src/libs/renderer/src/s_device.h | 30 +- src/libs/renderer/src/storm_d3dx9.cpp | 2 + src/libs/rigging/src/sail.cpp | 9 +- src/libs/rigging/src/sail.h | 2 +- src/libs/sea_ai/src/ai_balls.cpp | 42 +- src/libs/sea_ai/src/ai_balls.h | 1 + src/libs/sea_ai/src/ai_cannon.cpp | 14 +- .../sea_ai/src/ai_ship_cannon_controller.cpp | 20 +- .../sea_ai/src/ai_ship_cannon_controller.h | 2 + src/libs/sea_ai/src/locator_show.cpp | 20 +- src/libs/sea_ai/src/locator_show.h | 5 +- src/libs/sea_ai/src/sea_ai.cpp | 5 + src/libs/sea_foam/src/seafoam.cpp | 2 +- src/libs/sea_foam/src/t_carcass.cpp | 2 +- .../shared_headers/include/shared/events.h | 8 + .../shared_headers/include/shared/messages.h | 3 + .../include/shared/sea_ai/script_defines.h | 2 + src/libs/sound_service/src/sound_service.cpp | 70 +-- src/libs/sound_service/src/sound_service.h | 22 +- src/libs/util/include/fs.h | 4 +- src/libs/util/include/probability_table.hpp | 69 +++ src/libs/util/include/rands.h | 8 +- src/libs/util/include/utf8.h | 2 + src/libs/util/testsuite/probability_table.cpp | 128 +++++ src/libs/weather/src/planets.cpp | 2 +- src/libs/weather/src/sky.cpp | 6 +- src/libs/worldmap/src/wdm_enemy_ship.cpp | 6 +- src/libs/worldmap/src/wdm_enemy_ship.h | 2 +- src/libs/worldmap/src/wdm_islands.cpp | 14 +- src/libs/worldmap/src/wdm_objects.cpp | 1 + src/libs/worldmap/src/wdm_objects.h | 1 + src/libs/worldmap/src/wdm_player_ship.cpp | 15 +- src/libs/worldmap/src/wdm_storm.cpp | 2 +- src/libs/worldmap/src/wdm_storm.h | 2 +- src/libs/worldmap/src/wdm_wind_ui.cpp | 3 + src/libs/worldmap/src/wdm_wind_ui.h | 2 +- src/libs/worldmap/src/world_map.cpp | 5 +- .../xinterface/src/editor/editor_defines.cpp | 2 + src/libs/xinterface/src/info_handler.cpp | 90 ++- src/libs/xinterface/src/info_handler.h | 3 + .../xinterface/src/nodes/xi_quest_texts.cpp | 12 + .../xinterface/src/nodes/xi_quest_titles.cpp | 19 +- .../xinterface/src/nodes/xi_quest_titles.h | 1 + .../xinterface/src/nodes/xi_text_button.cpp | 1 - .../src/storm/xinterface/options_parser.cpp | 2 + src/libs/xinterface/src/string_service.h | 2 +- .../src/string_service/str_service.h | 2 +- src/libs/xinterface/src/xinterface.cpp | 119 ++-- src/libs/xinterface/src/xinterface.h | 4 +- .../xinterface/testsuite/options_parser.cpp | 16 +- 116 files changed, 1855 insertions(+), 884 deletions(-) rename src/libs/battle_interface/include/{utils.h => bi_utils.h} (93%) rename src/libs/battle_interface/{include => src}/active_perk_shower.h (100%) rename src/libs/battle_interface/{include => src}/battle_command.h (88%) rename src/libs/battle_interface/{include => src}/battle_sign.h (100%) rename src/libs/battle_interface/src/{utils.cpp => bi_utils.cpp} (94%) rename src/libs/battle_interface/{include => src}/log_and_action.h (99%) rename src/libs/battle_interface/{include => src}/message_icons.h (100%) delete mode 100644 src/libs/core/src/string_codec.cpp create mode 100644 src/libs/core/src/string_codec.h delete mode 100644 src/libs/core/src/string_codec.hpp create mode 100644 src/libs/util/include/probability_table.hpp create mode 100644 src/libs/util/testsuite/probability_table.cpp diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index f0031d4e7..ea6eb8d27 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -49,6 +49,9 @@ else() # Always generate debug information add_compile_options(-g) add_link_options(-g) + + # Add _DEBUG flag + set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -D_DEBUG") endif() # this is crucial to include libs first diff --git a/src/apps/engine/rsrc/icon1.ico b/src/apps/engine/rsrc/icon1.ico index 359173d65f950db5767c176c945bbe97f960dfe5..16db838121a684f5035f04cc09d631e521168868 100644 GIT binary patch literal 471248 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�kztNg)8r{r6{^ETethp>s^%hT+HJW zDNWS1ftt8yo{H5q?UY$ob$TNXa-*4RY{|=m$tMdL7TU070AL;p@FVn7{UI@&!kYzi!?IM1M|F^FguT)Z z81Z(~L;B{As&lG1>CUq_ZEt3X@$LSK2{eqRAq38D<-K*9&WeJ3EVJ|YT|BYI%ay*A z*o$P5kDU7okBvAsR8OY>PQR8i$V?9$U;Hal9}hjE|1QRL*Hd-~nIkxg8}E_&q7-4M zXT%W^0tqlCad~uHBo)M&oZ)Ub%H(DfXBB8z--Au5)X-h|n42~FqV*F6>p5K<_>e3& zPy0EAGEzM>hr)l2ND5pDPKMMew6=hX{cI`9r{wONtN)_o$O#i%$EK$TX6)fAo$!%cPgZHoH?LWEuilpDsLGXyo z`c+@tFyCz0!MnLL!|qWgP(@r0MTRwJH`m=E-!qRqG4IirpM0L529>3K)!iZzV@++) zeT%VB#|7T2MP08-D3sh-ER=R1 zW>f#C@<>K?d0ym|cwhf&@?4^}>__*8 z_$x9UXp6T~+ zqW($XQ8Haf>u{3k+~Rb&ErkQNOv5nlceV>yIXR4XDwT0Ae@?t4orHeJygu3TmY8WH zA&g6ASeGTG^2$LQ<%UCdeo3Jo$6$+c{cZ6GMZKBeEU=qj7&5X-!uk<;ZyX%E6 zmvpc#(}#b{BX6!VBM%LcZSFGMXcqC<-dvu?A)2k9)NW&!a1bu0gjLR0v;i`Kp>c`g zuwQkSCj(7Ww=upx7(4QUE8UA0gF$WeLNfz+Teg>0WD$6xa&_4}gz4HG-&v+)T=MRg z?7bN;4|3gy1+8J!F)d$)AUlf*mqB%~j3ZAH`e@%fb$Xh4xw_(smo$`p zk1oEkO145g%AqRI37abSKT0{GKiYM80iznZkNfgoh{m?P3Zm(%+xS(uPT%~=UHWTe z+-9J3RLd~QcgqhmM-dEBr*$nY^AD={NC%$dJgJMRT8n!>693c9RWh7}eVF~wrM7}* ze^3>&OG73nuO;T z-{jWhrc2DRCV(oJ5~7^Q!%Mg{;EPIG@;#?8jJ`*TEOY+5idH-AN`#3|;*#j5b>}9vtjaw0L=M<y(D9t%C94xkb2u%Qr$n%KbVZg}5Zg!hoemIqLcO zdFRK)FV|_yO3GBHqLv^1-%$}}iBiw|XuR@{k|_&4-NU#r@=@OTIi_n-Aa7LiHzMQ1 z;tkcbaHm*y800K-cgM-VAOjjAt+%IQ0el!MV|Y%UtEUY8E1V@#UDp)8#aLwG2!9Py z&AqUHh$Cc_{TkRhn%Paa@%Y(vqMA{RxGp5sk?XIVs*RGMf5rTkyD%S zKE6ONN`0HpA~z>|I7vdQ>CYqXeMqxQ0n;2gy{CNHEGrS+nf_l)T_o_wZgowwlTyB3 zr3<*Hf?{bNkR|l#3PAp*>m-CN$_on_-}|8prBEb~AYuzm>9+pax`q4bD34!nd z0E2Yy1w`wcX=!>;Y`Xh#4$C&w6dx~naAY0$B1rs;cSb&s z2X|<#zq-dvZRO~r6rXmAjBP8i#3|Zew)M9(LsSf6Dy5|!JDqeKs6UT;=z1FWAw}!Q z#uYz<#Fwc@CcYTnJ|-`*-6JKnhXTqiUU6AXdDV_uGl&DNij35HGR*rfnI7^@CF1n_ zU|U=nz3aVRYcK3SLEh_ea^IsCFAVh*Cuy%7oA1(xV)xzb`V=DJb;Hdh5Q=1ycDVZe z@@){3zHHy#cAxRfpD;`?rgKpYHcXw(D*B@(2>W8ry$|(hya1Mg6doEWA+(pUJN3P& z;1`~*2z;nNP+dtkYAo)Q1s-vx6bg9?&%U0j%_XZU{d$Mqe$6xOo2_RnZa0^dySn%8 zy~@FY3Gq9z;YB$62myldRkJ11`mqXhvJE6Q6i4$fU@_Y=Quq27S1hV!j+)%4lgHU- z+bJHY)K1pMMhhP>8kSU8e2Fa_*r`&H1@ew1h)omiq!eE zU~_Kl*)u8eVRD{h10k#N28lMMYRY4!4fil4Ef5MOOL0-|GekQSwl_N&RD@{DFn*Pq zhQ^LQ&(>w)C011(PB+Z{!)-;9JFssPrqJ9KUas)H;Tf&D%6vbqJ;1=ijGVSE%v{Ven&R+0 zGf_S<*|cNh4_Yi5;rhTQjr`kiJ=?Vb*;~x9wqV@-0wcUYrW(d^x4sz@NWRF^Xq>S z0tZA9?yu}!w4QebT^C(Azxi4TJilH7SR!;DfUY{ zpV$NV7Box0H`o9Cox@+Ph+kTPD6^+j{1J6gj=z6qe3N4>?F4r`B&N{d*kBukBAb_w02EsT{CHQ27f;=tNN4z z5>$JiRk)O2`DgTYwNIR%wd>u_xG^s#&?A{J_oS4bPU2!2vA|GoRbBpxJj9KEEDuQ4 zVs!g8s}LFm5HB(A`ZK`>T)vnZ~b#XWHR_{HT>hV(IUFUIs?DcF32h9q^8{fFpXipn7PXlr8z2lgG{yWUcu5oOgR~ zFYU{7`I(%+s}o)_1|aVJP9YoF%=y+%MMXkvJzMx*2fhPNI>=@|S8hv{tF3I2kU>Zq zB5=78mqMH>^;-yA#Z0ObA9Dd=`dphn_r1T3)8EE|c)94L298KBc&Tmmr=QgSIW3t} zj&w-~9Q5)wPOV+u^YZ+s{tW5ONoZnftOdd=gin7`@gky-)=coKRA^X)d>2~h3 z-4@^N3{?KsS=5g4T6=`vUd9O8Z-j|v#QDr@pw z3?iFt-39mAeDPbC5`Q#bh^FEzIjt3kUfEd44sy$z{vZ9Le>4bPwq1+>fKW)`ASqR! z-}}AaJHE>ky!iC&y=>C;9W#|99;AlxD5(h`%~=aR01zU(tM79x+Xrh0F_#k9d@(LQ z_r5V#oTzGU#!-YsIqYNbj4kuWxHN0=AA8mqauUqs(3vQ)QC{0QY1)&*4>Kcq2f@xE zv2$HCLZ0!Zz0K6&dkm2|IatYkr=eZUuCr(@og-(W5Vy+E zI+NNdF_Z5q&SY&!-QLB3H0~1ZWWp**PRvkAnEaGgug{&&v<5L#?Q_}(V=7w5+}`%K zw~cqq1@mGog(~{&P}*DTj-e_8roJ(V_Q?CzpnH`;6KnQ1MEDAsC!ld3Wdt54Ihy{YnF|QJ= z5r~ktca6tqq_?DlGPpr(q^sGcojR}7s>St!%F@PYAaq42q@^e!%Y5nc?j|i7XL-f- z838sf{rMNc`Dg#^pN+9A%_>j3wJNJ1$-R9p!U6Kdz@%258LzS~nimEl^)6yv{&M5a zBiyt0v$ZelpY=y@@>n-dDqElVF<#QAHX%jGne+xxXN$J?###}b7%d3AY==qUnUm5G zg?O`R`>~!yndDajtWm1x`nQ(Gl!tnAH^!VKty{@q3gPpPF_Abi3J9n7XgaDjkh(gj z!V2j)=YEVm^OH8%r*jgsR`%BUC}U-3G_yvU3;kAafbHKJ(b|+dp+rR8m+BsrQ=n)J zZAcZ}-U4$dA4jzv{Mh5v>c#k5Z*6kwvv%4c@ncS{S$X)w70!q8VfI8#q&b{J8FLuL zgjQ$3nwIWc|2bD$2lr8*o-Hz=%#ZfYI#}1vgn1PW;`|x6`(}R&JAE$AX=$y2;zahO zh?&YL&-Z>mWbjVlg(lF^gSoVD`*Jtwh)>||;1$OJ#Qo19GqqFVmYD%4p+=tgE<-A? zIPT)Gas)3AS4>$nX`RW{KIDz`svb_paZeaaW4-goNEE5B>q*mVEhzx#Is z(NK-j5@fQNor-eO(;uQrinLx8HVJ8Fx*=IX#Hl+m3wg&E51sQ|1zbw@1WMAB!;^g{ zRa@I47Ahr60{~Hb-@3K;X^_gw=yPo~X3X7O>?IHK2vwRUpQYZ;j8m9hp>jEh<{gf) z%4`IT%ibeI&XzTp znb`&NYW!u3bZ4q)X^b&X&Ly)(wLz?5W+z~5q<8!1O!}@A$1#7UiZ;JF2ZFwtD@v;6 zPJ1pBl{w}lT(YFX2g|m390RaVxC=Ek2gKi8s}oT>Go(e`&szCh@Io>Gg+V6F6>6D7 z>Pf+%7Y|-B3_yn>E-?u<@7N@!8NuecUHR26D+J;vf|v7D421T(tf~L=^sho-sz=D6 zN@x&Vs@yWyRbZ&Bd&OUu*0BY%ombLD$H(+aHsCiRtmXl-?OQy zORZYM8iXpwL|bf}Axvs_(i@~qG7=+=03s$o@e@BW?EHw$5B}f}j=m~UTF!(Jt??8s z0L%?RhMawmVX=3R7Gm4QXBW@6gRM4Ian=6{#caLOrU25g{_RB-6GO0|yzlnRd}CfR z_h2|~*zf!9-97WS?BoFa+xk)zGsZ(*=I4K)&P^b z#Oa?#s5UouXWw_HPAwX(JllPy&l|%t{Pe2v;_<$giM?_2*3I2r;?dCN%;_`Z-=phW z>2i$g+~y2tvZEX0`KOGm{n&lLg@_CczG7nQkbN3T{&s~3Wcnu`o}PtyE{IY2WL6~ z)}sVqm`(G>L>FRQR7TkftNaJjGL{%CljqC;6gs@0Ya$%RR6#({E^UXO*>@-0wx6%! zPT+-P0LpvP+JdyBv-9?eL*fe$uLuSJR3R&8l`c!^Sd#+!t~9i%SPN^)BR;ip>0h(A zmA5=XQ{^@nxPm{K4yvjbr|)t>K;^+NrD#&HXG_If^|TImPE;p&$C8!3<>|h1641QU_bNQW?+EOzWjBU@b}+8>2@0 zyYJphn{(%xbZ%^3`%u#G&D9ovY7lh)Mto0~UGL2D`(Q?=uu`9$IlG-kn%C&#RCn*@s-;;zINCB47!1tF^`jfR@t!`lWoplz9}LgctJene z@x?Fv#daU%Sh&1--H0sUKl9|y;~jyu*Uq1_(3vUqu(O_jLg{u3o6HH%Im}_PIr)9A z72!NMBZb7qyi@|2MvEECJDzh-oNedN-AvmQk@p;i7Nb!pU?IlNWqv=-a>>Pv-F?az z#TeX&Oc$6}ZDVNs?am}D)W*yJ#LgJ71c>)E*wvL|MkEA*Ui8ExBqsm5h*BpWvcp^55LQJ zR>2sc4!ZGCEtB>kNl4UlfQcc;N(ce-pk4E%!Xzz`oXiKi@=4h~uCXDce79?1k^;PZQ&C z?b`KKLOwG-tG#QZ2-nq}Y2@^2&VSF0=bhtw?v<6ejtt1#1*3{>?nJG4m#yZpS@92 z@28gZeGYNi|1&A%98@?_wnk$t$x055+2CFJs(pdHw#y^ndD2K(ydXXV(EB+3yxz01 z7bc`#|5i|>{xBisP@vxQTnTTi4d*TGR@T__h<9@?3IQ^VF{WAlKJM# z6Rzye_^IW2{~p~q8WQ^{jKrC<r}3Z{BJ6e>%H<10N*iRm;>pa6rXR0@7z6S zv%LBxk}BCx=OXi1K1sAv2^y*8F)2l)a8^xI(3l4kyY6RaZXeR*F@gD>mZhXWr=~Mh zo{B?NEBD)r0ckET76UM6kUSywFFw3v48U=jry}CVy_47d93quhd>Vzh?CG5TGEeBz zr$(d^=VEWmjI|FXu}OnauJ}0UasgB}wQ(3{$$JplRBvTYn`596$t34&isj7@N>_}- zhphAm0U2Mm{uqGb$Gc40GIzu_<^r;z`pi$E%xsbiCDl=}Vp@#9*!i56lFBOSn?p|$ zm}eo=7yuzz=Fb+Ye{Fllv$PA87tRmD zd2#p$oE?Pz{JFEM4fV|O*;)4S(}U5(ZmScDr>wrtKMQPW(nuUD%qc3H3Sh{&n>F@qalrtwO#!Kj@EHuTAqI9 z*`fYV&7T@SFz08USycbsBU1M1b=;fvZ)>?QsaIDsNXdC>>*j8(V3Ew0Zja!Vt_-u1?{Jos>tu%T4+QPuxyt!k@Mk1r9pI!YVPK|xIvF^A3uMX)Kll%1M z(V=0wwq1v-Tc+@jcO`lKkleGsmwO?zUgd)MujFS?XrsGTG9@N3_I&MP!e^((GI{10 zi6JPvsP&^ktDcDOw4Jsp+*AaQw$!vJEw?+EV{IXgCFk+1e&&Qft#3}NCE3D2hmYFR zOrbM=06B!t=BIp+3N^l4bHVeW4bA0FpN~m7fxCm3T_(VY{2|y+hZ+L)e6_jruGgOW=2_>_Kxl!%MR8fIeN|kCp1ewMI6QCb+^n4DO z)^M&#p#5L`#b4abCGTxW36N}j$FHEuhJMP+U`?1UVk)Y{=ChA|>?2!bc<)e^BbrM_ zzw=ur;QS!|=g;-oxz)@0+)gT9_Tc?f($Ea71pZbw z%CkG^YA5-xOePyR(C;u~QFE>m{neErj4?R7GPJ{dv3@tkx|y^9Nn|U7*{wJ~2>hv` zMn`068U|D0ztyHsy+6WQ`36wUZx&yIt0OFJk>s^=W|&9L45E8#o%gl%dCbA$ZT{@| z?ED%gdwOMvv~$D^)tZs)Z`|^MSo|WE^^VD$(;IvC==$PkU@khPy&0vpSBFMzWdbQA zc$h0_{CdL_co)GkWNobTr3KT_BCcT^w-FF%++NSL1 zF|*ES8Zpn7TcU^ypL?zx3GP+N!s@?L$ZuK8XlvWN+(S6Q{V;|qi2z621zJkiGLe;9G)Xo|ze@`VHl z@ZFLb@4}XtF2o%H_OH)|WJ78n&Yb7QclY0S?;vvb-g9|%@?10mIqZ?RhwsH;lFkjO z9xRT2t25tbb>Q3n{p^-d(mGsUwKa%fngF)#vm-t9_3_!o)o(=$Pd)X_=EAD2NRmA> zOj{SW67MsMNn!i>71BZ|NqT+kDM`YtnG}r`kRw>;QG;M?`SX;&da6ElTR_# zJ-GSZ-}~@5zcgp=K3|kV>~bc=2q2)w=^QHzl#`mXmjj=_ORPnc=Dd1GBm*;AWyyV( zrmqO5szLf5!A9)EEv3HZkn4HOvwKs?@*)Ec`BCMY0?(O?@w!9#=*$@?=MvJstBiED zMc}fkN9waeT6g2W^}hm+j*h-e>vaNm2CsMqATQsDTdH$V!k^i1z$GjxOL3+ZG%5Y6 z&mHnP+z7HjMDyDBer0}p-}f%5%iGxW?J~_Z;8UfQM!3+uauy^3R*fzxJ8eawj%5)m zjK+7yi4iEjLFH;eeiv1~%Q24zAaCoKpQ;UdCVQsO$}><(-Pw7uF&P6eH|zNBcfWfe z)WQSxuN}5o>d8zC`VkFajJ&qRiZ2z|u52ECo3TDA+q&hJun(end?hq z&4#bQX0vlFG|WY6y0Jz+oE{njYhpB=!IYB|3%)h$fu(T-86y;RLbB|tNn zrpM?HO`>*de^(&HGBYm{KtQMXOeTDe)ea7c2`J?FyLG!y_5EV zJOb`R_ydDnlBpco3SIUt#-bbu?o1)QOyzz4Y$!B8H8iUH{_r=V2ba~asU`6R94*j>s>zUCoa z*rT>FI_8?=V7>}T_t`f|-z4!g5Z~1m5~#0CL_UL0LD5jYRbEkNv^6|5c@bZc%3=_~*|pw#$oKDV0<_2>VKu5vPSw zIKP+x@(CdIZ~tBh=_*a$WOu!HcivKw>LUp`6T=doBxk}CgXr9M-#u&m|EV2OO)B+0 zoAl5ET)#HPzj!w0V#IpMld(h~%wb@|=U}^EJEy?a%y4E$&~L5|vDXIy#XJF8if5m> zveTG!2ABqb^~z^p4r`o=R?_^Uy}QLoEZT+}J0A#)&v1k@_N&*2gJHOWmSC7Jm^)TS z!lQK!V_HT(TgK$dwjGfW&piF?U?P@6TiZK!?%vI#k3F&Z`Jey!L5zi?maWr$7y4S3 zOXn1!*Dhwkk8@92uXtC*lX&tcSd@GWU?SWpJ~-McGReC+<5qq+fkXcv{NM+7_zH18 zlqAPp%V7~@I&lAsKysJ$S2RMnv(nVzq%?bF+{_Gex0P96Y&c;6o*%s88Gt#dOBbjj zKqUhyM>*&s0K_d-S0y@2$`R28vj;4~o9((wo0QH>6rp zFM^nT|MWoCmj@9`Q;_`}K|i~O-I)WTe|^}(mui4FR~5DR^a~?OVj{nkH49K`i z|K>H$#cF!Eu@dSped*E71NYy%nxB@w^BmvB@Y7DMCMMc}LK$g6uCFEx&XbsvYr_M5 z(OMiGEku=egPr|>2k+Zy7*0+1_nGaOH^UF+!g&AmNGfz?r}@Z-Aq_#&{^?b%e{GfY z`)-Lid1hzo(ALfbGwK>VyK_Js#D6=^C5qr^m-7IV5L1UqS)3aeGsD#_Q}Kl_J~9~F z2VV2FTW0v{$2l$CFh;fPg(6_8CqN>1r!ct~X7|oL%3sBM`2)d6g(;R5(fPv!#O!0j zGx52fB{wUjH4|C>PRG^4s7^!i{}J?@fQ_ZJ;#D6l_C5*UIJM*Zszp{{%{)#RfL8~+ zq8WgQdbWF#ql23#J=o9wHiL^)RzC;Zg-4W9#gBOLm2hXrFN83QAd*6F$6BXzl{ZBPKss+l7ngcf@dn^=%dj z)Q@?M5WVY1gYfjb_wT)Tk?;{rnhiwN4`O%u(#0JiyMFy>mFDgp?IC2wgK=5Bz^{(a zhDKqP`fu5<&+VAj;X`o!Xs02Vo$AI|x9fi9^fEr*#YioGAMJbueD?6ej}Am~eh`{V z>wS58thKQ(s`w>+@tI=pS2M$fHTHW}{hwNW6^b&k4j7lkv~g{W&-}v!IV8r=7=txo zvdOG4911s^T~xzhrmrrhgsVf+UNi~DedX$@&8I)}#gPHgU3Om(-?VRq!8*H$zV9*1 zRsDolXw|&quFq8?5!O=OCZqsu(jcTMtS$x6r({JSliZa>;R2PxIK&*tJwJ_{$p zFV;9_C#K2oG=cdz^}VrVPI$S%2?Ox_;1$gP}R$T|GCwkk1!)Vmsi3*2#EB@D?{MB^XJa(m;~<( z@BZx?_WaqgzY->09E6HC;o6!3Zgw0@!?FXSEDmH2|BQfuq`i6@_0!x+yGMqn<7nkFM+_~qFFm$5}GFAm1z z)aLOgo?Oisi>LmQ-uL{Holgkj=`*|B1>P$J?Ip&bwr z<4%_D7a-^ub>}|m8*V6s)xVh~tx4&R-52+FR^wYMOg9D@UT{~8U7wi-YP;;EhZq3w zWd5{Xm7vZ9qpiZH^C|LPQBs9b!V%?5&>uz~L;rGf1Uz8?o*%sI7yvNGGlN;R-FI^$ z3YP_9im-I35kZH!Fh7^2LsG`6D!3K@nwM;q&9a{%Xi58p*im&COItA&Qh@hdxSWI# z%CgthM&Ubo6zkUoE6k_lJvkT^O;92ca{~|vBva&oOFq}1XUjBa5ByMd8F_&HG7 zqvlXpE<}Ar*}k9zxUm{8Rmskr^h;uY=K9&JpD0F*Vj-w+KVfzX<;M_S~VTTs~VZ-Do7F6?UGd)(B&y8+c@&QJ}8fXV15;L8* zu(d|uOM;R~Bu7Y01k(lv!#XJB@`g9Oe*62wBPDN6dL%!@V|bTugk9b{hz$acfZTKW z(ki_#5-37>adiefw?+jZ&JnREw}kb+)gf^4{y(#N-=EnL`v}p{5DWr^>3VACXgDJ$ zgjCyzk+pu{f&0d-Ia>WOQg`QoSmeRkHS6FaaXqqYHv)(OSbQ2T4oTGayVSfgPL9Zm zD{CdpOJl7NxpQllz46YfN_LA7O(|%y??BTUh zCivm8|4a(@Du0jJnXh#$lrVn+8iH#h^X8*VVy9KBabwMHSdD`s54`*AngtKjV1F0f zw1h)ug30;uGoSs7&By=fGn>zS{*l2zm-Gk0m%u6~SNAge6bmbt8K_&?JNk0|-DidKP$-{NpEj(C%e#iL3xp2geSWHCx zZt?)+gdN_Wg@)rGVPS^W>$uRz{bE5eekVnQj)#|JEr5#T%zr!3h`ftcZhxO4SY^g4 z8BR6XUBu$(3pE>)K6PqW3OKL%`otN#KnQlFWf8i{nr1TaoiX6l9d4Ym_GcTve`8Kc z;#0ApN{WJ*g(VjH>KLm_eJCU045bK-0jRtvka5rZtp{I(lJQXImtVc4JzY@ioDW`MMc(DGJK<&3~=)_MV?*R!kSy`0k}M}cuH9`;L8 z8>)QI@^!enCfv#4F7pDSXRL_wv)gB%e&))~IdZdx`xRe*Wh>oYKe|5pTM|+|J&5mB zw)wR>VPy%1z5djq>4-@(hv8SSW+uE=dfJt-Naen0M6L~nZA2Zc(FFF#7_O|U>C!Cg z%b003zVxsd{D%gC#(a3+yM;Q&K=?Zi&h_iJq6Z3h%&#Kz$bwH!jrB6YQRQ&;e;9kS z+3XkvKee%h4__I680Ky4fBxyuZGQ2W-nDuC8{WLD*y%i1))$dSs1Z+hxrmo)fmk#6 z!ksH7KTRZXkG$u;6-GRlh%QHgJ6f(1kk&CxqH&dC8)Vun^f_GSJ^06&&~{13+;LF{ zbII=3>G?1Kb4`QiD)D=W0eC);0C)n2;bq4F%o{d`3^_aqQ~9<1?w}*2#k~6$fh+ZD z6{Q@$hcfRwT2LH5QNg-jQI*#6A1YH0yAzxh%@nmYtp zz^ZVnY}@%NkF__}TXr`K$K7Zy7{N&DiWqQAUm-&@KzKR6_Q#A8%GEXD6i^pofp z^U1kgE`Z^!KeEN$SbaP$?CjNN&fY4udv-04JJkAD*2;LBB_kgqG@RRxZtPUugBS`O z+Y(>|jC%d*i1U7G5Waivy)+0624)bWl_5Aw%j{z>0^&Qv0I1hBje!WvruYX{|f_rV9PL6Hy}^`3ijMsRqy6*?e2fz z-eLMMC-XVI);~z4iumb+M&YsTc&ssv&DB*KP)>nG0>3%55W`^+ab8vE#ylJzPcQAC zSxqYWNo3MvW4BS7ts;3McvY|bFR z0l305l?rEGD;>By;yF01`T#U|W%`5XXzT!?rt-t3A9v3psNT(txR{xq+GYIB9Q=%v>(m7z(BSN*I7lI^n?QBL3m469(YLhnF1#P{NG3)nf9iZJ+8YX}iOUO9rXK z`riAg z?CCXX;Am$@|MXVs`|RhwxFgCjF8X=x>t3^Y@c#RjP`Paz=2*g<^6X!`dTnQdxaF92 zdCZIHVKEt;83}O)BQiw|7}L$6>Rt%>#g!QywFsuX{w64veS}DE8Il_#L*cTnGvl{- z`d?ekHjCYUqyk?38JIIb68x2`OU?v;4<=ysS4b_NBVp3~`Bkl5(V(Te;8GN+oIvSec=bfpMfibW9>eHKF`L*BNeD3p0DPreZIG}&C z!MiJPLTSF;E84$G0lTk=t@}g`U(J$;Wsb8k)>Sktp^)$3DeY@RADK5R*fneU!i%%X zwe;lLhf@nlG@gWz=gR<;1<}7bC+@>sX|r_h$1wnhK0j_OCk(*t;bp}DbO6eMUtyV2 z+m-;u0Z-+himL)V4r>lCITCu;p~@uS(07r1rw#2@sxw=-OPbBTeEVI5YL=Hmw>Gus za(bpj8macO#px@KKPNs?fXfbfU;sGKWg<8ZO7}UhmAUA@c;E8xLq_bB+K=GJuoOC} zt;!V313*f_FhEX)i7hE+A06t!(uR81c(WJ2_M!WSw0!Zx;-wD}=dpirWdw#wfAZwN zuqOL~j8*m@aaL!*Y`+)Q;yQyVxN&n=Y^R*|7j{m5 zr$(NEQ>&et7dZ7hY4Y9g`M~Da-tpee$3OA8-TD>+WnU{pTfr3Vf9H36quh#9$m+oyEO*2%Lzw?<1cug8YAz!u~O~sUo+u@DltOT!vSB5^9Et|ZHpF@9{Qj*Q`PxCTfIwxI2103^Dl`<1UZMB(h_G5$YxijJr{3Il5=qLwim?3 z@=n?QI3(>m#31@K0YCbqKROUog-u*=gxh*o9(burcYc@vv|(MWm)|i(SFT*yr36mf zVK21*i9h=2u<@6?=i(aHmxCXoesQS%7v>;M0BNaCC=Lc<^%J&t|52hZk{=_v(t}oz7;9o zSQ9AO=S7u&X0`br?WFjn>g1W>15sPu!;u?cEh}tY5O1c6flCzsdFtt1)XWepE}UNr zBi-CFATb7;LMB(oz|Vg63){VV(~$fzCC2{5lTYt55)PBlwmsiJ{`eEaM}VW}PyLr) z*nH-5j|>x;KH1O_XXi-djJqaZhDv|V4(6az0nkqP52PKf66z9Bb8aUL0AqtAm>$B3UkL*M@06G*f*dXf)*wHuGN>M602<37 zTzDva{Dc9xJ-qA~0E8?Fd9G4byle$Kirse!%Ecc?>#!C7U*7Dh)sf&3?UG`+P-V9( zBu9G)aL$E=77n%F_PZSC5OeDB(gw%DCXIJtD}sYSR1(-lt$-0{9tfkuZCo@0&!qtX z#)Z)+FF+;(amxC{$Vm2MT*gyapFX@peOQ8zOc#|s%^Z-ob0t#E)4X%0{L+`cxb5#_ zyZHLcqtMYJ?Ps$d=7TMAM$m@_;LxZA&dow_Vlp->QCbqe zES2nr>YtZA2H?hGC)Q?h{!9y}HjC@MRpFgwtgO7Y_tWl1c&XD3n z_R+c~Z8#SdN`i=;A#3hjID0WnkBxG*i`~=NESH0G;yn0w$y9e`mu^;D+Z(a@wr}~G z&9{B4CWE#dQ{l~Eale>LBfSK-E*)eyrs%0LU(yuRcRpfS05V=>vJ z32;Voj?5`^L=arPzRN6lbxrzIG{9!{@1O-RS7&o1V4^V?4!=jE|A!xWeDjOH^v=z1 zz3=yTSv2h>iQk=ZHfR7O2txcZmiZp#pa(a&f1Q!=njefgn5zV0#u02dNxNeWxAz-< z$($KfJv3jT2=ZXKw`&*!06%6<{7Ov#F#wq%LG=bQjaHy7LGNxEfIIOiJAuCpFF6A+ z=Lhd#Ma&A}Dcq$3C1tKEZ#6_bGXMypi^h&#?(6&rQm=WY{Mw{57pU9-4ylW_NS2p& z#6DYh<0W~slLb{4bn#p!<3@meR^gzsfO$4TAXH9bouU}@pBbSGxeqRA*}#M>BGP&E z#^@LawY)GqpX26pMk+}VsH)g4iR;|ZBtTfkuI*|oWkh1TQY==#MRe4J#yS%ez`{TX7N^2K(kpSmcVsJDVheGQ(xE-x2eK%`(-OvJT zC1*rqDI&8tzCHZ#V}tovn9TEQ@|i`||KZ>N_~w8AKmMQ1yMO(6#{Q(jwhz`Z1^^OA z)FHFsFt%1>^o+G|9{d!p1$h>EV(m)EVqL52fboj~@Y(y{|Ne0<_-E{h_Uh1D#>om? zz3EMF+%f}~H(&Er+jID4TCMxH#OA?~2Kc^pu9-lJph$AQwC3|)itXIW+g}o)QUKeh zr`MSK*KPN1_%&=I+FxFHCNn_yup~&B6AT3+`})^CwD|R`Ns~r?gH0t}Z>;C>>aNgI z34NA4{#V!jH)~CUWxvmcM^*`vM(Na=j(M@!AC2e&=8ZYR1HtAr>383aGck%VT^eU& zL>^Q-Upz!v{JFz!!@d{TvXSDlZ-iZ2c( zX7LGd|D3Uegx0hC|1szAm-aCknJvRTg#zYiTrr<~p{lzvYhImW=d!fq`B3dM0AwDMCHxear&HqVGP#JYje+Cm;Oa`?m=B$uUPxc!l9zUM2Zq|G#`o-Csx^ ztSNpuaYg7C75{}HF*=x?1Mg(tuZ-?yE!I;poGWYi*U=g$PeS8uPYrx_m3l9( z4u~XP4t0O>sn2Zwu0|NFLt{54}O%B+{I856MhB%B`1($zI2uKidL@~O#oe0C`Uv=Zsz zG`TCUe0`W33ZYzV{ENTAg|+6vsWnt{K}5F-5G9Qttv(R;tkT*`PKUK3;FV_CIY>`2#pjj?~0_ghV<#_T)f`r&nfRM6PVl^HWbgJ^Cq2?v8ft)>q zNFlgs5#nGSEEmf29X=O>B-Wwx9OUddL_XEOi;=C$Wp;_XAUPFfI&ip2ao%&8X&mC{ zjbB^Te~7ETO5;oQhfqWAF)FFe=CDY`bmH`LoHVw4A`q?|v4+R}c5M+2S`p*T1YjJ6 z{<(Y@l`v%xfMpE#09{GQDx|K#&KjiNm%pGHL3SrB6DtclQp>wI7SfHHzs+PBYR+?_q= zF5H}(xJ z$b;h;fD?Fr@RBkBWu~f_O{(#1VR3G8|A=DAdV;yst-}LpCbgyN0yzVgs3!G)gbuQH zxw6GM*ob9>(-DRrCW*KigR!M)@nc?}{KQ8` zJb#}1m-66WrKJC#y)yyRw5sm>TUB4})eCDQn+nDSV+5B;P*fJ9NR*)FF*-({XeK(7 zOvX%{$t08HQKK1?j4?W9)I>*R45A{6pn!s4Z~--r5kwSO3`SIzrkh@?Yn$(P&i&o* zQt3v7Za|*8*w(ka-+k|Um$RS$2}{6aGXEg#MDOplCKxwS+y;5c{E3F2C=5QC=~zaT z4-ZiE2yjaVG*aMW=PKMQMElS~9#p|x0_>(>)DIQheyje89QUO!U(x;b+fM7gef2-b ze8Dggnjomm6VJ&$FxJF44(5nHOpRpy_zm#LyhezF(Tm`wVA}pxb2js9RtdtGt^~6P z=#O>5Dn(9t`sBC7UT;fY3&3P5CVeIZ?r^O)!JZX0)3UDysnS3FaxeA26zVrk_{=PTL z1g{7HySLrv0)Su@Eu+?4#D>x@&1W7Kw5ma|l(9iM(UPw(UNr<$6P4vG+0-yM(XaIN za`-G23=!9yPvd&VY6)I9Aisg}(}xk@=KLF#+SV|D*}!CtS@0iB2ZBPhK8FzWJer5e zXWSm>WdnZ}1Y9#d_u~FMi^ya$2cB6i&>|iP0$K-nW!dQn1SVcBbK5s2w-Lwx^^NWy0-^nod|FO z*~}LxSP1J#$#+l4+Ql&8TCq>z2NwY8Ye3At@BL?Y7hiIDwK5@mvCh1E!@yJSBU&8eLV#r)j89ZYi2NfSeo*&_haKDd(W(z4z0Vcf0vATuf7mUU|)bV1sdQ|nCyAKx@1&zB?e)r6o4}O zLH~b7sL$22ALi^Rd0YZhm(qGL7Xts53Ly-pfbj(X_| z2E>tB!#-jU@I0&^aNH;!VxU-1jD5tu72UIqn{v#YZE35)ajbn-(HyT?PwZFv#5Jj= zzFYucf3TlL7-gR@zE-Q>6KzER*uCvO69CvGM!&WiGR<1nBKldK%4$~nwM>K2w4^^= zV$Pa2p85SL3_!sBY@~qhz?jkW`K&G2197&*ujXZl zastw%me1?Zg!2}QRM`71$6ZERJ_K_d(Cw>bbs>N zzv*t@G+RrsvKI)RG=oE5EB}}?G#iLBS{nQ38{hawHKEf#Ybh`ibH#c?5LurcmFYceujN0cM4$2>=u+I320YT_wpFQ)L&#dtQpZUyZVvR)MR3XsS z!*8vDqU%zIDNtBjSj^w}8T&|ZGsePMY3Zwt>!D%L4$hJA;aW-eR9g`Mc5l1S1OQ7< zrY~={n*GhOwwV?P;ey!G47fA>%Dh;ywGB?;uW-Ny*1;G}bu;%K!pLjxqX}5Et;L2o zNE`-B^75B!+DKddXWW+tBVc?mYYqqmp0RVd1qY#T4w_&^99*tve43VR9DIIfN@0SN zWDz0elHb6%7!!SHP9_(b=cl2uVmV;0^f4RVZc5{Ax2^B4{`NOZO4V2m=$kAcKA3I; zy>E1+qWF=2AC=z-R4Y~8cu&CDaKY+FNPuWYVVlujb*FHjfb%USc^6CCR#cgTFqe|J z!uiI=6;?C~*-X`F?p$&-=fynnd@#2*8={>T_n~mp5Ih6<_>Os{ zF<1Ipjm2ONqrO3@o6hgKkNeX26g9540F&4X>`wuyG`I7adzAfy)d}H(&-qM(C_HRy zA#jYkg@}@C12%!&s@V?z+9{rH+QI9;Vf8DBD zP8T6>@4eR6AYW1nqXJ?H{xvO=HBA9vILMI&jUwkh()LDcL7}06r=gnkBf7r?47&a@ zfjU@FCUHMqe&vmQ`tXCW)(A>w8XiKtHAC2I#~gD^RW#UBS|(8%22~8R@Q-wr z{Uqqla)xQVk?w&CoYfzLI0Octw)=N^@gCiuoE`QDV`G1>2mn7l?LHF#j5;-q$dn-n zvLq#pG|B71NpNo-*a#g7Fy!Zcg)4W@0xQ0;fA^Md|E^x z=mzVlrHcNgl#d3>d#V8%56~7aV!RNBZ(Vg||NW+-^^aH0ABK!cUTl6CzGi<2VQBjW zn$(JWT))rWYlB!vg}OeWrnGAyy@BUn;CIu_GbnUpT!va<=D3f&!ecZxCopqtdLU&UKpn z(bBBkhz6xE*Hlh~O06x7gZ_9f_Dt3-n5+@nG|?;tXX5vK#(gm7vwtiwv1m(n#geiWi2gi?v8!h&vyqMxL*VrKI9<> zRVKsUp;*!MRPK|-QpHc^8(9ebwVp4aKc@U83Zmo*3h^qC*~Z2y`RuFUj--mzYm0OmX3y3K@Qu5k_UObC=RaV>Ykd9w%DYew)JgQ9CI z%PkLAX05x2aUfV~MZGftprxnu!#-V!0r=@^_h}4(n!O++EG`5_*j@=D1c{9W(ScFQ zxJ(^1zuK$-B~w$Svp zbAAmHWSp4)xt`}l@PJ|9cF;}0@72<1d}bh@QThlf^pAO3yl(}H7Qh1n&wcra8vxBg z^D_5kE;#HE@9%&AU#hu3&HPg}H=k0m)^>*gju#w%%<Di5e>Bg5dz1ZPwgLCDDkPES1_)Zb2EmAZF9f#%ZuBt` zu^v+u6e-aN$7}Fv8$ZCk@f(|-c)N<2)SqY&vnB7w1Bor5cE-eIvv?66(0QU>c&sxqrOxO4y*4T7r(+=B;q6S*GOx>&|1Xu$K>5pspOuD?Y7=WEsEB#3T zg6>XR5dd~?yH5oGn3rZ%{ful}h>%sPSa679)m5L7x9eG5bq^MdlNi z+@dvt0imVgmkkTd)MPE}!u3DwYgKQ4>wCL*zU#xGotu>bL#HuM2wTi4yrh z$ev<-5Ym{J%PzYt_L{_(eItkubBGYdeW{yZiB^%^_&t4@>Z-Qo9%TK^=|=cu&CHWF z5Y`}Bu1{?@gH(lxb${#15`|Jg7-CdBQwp>SCJIwxT_AKaR^elf$U)^wD`N~(~*|-P709g#c-ZDST9lt&PxL@cV{iug@4?FCT?$8Gx*d6$w z{Uew!*METUC$gpjVrIbPc}NS~WUbJ*P*U`)31EClHT4&FOT_*V*cMuG7Zw4_0Appc z^v6~UmuT2dI8>0;eN01!R#2S2>Id+XcY z)BVeh8|ywZ=uaVDuplu$+S0%+EoH7)bK_974pm}bTuSs~ObK*Jj1bfLv`}%MU0DF6 zZLQU4s-Qx)m;wIVT}*pL0NB0lJ`(_1zmoxU2IrYx!)9e;nT}^Jwq`PktIU+&u$lGW zv#IriLA|bbH_+ek`A3RgaRs2^lh(Ip^{NmM^x;F`xMtnDeQL28HM(9QuI6N`MP+ro zf$uj8yOhdy=ASPt+!059u!p*mhu-V1xbo`m-@WpWy34QlPRyC`$W}=+pPu=Gap70R zv`XL18GuRbjiZk~x-u{J723bC3NSG7%Go1WhS+PY8NWsQ;(l2KXS@d1nY+!{*)OJV z>0;uq;6SXg`bK;rDUw`TIy2n56(cK{jt?RGd zx^CV6`^4T^jx~^V2f91B#$@zaEivmH%+D{B;JjW9h-447?lgX*F z7){%YfFY zfxy0_;!v=kP3PWSu7MQ+VE4BB6bjhQn>pVj6{9#^-aj6$}&IZ(DcWwV1sZYCiuI zU_4`^Vfu%VS(t~^s_9b2E)e{z$TvNeL4TOyOIcm6p+8cqAb6QIkmZ%p(AKV5U4yhD z2B1W4vjYvr5>SPEr66?2@}&?=^Tj3ppFH=o-Sc1gyOr@P?3gdDTZqrn;&E*-Ei`)8 z0H$mNKKsN%KIZYW-bTZ#wP%pm?O`E++0h54e15|^aUV-q3v$Kp5kOcw5dnRc7OvX; zC2?iE2z!j5yl_j!!VLI}P^!krUg3NgR3@=(L4-VKTGX;6?r_z*g{Gw$PoPepUgnW&49Gp=h(~nCKkf0|qmMW&f(sAo3kJQg zi0!yTnkRxOWQ==6R>fkb`epn`(i${vtsU;i+cw-@g98y9(9owN`(&{MMCSaP+Gm_f z?!&G#ZIN_EOH>PCEJC4B#`GzG65s78MW+x9Kpvcn*r!{&51)Baw{_b>#Otsw%p>QY zXEp1Du`$Pt8yYCRG;TozN-aTJj}!pSBBBXhPHP$T@;$S&riQ<~iBiZv&yO@|cQEc1 z0buvG`@9x_htl^71TAE(CPkSd8(a&5!C<27c?gVXl~8KZH~mmNd+QDeVj&bJgvx?2 zG{IEV?6?o(GS!QGT?x1cfP11j8H{C-A|ZPXFf3Rb3JwG^bPl@5j2= zy#9a3?{R}5AX(%|b0_nouxT0|Od3MUoTGtSu!MO>(-w6S=FYyMe*yx{Ea7+THy9U$ znz=Q9S^&BilNKkMq_S3}|UmO}C%)k<|G&MUlbM_O=!+P{u z%&byraG`;+o->7+Hr{}}#kJO(5Gj%~!Jamf9A7p4Qt6Jl=UJFf7?vrj0wZZjS)QYA zP@;mj0hxS6GV5TX2JH=mmc{y9FkFC$ z+{4Mo^ZKP?ankLm=9^56bjX=9UvpJKSqKoJ;hLc^FngzEDuvo~QN-Pf1#3~OKz|O% zipW6R?cL3{tnW_$@P*wC-^4h$qa3gTE`E8AKM1A1&|l%P$Xx1tGBJ0StxyWpK_Z<6FP}*6yFbdu?U% zQzfmBi0WYG1m^XL8QMD${%Z3uX&C(=kG~g|0t5zY0EBOT+xGOymb_|ypZ6b_5VQK* zaM9WZB|N>RBD58VRki;pwgN7D!I0wu5;T)l8GRnlb_c z+Ob7`m^&D`W^pY^_^e^{5Vx+gy2 zk=;WM-7De<5Mt5PBTl7g@#0aWAUYiTZZ3TBvr#u-|Gtn)!-S6@!D$oEVo*S45IN8O zPv+CrAVT^Zi}KZDwMGCIh>7t*3=CN*x?v0~w2$pkeRDBl3=jkYne&IYbnpMbdEKq+ zvrvx}Cv_dMFNs%?CaOHN`=y0gxB8z*ko41nD|zmAmjGZah*=`0psu(8?w{>G6#xeH z#e4NN1kDZ2hUZ@Zdlcd)GN6(!8ykYgYls%tqrpLZ1YxnHrrMxx0Zp+GHC+NQSN)%@ zZx!akYnVO+kG?oeqWZyDIMf_km@wA}I-}3O1=R3RpkbM@Kn#FVJI&|jGydYUwiW`G z2ebni1LMYL4Z$Wji+SQVFoO*6xjD4{MCuy^>IvQx!Fs(cyL-R^`;}n86buHIfU#PM z&+LHkE%${50s;YCi8ugKuKHsqpb7*&uhU1UIk+|BTQCMeL*_5~*g#{<$ZzKE%5PrN z{qBGH^X@DEctx%D2*Y4L5d4h(RzqTbU`)h;ST@zXewd{D&wO`-J~hRQ*+52sOx%45 zu@nB6G0?XHsHSy=OTaz{Chxcl#T3>O+6^X4dHdZZ)QPR0s zPE~rCe+2;6k9Z>K;hqoxjNQ@&prE(A&;eHjfZf~fQvtxXyw0@M{2;0jN(nI=+B7^4 zKa5cGq_wsoDoDt@*95La3}aTSr@_D_u3Q6Qw9bGo1qBcK&`mx3>I;sKh{`t zEqy_VwJfy6%plhm>t7M8~Eu_SrV?Qz$)6nz*3oK(ZeU;C64y`s?ty)Y3 z1#h06($*??qh5j#6fM zq5uGO6}JOTKHUOK@jBgzTO#mP*W+;6TSLX?pL=aEH-Z!iRK&KPD|H4^Sjt!zw0|uF zS`cstTzCEVy4Stoe|Ohh`@Ils4gTYqnP(U|pRp&zV9;`*g~hp30APL*9>jw%>x8yD zO!WTV08d(EK$IZpJ1g>YSKEpJuzTD6LI7CaAXpG`4mnc4CU;BliXe!|9AXP`=3pr0 zLg>`|Aw+B#7zBh~NK+Bk*qEkK8I&hvFpYcjoi*TLJiJyj&%z|zYLz!$3t(h4w#?1@ znSV~>8f(SVcy1%S+eUhi>3s(EnVM+uAAwm20epV#wcqJ(x%r1Ra$gibw0=zdlo2dngc*KE>J@Fle;5L{26XaJK!qG$0TS zlz9^|Qixuz6C(gEOuT=Kv#?)aOqL2}Em%JYw6P#Cds9H&!(#T=0LkJbH7(SLZTjRs zSb6lY~VulU$;UV*Xb(Zo{Y=6JK=;AVotDl!4O&d$O7qW#8}7} z%fSb(?Vf(zyXzAS&;%DlC-ZLM{Am-ghz12WJUf0j&@lHf|nZ87yTPW!wRrt8ZU@efL*yIjt{b zPgZztXphVr`p14{J!o3J#Jw}oq$2@D`IkK0Oamg__i5$ad%QzSt)wqQV9Z)03&x56RQpYwviBQeB0 zNc;A;uk3KEPmCwipDa=RF#mv|C8&?`yyGDHtqP_-9Snaou8+FuV_CsZEdJ2|2bqk% zgzOzIb=0u{Koo)H&0;L+PJrP@WOWJpN|Sb)PG?HJc`ON-SSjwpcUT>k0`z6EXj{YG z`rB^r-u})Hb?~Gr7V5jo>${7rLg#YVa9zr)g5lfQ;GSSySC~Hi4(ubL=%@ z3`Eys@9@{?et~qjAAMLZS`8JmHJGWj;x zSIZvH$GI>_Q%#%sLf|s)fh-6EX!-7|U;S!~jq|~L%XH}X5kK>w?w3wHx;y0Hbu|Ls zwT0hd&q;?+I;xY5?au zkuCrj_(arKknvBJX#Rvoohm+mu3H-=e0yO=WtU(%Fy}du8OOq`KU`9zat$*dd$a(m z=8?Dd6)X`ZjCC;6#+VlwwH7q?7teq8*=Khrope(4_3@8?JkAE+@yxuYsjX|$ zHx8gJ?=9k-`Rx2g;mWeM{!aG=ubBhEv>4BY7hV_w3D0LNf^|JI7;UV3!jTW|9(UBk zLr5KoxQ&5@ik2AwBPHj5^bYj~@_FWKt%LxrqCD})aQO4Jj9Dg`ei3}*8GBjXGT)O9 zxD;*za4*bi;X5%HI7>nabH+FioRNz@ds+A9xBh*slhD=r@l643QAh<>W4^>S;WNG$ zbA;cEE1;W3A?dEB0S@pL20^dPkuf9{!STlk0L$Udch%hQD;9v=*Y>yoAdpMDXr|?8 z`V{a-AFWy#&HPo10-2-DZ!EWJ`Co`Y=DBaL_0eVK{MNK4h?>DEG&M>~>q3x3+d`{^ zkQgk+efZ92z+`Ib7z~-F&|#fzBBG!4q$kz5hBlZA0&fZrO-&7A&R>w!bSH36?juux z@R?t}>2^>Mw}%!#U4r}|bTIcU+>_;bqoN*6zvTCG4O+KC!gvV??2V@Ba;%v9Ax@+R zj+NT*5T>&ad)tqDPZb!ROY7Z?Dh^dXpXAL}|WCN*C6EU!(olR#^oaz2ErHn-pU z6$TK}zdm#=L#C~236l}X*v*(>esrVBXw4#ETxwayAh73!wPr4i?&otN{%L&A{34{0 zf@)wbf{5vV?tPxqYy;-LEdT~{QUFq@H-(WgVu@p2G%F*>F%~UmCC=b3f`LasUtc&_Dgk{_pvo$FivyV8ZGxq`x2DQu-sp@ku{3>Lcew{47ZMBG7v3uX-Gp7#&k2hX^$BA7C-H1-7Z zYY{L7T=tCgkGX*^nk{1Edj5&-*cLXU?aD2ntHJmvX|!1sPaBAchI(;j_hg8Dol zj2~fwXM-W4b+Lf!*6m%*_M>CH1nGhCPi2%p#BI8~Mj#+^KM7H$>A~3d*(Vu}kdFTfWzHHn9iPN(G}~AL;KFAyOgF2!DOF7WipvL6}l# z;Hu_+L5Fw-5i@ml(6myhm1!zw9`yAasK`BeZmtvZSYrOskA5`f%=#6^Oc)nnimO%W z1mJSd%Xrw!o>4)IM89-@TY{UGKn2xpFcO|?Ud5m5@t!~?JniinrYJ#^0V;C?s2 z*w+?Wvp?N2Ev?>JaA1qwV0mF7iY-gc7>v)-CAG8Grh@ORw!li;v+Z6H0NUtJwLvxy zo5qddp*5dXMk^qW6|7q6l4ijkn!$OZ2O4RN;GpkZzdM_hjqX45Rk;TOf@ySUJA5Z0 zYTXqOILwg}JcGZCYHod=j01lu&#^qfPn>wh>vu8?u7~+CCg$bSpZ;`wAE|ufy)f|u zu{*AbzX0~Yoa40sKI7v>)6c4Y2J^82xE6*_L^I}jnEW7zI&lLekeV(bR)Ve=IW5dD zuhr=JEp^>9uq_EC|HH>AmO8{O`YceZU%&k7?q#p|lRn|PIkZLyzqJlvx~!e1Zjr}W zR|H7?|Cre`gCMnIn2Fj7OdIQf*&VF2Rqjj!<=J3xx_|fw^ZLRUzEF|<5C#ws5j^>g z0c-R@e`XAb^rsoNMVpjCs;wIYD3f;o&>u{fdx>^w&?J399y$_~u@v0OY7K=->R}ll_+2?=< z-d<8hGh<~-R5YCn=wR;qqaWSUz2VRQuKV7<+)@KL)xLRVg-hl^3jp7184{(E`A`@z z>qI)l-f0>Boe2QaS3#jz16~VDu9ZSsxU(jDtJwl8?cQzoN(_Kf?f@`jv1++AO|t_3 z2*lHVFHwOowdN#?=j%$==F~PV0}x|<<=or*=$k|Pgy1o57*I&s`wpV>&DAHkFXAE4^4F}Y zU_BX2uqGn?bq|b}fF}qD!f@MJp-7Q>StU(RFKfrS-ENLo}V76>Q}_d?;8{)Bcm_Mmm4z~tHA5LvD@osousV+x%DCD#c~B*wpy_&hVeRTvR_ zLoH0J18xt-uZGU&+{?mB%r62j&qL56{o|(>4bTh#-dhZddou5=iG2!(&H8YLxF_eG zd1UNl8!*q@3o9Dup0z-bK(JOY^z1Un&^lqbWQN2;4q4T`=vPmQGtx!wdOjaz zf2mk#42zn62)0p1cr082i3m6x0&K*9Y}r!s@<$`MFa_hRTY!5Yz>3OxW_-a=0ScO{ z*aQe4d}eX0+>i4WEfBcktG;z@_r||`PZSXnNJ=f=a^+euxd${zf!VqtW+R!6W7?v1 zOIq5zTmaDb53RFuCCxJl9dwN?yme<4W6e?OqW8^ogs%Yj$^$*`)fP z&~ldhg4j?HM$y+Ketc#=zF1OIujmt$ zxise!xj&KRc&E|y39v(ZnVu{;{`s1Fp#8(V5e%YG37HBrQ$YYDjj4cvXolxnu>pu? z9xtZQbh#u1s{lS&69|eTWh!f}_abg!OC`zzJ$2!KU2LNK^)*BEK6Swtx>x+x>w?Im z9qPk{*h46o6Bvo6XJaK`7ObUdfXov_#VTj4tHDlcD+)HIMg%X^l!7r*$$ zxIgHX?0*DT)(Ro56(rmPJ}+aSZ`O!)WgTEHVrnQPvp-<&T(4k_#f5RwbP*wpXh~sS z`JBI;>Bk&#aQB~I^|EAWYgSc1J&YX}mx6T=$|fLAs~dYB=8oS!3taUgn9!nFVhE(a ze7g1{W5Y6L`Rzfu>$E};bHn*g!J7DoTf5%qNCXD{<5#cjUjN3wi@w-XLSLJ<$@7{S z!+x>4pF*dQ)4QV8x`!;_w7ejY%ABrOnpsK+YU~;2nEmnNnxH{uo`{<0y;jnLYkYAYei^N0)_BG@XVJs`jy{kEr2Mi;lo_{tc^6)_b4_1 z&1igrx{L^CBbx@uA>w+#IZTaWvvbcDGaX{v77*flh!e~MqJ|bjYXMTwwqR@!J~Ulk zGmg}LZ|bhQ_Uh33AsG7iVax*dK$vD~F`uc5^rs7e9DmIJY9A3FPy+YJ-^UCI^QKKt zrx|vvlxZF*(fYKge_jyI^m)oSjE1H`3dFS%1yq5GMAQesTo>Q~LN`Ob7GZ4Ukh1)Y>A@6TgGm z@H+&%77WV$1kV)8e~Z z*JA6|trhHt@teEPy_qkA6HO~K1y2po`!OCEC8&Qqj{*?_DW-S!Fd#x?Us%PEXN6(I zfDnkS%>beu0fOZ5Gfv%frXgyMmce+|I4|r2trJ|s`ZLd@1Tx1wGA9LDbgzzjU zo_J!dBjS2%sbPH|`rv)LUw_HTu^)+r$rR%8*r$Vly}2kHltF)Uao&jVUnl{Dxu*vx zpMj@=>Ay)U6ooKc0R^DQ;z7C%EKTfLqUm14N`_U9Mu6ctpSY-d|LNz~*b(#jt***? z2>Xkbgg#kItwQ#H2WC(#QVIYGA-?`!Mei$M8nkU%GoL~CSRcm1{cJl!8eA$C6|qgU z=4qu^N%!0H?LHF#^w)F9HFeV@PHbS&q|~Aj08GabwiQC6<|GIV8&b&L*1sfNYuhxL z8lc7I<+tV=L!{8W_*_$((b6K6L4-_Ol#q$-F42M@9(m-EF&6W?+xg*I?#Vqw2BZ%x z0@q!4ZTH>lzf;rulBrMDsQZ~xnQyw}=}#8GpQ)1jAGzg?RbaeC@(&fwCz)V^?U)ic zKR3wdPwi_qVg@4Js87fc0w9op3Eke;N-&FtAOYIiB8*^j#1haXkOWv^=FfQ_uIW^t z|KdM&Z~2>#1hZyuAaF6i02@gRAzCmHh&^*+R>(+Hh)WCywREm$o%M0Mz6fhVMyvV4 zptUpzk1CeF>qlQ`^o)tLGxh`wo%=Ih`b5~EF?Q3{7@MYVg9EuA6_P@|_HVwM1Al&DV2nrht|{&atqz{6o`cP53K~xZr{d zV(wTY=7V`>9*6wFI0o-T& z*)ySu6I18b8m-yrF!s4!UlZo8{emxfgp19f zrp{*ca}P5FxJA8!hya{ou#v6>rCx})`P*$^ie^c)aEKaaP3~*jpr%L0=V7s08w5=$ zoF;Kn1Jw6ud0N0rbV2YN2_Fp4vB88kZ{F0``mgDae@kc-R_+@w$bK+=3z!7MFM@$- zeGo1*`CepQWIAAKR}&?EApMyEmC7LnC2nFYh}=Sn(+Hn`32=%Weara9XY+S}J7r9B z1w$PIIyWzX%J!(HW}sE1P{sO>bYJ?%Z*+hAf6l9=diiHO2;+lsFn2I>Uh^3Ys29LQ zsUe%f27yyBGgVIDANC1R=lJfKTNnfyvGE*Y-|K%jD?=9%zhTWVWz!(CFedH|1EiU) z!M#Klf}jXCD?v+W_mn*4F9gn9 zX0iY2hxEh667?MLt>3u1d&6Ix7IUj+#=NO@a2*VnwMNLoasp$;{LVEpc+8FlrLmUm z59V0Sm}}K8_>48=draDDOZwx@6i{F^K0`QKn2G>3>1tOCEp{Y4+ni*3fGoGb(9X@w519Vz0qC~9=c%kFm%qQ zskFKeXqhF@MMezghr<`BnX`T2XzRAV!1b-})qn6;F<(53?orQ&>5HurBq$T}Yn>J5 zPwN0{WV}zSd>N-iL!dLwS2vuQ2F6@idDB=Hl`_sDLY%^_STH-HAkyZ4Rjg>G?YZ_7 z3jlW)Gum{Q7MI-5V<1i7heWJ}r_@rw!Db8+KL{M!nPyh5L8E|J(AbD*eQYjEYPJE0 z=7Nj5XCAGZIm8C-hkIdqUJgbiysT+PjEjEJF!jgs8&SL%o0#+xI5jskQocLts3W_7 z`QG)3-w!}f@%gLiPu7Aylf~bkX-oVy9dK1-1Pm82py}u%tE7!Yuu_&wO@u%4@xc%v z%9wr!CcC9@6KpCb{_z6aJ5uueiB9G|2o4Y?zGFv`_e`HOh$NBKT$coHF#-gCbkq9o zzy8rX`p-Td@eX1@=o_XP(*Xg3`B)bMMj~Ujq94SaYnV$2JAIgLDq&K~kkRX&L0H7E zE@+g&dt8g3n?4|>YJvhcsb%q(we@W9nHoIf)C4P73Uk2y)N(X$n?tS3N`XO_lLdSf zWKAFRy?NJ`-DQm2kI&fGX1G|~hj9t~B4&jFw4Or*Fvf$RgG<1%8!sUY@^hZ^oS64B z&Nw58xG@tjWi(IRTZ{oM5i5Z;Hn%*7`G$b|wp~JLC z>vhmK=au^+fIv5RHu~VZU-^|^sns@39pp?u_A!TbC;!qh-M;(mRigCgYg(WwnU?w` z+CK_o5g-eS;8+Ur0WMUaeIak0(MsDmPn)-tG~Tfgi1WIo_zV-jpNkoQ3r%7@AGi+N z6F*}%%LsqyjPts`KmEKKQ-W27J#FeNeX~ZU&6;77wLd26*${&TnyOVw&@$GP-}9Hb zw)DDIDfYj6SIYzYL>Cz6fiaj>fW?YAH{*+YXbDz{Td@G_`F5`f0C%+sX-RAIR4vlO zdvWj~N)Tx^eN9Oa5>o{c4v<#aSTGs|05vTC@{j%?5^P%T!F!$;O^45gf#rY@oJ8a+ zo7{jR;fgtY{08DBli@Xor>!M06@hvwfx{?5avoZ!j6MDqO$1Z_#AKTO*Q{CHKdjTW zTrcQ5-7(;BV z{>V5WbTASGGu%DQJ?mpY9}I;x(uyS0=N{|}O~o(_*2Hu=_K-n>YSz{QFb;wJq%{gb zL~9W1Eh=9dh-K=b+Ll3%{+9c&ml!VratM$TXf-me1QzjWk=smbh3NBML18vD%Z+y^ zjwAyR7{~XFh2QIDh!~LKnz;Dli>rAalRwW2W6^y95ohdZ+MERhCf3Y43-pH&KqiG} ziFs@Tca2;ZgoZJh!pr@5&AeKY7?%Xsfd{~~>;(af)FO>D692=rPWA~FHUtNRM1>Ca zGWTO&Jo0BA)SYtjv2g|wh!YWWtXj}U3piHLk)Wc9k+CB{fks1^4h^P(8yGXo5)veWQZZ!2YE3N4NKVO<$7>%nWrtso=#5bg-m z?+_9Z1bj{UrbVL=R!Ar0J_0cb-1Mwx{F}ZIa6+7!;S#SxWy}cl8yi@9)XHJvT+KQfPy%DalXXYaE6Ho z`1ZH2?_T`}Z>fN4x&h3B;cu(-i2I;RR{RUymCm0^jKQmX#~v4&xz*C8r{YbBYzm#E zf9S7S1Ew`2ywU7CGLBX(0QXwE-wOaX>#A#};^1?TX{Pu=zzwL2hbyrM{Dwm=dYoVv zEfl629t;V>iUi&IjP-{}bk$HHs{G?K4;7|K?!iHU$ygV?1u*ikMc(!zzOIPx4eYZ-X}AH(!Gf@$)ng%G!2`p;0rpuWWogG;-edKu zWZHcqg^AIc09HpCE>Nk!ol*l}$J|_vCE&ZcB6MKt#}yEWXhkdf;-z2fUimw3jORh~ zg*Y$|Fa_q;60!!=v0nPznM2LI2wA2$vG!^iteLQ)qCi5Z%r}-m@tFaqYRudNhRGNd z8blJ*CoWQ-)f?R#jG2AJ@72o9WPupcAJ5w6SzF|WXJ`DnyxJH5wNtHNGG_$=HCQxt zG-EVdKGRfdy#d`9rkAp3u}1M4;g)CSJbXaCMTV%PI zv(Nq2Fm;89W++&V6%9T2+@E<6wUtG5R6pFN6Q4<5=~I1`I{!_na_-{IIqeLt|hpmN&nL{j=tL-h%e%N?;AFK*{IKH)AJ@hrhb< zq{&u)6xgdRlfBaRZ2PGZ0F)5L4?r`3fGgc|xR=9Cnsv}N)AN@9vq2!}lTAsV5F4~I z2o6L|KU*t3TUE_+un;4Br`(?dlzH&86>_$1t5&6E-&Wx>!avRNS)zBZy;cXo(G9TA z-fL4Bn3|}>X`^p%v-jZ`xy8sroL7Iu4{Aitt`iHt*~aWB4c4p=3pD# zW@%O<-_ev65XEe#ZwM*-%Y1f!(^hvgAc`@VXKo;^7N*aA?sK8}vR@gabFif#)Ny_o z2YVC7F7z*b8ZgKGHRUoN2*aif8q30S5p*Z)uxY!_vBDWzI%mo8V;zARaX$ks#cNLJ%50PxzhJ$}RUFrVxV*N?b@XFvPd^;v}-M(eaJt`Y9cuUSL9*0m$7 zFk|6<2tRN8>;K+8@(~XWrjJXGy$;64RR0_<7G_S|O$~ZoSSYBOU69s1ODWhXFlgS6 zYJx%qmov6l_KtM}u(;tK;5=>ExT%ylU#Kpet!@Tcv;GP#(qIEXwai)ciTSn)t8Nz?`^)rG`oj{+8ewq}X96Klp+n1!aUpGK z>y@@=+fS7MAkc?pb=f#DST+j;W@q)O_1_w0ZJ`x5;_?C&Y)b2`6BTT^U&|0fJkc(U z+BUUH;>sa{xj;}r{PX^%rkQ@EDR=d%K`wvh=a0qvK`g@UckEX)wZCkeo(HbrqJ$}Sq0r~00{3ML&T+!^&NC*&wfJLd& z{%giyr0__IH$Wo^rsbN&K~8OjJ}C!$4BMt|@zF=FJ-eLS^=b+)I={|#OqpDyzV+7M?aNt4+%AxU2j16c~ z{|s&3l35`L{k@V(*cI4d_b^t2(IVs^2+SAlKk*`FyKjB_`tC2@{DFY2=9yU^_BCs) zn^Y5j8)?rP8uwC}LrH}dPMX)kwsVf?$7+J~uPcwH)rmdG7&z|;R4wGS!XVZOV+C}P zEvMrvZO^p(y#SyYkxc_pknoFt4dD>r$3h|&5z_pRu)yyGJ>h%t_h}FTAv4YUhL~%j zw@3_|5`jRxeux`BQZ~Pb33DaH6lNp7JWZcwNW}{Tc#Q@!pV<6X?F*vbXWE$lVcx_5 zOcwB-@U4%I7VE%d5SXT9P=4%P$i(Fb(3#wGdNH zoyMPtK~Env{NX$gOcw?OLor5yrWH!$M4yxK@$44Q(Inee2^50WG%i!Fcn0Ue2yO0f z+zQN01Vqk_x&H=AGB3smz;qc0!Yl$W*Rh|i-Uo9R2See;{STApY>;NBo6WRA-3fvl z>DG`bb3YoUV%LD@X#+9o*YnL7byM*Elv7TrSrITC%>V2u)8iCighqxg@R?RQ`evNC z0gMk}9)Ip<5AS~e)xQ}P{Wwq42-UrjikfF!fC08~rix{80K-5$zbu07hU1JPIL}4~ zMpw#aFH`_71!Xb$Vp+nuwa5&EbL^tcv zbK;tbU(%uuYRNSAh550XBy%LFkHWaM2Xq0@2cNT-w6vM(XMrHkp8MCh9M+e$FzaBY z-FxkRF95W~Dj+;;N*IWM9-1(%MJ>duaH?!P;d|L|Xn$-(HXRM(3&B!jq;Iu){HgS7 zIZZaQ{zLw9?{m*RxB7xxAAcK*U=(#~VZA=%G$?Pp2mlii)Q5RLfqn2hXD)yG`ZKUk zAz-4U`q9$II+X5$z%tKeRf|Um2u2;?BTGetp9{ZzB9cuMEq|e+nOW>4{hO(|L?Bz2 z`TwESPEA$@Qj45)12ZS%z(0w#VHMQ{`=6iv$&0(!zTw?r3Pel9vikkeuPlDYBCm@F?&EQ)I4IYV?7}%YLsYsyoaG_EkNVuo?MR=$Wp5O(@$?SKi69M z48OaW1pLnU6a+u<`t`XR#c#nXQxeH}bow^TR&e45z~%mLpCK|D73ds(9}m8b56=2-!l&efT}z^ z<;jojUi`vm$5~vrt}jpwbx~l;s+b8Q+{=Pm!2Zt7hvjT8((QT?t7FXzEn*xP&fsi0 zYddClRCn8ODKvy7Agpn5?&fQ-EsbD7`V&$(;+VGe$9&6%?zjHaYr2uq)v*_i)`w;( z2+4#^xz=Rw+#oa==fQUd>$xXrW?#^B&l>;2oQOlv(q!X&><=2iYv#G7nJewyY4-{e z;7)Jc)TVA*yP-4@v3ab*#)gH7>zjorS>en8A2uKd-(2G5n@aO82Y^k^Mx{RpPb-18 zre=fy`i5YcLBQCs0MIl=w!d!=RFw0b-4?(;srgS8xZa6i&~1+Y+NP3U2m>=y#iu*g z?X`AI{1rE$=J?~Y-!WGU`=G_6dBf-fl9vn#e3QWRZr)lL!akYW*C!eg09XqA3>RGU z5cY}>m+!3*h|2)?1R6@l0gMzOZ7H4y#-GG4$Ahqd#o*0v{lDG&KX87H%tpHelm)8^ zzH8?H%U}L-JQo%K&Ckps%!4_=Kg_tSAt3=%5HP=46F}|3zWr$1b^bbM$7XZrdWOp(KH`lfr9t$JvA~@;*4=HNL2`5 z#%p>X*Jy#UkPhE5W|%*7%(-FzS{2d#Zw5kZU7&HD>5DXrFVUA3_bkH18GF%-UKI0# z)!>CMd|?P&mtJ~l_pE0WJm?E+3Fp-` zNE*V*3!Z;M_e;+@wpi*$)4f(I01AU0f>1sFT#1G_U*_* zUs`vDO5FgMf0nnNtmgiJ=Pn9aX3%U-e1QJvmwox`-GBI<*N5QCIv_+zTiJ`Ov1ySA zoo$(N>nX6toK52)xG#bdG?2B|(x$bQ22Ex?tsZGmpK%`w0tQeU=-OIjcZOED(*AWb zQ|O+!O71fOKv0e4jZG>+^uaiM5D+#h1cXh9B*|fgU|2YW>o~Y=F%YYWEx)&>PlHi} zv7|3GOjDgiUgJ8564wbjqyS(gH3OQIw38|HCHHYOw1f(sC=va_^Ujofei-%S#8~n1 zPe*_d#D=JRG;{LlHM!w$jB>mE*VZ%NF;`%D`$Phw(W}z^*6=r)hYXRReCcGV)VHHV z0go22rNvS$a52_mG~5Q(B&UA}3_^-^0;m>v+ie>|BPyBEp}F{*uJ|2a{>s;OU;Wy* zVs2PZ^OY^D3}X~(7YhLEDL|5@OlzE*dTI4AVPnlLS4)R+s98dIxR&)bXj3FO!H@V3 z6EuPbOq?-7{1~5RZq{1C!*aUZn>_@vqff_)FksyZ?x#?z)x^w%wkEqiRhTc=LvT%z zqKSE7`~-a)gQ7_t0?k=Kpb-d(>k*h0Mqu0`@3m=Qj=`7-&K6p_39aU157@zMutfWV5dz&-!$PhZs?`E!q` zklSeRW1}ey^a@NiWVJ_XUpcD=2qpq&F9dFm37;bnj0`7(C&M7H1d7{0D_m9!Ojzy+ zxZAQVP8n`OH2&e@FDGCyLA!=S2>;7By{EhC>KiM53g-(;3053~V%euWV`~k;s%2&i z_d`esG{gQ`Fnw86NkM}?GX`-yJ^nOJExNA+t=K&`G zw3W_iM(DEXIE-ij5LY&ees&2h5wE6qalj#lBA?M(s8lvG#GHO08WI)j#cSq=K(xhs zm~_TqDqC9?(`RcVSohs$O=!-h_*s|-Mh%lk!^gCrCjaRmLKzI0C456rC~g2T6#0C= zefO&Q``dyL40rqOzjqKMw2VYL%sl->7R$osL?$yHEd~e>bPVz73c*CqTpK(a z76MTU^`GjCx3zGm23YBv)z7acmGI4D6|2CinO?(QFNj2s&cUb3YgcLIX^e-|*VtGRA?011%B3*g`-E7DS1ofs>uUoN~Q^hKvnUK5Nf- z7zcs`eK>B$fiNbVHVA_>w0u)t`JQKkS;J6ZGAINv8q)yjpZ8CH`qSe*0ttf?A=mL1&oSyL1`-$-g8tj#bVsib{{NGhmVh9A=W^2AO1jzoB*cS_A zsh}eNPVVSaby)4dDVrL7p{{>o#=He*UXt&P?NiF);s_ zjrj~M(@1aTmDeyU))t}yVG>8&U^a^^ndM z6Ei1#&u>|G7&>PgYZGhC_^^0zKkmVEF}K$0pda?)>Q!Uiuf6cZNX;c?hjUAdGQkMS zOG#Mg=I5)BpamdOf(tknf&s!g41GF;he4WPTBI_aFfah-=0hp4JTUi}E7b+J_Rsn@ z_Qgmq;)t^1>c*%x_|cDjx_i@GPK|SfLemPFx=wi}1FfZ9X22j^wpB4@((DuVw($j= z8<90zZJy`hzN`~#$#wijORqtO?!%p>Zm+bRw+Flcz=q)fvQgQ5;-726lAysXTHpwS z`XJ5_#`j>z7C%(7=O*AVQazG$r`nq)w=!>=vfm$O607;x+T_Jr1?6Kr%2mmu# z#urULiu#mdBm5g08Xlwwmi+zz*TKv*(zNu_bs<< z2n|BiF~*Y6zFFWz?S*j!G--d1L(3T-FGOjnx&=%@3PGhv{IoP*4*bnGeD4R{@4Wi0 zbsT8*n28yuzH~GM{oXJZtS)HNFdmEQ7{P6ToWV>6!s&J~pvVjY)?0#O8lANuXu_7( zV5(x)XD`WM*=q

;v)lNta{%Xxi)v?jxF@FvJEBS~zDsguaPN?8WF;_%U|D^05LH zNgQ?GI zIWL@%sGM2iUpT8o@ne}YlSc5MaBW3t?BQB4DxWn0xS#`J3Fx|#xs%p~kp?c8)IzQq zZnAs;9zsCB<<{G}Q=b3tyY(Bkh3iJ_3D&nY`&*fGd9#j+k^KhSV$l&sTY7HnKnpr# zQ6L33?!&$iU`ux#{j_kvEA7X(2c!TXQ8ZT+=Bz0eM$e|PV2_dg_^Mj$YSXnOcs3?W z!e|aS8yfNjjfJ@j=&(aF2Q~{+WWQYFv4h>Z>9sx<(sAu*Q>(5@| zHx|R;TCGHC+cIw9bPd!qm=A&m`sg3jx!8BjJEkGr(m1t}VNko4il2`$e&$$OKN5&})fZ4G}854pFuV4PsXLpAlazLC_&NDGO z5i_&66rbtKM{p*Ub~G$Msd&sIWb<8t4dyJ*&CkUd#GMB{AXpdI0>8noMqiva#ze8A zFv0iffhB~4W`PYr2EyV(EyaD_r#{#Hmp^z@2sIYvfoAHal3r*nl~ME0_bNZ8zG}T` zEv$UT{I;Lb40L7gm^Z92x_OvyQ##v##+CNt+XGSnps|rSa1c}+dL0{D16%n3x+61Y5zRoHaD7*Nf*Uj!00Tmu^sa@Y%&mPX(}*ju;%KHV$--E-qF=bZVb z@D^v444XviOTRpAQIM>1)-qLhv8McOD)8K#tJTG=K%n0M^I@@;2_7w(1*xp0aLf6Q zxE%sM$Fo`?=Nxyy3t#ek-S=-?AC@ZSgT11wREr3LoZw!}ErKBDQ_w17n+#y(FMFhA z_^g52JdJx90LyipIjyN8f$9cRky;S|?pph)765jY254}e$Zi~XnJkA>m{M`3jc{%W zs}k+5Oi5Pe<9o5_A(9qP@lc3!ZiF@Cl_|97Zkm(#*?UcB%@6|%_h1_2Fi!-M-%Pw# z;}7$H0rlZ~ko1O23Ex%aw^0o+H1(_)24hF+pPa~;0uDF?0Kws(Z@4iCPzI8hnH3T+5Ik;(>&dBiL5{!iKz>XOU=CCAD|ia>qIq4PHQI|2{_GC}L=9xKf~07K`a=~qC8GNO#Wi3EOaM#;?A^_;)-5rD9SziW3K`7Wf zY(lkm4#tMPbvJyysMSu|6bfn-540VI73Vyd( zTqkZ!#)0pXXFvD6OS+Gq^Oax(niQ>`IB+YZFHkTbh^$P@ie!9dNoI5K^^5B>H+2)D z1w(-`Y0-fZ2+U-kFlsFluD3bz2Ak?Kf|==JGMx#{l*Zn|JZ_Mm;}q=2IEA(Xp$uKO zgmY)qKSY`Nfv^g-YJRoBX%^*y5yLR)$AC%E0b%ajwr#6!AR6BzMDe`Lw}p^ISTr5X zyn4o<%L|4t~a2ZD?%SUmssS&jj?f4_mY?YVRzHbx5r-O`4K2( zzN{JhMr$W@knh<$%pL2;Jj1}X8X1$K8xLWO^JaP`_i2l+v8UJ%&|WRA7SWRC1f3~+ zVx`@AyH5mw(c*8~Q#j2cxzQ{@BJhY0Jupq*xj>=-V7dvy1cZTQmd%1T!TtP4*)3 zMQ(pE@sR?3J5_*g7Ba;SM%|@({q~{}Oq7F(RUlCSGdCI6z<9V2hC}nvf3E-mLE&EW z1qm>$5fNm!qnauCTsH$6g_Z>f5{>t>1<6b^;+B%)1Yx@HGnaOsy6DR8f(tH)=P}|R zqAMtgP_&}{F*XQ&mOC7}1X~re8iU)`Qt7 zyti+frK-&ekO?yX7B7O4a&G~4j2AFfLAebO9T64gf1qOhU8KCJ|ONDT=oPD!C zcz)JUL4vWv=;#AFz`U?WSX+JP2q%n_^*Q2*M|HpOgokzqtlPU}_hdE?XJg-e_o|TH zK|6<291l3(pl6vf%Y9+oGVR2@7%H?jgNeiC(m$gj1WLd+ZL;{&SY#NG-gp($ z|5!VOXf0vfZ#lZGR)CdS0C(Q*GXY>vwU*#Y5V)W9)j6;}_+4qODTxiop=YyOQA}SL z#KqE~!iHkj6*|1`soUVOd-=**)dxN7jm(xcWF3 zlO=;E%5rli!d*9B3U`&b9%5`tS?v^FXM;|RN2bq6shKfZGCk(90%xhrnRpy|{sj&q zP9V;75jwU8(%x-xo?rHgKkCzh?KRkva{*K5S%miG`CA|!o|Qe!^$1M7M_|=`#QgC& zf1#nAUDi*eKi0zl&9>?!eel`N1b~%HfFIu;umXVakZdp`wDr*S{!5~fBljWDJ5HD0wffXRu;e=^VK{rl&=6kFvB%#W@?I`7J>*0?0+sEKpyn5 z8s!hu=AZ_{?FJgcKqJ8VkrDg4Cd%vu!?g}MFuY9DSTRMS%~LLv{)15Tf5Gdq!mzTM zT(4>zGA0Pj7V!LMrfZ&ZnpzhljsW)q7zPj=w2#Cg=v9J>RziOtKj-4^t#3cGGBM^* ztwOAEv}_wf1yZoe6H_N0g>Mu7a-Blv}hE(rhn7#3>Gs0N%Jx91sO8hnK|aY zIOoIwz+C3%QxIcZx|j@#D+|!7B1088o5ePb6V_L{Rhj4O#HE&I#q77P{O6^>i zhZYSrC!WKs0AmEW7td|cEYk)d#>@rtDL@eG!8zkI%OA52{2r~Eb)avvE3D|pKQwre zI<=JXTwIIrr|SUM13rG3r$LF_AHkbG42C4Y@7I3q*P`!JPdzo}1M2}U1jddfPy7S- zon@7c+2EOAa%Oli4&xwn!{DxB4bYzd#j4nF-UShg0KxwGT)%!p zci}~sb$|2DkJR&kfQ4`d4L}G*urig|eZg8f_;L9qxNh$Tm=Bj z5|0No^Jq=UW8a|JT0_A7t%ZVd^Q`Q5=Ya1bU940%6phdTESWv?Lw^WCVMgx1H>ScW zeF_@<&Xh^6v5YX+>T0nhurV>573QvmXg1EmDx5F^Eg-Iq1+~oZP_u?nFc&ZzzYpcioyaydI|tLIscJal4l3Eo&mnr8z8{&#vk0&z2L>a-(COR8!Gk% zb7}5A3J`lzdCQk(YM9J~DG;d(| z7hs=O(@(thweekQ`pHz+u2~(vywHkAd(|(d#^AwlT#KbBPx=GX7l@z`X@Fe@2;n1~ zD!->;TAVL|c@hXU3gLpq9&l3`Y$Pa-<$d+7ibTdT&%~6-BnVM&MoTZs%=mwQRl*}pjUdD5zYHEU zs7(|-gaQNeuvE0s_@?`*+2}S>$T4ojKq)m|%dRSLs^QDPWyHc#n~F$N08n6oSPG)U zJekLDdY`o^oL`Ij$Y>F6(298$OA(9p-bV39sp=BUC<-S`lX({C$T`N;&uf@9eXrdBd$`i1G!7`s*| zD=E4rTqoqO0u6J-^@5KvE?zT7%!vZ3sf8z<__Xd9Pk2I{aiDrZ_2gOi?Vo>?gyE9? zM4o;W)EXLC_Y}}m0T?bqcUty1&oFt;+nt~PxyU-m{(^ecV8R`xqTqYq|FP~3Z~VKM zU#&$70A^?K%mz*(gfT~EKCu?oX;4tr<&;H@-n6&pqEh6mMme|H1`;eH`BG7fRTty#^c*L*7CmG$9e43zN=bNH8%U&(yqop9U z`);VF>EY+M>R1-VnJSB%enInh!*>nN{P+MMXs%cT(qz9BCd3p-7NUo!Q{ER=Mnj9v z$o|woGA;nvVK$N_j@^@~$&7UGdEc4c+2?(=mJ1c#528*$m$14*=E8s=@MdJNh7h8i zMF&G@_+C^un72V)>>Klxd2PLNi$@t~XR)CcgTlQoRH+fuFx$5Jpr~f_V@je-pKD+k z>?^c<390v06E*lyMhnw}h*}BLwQDn8xR;p=Jij^aYW-?#Fle6{mk3%eeG0s!rGxo_ zsB79b_)$o0#*eU|^+52Pfd;!2?&v;q5MRbobHwcQ%F{#&{LDoua4)?t9 zz5IrGGuy<TSW}+KTyfS@xLDy} zbvJM=T8TlYYS?_g+%G9%v+jUtROYZ-YFNR6v9VWSI@}YXhOzKZ_k*T&Efc&}tEO-B z(;>n#e}qx%)N>CZe_H{D*ZSvmOE6xoUW^6C=kMvC@0e4xbz?sm55fq7GFmp*g6zk* zxF<}Td1u|!ehoUbn3E=K7$bpuxIoM%&?3UW4}9PQ!BkB#(-Nlp1q%ei3ql3{YWm^4 z;zqEb6wkmsB2e->#!1tXs7alD#kv>=A+VDBKomw8mS+PChQLUg!`VLs3NmJ+=6&?Uhx|*3>pAEIOO01!o|n=deDRRs|B)U+f`vp)`pz&vUD zmzfF*!ojC6HlzVFngrXr0S0~DeDh7+!aN$*s%qNSx5wdy>92`0zFE$fOn_wM6LDQ2 zgY`9l>8ULCk;QouznkBwArQ1@*-wLg@Uw5+xH$lZ5EKmj6QIW`d*&7!7%KMFL%czG>@m7#OJS`I{vzG;4^#@-h6 zfr%n`@;vlutqQYLm=8YJWQ(9gzgE3u+!g^cfKMC&7$^7o;0He#<3QNr8Ldo6e>@xK zjpu-onR&zK?|Rp}A~OLEo_W-Ife^uU%oEI)*No3JOiOI@p0yKzMqvdeY)~$ZwGs|m zghOL0F1h5AIv2nAi@#W{1DsJUb!VM*R(xmht|fyREB%_=&)l=-&;#LYg-YgLFhPY5 z=0;)F3<-h?(U7$&aBt&7_>OsD9e(52pVuAvb3fCc$Gw79SmhIe9J4*leNA}{)91`^ z?mTO{*EZbE^A8CG0T64X)`Cr&5&@OhmwoB$-Sc1cdlhb57;EMkFeJ5p(l=RS_9Rvg z(N(or2^M9H5w016G)-HzG%$0_zc#x|MQdlgU_}7<@y!z7_lf}Ep)&}iHLqt|o%krg<3+tfs2@mS*6S{@~?R{PcYWc*W+8{ezXzx&r*b z#4YTj@85L4OzRu(6YMp$h|fes|BnSB$ZB~*@%ca#ADF?iN)~BDBUxs5v={$E@F^ui z7b-O9!W}es?iay*!0|3Fb+>J}J%kI!hDnheeuxG{X#4Drl4Cs=1X0+GdOhQmE@&bgO#zx}G$N6{9(gUDdIhtTSi zhESW6F2bMI8i@#u%G5eEGl{(T@@gDvbF42=wp@dj2{Gq4Xn0tKWXR^78`ZCGA0n?c z$daWB2v$B*OEPec>mZc+>UBTCC?TR&3v4T*i8e_e+>^0L94$7*-h{!>56^1`i&+Di zE;d!;7MKHFAUrQ)fLV#`hEQP~fr7Fb3=(jdni2hI*J$A~4U0LM^R4@V=OBF!flEP& zwbrc8^S}sTs>ThlcBY?+lz8sB=Z3!@=A_$5Yl(rKLfRrEDCC=c!1d4oEJEBHYleZC zd`^jD?rD0V$ap*_`-}HtOweXaQ7i;9(IDBsG^`}tkMhTi>Ci(D>R$C*FA5xhj0?(= z-+7)#lTMT~l$knRh2kD7j672L?!ozAzhPqt1t>23p8ik*pk=q*x}iJydHiWrqvp4Uf(i&_ukIvy!&IN?Vfg* z1ptG!%*9{M*!8zB7XWspweLy*5VKsfqMPN;To2w`v!nkstLhVL1N{teTRw(1HD}eT z$%5=R76CgJ^Z}oHW_pn7GhM)c_&l-vheGp?JYYa|%6-TV;JWc5wQ(CT0b-1Gjxy+{ z2IX~${qLCYx9iqWsEI(l9T^-qUC_p0@DLY*jRbzNN?;W3VJ`ajnO_*x3lN;db<`AS z{Q(akEyg%BRDpjG1Tascaab(KG&K7C&_^!p&iwf2tB)DY9^bg;euFLbw_6d9eT3!- zG0{(L}i|FYUTzf*&1(GxjeYDq9X;f_U46wX*o0R!a3@z5 zoXm;lY-`pVAjmkaU>EMSz7W9gv?3u~SUd?q>uWkezDZB z56th!+M!!cjnm>zLIoS^VI2vYfwu}s>>qx^d|5*H&YJ6Z2WGV*0POa*O94O=4b3zs zD}dQtB!M?%Bx+Uu_9qbl{EZBseg+Jxx6|vF=lfeNY*+m+*ZOzXR?SRSEdEH{o6fv_ znf}boWHIf{gho9%HGlzLQ``kPkG(kD;XVj-z|ruda{!Zw?5rZ(TkQ-q(t|9b+HVD1(Y;+YnUuoCOt z6^qMImskMXvq~U-%1q^&8onE-HCY4=LI>ur|;fN51W1pxhJGy@Qf?3UnZ z!lT_C0l@re1A)A5S5|;s6_41J6uB$^QZfl3b<;!#%3lU-O;^)De+jH1#gA*y;P>8p zZ5&jXY?%3a8ED66NbnQIEx`5c-SnYPgqc4MXw?9FHQh&v-SLl&73R?;v}c+TC#v?B zX3yJ#xFCc;FcykWJ{so3-bhUY6zAW9BWX&^=0@Yk9F5IC+Aq=e6mBp0(>0mGm+L7+@slYtIQv9pz-)68TMaE0Ic zopmh)ui-C32+xYC8bXRW+q0$CY+k>9YO?}7r~GC73h&&Tmv$y8 z7KGvV5_xMLFmIO8H7h_N2`!r7K7Ok(=Ul;1(E7MHpD`ApV}lCd9r;M(r^r#&I8gSrJn^A{yBgujc!a!iB^e zpr6;i;a%O8S7iz)Yswsob6~orby?ay${HB=z?>M5A%KwQLib*xj&7~Os->ED)m8+6 zd#CME0FaTl@2!lc-<8%zb;{J+MY=lzfRL|jI%5v}d}pn7KhV7Qt^|Nx;Y=ryo(jfq zDc>;lhp&G+1Od$W1n=Qn&kTT>kh(LiZ>+-XqDA8l*rzWXB;LSi_~57mj>W*@9>XP# zjsvNyBH=xERDziP&zU&5mhv?aF9P_8_#YmMfI%KN0(8n@7Yqb=(TFXGl%e!BGBXGn zLJ+Ir^MBlnG$eq2=xe`y_lnQ;FCy&V+Th-)Rm{gc@ZQ{I8u0;)_0tz#)_v%spR0t{ z6fodbS!d0K0x$6%24U(NL)pwKR1P6onpz0vnD3Hq=;0RN2o z#)6tf$u~%bRRMfi#f5L+!IRxeYw||1NyV(0C5kdEHhU6`puX9a(Cz<2NXBX zc%%eFLnaC`s6l}W>*EEjvsV-eG67cKlk*Sr-L^f1jS$THdna9V3*A}gT-5!qw|}I@ zGoa~XSz#XkKYQl^ZE053`R|68>%CW1T^#^N0d*OcX|2(vqciBh8XQzW$#^PP*q*=h5P3I_SwI4PhH;YuCial z8sXHc_1?Sp3+FrE*?I5(=6wr7Wzw$Yq=cUMjPK2dP?2U2+tf?sREDjUHSDZFa0p|) z6YpkxSpnGHaYj`DqO3u9y7>a9@#)Z`&J5yjdrX6?`_)y2zDgFhV)fY**1 z-H7!shQ%H={u$?ANkAVG{#M6Aj-L?b-hldC2yXzyBwTK^0A4AvFrjh1ml^ja))DWU zXv-%iNpu;vA7xE2aX>KnXA^ZVTK5jMKu1-X7^TaP^TSF{BtaB_&ylgeccqr@nHem^ zFZT&Zk+kBAroI;CN`t&tpa)W|Fun&F$apd$=9r-jn9QL-AsbX>gWq5Enzwd;{_M-D zWzO@$Tq(taiK|%Ji(J4OnGE}ky$1t^;aZkwlARRb zHo<}lDac@MVpWLBXHI}txMi%I!~4cM6=}|LDdx?yiBr!tw63_XmcIWLI06W%NJOjV zY;?-t^kOn(G`&n>iYi(IHzLyw9cfr~G`I6OI4Lhx+3 z*W3DgKF4iOratj{8M(-Myd#qSsNm3TEbK600bTo?!(4%!8`^x9|n>{CjDensl`5xbYm+m{i z{p+HVXfM1Zu|pQ-=V}w5pzkql!7msl2ybn5sR-UW`bPl(eUR|vaM;gty6&Go@Xy^Z z{OX@pa4y!Gy#!q%*jY2~FX&YZL5&B9yay{e*oVFg6i?QjYY8K4Ijx?7*28QWrb@w= z6@V|yxLFTCn}in!XQGg?T87M&(e`6+uX83<01Su^rU7vZS1K6B^e~RCi+D2{VH}B# zy3-~yM4=lufH)}C%dUO}r+=lNR8@GYnGS;(a4o&VHN{Zz&OU~c3bP;tSYdC`kr)P3*wesAs9 z!TV)Ce8=4I=!o`d_{O{ojzLjC*qQvM@YY3b60w*MmMF7NcsC**T1LsS!Z9;A22TL{ zgP-62ZC^PSg!{vihh7UZ;6e!V#q0~hSjZ3o9z%0=5Z1Sb{@qV{3d|4KOni{v`Tb{h zpZd(@5{~aR#h>k&awv6L)tq9KWmp z?C#i60nlA$yx-&{W2`OAu1IDQNE?$^2&+tZot?5d`Hq+z8xG=R1FCsWD-sHKEio+; zEytY{0MB)k4Fu*FN&GG8;8w^XL&yl0YV@`tx z-Zxx|i6*$kx?>d_J5ezQ+DvrH|H56EVIZx*y8fBBu$7R&0vn0?$8}LG3I@SulpMYF zn)h`tzwB-CK5^;7RAA5~fgv1l<5F|1Cr6BMm;{Y-7`T41QV=jU|KVK|B7oWOH{Z22 z{5%sv3g(YsMlfmR8u#X2+#kynB_Wa@Gh^L8^*;Z6;5(G&P%54ZMuuJtTS=3=hNaDQ zwc;7ZKy{T1g{<-{le9EY1V@3aNdBhdhBb=lLx0Gahd^g8LxwQB>^D!Te2x zWZgvWInxn2OdpF21yK}wZFv<6wMe3C zQK@n3=$~+2v=$#sdUVi698ccmuf4jv^i|i!v!P&H$-%P;ZiGUB@+>{Dh9qfXtXYB5 z=7zDa@DMOi_*6axb1SH(Wj`4{QZDR-`SRr|fZZSCHSK+#0$?muY;!eYv!-Q?Fitj& zaJe>*XgvT5KrJHi+FRFRJ75klbT%mpfX#YryDFmCb83*K>0)X z-YU_9BoV`CX|Iz3nR8YSH1O^vf5}8SW>ye>-EUs-* zPACKEWr=$56dIe^xr^`l&$ZF=Ayljb>$P3O^(^g+;|CK317^_1)UYD7?71H2nBkur zA#2<>D&BYzI7MJlAz4sO}vd0iYb}{3; zw)WX;x?jb^z`YIA7r9c4TK z9G&+nNRs{GQIdGKtR-_mDMVT0K3M%$V%RQOPmxwW_v77}SHSbJ?kE(N@rfgWV!)hm zar2z)4bOv**gaBXf@_I5$-J2td`|;{@7Mv{M9p`jsSe}YyX>9N!U_V0CUXRx-wcFHr? zWZFaT&$fxwbYlJ~_Zu^U&s$9q%-r;d@Og)?Xsg7ZpOnm9nDPbJ#h^8 zq71U1jK$7kGCsFm00960Nkl+25C**>V zZ;>0>JK{_LXN-^|-j6~dt_cbzpY!Zok825%r17E!s*vJ%o{7*w+ZTdo;(3HjX1=_O zuesCN-M4(xS4RZ^`2dy#E@d(wp+rgpBX_1StDxHe3`*fXy0!G5eLCEO1rThld)QC^ z?wJ3qRz;Y#bH+9VnT4+2G?=ka?W+D=pa-P+{ddI>()=y#Bon zmDTB?H_&~^a38iZR8S>zHVjb;fvp^GM{j(=t?h2ei?QXW1ES<*$WSc*2{&&t>sHIK z97I$oOKGOD0@`8e5X1%ZxVfP_)VQn3Np8OFdIvCXn8Aq?V@-Cp9|AuBewG&_zQ4Ru zviu9w?_w3?5G@26iI6A>%ZovTfO|lo*29O@pUmCzxPp&AC~mq;jN8Z;*H5AzB@!P~ zU2p1kA>6f$({Dsc&TMJo(=Yi0TiFMkYsNf+0nBvQ0J1<$zg>T03bKW;3~oA7O4oR{ zVN>?kWm)3f_*|@r!`a@qpURVHgyHU=ok`TOnRxcr8Y!K|){B>d`HZ$IyeVsO)tleZ zJ?nX|4Wefcz`(VxVLC7hGN@t7DtcP1BD`Vo5&t)yZUUVpZQMue(wcYkLUh5)fY>LT zqp~1K4D+$Ytz7{bV%T#}lok=}%*^NdX4A8txK2@`tpG4duRt*`oU;E7jY)gDlUuhx z^A*^}aD=u0%*%BZPoXW}5(r49A$^!HV8%A*B?i2Ij zdyZr7><#t^UIX?Q&%(KOpyVAePb^bh+Uzy1%P^Cjb>Ke&T;NVX}Z+UMh=;kt58Gu4(`(=5&xmF9|IV~Yzlm^zDea;%NW+)GO z3ED6k`$2=yy)A+(=c+8Kbp3m_`W@Tl%PGG~%jb#Ld%K}>U}>-+K|@%2PTT8js{k-` zleZcM8z8#kB|*U)gn{Ixx8Om7vT(jxwl+yIK58OVtKo4D8xO)15e?$B$9t>A2>WZi z*oQ)cWz$&?JdIe0HL-T`XyEoQW-DLu{Sopd>95p1LsWPJZg<{+5N`a(uzOF?}%glLJeM~DEezgJNGCkzc@6r#P)ZiF z?wIH2*rUfz1T(4LfpAHUGIO~f&%cojkp5}Y#Cg&N&!Z)j5#vSiGg}i&l`gif*t#wyuF>G@xqMxqL*7c5{!R^U& znke=1m%lvD2l`k+Ad}N2ZFr6EoP!}V)`IU%!s43H1+*tnkU2M4n4AaAaEwX~^J8v& z&wWJSGoi~|2YWIoAf;`D9oIv-M_7urU|v+=DVk8#1vrcwi7R#%208dSb4-&6>~19{f-A9(j@4n!jD zawq^xwZaJD-j77<$8T#~QI7f?Bcm zJRk3fJ4cU#%zR_mfauY%UGE}p9IaW8HZCoK*-L_f> zYT4U`16&l`bGkqUQE_v?tZYZgU=D0TdwGi|?_d$m+Fu}g_vnI)cD@VYexsJ1SrzZeH;&_B%Kk@KaqMo?Fp(qW}@p^n=>swPd8FCql8(wH!z!L_sm_)B7s9_ChwD43QXj8th4T0fskb2Snp)rTV@xqv$>9}ecK~I4*;}h5-;ytghZapiUHOg z#R49JQpmGB?|IMb?svcY)legQ<2A2&P0aNn4|zzeC#8C-1 zfLK@Vi*djlReo4MyiZ(<`)NEFp5a+o6C3~7ufi$_&LO~kpA*T$tC?RkH#?gEKC@$^VqfvFCF8~;FidFe@DA(({YR(JPN1%W5%Q6beX4uR zZ$C5M4{M1sL>Pqk%vz%aun*ZY=F_m&?iZe2a4YtL>)?J+=~F>crnG`xoDPrCjs2yp z02sE@c;@{utRQMjDO&}g^?IA1XHOAxrGnqwoB|-DYk_rOm=HP)8Nz3v#Z5Qw5e$W6 zg^1*DO7dEOy=C5Q!PuCM+4hHm>L~5{E8a z_7y@DMyGeec&D|@y3P#&SjH!Up#t3G)wZDw=UJVi2Y?}*tqQc|i7Fsm!;(e?irD!k zMcHZ3SRvQrKG3C!k1Bg6v1#EF7bgKz?}6Xx-Ggqi-l1bX8Zso9J(jl~0V^x`9-+a! z49~F!2tu9#n&x`O(OGMbWv;~VdAIz>BIR6_8VDjwz}l;3K4dpF%Wy6HDXWjOrrmBym=_BL+g#@9SRbqSJ~W)c9>kq^NOwU zrLF+*?CfRX$jx1X2E_$&Xs{cWvtmNUOQk+~x15dwz)ghON z_75j(uA70rW$e-||vq z=Hl9iXdt{I*jGasFD5vU+408pBcX-%w*l%g>FyV!nAhFemW_U_{XgF%_7r-t^Ayv5$L32mw*k zuq*_UGQkWXuj|m5v+ZVu`h_vrxsCJM_iyZ*dnjzJ)#uv$#5ys?ZDNh6ZR}+l-YBG* zAK?isN|j9OzF9vQT$`nA{1PU}eNkLsb|U%l8GD{%WN^Cc)#}A&=NT2ADm2Uwg&Rgm zM!ZRj(1;cQ&uB6%bG0Qg%79@I(cR|5>$Nwop-Wex&9mcDM}Q#&-v0KthjL_|j@|eW ztPJLfCC@V;;JqK$;$F;ywd5XrZ+R#0*GdZV2;dWV8?0C`DGm2OOprC?J1l#y&wImr zfRJK+C^O|=cn6p(UK9jA`^{lDL-q~|0-g=_CZPtaitL&wz>TPptOdu|h)K_mWr->o zQ~~h2_zGmw^KQQB>(3i2I_H#zVbL^fH573Yicy%chqM$CV6H|YPw z$x@08e#cr76i@n-=XI~U>fN;@&m0}*&-<}QfPhv0jc0{D-u8)M=poiqz%>j#v9^4+ zod-aH^<@u0S4(llHqm%Cw!f1Cz&T=zSO#k@lKCr)n^geJ0ybt~5&{2ZIBawiU(6e5 zUltSbW^4!s8lf>X@w6p2hMmtWDKeR%O-S^C%}92bbS0>Yt`N|#R+ftZN9Zr7)vt?x zB{Kh4D#(w?Gg!Z9>kukQZFmDj0vu$merQ=6CDyOzjdtzJG(Lv_1qzs?zS(r`F%a^D zzQT1qh!dt@65#C21hA-0vh>+nWukNvEC4?;h$vAUmc%~2*c`r(W7MMw(kD|h1{=6eD(w|)~i))>6~$1lK@3LGck_y z$wLt3&kS_K0}L%%1O@Yg@pC@=p5tr)WVw^dK#A`z)VMQqRLi#-p#@4|z(n<~nZ(F2 zPomAZX1ESKpUrzLqcjViHHNuc=BDy><&{^)y+HHxUgqRDH@$NJ#8`W8nJ{xCNe>i1 zEcweXzdWpPTmAB^uX@$1LOH-)j$jd2fb)s#;~ij*TvJG2=D;38z|-2-Jq2zA>&|s} zCe{i8Pp$#hJ99>1;rR>=@x2I=<~6Bw+9LuF0CN)QkY^PifWNtJi~qnrv8^%R?_KV7 z-}nu84w!IZ#0d$I7-%^#E`364copXp94P#MTcrh1?^e+NlJsBq$H`FeUw7r(x~D(q z)zwqRy0R~LE|g8XK&l*B8Gu5Hf~64Sn%4evJm+x@UD+CvD(=R$^*Ebos5k0MSpl$O z&UG-soT2jRFu|EM6c2-U*p|>wR}b8*0-&`bemO%ejm^z5y7@%v^Tr%M4G3g|6E}<3 zGFfOkp3wq7v~Ec&3yhhn9qH!enhJ-KNYiDEzjWM!&=B?zf_VP>_9d=AsD9b31J`z8 zev8F54$%zynMqrc{}xi{53+>A7MvSd2X7J_=R%~jv%^pVIIh-h@~>a22FUEiRfkd% ziUBU>wzMu?@3tKd3vy${OMw`c z{h4_Wv%%^z48=JppX?cv+am$>8th!kAV-tbI1q4(3r_eAR3Hqgi$dY9?Q85GZm)4xhwP! zj){r_H2l8zf4KXfPx#APVrxS#_9RLyza#7|nN(TF<6@I8c|U8<+zh|$G+KiZS~9mr z#hme_QU=(TQ?_GT(C;+F2eBGS!yP*2JF!Ggx#vz*0492AUA2gSqP5x5QHw`Q!Oum) z;&`#iw`&1u(-BMfESZ|t`pl3v&Z=v}OzpMbG~f{$0xYmLmQi z$bQk~Zz+DafzE0+@Tp7{>o6^Q1UuULY$lqmXL5~+d|1FF_AsLP%6wJ>r0c!DjCAqY zl*ckU2JybAC|H;)jeXcCy>0^Ai$GtRFO5IO$8KbAfjtRc6g|fKrN=lS3xv9J;zGrB zzm*xzn-$BS&o}E{=%>|ClF6`44jw!lpGAlw=Mpidu@ckkCRHTY{LOp2d*1iwB3{fp zMi|-LM^`BV0w#hLiOU`36GeeN1p|lKyRXbS;e0H1ga!W|Zx~_A};B2sC);|mf zp~m_At?M5qD2~0M2UT_-o1)wpN858gn$SMga#V~ZP$@#i+g-kZ~iq`_hj$0phJpvkm$$LQ&LYQ;S z*T4Stas40pkspcgxGxG3u6xdFTMNUCcvdSju++tn=YCq&2oByQ@14XytVo$ZbLH8s zsejh9p4DA=;e}ODu%>ti_z!LX_cU>t`|`{PV&;qj$GUTG1U||L?}KM$JrLG{QE^{9 z9-K?=3G=oZg#E#uCI5gmU?21BD4(pq!jC!gjI0kH54?L{d#C-uQxN)i0Yn=u&BqG% zNMKxyd6Q+kw&y0%_SVz?R#ke00l)tGgWa$E)-$W%uw)uqGamq@RU|-rW>^x)J5w1n z;hVMRcxcCXbSqEHDG;vNd>m+2DanZOuI0yzaIb+tui|I0f$awi09~B--u9 znR+`~W1n*g4rd2B^I!dCfZp7h_ayYh3O-( zbdkYWqVgiW3x)`|2YZ<~HS@p{wpox_r-*kQsg zgR?0P-;pp$Y@F-siPLK*fEMe zEL?;s*TeGVZ>(Xy_nB07mZaqjhk?zvxolh z5C5=x#3LRN&&-@TmVAZ3{_DSvYuLz#_sV<_z=SaP9R(3<9R7ol_x>m`yi?Z0+H?lb zkGF%pNHqiVL!mJqYpEg6XWL<(oxiQCHwlj4d6sYf#yfQ9oqJYT|HSU$KPcVs3Brv9 zbEKcR03|=C7kM`rALa8~MgPHPhuM$hdLNO!{MO1<)Y~a@SR6bM4kfIq1zss{ahySF`v(V_WDptP*`*YQl_^jlo=G1BFu^R zF-&Ik)jvd?)u+{ta3M&M-*1zE@I|#Dh%n2}$M5I0TD%T(m%4m~X1s5u7x>zlBt$Gth`DwL+AqJb( za1Ng#U^vhCH1pK*Wv*gp$VBm^=?c=a3y1Bc%5u;Bg{HhBUWyIIe( zl`u_T?s1QMg!ONzgU^W7qijLPybtDxU{&ei*;qdmGwy-1!nJwdgcS7VAkaCVl05)^ zxDNRNyi?vA-*F9u5ucHb&b#J$RR&p0_5w-(p#fX`>Sf|R6ME3YWIJ084!sK~G^{1Z zXpwPWp^|O&3wRN0#PJM!QJ^5GJaQf8jdH=>F_{n{`Hf$9`v3+yYk#Q*0BKZYz=8-k zSNj2ws7Kxqib4VFIvOF(U7`QvGhhaQ==qH2T-v?yEq@<#MWC6RB7ZgM)bOZSQ} zC~l&)EXP539y&N?G-He1R-dEMR>twD5-0+;OF~4W$LgQS#J?!hOY6T7%penVPL}Y* z`1`Q3yGCKidmxOr60NO8n~U(osDvQGb&L>S-)JCdO9%jTKolF+DCWGmS+NNiFdo)( zlo$X-5tzIOyAAT)-@oUB-T(N-KMLysW{B{#SquzPcPR`NMt--u-7VaW9A__h83hBO zV3HZvK(NB-*@L)_5j-3Zqh|Bt)T>Z5!C=-ZvT0vO?x>2EFlW6R7M@kFaAf7nr5FIM4^r&H1dSrCbQC77syJ zJI8Xq%w0tY`n5rjKsqW#;_bKV!MfWxhV|yUwrRHRn7j#SnR%H9#NhoR#Muw5EADgF z6(NeX&b62y?-*qS0nKrQJX{Y3bG_t}OX7Dv$EB}u5(d>i1qgnw#dG1ZwgSNmQ^39;Pr-yi6A#(j@HK=WYYcDvirX!BU-=)-%RGSP zYHSeO4}hR7OD2aV6v<)XKLIs9roj`tME_PMm3{*o-Cw=rb=?auc|)v+rDWnq*igz4 z5Q>|)7nTD?h%+mA%r+NDOL|Zd;B)Z=ME^9w(uxalVp`!QzvmrlJhq?TR^yi1%eRg1 z&NKudzfnf|%(vtXXcZ4-t%}DNOaWjhptWwep?LyKgfbm|SKynqjMdX-@k1nnM+g;a zJi`VrmWc?{sVlA>tE-DOo1dS6`>Z7LmZg6PU=#x^@tG{O6AZ{qS(JvEjQt2}I|%f= zwF=)`gxw^eWhDIYcuJr6;)oUH1(Jn*2Fx~zGl)3 zVPg;y1Xow~R8%lGQQPWQ?Y^vGSCjR)m$kq=<5n^bt_@QeX8k{(0S&yEOlZ?^Mb~Rw zbQ58(3yR~8r>6jmgJ*rm-~L1QYrl0-FnN?g-Z6|3rp_Kfpff1JLr`%HpX-`;a|<4X zP=HDClfT8|hxuTY!dPIw)PXZ-S8HaxFtwK8iA~YAlvd$@!CCIgF)%s7XLPsQ##DDC z!Uike@+>ht8 z8>9$>94q86>n2DP!k_CiU*=^wAl?x{f#6k!TdWFUZg?nAUJ!!p3Bp+1m$fqcS|y0J zVU8^VN5w=49YC4hDZefzcV>z?|I zOHaX{w<5>q;n}FR5dF}Yv!HN#091s8-qzwb{AKuzy(Mh7SOUhY`QCGQ7e1HDx-`HX zcfyj{t#L~VfMII$jFf$+qXd|}-!>J~$i1Z`NE`G`haSG53V_7UfC*W5Xx6@jYPTtd zm;!BcAU2gvS%d<1Nci?4UcX)H1J1;WH~GF<-( zR`-UbS}%n9YG6-tsg`mS~v<0k|JAy{ff(>9f`R9SJ_L?Y@XKJtS7**P;6iwr zm?m_v-U-76e8BbLv*;yF3yiYu;&1UnKy5#(6OD*lw}i3-SPJP!&S!c~+$KF2GBWiOq>ADAB& zxC~C7q6<|6!7vDGD-MO84L)Pu%t?F_@&HiU*bjUrw!InFDmx@fGEY1u2rl*kdqay% zh+sXM{1;tud9f$}Bmvr19B;sZF`d(wqfz=PY>R?6$Pzug|1a* zxu-(W1Vr{bGJ#{Z!=l;EaZ3t-Bf7$7{|G}Krz1cAEgk>{bgPjxea;s|0dSLPJ-KnX zF_RO#gU!I^hdHv5gp0HcNf)opM$BsTrMJyi>}F$k%N;JQS?`L9-?zQ6O=%>)1Bt|m$9*bJ-ODJ4o{7ZWlf`IL& zH`<)^cxMD+V0POpns!k%uD{`65Pjq)%+FPC0d@8>=^6~Quyp6~GvJC7tOqxJK>zk9 zipp%ptOf7sXQ)Cf0+S9WF~U(ziqvHojA=YK*3^6q?#a9n{6$gfN2r2?$7`;AZ};$@ z`JL+SV<_NsfwM^|!Lk)K_l5Z)P+-t_hXm|F_zFRbTN%b~EkBkR!qseTm^1H9x4A^C z6%6ChHLtM7)sBL~K=80H^%gK!7@fk(_^#!9DiOv^-TQo}k^-}|j@>3R3}Jcg;>Z40 zu|O#?fl>e#=0SYk=Mbk|C0p!&QTlp;HNRS$un1wy`f;3Yb1Z5;=Y6Pz@Ei=A>@a^k zEX>JwLGmU)MJm6vJe_8P3#}8*)--RHi zNzxy2Hi&4cDh8|B@|WX=3F^aldH@!(4QEN>>Srts3#7E^9c24k2v0YiFEX@sG4}hD z1sAzXrD2jRQnK-J?Jvw1cVD1=jf4Z;s(1ta6s$A21lKpx0-t~eF%LWiR!W>aX1Q<_E)A2x!tWXTlFW8yUtW>1eZhBDih<7F9&DNv$g1`(9yUZ+-iF zy8Arn=RYsG$E<%C3WAAui`&_3beKIv50hsDBYbed@)Lo?-axRZ`Le$h_6Q|DgUO4J zFDhS42zIq&*b_i^9`|OyaxXz%m={7xXie^6QX|LlEC>wi;Uz$6gZY@y)@CuAbS0A% z%YePkbl6v1nc&FhhACQ%0fycJ&WC<1QM3~w-{Z0;1b~3W!yqcCu~|zf z5yG!{#Vg{vxag@!5UI~{KomHegITN0v3OW`&(`y+Y@$?X)v+ehim_&{i%q!t~FMa7tt0xmhlr>`xtP|lNs~c3( zROsyWAYHgexz^Wy_3gUz&fOpU2}5LmRvD2`bl|}L;8i7qdnS#RVbc+!|t4K^Kt`#SkTkxml{s_g30ia%x$(Kr|+YO9#_}6|W2D;!QC` z)0P1W5@a=*NS^Qk-WA6fM!c=Y=_&w%eIfTOQ9NBaDnB~ighpu1^=57L0;ufYVimyn zgKZUnowSy=JfkH{;}=Z81>tWjBqoG*CP8RT>E>(~n8EQ7nTTb^FU6oX&dT|01QmdT zH^P)RE7G4ye?t96A8xS!tq92PD1Q^x4*?56#!SSO=4#TIxc(4Jsf{o0eielh%O4ei znh?5V)drk#w#aQQe31b+v%?nxU&vjBta#rlA<<``NlIML#68cI8LXv-ZLB_GZ`tU_ zm?7;!XH(JP_|1(`043o@Jap)$2uq+um3wAe<6*z{5I|9=Xo=k<3pW&(RB%|!E)xM? zd*wCV10V8>wcM{Q0b^g-vz_k{IP4d*|G5^HBuoe*=cg!wynB1Y+mu9Wp8wXTBS;YB zdXBg@1Zs(%39ASg_NSJI-T`~t!)##g3JvckVx87D*X45od)h=HEGOp8v-7U4*XJHQ zA8TZGzEuEidv5OGHBoYGQEXzLR=<{nl?=vYZEC|aa2`U;xIPvbYmH!M9x!~Yapt44 zW>o@%Yd+^W&xzl$qIq7{mU+JLg)fZHQ3}Y;XK*bnV^ICe^TfkiH$v~*0g+sOuop%7x5Z7Z~D3=^#V;ru_ zc{~r-K@njto-fiQ@7H8D))lXaF>tQ^9slv`yK~RkUvmKVqXZ;B+S9<4Tl+uAuA2cq zwlJ3#-!9Sr+Ir@2&2*ps%=O))fAyj&gnS2<@(~(hO?Y1WKNyB(pwwx+nHQs=YLoe< zy#RI^B-CT|hG7GS@<1#Z!wjsw-heNL0-(HVbI?=(RDQNo0H$-+G&ovi!p{r|PY=CL zdIj|W=y5T$uE)?kmQxgfuIsi{0Jf`nY+sz3A%h3R6(%FpQeog8Wdg)@OnRD*?Yn3Y zneKeA#b?Ii(BgRzmMhCW2_6Te!~{g zkZAm!F8(%8LFL3vUGg9{D}=Dt$*V4Zb9cW7|6+AbTf&8*^*vfECMq zV1y>EnRSn{0F%NxG*OEEs^xAHpwPu4->KyCygZ|o3#_rNxcSd#Sk`>c^`%7>apR9| z7B?a{-#`xIq;mgxe@HF6SRmz!1c+CU|o5C2woUCE_&V%je4lj zw;V~=Izsb-4}4(F+2MMeZ>0ruCs%+l!nN048~4Y6FmBH?zxc&3j@%EPow@05CYONY zQ98hd;8;pG*-JJpvsn*=xuQUrrO$l$n|(stVb0-wunu^iSSuAE8?l(EriYVfcR!Zg zpVEuL#6$8KOaT4bJD=AbIBPYmf8zh-0i1pIzM2bwkpi7X((3$NsmcMnV@ywTGg*4O zi}a7@G5F2+|Ih!*Me*JgUS_qkUkQi6)AbsGiNRn$F{Ddz4_FiFNz~W2>dT%2T#G%% zI+PIufKK+kmdJq^8S;jb}ah_jWq!rEJPV`T)-XJw7@ zSL;N?3&9dJqd?1T1~7qW~O6_WN3B;spwKCKLmXEt>;^;`+VHEW9@fe#MnH zQ(eO(0g(h~n1p1+!$*z<@l!U$JW4->qghM8H;xI^@U7Boz_}rm7Z(>!nQJsC3Jp;u zU=W=SVM68|nCBq@sLg;e7N*Dr>`LVa`N*V7klex6cMC#)nxE|T7TE^C( za~&8r0zupYgbJS{oD{S$Du`O;MUMdc9s$4}(8Fapo*B;Ox^PYl*~#8!9%eW5y&2Ek zm+M$REp)N8WXYQO8GLVhZXt`Yo?1ji)&-%703@#hmoLJRl1yuz^{#L%e8BR%hdu0J z@tmSH$^fmI=UI5SA}I<9&HYgzwB!-+Um#S3M*;d1jLSxCDn`2b z*&EQBt(WcKY2J)Vu)P`DoG+EIe+yjjPDbu+Iof1Dlh*apnULHn4JL9LI%~t^=Iod} zk7vdDZ0ef|sny1Ve_e?Q!@Y(gwa ztS}S+U8^W{XtG#hy7N>NnIl#o)*lRmy<{s{Ej5@s`%9b&_6|&h8f~m~u4NbsLb0Qu z3Z^im)Oa&bm66xI?sXBCK){)(W6ivvC_^ifZ${um@l7`5XbW%d|5yK#sWqN z}(Yv}Zm^7*b=tj$pTaH*1d) zX8T~FeOXW5pYdq18Co|rdw}(t?kK2iF#N?m3?C|s{QXRUfW8--D0|7z6ulU=)-b^j0&n)kwd zfxSh=ffz)rL+J9|L_-}VJnzh;Wdy`n|+4 zD2X_cfH<_9ov^@@wJJFQ#eJuuVfHTNh5n8bgZ1w7s7yp6&uqaBFP?`)?Mo$2hQWwf zVt!X(KG$k5aY0I=b70Oz;#Fx1d;^l{dTOpk*?~d5;6<>mb}rUK5>HE|OH27&5Txm*X*?%;M&*IySli>rZtA|` z_N5oVdFLJoekAC~FYoEM|KPdZTdw}Q@SqS* z;aQnK?;Sdo@7l4^3JC@Z07?N$n>3~DP+?VR*R#dGh5vJXfv&XjRpPAf5J^+vZ!Vef z?=u-+ECpcN4G%5J2Q&z*WNAm6Ky3oD7z@Jd>oL&Nr{S?(r@?qH-5KTpSXZnthCm@W z(alVvGCLX~7U9X52-kq{IiAg8>7Sd0>#9k6U6INxv*LO%A4>8_rU@axx+jD`FqxF| zK~z}#p-qno3c*gS&CLJBY-t-Yu>{75<{N4Cx(WGPO|kK~}&-iaQCV$e2E#Nl+#k8bh>E5iq1Y6N*-88QiP+3>>SsBg!1p1HyR9pZ;Zc z`Ro5SgboZuTnHF9Oa(;}#enyVm1#}705m4uX$8P&O}28s+HeKNO+y&=Ai_tyYzRfn z0R)X%_uSJ=an{tl1m=h^;5ugWA~cwrndV#zA!5@R6bzEy%wdsUV0LQe#_d#~EDz*a zu>5hY6W_KxR%=PrH7f$_VrWw=<|GU$pV?}uVuFd^PJmeTFDTFu{n%UON z!ZGWLCl3Ju%P}n+F?+y_blxT28xu@X(rj*|0_ncv`Rp2LNu>&ugOW?bHD;glE>s|N z;aY*gbwvQ=d6>i6i6i6t6!gDy&fZ`107^%|QVs|tIblC|6~Y?&UCPEjE!x~}(!bRK zPkHJk-BoXXSA2%ojd!jWi)$Fx;63x)tS#R|cN{ApQz1g>vAK{anOgJ=Q6>e0DrMNS z)k?NCF+(q~R;{5a6@)VxUrY}`JK!A*bA!a1(dsu(s2x^C=rxBv^{~q~*6B;AbT=+3^G@@c9XGEd&bSa*f@W`tA~T;5!H>JOoXtSU+3-u4P$G!SUY+ z7oAOTMq&A%2<@AD_47DA09Fz3*=CmcjZCNuY<|lF%X|ij*WXLR4Y=V*{3#jOpZna6 z;YO@YGe%nhG~{uHE9TPLw1kky;(PvPZvE{1CqyxfBoGIW9t*FA76<3D)*J(~CR_`ntPtVcT6z z%O9b_bE8y{Gr(Tr9N~V=sj$=z0VhnVjeq!Ecf1XB_}rRwlbY-Uz-L_7P?g>M#78e~ z)e|vS6I%6*Su?IOWMUZtTA&)sr#K!)YssPtfSv>)inaFn+4db^z^pwMC|79cUiZ3J z%#roR;=|hI9>m*OSH821lJiiUxNaNDv2!EOC}b|yIUqp@Te|6S>~o*{+;Ax)#Cg{$ z7~(+i+&mj=YuTZp5ZnFYhPEd??}0tSbF^9hT!Z(7V!^;$Ae^*t(I|U{3=nejfdIO< zR+>2Q6fg&_jaLb!!>S~6HyF&Fd2yU2YRpCBhyB5P+4DyZUpGFc#Q$;o*Gho>duwap zrNz>!9HBoqJ6m&+_(`cC3<3JuHToy9?qrGgKlkESbuYZ+%6LEYeBdXZ6_sx2Ote-8 z`4+4rp#T*qhNZl`Z`K_dV4e&At(*`jj`zY^3mwcm*1}Z*Fo}3Ox%B^o2f%zGlNZfz zuy2CZK%#r<;(Tz9W(2X{Z*K)tbZ25Ztje2!YB-RM5 zfpUPwdWYMe8$#c%dwbGK*L_M;4B~NU(IpRIP~&E0L4`don@6`={GD29FD-iRS7P}k z8E(31kuDtsFP}m5y~qvNC|v>r`nSaOqNS%E2!!)^PDhWO$h!1}Ql6Ln6@tJCHKZ^P z#Rl!KOd`&YN`{TiQxqI448$7P3haUPC<`QqB2LF$*z2lSV{wZ7iedcpVYYza1Nhv10;n6{0ASj7B5+dMxG3Q|pX3GjxLrmCYK>>CUF5JhpMi}us z#38IHjL153OYLkH#C|jx6=rUH-5%)7o9nX&5hTo62FzSxklX_TWzVv=xn}Ei;BQOc zuwvU7AM@neJeQsem;;PMI98ak-UE{WT~Fvsa33>;*?X*yIPI(v=L=;k*o&63iCX+b zKr)yg3KwffJv_`9<-iPY?yuXN@0mB&I!YbucF{!_#pk?VJb$b$Zu=klp&yF-h^A-# zzOH=?0?tvf#1nAGrY`{Z$3;!05j=_Wytg1lDu9*{GH(+sxK%z~oL4mY9!8R5yAr!*G!=bm#`CG zHI=PaKC`dwMFRcl(c*9Av~o@3eEOMtF&p^wz53Q1>kqC zK?oq~Cj(h;Hi*qQe-Yxv(ndQ5C z;^FgirK~4j!1&)WT91O@HJ(cmuthJ^iVoL*60M~_)ZrH*Dc~U{-O(vfBta7qyL1h1 zW>cY}F|Q|h(pr`u79|E{2d3es*~cL7SDn^nR~K7R35cpZA@YXfQ@HhFbFzh##|dAWGhmbuI*jLV~1Ir zk!*ZXU>|{W#Ny}r>_dbGc?foY!%KkxKxx5h=3XMt@tnq{*{@ui>#=XGg|@XZLo5L+ z0>n7b0vCQ(GE z+N_Joh$QfFFTQ7u5csSs!k%|!nI=k`3K;hwzKo~gM}PE3V?I8IAqeipId~0VntDXA zG*6_JOU#)$@E=8sHD(WS9M5G_GCha7viXS+gC8*$_?mH4>&vYW&^qONj$@#3@IB99 z2nVH#y@#UUJ+zd4Cu?gb#{7y7q)!A;-334KYb9SHt#A3e)n6_DW2nUPpEdP(t|6udo)x_-hA}LyRIz3q z1$8sm#`er{Z7PS$7C z`!zjB!&Nr_vJ8{+STEP#j-)C`Z3rpmb|y)HFjdQvV08S45t)#om2R_@wxgQD+xU%{ z%S;TyWx_BC-8pT2DCeu?u5K=V; zmT~+xk;6}pd7NK4gg;9d&cwH2Mg3vXribUy_w-q=8 zCJ>hU^um?bW#ZvhH-YY*)WWXCb8^G=!~wtI;Nhs{CwyVp!oCAtudA_qa}o$=^b?Rs zEpaP)j+ZqGZ9KDx+a3s%7M%z%pv5|8HP?+O%Pd|5=JknBezyD0yIfGMco?e8g`Zd! z+#A8nXM8WX4?>3TZJ%pd9{YlQ1yi<}k9!hfrNA@;*#sip0^h=&!;bx@2AdBObI-+I8zh&E=d+t24RF3L5{v^LzpfBS2=|E&U0 z@bldEuvgh;eaxS+^vGNZ=u6n+w!sS4140}@C!<0+XD(Dyu!hV9VdlIqzWCyBjpLrT zRFj&25c+J`V*dn~73b@LAg0cG+AK(hg))dxVI8>_f`j`rCp-X_d7^Cae)J+LAml-M zn6w_-&VJ@9s1TY=rV_<|u;+lv7)Fo63fcZ<}<8v(MF@HlGCQ%+ea^u+2-xu+H zylM!3JdSuQ!vnB?wT3Lqe2e>kCI!DhV}rr&(|_4Jo847!dS~~Pi(VR4ABMB!=WQl> zE9{U9t;KFOzjzn?G|9V-MH?b>Z)*J)=<%6~X<;cGb5W3*qjht`>zF6gj-9FoG+0|0 zU(s%N0s=CW$h+2q&3cF|%3wb*Ea7Eu;Mp?AK^H!}$3$Y1W~B*T`OZc3Qs!$l6Z=nv z$>(nswa-H`JW~Y#4O>Cai)-U$Xe4|G(OSRDf8(VxEgnF?13wpEn%{8&!t}7_bj87h z*klkF8YZPQ*5wyG?UhPMC8?%p(hvfQ02V)j+%~`D0|YY!FeA#X7V{a4dmjtF%Nlme z@NmZm+Fx!wu0cy+O93Iy5Plgy2gR=>`IQn3B&(J*?);+()?u6*2!PqZKSGjlH?8B1GIFn#O(H^uR)P7n7>%jYtpJ^irA4P>SqUo3r>kxBG zc;F!VY+H;nAUrVZus543F>juQTnkQq@B2SARsbFnE`8Cc*dto>yl-

=U5%%xAi! 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�>s9)vt3d(CxdQ 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�Af@d1DrRpm*Axy7{JM1ZfLfv~Xql7CzV`2+u z0Omv6qJ`DX2NS9o2VtRZKeR6zLfC|u?c4_fftevz-5a5WU_r}}$A>8uxFRN?G3PO2 zJqIzRiB7x(LqZ`8~1;QR7Fc1{HSMCHE4rMC1zwi>ZXN#9CwGHdm+Llf0qCl** zxiL+NYHNx55tIo~V8F$L993IW6~2EF#2tfNiehY7jPd#(oIi1^I^XkSkA9{7;kLUY zc7YJkKv#sBun<_kF!*%N!c-7Ai)uFhylF=+gJ9A4oNycpvj%#x-@FIG2(8FvgdPy2 zda>8Iez((_PR~qO zV@-)m_I?|50e}lIu&^sodN{1Q`l=Y>L4H0>-kAwgJ3ChtxO}r&-^8NQXy`#mB>el~ zfONvVgTV!!Nxgn50WJw9Rp%gSJDFRl|GOyH00W@NRAdS?SAb}6Ku3*@gm4PeRO6-G z_b}(r7*nzl5>XyraoBFf3Y-7kjEA4$YsJ*(b(A(yPT( zGxh{RsctaNKoHsj9N{crG(mCm8Lp*C!n|KTq9XU~5vI8`H7*L*BQVHUO&g|T@1-w& zX&wO?VZb$2W1yZ9o{4~-X8uuT40B@{N+SvfK$#2H!n5Os@LXX2rIF@4t)rzW`urQ} zYFz*{S|=mJn(M3&r0BY8cQflF4P0AW8Aw1S(LtBVxvZK0@%h82v<;tq&Ijy@|G2>g z?XrB`zXG+KBhRmr_`=j0&(9fXzJqA8P#F{=X>)FBrel8!@fy{q!8vn=yi}io0O#*~ zhPn*|Jf9V6GpWH;zFwXOX+e0&GAwlQ3xrZ8tDwez)={K}8kKGea~>k)=4{GlKgbq; zsMeNxm(Yza09^CCuSNk7NWTq@bs@=1a;6ok2}b_Dq$J-L;Lby&@ygt4pw!s^i!@LgBJ$jta6xM!fQcVaLd-RB z3-}5W@DukxZcA35>C9OZ!V7nZgTMm7jAf0OVM5$h5C_6R3(iGV;bfkOU^X<3w75ou zDO$|la(w}OKsfvk2IGF3tEZ_$e2$zx*AYya0zv8@5Q>w0Tg*rWZW(bW)9W_a_MO|paziL= z-1xK$tUfERD7NwayZruL*5#&tiwlA-*Y*sIX=9r=j9!-Pr8^ z^!%q|?nFgni@oKI7ua`x@Y4uXB1DCx#5p0n`5p#GLGl#=Eyhw^1p-b%yeK>N-)Y{U z+%&lqqC3I0NuUJUNM&&;wZ}C%3t|MUhv2HNDd;%_yb6*28lFH1fIl}qSioN^ z9N@trRz)iX?1)Pct`cdfI#3qMJbY!k22FAzzVS>xY*RxY#!S`b@0ta*H_XC(MJ@5f(S7XVh9mj zi|8E(Q!pdwrMb8s@1=;O-p$L0?|IZ-@|us?{=K_gBDaU-12e+Rn9ndAhopd!rpdry zlEfSi2cn`Dw6lU=lKPs8qe;7}`a=-FlxR-&o%ab(U(jBf@T0x~jsD_iToD*r#Y*fS z>xa11X3RPvA|?XStIxeTTbLU6kM;0(MgL(4o}bTYE+h(qwP2FMIO?cNJre{aN37m0 zC_47WN8J2%dZ?>yaSLoRe0ku$wr<&AO$}w%?2O;-dz~QTn-f}8L!DK-04C6fXofnK=TGZ60^nt5zQun2%io2tL&FNw5rH9VSOMO`N!Z~w0b{YE>m zfFJdM8gf|pQnQEBf-*^D@=&4I+uLo;b>-3UvuJ36y8vC0{v%RLDuzNHY5*A1ls06J zqRjB;F*qVcL$eHV06$Fd|03My@1qF_aL{bdlp`e|K+pMDKa+gt0}qbBO}VruLqMj1 z!J%O-SOOEJj$oW?kcr3?h2?>dSQ=#s#Q`V^X8Fz?k=r0WTR2jYV8Ia6u|5MZ)UU~*^!Yd}$M!IdLi zcxKj1B_EoRcm<=wIp^!HyWXC7@(DZWpo4A4wr6brz8!(#2mBU@&-7qy-b!a@O_=2m zK6JkwbL1*(@qMT8hdB|{kuWx{7DOb#J%DI0PbNPRf6BjAWb^-f{?wgRw|3e`KKOb2 z=J&6%`r7im-!EQJ!IG3?A=Ea%Q~f_Ljf-QSgae?=fd;*>mzvhB+I^LVquo)q2vcPO zpa<51U_~%!9)qSAbIvL!*8Nzc&gwrE015&s=%F6*!aSuwDa42j@<_vA09Y=H%D_f~ev}2Li7GP@&@0NpHW7gb zACTWCUuG`+eBuefe@{$LrGTOnKc;)+@KvKt1)pnyDL?cYq;hOTHs%4$=c)#)YARwA zh#H6H%oQP}+;JucWSX%J8=tW=UimRQ_~2ExchBx%V4|{WQB~83{9nOjv9CM_g)l1m zfKe3CkvqlV@;Q~^LO_`G_|HP<<(W8i(r>&s^~R5f>rpt?P4(l#3Pb?F{HhmM&Rz2w z6o}(G1eXX}DsG^H7S@XeLTfKUL0ll2tXv1JiKbWiG0%JKvBx>x)Z4xHtZ|~<9z7tn zG=RC#z<+OajZf6RzTVxK@j3h9W!DFD(q}O=&|<4s^jQP0h`RycG=Thz0zr|~0vPLr zL|~5wEds=oQ5iU4^aPvfiK-)~hBToxOlx^!kg;ge-u<+4F^Y zN~JrLqt$@QLZE^qz3QD%JFK(KHQVBWKx|hCOBDH6jw z%k^Lw;rk0kM*aN!j89C;PMU&BK^UE=I2u`nLmD9_P*C<y6<5Ul_#A=* zA;NWewp(w#&DZCC^6)O-YqKu*-x=y!?}XjlQWq9Lqq~H3>Jg;t>29~rU37^(^vDKV zwtT7k?nQR&QA=&vP+wq2;zCyYIn>ouM!p}0udS`gndU`N&oMPSWfkQWG3u=}pyIND z5cS`kKUQ9&Kihl%{zCimS1$>MR?tsHPU_W=KP@j6#saAYSNZkqm>U-9O5>Rjup&|4n?k`J2!sV~w3jReJP+eLoC}A;5GeO}08Nw;$ zx+|9V*`mP(fzL*LHit?U0Le{xCB8c88H#iKXkxOI`K%i2zsK? z2Srg#=O>IG4PY+xowlqfxdU!W*hFYtKRdq;uy5r7@|umfKp;U|CSpzVI)4`^OiRrlSvl zX*^Royg%MM;|GSo0O1X=kfPj!rHR4wHtsG(5vamc4`;FoQ?RHwpuhtG(6ft2Kgnj9Mq)*U(TM0->%Ncjp=V)J2!anIPmD?X_$7UVD1O)BgE( z>u9aD-FryQHQU+^&$y=BVpEgQXOW$9$_dt7UtuSnc$gh`PxuoB#4d`{2jFZ{1xjd00C%EZUfT=Vx330p7@c6Qc`FSgwJD zf|y?BdQrHm6L|m+Aqew%p)8?Hh{+&ag&D!USPy?E@QgLab$Acgh54a3O^xPne?Gqa zF9ZOPU<&*RGn^Z#$pb=H_mNsgm5bJRD>j#O&GIGg_dCZPQd=dN`byI$JDxv;3Ye&~sn$4Gu=A7`;sPlHt2JRWGfc;|(Iq-Ft zS6NwQX=rpN2$8#IC?uIgEP`xEW(#O2G6hAE8Y&92o@?P(&ITqxHlYEzFksZ!43JX( zyU`JMQQ8}9?NeLqpd-(TAk#6&92;v;#8pK*><5u^{B%`!ai}m8zBt6d!NQz0)4-JY z_Zo?f7RI#3$L88t5eN(wfDEw#6I z*rSg;NN;P@ioEI-FLZzY6?VYtr8Y4-W+QG*#0YUr_31P$v?$^Pv$^xHv`Syg4Ojin zPJQY744m90ixYgCKs!|R_vZkgVk*tf5CoWfaRe{t&HE6Pg|RgS0SmkL5a?KEycfYQ zw~sT_fEms2)D$VrW+W!1>QM>n!q(tIt3=8>1b}jpdXU&?CnP@10YexX)}UVZ!f7ZK zmDSeQ+iE?Xjc%&-MZ|V!VW0K(A@Lg{*u(rieDdmw@))sIM6W;QI<@DRL4I3+L1B0b zf{4yy%8!RY%A~n(#ifDxGZtFDG|+&E;38DYD^kD%H=(hvCJKr8e6d>&6Yd5u7K*ab zXd#Z4;gpWC2tbxnf1E1+08u8zCE9VF}Oe01w@E2f|&U| zpF?1M{|7&`fd$RBV(B6q8tjWv>Xhzwx@Cw9$Mk0u#I*1E=PtU;9(;VKGpC#H<74rB z+#B;7cSE3@@~agjBl69D;LPS(bR^fa5` zw%fV8ue$`U#?G;Xqe>#qV!!s*5>)X!_Ffve2;exe;9W z*A~@JWnt!HqT?Pgl#_DJ>4`MymL6|}MpXJ?A<)k0{yr_dxDB8Q@g8#v!zs#Ur~Mjp zGtvGTh(Gj6Q^{Cco!h|F13)^lzOgp?3=kLu0zm`{I5N^hzAh4tMG?T6xB9v&Tf2U< zee&}^v3nm}X9uiY7Mcm7P(L^uu2c^j4KYJV9Fi~Mmq&RrJDFAwSEkM6+N8O7my{ zg-Uo4Kq?|rRsuoO+}vU}-F&lEmd&~%Xb((Cfx^w?xOZIv}6V2;A^bF5EU4h=1lA6{G6WFz}W>>Y1D%P#o98$$D=BnUc2 zc7RyVv?~kW8`8`*?wah}zS~wGd7eM(xYKQ82uPs;3G!U6!Gc;>I#7TuDqPcE@f?L( zxDYi+MOwU1;4yrb^Hi)s#aV*m=f$}~Lz-5MKxBOmvONdLZkl_5lB*_ zum)O(T{ssl0%!id70dfw+7CIgc82*+27u~6f<4ip<^O2rr4_TPG8Ny#()@|BryZ5^GDlvQU z$p;qFNf30jF0Wm`#XftH z3xWGL1hO&RV>$!~0VbfBMkB5XoT1S;NVVefdks=$O}s}!K+}|UP)a#L956YICg4e) z5vB)tlWYJC%Nhtq!bma?@o5Rv@i&@^xVN-DS{B!X`>O9BZKUjkaQe6&Rs?80tQ*%s z3@Pk+2oo!(rl!sgecnMfH_2G9dRx7G(3UPAvesr70IrGeac%pOSG>nIZ{6uk(CYsC z@$u}6D?q5YFbZO_2CN&jz4{!4o5*v?zvjid0S|e4<0jj*af7}0-EXk-|MrY<^+*$z zmz0Ip4~54_`ROUEVNQV41DF6*3>NbS%1@ST9prx;mosug1;s%JS5rOQX-ozOkqQpp=sU z%%n4DRdoV_;P=JBq{T73vnC?8FeKV~Heb$|Fy+dv+D-Cxk8iSfeefH0-veuH<*JoY zO3G%u_1vTF*rQk39v3VW5JjU%0uYXp(M*PbQ2IIH@XzH_pO}XPst61g7pGtut^mLz z6YhVGjZH?Z;s=-f+8%mhmz&O8L#TCjw&(HxDg0soU`lGV(ee-q<}ts+$K!x7_X4)c z{~_hE76`g(C?&!~2tb9I7>EEyfj}Wfm_IH(Ja=hhICQ(knMo26UhtaoqUVhddBW3h46mtAq4 z3(iUZ>_TUh&it4&;qS8!uCKOX%|jF_GV6zlRHCb~_Sz?v+w!+XOPAYuuYIwdcJd(+ z`=OMZf8}KrF4L1WKm%EW@5{-jzQulX(_Q%*2w@n??NUpvQgY%8F_f6M@b^OJm3CI0 zf~qN@3-udlNDTLo1;`mGH7W2>o}1s}21$@e2+CSxy?<^2C~hZO&-fy;Y6232u^3EI z7KStz(aHQ*@kc5)`m_gzdTr&hp-2OQ_ut^A6@GiVek#@>=tnwc7U?@N znI`nQ*lPfb$kl&d2$rWO)rE$L~-7HNr2uflk zc>)O8KRO=%np8apLdQMpth4f^!HW2! zfsyn?Lh zjEc?b@|>w&8j7H?tKEL^?aS?rZ~KIQ9vH3Ryzi}iKhGs_6#;*!`;V6tWZ^_-)*&IT z?14aZSttM4TLi31cX_|YlXE602VPif0_sr*p}<>E2wJPIuQ6Z}MtoI&0&C0o;<5@( z1mdb6F#eos+gUuNo`sCh4b_c?8Nb9ee?zs|;za{)ruD=GAfmnu(qPykHQ;K!3^ZE* zetLE;Up`5CCKgN}FPDX&Nh7%jWw|J9Hmm^Bd0@U%DDtzb?zDHm|035&=iBh!)KCKx zJ@oKXcKlI8cIpW$ZP%XBs2#`u!x8~0XwL6V+HhoKJOY0WjWtm?GUXZ{m@={m)CmAM zGMCJvuyRI0403Ho3}W}5VVfAIA!){T?%LxP$OgOarhDz-2OqcA_EtNgnfuVFd6VJ_9pD?4TTJWW2yBc`p_Ou8JVRHGW*$mzV0<(PZ39k!a|E{lT3O z?3UoarHnMs4rUX+pjus_O`b{7bUx1>5>tT@Sd%6ozu*NY80{VN*-3lzIWMp!O9#Sr zr0X1ufCjd(c-?oLcDJv8=}T8C(t?9iFj!fW z!rlNZI`)Qr;`hP<S4_jj66Vp+3MwK7&2x2ChLs_Fco><_ ztD_L+Ru`GjiU|A`LX+`N=roFc%m3620@g3zm+OewVSd4U^BJxS9pMrwoeAUW8CVmH z#$NGzRWS-;OXcWtX#}pxbFg3hj_YDgAaFsd+PQ15mD!km>Jx8^%2ZN=WQLeYNk0OX zV1-+(7yRRw>@#2fVcyD6j$cSU8vi9EqeAPsumxBa6>c1iD<2%8uGkIdS18EXKYp)5 z9yOD(KdR@@Y)-Dj@7dclN^f6Y5XcQtC#XPVwXP_vLjd^VvxTL<90-Sm-zv>gh+nP? z`%PudU1-TCyx;?#h3Qf}xV4Xda0%(5wld5w{0w zU=;s8DiE`23^{Jih-(bu7QmvdUH6RLddGuy=bA^|;;6AzD_6ML`dA)1O?ychuTnPL z2LgatA!1?yDk;W9=fF8IgaCv9)1lG%Jl8|Gpz+YeXk`To1@px@3LS{Qan1zQL=Z|v zsi+77WxGJuM_6_f~bI&=|-u$;`y46>1b?%BXOQ14b+LEX% zV7}zR$GqO}@k|7{OLEVm0I^~fYPu>MA|mZ8o)Nww&n5pHMpO)qHDd|s93*sP(E+*S@r*IA=-BM^1k>1{lnR#;0ow zYoM&6ESGMi&9^8R4~+iO^3wQhm78npA6;*&4n5b##)o5+7R1jczzhuyjdss{_gQDt zOi1}g7eJkz0AqAS%BQlbH13V>!VpoeJwuN+m2%F=RRPE_AHoRSe@chP_D{t9NnvJl zS&!6yn#xJXTtG2IgbKy+u?ZWSazU_n#2$NmgZ=DRH@Zu*-c}!UsNHw(8u$NS=1kL+ z*Y08nv^BYZ;KunI{qyWGnh#>;*&uGt2;s|_pjBYLb*>@LdG$H|xoz%lJQ61RmMxp} z0U#IwCWCn~C($4X8U=G<4z7iuDI5h4u~F`;Id{VUQwgiaeP4Oym2nQN1&zh~5Js$7 zH3QHJzPrqK?j`F1LT8H9-o1O=YOJ>X!~1OWmaYEx4i_AQcKhwO<@5dOeV1U9TTlpW zi@!{ptj4Rex6pJx73YHgOP_t09eMbwz!C@m+0ycG=VH8?TY10y^-Xs6Yd@4M(_A@v zVIEyt8|^L=ys*$l-|Kw{3Rw!O;zR(j2RsKsVWkn3#^XK2l6XGWg`iM9fo4G}c!*`h z-#9PT7RXf>EVxGfv3G(X&rb(d$)d(L$>&r+NH6&=d_|i*`q-1cq2qSc5eG%R_RwH& z^a8YCcGp%%-!_7?I8zeoyqS3#bX!WRySpX40 zat4OUsX`*#kjc!YbYppGU<%6Z!OW+41=ui}ljd@gn%~XGA-nb(os2b8@I+@Ja||Xz zFzmPA-+G_j|Ijn`$3HniI`ghxeLzU$#~yn$hGKHC1PGZkkMik0;(AI z&p#dwF=JugHQA2c+iiHyUMKoh(TJ0pSa!#~U_?w~<(rjmgBcN^6uJn{4x;8O??=;W zTCsW<5Kzzw*$iGk`N>a00I+7>1F@1KJSqAOgl4zi1i`>5k8TA%ck>N zxqQez`k^-lWIcmv>*}i`21S8dOhz+iKI&zsz^>KRYLy} zD6E7=VWAyo05igf2rC$!{VyCTF1$(Ji)*NvgmMGr`k@r~Cj?>jFUU<1D6Go66`xVi zH{T2-C}GY0V{wYI^1#Z+DyPXyUqAphFg-egUU4PjPc7151F`!3p+ z-0OrhNo5YlkLzMuQ>915-7;xCQ!}Y|JJKQ)Hn<%1~g|B zYq$kKS!h>lc>s4XiFoniUhDGj+uIubpi^p#TL0o)Rn_SJQLCl4za;etV10l?SPV{} zTPA3CBF6|bQd*ipK)G^=4rUw90!T6$wFF}>45r+wnRa0?KH{#yuVlC6KJOVSC`g`|RE|cUePI zy;Zrpgdad?Lrh5Gbi&X>I8B|)J44rT`y9Kz#gh*G9B z?gFj|8j7kxO^ZSZAdECYm#;h%LWi#iDTEG1O$tP!RB#1g3Id}r0VZrqORHOw!#2EY zn^o16xusTTtxh{N^_5{&P0p6uFMsu$hyk7U;?wPshabw-8q_?edrj=ZqSAm~eim4a0An;x zFJ@ch(vGs;o+AK+amU4x()g$HXH@FRAxw zN4qX#mx#Cn?m_Vnoq($7i*jN&zh-jPe*_G{ZlB1tq9!vt72*(?udXe#&wS+yucTx7b8NYYbHb1k^_Ki&1U2E=j2H0v{;pY#;R9f7M-EIog$38JR5!M1)Z9f?V zN@9IY*I#>;?RI9N$)?!}zOkVunret_S1|3iBx@Ts@3XF+70&F}#TwDpmtA&Q4!%8= z6vHH{_EgFjO9UVf&6iXEIq%~|V32FzGAMqbf+Q8>69fzQgotWWpWk z?(VVs?!U*X-5BfYX^)^S5MVS8(aaS9DVulN^}oH-1$9RVx;yWBN1uw3(2 z?wXf5gLI6&@tt3Hv%f2Xj6zIdV<28k;-N*0ZPSJ)ow({^Vl2qS3l?-+Z<~|KA z%qS!yz*sU0ORx$iorxJcwTEfIPIP-mMqR`2b73$VntJbE*T8PJ4~K?wD`GO0JXh5; zS$S1cFvs@osT!}nt;6p8<1Myx`_@Raf|S$LR3GiN^|e(|4owjgMM+O@e8%p3c(1i} zxT%?g0mtl9;S2&ZrtLWMtGt!J$+Uz($Pz$^n&rp)(Nb6s1c}w@NL_(OQlY`rafmC1 zWya4iJ!ZJ#2MCtLFbN9#fqUJ$W;)|bpr@M(gZXH%eS1ahy2m~6E*u-e3+SSRcSmJfS{RmOgyND-9E2oa|tCCuKl zx4efl6ABkXq!5LOYh$VLd#)`MA>JdQqDC$8IiJl{@)l*;I0g3vETPCI5=9e6l*Yh} zQxulhp$9E?Gjq8u?CXjYU{_m9RMG(iQpdGjD^hUkv6$e{Vff%q@yfe&PrA%d79Qv(7v{0!9?Os4p9-h$g@{-nwO-`}~czWYI!*NxH4i zH6`E^otglZ>Bo{Q;4 zSPW^RP$r~tflEEPgQ=(9h(4`PI2<<~+`Xnw3L{ti75cY%on5wF^J;R#^6 za&L$hYXCY^AW@9d(b4GwaJOw<|7fmfpgrbD^!S<8)zVk>jL$2b1| zF1!Dsjczdvx)peD44N4l9E|Iu5Lh2{0TZBQp$}ExA>dMwZGTv2M;^Y?KKbFdIdfNp zYf$Av2jK&r1OaQR2AK!(nm2ts@CTlK{Z&-`XM>G?tsd97oBaNC9wwKeI4l?fzU&!7 z5(^3jRw*Tz03y(Q zbIm|w0Z0lYsC+HeM9Zf-{E%gCdJQ?#b=c6rf~WVt+XxH+1?OZtEHjVn%(MZb;5o4 zi7obx?_5VKWI%60JOskfga}C?)53r-wa{i&UoJ2VO`K6(IRPnLF6u-$e}S0_9T(!{ zJRn9)V3Y*+5^A!9O&a&LC)^!kLwj~U-@icsh#ucQ-eOK zUupFFW+N6=l7hb3BK!Bte{G-n@+EG)?NdZNuh1g8kA)aPzv4(8GSLVy5*pFw16T0b zrXVaktYb{_+ittEbm0%|l#`E7 zrMXvm{}|9SW6 zBik`In~xdbhOh`gGah(kquqMB{QwX&_7jSeslE%F4 z&L{24tN&=vY~5~$9+De#EZ6_Ey`z@QB5(y zd`^J>`i1w}L8}*AMQM4Y24Q5hHC6y|AfU!}?cQfQcJ8%p&+M=rZjo&D@Au@YLW?7I zkcp{RC@vHPw8Htb5(NH!KYL<8k39OgwY7KJ=*YgjwM|td{=TXURT7SChEgE4iK`&k zKA0QfN}98{~$ysy=Etnb&U*=k!m;hEB!A$&rtO0~n zS>$aqQ8zF-F&%_Nkdb1iOsBr)tY!ZmMG+=E_ zh28tWdi&)KkK3BN{}=+{)RR_NgA38>%IaL?zuYEgGPcJ3)CV5k=sxo1sAU*hG!U8# zO#(5XwJ*K&(pV3sJHtK@<}kd9N7Mj@?@wf(dVN*~ zVo?XK9JEh=^n6zob%Fg5kl}vr%&p{HC&ngi&)$&$qS>)yw|`G8XC#CY0wCf=v=xkl=1&%VQ@uh)%?Kss$^0rC=4guI9?nm{@(Kr zU1qCSF0%HvW?SW!0DvI%b=9$`%8Js|gB_*4W4XTWijb5=xydYS9CZQ#2I89lh(LG0 zRFo~sA-2p}Q+KP~aMjIr%9-!B=RNQ6U^>cP{rZ9PCgb`9bF`eqR(;Nb>v7ainVt^Vd!ZHw2aJ(-f+@rzJ!PGGFOv;f@N4M8_ zSQ-eAxm;`@+>5e=CtwRbU_ROx*@B;89|(C zPD&-q0E#?eeSXG6L;ZeMUExN8CE3y56#02dwTYutM?_!KdQ*xO!MkVoaDc!d1jx=1 zd)e)-!QJ;hZoj_%Hruv6jV=Qn9fHltMVqV0FZ@lRq zyY#2m#eLD_xUvXY#Zn}s5YVg<;h83I&&U2^m8&`trWZ(zz^a6oeU%jy#~DUHJvPGk_fUTV=sCMOM?^Y%e?Gopy_xw!Ka$5D*Un5%aL$`qsDd z1YYS{5v^HKIvLmm3@BwS5ECi1a=%w`v`N+k;OEHrSOAfrS8A&&qh%RlnxD-^4}yhH zX5q%n&SQp_+c;KCRayA-2oZ!Bu?*5fW0O-kw=f%40A~aG5PAOSS}QGy9s(>K{E7V| z`=cBgyaGJ_lG21YLtLV+rO|djv)w-UiJ#byFaL!T-2Uisud1pJXf(1Or#WNYdg~uz zhQR@=R^|Hs_XaVMHr%jbqx+Y)+gsjpo@>U(0^|Z$s`a9lz$yk+ zQU?%)Kt-ubi=bZCiKM#Y#OU0@!XQGbZaREhHc6-`+qUiWL*8qvmiu}K``rrY^>z1I zUsqe0{|FRXlrig&%%l6pQXZF{ZD&$`N9r#Md@^ZNc#2jRMHYh^0ZM;K_dx)eTtE?1 z9_>v>A&pMebybnk*t~g%`=}Gq_=J0aRTOBr)#VAg9Ba#cO+ZrcGqX9ATZG5x#EhN) z_y24=hD%+T*1LvHP+U}pvG=6!1TezE!mRY(Kk?*RTj1JxL2tJ|05Osxw~TsR1Fvy+ zW8799^gMT4s@y6mvw!=yuZJZ@dQaVX2z4UVSPt9^tu2^pmBHeBqCHeU05S4+G?I{x zAV@3=-bZEb$^hVfj7oW@)%)bM6}KwO?O*t6g{F8sF<@K{Ee*e0SayKl6Ay z@AWSU!HNYC6|Kz1aJPgsH8_#D9y2h%Yx+sde=OIc6iCK(0B@4cLb_!cJw^aLlN&?= zn$@fe0A*Z@d#qN(aO3cth6`}U>^*D9-=;TA^C zeNT5ne{E@M41bwuFOqP2l4-4F0TqTOj3{Jo+;<7%xwDx(N-NWSTRIx;-!J*Kz3wd+ zMzt6tpcqoA{&)&oFkvx8(N5&kZEoBaE@-vEh26Gz(ZUEwf=ElBKK>W!Kukwcd}xt0 zCfYZ{H!ce(2vdrjA*lij&J= zUK6u80DQ%SP+V?z-*d0;>wbIP*{3_xH-v_z$Z2?ZEUbq5Du+bV0D z?Pou|!uPH>pT5JiC-|g$rC?@hzVS%dg%BsdBOt6nBLeME8!yj@mO*GEydXe`x3#s+ zHTH;Y+5Ds}S=4VsjFBHm0l==V*682BbxboKiD1`6(N@G^u^t0zZ7j|)pxfPwn_?ta zWksCDINEu9A_A%V+%iBwQ&jc918W1sW#i`U_FugS27ms-^P?^SrBm<9td{oX;!L<9 z0iKK7fVBsv#nepvz8iEXDqH80g@YoY$Za+kWJb}D!bPZnXE_`Alr#33uUu(sH|z+M zW6lz53JZn3gPDcQgy1Cb&YmNDITyaCQdAR`IX^+uDb~W@)VKuga4iXpjBEF32j&eB zpX%RL?W9O9ejkU7S%IaHQW@P5R9LlQC^7-0aE69@tk=zMdhDyKXu&Nb4DQ-76Iz`} zHKVp?XP<2@iV8uXzH%4Bb`9Gepvh%Np#~KRy-~(W+G|Ldy`b2d-Qt$b1F>Q-}(ofYyKz z`Cb~maP+yb2KhWpj}{W(hz6f5UcA)qz2}eCQ0D~fN@LKiH2ifyue=ls#BZ>sv`K>(%Kk-+>GC%zP2VZPBEg6QeR&O#aL7pf+v_AKh|FB#CwBFY~na^$sMMzi!@Fq-+C52^% z5H5^iz=wQ>z^-r$3ZwmM;fIf8QD8}CTw-KZ`m6k*03q~3%BXXTn`l5JhtDCChI;WS zN4T_Xbt3HwL|~*g0i4QQA2p1I^xm~=UjS`X)h3Ngb4{}Pivn;1CM8HhN{#6I!N4=z7{@*TZUD}@36dh z56t!KY`NN~Apn`UwXwuCP<>=4=Ay$gl`i9wq-n!7IoBsOT>*B%!))3Gy4xSLocjb{puQwsp2774vJJOdYuQ-*tXr3$b+_W*&;Xl zd;I;b{pr?ptC0dAdh{v8BJ&caf04y=jpwHQmXxP+)cnYJu1p#x%UQyu)K_F;7-$0T zoR66yQ&Dn0=6m)N7Xp`FenXs<7)1kIqJq!YbHP8p&Kj9y3d9dIiz&ey_@FjJ7ZIQVi+~8w{;Cte3?$#&)7fM%I_Xenx=uIaI-}x_Za{n{ zQc@wAo!JO{kXjq@4FM>WI&a*A=_tra>7L4}H0iY_rt9ptGhg=wcP|chrko9J$phkJ zs_q=W73+jF+@_~DT31K49dzJw_koiDpvi-&#MG8gM@Lj@m_ail#ra$XfFlI%KuyV} zR%gITM@Q+I9!t^E+%y?rq)--^Z}l}5QPcm@*M7wAx@WC*`@QJ<=Y`n|0}D2bz0$aC zs_76A>dZm_5S>=9I0PWKhSFR4d1?W@2Uw_q!8lNuV`6ltGrNVEoS>$w!ha613m1NY z!|&InEt_sg1R_;##5lHY-(%O^vfi)VVNX8sc&rHxgJ7jVMMGm)I|@QQ0^D1D=Y`PI zq_ODOlXZZ_M%)PVlq>-dU0b$nwEcUwxvQ}>M#xdA+2;Zq0YCt-x+Vn^iOCTBDT}Jm znP?6}d!nU@s!zJ$BlbcsKguOl?j>PPu^IIq%#NhIn)njkh0$$VoT^N}_|;3@y1Y48 zboMM-j(S}_`hhouI}4&Qfn+SdM%VOMgT#V}<&?R*^68I$-9GZE?>xtiVC}d4_S?34 z<&f>!JDO73#cA+tvV_v09C~4X^Se9jW1ss)AZSz846U#hRZqgm{EToFji?1#KEEKw zp%c|wXm~3Oj|+*V$v@5sx{Nvim(~FZrbY=N0;|X)p{dkHJvf3u=@S-$S%)uH=ZtXb zDTmpDp3XSPg@fJJ=8NXwC{Q8g6*b>3d8;Z??zp%#hZGc&cP@s1;4hWsS~feKDAujr zVkf`sBTiY!eCBgRx2|Zh<%nNMb%`=l9xyE0*}7wYsUf(7Ii6*ZXD@KcK%L zMQ2kDHv*utBB2#is1t=F*#skwC8A14p~1}Nz#1{>nPbq>Qg0vrxYkbq%-heKt~X{q$tLQ6EK7M>jK>X;Pg#Qg|Gh1j-B?hb3Pnal-%8vsY)flZ+z`(cJP7A+>&dvw$|n};?C)rNIq8L z;IcmZ(GPxQuYc=>dBzvS9sL5wJb$(Q^3u=R?!6Zr3tkSoM45)Q=>(RQpCKH3 zzGA)#RhA2D?l>2OAOshUIo0Eu|D?D&i;(fCm_msxNZ>Fjh9_Z=roP zypqGjQmCpZi^@7uCl5Zh*ARS91#92TD$OZfdJ7S={IT zWLv}mI^8+}2$U#)T|;#=?WD@SghE7C0_{>tTW5AY2Y^x*zsJ0+#LXzlgel1ZVzE$5 zK#b$^pZ&o;`Nhk_oF=dd69~YAfEpT-bSe9Y-$lh8!W8W<h1Q-mjf*kgjXXJ1A z+r&oNTH7NNvGtj!>B#bZr^zGZTC+ZyuFy^`Elr_8iK631F}x&cM+-s6MCGVo$fS|# zR6{n^RoNTP|Eyhm<30B3SDqEZNF8IE3(2!!x|c9-~J9 zEl=d0G%Fd83dVxtI!ug5%|^J4#7w5A!U7~KbMBijwCjF*M?MZ9Fi-xSdD`>ss3Q*w zKpBFQO}@`$lSpf~x3}8nE!%AI>a!yNNbLtfNx4g$H?QAc|BV=el9XS0)E7jxXi-XU zwz<}SV(nHt{~x~xN4U~^D$W2pLTJLQGW~^?%s%sXECQwQ5f}mjWeuDGXTkmpk3bWi zl{w?wA`K`212#Z|C%BMOHb{L98PJS0UJ&j2^&4XI{^r!fo$>mkii_$y0&f+SB@t1@ zBpn?c%Y!3mLBivIcDQ0Tq<(3n$I9&f2iMuDulR`jMgxJOqY+gQCK^VQP@;9%seJo3 zHv8f>fO2C0tmX+p#M-fJVcVu&^niwXUbAQs*SpYuf!|zP! zNOMs|h-tmm{n)?z&?Wxf>S)as+>;{Stcx`w0AOSY0^b?4?#*w0a|lp^n3Q)S0A#{( zsAyoO>(cAc*wo?&=aRnGwYM|;)YwQGkm^=NLt{f&9WZ~5?-%$BEo}*k4aO&sM(Hw| zFcXc@?Hi>#mEudsRfwiDOWcfnaZKu8Tn5%xr2B z!-B(At3Xiu&jjBX{{=14mR(i>7{_!34)N6kIR^`q)EBPZ*i^)C7W)1F?mb_yuYdQ- zznTp=<%C0B@hrBUuC}OeVWt6QdWQ?vTDP=bbN2h}(kp)ZoX=E;hPOO!#@D{|9$T?& zAkd^6>l>oUh*$!&1-*2++j#q*96m+i+*7*I{8@p?Qeb)hsoh!F>y^n zFsW%q(|b6S3of`Iq&fjN)_?TT$3&0_L9}+=`Z(;hYoD}@Pp=CtKRGrWKo$7LC7|F%%jghUx5foPWv)__K+9Av5S=jk=YwVBWV zFRAG)2s{8@r(!zQj8pw_3>hDQ8)zw!;AhoHX#sx!-YnSTKpj4~XR#t^(tO$Ws5*2EJ{YSMUjWM%R zQEkatxAZjIMPItoetyjwo0&@3au6Vb9|6G6mt1m55DxJm)dEmbOnOjzBs>6UMAdI!O#IYI^5>;{osG}!<3``rY+VK9-Xnjs2 z-sS=(&H}HZB+{Rhc4KK^uM3@8u36`g|M@)gHnz4k3%wAoCJ?b($O zZ&&3?UfCG5r~+%xKk6uZ{E4Tmx@^KuKH>Q>Z=S-8w&paOkl+%Q1%7bC&o2#g60?v1 zWO0B~%!d_1^;k*?mFC-KOLI+3i3zny6WlxEd{(3rY2fXHUwb_^G2(x3j>}9 zVOa(N)g_koeNr`yL4n^A_|E(L!jHp z0-#W$0c?Igo?(KrbYEACTXOf``>3rx>h*uY{Irjsa?)YpCieGqMSTlcmz1MZ_TAin z>R)_DafE~#JQEfN>G1wN|lg|;X%{WnJIZWmK(Nf$9rsr^Z z6W=Qx!S@RM2->-&rNcGRydAi7z`9(bFX(EIia>Itn5~pgR)GKKhl2S{RGPF1ee=_^ z$?Tq-nhP^K{I%Is=iS!XWS{@iW%k?K)<@5HPfvF|7#k$t8XuH(00Oyb^Hv+(_l&*j zWhVs~=z<095hQDH6S=!HO`^pWDbCv=^8v;|poxZ!WMC!;vNRPpX`RXO$;cv*OC}w3 z^)-L6*PefooqQ4{vrk2!hP_c4Cz6}J(?PJmXoQ~bUR%Fmt(*4i{jf)z2s7dHf>c!J zgjPocoN6s+R*0+;lRr|k2@x4npY$XaO+AP2+OIZOq8sDRa%n&WX{xf!gul-j)z#HR zyrVehH-^UYU1)5owx9pnn0-CxMNCxx%ViAubVKWeot zU9!Li`@5~jtT`ffP4QvUZhTd=SHT6LvG(>YwC4H} zTehg(db(0AKvz$TTL6twfI@==Ovd#I#uP`YBpVoO)W`$>T~bWh%{Sc`ZUB-IVpNwDfj~A2DF?ywdi$Htv_%X1tj{-mK~F15*+9*qFsUet zfKrck%mB#XD^3MLjE_zRI&q9C2R59Bq0!XA2mx`Q8rK?ceZxoW+ZSII9cDmrYyP`N zZn2+W>k$v2c}LZbe_C^=?bx=-THJ4MbF;tM39zQBCQ407*HNtqBS640PzB6<+z$7P z(O5K15s<8^t#C`HBK%oAw#v!`G)g^sag@iFM!Jh&D!?ZISfI%OSj7or52#9m(3_eX z?5?{Wvd?_&dVl`?t}z~tmR?%DmFtIa2oUmY!iGc;5F0`$@chsM8V1@y5XL-(Tt!+! zrY(&z-R;fgcF2K4F+7$6GTcPWVxr>+=b{Mk&F2`>BKCm*2ncrMf(vXwS4wanE&W`S z18G56XQ((WPAIta;?s#aym$X!JU=ri>zp&tIZVUdKKEKwG-3FREnw+ybCu6Wl@0oM$d8 zF16#%_@LD{w%EG0PsD!0w1omdgGPAa$5RLdt>bzkgjL+5!6|5d1OyhRVgy*p@U&dE zs6GW2+?hOEIH?qA%|-D;xB(aB5Hac0Ifhxmg%JoWw$zESy29+}!|f9wj7Lg` zKozJc*+3XdK%3-Qk+Ir#;Fr-wA- z0a*j@N0JdAxbx0Gx_|7x>LEjR%5kf$o#<_MXQU#@m6LXR4ViFPT52?*)b@kjFsEzM2sjrO*8eA#|@>2*$=S>K=fFvSpxXPj|HzMG4bAMt?I zs}FL&exu!T^9?pSyvsV>=WB0ivPK4{xQkTnnt(KEtrKIp6GMeFd~HQplm%0mNN|wm z7w8Q4h16A1ZqQ0qbsAF^elI9T1W>}xxVtyd-x;n}?~1eXd;8a3(65S#5CBUSflJw8gA02@``6c1x@BDLmU5fz z*ty%U_i}fGI-_hH!AY!z*wJJT92Y)QY8FN&&CK65#!tUjCJCNZ--Y1M5Z1B^pjAP@ z$7nD$3TW7&dqGo=gA-_-`>C*caK}(PUr$=1=V#Kf2XUJmDC-_L{4M$uzw+ zHu<>YVl6aEJpJ@$TR6~fuRHr_Tj^4pDmb9QVICNUi1A!iM7(k+N74`CBACh&+$1W`pzJSa78?gt!sAkAdLHJP7Dz$NfK zX)*Q{H;cv?<{~CUqpaZoP36EbXQQq@WBZ3k?Z{K#YsVaQv=hx}xOq|rd?mHX?*RB5 z9^MxL(Z?Tu%tl8>UArv}?Q_TNcexMmn!KesQdy%h9JDEqT@QV2+44+oPGZ(+WYEri z^{Mv4<5#%V*b>D%0i#w{9!de1iGm<#gB0L&)}N`kEZjvVJ99>yOE@wFuNf-i0)lg! z`yW1kV@rem{+2a%+-ZOJ90qP}ZLqhz?sVI=XJ1s2f^Pv#*~;Yut`xV}@u$BlZ!L)7 zW&Rfm0PcUxk*gvYjSDf**A?(|sW_|B`g&Uf$mPhB-s;xkAyHoWCnD@#0tc!pv zijSbY_%zaZxj`fBF$}J%Q_hR8f&xQuBPa;)Qkf~J@+bu24KTI_QE=cK7>p)pFdk0X z0JYzubqU0A@g;8d9e3nn>*!2)Zp#<-TZ3<2eO*k-{$TF=? zl(lu0QASE5Nn()FNJ~OIWx4LM@)*Ea9PPie?v8)}RFqoxQy{LQEESYAA0LEw{PD-- z5nB)_s*qzk5q|Od4eRaEhwpRWw%WRTJFUB;%{mE=x&Q$3sye0|S4Q7?jqgX`%|lpa z#bM5ZM@Y$Nw7llVs6oeQJc5BGxsm6@E|j0o_s`=q7Ukv}MBT-FU>pRn#nenNO9E#p zj|{^xr@lMVt~BQGQXq<008!^CZi@EbCR^)P!j5elLqJu#U~g38ic6whyN3g)bI-0l z(Q;fHH6Ur^7uI4bfGV-hZd%5hVmi+&PIo_fs5eT*d43RcCei98MUm-9%$uyj5DpVl zQ2|({z-^}ZfA##W&eYfb`W8Fw74LtJ066G?#rD#_Im)(f+Y@~NG%5|b_C93w68q)$ z%l&=Z?0xTil^@zrwBS;<3!~RZJFq!nRYx&N3{G&(f>6MOjE0ipl!i>+A^?&&vv9=!jaXb$Rk$xjrxy)F5>U2b|ZWVAU4Q%>-T z4l@KGCAz?=kps^}@UA)twkU@`nDJ|4zRFi6pPxG9QoAhm@$=E$SenD&8_P|qVV~Wk ztf&lPz_JL0V;8usu7Th1rq9^Lm;Ng9{RlFOPf!NjgXhAf!H?gvd82LL_H-8?X*vtOb|L`^-_Ds`@Uiq|M=JWXNgd9t`R3qu}Yq}2n!fqKrbkIWh^rOrmWh3Rd`Tn-V~ZN+(dKi(Gao>1_y^?uwz$Caa2wXxyb`w zJvmfND70@yuFEZoZK!CQNXS5>amJiT(8%O%5ea3voG*t*(MO%T5Tvy}_L#!f(S&?_9929&#T%s8L?Lu+oiWLF&dG%F4x3SUP ze(-&Pao_9OrqkV`HWx%~%xJ4BbInOUxY}l?vyt-iOZpm0V^0u(`$xt@dsSDK=4K@( z!Hk8FjXeHrg2xJXp*jaWU6h+)n7SQFivbOeX`P*)&(#IY#IpwQitlfIbB%rWqW`cD zee7Fy#9;>nG13Xhe)13h6VrX+z>xj^rW;&f&bay79p$?WB%v6IYC}LXX2Ue618*z@ z=fvc^t$%u#U32}-aZZAmt)Xo0B=9<%y3I~@7eF`Y_UaAuh3~r7xmaV z=Y7_Gb6Ia?4`rs+ZZ; zos$7!kI>}>!>YRyMN3Lqv;1W0vlj&Ua0&41H87P%E-WqHi^k{dBKYp-B8&jO=Xbm> zhJ$7UvN(Z$;%6xBpgwXwpz>WJyl7w586yPv+?*dsH)XiXdg6h5W5P>)FdSwsW)UVW zsXy@ZIk;eYT2nJA;!6+^=1X9mDN;{KCwxlkaNYW?cHXyQJ;3sj-cA>WQoUAe)^)E3B=(F(T~Q+;rkhF$Xu7rV}%YjDTgd1ZU&E5s3}| zE)#*oT}~87o%(+3Xlstha^aZnNQWJMgsr)Ijho5$+rkCCd5nAN5-|H|Yo@f7At+Qz zQkqI681sH=e8y&+sIfhSj64y7G8^|-4SXtsQKUQ@xpNR}6QD{_bSwtuAvN__aXd#! z>VQiXhiL`^CO77IQ(L`#=X+P#M?ZU+yD4dYJpnw-MFN5lT^b-VX8ZPTb(6TmiLxW` z`?@+?qCTHsFGXKr!ULe`W;z8_)3|xQmT!Fj*Y@yZ>tf9)8i<#mazd%8u!kOb+&UUF z_UVtmIka>|b(vLFRD~r_5u@a@IYgqO1j71%e1768t%LpcjyL_2uk9Dl5da_i;2Zru z^HG!1=>nj?zcavYvDSK*zsxibK*MsLBLt|WaXRYpeT4b3h!-vdm!dPE>YLpHY^bS< ztP&NA)tx8X0S6u&U?A{R;R{}aAK4?}7D5+TP$)TmCi5cD511PPAn+A_#vPXh9I{vh=db4C!I!|=GHqOwl}}`TXw+8 zrFPdJ?+gKe_F#AjzUP%!{=zMoPPd{;Y|verg|5BWO9?cFl5kQ)=82QU5EK^})Z$aG zu;!je?W3RmL8N{UIryNU8BMd{Uvo>F-*daY_7%st`MsQi-WcUZQyBCX@ZhsEVU>k2 z_&+{BAR+BT{dVrF-xoLzg|9Ds^6k-lgdzadYSBQCEnU(VG_z>+t76~>;I-TrYnQ?CGj$E4?H+;YwfMGX(|Rf9!1yJv%&t?_<-CxH+#fWio-d^A-8s;f(|VH&Z7 z|IYyuX=GuT!3Q3&(vCW8C|BUo5<-AncWYBaismwcYicr5R+x++0n?+7*$AvMxPcVD z(9FSs;_s#96(`I*n9~1y??=C9TX)U4-&`5}`n*(gkMQCv8ksJwjGNRP!f{7*2U1IO zV_o!}GZV1Bwl)}lc>h@3mxCe56cv&4vk4HiqBHw z=pP0}bP{~SrDM%etv5SmuRZT`*4oh*+EAmrAYurU6y3&6TY}-)1hxB9JniPzWq(O+7 zty{P6vc(IV>=kDm5pjvehK4Zb%41%^TvQ0+HQPuf0YZvX>Re#lao0n3 z#yJ;8v(f&2!x04JaBvt#_V2SNAH6%$V5CBsOGryDNVlCGO+kF@11V9k6g8|OnDIY( z{-~NnI2Wh-_H8@&gug3fnh4lxcxh!>&KxaDgGyavrIBW{3G4*i1%{XA^i9mK1B#3y zEjNh|J>ef*032pF+;CkG3;U@W5XNXd^w0y=-&t!zivS&M3#l<-8a_Shd%W~yZQD~}Zcoe!#Z`gvV=!5eMUGdrU6y1zGB zIzui1hDRrC^eQS#j2)?a&nuYL04 z-?FcM=lWDfC-WKXiWu+ z9*jUgyqj;m&p!6~tL*T@SKH%{JsRd&BH&58lgfPN%Fa{d~#+A5S+qrgP`^I*fjpO7xPVBh1*l`bp zxCO9j24S#}0D+JIflwFfbw<6!(F zso)K{n+)gt|JUdg4~uvJZgb8(u@bN8919x58(8Bm_c zOhv-JO#QvEguI3;(sWje?_Y1f$3FU3-xhcXPY_E+%sMeKk?-w5k(N)XvUlEefvsBJ zX=T1{Rm?mr4PAmHhBezk&-jNuKkEu61kTBGR=m|VKJ{W=0WeMK&pvdc9Xfnc3OnRG z8kN8!gjjyT|9FK55YNrzMmp;Jt5z)V{cm#*ut{ylO-(g2JWO&1+D+*6$^U(;-S*2z zT~V~_JfRRLcm8p}`5*5ZuK=YP`!izqDZc}A65E6E%rSiA!Z`fAI0yV4XE(xx(52&)SC5A?+0ck&*|d;ongFbf za#kI9k8j*&|L~26{P0ZZKt`%%YV!}>_j8*wZ?;&7Is7z_2=-a-N-8hI%Yi z9*X{(&!16;o8^TW7%%q(mO;QFT3wl|FfyS=nT%@E69Qu863#~k*&0{s^szFr-sbPIx= zP^BcDksFN?%Smy(`sYXC0>dr$&z!&XMtgC`{=5QMyr|PY_&?rYhmW3AKgOIH;W=kd zZ?l6(kNf@qQCk$e>(hrm<9st*m-GFgmE{2+)F;bE16JrfXC?*v1 zd;pPLApUV2DHY?5I0Z%%MUwBF*4R{S*S&6~!T_@0xQTRU)wm)s5o{#A z|4F5R2OUbnjfo^~|OK^>6!o7pxj_wnf@@HxoY6Wd8Sl?4fE8!Xw|Bk$3ct55b?yhV`q`;}%MBe1 z*lzIylFdy8_$!cB>bz_+ZJUwNCEW115`qX1t*{^c)NQt7&q;N$;R2y05pI+d7UgxX zyIOgNXSY0N9nIA?ckWEF1k;0#P|+e>oiyTr9wR3~&w_Xh5w3|q5DNImT?4DD@_1|e zK6}%9zO1?}7KX|QN@x3y-L`twQtLXp+y8B*Z+^&>BRnw65(25w$DeEL4}5+ES+fOk zw;{xU)37LvRu?`X!A9U>(Az-riwVfkpcOEqF$rf_LpTBa_LZ=r)wtY4k()p8b$emg z5j`6MjxZxE2-uTPJ?)-Nl^=*Yo9PE1HlH)*&k_Ss)s%Aoe2}&oc{e30A&1$B{6aky zFz7av+uwibKkT1>{2TW?vVPbb@{?=tyYJ=Rdca6z^N$`mX4hPCrY&0(CKo}XK^Gl4 z0U+AM`6K~N$jw*x{5&_Ya#6#D`2#HlaMnD*fbjrOelYyf8ca=}T+))&uT%hh21<;W zTApB{0A6?L3Y+QP1L!{(kL%n}Ro6_BAq0C-+fZ%q{=nz$!S&mfq~_Xj40vQ@ij6;< zLG}To7Uwq%CiL- zg3+alho4tKGi|ixi)Y%kSFKh{Ful*sE%n+kG%(Q4(4(FfrW|*7d}LJd7UqxkPb@_) zq3;f*$gDIsTE0Sk3TaV%{p-(vXWzT+F^~5Kl#%D5uoNOy>^`kr!{Zwtw!&1_=D6D` zOm}O&Z{~DYOo5$+%77YUcz&?s$#^G{Sj4jvvBp~%CdKaF^^&c;^5b^SSqGswqfI^J^|Jmo{+SdO(+UBAKo|bO&mX4c5W7=O#oZ0Xkxp<8b}z?d^|Hx}DR|N19(&x23em6uCch(Fwx1ivNX-TZ&oE3LuT=MuY216#Xcm-Y9YQ28CiUl^Rypr0|qBxA)&oy=#99s;=&EINjdGf4Py8ODiK2nD_-F3WAt1~^U}@1MtG|E$K0B~)hi`O7qrw@bjcXn_|Iu zi#02YU82uK0E9do8qF)wSNr^dzB-kR5G#-pU<>2G)6m(OPO2+OLycR&?%qB%4ymO$ z8D7bI`5a>Brj|Op@=bqbzuWMM0X`@Y`(u{ApTG1RCKc zflBg{yhx}}1g51RA31q18V&D<_N^cIiuLv}PQ55Uh?cUW$V%L@VQc_)QNelS;dM5i z8?#$J_D;L_g2lm_C4*U+J&6)SVlfDSgZ{hEPbrR3VwLTezd`}5TCvF9anogX^!Q1! z08`>@_ONlmycu@lRF^G0J8%a?P)$sn<9cI}8PCS&Tyw=at^nGl00@N%0~=iypr*sU zY;9|>TRwZM{rj(;awSu*_2In5(O(!_3`-pIjR(Xvxdur;pw#>w@qe87gZ!fiILDMG z`O14jWuhdH+leGMQe1I1V0^`K&uG?&HIAME9}-Jfkv%ACJ>norV*B>Jq#=hlUc1Jv zB1DolMAgt;iA$_-Zr*8GFpAF;20?>9DYE}Vk>0Ea+$zjFWaI9Ov202K(l zI0W{or#4BUV|*@HHOF3e@e+}12&ah{Es&hyvSm0Q>8KC7Q`^(z#> zYgR3`o8Nq?D}Zi=MjgsyQPJwqT!A@fzwH%?^7sKJ>5BWn` z0OAYPnt?ojK%{o(-l7Lj7$2L1wD++J5VhH4%@z|)lgom?ANQk)_|TXv)bL2xlxxmE z$1YqwTUlZ#pBihcRT6~MlDT>u1Yz!RK+>TyjoZd%rIf7=Q+p?prXk&j3({~ujWM}| zVk{@?@vR@+@2-1FOgOpG(^5#sPxZ(mKseFb9P02Sb%3ry4pM|=C@fO>rp#z<(YEHSZK6&aY>o&eDN8ZH?vCJW3xT% zXsUM)z+GQJHz+Q07i9fI(#l@l^TT;JG$tmW!h}D8QD@0WV&yD`M}tL2vCxRaYEA@3c_Swasle&&gQfrYM>~N@o}Ln9YLF}>)O0m z_1_`^f=bGYgp-d`b*WLGI^FB{?D5gQ<97JiDeLL$SCdaoQuD|Cf@iPEzo(uL2q>+& z^Ce19(Ky0=VYT9TE_EhWlqSy_ScDs0fqeV>57<|~^J^O(=$59w^wLWcckD&Kw=%1r zGGYz2#kOF6r$P-l5Fzp;F%>2N2hfU~{8#(@sX+KanJb$Bl)}W~OcGOvy#&j^l-!K^ z2UM5y^%xQWNnM4xz_}MG#&FX=@E5m>%=Ou4Hp}IVY|ALr%PzmdPIn!)8Lbtn0#M?b zt{gyx)l^n!oeGPRu~~jk$4~YsUqLP-j43P5x9kD~2Wj`=KmU$B@bG#+yaj5t9#5E> z;k-kZ5Yk9YN~lEx*6?UnA<_9~&#;@{a*-`r)G5sVL=qZhb78;>p95%&J^uaY=W`o8 z6#VC}+-~px=oiCO-(=v(%Ci^R%{N_QC;a|s#hyE-JyeZasDuq#=kmAa!{r$MzT%Y% z4lMi&9MHXVH(pP{TctvFp zT;Hbrpuv}C3-;Tr&N()tt=bmNu6C>2>`I`)>KZDPF;;n~Ah5nLDw(V(3zy1`iyM$6 zAGqsOqM5^Rh-{#IO582=VNV2$K}Xr??mic~E7(B@fHQDPgn?6K?K`B@k6LRWl?M^&1mr~|d7_{AIKL2C8^X~P& z(1mLGrJVT2H@;B{081BL+Hy?=%E-!*N7%JADMSc4v!}I9-xs;}glA zg%;gR(oX^R1ReqRR^YMy#cSScYaiM4io<;Nvbpw74*^d0^jT9~m72L2`35Aor+2_+ zF1^W>Z=o;(ah^u>ngi=mz{kAq(z9)@drB=Wb@G;487$&*$S_bg5oRIekY*s1HtWqg zN7+W6u+X^pk<62Wiz2`?A|yfypfF;qK5;+)9%nL4BvY-Sro&_4@3{_&gY_iLdxZj+ zoY9Xjv{D%2F`RcR;#jB%9^&xhIpAV|I^tsG6;&d)TspVf7B8M901g8y(1MiN5E7uS zB;kq+ibV^i#Kh=CDEIk+fYnuXdfen}lIaadPx*Tx(G%JvA@_u>h8Eh>eS;E!Qr{@( zqyc73aYaU*8ZeG%v)uhp7bdQAXh2k1i3Q~F(6Pv&4~owMYmwg%JaYYRjoln&F47)6!Qlv(bOe&1&pwq9oB=f4DUrlc)E#~2k zg)TTsiDQX1!m@)T#MRXdhGe=(`&+mT1_Y7_XkHgPDUsWBfK0=S6MyNMmyWJysa^pt1?o-=m*w8?qyWD5m zTdsSpoqJZNXtxWr9$9e_s7sKr3fgj4#DxuYw*LP0w)*l9<>fr!__MZRd8gga>&$sy*fMG_D!ItQP1i+Ks* zNc?N;?cpAyVaK!kPYNJR$$c3W`1`NO6wHO=gcvkT%;o}S2yRHB9XfQxrngntm9JeQ zBpj1#s$~g_B;c7$AZMh(g~O>rS<)8A83!(0s99*a$k!_Z3$*WuZ*E~akVKGp!8-Q3 z=P@pzQA(Rom{3N;KiJq@?T5ZZI0U)fTqBhrxwyU>NuUHDQ{A6ypxtRYDNK@gT2#L# zG+v+k#&2xh>WIiq3gl+ylIlTk@1QvKK-0+`7WN>g_E{7iAfEmE58K~=W1SuM z*u11DlOOTTUZdPN)W=VB*^vV;+QNCQwqV{YcWs+QX*Jak6OCQPz!0S-Ar(b)J*@WaFP)x2cpLuSt-EsdG+qvhMa2fOG&vlEnUxxrp2Zjl& zH<{Ts5Yh}O_tMqfBl4M9GaBriWu5l68!xf5md;gZp%HZM<@kch`mVk65xf58TU?O@ zYaMy@fTo|Zpu?_v-73id&IxF{~dg~?h%P7vB> zi^LU3z4p2*mZ*$US6!pUWDz)E{0|C^BcWM*w7O#5Qc0Vqh=bE|n@N%rHejtozehMg zSU}u;VqFdg@K*GFp9=;;hq575sHg~&kM-t^iFAT^QGMg0EDNsJz)%<=U0GSCh3x|z zG#;CSL-+%!KxlkqYjWa$0ETpL2!)IjcP;-?jU&-SfcX_T=Ur`M<$nVO?>bQG9bd+wBdn zTj|#+a>d=CF<_ugTbpZ@C+Jx8W(%moLLu>ZUrd(sIVhx_p3`>KrDypXwFyWBW&$GE za>CKd3MnD-Uz~+Uez(akdc((*o0u_unq-LQ0t*4l6hHF<DI zG_pXW50igl{2v>M;&?XUE0P`)KKl<+0P)44k5g=M&-fnqgoH*IAwF&|Y};k$oioR- zxqP{jfe=TMgoE%C@QC8Hbbz|j8Vr@QKnt0IfXEx4P@G$&L6M5YD9rU@X^SYIgx0Iptr?rveBct;`U)T59})_Nk0BFm-n z$tjf}S=*5izL7T)3si5P{rL9#?cRsC*_rNH_V=Gwc`LS_N5otN;;6KT;&$1Kb0_)C zTrT_nlwGPaSYn^Jz<6e(vkd0uAZ z-$wxuzFc|nnbzr{(##pn;)I}F%4l)cJPf5RP;&URKX3bjx7#@@SE!Ag5+C=1yRT93 zZq0GwvHI*sYyygN0%Kzj=amqYf9IY66#*0Go;Ztzg@t*r9|{BI0Dk2a3LrJ9E*urW zWWZ01DZ#byb1?J`BMukOJVdSW`0buj=_zL2;rOGGbhgRffQo&-ib` zAT`Xvcmy?+-+iSkUKakJzHyiR;@-`^E+hU~S+y}ESk&PO@rXxJY8=kZPj9h?+O*A^ z(;U=`A2n_21kZft%!|dgbL8IjU+sFkihma^wkym zm>=M~?t9YKZ#iUpckR^FU_5}>bAl(w8Y6FUWELKnJUl|D*jtfw8K#qgDXi^8qBtYB zC5Kp$VCEYhJ??9qv8yjxZc|)FIrMWp_OEZOQXhz5;~iJ&8XTb55{&X^-GWCl>igAY zS6p(I>i>X%G%C-nzb0i@l<9sj1mzwY!AHgkfvB@){9BCuBWXxv6XJZnq8&JL?D3}feO$=c^b>#P#<&qK z%7Y{PppYmopHgD-y>GkF zmM@y_f<$Lvxdwhv1;AtP=^1q42*SkukNg484~s6sTvQZ@OjX55=lp#k>Bn*q5n z+*8=L^N{`H*Y2|0e(@V|7A{>9Xr!q9V@(h=1PI{@LqGhDK$pqNkh4(i!PJWTlZ4>kG( zuUYM(U9G$1E#h=&XsD8xLlV2Z?P?Dl$MaqUL>@02#{#VrhULnOmTNu+t-uV*X=--|)j8U_^2KLH@;tp4itPdH*tQIe-4SS6i*MuiYig~2Y%%)N0)Lrk&T zm{4WK%Br6_)nh;W+0)iH3?_Zl!;sN@2OS!C=dOJ=IM8K(bi?^}#)4@gexL*ds*rM0 zHW3(2zs15$j3?!+{~yoqH%dN)!~ugx%IQM$&)K=_pnd!M_t-s;yx@nf%7tLNyNaE8 z?m6}|{twnXwx2?eb?W4C%MKs6h4W@vhsXZ_WI#Dq)s(BW%S4`Xfq4R-BO%8SjW`8i z;EI%|D+)+YQ+f1xPJkhGBw}PV5`0ALNc1>8`}|(}<4^pHdj!F)Mv!s!19xMg?k%EG zv4;7fGLy>IlQH|;12W1Xz-se(C}?>D1)qa>9Et+YHF*8iOmgS7={h1Sa^<_VeOw4l7NdltuNPP1A>`_z2L8fSUpB}LB6JYRtSBELGt z+NgoNC7etN#*4*_zzqJ6%%g%VLRmeQG)B1BRZ> z&g$nbgxjrDE;tD{lm?dsxFNtyDy;-jAQG8SD=ZyXnRHHxJq|s%`k_h6NryWZrsKvw z282&`bu1UGkC#Ibf*+w%x6_AJ%@7knR#b|Kbt5 z^MT#a&suNKsW8yP0uA;rfB7H2Ve}*v+XvrurIMk*mZy}KNkN!+7{X8xu>}3MpP%&_ zSGJo2r;@6F?pV)&ZG8Gg`{msm>{q{e+C77m7;~x-JonKX8tS!gSPTvhgH;hKAipG! zIQ-GA#zKRjeEzw|{qRo}xCOEkT3AT{G7F%hv_!ahjd`;P4POyEZbIT&lA!!Za8mZ9 z;$d3!BZ1kv_B6?VhA`Et$dFwkWfA0eqxC_${@-wTFD5a`M)Uu6a{~K z@X%rX8>FqngT3yJ1%lDy40)PTo9c%NCLeMDxa~Bu0qJH)h!kr&v>G2dddhb0JLreA z+fJPH|GRtC=!L=qZ&2lmzP`FbkLrYIHPzg-bnLt82q$$3IwqfJ*_77kC4}0## zL&~L)Gr&V27eJ#_WcVcvVt?YaW)5;NG-LS&KGuiogsAFW0mK0&C7W1rp~y)@K~#h`=DqP%Szh99Qkfrow{Xm>hXJQF zjIL%FB5jy71vP6zPK^+HSk=*y3B_5o43CV3c>%GrEz&~M9Y^gubi$1(LC2wCzJMmh zQbiwg%Ul}EPjN`YgcdT4sqR-lpn&Q`;XcaTlT2T^)ElVOV*{KdAjlo zz>euegk+Prl2{+~BGw}kQQ&eSG$e)~qTrxtrrfUGes8t5Yx~n0>pgb{`1VG{wKP?M zm!}T^R^U)u4jp*ukVEyu9jES^AiLxyiV8!v9zYa|x37Q5W9)LFGX<D zw&s5X%t$&UvLdg2QPSHVK`pT*cXBxU`=qu(cEMMU+qAZN!L-?TLQsHTDC8P<^C7Wi zyghu54SwkPA4aQmCY`4|AMpF=?d`XtCr+zRfoc??5_uOAd}X5UF4yOg@P6_$bMQ^9uHyn}P&Of+R9Vkm z-=Y3txwXty8)tANAeo5(>M`-@Cv);9UQPs!Ce1NePO{K&@R1Z8Q_PuDuArteFwfrl z%MJE}e}7!fIoH2#gGTmh7dxp0tI8p&yi|Hoa(9z4h@3_t&?UX^(0o{OyIxwwHvl4 zo_f)~`t6_F3wutx(i~LygOYFFogo~WVC?9 zVEi05-9ov^KTm!Bgf?KqK@ieIPmJsLLDK1q|NI;K_1b4-&8SWk6qQ=%v}$|z^=E3b z5&iJEtz^12G$fr4?6O$rBxwj-wy(d}9)0p9dtk$U)#e8WdZe+5$*{1{lw&0?TQk=# zzhI#s@@mEVfQNw0VyUTIjQM9}3Nr};FsClEV$f{97f(L%oc;8U$L+q~Zn3_Bti7~% zn>Dwzi5iWpv>LKpc_R>f1)zoIkDwmh{TNfmankHJmI2QI;o-f9j~rE)vu)ecws=9O z%2_1E+VS98>xKWv)h#Ira}&_MW3tMW4oCDm4jC4c&$AFVUVR?Wx|NF!3hxsI z#=(cwq|D`n>CwWd_@M-|f#*@<&zDa4CNxJu)bV5PC5Gub{XWbZ#iWmjf>6tTUNKs?e z2`?iOFzz`X9bS8^SY?uuXXF_mhX7D0CQ>yV6oKHTIoMHCisaLUWpa6i3toNo)k+w} zdL^-&#$LHQ$p5u<71q)S`DT>}B5T|eC``&fl-NL@rGy(V&CisB%mFP(6Nf?%>i2Z( zG1h_E@QKA`Ls>b^e)IQXW%)NS=-|<*=M&?KC}S*S!6`#AiI~s98WA%q*{A;g&=&ho z-@4C!^XPWPU6cf&|E{R45?5S9U7_7@hf_T8V{XAeKRNhheJtlZ9Bah5;Rusyb6gQ_=dH2vc-4kVioAOvO3_1RPYkFB9% zPjX8i=fz+In1nW1ZIg> zLiA-Lx@U2lX2W0;@(1iIQ0sxgkpKpp2q7E1`S1C_7wmgK{#E`^Q+5tx;2)Qvis5Q( zd5!LWwD_@84p@3M%}Uu(KlFa^J^X5^uU2lVwzgUcY0A=5psgeS!Wj6P$~+zeTCph! znG1<)Fc{=2LO;WV_AHYQlO+3@V@P)+a}r(V)pG(SBMBcPDK1DzDH5;p|mGPjoZ>xDbfSF-r8Fml&W^H|yv?#7M zna(jW-DGrFHJeZ2hAAOL`G=!K;wLNayYWy{b!#!|F+QuLvRNirTVSrdAFCcP`)RpX zSaKSANTTrX6Nx7?Ovj*a7|k6j?~&WkfgZQ--~NQ%`I~3`{b2lS-W3RHQE!8J*v=#L(1kA zmw5c|aeP}tfxYG0RUT8`!kz-HnxHp^VEO!!D%W4)!yZ7LqcI@d}3suZM#ILlc;dRAN*#p*b1wsb(S)cfOyv z&P!hN$F^hlQMaajvTh{t_#cJFp^sRV$=!T0VI2*adiBY%RP+8)87T&uP}*aBeM3!! zXvSoWfUvtV!b>e;9z!~%y;TEM(hiP?3Y>a;B(OS^eob}@o4Nq9#V4ut2fQGDW@UY-}w?63dpH@Q}6OKk) zj-qvsF@4O7j3o?1gn6t3`^uij5RmiCp3CcqaeqwkMc0r&j{M<#Pklcok$3^4ozu}Q z&cEp$O$iAm+O<~s0J$HG1uHGl0Y^9!3OB{NqT<#l=R(!L$r9t@0|bH1b<`i6TtS5k z+K95qfkY&f^g>4+aWiEZN;p_~HTvLDtCcpDjM|!T3pA#L74BTf_80o$-(bJE_c<5J z0>%2&=s6^j41;WL#$8u>@z3$N{gU%$ss0bLjp{*0^jF2|K*VFA1joIIM}a1e?$fsE znS-|W@%^@I&t8wA=jdL-5QnS|85_K8$$Tr#^xLX)7P|1K?0DCZJ-2n2ZQQ)aj=2Kr z@(rdAJv=mEt5>hKyY9MEhn{-`D8k;XTenUbWA=^lZ2)<23&SMfa>abHbc?_s43UBg zg@7`FhAZIh3+>5`kK2)hyG0NhMq4$COcmv>2}{)#^16V>GTm8;EkE43ak>mcaY7&=(19dyaFr=}vZok_N>{Qcj`!FZ7yO9}^*~UzNylBh|Ja7heobbm znv7H>T;N$wojU0UzDCSc@KUt7jKazbDwAwK9D{^kR8ewbs!9d4UTNSCAo)j(&!I*U zkdL7c1*9onPhU^JAM#?AVhIEAa8ZOL26;cY01kLzGF}ctG5Prcrj3t|B{={f>jUyO znPh|$3vzLAc+fU&*<(Mr{bAd=<0Z)&BqAL4SOUek5CZVr>^lYkFEEA#fd_IdU+#Ye z5Gal}j*SCKuq6s00x1wGKIo7ufgX1!X>gh6F=1<~Yt+_eo9-S!lWW$gjf}sZ5)fMn zUc0ocP%b)cp$Y?1VMMrCWPRa5fDMg~C@vQp4`2{?lRWg6i-^J~5S}^70VGW`WajZO za4A_p5>gOhlqTG7xRsOV|KXBV)|AQ42X?QZl&D1K`5_GuJ)-qTTk(C*0yR$kGu02w>v} zFQi&~f@q?qdfdNE89%8LAxdmb1Vl^4+H*ZI_^zGa{P z*8T2TR*5bvf?8s(3Ppe=i?SIFS4?C_>pGf)w2Fr50X163$Z74dpsACK+t;Q&7j@y zefVkn{%z}R9!*pIJqib6S0(N(UI*8cXO#e2h|lAgXtaFb3k-}fB!4oRlUE|m&nwP+ zBTVCYIM{p+ont5$1c7Hm@$h+EkG12o-uJ%u={g7$|GszMOV-*{ZqwUqH5G?2uf457 z+zMDE>f>0mlCn@$;rX$Q%zGT42?DOJ7%yb)J2*%h_qI!DzxAz`aEmpD-=Dv{A9exfU@L;5pKMKMnO|0xogzLHA9c zmM8$TCWJAWz%dB0jql0n6e`py4ZRM?S6y{T_Y?fX-vIH+L?Cn>^H@F1 zL<|t;FrGNAL~mbrpFD$fDwK2k2ggJ>8w^PB9C!}ADtZL~djgIca05wl5IMg6j)(2r zKYU0DWX=^ASBMMU~gmI2N`00#5No`0V9bZi#?f5Bz`ap8wm>NuEPXZ zmF8^0!kIR+Euf|tw9(?;z_h8&nxaE&2R?nk<9M_y$ubT_p)!*tD$5P31QNL1$O`8y zmnR&_Bz0Fjy1+A^cF&_<2^r$eiG&KPAQLE^D9ez@0jxofIaZ&LqMSK$=@5T%?Z5oo zop$d-n>CUNmpo>Qu`I;YC=d=4$^an~+DxsUW5R3Sc-0wh5nHr?wbfHpHK0Za2VJ2w z@f017z9El$0o3#lNr>*cf0O;_XOG$$ix&CvP2|~@Pb1Gos+R7J`BBu(#J=f4wXQzbAyKuW!`# zJDQ7ZUT32aanPXGXry^Yo?2lt>j7^Jg@zYLzd}V-sl2z5v0;H|XtnP4Q0GhExzE1y z<9l6b%hZjyclQhaHI#v?t12~2rnaWUcI`fB+qUmg(GD*wPQ2kcB8(RS=jS*~1m#eq zDng0Yi0|1u_Of$&i*@itHU@g026KrA)E*UewpCn7xW*BT}u-4lNbu^oS|8#s3^>C3vS-1 zv|(XUXvo1;90q98AAlzP{*?@Lu?BhO6i4E6Gg}_ejFLm?0+DK@6J9)o_lN(!&c6QR zN9@Fr{kDAh(pNM!^yf*z_Dsm>7=eP#hWy zt*uxMx)4cdVmWU8#iO?Ixf2q?qel+q(QGl~;$F$nlC|Y9$6SntVEVnX2egRdy0d|7 zb|i|7ly21Yf%C>e6(j&rBpmoi2Fbr+UGa2yKcp^%cnHXycitH=_hR!YxAV@PVQ;+Z z9IJ9qiLx1;jEvwa5Og*q$%tve(^I<4jZJ8}F*pDY-Q%0L**Aaqs6D&wu*S0S9vWPZ zA3N&a%Dh1NrLouDdd7nX@P_I=v*JDN4Lb*kny)&zIoU3G{}N&F4NV^CC(bbW^W6=**gdmei9dAsB8by}C-f0b9( z*__$4r37ngnE_a1zy0mQVMP7$LpE*3JXvpYIpiAp`g-k>HOuV6RcF|hmn?Io)S|fw zRLTaFOikyRh5}&96fWTvGc5{&m3{k<*t+sfs$!@!SJIvE3I%3dQzz?jML zkYH_St`-r=zx?DO`{2jF7~Iq1QoHQZi}M`z46;D+AWIx9?iEjm=On?&;hrq4aSAni z79qaT^$%T|*;njgYg@Z=DYK_F_yKJbw71PefZ4NJRoCZps{Jco3`|Y5FlQ%1gB2mc zb1%MR7hn4^%l;n5D3uDHX(Y_W(_$}J?+ByjjPPPT!B!kRct|}WM~)m5XJv0sR}zbt z*hfBagWY(|3Y$A;x)P^)rgX&RWJDWBDI4+|!e2Z9@?u~3#+~-%Z~avA4)y%xWGJtZ zgexLWE#~`J@{f&F3ISLwHXj!-whrb8LL{%q`oo)d?bEBM$I|dFoT}O5&}=j5DR_ma=XSAA5s1TNC6a=nQ{d*6=VY$rYZ^9Twj56aOqJVf_lmso^XD(Y}ufO7KJ8xOLhfhrj`maEW55*0h z1B=?zJ!oq;?6BMKdeSyLvDNo=NO_(^hYpBCg8SwEkhj=|9PgRyaZiyFJ0`PY<5@IJ zQ5nSAe^db4pCq4yqCeer%vPQ~&pKyys28QZrCtf^y1H_!C@l*_CM21YITgVR3$Zka z)?IrK**|>c=OQVIub89Z8YnQH2c?DaM1HtFjXEd+yfM5H6g1BO%gf?U4byC@W7ymaIMI`uUOh)i{{OA&DtQ%N|u$% z00SaGx0M!`Xb@࿦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 z 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

{ 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཮jE8bq@`I76Y>#gl; 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 window = storm::OSWindow::Create(width, height, preferred_display, fullscreen, show_borders); - window->SetTitle("Sea Dogs"); + window->SetTitle("Caribbean Legend"); window->Subscribe(HandleWindowEvent); window->Show(); core_private->SetWindow(window); diff --git a/src/libs/battle_interface/include/utils.h b/src/libs/battle_interface/include/bi_utils.h similarity index 93% rename from src/libs/battle_interface/include/utils.h rename to src/libs/battle_interface/include/bi_utils.h index 5ece935e2..2b5c242ae 100644 --- a/src/libs/battle_interface/include/utils.h +++ b/src/libs/battle_interface/include/bi_utils.h @@ -91,8 +91,8 @@ class BIUtils static bool ReadStringFromAttr(ATTRIBUTES *pA, const char *name, char *buf, int32_t bufSize, const char *defVal); static const char *GetStringFromAttr(ATTRIBUTES *pA, const char *name, const char *defVal); static int32_t GetTextureFromAttr(VDX9RENDER *rs, ATTRIBUTES *pA, const char *sAttrName); - static bool ReadRectFromAttr(ATTRIBUTES *pA, const std::string_view &name, FRECT &rOut, FRECT &rDefault); - static bool ReadRectFromAttr(ATTRIBUTES *pA, const std::string_view &name, RECT &rOut, RECT &rDefault); + static bool ReadRectFromAttr(ATTRIBUTES *pA, const char *name, FRECT &rOut, FRECT &rDefault); + static bool ReadRectFromAttr(ATTRIBUTES *pA, const char *name, RECT &rOut, RECT &rDefault); static bool ReadPosFromAttr(ATTRIBUTES *pA, const char *name, float &fX, float &fY, float fXDef, float fYDef); static bool ReadPosFromAttr(ATTRIBUTES *pA, const char *name, int32_t &nX, int32_t &nY, int32_t nXDef, int32_t nYDef); static int32_t GetAlignmentFromAttr(ATTRIBUTES *pA, const char *name, int32_t nDefAlign); diff --git a/src/libs/battle_interface/include/active_perk_shower.h b/src/libs/battle_interface/src/active_perk_shower.h similarity index 100% rename from src/libs/battle_interface/include/active_perk_shower.h rename to src/libs/battle_interface/src/active_perk_shower.h diff --git a/src/libs/battle_interface/src/battle_command.cpp b/src/libs/battle_interface/src/battle_command.cpp index fec9be056..cbf3ea39c 100644 --- a/src/libs/battle_interface/src/battle_command.cpp +++ b/src/libs/battle_interface/src/battle_command.cpp @@ -1,5 +1,5 @@ #include "battle_command.h" -#include "utils.h" +#include "bi_utils.h" #include "core.h" #include "image/img_render.h" #include "sea/ships_list.h" @@ -22,7 +22,7 @@ BICommandList::BICommandList(entid_t eid, ATTRIBUTES *pA, VDX9RENDER *rs) m_NotePos.x = m_NotePos.y = 0; m_NoteOffset.x = m_NoteOffset.y = 0; - m_bUpArrow = m_bDownArrow = false; + m_bUpArrow = m_bDownArrow = m_bLeftArrow = m_bRightArrow = false; m_bActive = false; @@ -63,6 +63,13 @@ void BICommandList::Draw() void BICommandList::Update(int32_t nTopLine, int32_t nCharacterIndex, int32_t nCommandMode) { + + if (m_nCurrentCommandMode != nCommandMode) + { + m_nStartUsedCommandIndex = 0; + m_nSelectedCommandIndex = 0; + } + int32_t nOldSelIndex = 0; if (nTopLine == m_LeftTopPoint.y && nCharacterIndex == m_nCurrentCommandCharacterIndex && m_nCurrentCommandMode == nCommandMode) @@ -74,8 +81,6 @@ void BICommandList::Update(int32_t nTopLine, int32_t nCharacterIndex, int32_t nC m_nCurrentCommandCharacterIndex = nCharacterIndex; m_nCurrentCommandMode = nCommandMode; - m_nStartUsedCommandIndex = 0; - m_nSelectedCommandIndex = 0; m_aUsedCommand.clear(); m_aCooldownUpdate.clear(); @@ -227,6 +232,15 @@ void BICommandList::Init() m_pntDownArrowOffset.x = 32; m_pntDownArrowOffset.y = 66; + m_sLeftRightArrowTexture = ""; + m_pntLeftRightArrowSize.x = m_pntLeftRightArrowSize.y = 0; + FULLRECT(m_frLeftArrowUV); + FULLRECT(m_frRightArrowUV); + m_pntLeftArrowOffset.x = 0; + m_pntLeftArrowOffset.y = 0; + m_pntRightArrowOffset.x = 0; + m_pntRightArrowOffset.y = 0; + // default data for active icon m_sActiveIconTexture = ""; m_pntActiveIconOffset.x = -33; @@ -269,6 +283,17 @@ void BICommandList::Init() BIUtils::ReadPosFromAttr(pAList, "UDArrow_Offset_Down", m_pntDownArrowOffset.x, m_pntDownArrowOffset.y, m_pntDownArrowOffset.x, m_pntDownArrowOffset.y); + if (attr = pAList->GetAttribute("LRArrow_Texture")) + m_sLeftRightArrowTexture = attr; + BIUtils::ReadRectFromAttr(pAList, "LRArrow_UV_Left", m_frLeftArrowUV, m_frLeftArrowUV); + BIUtils::ReadRectFromAttr(pAList, "LRArrow_UV_Right", m_frRightArrowUV, m_frRightArrowUV); + BIUtils::ReadPosFromAttr(pAList, "LRArrow_Size", m_pntLeftRightArrowSize.x, m_pntLeftRightArrowSize.y, + m_pntLeftRightArrowSize.x, m_pntLeftRightArrowSize.y); + BIUtils::ReadPosFromAttr(pAList, "LRArrow_Offset_Left", m_pntLeftArrowOffset.x, m_pntLeftArrowOffset.y, + m_pntLeftArrowOffset.x, m_pntLeftArrowOffset.y); + BIUtils::ReadPosFromAttr(pAList, "LRArrow_Offset_Right", m_pntRightArrowOffset.x, m_pntRightArrowOffset.y, + m_pntRightArrowOffset.x, m_pntRightArrowOffset.y); + // set values for the menu activity icon if (attr = pAList->GetAttribute("ActiveIcon_Texture")) m_sActiveIconTexture = attr; @@ -314,9 +339,9 @@ void BICommandList::Init() m_nIconShowMaxQuantity = 5; } -int32_t BICommandList::AddToIconList(int32_t nTextureNum, int32_t nNormPictureNum, int32_t nSelPictureNum, int32_t nCooldownPictureNum, - int32_t nCharacterIndex, const char *pcCommandName, int32_t nTargetIndex, - const char *pcLocName, const char *pcNoteName) +int32_t BICommandList::AddToIconList(int32_t nTextureNum, int32_t nNormPictureNum, int32_t nSelPictureNum, + int32_t nCooldownPictureNum, int32_t nCharacterIndex, const char *pcCommandName, + int32_t nTargetIndex, const char *pcLocName, const char *pcNoteName) { int32_t n; // filtering out already used objects @@ -361,7 +386,8 @@ int32_t BICommandList::AddToIconList(int32_t nTextureNum, int32_t nNormPictureNu return 1; } -void BICommandList::AddAdditiveToIconList(int32_t nTextureNum, int32_t nPictureNum, float fDist, float fWidth, float fHeight) +void BICommandList::AddAdditiveToIconList(int32_t nTextureNum, int32_t nPictureNum, float fDist, float fWidth, + float fHeight) { if (m_aUsedCommand.empty()) return; @@ -395,7 +421,7 @@ int32_t BICommandList::IconAdd(int32_t nPictureNum, int32_t nTextureNum, RECT &r } int32_t BICommandList::ClockIconAdd(int32_t nForePictureNum, int32_t nBackPictureNum, int32_t nTextureNum, RECT &rpos, - float fFactor) + float fFactor) { if (nTextureNum < 0 || nTextureNum >= m_aTexture.size() || nForePictureNum < 0 || nForePictureNum >= m_aTexture[nTextureNum].nCols * m_aTexture[nTextureNum].nRows) @@ -483,7 +509,7 @@ void BICommandList::UpdateShowIcon() m_pImgRender->CreateImage(BIType_square, m_sActiveIconTexture.c_str(), 0xFF808080, m_frActiveIconUV2, rPos); m_bLeftArrow = m_nStartUsedCommandIndex > 0; - m_bRightArrow = false; + m_bRightArrow = m_aUsedCommand.size() - m_nStartUsedCommandIndex > m_nIconShowMaxQuantity; int32_t i = 0; for (auto n = m_nStartUsedCommandIndex; n < m_aUsedCommand.size() && i < m_nIconShowMaxQuantity; n++) @@ -533,6 +559,22 @@ void BICommandList::UpdateShowIcon() rPos.bottom = rPos.top + m_pntUpDownArrowSize.y; m_pImgRender->CreateImage(BIType_square, m_sUpDownArrowTexture.c_str(), 0xFF808080, m_frDownArrowUV, rPos); } + if (m_bLeftArrow) + { + rPos.left = m_LeftTopPoint.x + m_pntLeftArrowOffset.x; + rPos.top = m_LeftTopPoint.y + m_pntLeftArrowOffset.y; + rPos.right = rPos.left + m_pntLeftRightArrowSize.x; + rPos.bottom = rPos.top + m_pntLeftRightArrowSize.y; + m_pImgRender->CreateImage(BIType_square, m_sLeftRightArrowTexture.c_str(), 0xFF808080, m_frLeftArrowUV, rPos); + } + if (m_bRightArrow) + { + rPos.left = m_LeftTopPoint.x + m_pntRightArrowOffset.x; + rPos.top = m_LeftTopPoint.y + m_pntRightArrowOffset.y; + rPos.right = rPos.left + m_pntLeftRightArrowSize.x; + rPos.bottom = rPos.top + m_pntLeftRightArrowSize.y; + m_pImgRender->CreateImage(BIType_square, m_sLeftRightArrowTexture.c_str(), 0xFF808080, m_frRightArrowUV, rPos); + } } void BICommandList::SetNote(const char *pcNote, int32_t nX, int32_t nY) diff --git a/src/libs/battle_interface/include/battle_command.h b/src/libs/battle_interface/src/battle_command.h similarity index 88% rename from src/libs/battle_interface/include/battle_command.h rename to src/libs/battle_interface/src/battle_command.h index c7baf0800..c6a6c582e 100644 --- a/src/libs/battle_interface/include/battle_command.h +++ b/src/libs/battle_interface/src/battle_command.h @@ -47,9 +47,9 @@ class BICommandList virtual void Init(); - int32_t AddToIconList(int32_t nTextureNum, int32_t nNormPictureNum, int32_t nSelPictureNum, int32_t nCooldownPictureNum, - int32_t nCharacterIndex, const char *pcCommandName, int32_t nTargetIndex, const char *pcLocName, - const char *pcNoteName); + int32_t AddToIconList(int32_t nTextureNum, int32_t nNormPictureNum, int32_t nSelPictureNum, + int32_t nCooldownPictureNum, int32_t nCharacterIndex, const char *pcCommandName, + int32_t nTargetIndex, const char *pcLocName, const char *pcNoteName); void AddAdditiveToIconList(int32_t nTextureNum, int32_t nPictureNum, float fDist, float fWidth, float fHeight); protected: @@ -100,8 +100,6 @@ class BICommandList int32_t m_nStartUsedCommandIndex; int32_t m_nSelectedCommandIndex; int32_t m_nIconShowMaxQuantity; - bool m_bLeftArrow; - bool m_bRightArrow; IPOINT m_pntActiveIconOffset; IPOINT m_pntActiveIconSize; @@ -119,6 +117,15 @@ class BICommandList IPOINT m_pntUpArrowOffset; IPOINT m_pntDownArrowOffset; + bool m_bLeftArrow; + bool m_bRightArrow; + std::string m_sLeftRightArrowTexture; + FRECT m_frLeftArrowUV; + FRECT m_frRightArrowUV; + IPOINT m_pntLeftRightArrowSize; + IPOINT m_pntLeftArrowOffset; + IPOINT m_pntRightArrowOffset; + std::string m_sCurrentCommandName; int32_t m_nCurrentCommandCharacterIndex; int32_t m_nCurrentCommandMode; @@ -146,7 +153,8 @@ class BICommandList void Release(); int32_t IconAdd(int32_t nPictureNum, int32_t nTextureNum, RECT &rpos); - int32_t ClockIconAdd(int32_t nForePictureNum, int32_t nBackPictureNum, int32_t nTextureNum, RECT &rpos, float fFactor); + int32_t ClockIconAdd(int32_t nForePictureNum, int32_t nBackPictureNum, int32_t nTextureNum, RECT &rpos, + float fFactor); void AdditiveIconAdd(float fX, float fY, std::vector &aList); FRECT &GetPictureUV(int32_t nTextureNum, int32_t nPictureNum, FRECT &uv); RECT &GetCurrentPos(int32_t num, RECT &rpos) const; diff --git a/src/libs/battle_interface/src/battle_sign.cpp b/src/libs/battle_interface/src/battle_sign.cpp index f013dceeb..4ff155c71 100644 --- a/src/libs/battle_interface/src/battle_sign.cpp +++ b/src/libs/battle_interface/src/battle_sign.cpp @@ -1,5 +1,5 @@ #include "battle_sign.h" -#include "utils.h" +#include "bi_utils.h" #include "controls.h" #include "core.h" #include "vma.hpp" diff --git a/src/libs/battle_interface/include/battle_sign.h b/src/libs/battle_interface/src/battle_sign.h similarity index 100% rename from src/libs/battle_interface/include/battle_sign.h rename to src/libs/battle_interface/src/battle_sign.h diff --git a/src/libs/battle_interface/src/utils.cpp b/src/libs/battle_interface/src/bi_utils.cpp similarity index 94% rename from src/libs/battle_interface/src/utils.cpp rename to src/libs/battle_interface/src/bi_utils.cpp index 9b1b2ffce..2e1d32bf1 100644 --- a/src/libs/battle_interface/src/utils.cpp +++ b/src/libs/battle_interface/src/bi_utils.cpp @@ -1,4 +1,4 @@ -#include "utils.h" +#include "bi_utils.h" #include "core.h" #include "string_compare.hpp" @@ -73,26 +73,32 @@ int32_t BIUtils::GetTextureFromAttr(VDX9RENDER *rs, ATTRIBUTES *pA, const char * return rs->TextureCreate(sname); } -bool BIUtils::ReadRectFromAttr(ATTRIBUTES *pA, const std::string_view &name, FRECT &rOut, FRECT &rDefault) +bool BIUtils::ReadRectFromAttr(ATTRIBUTES *pA, const char *name, FRECT &rOut, FRECT &rDefault) { rOut = rDefault; - if (pA) + if (pA && name) { - const std::string str_value = pA->GetAttribute(name); - sscanf(str_value.c_str(), "%f,%f,%f,%f", &rOut.left, &rOut.top, &rOut.right, &rOut.bottom); - return true; + const char *pcStr = pA->GetAttribute(name); + if (pcStr) + { + sscanf(pcStr, "%f,%f,%f,%f", &rOut.left, &rOut.top, &rOut.right, &rOut.bottom); + return true; + } } return false; } -bool BIUtils::ReadRectFromAttr(ATTRIBUTES *pA, const std::string_view &name, RECT &rOut, RECT &rDefault) +bool BIUtils::ReadRectFromAttr(ATTRIBUTES *pA, const char *name, RECT &rOut, RECT &rDefault) { rOut = rDefault; - if (pA) + if (pA && name) { - const std::string str_value = pA->GetAttribute(name); - sscanf(str_value.c_str(), "%d,%d,%d,%d", &rOut.left, &rOut.top, &rOut.right, &rOut.bottom); - return true; + const char *pcStr = pA->GetAttribute(name); + if (pcStr) + { + sscanf(pcStr, "%d,%d,%d,%d", &rOut.left, &rOut.top, &rOut.right, &rOut.bottom); + return true; + } } return false; } @@ -362,6 +368,17 @@ void BITextInfo::Print() { const char *textAttr = pARefresh->GetAttribute("text"); sText = textAttr ? textAttr : ""; + dwColor = pARefresh->GetAttributeAsDword("color", 0xFFFFFFFF); + ATTRIBUTES *pAttr = pARefresh->GetAttributeClass("pos"); + if (pAttr) + { + pos.x = pAttr->GetAttributeAsDword("x", 0); + pos.y = pAttr->GetAttributeAsDword("y", 0); + } + else + { + pos.x = pos.y = 0; + } } if (!sText.empty()) pRS->ExtPrint(nFont, dwColor, 0, PR_ALIGN_CENTER, bShadow, fScale, 0, 0, pos.x, pos.y, "%s", sText.c_str()); diff --git a/src/libs/battle_interface/src/image/img_render.cpp b/src/libs/battle_interface/src/image/img_render.cpp index a1d39c582..baf60717c 100644 --- a/src/libs/battle_interface/src/image/img_render.cpp +++ b/src/libs/battle_interface/src/image/img_render.cpp @@ -2,6 +2,8 @@ #include "storm_assert.h" #include "string.h" +#include + BIImageRender::BIImageRender(VDX9RENDER *pRS) : m_nBeginOutputPrioritet(0), m_nEndOutputPrioritet(0) { diff --git a/src/libs/battle_interface/src/interface_manager/interface_group/sea_group.cpp b/src/libs/battle_interface/src/interface_manager/interface_group/sea_group.cpp index 4385e96ef..fd285b988 100644 --- a/src/libs/battle_interface/src/interface_manager/interface_group/sea_group.cpp +++ b/src/libs/battle_interface/src/interface_manager/interface_group/sea_group.cpp @@ -1,5 +1,5 @@ #include "sea_group.h" -#include "utils.h" +#include "bi_utils.h" #include "platform/platform.hpp" BI_SeaGroup::BI_SeaGroup(BI_ManagerBase *pManager) : BI_BaseGroup(pManager) diff --git a/src/libs/battle_interface/src/interface_manager/mouse_pointer.cpp b/src/libs/battle_interface/src/interface_manager/mouse_pointer.cpp index 51703dfbb..7cd0afcc5 100644 --- a/src/libs/battle_interface/src/interface_manager/mouse_pointer.cpp +++ b/src/libs/battle_interface/src/interface_manager/mouse_pointer.cpp @@ -1,5 +1,5 @@ #include "mouse_pointer.h" -#include "utils.h" +#include "bi_utils.h" #include "../image/img_render.h" #include "core.h" #include "vma.hpp" diff --git a/src/libs/battle_interface/src/item_entity/item_entity.cpp b/src/libs/battle_interface/src/item_entity/item_entity.cpp index 421f79830..abf272f15 100644 --- a/src/libs/battle_interface/src/item_entity/item_entity.cpp +++ b/src/libs/battle_interface/src/item_entity/item_entity.cpp @@ -1,5 +1,5 @@ #include "item_entity.h" -#include "utils.h" +#include "bi_utils.h" #include "entity.h" #include "core.h" #include "message.h" diff --git a/src/libs/battle_interface/src/land/battle_land.h b/src/libs/battle_interface/src/land/battle_land.h index 2e0a1efd2..6833d63d3 100644 --- a/src/libs/battle_interface/src/land/battle_land.h +++ b/src/libs/battle_interface/src/land/battle_land.h @@ -1,6 +1,6 @@ #pragma once -#include "utils.h" +#include "bi_utils.h" #include "bi_defines.h" class BIManSign; diff --git a/src/libs/battle_interface/src/land/battle_man_command.h b/src/libs/battle_interface/src/land/battle_man_command.h index 09d15c802..8e531664f 100644 --- a/src/libs/battle_interface/src/land/battle_man_command.h +++ b/src/libs/battle_interface/src/land/battle_man_command.h @@ -1,6 +1,6 @@ #pragma once -#include "battle_command.h" +#include "../battle_command.h" class BIManCommandList : public BICommandList { diff --git a/src/libs/battle_interface/src/land/battle_man_sign.cpp b/src/libs/battle_interface/src/land/battle_man_sign.cpp index 2e8f32505..9d8ba0ccb 100644 --- a/src/libs/battle_interface/src/land/battle_man_sign.cpp +++ b/src/libs/battle_interface/src/land/battle_man_sign.cpp @@ -1,5 +1,5 @@ #include "battle_man_sign.h" -#include "utils.h" +#include "bi_utils.h" #include "battle_man_command.h" #include "core.h" #include "shared/battle_interface/msg_control.h" diff --git a/src/libs/battle_interface/include/log_and_action.h b/src/libs/battle_interface/src/log_and_action.h similarity index 99% rename from src/libs/battle_interface/include/log_and_action.h rename to src/libs/battle_interface/src/log_and_action.h index aa6aa5c7f..065667700 100644 --- a/src/libs/battle_interface/include/log_and_action.h +++ b/src/libs/battle_interface/src/log_and_action.h @@ -1,6 +1,6 @@ #pragma once -#include "utils.h" +#include "bi_utils.h" class ILogAndActions : public Entity { diff --git a/src/libs/battle_interface/src/message_icons.cpp b/src/libs/battle_interface/src/message_icons.cpp index 7de51a666..4f21ae904 100644 --- a/src/libs/battle_interface/src/message_icons.cpp +++ b/src/libs/battle_interface/src/message_icons.cpp @@ -1,5 +1,5 @@ #include "message_icons.h" -#include "utils.h" +#include "bi_utils.h" MESSAGE_ICONS::MESSAGE_ICONS() { diff --git a/src/libs/battle_interface/include/message_icons.h b/src/libs/battle_interface/src/message_icons.h similarity index 100% rename from src/libs/battle_interface/include/message_icons.h rename to src/libs/battle_interface/src/message_icons.h diff --git a/src/libs/battle_interface/src/sea/battle_navigator.cpp b/src/libs/battle_interface/src/sea/battle_navigator.cpp index 35675f2f3..15437f62f 100644 --- a/src/libs/battle_interface/src/sea/battle_navigator.cpp +++ b/src/libs/battle_interface/src/sea/battle_navigator.cpp @@ -3,7 +3,7 @@ #include "core.h" -#include "utils.h" +#include "bi_utils.h" #include "entity.h" #include "island_base.h" #include "math_inlines.h" @@ -13,10 +13,10 @@ #define NAVBACKGROUND_SIZESCALE 1.3f -#define MAP_TEXTURE_WIDTH 256 -#define MAP_TEXTURE_HEIGHT 256 -#define BIGMAP_TEXTURE_WIDTH 1024 -#define BIGMAP_TEXTURE_HEIGHT 1024 +#define MAP_TEXTURE_WIDTH 4096 +#define MAP_TEXTURE_HEIGHT 4096 +#define BIGMAP_TEXTURE_WIDTH 4096 +#define BIGMAP_TEXTURE_HEIGHT 4096 inline bool FloatCompare(float a, float b) { @@ -154,19 +154,57 @@ void BATTLE_NAVIGATOR::Draw() const "%.1f", m_fShipSpeed); // show current charge - if (m_curCharge >= 0) + if (m_curBalls >= 0) { - rs->TextureSet(0, m_idChargeTexture); - rs->SetRenderState(D3DRS_TEXTUREFACTOR, (BIUtils::g_dwBlinkColor << 24L) | 0xFFFFFF); - rs->DrawPrimitive(D3DPT_TRIANGLESTRIP, m_idCurChargeVBuf, sizeof(BI_ONETEXTURE_VERTEX), 0, 2, - m_bNotEnoughBallFlag ? "battle_texure_blend_tf" : "battle_rectangle"); + rs->TextureSet(0, m_idBallsTexture); + rs->DrawPrimitive(D3DPT_TRIANGLESTRIP, m_idCurChargeVBuf, sizeof(BI_ONETEXTURE_VERTEX), 0, 2, "battle_rectangle"); + } + + if (m_curGrapes >= 0) + { + rs->TextureSet(0, m_idGrapesTexture); + rs->DrawPrimitive(D3DPT_TRIANGLESTRIP, m_idCurChargeVBuf, sizeof(BI_ONETEXTURE_VERTEX), 16, 2, "battle_rectangle"); + } + + if (m_curKnippels >= 0) + { + rs->TextureSet(0, m_idKnippelsTexture); + rs->DrawPrimitive(D3DPT_TRIANGLESTRIP, m_idCurChargeVBuf, sizeof(BI_ONETEXTURE_VERTEX), 20, 2, "battle_rectangle"); + } + + if (m_curBombs >= 0) + { + rs->TextureSet(0, m_idBombsTexture); + rs->DrawPrimitive(D3DPT_TRIANGLESTRIP, m_idCurChargeVBuf, sizeof(BI_ONETEXTURE_VERTEX), 24, 2, "battle_rectangle"); } if (m_idPowderTexture >= 0 && m_curPowder >= 0) { rs->TextureSet(0, m_idPowderTexture); - rs->SetRenderState(D3DRS_TEXTUREFACTOR, (BIUtils::g_dwBlinkColor << 24L) | 0xFFFFFF); - rs->DrawPrimitive(D3DPT_TRIANGLESTRIP, m_idCurChargeVBuf, sizeof(BI_ONETEXTURE_VERTEX), 12, 2, - m_bPowderRunOut ? "battle_texure_blend_tf" : "battle_rectangle"); + rs->DrawPrimitive(D3DPT_TRIANGLESTRIP, m_idCurChargeVBuf, sizeof(BI_ONETEXTURE_VERTEX), 12, 2, "battle_rectangle"); + } + + if (m_curWeapon >= 0) + { + rs->TextureSet(0, m_idWeaponTexture); + rs->DrawPrimitive(D3DPT_TRIANGLESTRIP, m_idCurChargeVBuf, sizeof(BI_ONETEXTURE_VERTEX), 28, 2, "battle_rectangle"); + } + + if (m_curSailcloth >= 0) + { + rs->TextureSet(0, m_idSailclothTexture); + rs->DrawPrimitive(D3DPT_TRIANGLESTRIP, m_idCurChargeVBuf, sizeof(BI_ONETEXTURE_VERTEX), 32, 2, "battle_rectangle"); + } + + if (m_curPlanks >= 0) + { + rs->TextureSet(0, m_idPlanksTexture); + rs->DrawPrimitive(D3DPT_TRIANGLESTRIP, m_idCurChargeVBuf, sizeof(BI_ONETEXTURE_VERTEX), 36, 2, "battle_rectangle"); + } + + if (m_curCannonsG >= 0) + { + rs->TextureSet(0, m_idCannonsGTexture); + rs->DrawPrimitive(D3DPT_TRIANGLESTRIP, m_idCurChargeVBuf, sizeof(BI_ONETEXTURE_VERTEX), 40, 2, "battle_rectangle"); } // show wind icon rs->TextureSet(0, m_idWindTexture); @@ -213,87 +251,79 @@ void BATTLE_NAVIGATOR::Update() if (!FloatCompare(m_fCurAnglLeftCharge, m_fCurAnglLeftDamage)) { - SetRectangleSegVertexPos(pV, static_cast(m_XNavigator), static_cast(m_YNavigator), - static_cast(m_NavigationWidth), static_cast(m_NavigationWidth), + SetRectangleSegVertexPos(pV, static_cast(m_CannonsChargePos.x), static_cast(m_CannonsChargePos.y), + static_cast(m_CannonsChargeSize.x), static_cast(m_CannonsChargeSize.y), m_fBegAnglLeftCharge, m_fCurAnglLeftCharge); m_nvCannonCharge = SetRectangleSegVertexTex(pV, .5f, .5f, 1.f, 1.f, m_fBegAnglLeftCharge, m_fCurAnglLeftCharge); } if (!FloatCompare(m_fCurAnglRightCharge, m_fCurAnglRightDamage)) { - SetRectangleSegVertexPos(&pV[m_nvCannonCharge], static_cast(m_XNavigator), - static_cast(m_YNavigator), static_cast(m_NavigationWidth), - static_cast(m_NavigationWidth), m_fCurAnglRightCharge, + SetRectangleSegVertexPos(&pV[m_nvCannonCharge], static_cast(m_CannonsChargePos.x), static_cast(m_CannonsChargePos.y), + static_cast(m_CannonsChargeSize.x), static_cast(m_CannonsChargeSize.y), m_fCurAnglRightCharge, m_fBegAnglRightCharge); m_nvCannonCharge += SetRectangleSegVertexTex(&pV[m_nvCannonCharge], .5f, .5f, 1.f, 1.f, m_fCurAnglRightCharge, m_fBegAnglRightCharge); } if (!FloatCompare(m_fCurAnglForwardCharge, m_fCurAnglForwardDamage)) { - SetRectangleSegVertexPos(&pV[m_nvCannonCharge], static_cast(m_XNavigator), - static_cast(m_YNavigator), static_cast(m_NavigationWidth), - static_cast(m_NavigationWidth), m_fBegAnglForwardCharge, + SetRectangleSegVertexPos(&pV[m_nvCannonCharge], static_cast(m_CannonsChargePos.x), static_cast(m_CannonsChargePos.y), + static_cast(m_CannonsChargeSize.x), static_cast(m_CannonsChargeSize.y), m_fBegAnglForwardCharge, m_fCurAnglForwardCharge); m_nvCannonCharge += SetRectangleSegVertexTex(&pV[m_nvCannonCharge], .5f, .5f, 1.f, 1.f, m_fBegAnglForwardCharge, m_fCurAnglForwardCharge); } if (!FloatCompare(m_fCurAnglBackCharge, m_fCurAnglBackDamage)) { - SetRectangleSegVertexPos(&pV[m_nvCannonCharge], static_cast(m_XNavigator), - static_cast(m_YNavigator), static_cast(m_NavigationWidth), - static_cast(m_NavigationWidth), m_fCurAnglBackCharge, m_fBegAnglBackCharge); + SetRectangleSegVertexPos(&pV[m_nvCannonCharge], static_cast(m_CannonsChargePos.x), static_cast(m_CannonsChargePos.y), + static_cast(m_CannonsChargeSize.x), static_cast(m_CannonsChargeSize.y), m_fCurAnglBackCharge, m_fBegAnglBackCharge); m_nvCannonCharge += SetRectangleSegVertexTex(&pV[m_nvCannonCharge], .5f, .5f, 1.f, 1.f, m_fCurAnglBackCharge, m_fBegAnglBackCharge); } if (FloatCompare(m_fCurAnglLeftCharge, m_fCurAnglLeftDamage)) { - SetRectangleSegVertexPos(&pV[m_nvCannonCharge], static_cast(m_XNavigator), - static_cast(m_YNavigator), static_cast(m_NavigationWidth), - static_cast(m_NavigationWidth), m_fBegAnglLeftCharge, m_fCurAnglLeftCharge); + SetRectangleSegVertexPos(&pV[m_nvCannonCharge], static_cast(m_CannonsChargePos.x), static_cast(m_CannonsChargePos.y), + static_cast(m_CannonsChargeSize.x), static_cast(m_CannonsChargeSize.y), m_fBegAnglLeftCharge, m_fCurAnglLeftCharge); m_nvCannonReady = SetRectangleSegVertexTex(&pV[m_nvCannonCharge], .5f, .5f, 1.f, 1.f, m_fBegAnglLeftCharge, m_fCurAnglLeftCharge); } if (FloatCompare(m_fCurAnglRightCharge, m_fCurAnglRightDamage)) { - SetRectangleSegVertexPos(&pV[m_nvCannonCharge + m_nvCannonReady], static_cast(m_XNavigator), - static_cast(m_YNavigator), static_cast(m_NavigationWidth), - static_cast(m_NavigationWidth), m_fCurAnglRightCharge, + SetRectangleSegVertexPos(&pV[m_nvCannonCharge + m_nvCannonReady], static_cast(m_CannonsChargePos.x), static_cast(m_CannonsChargePos.y), + static_cast(m_CannonsChargeSize.x), static_cast(m_CannonsChargeSize.y), m_fCurAnglRightCharge, m_fBegAnglRightCharge); m_nvCannonReady += SetRectangleSegVertexTex(&pV[m_nvCannonCharge + m_nvCannonReady], .5f, .5f, 1.f, 1.f, m_fCurAnglRightCharge, m_fBegAnglRightCharge); } if (FloatCompare(m_fCurAnglForwardCharge, m_fCurAnglForwardDamage)) { - SetRectangleSegVertexPos(&pV[m_nvCannonCharge + m_nvCannonReady], static_cast(m_XNavigator), - static_cast(m_YNavigator), static_cast(m_NavigationWidth), - static_cast(m_NavigationWidth), m_fBegAnglForwardCharge, + SetRectangleSegVertexPos(&pV[m_nvCannonCharge + m_nvCannonReady], static_cast(m_CannonsChargePos.x), static_cast(m_CannonsChargePos.y), + static_cast(m_CannonsChargeSize.x), static_cast(m_CannonsChargeSize.y), m_fBegAnglForwardCharge, m_fCurAnglForwardCharge); m_nvCannonReady += SetRectangleSegVertexTex(&pV[m_nvCannonCharge + m_nvCannonReady], .5f, .5f, 1.f, 1.f, m_fBegAnglForwardCharge, m_fCurAnglForwardCharge); } if (FloatCompare(m_fCurAnglBackCharge, m_fCurAnglBackDamage)) { - SetRectangleSegVertexPos(&pV[m_nvCannonCharge + m_nvCannonReady], static_cast(m_XNavigator), - static_cast(m_YNavigator), static_cast(m_NavigationWidth), - static_cast(m_NavigationWidth), m_fCurAnglBackCharge, m_fBegAnglBackCharge); + SetRectangleSegVertexPos(&pV[m_nvCannonCharge + m_nvCannonReady], static_cast(m_CannonsChargePos.x), static_cast(m_CannonsChargePos.y), + static_cast(m_CannonsChargeSize.x), static_cast(m_CannonsChargeSize.y), m_fCurAnglBackCharge, m_fBegAnglBackCharge); m_nvCannonReady += SetRectangleSegVertexTex(&pV[m_nvCannonCharge + m_nvCannonReady], .5f, .5f, 1.f, 1.f, m_fCurAnglBackCharge, m_fBegAnglBackCharge); } if (!FloatCompare(m_fCurAnglLeftDamage, m_fEndAnglLeftCharge)) { - SetRectangleSegVertexPos(&pV[m_nvCannonCharge + m_nvCannonReady], static_cast(m_XNavigator), - static_cast(m_YNavigator), static_cast(m_NavigationWidth), - static_cast(m_NavigationWidth), m_fCurAnglLeftDamage, m_fEndAnglLeftCharge); + SetRectangleSegVertexPos(&pV[m_nvCannonCharge + m_nvCannonReady], static_cast(m_CannonsChargePos.x), static_cast(m_CannonsChargePos.y), + static_cast(m_CannonsChargeSize.x), static_cast(m_CannonsChargeSize.y), m_fCurAnglLeftDamage, m_fEndAnglLeftCharge); m_nvCannonDamage = SetRectangleSegVertexTex(&pV[m_nvCannonCharge + m_nvCannonReady], .5f, .5f, 1.f, 1.f, m_fCurAnglLeftDamage, m_fEndAnglLeftCharge); } if (!FloatCompare(m_fCurAnglRightDamage, m_fEndAnglRightCharge)) { SetRectangleSegVertexPos(&pV[m_nvCannonCharge + m_nvCannonReady + m_nvCannonDamage], - static_cast(m_XNavigator), static_cast(m_YNavigator), - static_cast(m_NavigationWidth), static_cast(m_NavigationWidth), + static_cast(m_CannonsChargePos.x), static_cast(m_CannonsChargePos.y), + static_cast(m_CannonsChargeSize.x), static_cast(m_CannonsChargeSize.y), m_fEndAnglRightCharge, m_fCurAnglRightDamage); m_nvCannonDamage += SetRectangleSegVertexTex(&pV[m_nvCannonCharge + m_nvCannonReady + m_nvCannonDamage], .5f, .5f, 1.f, 1.f, @@ -302,8 +332,8 @@ void BATTLE_NAVIGATOR::Update() if (!FloatCompare(m_fCurAnglForwardDamage, m_fEndAnglForwardCharge)) { SetRectangleSegVertexPos(&pV[m_nvCannonCharge + m_nvCannonReady + m_nvCannonDamage], - static_cast(m_XNavigator), static_cast(m_YNavigator), - static_cast(m_NavigationWidth), static_cast(m_NavigationWidth), + static_cast(m_CannonsChargePos.x), static_cast(m_CannonsChargePos.y), + static_cast(m_CannonsChargeSize.x), static_cast(m_CannonsChargeSize.y), m_fCurAnglForwardDamage, m_fEndAnglForwardCharge); m_nvCannonDamage += SetRectangleSegVertexTex(&pV[m_nvCannonCharge + m_nvCannonReady + m_nvCannonDamage], .5f, .5f, 1.f, 1.f, @@ -312,8 +342,8 @@ void BATTLE_NAVIGATOR::Update() if (!FloatCompare(m_fCurAnglBackDamage, m_fEndAnglBackCharge)) { SetRectangleSegVertexPos(&pV[m_nvCannonCharge + m_nvCannonReady + m_nvCannonDamage], - static_cast(m_XNavigator), static_cast(m_YNavigator), - static_cast(m_NavigationWidth), static_cast(m_NavigationWidth), + static_cast(m_CannonsChargePos.x), static_cast(m_CannonsChargePos.y), + static_cast(m_CannonsChargeSize.x), static_cast(m_CannonsChargeSize.y), m_fEndAnglBackCharge, m_fCurAnglBackDamage); m_nvCannonDamage += SetRectangleSegVertexTex(&pV[m_nvCannonCharge + m_nvCannonReady + m_nvCannonDamage], .5f, .5f, 1.f, 1.f, @@ -510,11 +540,29 @@ void BATTLE_NAVIGATOR::Init(VDX9RENDER *RenderService, Entity *pOwnerEI) else m_idBestCourseTex = rs->TextureCreate(tmpstr); - tmpstr = BIUtils::GetStringFromAttr(pARoot, "chargeTexture", nullptr); + tmpstr = BIUtils::GetStringFromAttr(pARoot, "BallsTexture", nullptr); + if (tmpstr == nullptr) + m_idBallsTexture = -1; + else + m_idBallsTexture = rs->TextureCreate(tmpstr); + + tmpstr = BIUtils::GetStringFromAttr(pARoot, "GrapesTexture", nullptr); if (tmpstr == nullptr) - m_idChargeTexture = -1; + m_idGrapesTexture = -1; else - m_idChargeTexture = rs->TextureCreate(tmpstr); + m_idGrapesTexture = rs->TextureCreate(tmpstr); + + tmpstr = BIUtils::GetStringFromAttr(pARoot, "KnippelsTexture", nullptr); + if (tmpstr == nullptr) + m_idKnippelsTexture = -1; + else + m_idKnippelsTexture = rs->TextureCreate(tmpstr); + + tmpstr = BIUtils::GetStringFromAttr(pARoot, "BombsTexture", nullptr); + if (tmpstr == nullptr) + m_idBombsTexture = -1; + else + m_idBombsTexture = rs->TextureCreate(tmpstr); tmpstr = BIUtils::GetStringFromAttr(pARoot, "powderTexture", nullptr); if (tmpstr == nullptr) @@ -522,6 +570,30 @@ void BATTLE_NAVIGATOR::Init(VDX9RENDER *RenderService, Entity *pOwnerEI) else m_idPowderTexture = rs->TextureCreate(tmpstr); + tmpstr = BIUtils::GetStringFromAttr(pARoot, "WeaponTexture", nullptr); + if (tmpstr == nullptr) + m_idWeaponTexture = -1; + else + m_idWeaponTexture = rs->TextureCreate(tmpstr); + + tmpstr = BIUtils::GetStringFromAttr(pARoot, "PlanksTexture", nullptr); + if (tmpstr == nullptr) + m_idPlanksTexture = -1; + else + m_idPlanksTexture = rs->TextureCreate(tmpstr); + + tmpstr = BIUtils::GetStringFromAttr(pARoot, "SailclothTexture", nullptr); + if (tmpstr == nullptr) + m_idSailclothTexture = -1; + else + m_idSailclothTexture = rs->TextureCreate(tmpstr); + + tmpstr = BIUtils::GetStringFromAttr(pARoot, "CannonsGTexture", nullptr); + if (tmpstr == nullptr) + m_idCannonsGTexture = -1; + else + m_idCannonsGTexture = rs->TextureCreate(tmpstr); + tmpstr = BIUtils::GetStringFromAttr(pARoot, "sailstateTexture", nullptr); if (tmpstr == nullptr) m_idSailTexture = -1; @@ -551,6 +623,15 @@ void BATTLE_NAVIGATOR::Init(VDX9RENDER *RenderService, Entity *pOwnerEI) m_fEndAnglBackCharge = static_cast(BIUtils::GetIntFromAttr(pARoot, "backwardChargeEndAngle", 0)) / 180.f * PI; + m_CannonsChargePos.x = m_XNavigator; + m_CannonsChargePos.y = m_YNavigator; + if ((tmpstr = BIUtils::GetStringFromAttr(pARoot, "CannonsChargePos", nullptr)) != nullptr) + sscanf(tmpstr, "%d,%d", &m_CannonsChargePos.x, &m_CannonsChargePos.y); + m_CannonsChargeSize.x = m_NavigationWidth; + m_CannonsChargeSize.y = m_NavigationWidth; + if ((tmpstr = BIUtils::GetStringFromAttr(pARoot, "CannonsChargePictureSize", nullptr)) != nullptr) + sscanf(tmpstr, "%d,%d", &m_CannonsChargeSize.x, &m_CannonsChargeSize.y); + // get speed angles m_fBegAnglShipSpeed = static_cast(BIUtils::GetIntFromAttr(pARoot, "shipSpeedBegAngle", 0)) / 180.f * PI; m_fCurAnglShipSpeed = m_fEndAnglShipSpeed = @@ -560,24 +641,74 @@ void BATTLE_NAVIGATOR::Init(VDX9RENDER *RenderService, Entity *pOwnerEI) static_cast(BIUtils::GetIntFromAttr(pARoot, "windSpeedEndAngle", 0)) / 180.f * PI; // current charge type - m_ChargeGreed.x = 1; - m_ChargeGreed.y = 1; - if ((tmpstr = BIUtils::GetStringFromAttr(pARoot, "chargeTextureGreed", nullptr)) != nullptr) - sscanf(tmpstr, "%d,%d", &m_ChargeGreed.x, &m_ChargeGreed.y); - if (m_ChargeGreed.x < 1) - m_ChargeGreed.x = 1; - if (m_ChargeGreed.y < 1) - m_ChargeGreed.y = 1; - m_ChargePos.x = 160; - m_ChargePos.y = 160; - if ((tmpstr = BIUtils::GetStringFromAttr(pARoot, "chargePos", nullptr)) != nullptr) - sscanf(tmpstr, "%d,%d", &m_ChargePos.x, &m_ChargePos.y); - m_ChargePos.x += m_XNavigator; // - m_NavigationWidth/2; - m_ChargePos.y += m_YNavigator; // - m_NavigationHeight/2; - m_ChargeSize.x = 32; - m_ChargeSize.y = 32; - if ((tmpstr = BIUtils::GetStringFromAttr(pARoot, "chargePictureSize", nullptr)) != nullptr) - sscanf(tmpstr, "%d,%d", &m_ChargeSize.x, &m_ChargeSize.y); + + m_BallsGreed.x = 1; + m_BallsGreed.y = 1; + if ((tmpstr = BIUtils::GetStringFromAttr(pARoot, "BallsTextureGreed", nullptr)) != nullptr) + sscanf(tmpstr, "%d,%d", &m_BallsGreed.x, &m_BallsGreed.y); + if (m_BallsGreed.x < 1) + m_BallsGreed.x = 1; + if (m_BallsGreed.y < 1) + m_BallsGreed.y = 1; + m_BallsPos.x = 160; + m_BallsPos.y = 160; + if ((tmpstr = BIUtils::GetStringFromAttr(pARoot, "BallsPos", nullptr)) != nullptr) + sscanf(tmpstr, "%d,%d", &m_BallsPos.x, &m_BallsPos.y); + m_BallsSize.x = 32; + m_BallsSize.y = 32; + if ((tmpstr = BIUtils::GetStringFromAttr(pARoot, "BallsPictureSize", nullptr)) != nullptr) + sscanf(tmpstr, "%d,%d", &m_BallsSize.x, &m_BallsSize.y); + + m_GrapesGreed.x = 1; + m_GrapesGreed.y = 1; + if ((tmpstr = BIUtils::GetStringFromAttr(pARoot, "GrapesTextureGreed", nullptr)) != nullptr) + sscanf(tmpstr, "%d,%d", &m_GrapesGreed.x, &m_GrapesGreed.y); + if (m_GrapesGreed.x < 1) + m_GrapesGreed.x = 1; + if (m_GrapesGreed.y < 1) + m_GrapesGreed.y = 1; + m_GrapesPos.x = 160; + m_GrapesPos.y = 160; + if ((tmpstr = BIUtils::GetStringFromAttr(pARoot, "GrapesPos", nullptr)) != nullptr) + sscanf(tmpstr, "%d,%d", &m_GrapesPos.x, &m_GrapesPos.y); + m_GrapesSize.x = 32; + m_GrapesSize.y = 32; + if ((tmpstr = BIUtils::GetStringFromAttr(pARoot, "GrapesPictureSize", nullptr)) != nullptr) + sscanf(tmpstr, "%d,%d", &m_GrapesSize.x, &m_GrapesSize.y); + + m_KnippelsGreed.x = 1; + m_KnippelsGreed.y = 1; + if ((tmpstr = BIUtils::GetStringFromAttr(pARoot, "KnippelsTextureGreed", nullptr)) != nullptr) + sscanf(tmpstr, "%d,%d", &m_KnippelsGreed.x, &m_KnippelsGreed.y); + if (m_KnippelsGreed.x < 1) + m_KnippelsGreed.x = 1; + if (m_KnippelsGreed.y < 1) + m_KnippelsGreed.y = 1; + m_KnippelsPos.x = 160; + m_KnippelsPos.y = 160; + if ((tmpstr = BIUtils::GetStringFromAttr(pARoot, "KnippelsPos", nullptr)) != nullptr) + sscanf(tmpstr, "%d,%d", &m_KnippelsPos.x, &m_KnippelsPos.y); + m_KnippelsSize.x = 32; + m_KnippelsSize.y = 32; + if ((tmpstr = BIUtils::GetStringFromAttr(pARoot, "KnippelsPictureSize", nullptr)) != nullptr) + sscanf(tmpstr, "%d,%d", &m_KnippelsSize.x, &m_KnippelsSize.y); + + m_BombsGreed.x = 1; + m_BombsGreed.y = 1; + if ((tmpstr = BIUtils::GetStringFromAttr(pARoot, "BombsTextureGreed", nullptr)) != nullptr) + sscanf(tmpstr, "%d,%d", &m_BombsGreed.x, &m_BombsGreed.y); + if (m_BombsGreed.x < 1) + m_BombsGreed.x = 1; + if (m_BombsGreed.y < 1) + m_BombsGreed.y = 1; + m_BombsPos.x = 160; + m_BombsPos.y = 160; + if ((tmpstr = BIUtils::GetStringFromAttr(pARoot, "BombsPos", nullptr)) != nullptr) + sscanf(tmpstr, "%d,%d", &m_BombsPos.x, &m_BombsPos.y); + m_BombsSize.x = 32; + m_BombsSize.y = 32; + if ((tmpstr = BIUtils::GetStringFromAttr(pARoot, "BombsPictureSize", nullptr)) != nullptr) + sscanf(tmpstr, "%d,%d", &m_BombsSize.x, &m_BombsSize.y); // powder m_PowderGreed.x = 1; @@ -592,13 +723,79 @@ void BATTLE_NAVIGATOR::Init(VDX9RENDER *RenderService, Entity *pOwnerEI) m_PowderPos.y = 160; if ((tmpstr = BIUtils::GetStringFromAttr(pARoot, "powderPos", nullptr)) != nullptr) sscanf(tmpstr, "%d,%d", &m_PowderPos.x, &m_PowderPos.y); - m_PowderPos.x += m_XNavigator; // - m_NavigationWidth/2; - m_PowderPos.y += m_YNavigator; // - m_NavigationHeight/2; m_PowderSize.x = 32; m_PowderSize.y = 32; if ((tmpstr = BIUtils::GetStringFromAttr(pARoot, "powderPictureSize", nullptr)) != nullptr) sscanf(tmpstr, "%d,%d", &m_PowderSize.x, &m_PowderSize.y); + m_WeaponGreed.x = 1; + m_WeaponGreed.y = 1; + if ((tmpstr = BIUtils::GetStringFromAttr(pARoot, "WeaponTextureGreed", nullptr)) != nullptr) + sscanf(tmpstr, "%d,%d", &m_WeaponGreed.x, &m_WeaponGreed.y); + if (m_WeaponGreed.x < 1) + m_WeaponGreed.x = 1; + if (m_WeaponGreed.y < 1) + m_WeaponGreed.y = 1; + m_WeaponPos.x = 160; + m_WeaponPos.y = 160; + if ((tmpstr = BIUtils::GetStringFromAttr(pARoot, "WeaponPos", nullptr)) != nullptr) + sscanf(tmpstr, "%d,%d", &m_WeaponPos.x, &m_WeaponPos.y); + m_WeaponSize.x = 32; + m_WeaponSize.y = 32; + if ((tmpstr = BIUtils::GetStringFromAttr(pARoot, "WeaponPictureSize", nullptr)) != nullptr) + sscanf(tmpstr, "%d,%d", &m_WeaponSize.x, &m_WeaponSize.y); + + m_SailclothGreed.x = 1; + m_SailclothGreed.y = 1; + if ((tmpstr = BIUtils::GetStringFromAttr(pARoot, "SailclothTextureGreed", nullptr)) != nullptr) + sscanf(tmpstr, "%d,%d", &m_SailclothGreed.x, &m_SailclothGreed.y); + if (m_SailclothGreed.x < 1) + m_SailclothGreed.x = 1; + if (m_SailclothGreed.y < 1) + m_SailclothGreed.y = 1; + m_SailclothPos.x = 160; + m_SailclothPos.y = 160; + if ((tmpstr = BIUtils::GetStringFromAttr(pARoot, "SailclothPos", nullptr)) != nullptr) + sscanf(tmpstr, "%d,%d", &m_SailclothPos.x, &m_SailclothPos.y); + m_SailclothSize.x = 32; + m_SailclothSize.y = 32; + if ((tmpstr = BIUtils::GetStringFromAttr(pARoot, "SailclothPictureSize", nullptr)) != nullptr) + sscanf(tmpstr, "%d,%d", &m_SailclothSize.x, &m_SailclothSize.y); + + m_PlanksGreed.x = 1; + m_PlanksGreed.y = 1; + if ((tmpstr = BIUtils::GetStringFromAttr(pARoot, "PlanksTextureGreed", nullptr)) != nullptr) + sscanf(tmpstr, "%d,%d", &m_PlanksGreed.x, &m_PlanksGreed.y); + if (m_PlanksGreed.x < 1) + m_PlanksGreed.x = 1; + if (m_PlanksGreed.y < 1) + m_PlanksGreed.y = 1; + m_PlanksPos.x = 160; + m_PlanksPos.y = 160; + if ((tmpstr = BIUtils::GetStringFromAttr(pARoot, "PlanksPos", nullptr)) != nullptr) + sscanf(tmpstr, "%d,%d", &m_PlanksPos.x, &m_PlanksPos.y); + m_PlanksSize.x = 32; + m_PlanksSize.y = 32; + if ((tmpstr = BIUtils::GetStringFromAttr(pARoot, "PlanksPictureSize", nullptr)) != nullptr) + sscanf(tmpstr, "%d,%d", &m_PlanksSize.x, &m_PlanksSize.y); + + m_CannonsGGreed.x = 1; + m_CannonsGGreed.y = 1; + if ((tmpstr = BIUtils::GetStringFromAttr(pARoot, "CannonsGTextureGreed", nullptr)) != nullptr) + sscanf(tmpstr, "%d,%d", &m_CannonsGGreed.x, &m_CannonsGGreed.y); + if (m_CannonsGGreed.x < 1) + m_CannonsGGreed.x = 1; + if (m_CannonsGGreed.y < 1) + m_CannonsGGreed.y = 1; + m_CannonsGPos.x = 160; + m_CannonsGPos.y = 160; + if ((tmpstr = BIUtils::GetStringFromAttr(pARoot, "CannonsGPos", nullptr)) != nullptr) + sscanf(tmpstr, "%d,%d", &m_CannonsGPos.x, &m_CannonsGPos.y); + m_CannonsGSize.x = 32; + m_CannonsGSize.y = 32; + if ((tmpstr = BIUtils::GetStringFromAttr(pARoot, "CannonsGPictureSize", nullptr)) != nullptr) + sscanf(tmpstr, "%d,%d", &m_CannonsGSize.x, &m_CannonsGSize.y); + // wind icon m_curSailState = 0; m_WindGreed.x = 1; @@ -780,13 +977,13 @@ void BATTLE_NAVIGATOR::Init(VDX9RENDER *RenderService, Entity *pOwnerEI) pV = static_cast(rs->LockVertexBuffer(m_idCurChargeVBuf)); if (pV != nullptr) { - for (i = 0; i < 4 * 4; i++) + for (i = 0; i < 4 * 11; i++) { pV[i].pos.z = 1.f; pV[i].w = .5f; } - SetRectangleVertexPos(&pV[0], static_cast(m_ChargePos.x), static_cast(m_ChargePos.y), - static_cast(m_ChargeSize.x), static_cast(m_ChargeSize.y)); + SetRectangleVertexPos(&pV[0], static_cast(m_BallsPos.x), static_cast(m_BallsPos.y), + static_cast(m_BallsSize.x), static_cast(m_BallsSize.y)); SetRectangleVertexPos(&pV[4], static_cast(m_WindPos.x), static_cast(m_WindPos.y), static_cast(m_WindSize.x), static_cast(m_WindSize.y)); SetRectangleVertexPos(&pV[8], static_cast(m_SailPos.x), static_cast(m_SailPos.y), @@ -794,6 +991,27 @@ void BATTLE_NAVIGATOR::Init(VDX9RENDER *RenderService, Entity *pOwnerEI) SetRectangleVertexPos(&pV[12], static_cast(m_PowderPos.x), static_cast(m_PowderPos.y), static_cast(m_PowderSize.x), static_cast(m_PowderSize.y)); rs->UnLockVertexBuffer(m_idCurChargeVBuf); + + SetRectangleVertexPos(&pV[16], static_cast(m_GrapesPos.x), static_cast(m_GrapesPos.y), + static_cast(m_GrapesSize.x), static_cast(m_GrapesSize.y)); + + SetRectangleVertexPos(&pV[20], static_cast(m_KnippelsPos.x), static_cast(m_KnippelsPos.y), + static_cast(m_KnippelsSize.x), static_cast(m_KnippelsSize.y)); + + SetRectangleVertexPos(&pV[24], static_cast(m_BombsPos.x), static_cast(m_BombsPos.y), + static_cast(m_BombsSize.x), static_cast(m_BombsSize.y)); + + SetRectangleVertexPos(&pV[28], static_cast(m_WeaponPos.x), static_cast(m_WeaponPos.y), + static_cast(m_WeaponSize.x), static_cast(m_WeaponSize.y)); + + SetRectangleVertexPos(&pV[32], static_cast(m_SailclothPos.x), static_cast(m_SailclothPos.y), + static_cast(m_SailclothSize.x), static_cast(m_SailclothSize.y)); + + SetRectangleVertexPos(&pV[36], static_cast(m_PlanksPos.x), static_cast(m_PlanksPos.y), + static_cast(m_PlanksSize.x), static_cast(m_PlanksSize.y)); + + SetRectangleVertexPos(&pV[40], static_cast(m_CannonsGPos.x), static_cast(m_CannonsGPos.y), + static_cast(m_CannonsGSize.x), static_cast(m_CannonsGSize.y)); } } @@ -1074,8 +1292,15 @@ void BATTLE_NAVIGATOR::ReleaseAll() TEXTURE_RELEASE(rs, m_idCannonTex); TEXTURE_RELEASE(rs, m_idEmptyTex); TEXTURE_RELEASE(rs, m_idIslandTexture); - TEXTURE_RELEASE(rs, m_idChargeTexture); + TEXTURE_RELEASE(rs, m_idBallsTexture); + TEXTURE_RELEASE(rs, m_idGrapesTexture); + TEXTURE_RELEASE(rs, m_idKnippelsTexture); + TEXTURE_RELEASE(rs, m_idBombsTexture); TEXTURE_RELEASE(rs, m_idPowderTexture); + TEXTURE_RELEASE(rs, m_idWeaponTexture); + TEXTURE_RELEASE(rs, m_idSailclothTexture); + TEXTURE_RELEASE(rs, m_idPlanksTexture); + TEXTURE_RELEASE(rs, m_idCannonsGTexture); TEXTURE_RELEASE(rs, m_idWindTex); TEXTURE_RELEASE(rs, m_idBestCourseTex); TEXTURE_RELEASE(rs, m_idWindTexture); @@ -1420,26 +1645,58 @@ void BATTLE_NAVIGATOR::UpdateCurrentCharge() VDATA *pVD = core.Event("GetCurrentCharge"); if (pVD == nullptr) return; - int32_t curCharge = m_curCharge; + int32_t curBalls = m_curBalls; + int32_t curGrapes = m_curGrapes; + int32_t curKnippels = m_curKnippels; + int32_t curBombs = m_curBombs; int32_t curSailState = m_curSailState; int32_t curWindPic = m_curWindPic; int32_t curPowder = m_curPowder; - int32_t isPowderRunOut = 0; - pVD->Get(curCharge, 0); - pVD->Get(curSailState, 1); - pVD->Get(curWindPic, 2); - pVD->Get(curPowder, 3); - pVD->Get(isPowderRunOut, 4); - m_bPowderRunOut = isPowderRunOut; - if (curCharge == m_curCharge && curSailState == m_curSailState && curWindPic == m_curWindPic && - curPowder == m_curPowder) + int32_t curWeapon = m_curWeapon; + int32_t curSailcloth = m_curSailcloth; + int32_t curPlanks = m_curPlanks; + int32_t curCannonsG = m_curCannonsG; + pVD->Get(curBalls, 0); + pVD->Get(curGrapes, 1); + pVD->Get(curKnippels, 2); + pVD->Get(curBombs, 3); + pVD->Get(curSailState, 4); + pVD->Get(curWindPic, 5); + pVD->Get(curPowder, 6); + pVD->Get(curWeapon, 7); + pVD->Get(curPlanks, 8); + pVD->Get(curSailcloth, 9); + pVD->Get(curCannonsG, 10); + + if (curSailState == m_curSailState && curWindPic == m_curWindPic && + curPowder == m_curPowder && curBalls == m_curBalls && curGrapes == m_curGrapes && + curKnippels == m_curKnippels && curBombs == m_curBombs && m_curWeapon == curWeapon && + m_curSailcloth == curSailcloth && m_curPlanks == curPlanks && m_curCannonsG == curCannonsG) return; - m_curCharge = curCharge; + m_curBalls = curBalls; + m_curGrapes = curGrapes; + m_curKnippels = curKnippels; + m_curBombs = curBombs; m_curSailState = curSailState; m_curWindPic = curWindPic; m_curPowder = curPowder; - if (m_curCharge < 0) - m_curCharge = 0; + m_curWeapon = curWeapon; + m_curPlanks = curPlanks; + m_curCannonsG = curCannonsG; + m_curSailcloth = curSailcloth; + + if (m_curBalls < 0) + m_curBalls = 0; + + if (m_curGrapes < 0) + m_curGrapes = 0; + + if (m_curKnippels < 0) + m_curKnippels = 0; + + if (m_curBombs < 0) + m_curBombs = 0; + if (m_curSailState < 0) m_curSailState = 0; if (m_curWindPic < 0) @@ -1447,11 +1704,23 @@ void BATTLE_NAVIGATOR::UpdateCurrentCharge() if (m_curPowder < 0) m_curPowder = 0; + if (m_curWeapon < 0) + m_curWeapon = 0; + + if (m_curPlanks < 0) + m_curPlanks = 0; + + if (m_curSailcloth < 0) + m_curSailcloth = 0; + + if (m_curCannonsG < 0) + m_curCannonsG = 0; + auto *pV = static_cast(rs->LockVertexBuffer(m_idCurChargeVBuf)); if (pV != nullptr) { FRECT texRect; - CalculateTextureRect(texRect, m_curCharge, m_ChargeGreed.x, m_ChargeGreed.y); + CalculateTextureRect(texRect, m_curBalls, m_BallsGreed.x, m_BallsGreed.y); pV[0].tu = texRect.left; pV[0].tv = texRect.top; pV[1].tu = texRect.left; @@ -1491,6 +1760,76 @@ void BATTLE_NAVIGATOR::UpdateCurrentCharge() pV[15].tu = texRect.right; pV[15].tv = texRect.bottom; + CalculateTextureRect(texRect, m_curGrapes, m_GrapesGreed.x, m_GrapesGreed.y); + pV[16].tu = texRect.left; + pV[16].tv = texRect.top; + pV[17].tu = texRect.left; + pV[17].tv = texRect.bottom; + pV[18].tu = texRect.right; + pV[18].tv = texRect.top; + pV[19].tu = texRect.right; + pV[19].tv = texRect.bottom; + + CalculateTextureRect(texRect, m_curKnippels, m_KnippelsGreed.x, m_KnippelsGreed.y); + pV[20].tu = texRect.left; + pV[20].tv = texRect.top; + pV[21].tu = texRect.left; + pV[21].tv = texRect.bottom; + pV[22].tu = texRect.right; + pV[22].tv = texRect.top; + pV[23].tu = texRect.right; + pV[23].tv = texRect.bottom; + + CalculateTextureRect(texRect, m_curBombs, m_BombsGreed.x, m_BombsGreed.y); + pV[24].tu = texRect.left; + pV[24].tv = texRect.top; + pV[25].tu = texRect.left; + pV[25].tv = texRect.bottom; + pV[26].tu = texRect.right; + pV[26].tv = texRect.top; + pV[27].tu = texRect.right; + pV[27].tv = texRect.bottom; + + CalculateTextureRect(texRect, m_curWeapon, m_WeaponGreed.x, m_WeaponGreed.y); + pV[28].tu = texRect.left; + pV[28].tv = texRect.top; + pV[29].tu = texRect.left; + pV[29].tv = texRect.bottom; + pV[30].tu = texRect.right; + pV[30].tv = texRect.top; + pV[31].tu = texRect.right; + pV[31].tv = texRect.bottom; + + CalculateTextureRect(texRect, m_curSailcloth, m_SailclothGreed.x, m_SailclothGreed.y); + pV[32].tu = texRect.left; + pV[32].tv = texRect.top; + pV[33].tu = texRect.left; + pV[33].tv = texRect.bottom; + pV[34].tu = texRect.right; + pV[34].tv = texRect.top; + pV[35].tu = texRect.right; + pV[35].tv = texRect.bottom; + + CalculateTextureRect(texRect, m_curPlanks, m_PlanksGreed.x, m_PlanksGreed.y); + pV[36].tu = texRect.left; + pV[36].tv = texRect.top; + pV[37].tu = texRect.left; + pV[37].tv = texRect.bottom; + pV[38].tu = texRect.right; + pV[38].tv = texRect.top; + pV[39].tu = texRect.right; + pV[39].tv = texRect.bottom; + + CalculateTextureRect(texRect, m_curCannonsG, m_CannonsGGreed.x, m_CannonsGGreed.y); + pV[40].tu = texRect.left; + pV[40].tv = texRect.top; + pV[41].tu = texRect.left; + pV[41].tv = texRect.bottom; + pV[42].tu = texRect.right; + pV[42].tv = texRect.top; + pV[43].tu = texRect.right; + pV[43].tv = texRect.bottom; + rs->UnLockVertexBuffer(m_idCurChargeVBuf); } } diff --git a/src/libs/battle_interface/src/sea/battle_navigator.h b/src/libs/battle_interface/src/sea/battle_navigator.h index 5b1008702..b89c7c71a 100644 --- a/src/libs/battle_interface/src/sea/battle_navigator.h +++ b/src/libs/battle_interface/src/sea/battle_navigator.h @@ -158,8 +158,15 @@ class BATTLE_NAVIGATOR int32_t m_idIslandTexture{-1}; // Isle int32_t m_idWindTex{-1}; // wind int32_t m_idBestCourseTex{-1}; // best direction pointers - int32_t m_idChargeTexture{-1}; // current cannon charge type + int32_t m_idBallsTexture{-1}; // balls charge type + int32_t m_idGrapesTexture{-1}; // grapes charge type + int32_t m_idKnippelsTexture{-1}; // knippels charge type + int32_t m_idBombsTexture{-1}; // bombs charge type int32_t m_idPowderTexture{-1}; // current gunpowder + int32_t m_idWeaponTexture{-1}; // Weapon + int32_t m_idSailclothTexture{-1}; // Sailcloth + int32_t m_idPlanksTexture{-1}; // Planks + int32_t m_idCannonsGTexture{-1}; // Cannons int32_t m_idWindTexture{-1}; // wind speed int32_t m_idSailTexture{-1}; // sail position / ship speed IDirect3DTexture9 *m_pIslandTexture{}; @@ -182,6 +189,10 @@ class BATTLE_NAVIGATOR int32_t m_nvCannonCharge{}; int32_t m_nvCannonReady{}; int32_t m_nvCannonDamage{}; + + POINT m_CannonsChargePos{}; + POINT m_CannonsChargeSize{}; + //-------------------- int32_t m_idSpeedVBuf{-1}; int32_t m_nvSpeed{}; @@ -203,16 +214,53 @@ class BATTLE_NAVIGATOR ATTRIBUTES *m_pAWeather{}; // icon of the current cannon charge type - POINT m_ChargeGreed{}; - POINT m_ChargePos{}; - POINT m_ChargeSize{}; - int32_t m_curCharge{-1}; + + POINT m_BallsGreed{}; + POINT m_BallsPos{}; + POINT m_BallsSize{}; + int32_t m_curBalls{-1}; + + POINT m_GrapesGreed{}; + POINT m_GrapesPos{}; + POINT m_GrapesSize{}; + int32_t m_curGrapes{-1}; + + POINT m_KnippelsGreed{}; + POINT m_KnippelsPos{}; + POINT m_KnippelsSize{}; + int32_t m_curKnippels{-1}; + + POINT m_BombsGreed{}; + POINT m_BombsPos{}; + POINT m_BombsSize{}; + int32_t m_curBombs{-1}; + // gunpowder icon POINT m_PowderGreed{}; POINT m_PowderPos{}; POINT m_PowderSize{}; int32_t m_curPowder{}; - bool m_bPowderRunOut{}; // for blinking + + POINT m_WeaponGreed{}; + POINT m_WeaponPos{}; + POINT m_WeaponSize{}; + int32_t m_curWeapon{-1}; + + POINT m_SailclothGreed{}; + POINT m_SailclothPos{}; + POINT m_SailclothSize{}; + int32_t m_curSailcloth{-1}; + + POINT m_PlanksGreed{}; + POINT m_PlanksPos{}; + POINT m_PlanksSize{}; + int32_t m_curPlanks{-1}; + + POINT m_CannonsGGreed{}; + POINT m_CannonsGPos{}; + POINT m_CannonsGSize{}; + int32_t m_curCannonsG{-1}; + // wind icon int32_t m_curWindPic{}; POINT m_WindGreed{}; diff --git a/src/libs/battle_interface/src/sea/battle_ship_command.h b/src/libs/battle_interface/src/sea/battle_ship_command.h index 314db2e97..a96abc762 100644 --- a/src/libs/battle_interface/src/sea/battle_ship_command.h +++ b/src/libs/battle_interface/src/sea/battle_ship_command.h @@ -1,6 +1,6 @@ #pragma once -#include "battle_command.h" +#include "../battle_command.h" class BIShipCommandList : public BICommandList { diff --git a/src/libs/battle_interface/src/sea/battle_ship_sign.cpp b/src/libs/battle_interface/src/sea/battle_ship_sign.cpp index 80494ff2c..58425e76e 100644 --- a/src/libs/battle_interface/src/sea/battle_ship_sign.cpp +++ b/src/libs/battle_interface/src/sea/battle_ship_sign.cpp @@ -2,7 +2,7 @@ #include "core.h" -#include "utils.h" +#include "bi_utils.h" #include "battle_ship_command.h" #include "controls.h" #include "shared/battle_interface/msg_control.h" diff --git a/src/libs/battle_interface/src/sea/i_battle.cpp b/src/libs/battle_interface/src/sea/i_battle.cpp index 6b7216d36..1c7a8cd5a 100644 --- a/src/libs/battle_interface/src/sea/i_battle.cpp +++ b/src/libs/battle_interface/src/sea/i_battle.cpp @@ -13,8 +13,8 @@ #include "../land/i_boarding_status.h" #include "../land/battle_land.h" -#include "active_perk_shower.h" -#include "log_and_action.h" +#include "../active_perk_shower.h" +#include "../log_and_action.h" #include "../item_entity/item_entity.h" #include "../world_map_interface/interface.h" #include "../spyglass/spyglass.h" diff --git a/src/libs/battle_interface/src/sea/i_battle.h b/src/libs/battle_interface/src/sea/i_battle.h index 891b4c9b0..747f860a3 100644 --- a/src/libs/battle_interface/src/sea/i_battle.h +++ b/src/libs/battle_interface/src/sea/i_battle.h @@ -1,6 +1,6 @@ #pragma once -#include "utils.h" +#include "bi_utils.h" #include "bi_defines.h" #include "battle_navigator.h" #include "dx9render.h" diff --git a/src/libs/battle_interface/src/sea/ship_info_images.cpp b/src/libs/battle_interface/src/sea/ship_info_images.cpp index a55ccefcc..e6b74d3d0 100644 --- a/src/libs/battle_interface/src/sea/ship_info_images.cpp +++ b/src/libs/battle_interface/src/sea/ship_info_images.cpp @@ -1,5 +1,5 @@ #include "ship_info_images.h" -#include "utils.h" +#include "bi_utils.h" #include "ship_base.h" // define the vertices diff --git a/src/libs/battle_interface/src/spyglass/spyglass.cpp b/src/libs/battle_interface/src/spyglass/spyglass.cpp index b5a29939f..11fff1457 100644 --- a/src/libs/battle_interface/src/spyglass/spyglass.cpp +++ b/src/libs/battle_interface/src/spyglass/spyglass.cpp @@ -1,5 +1,5 @@ #include "spyglass.h" -#include "utils.h" +#include "bi_utils.h" #include "../image/image.h" #include "../image/img_render.h" #include "../sea/ships_list.h" diff --git a/src/libs/battle_interface/src/timer/timer.cpp b/src/libs/battle_interface/src/timer/timer.cpp index 7b5818ace..3d3c0c1ee 100644 --- a/src/libs/battle_interface/src/timer/timer.cpp +++ b/src/libs/battle_interface/src/timer/timer.cpp @@ -1,5 +1,5 @@ #include "timer.h" -#include "utils.h" +#include "bi_utils.h" #include "../image/img_render.h" #include "core.h" #include "message.h" diff --git a/src/libs/battle_interface/src/world_map_interface/ship_command.h b/src/libs/battle_interface/src/world_map_interface/ship_command.h index 308ae25ee..63d035c32 100644 --- a/src/libs/battle_interface/src/world_map_interface/ship_command.h +++ b/src/libs/battle_interface/src/world_map_interface/ship_command.h @@ -1,6 +1,6 @@ #pragma once -#include "battle_command.h" +#include "../battle_command.h" class WMShipCommandList : public BICommandList { diff --git a/src/libs/battle_interface/src/world_map_interface/ship_sign.cpp b/src/libs/battle_interface/src/world_map_interface/ship_sign.cpp index 542fa97d2..95ff62d93 100644 --- a/src/libs/battle_interface/src/world_map_interface/ship_sign.cpp +++ b/src/libs/battle_interface/src/world_map_interface/ship_sign.cpp @@ -1,5 +1,5 @@ #include "ship_sign.h" -#include "utils.h" +#include "bi_utils.h" #include "platform/platform.hpp" WMShipIcon::WMShipIcon(entid_t BIEntityID, VDX9RENDER *pRS) : BISignIcon(BIEntityID, pRS) diff --git a/src/libs/battle_interface/src/world_map_interface/ship_sign.h b/src/libs/battle_interface/src/world_map_interface/ship_sign.h index 8b03bd658..d32bd64fd 100644 --- a/src/libs/battle_interface/src/world_map_interface/ship_sign.h +++ b/src/libs/battle_interface/src/world_map_interface/ship_sign.h @@ -1,6 +1,6 @@ #pragma once -#include "battle_sign.h" +#include "../battle_sign.h" #include "bi_defines.h" #define MAX_SHIP_QUANTITY 8 diff --git a/src/libs/core/include/attributes.h b/src/libs/core/include/attributes.h index 8841c52ba..fca185d54 100644 --- a/src/libs/core/include/attributes.h +++ b/src/libs/core/include/attributes.h @@ -12,11 +12,12 @@ class VSTRING_CODEC { public: VSTRING_CODEC() = default; - virtual ~VSTRING_CODEC() noexcept = default; + virtual ~VSTRING_CODEC() = default; - [[nodiscard]] virtual uint32_t GetNum() const = 0; - virtual uint32_t Convert(const std::string_view &pString) = 0; - [[nodiscard]] virtual std::string_view Convert(uint32_t code) const = 0; + virtual uint32_t GetNum() = 0; + virtual uint32_t Convert(const char *pString) = 0; + virtual uint32_t Convert(const char *pString, int32_t iLen) = 0; + virtual const char *Convert(uint32_t code) = 0; virtual void VariableChanged() = 0; }; @@ -39,14 +40,15 @@ class ATTRIBUTES final ~ATTRIBUTES(); void SetBreak(bool set_break); - [[nodiscard]] ATTRIBUTES *GetParent() const; - bool operator==(const std::string_view &str) const; - [[nodiscard]] std::string_view GetThisName() const; + [[nodiscard]] ATTRIBUTES* GetParent() const; + bool operator==(const char *str) const; + [[nodiscard]] const char* GetThisName() const; [[nodiscard]] bool HasValue() const noexcept; [[nodiscard]] const std::string &GetValue() const; [[nodiscard]] LegacyProxy GetThisAttr() const; void SetName(const std::string_view &new_name); - [[deprecated("Pass attribute value by string_view instead")]] void SetValue(const char *new_value); + [[deprecated("Pass attribute value by string_view instead")]] + void SetValue(const char *new_value); void SetValue(const std::string_view &new_value); [[nodiscard]] size_t GetAttributesNum() const; [[nodiscard]] ATTRIBUTES *GetAttributeClass(const std::string_view &name) const; @@ -54,7 +56,7 @@ class ATTRIBUTES final [[nodiscard]] ATTRIBUTES *VerifyAttributeClass(const std::string_view &name); [[nodiscard]] LegacyProxy GetAttribute(size_t n) const; [[nodiscard]] LegacyProxy GetAttribute(const std::string_view &name) const; - [[nodiscard]] std::string_view GetAttributeName(size_t n) const; + [[nodiscard]] const char *GetAttributeName(size_t n) const; [[nodiscard]] uint32_t GetAttributeAsDword(const char *name = nullptr, uint32_t def = 0) const; [[nodiscard]] uintptr_t GetAttributeAsPointer(const char *name = nullptr, uintptr_t def = 0) const; [[nodiscard]] float GetAttributeAsFloat(const char *name = nullptr, float def = 0) const; @@ -62,8 +64,8 @@ class ATTRIBUTES final bool SetAttributeUseFloat(const char *name, float val); ATTRIBUTES &CreateAttribute(const std::string_view &name); ATTRIBUTES *CreateAttribute(const std::string_view &name, const char *attribute); - [[deprecated("Pass attribute value by string_view instead")]] size_t SetAttribute(const std::string_view &name, - const char *attribute); + [[deprecated("Pass attribute value by string_view instead")]] + size_t SetAttribute(const std::string_view &name, const char *attribute); size_t SetAttribute(const std::string_view &name, const std::string_view &attribute); [[nodiscard]] ATTRIBUTES Copy() const; bool DeleteAttributeClassX(ATTRIBUTES *pA); @@ -72,14 +74,14 @@ class ATTRIBUTES final [[nodiscard]] ATTRIBUTES *GetAttributeClassByCode(uint32_t name_code) const; [[nodiscard]] ATTRIBUTES *VerifyAttributeClassByCode(uint32_t name_code); ATTRIBUTES *CreateAttribute(uint32_t name_code, const char *attribute); - [[deprecated("Pass attribute value by string_view instead")]] size_t SetAttribute(uint32_t name_code, - const char *attribute); + [[deprecated("Pass attribute value by string_view instead")]] + size_t SetAttribute(uint32_t name_code, const char *attribute); size_t SetAttribute(uint32_t name_code, const std::string_view &attribute); [[nodiscard]] uint32_t GetThisNameCode() const noexcept; void SetNameCode(uint32_t n) noexcept; [[nodiscard]] VSTRING_CODEC &GetStringCodec() const noexcept; - private: +private: ATTRIBUTES(VSTRING_CODEC &string_codec, ATTRIBUTES *parent, const std::string_view &name); ATTRIBUTES(VSTRING_CODEC &string_codec, ATTRIBUTES *parent, uint32_t name_code); @@ -92,7 +94,7 @@ class ATTRIBUTES final std::vector> attributes_; ATTRIBUTES *parent_{nullptr}; bool break_{false}; - + class LegacyProxy { using value_t = decltype(value_); @@ -101,11 +103,11 @@ class ATTRIBUTES final public: LegacyProxy(const LegacyProxy &other) = delete; LegacyProxy(LegacyProxy &&other) = delete; - LegacyProxy &operator=(const LegacyProxy &other) = delete; - LegacyProxy &operator=(LegacyProxy &&other) = delete; + LegacyProxy & operator=(const LegacyProxy &other) = delete; + LegacyProxy & operator=(LegacyProxy &&other) = delete; LegacyProxy() : proxy_value_(null_value) - { + { } LegacyProxy(proxy_value_t value) : proxy_value_(value) @@ -134,3 +136,4 @@ class ATTRIBUTES final proxy_value_t proxy_value_; }; }; + diff --git a/src/libs/core/include/core.h b/src/libs/core/include/core.h index dea6703f1..37b6f5ce2 100644 --- a/src/libs/core/include/core.h +++ b/src/libs/core/include/core.h @@ -118,7 +118,9 @@ class Core virtual void EraseEntity(entid_t entity) = 0; virtual entid_t CreateEntity(const char *name, ATTRIBUTES *attr = nullptr) = 0; virtual entptr_t GetEntityPointer(entid_t entity) const = 0; + virtual entptr_t GetEntityPointerSafe(entid_t entity) const = 0; virtual entid_t GetEntityId(const char *name) const = 0; + virtual bool IsEntityValid(entid_t entity) const = 0; virtual entity_container_cref GetEntityIds(layer_type_t index) const = 0; virtual entity_container_cref GetEntityIds(layer_index_t index) const = 0; virtual entity_container_cref GetEntityIds(const char *name) const = 0; diff --git a/src/libs/core/include/v_file_service.h b/src/libs/core/include/v_file_service.h index ab2e5c5d5..672690538 100644 --- a/src/libs/core/include/v_file_service.h +++ b/src/libs/core/include/v_file_service.h @@ -1,6 +1,5 @@ #pragma once -#include #include #include #include diff --git a/src/libs/core/src/attributes.cpp b/src/libs/core/src/attributes.cpp index 8eca6a619..2844875e3 100644 --- a/src/libs/core/src/attributes.cpp +++ b/src/libs/core/src/attributes.cpp @@ -3,7 +3,7 @@ #include "string_compare.hpp" #include "platform/platform.hpp" -ATTRIBUTES::ATTRIBUTES(VSTRING_CODEC *p) : ATTRIBUTES(*p) +ATTRIBUTES::ATTRIBUTES(VSTRING_CODEC *p): ATTRIBUTES(*p) { } @@ -13,7 +13,7 @@ ATTRIBUTES::ATTRIBUTES(ATTRIBUTES &&other) noexcept { } -ATTRIBUTES &ATTRIBUTES::operator=(ATTRIBUTES &&other) noexcept +ATTRIBUTES & ATTRIBUTES::operator=(ATTRIBUTES &&other) noexcept { stringCodec_ = other.stringCodec_; // Do not update name code @@ -41,12 +41,14 @@ ATTRIBUTES *ATTRIBUTES::GetParent() const return parent_; } -bool ATTRIBUTES::operator==(const std::string_view &str) const +bool ATTRIBUTES::operator==(const char *str) const { + if (!str || !str[0]) + return false; return storm::iEquals(stringCodec_.Convert(nameCode_), str); } -std::string_view ATTRIBUTES::GetThisName() const +const char *ATTRIBUTES::GetThisName() const { return stringCodec_.Convert(nameCode_); } @@ -56,7 +58,7 @@ bool ATTRIBUTES::HasValue() const noexcept return value_.has_value(); } -const std::string &ATTRIBUTES::GetValue() const +const std::string & ATTRIBUTES::GetValue() const { return *value_; } @@ -64,11 +66,12 @@ const std::string &ATTRIBUTES::GetValue() const ATTRIBUTES::LegacyProxy ATTRIBUTES::GetThisAttr() const { return value_; + } void ATTRIBUTES::SetName(const std::string_view &new_name) { - nameCode_ = stringCodec_.Convert(new_name); + nameCode_ = stringCodec_.Convert(new_name.data()); } void ATTRIBUTES::SetValue(const char *new_value) @@ -77,8 +80,7 @@ void ATTRIBUTES::SetValue(const char *new_value) { value_.reset(); } - else - { + else { value_ = new_value; } @@ -99,7 +101,7 @@ size_t ATTRIBUTES::GetAttributesNum() const return attributes_.size(); } -ATTRIBUTES *ATTRIBUTES::GetAttributeClass(const std::string_view &name) const +ATTRIBUTES * ATTRIBUTES::GetAttributeClass(const std::string_view &name) const { for (const auto &attribute : attributes_) if (storm::iEquals(name, attribute->GetThisName())) @@ -107,7 +109,7 @@ ATTRIBUTES *ATTRIBUTES::GetAttributeClass(const std::string_view &name) const return nullptr; } -ATTRIBUTES *ATTRIBUTES::GetAttributeClass(uint32_t n) const +ATTRIBUTES * ATTRIBUTES::GetAttributeClass(uint32_t n) const { return n >= attributes_.size() ? nullptr : attributes_[n].get(); } @@ -118,7 +120,7 @@ ATTRIBUTES *ATTRIBUTES::VerifyAttributeClass(const std::string_view &name) return (pTemp) ? pTemp : CreateAttribute(name, ""); } -std::string_view ATTRIBUTES::GetAttributeName(size_t n) const +const char *ATTRIBUTES::GetAttributeName(size_t n) const { if (n < attributes_.size()) { @@ -126,28 +128,25 @@ std::string_view ATTRIBUTES::GetAttributeName(size_t n) const } else { - throw std::runtime_error( - fmt::format("Cannot get attribute name, attribute index ({}) out of range ({})", n, attributes_.size())); + return nullptr; } } ATTRIBUTES::LegacyProxy ATTRIBUTES::GetAttribute(size_t n) const { - if (n < attributes_.size()) - { + if (n < attributes_.size()) { return attributes_[n]->value_; } - else - { + else { return {}; } } + ATTRIBUTES::LegacyProxy ATTRIBUTES::GetAttribute(const std::string_view &name) const { for (const auto &attribute : attributes_) - if (storm::iEquals(name, attribute->GetThisName())) - { + if (storm::iEquals(name, attribute->GetThisName())) { return attribute->value_; } return {}; @@ -164,7 +163,7 @@ uint32_t ATTRIBUTES::GetAttributeAsDword(const char *name, uint32_t def) const } else { - vDword = atol(value_->c_str()); + vDword = atol( value_->c_str()); } return vDword; } @@ -221,13 +220,13 @@ bool ATTRIBUTES::SetAttributeUseFloat(const char *name, float val) return true; } -ATTRIBUTES &ATTRIBUTES::CreateAttribute(const std::string_view &name) +ATTRIBUTES & ATTRIBUTES::CreateAttribute(const std::string_view &name) { const auto &attr = attributes_.emplace_back(new ATTRIBUTES(stringCodec_, this, name)); return *attr; } -ATTRIBUTES *ATTRIBUTES::CreateAttribute(const std::string_view &name, const char *attribute) +ATTRIBUTES * ATTRIBUTES::CreateAttribute(const std::string_view &name, const char *attribute) { const auto &attr = attributes_.emplace_back(new ATTRIBUTES(stringCodec_, this, name)); @@ -241,12 +240,12 @@ ATTRIBUTES *ATTRIBUTES::CreateAttribute(const std::string_view &name, const char size_t ATTRIBUTES::SetAttribute(const std::string_view &name, const char *attribute) { - return SetAttribute(stringCodec_.Convert(name), attribute); + return SetAttribute(stringCodec_.Convert(name.data()), attribute); } size_t ATTRIBUTES::SetAttribute(const std::string_view &name, const std::string_view &attribute) { - return SetAttribute(stringCodec_.Convert(name), attribute); + return SetAttribute(stringCodec_.Convert(name.data()), attribute); } bool ATTRIBUTES::DeleteAttributeClassX(ATTRIBUTES *pA) @@ -281,7 +280,7 @@ bool ATTRIBUTES::DeleteAttributeClassX(ATTRIBUTES *pA) return false; } -ATTRIBUTES *ATTRIBUTES::CreateSubAClass(ATTRIBUTES *pRoot, const char *access_string) +ATTRIBUTES * ATTRIBUTES::CreateSubAClass(ATTRIBUTES *pRoot, const char *access_string) { uint32_t dwNameCode; uint32_t n = 0; @@ -297,7 +296,7 @@ ATTRIBUTES *ATTRIBUTES::CreateSubAClass(ATTRIBUTES *pRoot, const char *access_st switch (access_string[n]) { case '.': - dwNameCode = stringCodec_.Convert(std::string_view(access_string, n)); + dwNameCode = stringCodec_.Convert(access_string, n); pTemp = pRoot->GetAttributeClassByCode(dwNameCode); if (!pTemp) pTemp = pRoot->CreateNewAttribute(dwNameCode); @@ -308,14 +307,14 @@ ATTRIBUTES *ATTRIBUTES::CreateSubAClass(ATTRIBUTES *pRoot, const char *access_st dwNameCode = stringCodec_.Convert(access_string); pResult = pRoot->GetAttributeClassByCode(dwNameCode); return (pResult) ? pResult : pRoot->CreateNewAttribute(dwNameCode); - default:; + default: ; } n++; } return nullptr; } -ATTRIBUTES *ATTRIBUTES::FindAClass(ATTRIBUTES *pRoot, const char *access_string) +ATTRIBUTES * ATTRIBUTES::FindAClass(ATTRIBUTES *pRoot, const char *access_string) { uint32_t n = 0; ATTRIBUTES *pResult = nullptr; @@ -331,7 +330,7 @@ ATTRIBUTES *ATTRIBUTES::FindAClass(ATTRIBUTES *pRoot, const char *access_string) switch (access_string[n]) { case '.': - pTemp = pRoot->GetAttributeClassByCode(stringCodec_.Convert(std::string_view(access_string, n))); + pTemp = pRoot->GetAttributeClassByCode(stringCodec_.Convert(access_string, n)); if (!pTemp) return nullptr; pResult = FindAClass(pTemp, &access_string[n + 1]); @@ -339,14 +338,14 @@ ATTRIBUTES *ATTRIBUTES::FindAClass(ATTRIBUTES *pRoot, const char *access_string) case 0: pResult = pRoot->GetAttributeClassByCode(stringCodec_.Convert(access_string)); return pResult; - default:; + default: ; } n++; } return nullptr; } -ATTRIBUTES *ATTRIBUTES::GetAttributeClassByCode(uint32_t name_code) const +ATTRIBUTES * ATTRIBUTES::GetAttributeClassByCode(uint32_t name_code) const { for (const auto &attribute : attributes_) if (name_code == attribute->nameCode_) @@ -354,7 +353,7 @@ ATTRIBUTES *ATTRIBUTES::GetAttributeClassByCode(uint32_t name_code) const return nullptr; } -ATTRIBUTES *ATTRIBUTES::VerifyAttributeClassByCode(uint32_t name_code) +ATTRIBUTES * ATTRIBUTES::VerifyAttributeClassByCode(uint32_t name_code) { ATTRIBUTES *pTemp = GetAttributeClassByCode(name_code); if (pTemp) @@ -362,7 +361,7 @@ ATTRIBUTES *ATTRIBUTES::VerifyAttributeClassByCode(uint32_t name_code) return CreateAttribute(name_code, ""); } -ATTRIBUTES *ATTRIBUTES::CreateAttribute(uint32_t name_code, const char *attribute) +ATTRIBUTES * ATTRIBUTES::CreateAttribute(uint32_t name_code, const char *attribute) { const auto &attr = attributes_.emplace_back(new ATTRIBUTES(stringCodec_, this, name_code)); @@ -399,8 +398,7 @@ size_t ATTRIBUTES::SetAttribute(uint32_t name_code, const char *attribute) { attributes_[n]->value_ = attribute; } - else - { + else { attributes_[n]->value_.reset(); } @@ -436,12 +434,12 @@ void ATTRIBUTES::SetNameCode(uint32_t n) noexcept nameCode_ = n; } -VSTRING_CODEC &ATTRIBUTES::GetStringCodec() const noexcept +VSTRING_CODEC & ATTRIBUTES::GetStringCodec() const noexcept { return stringCodec_; } -ATTRIBUTES *ATTRIBUTES::CreateNewAttribute(uint32_t name_code) +ATTRIBUTES * ATTRIBUTES::CreateNewAttribute(uint32_t name_code) { const std::unique_ptr &attr = attributes_.emplace_back(new ATTRIBUTES(stringCodec_, this, name_code)); return attr.get(); @@ -452,7 +450,7 @@ ATTRIBUTES::ATTRIBUTES(VSTRING_CODEC &p) : ATTRIBUTES(p, nullptr, "root") } ATTRIBUTES::ATTRIBUTES(VSTRING_CODEC &string_codec, ATTRIBUTES *parent, const std::string_view &name) - : ATTRIBUTES(string_codec, parent, string_codec.Convert(name)) + : ATTRIBUTES(string_codec, parent, string_codec.Convert(name.data())) { } diff --git a/src/libs/core/src/compiler.cpp b/src/libs/core/src/compiler.cpp index c88a871f3..3ffe29702 100644 --- a/src/libs/core/src/compiler.cpp +++ b/src/libs/core/src/compiler.cpp @@ -176,6 +176,7 @@ void COMPILER::Release() SStack.Release(); EventTab.Release(); EventMsg.Release(); + SCodec.Release(); LibriaryFuncs.clear(); delete[] pDebExpBuffer; @@ -2581,6 +2582,12 @@ bool COMPILER::CompileBlock(SEGMENT_DESC &Segment, bool &bFunctionBlock, uint32_ // CompileToken(Segment,EX); CompileToken(Segment, POP_EXPRESULT); // pop + + if (bound_type == IF_BLOCK) + { + return true; + } + break; case ELSE_BLOCK: update_offset = Segment.BCode_Program_size + 2; @@ -2595,7 +2602,8 @@ bool COMPILER::CompileBlock(SEGMENT_DESC &Segment, bool &bFunctionBlock, uint32_ else { Token.StepBack(); - if (!CompileBlock(Segment, bFunctionBlock, inout, SEPARATOR, continue_jump, break_offset, BreakTable)) + if (!CompileBlock(Segment, bFunctionBlock, inout, Token_type == IF_BLOCK ? IF_BLOCK : SEPARATOR, + continue_jump, break_offset, BreakTable)) return false; } memcpy(&Segment.pCode[update_offset], &Segment.BCode_Program_size, sizeof(uint32_t)); @@ -5716,11 +5724,7 @@ bool COMPILER::BC_Execute(uint32_t function_code, DATA *&pVReturnResult, const c else rAP = rAP->GetAttributeClassByCode(*((int32_t *)&pRunCodeBase[TLR_DataOffset])); if (!rAP) - { - std::string error_message = fmt::format( - "missed attribute: {}", SCodec.Convert(*((int32_t *)&pRunCodeBase[TLR_DataOffset]))); - SetError(error_message.c_str()); - } + SetError("missed attribute: %s", SCodec.Convert(*((int32_t *)&pRunCodeBase[TLR_DataOffset]))); break; case VARIABLE: real_var = VarTab.GetVar(*((int32_t *)&pRunCodeBase[TLR_DataOffset])); @@ -6139,13 +6143,11 @@ ATTRIBUTES *COMPILER::TraceARoot(ATTRIBUTES *pA, const char *&pAccess) if (pA->GetThisNameCode() == 0) return nullptr; // fix crash at NewGame start - const std::string_view attr_name = pA->GetThisName(); - const int32_t slen = attr_name.length() + 1; + const int32_t slen = strlen(pA->GetThisName()) + 1; char *pAS = new char[slen]; - std::copy(std::begin(attr_name), std::end(attr_name), pAS); - pAS[slen - 1] = '\0'; + memcpy(pAS, pA->GetThisName(), slen); if (pAccess == nullptr) { @@ -7266,42 +7268,38 @@ void COMPILER::PrintoutUsage() core.Controls->GetDebugAsyncKeyState(VK_SHIFT) < 0) { logTrace_->debug("Script Function Time Usage[func name/code(release mode) : ticks]"); - for (size_t m = 0; m < FuncTab.GetFuncNum(); m++) + FuncInfo fi; + for (size_t n = 0; n < FuncTab.GetFuncNum(); n++) { - FuncInfo fi; - for (size_t n = 0; n < FuncTab.GetFuncNum(); n++) + FuncTab.GetFuncX(fi, n); + if (fi.number_of_calls == 0) { - FuncTab.GetFuncX(fi, n); - if (fi.number_of_calls == 0) - { - continue; - } - - FuncTab.GetFunc(fi, n); - if (!fi.name.empty()) - { - logTrace_->debug(" {}", fi.name); - } - else - { - logTrace_->debug(" {}", n); - } - logTrace_->debug(" ticks summary : {}", fi.usage_time); - logTrace_->debug(" calls : {}", fi.number_of_calls); - if (fi.number_of_calls != 0) - { - logTrace_->debug(" average ticks : {}", static_cast(fi.usage_time) / fi.number_of_calls); - } + continue; + } - FuncTab.AddTime(n, ~fi.usage_time); - logTrace_->debug(""); + FuncTab.GetFunc(fi, n); + if (!fi.name.empty()) + { + logTrace_->debug(" {}", fi.name); + } + else + { + logTrace_->debug(" {}", n); + } + logTrace_->debug(" ticks summary : {}", fi.usage_time); + logTrace_->debug(" calls : {}", fi.number_of_calls); + if (fi.number_of_calls != 0) + { + logTrace_->debug(" average ticks : {}", static_cast(fi.usage_time) / fi.number_of_calls); } + logTrace_->debug(""); } + FuncTab.ResetTimeAndCalls(); logTrace_->debug("Script Run Time Log [sec : ms]"); for (size_t n = 0; n < nRuntimeLogEventsNum; n++) { - logTrace_->debug(" %d : %d", n, pRuntimeLogEvent[n]); + logTrace_->debug(" {} : {}", n, pRuntimeLogEvent[n]); } } } diff --git a/src/libs/core/src/compiler.h b/src/libs/core/src/compiler.h index fca8241bd..63eab800f 100644 --- a/src/libs/core/src/compiler.h +++ b/src/libs/core/src/compiler.h @@ -4,9 +4,7 @@ #include #include "data.h" -#include "logging.hpp" #include "message.h" -#include "platform/platform.hpp" #include "s_deftab.h" #include "s_eventmsg.h" #include "s_eventtab.h" @@ -14,11 +12,13 @@ #include "s_postevents.h" #include "s_stack.h" #include "s_vartab.h" -#include "script_cache.h" #include "script_libriary.h" -#include "string_codec.hpp" +#include "string_codec.h" #include "strings_list.h" #include "token.h" +#include "logging.hpp" +#include "script_cache.h" +#include "platform/platform.hpp" #include "ringbuffer_stack.hpp" diff --git a/src/libs/core/src/core_impl.cpp b/src/libs/core/src/core_impl.cpp index c19751831..4f1b45e8f 100644 --- a/src/libs/core/src/core_impl.cpp +++ b/src/libs/core/src/core_impl.cpp @@ -10,7 +10,7 @@ #include "string_compare.hpp" #include -Core& core = core_internal; +Core &core = core_internal; uint64_t get_performance_counter() { @@ -104,21 +104,21 @@ void CoreImpl::Init() Compiler = new COMPILER; /* TODO: place this outside CoreImpl */ - core.SetLayerType(EXECUTE, layer_type_t::execute); - core.SetLayerType(REALIZE, layer_type_t::realize); - core.SetLayerType(SEA_EXECUTE, layer_type_t::execute); - core.SetLayerType(SEA_REALIZE, layer_type_t::realize); - core.SetLayerType(INTERFACE_EXECUTE, layer_type_t::execute); - core.SetLayerType(INTERFACE_REALIZE, layer_type_t::realize); - core.SetLayerType(FADER_EXECUTE, layer_type_t::execute); - core.SetLayerType(FADER_REALIZE, layer_type_t::realize); - core.SetLayerType(LIGHTER_EXECUTE, layer_type_t::execute); - core.SetLayerType(LIGHTER_REALIZE, layer_type_t::realize); - core.SetLayerType(VIDEO_EXECUTE, layer_type_t::execute); - core.SetLayerType(VIDEO_REALIZE, layer_type_t::realize); - core.SetLayerType(EDITOR_REALIZE, layer_type_t::realize); - core.SetLayerType(INFO_REALIZE, layer_type_t::realize); - core.SetLayerType(SOUND_DEBUG_REALIZE, layer_type_t::realize); + SetLayerType(EXECUTE, layer_type_t::execute); + SetLayerType(REALIZE, layer_type_t::realize); + SetLayerType(SEA_EXECUTE, layer_type_t::execute); + SetLayerType(SEA_REALIZE, layer_type_t::realize); + SetLayerType(INTERFACE_EXECUTE, layer_type_t::execute); + SetLayerType(INTERFACE_REALIZE, layer_type_t::realize); + SetLayerType(FADER_EXECUTE, layer_type_t::execute); + SetLayerType(FADER_REALIZE, layer_type_t::realize); + SetLayerType(LIGHTER_EXECUTE, layer_type_t::execute); + SetLayerType(LIGHTER_REALIZE, layer_type_t::realize); + SetLayerType(VIDEO_EXECUTE, layer_type_t::execute); + SetLayerType(VIDEO_REALIZE, layer_type_t::realize); + SetLayerType(EDITOR_REALIZE, layer_type_t::realize); + SetLayerType(INFO_REALIZE, layer_type_t::realize); + SetLayerType(SOUND_DEBUG_REALIZE, layer_type_t::realize); } void CoreImpl::InitBase() @@ -330,7 +330,7 @@ void CoreImpl::Exit() Exit_flag = true; } -storm::OSWindow * CoreImpl::GetWindow() +storm::OSWindow *CoreImpl::GetWindow() { return window_.get(); } @@ -353,7 +353,7 @@ void CoreImpl::SetTimeScale(float _scale) uint64_t CoreImpl::Send_Message(entid_t Destination, const char *Format, ...) { MESSAGE message; - auto *const ptr = core.GetEntityPointer(Destination); // check for valid destination + auto *const ptr = GetEntityPointerSafe(Destination); // check for valid destination if (!ptr) return 0; @@ -439,7 +439,7 @@ VDATA *CoreImpl::Event(const std::string_view &event_name) return Compiler->ProcessEvent(event_name.data(), message); } -VDATA *CoreImpl::Event(const std::string_view &event_name, MESSAGE& message) +VDATA *CoreImpl::Event(const std::string_view &event_name, MESSAGE &message) { return Compiler->ProcessEvent(event_name.data(), message); } @@ -537,7 +537,7 @@ void CoreImpl::ProcessExecute() const auto &entIds = core.GetEntityIds(layer_type_t::execute); for (auto id : entIds) { - if (auto *ptr = core.GetEntityPointer(id)) + if (auto *ptr = core.GetEntityPointerSafe(id)) { ptr->ProcessStage(Entity::Stage::execute, deltatime); } @@ -555,7 +555,7 @@ void CoreImpl::ProcessRealize() const auto &entIds = core.GetEntityIds(layer_type_t::realize); for (auto id : entIds) { - if (auto *ptr = core.GetEntityPointer(id)) + if (auto *ptr = core.GetEntityPointerSafe(id)) { ptr->ProcessStage(Entity::Stage::realize, deltatime); } @@ -677,7 +677,7 @@ uint32_t CoreImpl::GetRDeltaTime() ATTRIBUTES *CoreImpl::Entity_GetAttributeClass(entid_t id_PTR, const char *name) { - Entity *pE = core.GetEntityPointer(id_PTR); + Entity *pE = GetEntityPointer(id_PTR); if (pE == nullptr) return nullptr; if (pE->AttributesPointer == nullptr) @@ -687,7 +687,7 @@ ATTRIBUTES *CoreImpl::Entity_GetAttributeClass(entid_t id_PTR, const char *name) const char *CoreImpl::Entity_GetAttribute(entid_t id_PTR, const char *name) { - Entity *pE = core.GetEntityPointer(id_PTR); + Entity *pE = GetEntityPointer(id_PTR); if (pE == nullptr) return nullptr; if (pE->AttributesPointer == nullptr) @@ -697,7 +697,7 @@ const char *CoreImpl::Entity_GetAttribute(entid_t id_PTR, const char *name) uint32_t CoreImpl::Entity_GetAttributeAsDword(entid_t id_PTR, const char *name, uint32_t def) { - Entity *pE = core.GetEntityPointer(id_PTR); + Entity *pE = GetEntityPointer(id_PTR); if (pE == nullptr) return def; if (pE->AttributesPointer == nullptr) @@ -707,7 +707,7 @@ uint32_t CoreImpl::Entity_GetAttributeAsDword(entid_t id_PTR, const char *name, FLOAT CoreImpl::Entity_GetAttributeAsFloat(entid_t id_PTR, const char *name, FLOAT def) { - Entity *pE = core.GetEntityPointer(id_PTR); + Entity *pE = GetEntityPointer(id_PTR); if (pE == nullptr) return def; if (pE->AttributesPointer == nullptr) @@ -717,7 +717,7 @@ FLOAT CoreImpl::Entity_GetAttributeAsFloat(entid_t id_PTR, const char *name, FLO bool CoreImpl::Entity_SetAttribute(entid_t id_PTR, const char *name, const char *attribute) { - Entity *pE = core.GetEntityPointer(id_PTR); + Entity *pE = GetEntityPointer(id_PTR); if (pE == nullptr) return false; if (pE->AttributesPointer == nullptr) @@ -727,7 +727,7 @@ bool CoreImpl::Entity_SetAttribute(entid_t id_PTR, const char *name, const char bool CoreImpl::Entity_SetAttributeUseDword(entid_t id_PTR, const char *name, uint32_t val) { - Entity *pE = core.GetEntityPointer(id_PTR); + Entity *pE = GetEntityPointer(id_PTR); if (pE == nullptr) return false; if (pE->AttributesPointer == nullptr) @@ -737,7 +737,7 @@ bool CoreImpl::Entity_SetAttributeUseDword(entid_t id_PTR, const char *name, uin bool CoreImpl::Entity_SetAttributeUseFloat(entid_t id_PTR, const char *name, FLOAT val) { - Entity *pE = core.GetEntityPointer(id_PTR); + Entity *pE = GetEntityPointer(id_PTR); if (pE == nullptr) return false; if (pE->AttributesPointer == nullptr) @@ -747,7 +747,7 @@ bool CoreImpl::Entity_SetAttributeUseFloat(entid_t id_PTR, const char *name, FLO void CoreImpl::Entity_SetAttributePointer(entid_t id_PTR, ATTRIBUTES *pA) { - Entity *pE = core.GetEntityPointer(id_PTR); + Entity *pE = GetEntityPointer(id_PTR); if (pE == nullptr) return; pE->AttributesPointer = pA; @@ -755,7 +755,7 @@ void CoreImpl::Entity_SetAttributePointer(entid_t id_PTR, ATTRIBUTES *pA) uint32_t CoreImpl::Entity_AttributeChanged(entid_t id_PTR, ATTRIBUTES *pA) { - Entity *pE = core.GetEntityPointer(id_PTR); + Entity *pE = GetEntityPointer(id_PTR); if (pE == nullptr) return 0; return pE->AttributeChanged(pA); @@ -763,7 +763,7 @@ uint32_t CoreImpl::Entity_AttributeChanged(entid_t id_PTR, ATTRIBUTES *pA) ATTRIBUTES *CoreImpl::Entity_GetAttributePointer(entid_t id_PTR) { - Entity *pE = core.GetEntityPointer(id_PTR); + Entity *pE = GetEntityPointer(id_PTR); if (pE == nullptr) return nullptr; return pE->AttributesPointer; @@ -960,11 +960,21 @@ entptr_t CoreImpl::GetEntityPointer(entid_t id) const return entity_manager_.GetEntityPointer(id); } +entptr_t CoreImpl::GetEntityPointerSafe(entid_t id) const +{ + return entity_manager_.IsEntityValid(id) ? GetEntityPointer(id) : nullptr; +} + entid_t CoreImpl::GetEntityId(const char *name) const { return entity_manager_.GetEntityId(name); } +bool CoreImpl::IsEntityValid(entid_t id) const +{ + return entity_manager_.IsEntityValid(id); +} + entity_container_cref CoreImpl::GetEntityIds(layer_type_t type) const { return entity_manager_.GetEntityIds(type); @@ -1010,7 +1020,7 @@ void CoreImpl::ForEachEntity(const std::function &f) entity_manager_.ForEachEntity(f); } -void CoreImpl:: collectCrashInfo() const +void CoreImpl::collectCrashInfo() const { Compiler->CollectCallStack(); } diff --git a/src/libs/core/src/core_impl.h b/src/libs/core/src/core_impl.h index 349de2008..a46ba4d3c 100644 --- a/src/libs/core/src/core_impl.h +++ b/src/libs/core/src/core_impl.h @@ -8,8 +8,6 @@ #include "timer.h" #include "vma.hpp" -#include - #define ENGINE_SCRIPT_VERSION 54128 class CoreImpl final : public CorePrivate @@ -122,7 +120,9 @@ class CoreImpl final : public CorePrivate void EraseEntity(entid_t entity) override; entid_t CreateEntity(const char *name, ATTRIBUTES *attr) override; entptr_t GetEntityPointer(entid_t id) const override; + entptr_t GetEntityPointerSafe(entid_t id) const override; entid_t GetEntityId(const char *name) const override; + bool IsEntityValid(entid_t id) const override; entity_container_cref GetEntityIds(layer_type_t type) const override; entity_container_cref GetEntityIds(layer_index_t index) const override; entity_container_cref GetEntityIds(const char *name) const override; diff --git a/src/libs/core/src/entity_manager.cpp b/src/libs/core/src/entity_manager.cpp index 0e0b8fda0..f8bf3f4f6 100644 --- a/src/libs/core/src/entity_manager.cpp +++ b/src/libs/core/src/entity_manager.cpp @@ -21,21 +21,20 @@ using invalid_entity_idx_t = std::integral_constant> i & 1) { RemoveFromLayer(i, data); } } - delete data.ptr; } -void EntityManager::MarkDeleted(const entid_t id) +void EntityManager::MarkDeleted(EntityInternalData &data) { - const auto index = static_cast(id); - entities_[index].valid = false; + data.state = kExists; + const auto index = static_cast(data.id); deletedIndices_.push(index); } @@ -52,7 +51,7 @@ hash_t EntityManager::GetClassCode(const entid_t id) const void EntityManager::AddToLayer(const layer_index_t index, EntityInternalData &data, const priority_t priority) { - assert(index < max_layers_num); + assert(index < kMaxLayerNum); // set info about layer data.mask |= 1 << index; @@ -65,8 +64,7 @@ void EntityManager::AddToLayer(const layer_index_t index, EntityInternalData &da // duplicate assert assert(std::ranges::find(entity_ids, data.id) == std::end(entity_ids)); - const auto targetIdx = - std::distance(std::begin(priorities), std::ranges::upper_bound(priorities, priority)); + const auto targetIdx = std::distance(std::begin(priorities), std::ranges::upper_bound(priorities, priority)); priorities.insert(std::begin(priorities) + targetIdx, priority); entity_ids.insert(std::begin(entity_ids) + targetIdx, data.id); @@ -74,7 +72,7 @@ void EntityManager::AddToLayer(const layer_index_t index, EntityInternalData &da void EntityManager::RemoveFromLayer(const layer_index_t index, EntityInternalData &data) { - assert(index < max_layers_num); + assert(index < kMaxLayerNum); auto &mask = data.mask; @@ -150,10 +148,11 @@ entid_t EntityManager::CreateEntity(const char *name, ATTRIBUTES *attr) cache_.UpdateErase(hash, id); // delete if fail - MarkDeleted(id); + const auto index = static_cast(id); + MarkDeleted(entities_[index]); return invalid_entity; } - + return id; } @@ -165,10 +164,10 @@ void EntityManager::EraseEntity(const entid_t id) return; } - const auto &data = entities_[idx]; + auto &data = entities_[idx]; // check if already erased - if (data.valid == false) + if (data.state != kValid) { return; } @@ -181,22 +180,23 @@ void EntityManager::EraseEntity(const entid_t id) // remove from cache cache_.UpdateErase(data.hash, id); - - MarkDeleted(id); + MarkDeleted(data); } void EntityManager::EraseAll() { for (auto it = std::begin(entities_); it != std::end(entities_); ++it) { - const auto index = static_cast(it->id); - - // release - EraseAndFree(entities_[index]); - entities_[index] = {}; + it->state = kNotExists; + delete it->ptr; } // clear containers + for (auto &layer : layers_) + { + layer.entity_ids.clear(); + layer.priorities.clear(); + } entities_.clear(); freeIndices_.clear(); deletedIndices_.clear(); @@ -213,33 +213,6 @@ entptr_t EntityManager::GetEntityPointer(const entid_t id) const return nullptr; } - // This check was intentionally removed to workaround some rare corner cases that are not handled properly. - // - // Here's an example of such a corner case that leads to crash due to missing sanity checks: - // Location entity is being destroyed (marked as invalid) from scripts. Therefore in the next frame its - // destructor is called, invoking Supervisor destructor which in turn destroys (marks as invalid) all the - // Player entities. - // Here's how it looks like: - // + - exists and operates; ! - invalidated (marked as invalid); x - deleted - // | Frame 0 | Frame 1 | Frame 2 | Frame 3 | - // Location | + | ! | x | x | - // Supervisor | + | + | x | x | - // Players[s] | + | + | ! | x | - // - // As it's shown, while Player[s] exists Location is always marked as invalid and doesn't return its pointer. - // At this point using an existing pointer to Location without check for validity would work (despite the - // inadmissibility of such); but calling GetEntityPointer legally returns nullptr due to `valid` flag unset. - // This case is exacerbated by the fact that in this corner case calls to `Player` are done via PostEvent. - // - // Although in this case it would be more consistent with introducing sanity checks over the code, - // such issues are very difficult to catch. And since this workaround doesn't introduce any harm except for - // encouraging inconsistency code, it makes sense to left it as a lifebuoy for the existing issues. - // - // if (!entities_[idx].valid) - // { - // return nullptr; - // } - return entities_[idx].ptr; } @@ -249,7 +222,7 @@ entity_container_cref EntityManager::GetEntityIds(const layer_type_t type) const static std::vector result; result.reserve(entities_.size()); result.clear(); - + for (auto it = std::begin(layers_); it != std::end(layers_); ++it) { if (it->frozen) @@ -262,7 +235,7 @@ entity_container_cref EntityManager::GetEntityIds(const layer_type_t type) const std::ranges::copy(it->entity_ids, std::back_inserter(result)); } } - + // TODO: Investigate: // Some entities are referenced in multiple layers of same type // therefore there are getting processed multiple times. @@ -290,7 +263,7 @@ entity_container_cref EntityManager::GetEntityIds(const uint32_t hash) const { for (auto it = std::begin(entities_); it != std::end(entities_); ++it) { - if (it->hash == hash && it->valid) + if (it->hash == hash && it->state == kValid) { cache_.Add(hash, it->id); empty = false; @@ -303,7 +276,7 @@ entity_container_cref EntityManager::GetEntityIds(const uint32_t hash) const entity_container_cref EntityManager::GetEntityIds(const layer_index_t index) const { - assert(index < max_layers_num); + assert(index < kMaxLayerNum); return layers_[index].entity_ids; } @@ -313,11 +286,17 @@ entid_t EntityManager::GetEntityId(const char *name) const return GetEntityId(MakeHashValue(name)); } +bool EntityManager::IsEntityValid(entid_t id) const +{ + const auto index = GetEntityDataIdx(id); + return EntIdxValid(index) && entities_[index].state == kValid; +} + entid_t EntityManager::GetEntityId(const uint32_t hash) const { for (auto it = std::begin(entities_); it != std::end(entities_); ++it) { - if (it->hash == hash && it->valid) + if (it->hash == hash && it->state == kValid) { return it->id; } @@ -349,28 +328,28 @@ entid_t EntityManager::CalculateEntityId(const size_t idx) layer_type_t EntityManager::GetLayerType(const layer_index_t index) const { - assert(index < max_layers_num); + assert(index < kMaxLayerNum); return layers_[index].type; } void EntityManager::SetLayerType(const layer_index_t index, const layer_type_t type) { - assert(index < max_layers_num); + assert(index < kMaxLayerNum); layers_[index].type = type; } void EntityManager::SetLayerFrozen(const layer_index_t index, const bool freeze) { - assert(index < max_layers_num); + assert(index < kMaxLayerNum); layers_[index].frozen = freeze; } bool EntityManager::IsLayerFrozen(const layer_index_t index) const { - assert(index < max_layers_num); + assert(index < kMaxLayerNum); return layers_[index].frozen; } @@ -408,10 +387,11 @@ void EntityManager::NewLifecycle() assert(entity_idx < entities_.size()); deletedIndices_.pop(); + auto &data = entities_[entity_idx]; // release - EraseAndFree(entities_[entity_idx]); + EraseAndFree(data); // erase entity data - entities_[entity_idx] = {}; + data = {}; // push free index to stack instead of shifting freeIndices_.push(entity_idx); } @@ -433,7 +413,32 @@ size_t EntityManager::GetEntityDataIdx(const entid_t id) const // check validity auto &data = entities_[index]; - if(data.valid == false) + // This check was intentionally removed to workaround some rare corner cases that are not handled properly. + // + // Here's an example of such a corner case that leads to crash due to missing sanity checks: + // Location entity is being destroyed (marked as invalid) from scripts. Therefore in the next frame its + // destructor is called, invoking Supervisor destructor which in turn destroys (marks as invalid) all the + // Player entities. + // Here's how it looks like: + // + - exists and operates; ! - invalidated (marked as invalid); x - deleted + // | Frame 0 | Frame 1 | Frame 2 | Frame 3 | + // Location | + | ! | x | x | + // Supervisor | + | + | x | x | + // Players[s] | + | + | ! | x | + // + // As it's shown, while Player[s] exists Location is always marked as invalid and doesn't return its pointer. + // At this point using an existing pointer to Location without check for validity would work (despite the + // inadmissibility of such); but calling GetEntityPointer legally returns nullptr due to `valid` flag unset. + // This case is exacerbated by the fact that in this corner case calls to `Player` are done via PostEvent. + // + // Although in this case it would be more consistent with introducing sanity checks over the code, + // such issues are very difficult to catch. And since this workaround doesn't introduce any harm except for + // encouraging inconsistency code, it makes sense to left it as a lifebuoy for the existing issues. + // if (data.valid == false) + // { + // return invalid_entity_idx_t{}; + // } + if (data.state == kNotExists) { return invalid_entity_idx_t{}; } @@ -443,7 +448,6 @@ size_t EntityManager::GetEntityDataIdx(const entid_t id) const { return invalid_entity_idx_t{}; } - return index; } @@ -455,14 +459,14 @@ entid_t EntityManager::InsertEntity(entptr_t ptr, hash_t hash) { const entid_index_t index = std::size(entities_); id = CalculateEntityId(index); - entities_.emplace_back(EntityInternalData{true, {}, {}, ptr, id, hash}); + entities_.emplace_back(EntityInternalData{{}, {}, kValid, ptr, id, hash}); } else { const entid_index_t index = freeIndices_.top(); id = CalculateEntityId(index); freeIndices_.pop(); - entities_[index] = {true, {}, {}, ptr, id, hash}; + entities_[index] = {{}, {}, kValid, ptr, id, hash}; } return id; @@ -470,10 +474,13 @@ entid_t EntityManager::InsertEntity(entptr_t ptr, hash_t hash) void EntityManager::ForEachEntity(const std::function &f) { - std::ranges::for_each(entities_, [&](const EntityInternalData& data) { - if (const auto entity_ptr = GetEntityPointer(data.id)) + std::ranges::for_each(entities_, [&](const EntityInternalData &data) { + if (data.state == kValid) + { + if (const auto entity_ptr = GetEntityPointer(data.id)) { f(entity_ptr); } - }); + } + }); } diff --git a/src/libs/core/src/entity_manager.h b/src/libs/core/src/entity_manager.h index 49c79ed03..a16d49583 100644 --- a/src/libs/core/src/entity_manager.h +++ b/src/libs/core/src/entity_manager.h @@ -1,9 +1,8 @@ #pragma once -#include - #include #include +#include #include #include "plf_stack.h" @@ -11,22 +10,52 @@ #include "entity.h" #include "entity_container_cache.h" - class EntityManager final { - constexpr static size_t max_layers_num = 32; // cannot exceed 32 + public: + hash_t GetClassCode(entid_t id) const; + entptr_t GetEntityPointer(entid_t id) const; + entity_container_cref GetEntityIds(layer_type_t type) const; + entity_container_cref GetEntityIds(const char *name) const; + entity_container_cref GetEntityIds(uint32_t hash) const; + entity_container_cref GetEntityIds(layer_index_t index) const; + entid_t GetEntityId(const char *name) const; + bool IsEntityValid(entid_t id) const; + layer_type_t GetLayerType(layer_index_t index) const; + bool IsLayerFrozen(layer_index_t index) const; + + void AddToLayer(layer_index_t layer_idx, entid_t entity_id, priority_t priority); // no bounds check + void RemoveFromLayer(layer_index_t layer_idx, entid_t entity_id); // no bounds check + entid_t CreateEntity(const char *name, ATTRIBUTES *attr = nullptr); + void EraseEntity(entid_t id); + void EraseAll(); + void SetLayerType(layer_index_t index, layer_type_t type); + void SetLayerFrozen(layer_index_t index, bool freeze); + void NewLifecycle(); + void ForEachEntity(const std::function &f); + + private: + constexpr static size_t kMaxLayerNum = sizeof(uint32_t) * 8; using entid_index_t = uint32_t; using entid_stamp_t = uint32_t; using entity_index_t = uint32_t; + enum EntityState : uint8_t + { + kNotExists = 0, + kExists = 1, + kValid = 2 + }; + struct EntityInternalData { using layer_mask_t = uint32_t; - bool valid; layer_mask_t mask; - priority_t priorities[max_layers_num]; + priority_t priorities[kMaxLayerNum]; + EntityState state; + entptr_t ptr; entid_t id; hash_t hash; @@ -40,28 +69,7 @@ class EntityManager final layer_type_t type; bool frozen; }; - public: - hash_t GetClassCode(entid_t id) const; - entptr_t GetEntityPointer(entid_t id) const; - entity_container_cref GetEntityIds(layer_type_t type) const; - entity_container_cref GetEntityIds(const char *name) const; - entity_container_cref GetEntityIds(uint32_t hash) const; - entity_container_cref GetEntityIds(layer_index_t index) const; - entid_t GetEntityId(const char *name) const; - layer_type_t GetLayerType(layer_index_t index) const; - bool IsLayerFrozen(layer_index_t index) const; - - void AddToLayer(layer_index_t layer_idx, entid_t entity_id, priority_t priority); // no bounds check - void RemoveFromLayer(layer_index_t layer_idx, entid_t entity_id); // no bounds check - entid_t CreateEntity(const char *name, ATTRIBUTES *attr = nullptr); - void EraseEntity(entid_t id); - void EraseAll(); - void SetLayerType(layer_index_t index, layer_type_t type); - void SetLayerFrozen(layer_index_t index, bool freeze); - void NewLifecycle(); - void ForEachEntity(const std::function &f); - private: static bool EntIdxValid(size_t idx); static entid_t CalculateEntityId(size_t idx); @@ -71,13 +79,13 @@ class EntityManager final void AddToLayer(layer_index_t index, EntityInternalData &data, priority_t priority); // no bounds check void RemoveFromLayer(layer_index_t index, EntityInternalData &data); // no bounds check void EraseAndFree(EntityInternalData &data); - void MarkDeleted(entid_t id); + void MarkDeleted(EntityInternalData &data); entid_t InsertEntity(entptr_t ptr, hash_t hash); mutable EntityContainerCache cache_; // array of layers - std::array layers_{}; + std::array layers_{}; // array of all entities std::vector entities_; diff --git a/src/libs/core/src/expression.cpp b/src/libs/core/src/expression.cpp index 94406c50c..1085776dc 100644 --- a/src/libs/core/src/expression.cpp +++ b/src/libs/core/src/expression.cpp @@ -757,9 +757,7 @@ void COMPILER::BC_ProcessExpression_L7(DATA *value, bool bSkip) if (pRoot == nullptr) { value->Set(""); - std::string error_message = fmt::format( - "missed attribute: {}", SCodec.Convert(*((int32_t *)&pRunCodeBase[TLR_DataOffset]))); - SetError(error_message.c_str()); + SetError("missed attribute: %s", SCodec.Convert(*((int32_t *)&pRunCodeBase[TLR_DataOffset]))); while (TokenType() == ACCESS_WORD_CODE || TokenType() == ACCESS_WORD || TokenType() == ACCESS_VAR) { BC_TokenGet(); @@ -770,9 +768,7 @@ void COMPILER::BC_ProcessExpression_L7(DATA *value, bool bSkip) if (pRoot == nullptr) { value->Set(""); - std::string error_message = fmt::format( - "missed attribute: {}", SCodec.Convert(*((int32_t *)&pRunCodeBase[TLR_DataOffset]))); - SetError(error_message.c_str()); + SetError("missed attribute: %s", SCodec.Convert(*((int32_t *)&pRunCodeBase[TLR_DataOffset]))); while (TokenType() == ACCESS_WORD_CODE || TokenType() == ACCESS_WORD || TokenType() == ACCESS_VAR) { BC_TokenGet(); diff --git a/src/libs/core/src/internal_functions.cpp b/src/libs/core/src/internal_functions.cpp index 5b3a3cf97..8a5df1cd1 100644 --- a/src/libs/core/src/internal_functions.cpp +++ b/src/libs/core/src/internal_functions.cpp @@ -709,7 +709,7 @@ DATA *COMPILER::BC_CallIntFunction(uint32_t func_code, DATA *&pVResult, uint32_t pV2->SetType(VAR_AREFERENCE); pV2->SetAReference(core_internal.Entity_GetAttributePointer(ent)); - if (core.GetEntityPointer(ent)) + if (core.IsEntityValid(ent)) TempLong1 = 1; else TempLong1 = 0; @@ -754,7 +754,7 @@ DATA *COMPILER::BC_CallIntFunction(uint32_t func_code, DATA *&pVResult, uint32_t pV2->SetType(VAR_AREFERENCE); pV2->SetAReference(core_internal.Entity_GetAttributePointer(ent)); - if (core.GetEntityPointer(ent)) + if (core.IsEntityValid(ent)) TempLong1 = 1; else TempLong1 = 0; @@ -786,7 +786,7 @@ DATA *COMPILER::BC_CallIntFunction(uint32_t func_code, DATA *&pVResult, uint32_t pV2->SetType(VAR_AREFERENCE); pV2->SetAReference(core_internal.Entity_GetAttributePointer(ent)); - if (core.GetEntityPointer(ent)) + if (core.IsEntityValid(ent)) TempLong1 = 1; else TempLong1 = 0; @@ -1511,7 +1511,7 @@ DATA *COMPILER::BC_CallIntFunction(uint32_t func_code, DATA *&pVResult, uint32_t pV = pV->GetVarPointer(); pV->Get(TempEid); pV = SStack.Push(); - if (core.GetEntityPointer(TempEid) != nullptr) + if (core.IsEntityValid(TempEid)) TempLong1 = 1; else TempLong1 = 0; @@ -1859,7 +1859,7 @@ DATA *COMPILER::BC_CallIntFunction(uint32_t func_code, DATA *&pVResult, uint32_t CreateMessage(&ms, s_off, 1); uint64_t mresult = 0; - pE = core.GetEntityPointer(ent); + pE = core.GetEntityPointerSafe(ent); if (pE) { ms.Move2Start(); @@ -2452,16 +2452,11 @@ DATA *COMPILER::BC_CallIntFunction(uint32_t func_code, DATA *&pVResult, uint32_t } pA = pV->GetAClass(); if (pA) - { - const auto attr_name = std::string(pA->GetThisName()); - pV = SStack.Push(); - pV->Set(attr_name.c_str()); - } + pChar = pA->GetThisName(); else - { - pV = SStack.Push(); - pV->Set("AClass ERROR n1"); - } + pChar = "AClass ERROR n1"; + pV = SStack.Push(); + pV->Set(pChar); pVResult = pV; return pV; case FUNC_DUMP_ATTRIBUTES: @@ -2571,7 +2566,7 @@ DATA *COMPILER::BC_CallIntFunction(uint32_t func_code, DATA *&pVResult, uint32_t std::sort(std::execution::seq, std::begin(pA->attributes_), std::end(pA->attributes_), [](const std::unique_ptr &lhs, const std::unique_ptr &rhs) { - return lhs->GetThisName().compare(rhs->GetThisName()) < 0; + return strcmp(lhs->GetThisName(), rhs->GetThisName()) < 0; }); break; @@ -2593,9 +2588,7 @@ void COMPILER::DumpAttributes(ATTRIBUTES *pA, int32_t level) for (uint32_t n = 0; n < pA->GetAttributesNum(); n++) { - const auto attr_name = std::string(pA->GetAttributeName(n)); - const auto attr_value = to_string(pA->GetAttribute(n)); - DTrace("%s%s = %s", buffer, attr_name.c_str(), attr_value.c_str()); + DTrace("%s%s = %s", buffer, pA->GetAttributeName(n), static_cast(pA->GetAttribute(n))); DumpAttributes(pA->GetAttributeClass(pA->GetAttributeName(n)), level + 2); } } diff --git a/src/libs/core/src/s_functab.cpp b/src/libs/core/src/s_functab.cpp index 540a03c9c..2980411f2 100644 --- a/src/libs/core/src/s_functab.cpp +++ b/src/libs/core/src/s_functab.cpp @@ -232,6 +232,15 @@ bool FuncTable::AddCall(size_t func_index) return true; } +void FuncTable::ResetTimeAndCalls() +{ + for (auto &func : funcs_) + { + func.usage_time = 0; + func.number_of_calls = 0; + } +} + void FuncTable::Release() { funcs_.clear(); diff --git a/src/libs/core/src/s_functab.h b/src/libs/core/src/s_functab.h index ea4be8ffb..e77b9c016 100644 --- a/src/libs/core/src/s_functab.h +++ b/src/libs/core/src/s_functab.h @@ -91,6 +91,7 @@ class FuncTable bool AddTime(size_t func_index, uint64_t time); bool AddCall(size_t func_index); + void ResetTimeAndCalls(); void Release(); // clear table diff --git a/src/libs/core/src/string_codec.cpp b/src/libs/core/src/string_codec.cpp deleted file mode 100644 index 842d11bc4..000000000 --- a/src/libs/core/src/string_codec.cpp +++ /dev/null @@ -1,116 +0,0 @@ -#include "string_codec.hpp" - -namespace -{ - -constexpr size_t HASH_TABLE_SIZE = 512; // must be power of 2 -constexpr size_t MAX_TABLE_ENTRY_SIZE = 1 << 16; // 0x10000 - -constexpr uint32_t MakeHashValue(const std::string_view &ps) -{ - uint32_t hval = 0; - for (char v : ps) - { - if ('A' <= v && v <= 'Z') - v += 'a' - 'A'; // case independent - hval = (hval << 4) + (uint32_t)v; - uint32_t g = hval & ((uint32_t)0xf << (32 - 4)); - if (g != 0) - { - hval ^= g >> (32 - 8); - hval ^= g; - } - } - return hval; -} - -uint32_t MakeStringCode(const uint32_t table_index, const uint32_t element_index) -{ - Assert(table_index < HASH_TABLE_SIZE); - Assert(element_index < MAX_TABLE_ENTRY_SIZE); - return (table_index << 16) | (element_index & (MAX_TABLE_ENTRY_SIZE - 1)); -} - -} // namespace - -STRING_CODEC::STRING_CODEC() : hashTable_(HASH_TABLE_SIZE) -{ -} - -STRING_CODEC::~STRING_CODEC() noexcept = default; - -uint32_t STRING_CODEC::GetNum() const -{ - return totalStringCount_; -} - -uint32_t STRING_CODEC::Convert(const std::string_view &pString) -{ - uint32_t hash_code = MakeHashValue(pString); - uint32_t table_index = hash_code & (HASH_TABLE_SIZE - 1); - - HTELEMENT &table_entry = hashTable_[table_index]; - - for (size_t n = 0; n < table_entry.elements.size(); n++) - { - const auto &element = table_entry.elements[n]; - if (element.hashCode == hash_code && storm::iEquals(pString, element.string)) - { - return MakeStringCode(table_index, n); - } - } - - const size_t n = table_entry.elements.size(); - table_entry.elements.push_back(HTSUBELEMENT{ - .string = std::string(pString), - .hashCode = hash_code, - }); - totalStringCount_++; - return MakeStringCode(table_index, n); -} - -std::string_view STRING_CODEC::Convert(uint32_t code) const -{ - uint32_t table_index = code >> 16; - if (table_index >= HASH_TABLE_SIZE) - { - return "ERROR: invalid SCCT index"; - } - uint32_t n = code & (MAX_TABLE_ENTRY_SIZE - 1); - if (n >= hashTable_[table_index].elements.size()) - { - return "INVALID SCC"; - } - return hashTable_[table_index].elements[n].string; -} - -const char *STRING_CODEC::Get() -{ - tableIndex_ = 0; - for (tableIndex_ = 0; tableIndex_ < HASH_TABLE_SIZE; tableIndex_++) - { - if (!hashTable_[tableIndex_].elements.empty()) - { - tableElementIndex_ = 0; - return hashTable_[tableIndex_].elements[tableElementIndex_].string.c_str(); - } - } - return nullptr; -} - -const char *STRING_CODEC::GetNext() -{ - tableElementIndex_++; - for (; tableIndex_ < HASH_TABLE_SIZE; tableIndex_++) - { - if (hashTable_[tableIndex_].elements.empty()) - continue; - if (tableElementIndex_ >= hashTable_[tableIndex_].elements.size()) - { - tableElementIndex_ = 0; - continue; - } - return hashTable_[tableIndex_].elements[tableElementIndex_].string.c_str(); - } - return nullptr; -} diff --git a/src/libs/core/src/string_codec.h b/src/libs/core/src/string_codec.h new file mode 100644 index 000000000..425718957 --- /dev/null +++ b/src/libs/core/src/string_codec.h @@ -0,0 +1,188 @@ +#pragma once + +#include "platform/platform.hpp" + +#define HASH_TABLE_SIZE 512 // must be power of 2 + +struct HTSUBELEMENT +{ + char *pStr; + uint32_t dwHashCode; +}; + +struct HTELEMENT +{ + HTSUBELEMENT *pElements; + uint32_t nStringsNum; +}; + +class STRING_CODEC : public VSTRING_CODEC +{ + uint32_t nHTIndex; + uint32_t nHTEIndex; + uint32_t nStringsNum; + + HTELEMENT HTable[HASH_TABLE_SIZE]{}; + + public: + STRING_CODEC() : nHTIndex(0), nHTEIndex(0) + { + nStringsNum = 0; + } + + ~STRING_CODEC() override + { + Release(); + } + + uint32_t GetNum() override + { + return nStringsNum; + } + + void Release() + { + for (uint32_t m = 0; m < HASH_TABLE_SIZE; m++) + { + if (HTable[m].pElements) + { + for (uint32_t n = 0; n < HTable[m].nStringsNum; n++) + delete HTable[m].pElements[n].pStr; + free(HTable[m].pElements); + } + HTable[m].pElements = nullptr; + HTable[m].nStringsNum = 0; + } + } + + uint32_t Convert(const char *pString, int32_t iLen) override + { + if (pString == nullptr) + return 0xffffffff; + + char cTemp[1024]; + strncpy_s(cTemp, pString, iLen); + cTemp[iLen] = 0; + + bool bNew; + return Convert(cTemp, bNew); + } + + uint32_t Convert(const char *pString) override + { + if (pString == nullptr) + return 0xffffffff; + bool bNew; + return Convert(pString, bNew); + } + + inline uint32_t GetNum(uint32_t dwNum, uint32_t dwAlign = 8) + { + return (1 + dwNum / dwAlign) * dwAlign; + } + + uint32_t Convert(const char *pString, bool &bNew) + { + uint32_t nStringCode; + uint32_t n; + if (pString == nullptr) + return 0xffffffff; + uint32_t nHash = MakeHashValue(pString); + uint32_t nTableIndex = nHash & (HASH_TABLE_SIZE - 1); + + HTELEMENT *pE = &HTable[nTableIndex]; + + for (n = 0; n < pE->nStringsNum; n++) + { + if (pE->pElements[n].dwHashCode == nHash && storm::iEquals(pString, pE->pElements[n].pStr)) + { + nStringCode = (nTableIndex << 16) | (n & 0xffff); + bNew = false; + return nStringCode; + } + } + + n = pE->nStringsNum; + pE->nStringsNum++; + pE->pElements = (HTSUBELEMENT *)realloc(pE->pElements, GetNum(pE->nStringsNum) * sizeof(HTSUBELEMENT)); + + const auto len = strlen(pString) + 1; + pE->pElements[n].pStr = new char[len]; + memcpy(pE->pElements[n].pStr, pString, len); + pE->pElements[n].dwHashCode = nHash; + + nStringCode = (nTableIndex << 16) | (n & 0xffff); + nStringsNum++; + bNew = true; + return nStringCode; + } + + void VariableChanged() override; + + const char *Convert(uint32_t code) override + { + uint32_t nTableIndex = code >> 16; + if (nTableIndex >= HASH_TABLE_SIZE) + { + return "ERROR: invalid SCCT index"; + } + uint32_t n = code & 0xffff; + if (n >= HTable[nTableIndex].nStringsNum) + { + return "INVALID SCC"; + } + return HTable[nTableIndex].pElements[n].pStr; + } + + uint32_t MakeHashValue(const char *ps) + { + uint32_t hval = 0; + while (*ps != 0) + { + char v = *ps++; + if ('A' <= v && v <= 'Z') + v += 'a' - 'A'; // case independent + hval = (hval << 4) + (uint32_t)v; + uint32_t g = hval & ((uint32_t)0xf << (32 - 4)); + if (g != 0) + { + hval ^= g >> (32 - 8); + hval ^= g; + } + } + return hval; + } + + char *Get() + { + nHTIndex = 0; + for (nHTIndex = 0; nHTIndex < HASH_TABLE_SIZE; nHTIndex++) + { + if (HTable[nHTIndex].nStringsNum > 0) + { + nHTEIndex = 0; + return HTable[nHTIndex].pElements[nHTEIndex].pStr; + } + } + return nullptr; + } + + char *GetNext() + { + nHTEIndex++; + for (; nHTIndex < HASH_TABLE_SIZE; nHTIndex++) + { + if (HTable[nHTIndex].nStringsNum == 0) + continue; + if (nHTEIndex >= HTable[nHTIndex].nStringsNum) + { + nHTEIndex = 0; + continue; + } + return HTable[nHTIndex].pElements[nHTEIndex].pStr; + } + return nullptr; + } + + //*/ +}; diff --git a/src/libs/core/src/string_codec.hpp b/src/libs/core/src/string_codec.hpp deleted file mode 100644 index 54fe44cda..000000000 --- a/src/libs/core/src/string_codec.hpp +++ /dev/null @@ -1,42 +0,0 @@ -#pragma once - -#include "attributes.h" -#include -#include - -struct HTSUBELEMENT -{ - std::string string{}; - uint32_t hashCode{}; -}; - -struct HTELEMENT -{ - std::vector elements; -}; - -class STRING_CODEC final : public VSTRING_CODEC -{ - public: - STRING_CODEC(); - ~STRING_CODEC() noexcept override; - - [[nodiscard]] uint32_t GetNum() const override; - uint32_t Convert(const std::string_view &pString) override; - [[nodiscard]] std::string_view Convert(uint32_t code) const override; - - void VariableChanged() override; - - // For iteration - const char *Get(); - const char *GetNext(); - - private: - std::vector hashTable_{}; - - uint32_t totalStringCount_ = 0; - - // For iteration - uint32_t tableIndex_ = 0; - uint32_t tableElementIndex_ = 0; -}; diff --git a/src/libs/dialog/src/dialog.cpp b/src/libs/dialog/src/dialog.cpp index c5f3285fa..f54d1daa6 100644 --- a/src/libs/dialog/src/dialog.cpp +++ b/src/libs/dialog/src/dialog.cpp @@ -1099,12 +1099,15 @@ uint32_t DIALOG::AttributeChanged(ATTRIBUTES *pA) ATTRIBUTES *par = pA->GetParent(); if (par != nullptr) { - if (storm::iEquals(par->GetThisName(), "Links")) + const char *parname = par->GetThisName(); + if (parname != nullptr && storm::iEquals(parname, "Links")) parLinks = true; } + const char *nm = pA->GetThisName(); + // play sound d.speech - if (!parLinks && storm::iEquals(pA->GetThisName(), "greeting")) // was "snd" + if (!parLinks && nm && storm::iEquals(nm, "greeting")) // was "snd" { strcpy_s(soundName, pA->GetThisAttr()); if (start) diff --git a/src/libs/geometry/include/geos.h b/src/libs/geometry/include/geos.h index b2b324f5b..068bf0d94 100644 --- a/src/libs/geometry/include/geos.h +++ b/src/libs/geometry/include/geos.h @@ -99,8 +99,8 @@ class GEOS struct LABEL { + alignas(16) float m[4][4]; int32_t flags; // combination of LABEL_FLAG - float m[4][4]; char *group_name; char *name; int32_t bones[4]; diff --git a/src/libs/lighter/src/l_geometry.cpp b/src/libs/lighter/src/l_geometry.cpp index 3907f1a65..ef37a114b 100644 --- a/src/libs/lighter/src/l_geometry.cpp +++ b/src/libs/lighter/src/l_geometry.cpp @@ -199,7 +199,7 @@ bool LGeometry::Process(VDX9RENDER *rs, int32_t numLights) } // Copy uint8_t *pnt = nullptr; - if (vbuf->Lock(0, desc.Size, (VOID **)&pnt, 0) != D3D_OK) + if (vbuf->Lock(0, desc.Size, (void **)&pnt, 0) != D3D_OK) { core.Trace("Location lighter: vertex buffer no locked, model %s, vbID %i", object[i].nameReal, vbID); return false; diff --git a/src/libs/location/src/character.cpp b/src/libs/location/src/character.cpp index 0403dc430..e85a15275 100644 --- a/src/libs/location/src/character.cpp +++ b/src/libs/location/src/character.cpp @@ -836,7 +836,7 @@ uint32_t Character::AttributeChanged(ATTRIBUTES *apnt) { if (deadName || liveValue < 0) return 0; - if (!apnt) + if (!apnt || !apnt->GetThisName()) return 0; if (storm::iEquals(apnt->GetThisName(), "model")) { @@ -4605,6 +4605,11 @@ void Character::UpdateAnimation() { fgtCurType = fgtSetType; fgtCurIndex = fgtSetIndex; + + if (fgtCurType == fgt_block || fgtCurType == fgt_blockhit) + { + blockStart = std::chrono::steady_clock::now(); + } } fgtSetType = fgt_none; fgtSetIndex = -1; @@ -5082,13 +5087,20 @@ inline void Character::CheckAttackHit(bool isGunBlade) } } fc.c->Hit(hitReaction); - core.Event("Location_CharacterAttack", "iisll", GetId(), fc.c->GetId(), aname, - static_cast(isBlocked), static_cast(isGunBlade)); + int blockTime = -1; + if (isBlocked) + { + blockTime = std::chrono::duration_cast(std::chrono::steady_clock::now() - + fc.c->blockStart) + .count(); + } + core.Event("Location_CharacterAttack", "iislll", GetId(), fc.c->GetId(), aname, + static_cast(isBlocked), static_cast(isGunBlade), blockTime); // boal 09/12/06 energy consumption after impact --> if (isUseEnergy && fgtCurType != fgt_attack_feintc) { - // for fgt_attack_feintc there is an overexertion in the animation, and here will be a "feint", and it - // costs 0 + // for fgt_attack_feintc there is an overexertion in the animation, and here will be a "feint", and + // it costs 0 core.Event("ChrFgtActApply", "is", GetId(), aname); isUseEnergy = false; } diff --git a/src/libs/location/src/character.h b/src/libs/location/src/character.h index 377560dac..16e76246f 100644 --- a/src/libs/location/src/character.h +++ b/src/libs/location/src/character.h @@ -10,12 +10,14 @@ #pragma once +#include +#include + #include "animation.h" #include "matrix.h" #include "model.h" #include "string_compare.hpp" #include "vma.hpp" -#include class Location; class MODEL; @@ -714,6 +716,8 @@ class Character : public Entity private: // The location the character is in entid_t loc_id; + + std::chrono::steady_clock::time_point blockStart{}; }; inline void Character::AlreadyDeleted() diff --git a/src/libs/location/src/fader.cpp b/src/libs/location/src/fader.cpp index 96bb2f4e8..25426aec7 100644 --- a/src/libs/location/src/fader.cpp +++ b/src/libs/location/src/fader.cpp @@ -127,11 +127,12 @@ bool Fader::Init() drawbuf_back[i] = {drawbuf_base[i].x, drawbuf_base[i].y, drawbuf_base[i].z, drawbuf_base[i].rhw, {}, drawbuf_base[i].u, drawbuf_base[i].v}; drawbuf_front[i] = drawbuf_back[i]; + drawbuf_tips[i] = drawbuf_back[i]; } if ((w - (4.0f * h / 3.0f)) / 2.0f >= 10.0f) { - float dy = 25.0f; + float dy = 0.025f * h; float dx = (w - (4.0f * (h - 2.0f * dy) / 3.0f)) / 2.0f; drawbuf_front[0].x = 0.0f + dx; @@ -154,14 +155,13 @@ bool Fader::Init() auto ini = fio->OpenIniFile(core.EngineIniFileName()); if (ini) { - numberOfTips = ini->GetInt(nullptr, "ProgressFrame", 1); + //numberOfTips = ini->GetInt(nullptr, "ProgressFrame", 1); + numberOfTips = ini->GetInt(nullptr, "numoftips", -1); } else numberOfTips = -1; - if (numberOfTips > 1) - numberOfTips = 1; - if (numberOfTips < 0) - numberOfTips = 0; + if (numberOfTips > 9999) + numberOfTips = 9999; } return true; } @@ -215,17 +215,20 @@ uint64_t Fader::ProcessMessage(MESSAGE &message) const std::string &_name = message.String(); textureID = rs->TextureCreate(_name.c_str()); rs->SetProgressImage(_name.c_str()); + // Hint texture if (numberOfTips > 0) { - const std::string texturePath = "interfaces\\int_border.tga"; + char _name[MAX_PATH]; + sprintf_s(_name, "tips\\tips_%.4u.tga", rand() % numberOfTips); if (tipsID >= 0) { rs->TextureRelease(tipsID); } - tipsID = rs->TextureCreate(texturePath.c_str()); - rs->SetTipsImage(texturePath.c_str()); + tipsID = rs->TextureCreate(_name); + rs->SetTipsImage(_name); } + break; } case FADER_PICTURE0: { @@ -233,22 +236,7 @@ uint64_t Fader::ProcessMessage(MESSAGE &message) rs->TextureRelease(textureBackID); const std::string &_name = message.String(); textureBackID = rs->TextureCreate(_name.c_str()); - rs->SetProgressBackImage(_name.c_str()); - // Hint texture - if (numberOfTips > 0) - { - // sprintf_s(_name, "tips\\tips_%.4u.tga", rand() % numberOfTips); - auto *const pTipsName = rs->GetTipsImage(); - if (pTipsName) - { - if (tipsID >= 0) - { - rs->TextureRelease(tipsID); - } - tipsID = rs->TextureCreate(pTipsName); - // rs->SetTipsImage(_name); - } - } + rs->SetProgressBackImage(_name.c_str()); break; } } @@ -258,7 +246,7 @@ uint64_t Fader::ProcessMessage(MESSAGE &message) // Work void Fader::Execute(uint32_t delta_time) { - // core.Trace("fader frame"); +// core.Trace("fader frame"); if (deleteMe) { deleteMe++; @@ -271,12 +259,12 @@ void Fader::Execute(uint32_t delta_time) if (!fadeIn) { core.PostEvent("FaderEvent_StartFade", 0, "li", fadeIn, GetId()); - // core.Trace("FaderEvent_StartFade"); +// core.Trace("FaderEvent_StartFade"); } else { core.PostEvent("FaderEvent_StartFadeIn", 0, "li", fadeIn, GetId()); - // core.Trace("FaderEvent_StartFadeIn"); +// core.Trace("FaderEvent_StartFadeIn"); } } if (eventEnd) @@ -286,12 +274,12 @@ void Fader::Execute(uint32_t delta_time) if (!fadeIn) { core.PostEvent("FaderEvent_EndFade", 0, "li", fadeIn, GetId()); - // core.Trace("FaderEvent_EndFade"); +// core.Trace("FaderEvent_EndFade"); } else { core.PostEvent("FaderEvent_EndFadeIn", 0, "li", fadeIn, GetId()); - // core.Trace("FaderEvent_EndFadeIn"); +// core.Trace("FaderEvent_EndFadeIn"); } } } @@ -315,7 +303,8 @@ void Fader::Realize(uint32_t delta_time) core.Trace("Fader: GetRenderTargetAsTexture failed"); } } - else { + else + { rs->SetTexture(0, tex); rs->DrawPrimitiveUP(D3DPT_TRIANGLELIST, D3DFVF_XYZRHW | D3DFVF_TEX1 | D3DFVF_TEXTUREFORMAT2, 2, drawbuf_base, sizeof(drawbuf_base[0]), "Fader"); @@ -360,19 +349,49 @@ void Fader::Realize(uint32_t delta_time) drawbuf_front[5].color = color; rs->TextureSet(0, textureID); - if (tipsID >= 0) - { - rs->TextureSet(1, tipsID); - rs->DrawPrimitiveUP(D3DPT_TRIANGLELIST, - D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1 | D3DFVF_TEXTUREFORMAT2, 2, drawbuf_front, - sizeof(drawbuf_front[0]), "FaderWithTips"); - } - else - { - rs->DrawPrimitiveUP(D3DPT_TRIANGLELIST, + rs->DrawPrimitiveUP(D3DPT_TRIANGLELIST, D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1 | D3DFVF_TEXTUREFORMAT2, 2, drawbuf_front, sizeof(drawbuf_front[0]), "Fader"); + } + + if (tipsID >= 0) + { + drawbuf_tips[0].color = color; + drawbuf_tips[1].color = color; + drawbuf_tips[2].color = color; + drawbuf_tips[3].color = color; + drawbuf_tips[4].color = color; + drawbuf_tips[5].color = color; + + float dy = 0.0f; + float dx = 0.0f; + float dxx = 0.0; + + if ((w - (4.0f * h / 3.0f)) / 2.0f >= 10.0f) + { + dy = 0.025f * h; + dx = (w - (4.0f * (h - 2.0f * dy) / 3.0f)) / 2.0f; +// dxx = (w - 2.0 * dx) * 0.125f; } + dxx = (w - 2.0 * dx) * 0.125f; + + drawbuf_tips[0].x = 0.0f + dx + dxx; + drawbuf_tips[0].y = 0.0f + 0.787f * h; + drawbuf_tips[1].x = w - dx - dxx; + drawbuf_tips[1].y = 0.0f + 0.787f * h; + drawbuf_tips[2].x = 0.0f + dx + dxx; + drawbuf_tips[2].y = h - 0.094f * h; + drawbuf_tips[3].x = 0.0f + dx + dxx; + drawbuf_tips[3].y = h - 0.094f * h; + drawbuf_tips[4].x = w - dx - dxx; + drawbuf_tips[4].y = 0.0f + 0.787f * h; + drawbuf_tips[5].x = w - dx - dxx; + drawbuf_tips[5].y = h - 0.094f * h; + + rs->TextureSet(0, tipsID); + rs->DrawPrimitiveUP(D3DPT_TRIANGLELIST, + D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1 | D3DFVF_TEXTUREFORMAT2, 2, drawbuf_tips, + sizeof(drawbuf_tips[0]), "Fader"); } // Increase alpha diff --git a/src/libs/location/src/fader.h b/src/libs/location/src/fader.h index c1638e10e..d76d461df 100644 --- a/src/libs/location/src/fader.h +++ b/src/libs/location/src/fader.h @@ -76,7 +76,7 @@ class Fader : public Entity float x, y, z, rhw; uint32_t color; float u, v; - } drawbuf_back[6], drawbuf_front[6]; + } drawbuf_back[6], drawbuf_front[6], drawbuf_tips[6]; bool eventStart; bool eventEnd; diff --git a/src/libs/location/src/location.cpp b/src/libs/location/src/location.cpp index a4550bb40..a5648e26d 100644 --- a/src/libs/location/src/location.cpp +++ b/src/libs/location/src/location.cpp @@ -233,6 +233,7 @@ uint64_t Location::ProcessMessage(MESSAGE &message) { int32_t i; float u0, v0, u1, v1; + float ax, ay, az; int32_t level; LocatorArray *la; switch (message.Long()) @@ -285,6 +286,14 @@ uint64_t Location::ProcessMessage(MESSAGE &message) u1 = message.Float(); // rz model.SetRotation(lastLoadStaticModel, u0, v0, u1); return 1; + case MSG_LOCATION_MODEL_SET_ROT_ANGLE: + if (lastLoadStaticModel < 0) + return 0; + ax = message.Float(); // ax + ay = message.Float(); // ay + az = message.Float(); // az + model.SetRotationAngle(lastLoadStaticModel, ax, ay, az); + return 1; case MSG_LOCATION_MODEL_SET_UVS: if (lastLoadStaticModel < 0) return 0; diff --git a/src/libs/location/src/model_array.cpp b/src/libs/location/src/model_array.cpp index 093117df5..edad2e2f7 100644 --- a/src/libs/location/src/model_array.cpp +++ b/src/libs/location/src/model_array.cpp @@ -255,6 +255,18 @@ void ModelArray::SetRotation(int32_t modelIndex, float rx, float ry, float rz) model[modelIndex].rotator->rz = rz; } +// Set base rotation angle +void ModelArray::SetRotationAngle(int32_t modelIndex, float ax, float ay, float az) +{ + Assert(modelIndex >= 0 && modelIndex < numModels); + auto *mdl = static_cast(core.GetEntityPointer(model[modelIndex].id)); + if (mdl) + { + CMatrix mtr(ax, ay, az); + mdl->mtx = CMatrix(mtr, mdl->mtx); + } +} + // Set the reflection matrix generation mode to the model void ModelArray::SetReflection(int32_t modelIndex, float scale) { diff --git a/src/libs/location/src/model_array.h b/src/libs/location/src/model_array.h index 9773aba0a..76714e2b7 100644 --- a/src/libs/location/src/model_array.h +++ b/src/libs/location/src/model_array.h @@ -103,6 +103,8 @@ class ModelArray void SetUVSlide(int32_t modelIndex, float u0, float v0, float u1, float v1); // Set a rotation animation to the model void SetRotation(int32_t modelIndex, float rx, float ry, float rz); + // Set base rotation angle + void SetRotationAngle(int32_t modelIndex, float ax, float ay, float az); // Set the reflection matrix generation mode to the model void SetReflection(int32_t modelIndex, float scale); diff --git a/src/libs/location/src/np_character.cpp b/src/libs/location/src/np_character.cpp index fb98633e5..b5c4ebc09 100644 --- a/src/libs/location/src/np_character.cpp +++ b/src/libs/location/src/np_character.cpp @@ -314,10 +314,11 @@ void NPCharacter::Update(float dltTime) { for (int32_t i = atr->GetAttributesNum() - 1; i >= 0; i--) { - const auto attr_name = std::string(atr->GetAttributeName(i)); - const auto attr_value = to_string(atr->GetAttribute(i)); - location->Print(curPos + CVECTOR(0.0f, height, 0.0f), rad, line++, 1.0f, 0xffffff, 0.5f, - "tmpl.%s(%s)", attr_name.c_str(), attr_value.c_str()); + fid = atr->GetAttributeName(i); + id = atr->GetAttribute(i); + if (fid && id) + location->Print(curPos + CVECTOR(0.0f, height, 0.0f), rad, line++, 1.0f, 0xffffff, 0.5f, + "tmpl.%s(%s)", fid, id); } if (atr->HasValue()) { @@ -330,11 +331,11 @@ void NPCharacter::Update(float dltTime) { for (int32_t i = atr->GetAttributesNum() - 1; i >= 0; i--) { - const auto attr_name = std::string(atr->GetAttributeName(i)); - const auto attr_value = to_string(atr->GetAttribute(i)); + fid = atr->GetAttributeName(i); + id = atr->GetAttribute(i); if (fid && id) location->Print(curPos + CVECTOR(0.0f, height, 0.0f), rad, line++, 1.0f, 0xffffff, 0.5f, - "type.%s(%s)", attr_name.c_str(), attr_value.c_str()); + "type.%s(%s)", fid, id); } if (atr->HasValue()) location->Print(curPos + CVECTOR(0.0f, height, 0.0f), rad, line++, 1.0f, 0xffffff, 0.5f, "type(%s)", diff --git a/src/libs/location/src/supervisor.h b/src/libs/location/src/supervisor.h index eb8fdc691..93df9a0d7 100644 --- a/src/libs/location/src/supervisor.h +++ b/src/libs/location/src/supervisor.h @@ -9,6 +9,7 @@ // ============================================================================================ #pragma once +#include #include class Character; diff --git a/src/libs/model/src/model.cpp b/src/libs/model/src/model.cpp index cb594c6fa..d7d4ca387 100644 --- a/src/libs/model/src/model.cpp +++ b/src/libs/model/src/model.cpp @@ -67,7 +67,7 @@ void *VBTransform(void *vb, int32_t startVrt, int32_t nVerts, int32_t totVerts) auto *src = static_cast(vb); GEOS::VERTEX0 *dst; - dest_vb->Lock(0, 0, (VOID **)&dst, D3DLOCK_DISCARD | D3DLOCK_NOSYSLOCK); + dest_vb->Lock(0, 0, (void **)&dst, D3DLOCK_DISCARD | D3DLOCK_NOSYSLOCK); #ifndef _WIN32 // FIX_LINUX DirectXMath CMatrix mtx; diff --git a/src/libs/particles/src/k2_wrapper/particles.cpp b/src/libs/particles/src/k2_wrapper/particles.cpp index c02ba8d8c..68296d8c5 100644 --- a/src/libs/particles/src/k2_wrapper/particles.cpp +++ b/src/libs/particles/src/k2_wrapper/particles.cpp @@ -323,7 +323,6 @@ void PARTICLES::PauseAllActive(bool bPaused) { for (uint32_t n = 0; n < CreatedSystems.size(); n++) { - CreatedSystems[n].pSystem->GetSystem()->Restart(0); CreatedSystems[n].pSystem->Pause(bPaused); } } diff --git a/src/libs/renderer/include/dx9render.h b/src/libs/renderer/include/dx9render.h index 2a778468b..656f370ca 100644 --- a/src/libs/renderer/include/dx9render.h +++ b/src/libs/renderer/include/dx9render.h @@ -203,7 +203,7 @@ class VDX9RENDER : public SERVICE virtual void SaveShoot() = 0; // DX9Render: Clip Planes Section - virtual HRESULT SetClipPlane(uint32_t Index, CONST float *pPlane) = 0; + virtual HRESULT SetClipPlane(uint32_t Index, const float *pPlane) = 0; virtual PLANE *GetPlanes() = 0; // DX9Render: Camera Section @@ -279,7 +279,8 @@ class VDX9RENDER : public SERVICE virtual void ReleaseVideoTexture(CVideoTexture *pVTexture) = 0; // DX9Render: Vertex/Index Buffers Section - virtual int32_t CreateVertexBuffer(int32_t type, size_t nverts, uint32_t usage) = 0; + virtual int32_t CreateVertexBuffer(int32_t type, size_t nverts, uint32_t usage, + uint32_t dwPool = D3DPOOL_DEFAULT) = 0; virtual int32_t CreateIndexBuffer(size_t ntrgs, uint32_t dwUsage = D3DUSAGE_WRITEONLY) = 0; virtual IDirect3DVertexBuffer9 *GetVertexBuffer(int32_t id) = 0; @@ -342,32 +343,32 @@ class VDX9RENDER : public SERVICE virtual HRESULT GetLevelDesc(IDirect3DTexture9 *ppTexture, UINT Level, D3DSURFACE_DESC *pDesc) = 0; virtual HRESULT GetLevelDesc(IDirect3DCubeTexture9 *ppCubeTexture, UINT Level, D3DSURFACE_DESC *pDesc) = 0; virtual HRESULT LockRect(IDirect3DCubeTexture9 *ppCubeTexture, D3DCUBEMAP_FACES FaceType, UINT Level, - D3DLOCKED_RECT *pLockedRect, CONST RECT *pRect, uint32_t Flags) = 0; - virtual HRESULT LockRect(IDirect3DTexture9 *ppTexture, UINT Level, D3DLOCKED_RECT *pLockedRect, CONST RECT *pRect, + D3DLOCKED_RECT *pLockedRect, const RECT *pRect, uint32_t Flags) = 0; + virtual HRESULT LockRect(IDirect3DTexture9 *ppTexture, UINT Level, D3DLOCKED_RECT *pLockedRect, const RECT *pRect, uint32_t Flags) = 0; virtual HRESULT UnlockRect(IDirect3DCubeTexture9 *pCubeTexture, D3DCUBEMAP_FACES FaceType, UINT Level) = 0; virtual HRESULT UnlockRect(IDirect3DTexture9 *pTexture, UINT Level) = 0; virtual HRESULT GetSurfaceLevel(IDirect3DTexture9 *ppTexture, UINT Level, IDirect3DSurface9 **ppSurfaceLevel) = 0; - virtual HRESULT UpdateSurface(IDirect3DSurface9 *pSourceSurface, CONST RECT *pSourceRectsArray, UINT cRects, - IDirect3DSurface9 *pDestinationSurface, CONST POINT *pDestPointsArray) = 0; + virtual HRESULT UpdateSurface(IDirect3DSurface9 *pSourceSurface, const RECT *pSourceRectsArray, UINT cRects, + IDirect3DSurface9 *pDestinationSurface, const POINT *pDestPointsArray) = 0; virtual HRESULT StretchRect(IDirect3DSurface9 *pSourceSurface, const RECT *pSourceRect, IDirect3DSurface9 *pDestSurface, const RECT *pDestRect, D3DTEXTUREFILTERTYPE Filter) = 0; virtual HRESULT GetRenderTargetData(IDirect3DSurface9 *pRenderTarget, IDirect3DSurface9 *pDestSurface) = 0; // D3D Pixel/Vertex Shaders Section - virtual HRESULT CreateVertexDeclaration(CONST D3DVERTEXELEMENT9 *pVertexElements, + virtual HRESULT CreateVertexDeclaration(const D3DVERTEXELEMENT9 *pVertexElements, IDirect3DVertexDeclaration9 **ppDecl) = 0; virtual HRESULT SetVertexDeclaration(IDirect3DVertexDeclaration9 *pDecl) = 0; - virtual HRESULT CreatePixelShader(CONST uint32_t *pFunction, IDirect3DPixelShader9 **ppShader) = 0; - virtual HRESULT CreateVertexShader(CONST uint32_t *pFunction, IDirect3DVertexShader9 **ppShader) = 0; + virtual HRESULT CreatePixelShader(const uint32_t *pFunction, IDirect3DPixelShader9 **ppShader) = 0; + virtual HRESULT CreateVertexShader(const uint32_t *pFunction, IDirect3DVertexShader9 **ppShader) = 0; virtual HRESULT DeletePixelShader(IDirect3DPixelShader9 *pShader) = 0; virtual HRESULT DeleteVertexShader(IDirect3DVertexShader9 *pShader) = 0; virtual HRESULT SetVertexShader(IDirect3DVertexShader9 *pShader) = 0; virtual HRESULT SetPixelShader(IDirect3DPixelShader9 *pShader) = 0; - /*virtual HRESULT SetFVFConstant(DWORD Register, CONST void * pConstantData, DWORD ConstantCount ) = 0;*/ - virtual HRESULT SetVertexShaderConstantF(UINT StartRegister, CONST float *pConstantData, UINT Vector4iCount) = 0; - virtual HRESULT SetPixelShaderConstantF(UINT StartRegister, CONST float *pConstantData, UINT Vector4iCount) = 0; + /*virtual HRESULT SetFVFConstant(DWORD Register, const void * pConstantData, DWORD ConstantCount ) = 0;*/ + virtual HRESULT SetVertexShaderConstantF(UINT StartRegister, const float *pConstantData, UINT Vector4iCount) = 0; + virtual HRESULT SetPixelShaderConstantF(UINT StartRegister, const float *pConstantData, UINT Vector4iCount) = 0; virtual HRESULT SetFVF(uint32_t handle) = 0; virtual HRESULT GetVertexShader(IDirect3DVertexShader9 **ppShader) = 0; virtual HRESULT GetPixelShader(IDirect3DPixelShader9 **ppShader) = 0; @@ -378,7 +379,7 @@ class VDX9RENDER : public SERVICE // D3D Render Target/Begin/End/Clear virtual HRESULT GetRenderTarget(IDirect3DSurface9 **ppRenderTarget) = 0; virtual HRESULT SetRenderTarget(IDirect3DSurface9 *pRenderTarget, IDirect3DSurface9 *pNewZStencil) = 0; - virtual HRESULT Clear(uint32_t Count, CONST D3DRECT *pRects, uint32_t Flags, D3DCOLOR Color, float Z, + virtual HRESULT Clear(uint32_t Count, const D3DRECT *pRects, uint32_t Flags, D3DCOLOR Color, float Z, uint32_t Stencil) = 0; virtual HRESULT BeginScene() = 0; virtual HRESULT EndScene() = 0; diff --git a/src/libs/renderer/src/font.cpp b/src/libs/renderer/src/font.cpp index 36bfc8f21..c857702fa 100644 --- a/src/libs/renderer/src/font.cpp +++ b/src/libs/renderer/src/font.cpp @@ -164,7 +164,7 @@ bool FONT::Init(const char *font_name, const char *iniName) nullptr); if (vertexBuffer_ == nullptr) throw std::runtime_error("vbuffer error"); - vertexBuffer_->Lock(0, sizeof(FONT_CHAR_VERTEX) * MAX_SYMBOLS * SYM_VERTEXS, (VOID **)&pVertex, 0); + vertexBuffer_->Lock(0, sizeof(FONT_CHAR_VERTEX) * MAX_SYMBOLS * SYM_VERTEXS, (void **)&pVertex, 0); for (codepoint = 0; codepoint < MAX_SYMBOLS * SYM_VERTEXS; codepoint++) { pVertex[codepoint].pos.z = 0.5f; @@ -229,7 +229,7 @@ int32_t FONT::UpdateVertexBuffer(int32_t x, int32_t y, char *data_PTR, int utf8l s_num = strlen(data_PTR); - vertexBuffer_->Lock(0, sizeof(FONT_CHAR_VERTEX) * utf8length * SYM_VERTEXS, (VOID **)&pVertex, 0); + vertexBuffer_->Lock(0, sizeof(FONT_CHAR_VERTEX) * utf8length * SYM_VERTEXS, (void **)&pVertex, 0); xoffset = 0; diff --git a/src/libs/renderer/src/s_device.cpp b/src/libs/renderer/src/s_device.cpp index bcb69decb..51897fe61 100644 --- a/src/libs/renderer/src/s_device.cpp +++ b/src/libs/renderer/src/s_device.cpp @@ -505,6 +505,8 @@ bool DX9RENDER::Init() #endif bShowFps = ini->GetInt(nullptr, "show_fps", 0) == 1; + fpsx = ini->GetInt(nullptr, "fps_posx", 0); + fpsy = ini->GetInt(nullptr, "fps_posy", 0); bShowExInfo = ini->GetInt(nullptr, "show_exinfo", 0) == 1; bSafeRendering = ini->GetInt(nullptr, "safe_render", 0) == 0; bDropVideoConveyor = ini->GetInt(nullptr, "DropVideoConveyor", 0) != 0; @@ -1207,7 +1209,7 @@ bool DX9RENDER::DX9EndScene() { if (bShowFps) { - Print(screen_size.x - 100, screen_size.y - 50, "FPS %d", core.EngineFps()); + Print(screen_size.x - fpsx, screen_size.y - fpsy, "FPS %d", core.EngineFps()); } if (bShowExInfo) @@ -1252,7 +1254,7 @@ bool DX9RENDER::DX9EndScene() if (bDropVideoConveyor && pDropConveyorVBuffer) { CVECTOR *pV; - pDropConveyorVBuffer->Lock(0, 0, (VOID **)&pV, 0); + pDropConveyorVBuffer->Lock(0, 0, (void **)&pV, 0); for (int32_t i = 0; i < 2; i++) pV[i] = CVECTOR(1e6f, 1e6f, 1e6f); pDropConveyorVBuffer->Unlock(); @@ -2179,7 +2181,7 @@ bool DX9RENDER::GetLight(uint32_t dwIndex, D3DLIGHT9 *pLight) //################################################################################ -int32_t DX9RENDER::CreateVertexBuffer(int32_t type, size_t size, uint32_t dwUsage) +int32_t DX9RENDER::CreateVertexBuffer(int32_t type, size_t size, uint32_t dwUsage, uint32_t dwPool) { if (size <= 0) return -1; // fix @@ -2192,7 +2194,8 @@ int32_t DX9RENDER::CreateVertexBuffer(int32_t type, size_t size, uint32_t dwUsag if (b == MAX_BUFFERS) return -1; - if (CHECKD3DERR(d3d9->CreateVertexBuffer(size, dwUsage, type, D3DPOOL_DEFAULT, &VertexBuffers[b].buff, NULL))) + if (CHECKD3DERR(d3d9->CreateVertexBuffer(size, dwUsage, type, static_cast(dwPool), + &VertexBuffers[b].buff, NULL))) return -1; VertexBuffers[b].type = type; @@ -2373,7 +2376,7 @@ void DX9RENDER::RenderAnimation(int32_t ib, void *src, int32_t numVrts, int32_t // Copy verteces uint8_t *ptr; RDTSC_B(_rdtsc); - if (CHECKD3DERR(aniVBuffer->Lock(0, size, (VOID **)&ptr, 0)) == true) + if (CHECKD3DERR(aniVBuffer->Lock(0, size, (void **)&ptr, 0)) == true) return; dwNumLV++; RDTSC_E(_rdtsc); @@ -2400,7 +2403,7 @@ void *DX9RENDER::LockVertexBuffer(int32_t id, uint32_t dwFlags) { uint8_t *ptr; VertexBuffers[id].dwNumLocks++; - if (CHECKD3DERR(VertexBuffers[id].buff->Lock(0, VertexBuffers[id].size, (VOID **)&ptr, dwFlags))) + if (CHECKD3DERR(VertexBuffers[id].buff->Lock(0, VertexBuffers[id].size, (void **)&ptr, dwFlags))) return nullptr; dwNumLV++; @@ -2423,7 +2426,7 @@ void *DX9RENDER::LockIndexBuffer(int32_t id, uint32_t dwFlags) { uint8_t *ptr = nullptr; IndexBuffers[id].dwNumLocks++; - if (CHECKD3DERR(IndexBuffers[id].buff->Lock(0, IndexBuffers[id].size, (VOID **)&ptr, dwFlags))) + if (CHECKD3DERR(IndexBuffers[id].buff->Lock(0, IndexBuffers[id].size, (void **)&ptr, dwFlags))) return nullptr; dwNumLI++; @@ -3429,7 +3432,7 @@ void DX9RENDER::DrawRects(RS_RECT *pRSR, uint32_t dwRectsNum, const char *cBlock drawCount = rectsVBuffer_SizeInRects; // Buffer RECT_VERTEX *data = nullptr; - if (rectsVBuffer->Lock(0, drawCount * 6 * sizeof(RECT_VERTEX), (VOID **)&data, D3DLOCK_DISCARD) != D3D_OK) + if (rectsVBuffer->Lock(0, drawCount * 6 * sizeof(RECT_VERTEX), (void **)&data, D3DLOCK_DISCARD) != D3D_OK) return; if (!data) return; @@ -3581,7 +3584,7 @@ HRESULT DX9RENDER::VBLock(IDirect3DVertexBuffer9 *pVB, UINT OffsetToLock, UINT S uint32_t Flags) { dwNumLV++; - return CHECKD3DERR(pVB->Lock(OffsetToLock, SizeToLock, (VOID **)ppbData, Flags)); + return CHECKD3DERR(pVB->Lock(OffsetToLock, SizeToLock, (void **)ppbData, Flags)); } void DX9RENDER::VBUnlock(IDirect3DVertexBuffer9 *pVB) @@ -3646,7 +3649,7 @@ HRESULT DX9RENDER::SetRenderTarget(IDirect3DSurface9 *pRenderTarget, IDirect3DSu return result ? D3D_OK : S_FALSE; } -HRESULT DX9RENDER::Clear(uint32_t Count, CONST D3DRECT *pRects, uint32_t Flags, D3DCOLOR Color, float Z, +HRESULT DX9RENDER::Clear(uint32_t Count, const D3DRECT *pRects, uint32_t Flags, D3DCOLOR Color, float Z, uint32_t Stencil) { return CHECKD3DERR(d3d9->Clear(Count, pRects, Flags, Color, Z, Stencil)); @@ -3676,7 +3679,7 @@ HRESULT DX9RENDER::EndScene() return D3D_OK; } -HRESULT DX9RENDER::SetClipPlane(uint32_t Index, CONST float *pPlane) +HRESULT DX9RENDER::SetClipPlane(uint32_t Index, const float *pPlane) { // return d3d9->SetClipPlane( Index, pPlane ); return D3D_OK; @@ -3707,7 +3710,7 @@ HRESULT DX9RENDER::CreateDepthStencilSurface(UINT Width, UINT Height, D3DFORMAT return CHECKD3DERR(d3d9->CreateDepthStencilSurface(Width, Height, Format, MultiSample, 0, TRUE, ppSurface, NULL)); } -HRESULT DX9RENDER::CreateVertexDeclaration(CONST D3DVERTEXELEMENT9 *pVertexElements, +HRESULT DX9RENDER::CreateVertexDeclaration(const D3DVERTEXELEMENT9 *pVertexElements, IDirect3DVertexDeclaration9 **ppDecl) { return CHECKD3DERR(d3d9->CreateVertexDeclaration(pVertexElements, ppDecl)); @@ -3718,12 +3721,12 @@ HRESULT DX9RENDER::SetVertexDeclaration(IDirect3DVertexDeclaration9 *pDecl) return CHECKD3DERR(d3d9->SetVertexDeclaration(pDecl)); } -HRESULT DX9RENDER::CreateVertexShader(CONST uint32_t *pFunction, IDirect3DVertexShader9 **ppShader) +HRESULT DX9RENDER::CreateVertexShader(const uint32_t *pFunction, IDirect3DVertexShader9 **ppShader) { return CHECKD3DERR(d3d9->CreateVertexShader((const DWORD *)pFunction, ppShader)); } -HRESULT DX9RENDER::CreatePixelShader(CONST uint32_t *pFunction, IDirect3DPixelShader9 **ppShader) +HRESULT DX9RENDER::CreatePixelShader(const uint32_t *pFunction, IDirect3DPixelShader9 **ppShader) { return CHECKD3DERR(d3d9->CreatePixelShader((const DWORD *)pFunction, ppShader)); } @@ -3779,12 +3782,12 @@ HRESULT DX9RENDER::GetLevelDesc(IDirect3DCubeTexture9 *ppCubeTexture, UINT Level } HRESULT DX9RENDER::LockRect(IDirect3DCubeTexture9 *ppCubeTexture, D3DCUBEMAP_FACES FaceType, UINT Level, - D3DLOCKED_RECT *pLockedRect, CONST RECT *pRect, uint32_t Flags) + D3DLOCKED_RECT *pLockedRect, const RECT *pRect, uint32_t Flags) { return CHECKD3DERR(ppCubeTexture->LockRect(FaceType, Level, pLockedRect, pRect, Flags)); } -HRESULT DX9RENDER::LockRect(IDirect3DTexture9 *ppTexture, UINT Level, D3DLOCKED_RECT *pLockedRect, CONST RECT *pRect, +HRESULT DX9RENDER::LockRect(IDirect3DTexture9 *ppTexture, UINT Level, D3DLOCKED_RECT *pLockedRect, const RECT *pRect, uint32_t Flags) { return CHECKD3DERR(ppTexture->LockRect(Level, pLockedRect, pRect, Flags)); @@ -3805,8 +3808,8 @@ HRESULT DX9RENDER::GetSurfaceLevel(IDirect3DTexture9 *ppTexture, UINT Level, IDi return CHECKD3DERR(ppTexture->GetSurfaceLevel(Level, ppSurfaceLevel)); } -HRESULT DX9RENDER::UpdateSurface(IDirect3DSurface9 *pSourceSurface, CONST RECT *pSourceRectsArray, UINT cRects, - IDirect3DSurface9 *pDestinationSurface, CONST POINT *pDestPointsArray) +HRESULT DX9RENDER::UpdateSurface(IDirect3DSurface9 *pSourceSurface, const RECT *pSourceRectsArray, UINT cRects, + IDirect3DSurface9 *pDestinationSurface, const POINT *pDestPointsArray) { return CHECKD3DERR(D3DXLoadSurfaceFromSurface(pDestinationSurface, nullptr, nullptr, pSourceSurface, nullptr, nullptr, D3DX_DEFAULT, 0)); @@ -3872,12 +3875,12 @@ HRESULT DX9RENDER::SetPixelShader(IDirect3DPixelShader9 *pShader) return CHECKD3DERR(d3d9->SetPixelShader(pShader)); } -HRESULT DX9RENDER::SetVertexShaderConstantF(UINT StartRegister, CONST float *pConstantData, UINT Vector4iCount) +HRESULT DX9RENDER::SetVertexShaderConstantF(UINT StartRegister, const float *pConstantData, UINT Vector4iCount) { return CHECKD3DERR(d3d9->SetVertexShaderConstantF(StartRegister, pConstantData, Vector4iCount)); } -HRESULT DX9RENDER::SetPixelShaderConstantF(UINT StartRegister, CONST float *pConstantData, UINT Vector4iCount) +HRESULT DX9RENDER::SetPixelShaderConstantF(UINT StartRegister, const float *pConstantData, UINT Vector4iCount) { return CHECKD3DERR(d3d9->SetPixelShaderConstantF(StartRegister, pConstantData, Vector4iCount)); } @@ -4224,13 +4227,17 @@ void DX9RENDER::ProgressView() float x, y, z, rhw; uint32_t color; float u, v; - } v[4]; + } v[4], t[4]; uint32_t i; for (i = 0; i < 4; i++) { v[i].z = 0.5; v[i].rhw = 2.0; v[i].color = 0xffffffff; + + t[i].z = 0.5; + t[i].rhw = 2.0; + t[i].color = 0xffffffff; } // Calculate the rectangle in which to draw D3DVIEWPORT9 vp; @@ -4264,13 +4271,16 @@ void DX9RENDER::ProgressView() float dy = 0.0f; float dx = ((float(vp.Width) - (4.0f * float(vp.Height) / 3.0f)) / 2.0f); + float dxx = 0.0f; if (dx < 10.0f) dx = 0.0f; else { - dy = 25.0f; + dy = float(vp.Height) * 0.025f; dx = ((float(vp.Width) - (4.0f * (float(vp.Height) - 2.0f * dy) / 3.0f)) / 2.0f); +// dxx = (float(vp.Width) - 2.0 * dx) * 0.125f; } + dxx = (float(vp.Width) - 2.0 * dx) * 0.125f; v[0].x = 0.0f + dx; v[0].y = 0.0f + dy; @@ -4297,28 +4307,49 @@ void DX9RENDER::ProgressView() } else { - if (progressTipsTexture >= 0) - { - TextureSet(1, progressTipsTexture); - DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1, 2, v, sizeof(v[0]), - "ProgressBackTechWithTips"); - } - else - { - DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1, 2, v, sizeof(v[0]), + DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1, 2, v, sizeof(v[0]), "ProgressBackTech"); - } } + + if (progressTipsTexture >= 0) + { + t[0].x = 0.0f + dx + dxx; + t[0].y = 0.0f + 0.787f * float(vp.Height); + t[1].x = float(vp.Width) - dx - dxx; + t[1].y = 0.0f + 0.787f * float(vp.Height); + t[2].x = 0.0f + dx + dxx; + t[2].y = float(vp.Height) - 0.094f * float(vp.Height); + t[3].x = float(vp.Width) - dx - dxx; + t[3].y = float(vp.Height) - 0.094f * float(vp.Height); + + t[0].u = 0.0f; + t[0].v = 0.0f; + t[1].u = 1.0f; + t[1].v = 0.0f; + t[2].u = 0.0f; + t[2].v = 1.0f; + t[3].u = 1.0f; + t[3].v = 1.0f; + + TextureSet(0, progressTipsTexture); + DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1, 2, t, sizeof(t[0]), + "ProgressBackTech"); + } + if (backTexture < 0) for (i = 0; i < 4; i++) v[i].color = 0xffffffff; // Animated object m_fHeightDeformator = ((float)vp.Height * 4.0f) / ((float)vp.Width * 3.0f); - // core.Trace(" size_x %f", (vp.Width - dx * 2.0f)*progressFramesWidth); - CVECTOR pos((vp.Width - dx * 2.0f) * progressFramesPosX + dx, (vp.Height - dy * 2.0f) * progressFramesPosY + dy, - 0.0f); - CVECTOR size((vp.Width - dx * 2.0f) * progressFramesWidth, - (vp.Height - dy * 2.0f) * progressFramesHeight * 4.0f / 3.0f, 0.0f); + +// core.Trace(" size_x %f size_y %f", (vp.Width - dx * 2.0f) * progressFramesWidth, (vp.Height - dy * 2.0f) * progressFramesHeight * 4.0f / 3.0f); + + CVECTOR pos(vp.Width * progressFramesPosX, vp.Height * progressFramesPosY, 0.0f); +// CVECTOR size(vp.Width * progressFramesWidth, vp.Width * progressFramesHeight * 4.0f / 3.0f, 0.0f); + +// CVECTOR pos((vp.Width - dx * 2.0f) * progressFramesPosX + dx, (vp.Height - dy * 2.0f) * progressFramesPosY + dy, 0.0f); + CVECTOR size((vp.Width - dx * 2.0f) * progressFramesWidth,(vp.Height - dy * 2.0f) * progressFramesHeight * 4.0f / 3.0f, 0.0f); + v[0].x = pos.x; v[0].y = pos.y; v[1].x = pos.x + size.x + 0.5f; diff --git a/src/libs/renderer/src/s_device.h b/src/libs/renderer/src/s_device.h index dec7747bc..60c932158 100644 --- a/src/libs/renderer/src/s_device.h +++ b/src/libs/renderer/src/s_device.h @@ -139,7 +139,7 @@ class DX9RENDER : public VDX9RENDER void SaveShoot() override; // DX9Render: Clip Planes Section - HRESULT SetClipPlane(uint32_t Index, CONST float *pPlane) override; + HRESULT SetClipPlane(uint32_t Index, const float *pPlane) override; PLANE *GetPlanes() override; // DX9Render: Camera Section @@ -211,8 +211,8 @@ class DX9RENDER : public VDX9RENDER void ReleaseVideoTexture(CVideoTexture *pVTexture) override; // DX9Render: Vertex/Index Buffers Section - int32_t CreateVertexBuffer(int32_t type, size_t nverts, uint32_t usage) override; - int32_t CreateIndexBuffer(size_t ntrgs, uint32_t dwUsage = D3DUSAGE_WRITEONLY) override; + int32_t CreateVertexBuffer(int32_t type, size_t nverts, uint32_t usage, uint32_t dwPool) override; + int32_t CreateIndexBuffer(size_t ntrgs, uint32_t dwUsage) override; IDirect3DVertexBuffer9 *GetVertexBuffer(int32_t id) override; int32_t GetVertexBufferFVF(int32_t id) override; @@ -281,31 +281,31 @@ class DX9RENDER : public VDX9RENDER HRESULT GetLevelDesc(IDirect3DTexture9 *ppTexture, UINT Level, D3DSURFACE_DESC *pDesc) override; HRESULT GetLevelDesc(IDirect3DCubeTexture9 *ppCubeTexture, UINT Level, D3DSURFACE_DESC *pDesc) override; HRESULT LockRect(IDirect3DCubeTexture9 *ppCubeTexture, D3DCUBEMAP_FACES FaceType, UINT Level, - D3DLOCKED_RECT *pLockedRect, CONST RECT *pRect, uint32_t Flags) override; - HRESULT LockRect(IDirect3DTexture9 *ppTexture, UINT Level, D3DLOCKED_RECT *pLockedRect, CONST RECT *pRect, + D3DLOCKED_RECT *pLockedRect, const RECT *pRect, uint32_t Flags) override; + HRESULT LockRect(IDirect3DTexture9 *ppTexture, UINT Level, D3DLOCKED_RECT *pLockedRect, const RECT *pRect, uint32_t Flags) override; HRESULT UnlockRect(IDirect3DCubeTexture9 *pCubeTexture, D3DCUBEMAP_FACES FaceType, UINT Level) override; HRESULT UnlockRect(IDirect3DTexture9 *pTexture, UINT Level) override; HRESULT GetSurfaceLevel(IDirect3DTexture9 *ppTexture, UINT Level, IDirect3DSurface9 **ppSurfaceLevel) override; - HRESULT UpdateSurface(IDirect3DSurface9 *pSourceSurface, CONST RECT *pSourceRectsArray, UINT cRects, - IDirect3DSurface9 *pDestinationSurface, CONST POINT *pDestPointsArray) override; + HRESULT UpdateSurface(IDirect3DSurface9 *pSourceSurface, const RECT *pSourceRectsArray, UINT cRects, + IDirect3DSurface9 *pDestinationSurface, const POINT *pDestPointsArray) override; HRESULT StretchRect(IDirect3DSurface9 *pSourceSurface, const RECT *pSourceRect, IDirect3DSurface9 *pDestSurface, const RECT *pDestRect, D3DTEXTUREFILTERTYPE Filter) override; HRESULT GetRenderTargetData(IDirect3DSurface9 *pRenderTarget, IDirect3DSurface9 *pDestSurface) override; // D3D Pixel/Vertex Shaders Section - HRESULT CreateVertexDeclaration(CONST D3DVERTEXELEMENT9 *pVertexElements, + HRESULT CreateVertexDeclaration(const D3DVERTEXELEMENT9 *pVertexElements, IDirect3DVertexDeclaration9 **ppDecl) override; HRESULT SetVertexDeclaration(IDirect3DVertexDeclaration9 *pDecl) override; - HRESULT CreatePixelShader(CONST uint32_t *pFunction, IDirect3DPixelShader9 **ppShader) override; - HRESULT CreateVertexShader(CONST uint32_t *pFunction, IDirect3DVertexShader9 **ppShader) override; + HRESULT CreatePixelShader(const uint32_t *pFunction, IDirect3DPixelShader9 **ppShader) override; + HRESULT CreateVertexShader(const uint32_t *pFunction, IDirect3DVertexShader9 **ppShader) override; HRESULT DeletePixelShader(IDirect3DPixelShader9 *pShader) override; HRESULT DeleteVertexShader(IDirect3DVertexShader9 *pShader) override; HRESULT SetVertexShader(IDirect3DVertexShader9 *pShader) override; HRESULT SetPixelShader(IDirect3DPixelShader9 *pShader) override; - /*virtual HRESULT SetFVFConstant(DWORD Register, CONST void* pConstantData, DWORD ConstantCount );*/ - HRESULT SetVertexShaderConstantF(UINT StartRegister, CONST float *pConstantData, UINT Vector4iCount) override; - HRESULT SetPixelShaderConstantF(UINT StartRegister, CONST float *pConstantData, UINT Vector4iCount) override; + /*virtual HRESULT SetFVFConstant(DWORD Register, const void* pConstantData, DWORD ConstantCount );*/ + HRESULT SetVertexShaderConstantF(UINT StartRegister, const float *pConstantData, UINT Vector4iCount) override; + HRESULT SetPixelShaderConstantF(UINT StartRegister, const float *pConstantData, UINT Vector4iCount) override; HRESULT SetFVF(uint32_t handle) override; HRESULT GetVertexShader(IDirect3DVertexShader9 **ppShader) override; HRESULT GetPixelShader(IDirect3DPixelShader9 **ppShader) override; @@ -316,7 +316,7 @@ class DX9RENDER : public VDX9RENDER // D3D Render Target/Begin/End/Clear HRESULT GetRenderTarget(IDirect3DSurface9 **ppRenderTarget) override; HRESULT SetRenderTarget(IDirect3DSurface9 *pRenderTarget, IDirect3DSurface9 *pNewZStencil) override; - HRESULT Clear(uint32_t Count, CONST D3DRECT *pRects, uint32_t Flags, D3DCOLOR Color, float Z, + HRESULT Clear(uint32_t Count, const D3DRECT *pRects, uint32_t Flags, D3DCOLOR Color, float Z, uint32_t Stencil) override; HRESULT BeginScene() override; HRESULT EndScene() override; @@ -488,6 +488,8 @@ class DX9RENDER : public VDX9RENDER bool bShowFps, bShowExInfo; bool bInsideScene; + int32_t fpsx, fpsy; + PLANE viewplane[4]; STEXTURE Textures[MAX_STEXTURES]{}; diff --git a/src/libs/renderer/src/storm_d3dx9.cpp b/src/libs/renderer/src/storm_d3dx9.cpp index 71d35a876..5ed9bdb54 100644 --- a/src/libs/renderer/src/storm_d3dx9.cpp +++ b/src/libs/renderer/src/storm_d3dx9.cpp @@ -2,6 +2,8 @@ #include "platform/d3dx9.hpp" +#include +#include // for memcpy #include #define WARN(...) fprintf(stdout, __VA_ARGS__) diff --git a/src/libs/rigging/src/sail.cpp b/src/libs/rigging/src/sail.cpp index 062e4897b..bfac76bb4 100644 --- a/src/libs/rigging/src/sail.cpp +++ b/src/libs/rigging/src/sail.cpp @@ -2084,13 +2084,16 @@ void sailPrint(VDX9RENDER *rs, const CVECTOR &pos3D, float rad, int32_t line, co static_cast(vrt.y), buf); } -SAILONE *SAIL::FindSailFromData(int gn, const std::string_view &nodeName, const std::string_view &grName) const +SAILONE *SAIL::FindSailFromData(int gn, const char *nodeName, const char *grName) const { - int grNum = std::stoi(std::string(grName)); + if (nodeName == nullptr || grName == nullptr) + return nullptr; + int grNum; + sscanf(grName, "%d", &grNum); for (int i = 0; i < gdata[gn].sailQuantity; i++) { const int sn = gdata[gn].sailIdx[i]; - if (slist[sn]->hostNode != nullptr && nodeName.compare(slist[sn]->hostNode->GetName()) == 0 && + if (slist[sn]->hostNode != nullptr && strcmp(slist[sn]->hostNode->GetName(), nodeName) == 0 && slist[sn]->groupNum == grNum) return slist[sn]; } diff --git a/src/libs/rigging/src/sail.h b/src/libs/rigging/src/sail.h index 05d3e5aa5..a500ff93d 100644 --- a/src/libs/rigging/src/sail.h +++ b/src/libs/rigging/src/sail.h @@ -187,7 +187,7 @@ class SAIL : public SAIL_BASE void DeleteSailGroup(); int FindGroupForCharacter(int chrIdx) const; int GetCharacterForGroup(int grNum) const; - SAILONE *FindSailFromData(int gn, const std::string_view &nodeName, const std::string_view &grName) const; + SAILONE *FindSailFromData(int gn, const char *nodeName, const char *grName) const; void SetSailTextures(int32_t grNum, VDATA *pvd) const; void DoRandomsSailsDmg(int chrIdx, int gn, float fDmg); void GetSailStatus(int chrIdx, int gn); diff --git a/src/libs/sea_ai/src/ai_balls.cpp b/src/libs/sea_ai/src/ai_balls.cpp index 837b1c2ea..cc88df422 100644 --- a/src/libs/sea_ai/src/ai_balls.cpp +++ b/src/libs/sea_ai/src/ai_balls.cpp @@ -3,12 +3,11 @@ #include "math_inlines.h" #include "shared/messages.h" - AIBalls *AIBalls::pAIBalls = nullptr; AIBalls::AIBalls() - : pSail(nullptr), pSea(nullptr), pFort(nullptr), pIsland(nullptr), - fDeltaTimeMultiplier(1.0f), fBallFlySoundDistance(1.0f), dwFireBallFromCameraTime(0) + : pSail(nullptr), pSea(nullptr), pFort(nullptr), pIsland(nullptr), fDeltaTimeMultiplier(1.0f), + fBallFlySoundDistance(1.0f), dwFireBallFromCameraTime(0) { pAIBalls = this; } @@ -141,10 +140,11 @@ void AIBalls::AddBall(ATTRIBUTES *pABall) const auto fDir = pABall->GetAttributeAsFloat("Dir"); pBall->fDirX = cosf(fDir); pBall->fDirZ = sinf(fDir); + pBall->fRawAng = pABall->GetAttributeAsFloat("RawAng"); pBall->pParticle = nullptr; pBall->sBallEvent = to_string(pABall->GetAttribute("Event")); - + if (aBallTypes[i].sParticleName.size()) { entid_t eidParticle; @@ -198,10 +198,21 @@ void AIBalls::Execute(uint32_t Delta_Time) pBall->fTime += fDeltaTime * fDeltaTimeMultiplier * pBall->fTimeSpeedMultiply; // update positions float fsX = pBall->fSpeedV0 * pBall->fTime * pBall->fCosAngle; - float fsY = pBall->fHeightMultiply * (pBall->fSpeedV0 * pBall->fTime * pBall->fSinAngle - - AIHelper::fGravity * SQR(pBall->fTime) / 2.0f); - pBall->vPos = CVECTOR(0.0f, fsY, fsX); + float fsY = + (pBall->fSpeedV0 * pBall->fTime * pBall->fSinAngle - AIHelper::fGravity * SQR(pBall->fTime) / 2.0f); + + // HeightMultiply + float fCosRaw = cosf(pBall->fRawAng); + float fSinRaw = sinf(pBall->fRawAng); + float fProjX = fsX * fCosRaw + fsY * fSinRaw; + float fProjY = -fsX * fSinRaw + fsY * fCosRaw; + fProjY *= pBall->fHeightMultiply; + float fX = fProjX * fCosRaw - fProjY * fSinRaw; + float fY = fProjX * fSinRaw + fProjY * fCosRaw; + + pBall->vPos = CVECTOR(0.0f, fY, fX); RotateAroundY(pBall->vPos.x, pBall->vPos.z, pBall->fDirX, pBall->fDirZ); + pBall->vPos += pBall->vFirstPos; vDst = pBall->vPos; @@ -240,7 +251,7 @@ void AIBalls::Execute(uint32_t Delta_Time) // sail trace if (pSail) pSail->Cannon_Trace(pBall->iBallOwner, vSrc, vDst); - + auto &&entities = core.GetEntityIds(SHIP_CANNON_TRACE); for (auto ent_id : entities) { @@ -375,18 +386,17 @@ uint32_t AIBalls::AttributeChanged(ATTRIBUTES *pAttributeChanged) // install balls ATTRIBUTES *pAPBalls = AttributesPointer->GetAttributeClass("Balls"); uint32_t dwIdx = 0; - while (pAPBalls != nullptr) + while (pAPBalls && true) { - if (dwIdx >= pAPBalls->GetAttributesNum()) { + const char *pName = pAPBalls->GetAttributeName(dwIdx); + if (!pName) break; - } - const std::string_view attr_name = pAPBalls->GetAttributeName(dwIdx); - ATTRIBUTES *pAP = pAPBalls->GetAttributeClass(attr_name); + ATTRIBUTES *pAP = pAPBalls->GetAttributeClass(pName); if (!pAP) break; BALL_TYPE ballType; - ballType.sName = attr_name; + ballType.sName = pName; ballType.dwSubTexIndex = pAP->GetAttributeAsDword("SubTexIndex"); ballType.dwGoodIndex = pAP->GetAttributeAsDword("GoodIndex"); ballType.fSize = pAP->GetAttributeAsFloat("Size"); @@ -441,6 +451,7 @@ void BALL_PARAMS::Save(CSaveLoad *pSL) pSL->SaveFloat(fSizeMultiply); pSL->SaveFloat(fTimeSpeedMultiply); pSL->SaveFloat(fMaxFireDistance); + pSL->SaveFloat(fRawAng); pSL->SaveDword(dwCannonType); } @@ -461,7 +472,7 @@ void BALL_PARAMS::Load(CSaveLoad *pSL) { vFirstPos = pSL->LoadVector(); vPos = pSL->LoadVector(); - //pParticle = reinterpret_cast(pSL->LoadDword()); + // pParticle = reinterpret_cast(pSL->LoadDword()); pParticle = reinterpret_cast(pSL->LoadQword()); sBallEvent = pSL->LoadString(); iBallOwner = pSL->LoadLong(); @@ -475,6 +486,7 @@ void BALL_PARAMS::Load(CSaveLoad *pSL) fSizeMultiply = pSL->LoadFloat(); fTimeSpeedMultiply = pSL->LoadFloat(); fMaxFireDistance = pSL->LoadFloat(); + fRawAng = pSL->LoadFloat(); dwCannonType = pSL->LoadDword(); } diff --git a/src/libs/sea_ai/src/ai_balls.h b/src/libs/sea_ai/src/ai_balls.h index d7e76afb2..aceadb77f 100644 --- a/src/libs/sea_ai/src/ai_balls.h +++ b/src/libs/sea_ai/src/ai_balls.h @@ -24,6 +24,7 @@ struct BALL_PARAMS float fSizeMultiply; // Size of ball multiply float fTimeSpeedMultiply; // Time speed multiply float fMaxFireDistance; + float fRawAng; uint32_t dwCannonType; // Additional parameter }; diff --git a/src/libs/sea_ai/src/ai_cannon.cpp b/src/libs/sea_ai/src/ai_cannon.cpp index 3f10b2bf4..643f784d8 100644 --- a/src/libs/sea_ai/src/ai_cannon.cpp +++ b/src/libs/sea_ai/src/ai_cannon.cpp @@ -4,8 +4,7 @@ uint64_t dwTmpRDTSC; -AICannon::AICannon() - : pAHolder(nullptr), eidParent(0), vPos(), vDir(), fSpeedV0(0), vEnemyPos() +AICannon::AICannon() : pAHolder(nullptr), eidParent(0), vPos(), vDir(), fSpeedV0(0), vEnemyPos() { bLoad = false; bEmpty = true; @@ -125,8 +124,15 @@ void AICannon::RealFire() const auto vDirTemp = mRot * vDir; const auto fDirY = NormalizeAngle(atan2f(vDirTemp.x, vDirTemp.z)); - core.Event(CANNON_FIRE, "affffffff", pAHolder->GetACharacter(), vPosTemp.x, vPosTemp.y, vPosTemp.z, fSpeedV0, - fFireDirection, fFireHeightAngle, fDirY, fMaxFireDistance); + + // raw angle + const CVECTOR vFlatEnemyDir = !(CVECTOR(vEnemyPos.x, vPosTemp.y, vEnemyPos.z) - vPosTemp); + float fAngle = acosf(vFlatEnemyDir | vEnemyDir); + if (vEnemyPos.y < vPosTemp.y) + fAngle = -fAngle; + + core.Event(CANNON_FIRE, "afffffffff", pAHolder->GetACharacter(), vPosTemp.x, vPosTemp.y, vPosTemp.z, fSpeedV0, + fFireDirection, fFireHeightAngle, fDirY, fMaxFireDistance, fAngle); pAIObj->Fire(*pAIObj->GetMatrix() * (vPos + vDir)); diff --git a/src/libs/sea_ai/src/ai_ship_cannon_controller.cpp b/src/libs/sea_ai/src/ai_ship_cannon_controller.cpp index dc92b39df..e31956d4e 100644 --- a/src/libs/sea_ai/src/ai_ship_cannon_controller.cpp +++ b/src/libs/sea_ai/src/ai_ship_cannon_controller.cpp @@ -7,6 +7,9 @@ float AIShipCannonController::fMaxCannonDamageDistance = 1.0f; float AIShipCannonController::fMaxCannonDamageRadiusPoint = 1.0f; +int AIShipCannonController::ColorA = 0; +int AIShipCannonController::ColorR = 0; + AIShipCannonController::AIShipCannonController(AIShip *_pShip) : bReload(false), bNotEnoughBalls(false) { SetAIShip(_pShip); @@ -561,11 +564,8 @@ void AIShipCannonController::Realize(float fDeltaTime) std::this_thread::sleep_for(100ms); } - if (!debugDrawToggle) + if (debugDrawToggle) { - return; - } - for (auto it = debugFirePositions.begin(); it != debugFirePositions.end();) { constexpr auto kDebugFadeTime = 3.0f; @@ -630,6 +630,7 @@ void AIShipCannonController::Realize(float fDeltaTime) } AIHelper::pRS->Print(200, 20, buf.c_str()); } + } struct tr_vertex { @@ -646,6 +647,8 @@ void AIShipCannonController::Realize(float fDeltaTime) const CVECTOR vPosTemp = GetAIShip()->GetPos(); for (const auto &bort : aShipBorts) { + if(!GetAIShip()->isMainCharacter() && !debugDrawToggle) continue; + if(bort.isBortDamaged()) continue; if (!bort.aCannons.empty()) { // calc fire range @@ -672,10 +675,11 @@ void AIShipCannonController::Realize(float fDeltaTime) RotateAroundY(v[2].x, v[2].z, vZ.z, vZ.x); v[2] += v[0]; - constexpr auto color = ARGB(0x0F, 0x90, 0xEE, 0x90); - Verts.emplace_back(tr_vertex{v[0], color}); - Verts.emplace_back(tr_vertex{v[1], color}); - Verts.emplace_back(tr_vertex{v[2], color}); + if(debugDrawToggle) ColorA = ColorR = ARGB(0x0F, 0x90, 0xEE, 0x90); + + Verts.emplace_back(tr_vertex{v[0], static_cast(ColorA)}); + Verts.emplace_back(tr_vertex{v[1], static_cast(ColorR)}); + Verts.emplace_back(tr_vertex{v[2], static_cast(ColorR)}); } } } diff --git a/src/libs/sea_ai/src/ai_ship_cannon_controller.h b/src/libs/sea_ai/src/ai_ship_cannon_controller.h index 468151caf..bb9f432c7 100644 --- a/src/libs/sea_ai/src/ai_ship_cannon_controller.h +++ b/src/libs/sea_ai/src/ai_ship_cannon_controller.h @@ -151,6 +151,8 @@ class AIShipCannonController static float fMaxCannonDamageDistance; static float fMaxCannonDamageRadiusPoint; + static int ColorA, ColorR; + void Save(CSaveLoad *pSL); void Load(CSaveLoad *pSL); }; \ No newline at end of file diff --git a/src/libs/sea_ai/src/locator_show.cpp b/src/libs/sea_ai/src/locator_show.cpp index 49affe211..7e6788208 100644 --- a/src/libs/sea_ai/src/locator_show.cpp +++ b/src/libs/sea_ai/src/locator_show.cpp @@ -44,15 +44,20 @@ CVECTOR SeaLocatorShow::GetLocatorPos(ATTRIBUTES *pA) return v; } -std::string_view SeaLocatorShow::GetLocatorName(ATTRIBUTES *pA) +const char *SeaLocatorShow::GetRealLocatorName(ATTRIBUTES *pA) +{ + return pA->GetThisName(); +} + +const char *SeaLocatorShow::GetLocatorName(ATTRIBUTES *pA) { const char *pName = pA->GetAttribute("name"); if (!pName) - return pA->GetThisName(); + pName = pA->GetThisName(); return pName; } -std::string_view SeaLocatorShow::GetLocatorGroupName(ATTRIBUTES *pA) +const char *SeaLocatorShow::GetLocatorGroupName(ATTRIBUTES *pA) { auto *const pAParent = pA->GetParent(); Assert(pAParent); @@ -100,11 +105,12 @@ void SeaLocatorShow::PrintLocator(ATTRIBUTES *pA) mtx.Projection(&vPos, &vrt, 1, fWidth, fHeight, sizeof(CVECTOR), sizeof(MTX_PRJ_VECTOR)); vPos = CVECTOR(vrt.x, vrt.y, vrt.z); - const auto pGName = std::string(GetLocatorGroupName(pA)); - const auto pName = std::string(GetLocatorName(pA)); + const char *pName, *pGName; - AIHelper::Print(vPos.x, vPos.y - fh * 0.8f, fScale, "grp: \"%s\"", pGName.c_str()); - AIHelper::Print(vPos.x, vPos.y, fScale, "loc: \"%s\"", pName.c_str()); + if (pGName = GetLocatorGroupName(pA)) + AIHelper::Print(vPos.x, vPos.y - fh * 0.8f, fScale, "grp: \"%s\"", pGName); + if (pName = GetLocatorName(pA)) + AIHelper::Print(vPos.x, vPos.y, fScale, "loc: \"%s\"", pName); auto fRadius = GetLocatorRadius(pA); AIHelper::Print(vPos.x, vPos.y + fh * 0.8f, fScale, "rad: %.2f", fRadius); if (fRadius > 0.0f) diff --git a/src/libs/sea_ai/src/locator_show.h b/src/libs/sea_ai/src/locator_show.h index 45aa382c5..003b868d1 100644 --- a/src/libs/sea_ai/src/locator_show.h +++ b/src/libs/sea_ai/src/locator_show.h @@ -26,8 +26,9 @@ class SeaLocatorShow : public Entity CVECTOR GetLocatorPos(ATTRIBUTES *pA); float GetLocatorAng(ATTRIBUTES *pA); float GetLocatorRadius(ATTRIBUTES *pA); - std::string_view GetLocatorName(ATTRIBUTES *pA); - std::string_view GetLocatorGroupName(ATTRIBUTES *pA); + const char *GetRealLocatorName(ATTRIBUTES *pA); + const char *GetLocatorName(ATTRIBUTES *pA); + const char *GetLocatorGroupName(ATTRIBUTES *pA); void PrintLocator(ATTRIBUTES *pA); void ProcessLocators(ATTRIBUTES *pA); diff --git a/src/libs/sea_ai/src/sea_ai.cpp b/src/libs/sea_ai/src/sea_ai.cpp index fc76860bc..b547b8d95 100644 --- a/src/libs/sea_ai/src/sea_ai.cpp +++ b/src/libs/sea_ai/src/sea_ai.cpp @@ -338,6 +338,11 @@ uint64_t SEA_AI::ProcessMessage(MESSAGE &message) Assert(pAIShip); pAIShip->GetCannonController()->ResearchCannons(); } + break; + + case AI_MESSAGE_CANNONS_RANGE: + AIShipCannonController::ColorA = message.Long(); + AIShipCannonController::ColorR = message.Long(); break; // boal 08.08.06 method of recounting guns on the ship <-- case AI_MESSAGE_SEASAVE: //TODO: check these two diff --git a/src/libs/sea_foam/src/seafoam.cpp b/src/libs/sea_foam/src/seafoam.cpp index 34ebb0bbd..e92f7c3c0 100644 --- a/src/libs/sea_foam/src/seafoam.cpp +++ b/src/libs/sea_foam/src/seafoam.cpp @@ -561,7 +561,7 @@ void SEAFOAM::Execute(uint32_t dTime) //-------------------------------------------------------------------- uint32_t SEAFOAM::AttributeChanged(ATTRIBUTES *pA) { - const std::string_view nm = pA->GetThisName(); + const auto *const nm = pA->GetThisName(); if (storm::iEquals(nm, "storm")) { diff --git a/src/libs/sea_foam/src/t_carcass.cpp b/src/libs/sea_foam/src/t_carcass.cpp index 310588703..90e738a80 100644 --- a/src/libs/sea_foam/src/t_carcass.cpp +++ b/src/libs/sea_foam/src/t_carcass.cpp @@ -20,7 +20,7 @@ TCarcass::TCarcass(int _levelsCount, int _measurePointsCount, VDX9RENDER *_rende uSpeed = 15e-5f; iBuffer = renderer->CreateIndexBuffer(3 * 2 * (MEASURE_POINTS - 1) * (TRACE_STEPS_Z - 1) * sizeof(uint16_t)); vBuffer = renderer->CreateVertexBuffer( - CARCASS_VERTEX_FORMAT, MEASURE_POINTS * (TRACE_STEPS_Z + 1) * sizeof(tCarcassVertex), D3DUSAGE_WRITEONLY); + CARCASS_VERTEX_FORMAT, MEASURE_POINTS * (TRACE_STEPS_Z + 1) * sizeof(tCarcassVertex), 0, D3DPOOL_MANAGED); } //-------------------------------------------------------------------- diff --git a/src/libs/shared_headers/include/shared/events.h b/src/libs/shared_headers/include/shared/events.h index 274f2a3e6..d4959f20b 100644 --- a/src/libs/shared_headers/include/shared/events.h +++ b/src/libs/shared_headers/include/shared/events.h @@ -19,4 +19,12 @@ // crosshair #define TELESCOPE_ACTIVE "TelescopeActive" +// Worldmap +#define WORLDMAP_ENCOUNTER_TYPE_UNKNOWN 0 +#define WORLDMAP_ENCOUNTER_TYPE_MERCHANT 1 +#define WORLDMAP_ENCOUNTER_TYPE_WARRING 2 +#define WORLDMAP_ENCOUNTER_TYPE_FOLLOW 3 +#define WORLDMAP_ENCOUNTER_TYPE_STORM 4 +#define WORLDMAP_ENCOUNTER_TYPE_INVALID 2147483647 // INT32_MAX = 0x7fffffff + #endif diff --git a/src/libs/shared_headers/include/shared/messages.h b/src/libs/shared_headers/include/shared/messages.h index 52b7b7140..b437f334a 100644 --- a/src/libs/shared_headers/include/shared/messages.h +++ b/src/libs/shared_headers/include/shared/messages.h @@ -99,6 +99,7 @@ #define MSG_LOCATION_MODEL_LAMPS 30113 // "l" add the current model to the ignore list for tracing rays from lamps // "lf" set the effect of generating the matrix for reflection, f is the scaling factor #define MSG_LOCATION_MODEL_REFLECTION 30114 +#define MSG_LOCATION_MODEL_SET_ROT_ANGLE 30115 // "lfff" set the base rotation angle of the last loaded model // Install patches #define MSG_LOCATION_SET_CHRS_PATCH 30120 // "ls" load the character patch #define MSG_LOCATION_SET_CAM_PATCH 30121 // "ls" load camera patch @@ -247,6 +248,8 @@ #define MSG_WORLDMAP_SET_NATION_FLAG 31150 // "ll" nation // Print line with coordinates #define MSG_WORLDMAP_SET_COORDINATES 31151 // "ls" coordinates string +// Show or hide WdmWindUI: wind, date, moral, supplies, coordinates, flag +#define MSG_WORLDMAP_WIND_UI_SET_SHOW 31152 // "l" // ============================================================================================ // Effects diff --git a/src/libs/shared_headers/include/shared/sea_ai/script_defines.h b/src/libs/shared_headers/include/shared/sea_ai/script_defines.h index 05eca325a..482073aa2 100644 --- a/src/libs/shared_headers/include/shared/sea_ai/script_defines.h +++ b/src/libs/shared_headers/include/shared/sea_ai/script_defines.h @@ -169,6 +169,8 @@ #define AI_MESSAGE_SEALOAD 51043 #define AI_MESSAGE_FORT_SET_LIGHTS 51044 #define AI_MESSAGE_FORT_UNSET_LIGHTS 51045 +// cannons range +#define AI_MESSAGE_CANNONS_RANGE 51046 // the method of recounting the guns on the ship SendMessage(&AISea, "la", AI_MESSAGE_RESEARCH_CANNONS, aCharacter) #define AI_MESSAGE_RESEARCH_CANNONS 51050 diff --git a/src/libs/sound_service/src/sound_service.cpp b/src/libs/sound_service/src/sound_service.cpp index 624338c3f..426484fd8 100644 --- a/src/libs/sound_service/src/sound_service.cpp +++ b/src/libs/sound_service/src/sound_service.cpp @@ -2,10 +2,10 @@ #include -#include "entity.h" #include "matrix.h" #include "rands.h" #include "v_file_service.h" +#include "vma.hpp" #include // for debugging @@ -270,29 +270,9 @@ bool SoundService::AllocateSound(TSD_ID &id) return true; } -const char *SoundService::GetRandomName(tAlias *_alias) const +const char *SoundService::GetRandomName(const tAlias *alias) const { - const auto randomFloat = rand(_alias->fMaxProbabilityValue); - auto currentNameIndex = 0; - auto currentFloat = 0.f; - - for (;;) - { - if (currentFloat > randomFloat) - break; - if ((currentNameIndex + 1) >= static_cast(_alias->SoundFiles.size())) - break; - - currentFloat += _alias->SoundFiles[currentNameIndex].fProbability; - currentNameIndex++; - } - - if (currentNameIndex >= static_cast(_alias->SoundFiles.size())) - { - currentNameIndex = static_cast(_alias->SoundFiles.size()) - 1; - } - - return _alias->SoundFiles[currentNameIndex].FileName.c_str(); + return alias->soundFiles.pickRandom().c_str(); } int SoundService::GetAliasIndexByName(const char *szAliasName) @@ -325,7 +305,7 @@ TSD_ID SoundService::SoundPlay(const char *_name, eSoundType _type, eVolumeType { // Trying to find in aliases const auto AliasIdx = GetAliasIndexByName(_name); - if (AliasIdx >= 0 && Aliases[AliasIdx].SoundFiles.size() > 0) + if (AliasIdx >= 0 && !Aliases[AliasIdx].soundFiles.empty()) { // play sound from the alias ... FileName = GetRandomName(&Aliases[AliasIdx]); @@ -1031,39 +1011,28 @@ void SoundService::SoundStop(TSD_ID _id, int32_t _time) void SoundService::AnalyseNameStringAndAddToAlias(tAlias *_alias, const char *in_string) const { - static char tempString2[COMMON_STRING_LENGTH]; - strncpy_s(tempString2, in_string, COMMON_STRING_LENGTH); + static char fileName[COMMON_STRING_LENGTH]; + strncpy_s(fileName, in_string, COMMON_STRING_LENGTH); - tAliasSound snd; + float probability = DEFAULT_PROBABILITY; - char *col = strchr(tempString2, ','); - if (!col) + char *col = strchr(fileName, ','); + if (col) { - // only name, without delays - _alias->fMaxProbabilityValue += DEFAULT_PROBABILITY; - snd.fProbability = DEFAULT_PROBABILITY; - snd.FileName = tempString2; - - if constexpr (TRACE_INFORMATION) - core.Trace(" -> sound %s", snd.FileName.c_str()); - _alias->SoundFiles.push_back(snd); - - return; - } + // try to convert forthcoming number + float flt; + if (sscanf(++col, "%f", &flt) == 1) + { + probability = flt; + } - // try to convert forthcoming number - float n1; - if (sscanf(++col, "%f", &n1) == 1) - { - snd.fProbability = n1; - _alias->fMaxProbabilityValue += n1; + *(--col) = '\0'; // truncate at first ',' } - *(--col) = 0; // truncate at first ',' - snd.FileName = tempString2; if constexpr (TRACE_INFORMATION) - core.Trace(" -> sound %s, %f", snd.FileName.c_str(), snd.fProbability); - _alias->SoundFiles.push_back(snd); + core.Trace(" -> sound %s, %f", fileName, probability); + + _alias->soundFiles.emplace(probability, fileName); } void SoundService::AddAlias(INIFILE &_iniFile, char *_sectionName) @@ -1082,7 +1051,6 @@ void SoundService::AddAlias(INIFILE &_iniFile, char *_sectionName) alias.fMinDistance = _iniFile.GetFloat(_sectionName, "minDistance", -1.0f); alias.fVolume = _iniFile.GetFloat(_sectionName, "volume", -1.0f); alias.iPrior = _iniFile.GetInt(_sectionName, "prior", 128); - alias.fMaxProbabilityValue = 0.0f; if (_iniFile.ReadString(_sectionName, "name", tempString, COMMON_STRING_LENGTH, "")) { diff --git a/src/libs/sound_service/src/sound_service.h b/src/libs/sound_service/src/sound_service.h index 0be77861a..dd428ef26 100644 --- a/src/libs/sound_service/src/sound_service.h +++ b/src/libs/sound_service/src/sound_service.h @@ -1,14 +1,15 @@ #pragma once +#include +#include + #include "c_vector.h" #include "dx9render.h" +#include "probability_table.hpp" #include "sound_defines.h" #include "v_sound_service.h" -#include "vma.hpp" -#include -#include -#include +#include #define MAX_SOUNDS_SLOTS 4095 @@ -107,23 +108,16 @@ class SoundService : public VSoundService void CreateEntityIfNeed(); // Aliases ------------------------------------------------------------ - struct tAliasSound - { - std::string FileName; - float fProbability; - }; - struct tAlias { std::string Name; uint32_t dwNameHash; - - float fMaxProbabilityValue; + float fMinDistance; float fMaxDistance; int32_t iPrior; float fVolume; - std::vector SoundFiles; + storm::ProbabilityTable soundFiles; tAlias() { @@ -132,7 +126,7 @@ class SoundService : public VSoundService std::vector Aliases; - const char *GetRandomName(tAlias *_alias) const; + const char *GetRandomName(const tAlias *alias) const; int GetAliasIndexByName(const char *szAliasName); void AnalyseNameStringAndAddToAlias(tAlias *_alias, const char *in_string) const; void AddAlias(INIFILE &_iniFile, char *_sectionName); diff --git a/src/libs/util/include/fs.h b/src/libs/util/include/fs.h index da3ba3e70..45940c327 100644 --- a/src/libs/util/include/fs.h +++ b/src/libs/util/include/fs.h @@ -22,11 +22,11 @@ inline path GetStashPath() wchar_t *str = nullptr; SHGetKnownFolderPath(FOLDERID_Documents, KF_FLAG_SIMPLE_IDLIST, nullptr, &str); path = str; - path = path / "My Games" / "Sea Dogs"; + path = path / "My Games" / "Caribbean Legend"; CoTaskMemFree(str); #else char *pref_path = nullptr; - pref_path = SDL_GetPrefPath("Akella", "Sea Dogs"); + pref_path = SDL_GetPrefPath("BlackMark Studio", "Carribean Legend"); path = pref_path; #endif } diff --git a/src/libs/util/include/probability_table.hpp b/src/libs/util/include/probability_table.hpp new file mode 100644 index 000000000..b23194b48 --- /dev/null +++ b/src/libs/util/include/probability_table.hpp @@ -0,0 +1,69 @@ +#include +#include +#include +#include +#include +#include + +#include "rands.h" + +namespace storm +{ + +template struct RandCstd +{ + Type operator()(Type max) noexcept + { + return rand(max); + } +}; + +template struct EpsilonLessThan +{ + bool operator()(Type lhs, Type rhs) + { + return rhs - lhs > std::numeric_limits::epsilon(); + } +}; + +/** + * \brief Probability table quantizing generated random value according to its weight + * \tparam Type - containing type + * \tparam Resolution - resolution type + * \tparam RandProvider - functor returning 0..1 + */ +template > + requires std::is_floating_point_v +class ProbabilityTable +{ + using element = std::pair; + + public: + ProbabilityTable() = default; + + template void emplace(Resolution weight, Args &&...args) + { + weight_sum_ += weight; + table_.emplace_back(std::make_pair(weight_sum_, std::forward(args)...)); + } + + const Type &pickRandom() const + { + + const Resolution random_value = provider_(weight_sum_ - weight_sum_ * std::numeric_limits::epsilon()); + const auto it = std::ranges::upper_bound(table_, random_value, EpsilonLessThan{}, &element::first); + return it->second; + } + + bool empty() const + { + return table_.empty(); + } + + private: + mutable RandProvider provider_; + Resolution weight_sum_{0.0f}; + std::vector table_; +}; + +} // namespace storm \ No newline at end of file diff --git a/src/libs/util/include/rands.h b/src/libs/util/include/rands.h index db224816e..66e8ab06f 100644 --- a/src/libs/util/include/rands.h +++ b/src/libs/util/include/rands.h @@ -1,13 +1,11 @@ #pragma once -#include -#include +#include // returns random float inline float rand(float r) { - std::random_device rd; - return r * ((float)rd() / (float)UINT_MAX); + return r * ((float)rand() / (float)RAND_MAX); } // returns larger half of random float @@ -22,4 +20,4 @@ inline float randCentered(float r) { float half = r / 2.0f; return (rand(r) - half); -} +} \ No newline at end of file diff --git a/src/libs/util/include/utf8.h b/src/libs/util/include/utf8.h index a1719723e..84ff498c6 100644 --- a/src/libs/util/include/utf8.h +++ b/src/libs/util/include/utf8.h @@ -4,7 +4,9 @@ #include #include +#ifdef _WIN32 // for WideCharToMultiByte / MultiByteToWideChar #include +#endif namespace utf8 { diff --git a/src/libs/util/testsuite/probability_table.cpp b/src/libs/util/testsuite/probability_table.cpp new file mode 100644 index 000000000..cc5daa7c4 --- /dev/null +++ b/src/libs/util/testsuite/probability_table.cpp @@ -0,0 +1,128 @@ +#include "probability_table.hpp" + +#include + +using namespace storm; + +TEST_CASE("EpsilonLessThan", "[utils]") +{ + using Compare = EpsilonLessThan; + + constexpr auto eps = std::numeric_limits::epsilon(); + + SECTION("Less") + { + CHECK(Compare{}(0.0f, 1.0f)); + CHECK(Compare{}(1.0f - 2 * eps, 1.0f)); + CHECK(Compare{}(-1.0f, 0.0f)); + } + + SECTION("EqualOrGreater") + { + CHECK_FALSE(Compare{}(1.0f, 1.0f)); + CHECK_FALSE(Compare{}(1.5f, 1.0f)); + CHECK_FALSE(Compare{}(1.0f + eps, 1.0f)); + } +} + +template class RandProviderMock +{ + public: + T operator()(T max) + { + if (ret_max_) + { + return max; + } + return ret_; + } + + static void ret(T val) + { + ret_ = val; + } + + static void ret_max(bool val) + { + ret_max_ = val; + } + + private: + static inline bool ret_max_{false}; + static inline T ret_{}; +}; + +TEST_CASE("ProbabilityTable", "[utils]") +{ + using ProviderMock = RandProviderMock; + + ProbabilityTable table_; + table_.emplace(1.0f, 0); // 1.0 + table_.emplace(1.0f, 1); // 2.0 + table_.emplace(0.8f, 2); // 2.8 + table_.emplace(0.7f, 3); // 3.5 + table_.emplace(0.5f, 4); // 4.0 + + SECTION("0") + { + ProviderMock::ret_max(false); + ProviderMock::ret(0.0f); + CHECK(table_.pickRandom() == 0); + ProviderMock::ret(0.5f); + CHECK(table_.pickRandom() == 0); + ProviderMock::ret(0.99f); + CHECK(table_.pickRandom() == 0); + } + + SECTION("1") + { + ProviderMock::ret_max(false); + ProviderMock::ret(1.0f); + CHECK(table_.pickRandom() == 1); + ProviderMock::ret(1.5f); + CHECK(table_.pickRandom() == 1); + ProviderMock::ret(1.99f); + CHECK(table_.pickRandom() == 1); + } + + SECTION("2") + { + ProviderMock::ret_max(false); + ProviderMock::ret(2.0f); + CHECK(table_.pickRandom() == 2); + ProviderMock::ret(2.5f); + CHECK(table_.pickRandom() == 2); + ProviderMock::ret(2.79f); + CHECK(table_.pickRandom() == 2); + } + + SECTION("3") + { + ProviderMock::ret_max(false); + ProviderMock::ret(2.88f); + CHECK(table_.pickRandom() == 3); + ProviderMock::ret(3.0f); + CHECK(table_.pickRandom() == 3); + ProviderMock::ret(3.49f); + CHECK(table_.pickRandom() == 3); + } + + SECTION("4") + { + ProviderMock::ret_max(false); + ProviderMock::ret(3.5f); + CHECK(table_.pickRandom() == 4); + ProviderMock::ret(3.9f); + CHECK(table_.pickRandom() == 4); + ProviderMock::ret_max(true); + CHECK(table_.pickRandom() == 4); + } + + SECTION("5") + { + auto extended = table_; + extended.emplace(10000000.0f, 5); + ProviderMock::ret_max(true); + CHECK(extended.pickRandom() == 5); + } +} diff --git a/src/libs/weather/src/planets.cpp b/src/libs/weather/src/planets.cpp index 5827f83cd..f0d97c158 100644 --- a/src/libs/weather/src/planets.cpp +++ b/src/libs/weather/src/planets.cpp @@ -47,7 +47,7 @@ void Astronomy::PLANETS::Init(ATTRIBUTES *pAP) auto *pAPlanet = pAPlanets->GetAttributeClass(i); auto *pAMag = pAPlanet->GetAttributeClass("Mag"); - const auto sName = std::string(pAPlanet->GetThisName()); + std::string sName = pAPlanet->GetThisName(); aPlanets.push_back(Planet{}); // Planet & p = aPlanets[aPlanets.Add()]; diff --git a/src/libs/weather/src/sky.cpp b/src/libs/weather/src/sky.cpp index 71b486760..e2bf9ff53 100644 --- a/src/libs/weather/src/sky.cpp +++ b/src/libs/weather/src/sky.cpp @@ -519,10 +519,10 @@ void SKY::FillSkyDirArray(ATTRIBUTES *pAttribute) { for (int32_t n = 0; n < q; n++) { - const auto attrName = std::string(pAttribute->GetAttributeName(n)); - if (attrName.length() >= 2 && attrName[0] == 'd' && attrName[1] >= '0' && attrName[1] <= '9') + const auto *const attrName = pAttribute->GetAttributeName(n); + if (attrName && attrName[0] == 'd' && attrName[1] >= '0' && attrName[1] <= '9') { - const auto i = atol(attrName.c_str() + 1); + const auto i = atol(&attrName[1]); if (i < q) aSkyDirArray[i] = to_string(pAttribute->GetAttribute(n)); } diff --git a/src/libs/worldmap/src/wdm_enemy_ship.cpp b/src/libs/worldmap/src/wdm_enemy_ship.cpp index 0e9a22d69..75ca521f7 100644 --- a/src/libs/worldmap/src/wdm_enemy_ship.cpp +++ b/src/libs/worldmap/src/wdm_enemy_ship.cpp @@ -108,13 +108,13 @@ void WdmEnemyShip::Update(float dltTime) slowingAlfa = deleteAlpha; if (deleteAlpha < 0.0f) { - std::string delEnc = ""; + const auto *delEnc = ""; if (saveAttribute) { delEnc = saveAttribute->GetThisName(); } VDATA *pVDat = nullptr; - if (!killMe && delEnc.length() >= 1 && delEnc[0]) + if (!killMe && delEnc && delEnc[0]) { pVDat = core.Event("WorldMap_EncounterDelete", "s", delEnc); } @@ -416,7 +416,7 @@ void WdmEnemyShip::SetLiveTime(float time) } // Get attribute name -std::string_view WdmEnemyShip::GetAttributeName() const +const char *WdmEnemyShip::GetAttributeName() const { if (saveAttribute) { diff --git a/src/libs/worldmap/src/wdm_enemy_ship.h b/src/libs/worldmap/src/wdm_enemy_ship.h index b55a93bbe..7967c8ab5 100644 --- a/src/libs/worldmap/src/wdm_enemy_ship.h +++ b/src/libs/worldmap/src/wdm_enemy_ship.h @@ -48,7 +48,7 @@ class WdmEnemyShip : public WdmShip bool canSkip; // Get attribute name - std::string_view GetAttributeName() const; + const char *GetAttributeName() const; protected: // Find the pulling force in the desired direction diff --git a/src/libs/worldmap/src/wdm_islands.cpp b/src/libs/worldmap/src/wdm_islands.cpp index cd6c9c85d..6ea542ab3 100644 --- a/src/libs/worldmap/src/wdm_islands.cpp +++ b/src/libs/worldmap/src/wdm_islands.cpp @@ -382,8 +382,7 @@ void WdmIslands::SetIslandsData(ATTRIBUTES *apnt, bool isChange) // Check for sufficiency if (!id || !text || !locator || !locator[0]) { - const std::string message = fmt::format("World map: label \"{}\" will be skipping...", apnt->GetAttributeName(i)); - core.Trace(message.c_str()); + core.Trace("World map: label \"%s\" will be skipping...", apnt->GetAttributeName(i)); continue; } // looking for a label among existing @@ -393,9 +392,8 @@ void WdmIslands::SetIslandsData(ATTRIBUTES *apnt, bool isChange) { if (!LabelsFindLocator(locator, pos)) { - - const std::string message = fmt::format("World map: locator \"{}\" in label \"{}\" not found...", locator, apnt->GetAttributeName(i)); - core.Trace(message.c_str()); + core.Trace("World map: locator \"%s\" in label \"%s\" not found...", locator, + apnt->GetAttributeName(i)); continue; } // Adding a new label @@ -464,6 +462,12 @@ void WdmIslands::SetIslandsData(ATTRIBUTES *apnt, bool isChange) labels[index].textX = 0.0f; labels[index].textY = 0.0f; } + + // Store locator position as label attribute + auto* position_attr = a->VerifyAttributeClass("position"); + position_attr->SetAttributeUseFloat("x", pos.x); + position_attr->SetAttributeUseFloat("y", pos.y); + position_attr->SetAttributeUseFloat("z", pos.z); } } diff --git a/src/libs/worldmap/src/wdm_objects.cpp b/src/libs/worldmap/src/wdm_objects.cpp index 29180184c..f5a1b6a15 100644 --- a/src/libs/worldmap/src/wdm_objects.cpp +++ b/src/libs/worldmap/src/wdm_objects.cpp @@ -39,6 +39,7 @@ WdmObjects::WdmObjects() islands = nullptr; playerShip = nullptr; isDebug = false; + showWindUI = true; Clear(); enemyShip = nullptr; enableSkipEnemy = false; diff --git a/src/libs/worldmap/src/wdm_objects.h b/src/libs/worldmap/src/wdm_objects.h index 312098374..dcd7bd566 100644 --- a/src/libs/worldmap/src/wdm_objects.h +++ b/src/libs/worldmap/src/wdm_objects.h @@ -99,6 +99,7 @@ class WdmObjects bool isPause; bool isDebug; + bool showWindUI; void DrawCircle(const CVECTOR &pos, float radius, uint32_t color) const; void DrawCircle(CMatrix &mtx, float radius, uint32_t color) const; diff --git a/src/libs/worldmap/src/wdm_player_ship.cpp b/src/libs/worldmap/src/wdm_player_ship.cpp index 8992a9501..980d61c86 100644 --- a/src/libs/worldmap/src/wdm_player_ship.cpp +++ b/src/libs/worldmap/src/wdm_player_ship.cpp @@ -13,6 +13,7 @@ #include "core.h" #include "math_inlines.h" +#include "shared/events.h" #include "wdm_enemy_ship.h" #include "wdm_islands.h" #include "wdm_storm.h" @@ -208,19 +209,19 @@ void WdmPlayerShip::Update(float dltTime) switch (wdmObjects->enemyShip->shipType) { case wdmest_unknow: - wdmObjects->wm->AttributesPointer->SetAttributeUseDword("encounter_type", 0); + wdmObjects->wm->AttributesPointer->SetAttributeUseDword("encounter_type", WORLDMAP_ENCOUNTER_TYPE_UNKNOWN); break; case wdmest_merchant: - wdmObjects->wm->AttributesPointer->SetAttributeUseDword("encounter_type", 1); + wdmObjects->wm->AttributesPointer->SetAttributeUseDword("encounter_type", WORLDMAP_ENCOUNTER_TYPE_MERCHANT); break; case wdmest_warring: - wdmObjects->wm->AttributesPointer->SetAttributeUseDword("encounter_type", 2); + wdmObjects->wm->AttributesPointer->SetAttributeUseDword("encounter_type", WORLDMAP_ENCOUNTER_TYPE_WARRING); break; case wdmest_follow: - wdmObjects->wm->AttributesPointer->SetAttributeUseDword("encounter_type", 3); + wdmObjects->wm->AttributesPointer->SetAttributeUseDword("encounter_type", WORLDMAP_ENCOUNTER_TYPE_FOLLOW); break; default: - wdmObjects->wm->AttributesPointer->SetAttributeUseDword("encounter_type", -1); + wdmObjects->wm->AttributesPointer->SetAttributeUseDword("encounter_type", WORLDMAP_ENCOUNTER_TYPE_INVALID); } } else @@ -228,11 +229,11 @@ void WdmPlayerShip::Update(float dltTime) // mark hitting the storm if (wdmObjects->playarInStorm) { - wdmObjects->wm->AttributesPointer->SetAttributeUseDword("encounter_type", 4); + wdmObjects->wm->AttributesPointer->SetAttributeUseDword("encounter_type", WORLDMAP_ENCOUNTER_TYPE_STORM); } else { - wdmObjects->wm->AttributesPointer->SetAttributeUseDword("encounter_type", -1); + wdmObjects->wm->AttributesPointer->SetAttributeUseDword("encounter_type", WORLDMAP_ENCOUNTER_TYPE_INVALID); } } if (nOldIslandVal != wdmObjects->wm->AttributesPointer->GetAttributeAsDword("encounter_island", 0) || diff --git a/src/libs/worldmap/src/wdm_storm.cpp b/src/libs/worldmap/src/wdm_storm.cpp index ac2acb7f5..9f16f17da 100644 --- a/src/libs/worldmap/src/wdm_storm.cpp +++ b/src/libs/worldmap/src/wdm_storm.cpp @@ -379,7 +379,7 @@ void WdmStorm::UpdateSaveData() saveAttribute->SetAttribute("year", wdmObjects->attrYear); } -std::string_view WdmStorm::GetId() const +const char *WdmStorm::GetId() const { if (saveAttribute) { diff --git a/src/libs/worldmap/src/wdm_storm.h b/src/libs/worldmap/src/wdm_storm.h index e88a5f975..d2559d648 100644 --- a/src/libs/worldmap/src/wdm_storm.h +++ b/src/libs/worldmap/src/wdm_storm.h @@ -35,7 +35,7 @@ class WdmStorm : public WdmRenderObject void Update(float dltTime) override; void LRender(VDX9RENDER *rs) override; - std::string_view GetId() const; + const char *GetId() const; public: // Setting parameters diff --git a/src/libs/worldmap/src/wdm_wind_ui.cpp b/src/libs/worldmap/src/wdm_wind_ui.cpp index 9cd0a58e4..3d99d8f1e 100644 --- a/src/libs/worldmap/src/wdm_wind_ui.cpp +++ b/src/libs/worldmap/src/wdm_wind_ui.cpp @@ -352,6 +352,9 @@ void WdmWindUI::SetAttributes(ATTRIBUTES *apnt) // Rendering void WdmWindUI::LRender(VDX9RENDER *rs) { + if (!wdmObjects->showWindUI) + return; + if (wdmObjects->isNextDayUpdate) { auto *data = core.Event("WorldMap_GetMoral"); diff --git a/src/libs/worldmap/src/wdm_wind_ui.h b/src/libs/worldmap/src/wdm_wind_ui.h index 8ff846b30..4678a6f1b 100644 --- a/src/libs/worldmap/src/wdm_wind_ui.h +++ b/src/libs/worldmap/src/wdm_wind_ui.h @@ -11,7 +11,7 @@ #pragma once #include "wdm_interface_object.h" -#include "utils.h" +#include "bi_utils.h" #include diff --git a/src/libs/worldmap/src/world_map.cpp b/src/libs/worldmap/src/world_map.cpp index 7694a98d3..1becc87fc 100644 --- a/src/libs/worldmap/src/world_map.cpp +++ b/src/libs/worldmap/src/world_map.cpp @@ -604,6 +604,9 @@ uint64_t WorldMap::ProcessMessage(MESSAGE &message) case MSG_WORLDMAP_SET_COORDINATES: wdmObjects->coordinate = message.String(); break; + case MSG_WORLDMAP_WIND_UI_SET_SHOW: + wdmObjects->showWindUI = (message.Long() != 0); + break; } return 0; } @@ -683,7 +686,7 @@ uint32_t WorldMap::AttributeChanged(ATTRIBUTES *apnt) sprintf_s(buf, "%i", es->type); pa->SetAttribute("type", buf); pa->SetAttributeUseDword("select", es->isSelect); - pa->SetAttribute("id", static_cast(wdmObjects->ships[i])->GetAttributeName()); + pa->SetAttribute("id", (char *)static_cast(wdmObjects->ships[i])->GetAttributeName()); // If there is an attacker, get his index if (es->attack) { diff --git a/src/libs/xinterface/src/editor/editor_defines.cpp b/src/libs/xinterface/src/editor/editor_defines.cpp index 363e25768..02c5e5840 100644 --- a/src/libs/xinterface/src/editor/editor_defines.cpp +++ b/src/libs/xinterface/src/editor/editor_defines.cpp @@ -1,5 +1,7 @@ #include "editor_defines.h" +#include + void GIEditorObject::LinkEvent(GIEditorEventHandler *pEventHandler, const GIEditorEvent &pEventFunction) { pEventHandler->AddEventFunction(this, pEventFunction); diff --git a/src/libs/xinterface/src/info_handler.cpp b/src/libs/xinterface/src/info_handler.cpp index ef7b6434e..4e0597cce 100644 --- a/src/libs/xinterface/src/info_handler.cpp +++ b/src/libs/xinterface/src/info_handler.cpp @@ -4,6 +4,9 @@ #include "vma.hpp" +int32_t InfoHandler::numberOfTips = 0; +int32_t InfoHandler::currentTips = -1; + InfoHandler::InfoHandler() : m_rs(nullptr), tex(nullptr) { } @@ -140,6 +143,7 @@ bool InfoHandler::DoPreOut() const char *picTexureFile = AttributesPointer->GetAttribute("picfilename"); const char *picBackTexureFile = AttributesPointer->GetAttribute("picbackfilename"); + bool isTips = AttributesPointer ? AttributesPointer->GetAttributeAsDword("tips", 0) : 0; const uint32_t TMP_VERTEX_FORMAT = (D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1 | D3DFVF_TEXTUREFORMAT2); struct TMP_VERTEX { @@ -228,8 +232,9 @@ bool InfoHandler::DoPreOut() pV[2].tv = 0.f; pV[3].tu = 1.f; pV[3].tv = 1.f; + m_rs->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, TMP_VERTEX_FORMAT, 2, &pV, sizeof(TMP_VERTEX), - "iInfoShowerPic"); + "Fader"); m_rs->TextureRelease(picBackID); m_rs->SetProgressBackImage(picBackTexureFile); } @@ -247,7 +252,7 @@ bool InfoHandler::DoPreOut() dx = 0.0f; else { - dy = 25.0f; + dy = float(desc.Height) * 0.025f; dx = ((float(desc.Width) - (4.0f * (float(desc.Height) - 2.0f * dy) / 3.0f)) / 2.0f); } @@ -269,21 +274,82 @@ bool InfoHandler::DoPreOut() pV[3].tu = 1.f; pV[3].tv = 1.f; - char _name[MAX_PATH]; - sprintf(_name, "interfaces\\int_border.tga"); - int tipsID = m_rs->TextureCreate(_name); - if (tipsID) - { - m_rs->SetTipsImage(_name); - m_rs->TextureSet(1, tipsID); - } - m_rs->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, TMP_VERTEX_FORMAT, 2, &pV, sizeof(TMP_VERTEX), - "iInfoShowerPicWithTips"); + "Fader"); + m_rs->TextureRelease(picID); m_rs->SetProgressImage(picTexureFile); } } + + if (isTips) + { + // read the number of tips, if necessary + if (!numberOfTips) + { + auto ini = fio->OpenIniFile(core.EngineIniFileName()); + if (ini) + { + numberOfTips = ini->GetInt(nullptr, "numoftips", -1); + } + else + numberOfTips = -1; + if (numberOfTips > 9999) + numberOfTips = 9999; + } + + if (numberOfTips > 0) + { + char tipsTexureFile[MAX_PATH]; + sprintf_s(tipsTexureFile, "tips\\tips_%.4u.tga", rand() % numberOfTips); + const int tipsID = m_rs->TextureCreate(tipsTexureFile); + + if (tipsID >= 0) + { + m_rs->TextureSet(0, tipsID); + + float dy = 0.0f; + float dx = 0.0f; + float dxx = 0.0f; + + if (((float)desc.Width - (4.0f * (float)desc.Height / 3.0f)) / 2.0f >= 10.0f) + { + dy = 0.025f * (float)desc.Height; + dx = ((float)desc.Width - (4.0f * ((float)desc.Height - 2.0f * dy) / 3.0f)) / 2.0f; + } + dxx = ((float)desc.Width - 2.0 * dx) * 0.125f; + + pV[0].col = pV[1].col = pV[2].col = pV[3].col = 0xFFFFFFFF; + + pV[0].pos.x = 0.0f + dx + dxx; + pV[0].pos.y = 0.0f + 0.787f * (float)desc.Height; + + pV[1].pos.x = (float)desc.Width - dx - dxx; + pV[1].pos.y = 0.0f + 0.787f * (float)desc.Height; + + pV[2].pos.x = 0.0f + dx + dxx; + pV[2].pos.y = (float)desc.Height - 0.094f * (float)desc.Height; + + pV[3].pos.x = (float)desc.Width - dx - dxx; + pV[3].pos.y = (float)desc.Height - 0.094f * (float)desc.Height; + + pV[0].tu = 0.f; + pV[0].tv = 0.f; + pV[1].tu = 1.f; + pV[1].tv = 0.f; + pV[2].tu = 0.f; + pV[2].tv = 1.f; + pV[3].tu = 1.f; + pV[3].tv = 1.f; + + m_rs->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, TMP_VERTEX_FORMAT, 2, &pV, sizeof(TMP_VERTEX), + "Fader"); + m_rs->TextureRelease(tipsID); + m_rs->SetTipsImage(tipsTexureFile); + } + } + + } if (inStrStart) { diff --git a/src/libs/xinterface/src/info_handler.h b/src/libs/xinterface/src/info_handler.h index cace4edff..e0699c756 100644 --- a/src/libs/xinterface/src/info_handler.h +++ b/src/libs/xinterface/src/info_handler.h @@ -13,6 +13,9 @@ class InfoHandler : public Entity void Execute(uint32_t delta_time); void Realize(uint32_t delta_time) const; uint64_t ProcessMessage(MESSAGE &message) override; + + static int32_t numberOfTips; + static int32_t currentTips; void ProcessStage(Stage stage, uint32_t delta) override { diff --git a/src/libs/xinterface/src/nodes/xi_quest_texts.cpp b/src/libs/xinterface/src/nodes/xi_quest_texts.cpp index 65bf61629..1fa9ab192 100644 --- a/src/libs/xinterface/src/nodes/xi_quest_texts.cpp +++ b/src/libs/xinterface/src/nodes/xi_quest_texts.cpp @@ -343,6 +343,9 @@ void CXI_QUESTTEXTS::StartQuestShow(ATTRIBUTES *pA, int qn) const auto cFlag = pAttr->GetAttributeAsDword("Complete", 0) != 0; auto *pATextList = pAttr->GetAttributeClass("Text"); + const char *questLogName = pAttr->GetAttribute("LogName"); + if (!questLogName) + questLogName = pAttr->GetThisName(); std::vector asStringList; if (ptrOwner->QuestFileReader() && pATextList) @@ -436,6 +439,15 @@ uint32_t CXI_QUESTTEXTS::MessageProc(int32_t msgcode, MESSAGE &message) return 0; } break; + + case 2: // set the font id + { + FONT_RELEASE(m_rs, m_idFont); + const std::string &fontName = message.String(); + m_idFont = m_rs->LoadFont(fontName.c_str()); + return 0; + } + break; } return -1; } diff --git a/src/libs/xinterface/src/nodes/xi_quest_titles.cpp b/src/libs/xinterface/src/nodes/xi_quest_titles.cpp index a6a5af902..f0685e8d5 100644 --- a/src/libs/xinterface/src/nodes/xi_quest_titles.cpp +++ b/src/libs/xinterface/src/nodes/xi_quest_titles.cpp @@ -367,10 +367,10 @@ void CXI_QUESTTITLE::SetNewTopQuest(ATTRIBUTES *pA, int topNum) } m_strList[i].dwSpecColor = pAttr->GetAttributeAsDword("color", 0); m_strList[i].complete = pAttr->GetAttributeAsDword("Complete", 0) != 0; - const char *pTmpQuestRecordID = pAttr->GetAttribute("LogName"); - std::string_view quest_record_id = pTmpQuestRecordID ? pTmpQuestRecordID : pAttr->GetThisName(); - if (ptrOwner->QuestFileReader()->GetQuestTitle(quest_record_id, pAttr->GetThisName(), param)) + if (!pTmpQuestRecordID) + pTmpQuestRecordID = pAttr->GetThisName(); + if (ptrOwner->QuestFileReader()->GetQuestTitle(pTmpQuestRecordID, pAttr->GetThisName(), param)) { const size_t titleSize = param.size(); if (titleSize == 0) @@ -412,6 +412,19 @@ void CXI_QUESTTITLE::ScrollerChanged(float fPos) { } +uint32_t CXI_QUESTTITLE::MessageProc(int32_t msgcode, MESSAGE &message) +{ + switch (msgcode) + { + case 0: + FONT_RELEASE(m_rs, m_idFont); + const std::string &fontName = message.String(); + m_idFont = m_rs->LoadFont(fontName.c_str()); + return 0; + } + return -1; +} + void CXI_QUESTTITLE::MouseThis(float fX, float fY) { const float left = static_cast(m_rect.left) - m_selectOffset; diff --git a/src/libs/xinterface/src/nodes/xi_quest_titles.h b/src/libs/xinterface/src/nodes/xi_quest_titles.h index 1fcd88799..61551fc2b 100644 --- a/src/libs/xinterface/src/nodes/xi_quest_titles.h +++ b/src/libs/xinterface/src/nodes/xi_quest_titles.h @@ -21,6 +21,7 @@ class CXI_QUESTTITLE : public CINODE void SaveParametersToIni() override; void SetNewTopQuest(ATTRIBUTES *pA, int topNum); + uint32_t MessageProc(int32_t msgcode, MESSAGE &message) override; float GetLineStep() const; void ScrollerChanged(float fPos); diff --git a/src/libs/xinterface/src/nodes/xi_text_button.cpp b/src/libs/xinterface/src/nodes/xi_text_button.cpp index 1fd52832d..52192cf6a 100644 --- a/src/libs/xinterface/src/nodes/xi_text_button.cpp +++ b/src/libs/xinterface/src/nodes/xi_text_button.cpp @@ -584,7 +584,6 @@ bool CXI_TEXTBUTTON::IsClick(int buttonID, int32_t xPos, int32_t yPos) void CXI_TEXTBUTTON::ChangePosition(XYRECT &rNewPos) { m_rect = rNewPos; - GetAbsoluteRect(m_rect, m_nAbsoluteRectVal); FillPositionIntoVertices(); } diff --git a/src/libs/xinterface/src/storm/xinterface/options_parser.cpp b/src/libs/xinterface/src/storm/xinterface/options_parser.cpp index b59c9a635..1829eeaf8 100644 --- a/src/libs/xinterface/src/storm/xinterface/options_parser.cpp +++ b/src/libs/xinterface/src/storm/xinterface/options_parser.cpp @@ -1,5 +1,7 @@ #include "options_parser.hpp" +#include + namespace storm { diff --git a/src/libs/xinterface/src/string_service.h b/src/libs/xinterface/src/string_service.h index 11d46b4ac..871119545 100644 --- a/src/libs/xinterface/src/string_service.h +++ b/src/libs/xinterface/src/string_service.h @@ -15,7 +15,7 @@ class VSTRSERVICE : public SERVICE virtual void SetLanguage(const char *sLanguage) = 0; virtual char *GetLanguage() = 0; - virtual char *GetString(const char *stringName, char *sBuffer = nullptr, size_t bufferSize = 0) = 0; + virtual char *GetString(const char *stringName, char *sBuffer = nullptr, std::size_t bufferSize = 0) = 0; virtual int32_t GetStringNum(const char *stringName) = 0; virtual char *GetString(int32_t strNum) = 0; virtual char *GetStringName(int32_t strNum) = 0; diff --git a/src/libs/xinterface/src/string_service/str_service.h b/src/libs/xinterface/src/string_service/str_service.h index eb1f9b66a..479adb990 100644 --- a/src/libs/xinterface/src/string_service/str_service.h +++ b/src/libs/xinterface/src/string_service/str_service.h @@ -33,7 +33,7 @@ class STRSERVICE : public VSTRSERVICE void SetLanguage(const char *sLanguage) override; char *GetLanguage() override; - char *GetString(const char *stringName, char *sBuffer = nullptr, size_t bufferSize = 0) override; + char *GetString(const char *stringName, char *sBuffer = nullptr, std::size_t bufferSize = 0) override; int32_t GetStringNum(const char *stringName) override; char *GetString(int32_t strNum) override; char *GetStringName(int32_t strNum) override; diff --git a/src/libs/xinterface/src/xinterface.cpp b/src/libs/xinterface/src/xinterface.cpp index 5f253d086..9b82018fd 100644 --- a/src/libs/xinterface/src/xinterface.cpp +++ b/src/libs/xinterface/src/xinterface.cpp @@ -2634,10 +2634,12 @@ uint32_t XINTERFACE::AttributeChanged(ATTRIBUTES *patr) { if (patr != nullptr && patr->GetParent() != nullptr && patr->GetParent()->GetParent() != nullptr) { - const std::string_view sParentName = patr->GetParent()->GetParent()->GetThisName(); - if (!storm::iEquals(sParentName, "pictures")) + const char *sParentName = patr->GetParent()->GetParent()->GetThisName(); + if (sParentName == nullptr || !storm::iEquals(sParentName, "pictures")) + return 0; + const char *sImageName = patr->GetParent()->GetThisName(); + if (sImageName == nullptr) return 0; - const std::string_view sImageName = patr->GetParent()->GetThisName(); // find this picture IMAGE_Entity *pImList = m_imgLists; while (pImList != nullptr) @@ -2655,17 +2657,18 @@ uint32_t XINTERFACE::AttributeChanged(ATTRIBUTES *patr) throw std::runtime_error("Allocation memory error"); } *pImList = {}; - const auto len = sImageName.length() + 1; + const auto len = strlen(sImageName) + 1; if ((pImList->sImageName = new char[len]) == nullptr) { throw std::runtime_error("Allocate memory error"); } - std::copy(std::begin(sImageName), std::end(sImageName), pImList->sImageName); - pImList->sImageName[len - 1] = '\0'; + memcpy(pImList->sImageName, sImageName, len); // insert that into images list pImList->next = m_imgLists; m_imgLists = pImList; } + if (patr->GetThisName() == nullptr) + return 0; // set picture if (storm::iEquals(patr->GetThisName(), "pic")) { @@ -3169,9 +3172,11 @@ void XINTERFACE::IncrementGameTime(uint32_t dwDeltaTime) core.Event("ievent_SetGameTime", "lll", m_dwGameTimeHour, m_dwGameTimeMin, m_dwGameTimeSec); } -std::string AddAttributesStringsToBuffer(ATTRIBUTES *pAttr, std::optional inBuffer = {}, std::optional prev_str = {}) +char *AddAttributesStringsToBuffer(char *inBuffer, char *prevStr, ATTRIBUTES *pAttr) { - std::string new_buffer = std::string(inBuffer.value_or("")); + size_t prevLen = 0; + if (prevStr != nullptr) + prevLen = strlen(prevStr) + std::size(".") - 1; const int q = pAttr->GetAttributesNum(); for (int k = 0; k < q; k++) @@ -3180,37 +3185,52 @@ std::string AddAttributesStringsToBuffer(ATTRIBUTES *pAttr, std::optionalGetThisAttr()); - const auto attrName = std::string(pA->GetThisName()); - - if (attrVal.length() >= 1 && attrVal[0]) + const char *attrVal = pA->GetThisAttr(); + const char *attrName = pA->GetThisName(); + if (attrName && attrVal && attrVal[0]) { - if (!new_buffer.empty()) { - new_buffer += "\n"; + int nadd = std::size("\n") - 1 + strlen(attrName) + std::size("=") - 1 + strlen(attrVal) + 1; + nadd += prevLen; + if (inBuffer != nullptr) + nadd += strlen(inBuffer); + + auto pNew = new char[nadd]; + if (pNew == nullptr) + continue; + pNew[0] = 0; + + if (inBuffer) + { + strcat_s(pNew, nadd, inBuffer); + strcat_s(pNew, nadd, "\n"); } - if (prev_str.has_value()) { - new_buffer += prev_str.value(); - new_buffer += "."; + if (prevStr) + { + strcat_s(pNew, nadd, prevStr); + strcat_s(pNew, nadd, "."); } - new_buffer += attrName; - new_buffer += "="; - new_buffer += attrVal; + strcat_s(pNew, nadd, attrName); + strcat_s(pNew, nadd, "="); + strcat_s(pNew, nadd, attrVal); + + delete inBuffer; + inBuffer = pNew; } if (pA->GetAttributesNum() != 0) { - std::string new_prev_str; - if (prev_str.has_value()) { - new_prev_str = fmt::format("{}.", prev_str.value()); - } - new_prev_str += pA->GetThisName(); - new_buffer = AddAttributesStringsToBuffer(pA, new_buffer.c_str(), new_prev_str); + char param[512]; + param[0] = 0; + if (prevStr) + sprintf_s(param, "%s.", prevStr); + strcat_s(param, pA->GetThisName()); + inBuffer = AddAttributesStringsToBuffer(inBuffer, param, pA); } } - return new_buffer; + return inBuffer; } void XINTERFACE::SaveOptionsFile(const char *fileName, ATTRIBUTES *pAttr) @@ -3224,19 +3244,25 @@ void XINTERFACE::SaveOptionsFile(const char *fileName, ATTRIBUTES *pAttr) strcpy_s(FullPath, fileName); PrecreateDirForFile(FullPath); + auto fileS = fio->_CreateFile(FullPath, std::ios::binary | std::ios::out); + if (!fileS.is_open()) + { + return; + } + + char *pOutBuffer = nullptr; if (pAttr) { - const std::string pOutBuffer = AddAttributesStringsToBuffer(pAttr); + pOutBuffer = AddAttributesStringsToBuffer(nullptr, nullptr, pAttr); + } - auto fileS = fio->_CreateFile(FullPath, std::ios::binary | std::ios::out); - if (!fileS.is_open()) - { - return; - } - fio->_WriteFile(fileS, pOutBuffer.c_str(), pOutBuffer.length()); - fio->_CloseFile(fileS); + if (pOutBuffer) + { + fio->_WriteFile(fileS, pOutBuffer, strlen(pOutBuffer)); + delete pOutBuffer; } + fio->_CloseFile(fileS); } void XINTERFACE::LoadOptionsFile(std::string_view fileName, ATTRIBUTES *pAttr) @@ -3525,14 +3551,16 @@ bool CONTROLS_CONTAINER::CreateConteinerList(ATTRIBUTES *pA) ATTRIBUTES *pAttr = pA->GetAttributeClass(i); if (!pAttr) continue; - const auto containerName = std::string(pAttr->GetThisName()); - AddContainer(containerName.c_str()); - SetContainerLimitVal(containerName.c_str(), static_cast(atof(pAttr->GetThisAttr()))); + const char *containerName = pAttr->GetThisName(); + if (!containerName) + continue; + AddContainer(containerName); + SetContainerLimitVal(containerName, static_cast(atof(pAttr->GetThisAttr()))); const int cntSize = pAttr->GetAttributesNum(); for (int n = 0; n < cntSize; n++) { - AddControlsToContainer(containerName.c_str(), pAttr->GetAttributeName(n), + AddControlsToContainer(containerName, pAttr->GetAttributeName(n), static_cast(atof(pAttr->GetAttribute(n)))); } } @@ -3572,9 +3600,9 @@ void CONTROLS_CONTAINER::SetContainerLimitVal(const char *container, float fLimi pCont->fMaxVal = fLimitVal; } -void CONTROLS_CONTAINER::AddControlsToContainer(const char *container, const std::string_view &controlName, float fValLimit) +void CONTROLS_CONTAINER::AddControlsToContainer(const char *container, const char *controlName, float fValLimit) { - if (!container) + if (!container || !controlName) return; CONTEINER_DESCR *pCont = FindContainer(container); @@ -3590,12 +3618,11 @@ void CONTROLS_CONTAINER::AddControlsToContainer(const char *container, const std pCont->pControls->fValLimit = fValLimit; pCont->pControls->next = pCtrl; - const auto len = controlName.length() + 1; + const auto len = strlen(controlName) + 1; pCont->pControls->controlName = new char[len]; if (!pCont->pControls->controlName) throw std::runtime_error("allocate memory error"); - std::copy(std::begin(controlName), std::end(controlName), pCont->pControls->controlName); - pCont->pControls->controlName[len - 1] = '\0'; + memcpy(pCont->pControls->controlName, controlName, len); } CONTROLS_CONTAINER::CONTEINER_DESCR *CONTROLS_CONTAINER::FindContainer(const char *sContainer) @@ -3610,8 +3637,10 @@ CONTROLS_CONTAINER::CONTEINER_DESCR *CONTROLS_CONTAINER::FindContainer(const cha } CONTROLS_CONTAINER::CONTEINER_DESCR::CONTROL_DESCR *CONTROLS_CONTAINER::CONTEINER_DESCR::FindControl( - const std::string_view &cntrlName) const + const char *cntrlName) { + if (!cntrlName) + return nullptr; CONTROL_DESCR *pCtrl = pControls; while (pCtrl) diff --git a/src/libs/xinterface/src/xinterface.h b/src/libs/xinterface/src/xinterface.h index ba43ef560..401464deb 100644 --- a/src/libs/xinterface/src/xinterface.h +++ b/src/libs/xinterface/src/xinterface.h @@ -411,7 +411,7 @@ class CONTROLS_CONTAINER : public Entity CONTEINER_DESCR *next; - CONTROL_DESCR *FindControl(const std::string_view &cntrlName) const; + CONTROL_DESCR *FindControl(const char *cntrlName); } * pContainers; public: @@ -441,7 +441,7 @@ class CONTROLS_CONTAINER : public Entity bool CreateConteinerList(ATTRIBUTES *pA); void AddContainer(const char *container); void SetContainerLimitVal(const char *container, float fLimitVal); - void AddControlsToContainer(const char *container, const std::string_view &controlName, float fValLimit); + void AddControlsToContainer(const char *container, const char *controlName, float fValLimit); CONTEINER_DESCR *FindContainer(const char *sContainer); }; diff --git a/src/libs/xinterface/testsuite/options_parser.cpp b/src/libs/xinterface/testsuite/options_parser.cpp index 31a3ada10..be090a40b 100644 --- a/src/libs/xinterface/testsuite/options_parser.cpp +++ b/src/libs/xinterface/testsuite/options_parser.cpp @@ -9,12 +9,12 @@ namespace class TestStringCodec : public VSTRING_CODEC { public: - uint32_t GetNum() const override + uint32_t GetNum() override { return map_.size(); } - uint32_t Convert(const std::string_view &pString) override + uint32_t Convert(const char *pString) override { std::string str(pString); const uint32_t hash = std::hash{}(str); @@ -22,9 +22,17 @@ class TestStringCodec : public VSTRING_CODEC return hash; } - [[nodiscard]] std::string_view Convert(uint32_t code) const override + uint32_t Convert(const char *pString, int32_t iLen) override { - return map_.at(code); + std::string str(pString, iLen); + const uint32_t hash = std::hash{}(str); + map_.emplace(hash, str); + return hash; + } + + const char *Convert(uint32_t code) override + { + return map_[code].c_str(); } void VariableChanged() override From a3adfe8348e6723209bce3b19a14448aa6da466f Mon Sep 17 00:00:00 2001 From: Eugeny Pliskovsky <67909922+ugeen4@users.noreply.github.com> Date: Sun, 15 Jan 2023 20:27:34 +0300 Subject: [PATCH 05/14] update some techniques for LE --- src/techniques/effects/maineffects.fx | 49 ++++++++++++++------- src/techniques/interfaces/game_interface.fx | 22 ++++++--- src/techniques/location/maineffects.fx | 23 ++++++++++ 3 files changed, 70 insertions(+), 24 deletions(-) diff --git a/src/techniques/effects/maineffects.fx b/src/techniques/effects/maineffects.fx index 6ec4a6b58..482af33ac 100644 --- a/src/techniques/effects/maineffects.fx +++ b/src/techniques/effects/maineffects.fx @@ -10,11 +10,10 @@ technique Fader AlphaBlendEnable = true; SrcBlend = srcalpha; DestBlend = invsrcalpha; - ColorArg1[0] = diffuse; - ColorArg2[0] = texture; - ColorOp[0] = modulate; + ColorArg1[0] = texture; + ColorOp[0] = selectarg1; ColorOp[1] = disable; - AlphaArg1[0] = diffuse; + AlphaArg1[0] = texture; AlphaOp[0] = SelectArg1; AlphaOp[1] = disable; } @@ -33,17 +32,18 @@ technique FaderWithTips AlphaBlendEnable = true; SrcBlend = srcalpha; DestBlend = invsrcalpha; - ColorArg1[0] = diffuse; - ColorArg2[0] = texture; - ColorOp[0] = modulate; + ColorVertex = true; + ColorArg1[0] = texture; + ColorOp[0] = selectarg1; ColorArg1[1] = texture; ColorArg2[1] = current; ColorOp[1] = blendtexturealpha; ColorOp[2] = disable; - AlphaArg1[0] = diffuse; - AlphaOp[0] = SelectArg1; - AlphaArg1[1] = current; - AlphaOp[1] = SelectArg1; + AlphaArg1[0] = texture; + AlphaOp[0] = SelectArg1; + AlphaArg1[1] = texture; + AlphaArg2[1] = current; + AlphaOp[1] = blendtexturealpha; AlphaOp[2] = disable; } } @@ -148,9 +148,11 @@ technique ProgressTech AlphaBlendEnable = true; SrcBlend = srcalpha; DestBlend = invsrcalpha; + ColorArg1[0] = texture; ColorOp[0] = SelectArg1; ColorOp[1] = disable; + AlphaArg1[0] = texture; AlphaOp[0] = SelectArg1; AlphaOp[1] = disable; @@ -166,11 +168,15 @@ technique ProgressBackTech ZEnable = false; CullMode = none; AlphaTestEnable = false; - AlphaBlendEnable = false; + AlphaBlendEnable = true; + SrcBlend = srcalpha; + DestBlend = invsrcalpha; ColorArg1[0] = texture; - ColorOp[0] = SelectArg1; + ColorOp[0] = selectarg1; ColorOp[1] = disable; - AlphaOp[0] = disable; + AlphaArg1[0] = texture; + AlphaOp[0] = SelectArg1; + AlphaOp[1] = disable; } } @@ -184,14 +190,23 @@ technique ProgressBackTechWithTips CullMode = none; TexCoordIndex[1] = 0; AlphaTestEnable = false; - AlphaBlendEnable = false; + AlphaBlendEnable = true; + SrcBlend = srcalpha; + DestBlend = invsrcalpha; + ColorVertex = true; + ColorArg1[0] = diffuse; ColorArg1[0] = texture; - ColorOp[0] = SelectArg1; + ColorOp[0] = selectarg1; ColorArg1[1] = texture; ColorArg2[1] = current; ColorOp[1] = blendtexturealpha; ColorOp[2] = disable; - AlphaOp[0] = disable; + AlphaArg1[0] = texture; + AlphaOp[0] = SelectArg1; + AlphaArg1[1] = texture; + AlphaArg2[1] = current; + AlphaOp[1] = blendtexturealpha; + AlphaOp[2] = disable; } } diff --git a/src/techniques/interfaces/game_interface.fx b/src/techniques/interfaces/game_interface.fx index 5f3c988cd..fc0c62a63 100644 --- a/src/techniques/interfaces/game_interface.fx +++ b/src/techniques/interfaces/game_interface.fx @@ -783,16 +783,24 @@ technique iInfoShowerPic AlphaTestEnable = false; AlphaBlendEnable = true; ZEnable = false; - ColorVertex = true; - - ColorOp[0] = selectarg1; +// ColorVertex = true; + ColorArg1[0] = texture; - + ColorOp[0] = selectarg1; +// ColorOp[0] = blendtexturealpha; + AlphaArg1[0] = current; AlphaOp[0] = SelectArg1; - AlphaArg1[0] = texture; - - ColorOp[1] = disable; AlphaOp[1] = disable; + ColorOp[2] = disable; + +// ColorOp[0] = selectarg1; +// ColorArg1[0] = texture; + +// AlphaOp[0] = SelectArg1; +// AlphaArg1[0] = texture; + +// ColorOp[1] = disable; +// AlphaOp[1] = disable; } } diff --git a/src/techniques/location/maineffects.fx b/src/techniques/location/maineffects.fx index 56bdd126a..68dbed0e8 100644 --- a/src/techniques/location/maineffects.fx +++ b/src/techniques/location/maineffects.fx @@ -215,6 +215,29 @@ technique LocationModelBlend } } +technique LocationModelBlendLighting +{ + pass p0 + { + Lighting = true; + FogEnable = true; + AlphaTestEnable = false; + AlphaBlendEnable = true; + SrcBlend = srcalpha; + DestBlend = invsrcalpha; + ZEnable = true; + ZWriteEnable = false; + ColorArg1[0] = texture; + ColorArg2[0] = diffuse; + ColorOp[0] = modulate2x; + ColorOp[1] = disable; + AlphaArg1[0] = texture; + AlphaArg2[0] = diffuse; + AlphaOp[0] = modulate; + AlphaOp[1] = disable; + } +} + technique ShootParticles { pass p0 From 6f8695fa2d2b3ac907b51b306a7be3a58a4509e4 Mon Sep 17 00:00:00 2001 From: Blackmark3000 Date: Mon, 30 Jan 2023 19:59:52 +0300 Subject: [PATCH 06/14] Unload board colorize --- .../sea_ai/src/ai_ship_cannon_controller.cpp | 145 +++++++++--------- .../sea_ai/src/ai_ship_cannon_controller.h | 3 +- src/libs/sea_ai/src/sea_ai.cpp | 3 + 3 files changed, 80 insertions(+), 71 deletions(-) diff --git a/src/libs/sea_ai/src/ai_ship_cannon_controller.cpp b/src/libs/sea_ai/src/ai_ship_cannon_controller.cpp index e31956d4e..d3823bca4 100644 --- a/src/libs/sea_ai/src/ai_ship_cannon_controller.cpp +++ b/src/libs/sea_ai/src/ai_ship_cannon_controller.cpp @@ -9,6 +9,9 @@ float AIShipCannonController::fMaxCannonDamageRadiusPoint = 1.0f; int AIShipCannonController::ColorA = 0; int AIShipCannonController::ColorR = 0; +int AIShipCannonController::ColorNA = 0; +int AIShipCannonController::ColorNR = 0; +bool AIShipCannonController::bShowCannonsRange = true; AIShipCannonController::AIShipCannonController(AIShip *_pShip) : bReload(false), bNotEnoughBalls(false) { @@ -563,75 +566,77 @@ void AIShipCannonController::Realize(float fDeltaTime) debugDrawToggle = !debugDrawToggle; std::this_thread::sleep_for(100ms); } - + + if(!bShowCannonsRange) return; + if (debugDrawToggle) { - for (auto it = debugFirePositions.begin(); it != debugFirePositions.end();) - { - constexpr auto kDebugFadeTime = 3.0f; - if (auto &[pos, color, dt] = *it; dt <= kDebugFadeTime) - { - dt += fDeltaTime; - - CVECTOR cPos; - CVECTOR cAng; - float cFov; - AIHelper::pRS->GetCamera(cPos, cAng, cFov); - - const auto dist = (pos - cPos).GetLength(); - - float radius = 0.3f; - if (dist > 1.0f) - { - radius *= sqrtf(dist); - } - AIHelper::pRS->DrawSphere(pos, radius, color); - ++it; - } - else - { - it = debugFirePositions.erase(it); - } - } - - static std::vector Lines; - Lines.clear(); - - for (const auto &bort : aShipBorts) - { - for (const auto &cannon : bort.aCannons) - { - if (!cannon.isDamaged()) - { - constexpr auto red = ARGB(0xFF, 0xDC, 0x14, 0x3C); - constexpr auto green = ARGB(0xFF, 0x7C, 0xFC, 0x00); - - const auto &&vPos = cannon.GetPos(); - Lines.emplace_back(RS_LINE{vPos, red}); - Lines.emplace_back(RS_LINE{vPos + 5.0f * cannon.GetDir(), red}); - Lines.emplace_back(RS_LINE{vPos, green}); - Lines.emplace_back(RS_LINE{vPos + CVECTOR{0.0f, cannon.GetDirY(), 0.0f}, green}); - } - } - } - - if (!Lines.empty()) - { - AIHelper::pRS->SetTransform(D3DTS_WORLD, CMatrix()); - AIHelper::pRS->DrawLines(Lines.data(), Lines.size() / 2, "Line"); - } - - if (GetAIShip()->isMainCharacter()) - { - std::string buf; - for (const auto &bort : aShipBorts) - { - buf += fmt::format("{:.3f} ", GetBortHeightAngle(bort)); - } - AIHelper::pRS->Print(200, 20, buf.c_str()); - } + for (auto it = debugFirePositions.begin(); it != debugFirePositions.end();) + { + constexpr auto kDebugFadeTime = 3.0f; + if (auto &[pos, color, dt] = *it; dt <= kDebugFadeTime) + { + dt += fDeltaTime; + + CVECTOR cPos; + CVECTOR cAng; + float cFov; + AIHelper::pRS->GetCamera(cPos, cAng, cFov); + + const auto dist = (pos - cPos).GetLength(); + + float radius = 0.3f; + if (dist > 1.0f) + { + radius *= sqrtf(dist); + } + AIHelper::pRS->DrawSphere(pos, radius, color); + ++it; + } + else + { + it = debugFirePositions.erase(it); + } + } + + static std::vector Lines; + Lines.clear(); + + for (const auto &bort : aShipBorts) + { + for (const auto &cannon : bort.aCannons) + { + if (!cannon.isDamaged()) + { + constexpr auto red = ARGB(0xFF, 0xDC, 0x14, 0x3C); + constexpr auto green = ARGB(0xFF, 0x7C, 0xFC, 0x00); + + const auto &&vPos = cannon.GetPos(); + Lines.emplace_back(RS_LINE{vPos, red}); + Lines.emplace_back(RS_LINE{vPos + 5.0f * cannon.GetDir(), red}); + Lines.emplace_back(RS_LINE{vPos, green}); + Lines.emplace_back(RS_LINE{vPos + CVECTOR{0.0f, cannon.GetDirY(), 0.0f}, green}); + } + } + } + + if (!Lines.empty()) + { + AIHelper::pRS->SetTransform(D3DTS_WORLD, CMatrix()); + AIHelper::pRS->DrawLines(Lines.data(), Lines.size() / 2, "Line"); + } + + if (GetAIShip()->isMainCharacter()) + { + std::string buf; + for (const auto &bort : aShipBorts) + { + buf += fmt::format("{:.3f} ", GetBortHeightAngle(bort)); + } + AIHelper::pRS->Print(200, 20, buf.c_str()); + } } - + struct tr_vertex { CVECTOR vPos; @@ -675,11 +680,11 @@ void AIShipCannonController::Realize(float fDeltaTime) RotateAroundY(v[2].x, v[2].z, vZ.z, vZ.x); v[2] += v[0]; - if(debugDrawToggle) ColorA = ColorR = ARGB(0x0F, 0x90, 0xEE, 0x90); + if(debugDrawToggle) ColorA = ColorR = ColorNA = ColorNR = ARGB(0x0F, 0x90, 0xEE, 0x90); - Verts.emplace_back(tr_vertex{v[0], static_cast(ColorA)}); - Verts.emplace_back(tr_vertex{v[1], static_cast(ColorR)}); - Verts.emplace_back(tr_vertex{v[2], static_cast(ColorR)}); + Verts.emplace_back(tr_vertex{v[0], bort.isCharged() ? static_cast(ColorA) : static_cast(ColorNA)}); + Verts.emplace_back(tr_vertex{v[1], bort.isCharged() ? static_cast(ColorR) : static_cast(ColorNR)}); + Verts.emplace_back(tr_vertex{v[2], bort.isCharged() ? static_cast(ColorR) : static_cast(ColorNR)}); } } } diff --git a/src/libs/sea_ai/src/ai_ship_cannon_controller.h b/src/libs/sea_ai/src/ai_ship_cannon_controller.h index bb9f432c7..48876ea39 100644 --- a/src/libs/sea_ai/src/ai_ship_cannon_controller.h +++ b/src/libs/sea_ai/src/ai_ship_cannon_controller.h @@ -151,7 +151,8 @@ class AIShipCannonController static float fMaxCannonDamageDistance; static float fMaxCannonDamageRadiusPoint; - static int ColorA, ColorR; + static int ColorA, ColorR, ColorNA, ColorNR; + static bool bShowCannonsRange; void Save(CSaveLoad *pSL); void Load(CSaveLoad *pSL); diff --git a/src/libs/sea_ai/src/sea_ai.cpp b/src/libs/sea_ai/src/sea_ai.cpp index b547b8d95..08acb18ff 100644 --- a/src/libs/sea_ai/src/sea_ai.cpp +++ b/src/libs/sea_ai/src/sea_ai.cpp @@ -343,6 +343,9 @@ uint64_t SEA_AI::ProcessMessage(MESSAGE &message) case AI_MESSAGE_CANNONS_RANGE: AIShipCannonController::ColorA = message.Long(); AIShipCannonController::ColorR = message.Long(); + AIShipCannonController::ColorNA = message.Long(); + AIShipCannonController::ColorNR = message.Long(); + AIShipCannonController::bShowCannonsRange = (message.Long() != 0); break; // boal 08.08.06 method of recounting guns on the ship <-- case AI_MESSAGE_SEASAVE: //TODO: check these two From 7087c093216646323b01ae6c22c0127c0cd52ea0 Mon Sep 17 00:00:00 2001 From: Blackmark3000 Date: Mon, 30 Jan 2023 20:07:51 +0300 Subject: [PATCH 07/14] New battle ship sign for LE inteface --- src/libs/battle_interface/include/bi_utils.h | 1 + src/libs/battle_interface/src/bi_utils.cpp | 17 ++ .../src/sea/battle_ship_sign.cpp | 262 +++++++++++++++--- .../src/sea/battle_ship_sign.h | 42 ++- 4 files changed, 284 insertions(+), 38 deletions(-) diff --git a/src/libs/battle_interface/include/bi_utils.h b/src/libs/battle_interface/include/bi_utils.h index 2b5c242ae..ec87f7e93 100644 --- a/src/libs/battle_interface/include/bi_utils.h +++ b/src/libs/battle_interface/include/bi_utils.h @@ -107,6 +107,7 @@ class BIUtils static bool GetIntervalRect(float fk, const FRECT &r1, const FRECT &r2, FRECT &rOut); static int32_t GetMaxFromFourLong(int32_t n1, int32_t n2, int32_t n3, int32_t n4); + static int32_t GetMaxFromSevenLong(int32_t n1, int32_t n2, int32_t n3, int32_t n4, int32_t n5, int32_t n6, int32_t n7); static float GetFromStr_Float(const char *&pcStr, float fDefault); diff --git a/src/libs/battle_interface/src/bi_utils.cpp b/src/libs/battle_interface/src/bi_utils.cpp index 2e1d32bf1..d41b9ab9a 100644 --- a/src/libs/battle_interface/src/bi_utils.cpp +++ b/src/libs/battle_interface/src/bi_utils.cpp @@ -245,6 +245,23 @@ int32_t BIUtils::GetMaxFromFourLong(int32_t n1, int32_t n2, int32_t n3, int32_t return n4; } +int32_t BIUtils::GetMaxFromSevenLong(int32_t n1, int32_t n2, int32_t n3, int32_t n4, int32_t n5, int32_t n6, int32_t n7) +{ + if (n1 >= n2 && n1 >= n3 && n1 >= n4 && n1 >= n5 && n1 >= n6 && n1 >= n7) + return n1; + if (n2 >= n3 && n2 >= n4 && n2 >= n5 && n2 >= n6 && n2 >= n7) + return n2; + if (n3 >= n4 && n3 >= n5 && n3 >= n6 && n3 >= n7) + return n3; + if (n4 >= n5 && n4 >= n6 && n4 >= n7) + return n4; + if (n5 >= n6 && n5 >= n7) + return n5; + if (n6 >= n7) + return n6; + return n7; +} + float BIUtils::GetFromStr_Float(const char *&pcStr, float fDefault) { if (!pcStr) diff --git a/src/libs/battle_interface/src/sea/battle_ship_sign.cpp b/src/libs/battle_interface/src/sea/battle_ship_sign.cpp index 58425e76e..427b3fbf0 100644 --- a/src/libs/battle_interface/src/sea/battle_ship_sign.cpp +++ b/src/libs/battle_interface/src/sea/battle_ship_sign.cpp @@ -17,11 +17,16 @@ BIShipIcon::BIShipIcon(entid_t BIEntityID, VDX9RENDER *pRS) m_nVBufID = -1; m_nIBufID = -1; + m_nBackMCTextureID = -1; m_nBackTextureID = -1; + m_nShipStateBackTextureID = -1; m_nShipTextureID = -1; m_nShipStateTextureID = -1; + m_nShipStateMCTextureID = -1; m_nShipClassTextureID = -1; m_nBackSquareQ = 0; + m_nShipStateBackSquareQ = 0; + m_nBackMCSquareQ = 0; m_nShipSquareQ = 0; m_nShipStateSquareQ = 0; m_nShipClassSquareQ = 0; @@ -73,8 +78,24 @@ void BIShipIcon::Draw() m_nShipSquareQ * 2, "battle_colorRectangle"); } nStartV += m_nShipSquareQ * 4; - + + if (m_nShipStateBackSquareQ > 0) + { + m_pRS->TextureSet(0, m_nShipStateBackTextureID); + m_pRS->DrawBuffer(m_nVBufID, sizeof(BI_COLOR_VERTEX), m_nIBufID, nStartV, m_nShipStateBackSquareQ * 4, nStartI, + m_nShipStateBackSquareQ * 2, "battle_colorRectangle"); + } + nStartV += m_nShipStateBackSquareQ * 4; + // back + if (m_nBackMCSquareQ > 0) + { + m_pRS->TextureSet(0, m_nBackMCTextureID); + m_pRS->DrawBuffer(m_nVBufID, sizeof(BI_COLOR_VERTEX), m_nIBufID, nStartV, m_nBackMCSquareQ * 4, nStartI, + m_nBackMCSquareQ * 2, "battle_colorRectangle"); + } + nStartV += m_nBackMCSquareQ * 4; + if (m_nBackSquareQ > 0) { m_pRS->TextureSet(0, m_nBackTextureID); @@ -82,10 +103,21 @@ void BIShipIcon::Draw() m_nBackSquareQ * 2, "battle_colorRectangle"); } nStartV += m_nBackSquareQ * 4; + + // ship state (hp & sp) - if (m_nShipStateSquareQ > 0) + if (m_nMCShipStateSquareQ > 0) { + // MC ship state (hp & sp) + + m_pRS->TextureSet(0, m_nShipStateMCTextureID); + m_pRS->DrawBuffer(m_nVBufID, sizeof(BI_COLOR_VERTEX), m_nIBufID, nStartV, m_nMCShipStateSquareQ * 4, nStartI, + m_nMCShipStateSquareQ * 2, "battle_colorRectangle"); + } + nStartV += m_nMCShipStateSquareQ * 4; + if (m_nShipStateSquareQ > 0) + { m_pRS->TextureSet(0, m_nShipStateTextureID); m_pRS->DrawBuffer(m_nVBufID, sizeof(BI_COLOR_VERTEX), m_nIBufID, nStartV, m_nShipStateSquareQ * 4, nStartI, m_nShipStateSquareQ * 2, "battle_colorRectangle"); @@ -97,27 +129,28 @@ void BIShipIcon::Draw() { m_pRS->TextureSet(0, m_nShipClassTextureID); m_pRS->DrawBuffer(m_nVBufID, sizeof(BI_COLOR_VERTEX), m_nIBufID, nStartV, m_nShipClassSquareQ * 4, nStartI, - m_nShipClassSquareQ * 2, "battle_alphacutcolor"); + m_nShipClassSquareQ * 2, "battle_colorRectangle"); } nStartV += m_nShipClassSquareQ * 4; + } for (int32_t n = 0; n < m_nShipQuantity; n++) { if (m_Ship[n].pASailorQuantity) { - m_pRS->ExtPrint(m_idSailorFont, m_dwSailorFontColor, 0, PR_ALIGN_CENTER, true, m_fSailorFontScale, 0, 0, + m_pRS->ExtPrint(m_idSailorFont, m_dwSailorFontColor, 0, PR_ALIGN_CENTER, true, n == 0 ? m_fMCSailorFontScale : m_fSailorFontScale, 0, 0, // shadow - static_cast(m_Ship[n].pntPos.x) + m_SailorFontOffset.x, - static_cast(m_Ship[n].pntPos.y) + m_SailorFontOffset.y, "%d", + n == 0 ? static_cast(m_Ship[n].pntPos.x) + m_MCSailorFontOffset.x : static_cast(m_Ship[n].pntPos.x) + m_SailorFontOffset.x, + n == 0 ? static_cast(m_Ship[n].pntPos.y) + m_MCSailorFontOffset.y : static_cast(m_Ship[n].pntPos.y) + m_SailorFontOffset.y, "%d", static_cast(atof(m_Ship[n].pASailorQuantity->GetThisAttr()))); } - if (!m_Ship[n].sShipName.empty()) + if (!m_Ship[n].sShipName.empty()) { - m_pRS->ExtPrint(m_idShipNameFont, m_dwShipNameFontColor, 0, PR_ALIGN_CENTER, true, m_fShipNameFontScale, 0, + m_pRS->ExtPrint(m_idShipNameFont, n == 0 ? m_dwShipNameFontColorMC : m_dwShipNameFontColor, 0, PR_ALIGN_CENTER, true, n == 0 ? m_fShipNameFontScaleMC : m_fShipNameFontScale, 0, 0, // font shadow - static_cast(m_Ship[n].pntPos.x) + m_ShipNameFontOffset.x, - static_cast(m_Ship[n].pntPos.y) + m_ShipNameFontOffset.y, "%s", + n == 0 ? static_cast(m_Ship[n].pntPos.x) + m_ShipNameFontOffsetMC.x : static_cast(m_Ship[n].pntPos.x) + m_ShipNameFontOffset.x, + n == 0 ? static_cast(m_Ship[n].pntPos.y) + m_ShipNameFontOffsetMC.y : static_cast(m_Ship[n].pntPos.y) + m_ShipNameFontOffset.y, "%s", m_Ship[n].sShipName.c_str()); } } @@ -142,41 +175,72 @@ void BIShipIcon::Init(ATTRIBUTES *pRoot, ATTRIBUTES *pA) FULLRECT(m_rBackUV); ZERROPOINT(m_pntBackOffset); FILLPOINT(m_pntBackIconSize, 128, 128); - + // belamour + m_nBackMCTextureID = -1; + m_dwBackMCColor = ARGB(255, 128, 128, 128); + FULLRECT(m_rBackMCUV); + ZERROPOINT(m_pntBackMCOffset); + FILLPOINT(m_pntBackMCIconSize, 128, 128); + + m_nShipStateBackTextureID = -1; + m_dwShipStateBackColor = ARGB(255, 128, 128, 128); + FULLRECT(m_rShipStateBackUV); + ZERROPOINT(m_pntShipStateBackOffset); + FILLPOINT(m_pntShipStateBackIconSize, 128, 128); + + m_nShipStateMCTextureID = -1; m_nShipStateTextureID = -1; + m_dwShipStateMCColor = ARGB(255, 128, 128, 128); m_dwShipStateColor = ARGB(255, 128, 128, 128); + FULLRECT(m_rShipHPMCUV); FULLRECT(m_rShipHPUV); + ZERROPOINT(m_pntShipHPMCOffset); ZERROPOINT(m_pntShipHPOffset); + FILLPOINT(m_pntShipHPMCIconSize, 128, 128); FILLPOINT(m_pntShipHPIconSize, 128, 128); + FULLRECT(m_rShipSPMCUV); FULLRECT(m_rShipSPUV); + ZERROPOINT(m_pntShipSPMCOffset); ZERROPOINT(m_pntShipSPOffset); + FILLPOINT(m_pntShipSPMCIconSize, 128, 128); FILLPOINT(m_pntShipSPIconSize, 128, 128); m_nShipClassTextureID = -1; m_dwShipClassColor = ARGB(255, 128, 128, 128); FULLRECT(m_rShipClassUV); + ZERROPOINT(m_pntMCShipClassOffset); ZERROPOINT(m_pntShipClassOffset); + FILLPOINT(m_pntMCShipClassIconSize, 128, 128); FILLPOINT(m_pntShipClassIconSize, 128, 128); m_nShipTextureID = -1; m_dwShipColor = ARGB(255, 128, 128, 128); // FULLRECT( m_rShipUV ); ZERROPOINT(m_pntShipOffset); + FILLPOINT(m_pntMCShipIconSize, 128, 128); FILLPOINT(m_pntShipIconSize, 128, 128); m_idSailorFont = -1; m_dwSailorFontColor = ARGB(255, 64, 64, 64); - m_fSailorFontScale = 1.f; - m_SailorFontOffset.x = -14; + m_fMCSailorFontScale = 1.f; + m_MCSailorFontOffset.x = -14; + m_MCSailorFontOffset.y = 18; + m_fSailorFontScale = 1.f; + m_SailorFontOffset.x = -14; m_SailorFontOffset.y = 18; m_idShipNameFont = -1; + m_dwShipNameFontColorMC = ARGB(255, 64, 64, 64); m_dwShipNameFontColor = ARGB(255, 64, 64, 64); + m_fShipNameFontScaleMC = 1.f; m_fShipNameFontScale = 1.f; + m_ShipNameFontOffsetMC.x = -14; + m_ShipNameFontOffsetMC.y = 40; m_ShipNameFontOffset.x = -14; m_ShipNameFontOffset.y = 40; m_nCommandListVerticalOffset = -48; + m_nCommandListVerticalOffsetMC = -48; for (n = 0; n < MAX_SHIP_QUANTITY; n++) { @@ -190,8 +254,13 @@ void BIShipIcon::Init(ATTRIBUTES *pRoot, ATTRIBUTES *pA) if (pcTmp) m_idSailorFont = m_pRS->LoadFont(pcTmp); m_dwSailorFontColor = pA->GetAttributeAsDword("sailorfontcolor", m_dwSailorFontColor); + m_fMCSailorFontScale = pA->GetAttributeAsFloat("mcsailorfontscale", m_fMCSailorFontScale); m_fSailorFontScale = pA->GetAttributeAsFloat("sailorfontscale", m_fSailorFontScale); - + + pcTmp = pA->GetAttribute("mcsailorfontoffset"); + if (pcTmp) + sscanf(pcTmp, "%ld,%ld", &m_MCSailorFontOffset.x, &m_MCSailorFontOffset.y); + // ugeen 150920 pcTmp = pA->GetAttribute("sailorfontoffset"); if (pcTmp) @@ -200,10 +269,15 @@ void BIShipIcon::Init(ATTRIBUTES *pRoot, ATTRIBUTES *pA) pcTmp = pA->GetAttribute("shipnamefontid"); if (pcTmp) m_idShipNameFont = m_pRS->LoadFont(pcTmp); + m_dwShipNameFontColorMC = pA->GetAttributeAsDword("shipnamefontcolorMC", m_dwShipNameFontColorMC); m_dwShipNameFontColor = pA->GetAttributeAsDword("shipnamefontcolor", m_dwShipNameFontColor); + m_fShipNameFontScaleMC = pA->GetAttributeAsFloat("shipnamefontscaleMC", m_fShipNameFontScaleMC); m_fShipNameFontScale = pA->GetAttributeAsFloat("shipnamefontscale", m_fShipNameFontScale); - pcTmp = pA->GetAttribute("shipnamefontoffset"); + pcTmp = pA->GetAttribute("shipnamefontoffsetMC"); + if (pcTmp) + sscanf(pcTmp, "%ld,%ld", &m_ShipNameFontOffsetMC.x, &m_ShipNameFontOffsetMC.y); + pcTmp = pA->GetAttribute("shipnamefontoffset"); if (pcTmp) sscanf(pcTmp, "%ld,%ld", &m_ShipNameFontOffset.x, &m_ShipNameFontOffset.y); @@ -220,7 +294,36 @@ void BIShipIcon::Init(ATTRIBUTES *pRoot, ATTRIBUTES *pA) pcTmp = pA->GetAttribute("backiconsize"); if (pcTmp) sscanf(pcTmp, "%f,%f", &m_pntBackIconSize.x, &m_pntBackIconSize.y); - + // belamour --> + pcTmp = pA->GetAttribute("backmctexturename"); + if (pcTmp) + m_nBackMCTextureID = m_pRS->TextureCreate(pcTmp); + m_dwBackMCColor = pA->GetAttributeAsDword("backmccolor", m_dwBackMCColor); + pcTmp = pA->GetAttribute("backmcuv"); + if (pcTmp) + sscanf(pcTmp, "%f,%f,%f,%f", &m_rBackMCUV.left, &m_rBackMCUV.top, &m_rBackMCUV.right, &m_rBackMCUV.bottom); + pcTmp = pA->GetAttribute("backmcoffset"); + if (pcTmp) + sscanf(pcTmp, "%f,%f", &m_pntBackMCOffset.x, &m_pntBackMCOffset.y); + pcTmp = pA->GetAttribute("backmciconsize"); + if (pcTmp) + sscanf(pcTmp, "%f,%f", &m_pntBackMCIconSize.x, &m_pntBackMCIconSize.y); + + //MC ship state backtexture + pcTmp = pA->GetAttribute("shipstatebacktexturename"); + if (pcTmp) + m_nShipStateBackTextureID = m_pRS->TextureCreate(pcTmp); + m_dwShipStateBackColor = pA->GetAttributeAsDword("shipstatebackcolor", m_dwShipStateBackColor); + pcTmp = pA->GetAttribute("shipstatebackuv"); + if (pcTmp) + sscanf(pcTmp, "%f,%f,%f,%f", &m_rShipStateBackUV.left, &m_rShipStateBackUV.top, &m_rShipStateBackUV.right, &m_rShipStateBackUV.bottom); + pcTmp = pA->GetAttribute("shipstatebackoffset"); + if (pcTmp) + sscanf(pcTmp, "%f,%f", &m_pntShipStateBackOffset.x, &m_pntShipStateBackOffset.y); + pcTmp = pA->GetAttribute("shipstatebackiconsize"); + if (pcTmp) + sscanf(pcTmp, "%f,%f", &m_pntShipStateBackIconSize.x, &m_pntShipStateBackIconSize.y); + // <--- pcTmp = pA->GetAttribute("shipstatetexturename"); if (pcTmp) m_nShipStateTextureID = m_pRS->TextureCreate(pcTmp); @@ -243,6 +346,29 @@ void BIShipIcon::Init(ATTRIBUTES *pRoot, ATTRIBUTES *pA) pcTmp = pA->GetAttribute("shipspiconsize"); if (pcTmp) sscanf(pcTmp, "%f,%f", &m_pntShipSPIconSize.x, &m_pntShipSPIconSize.y); + // belamour + pcTmp = pA->GetAttribute("shipstatemctexturename"); + if (pcTmp) + m_nShipStateMCTextureID = m_pRS->TextureCreate(pcTmp); + m_dwShipStateMCColor = pA->GetAttributeAsDword("shipstatemccolor", m_dwShipStateMCColor); + pcTmp = pA->GetAttribute("shiphpmcuv"); + if (pcTmp) + sscanf(pcTmp, "%f,%f,%f,%f", &m_rShipHPMCUV.left, &m_rShipHPMCUV.top, &m_rShipHPMCUV.right, &m_rShipHPMCUV.bottom); + pcTmp = pA->GetAttribute("shiphpmcoffset"); + if (pcTmp) + sscanf(pcTmp, "%f,%f", &m_pntShipHPMCOffset.x, &m_pntShipHPMCOffset.y); + pcTmp = pA->GetAttribute("shiphpmciconsize"); + if (pcTmp) + sscanf(pcTmp, "%f,%f", &m_pntShipHPMCIconSize.x, &m_pntShipHPMCIconSize.y); + pcTmp = pA->GetAttribute("shipspmcuv"); + if (pcTmp) + sscanf(pcTmp, "%f,%f,%f,%f", &m_rShipSPMCUV.left, &m_rShipSPMCUV.top, &m_rShipSPMCUV.right, &m_rShipSPMCUV.bottom); + pcTmp = pA->GetAttribute("shipspmcoffset"); + if (pcTmp) + sscanf(pcTmp, "%f,%f", &m_pntShipSPMCOffset.x, &m_pntShipSPMCOffset.y); + pcTmp = pA->GetAttribute("shipspmciconsize"); + if (pcTmp) + sscanf(pcTmp, "%f,%f", &m_pntShipSPMCIconSize.x, &m_pntShipSPMCIconSize.y); pcTmp = pA->GetAttribute("shipclasstexturename"); if (pcTmp) @@ -251,10 +377,16 @@ void BIShipIcon::Init(ATTRIBUTES *pRoot, ATTRIBUTES *pA) pcTmp = pA->GetAttribute("shipclassuv"); if (pcTmp) sscanf(pcTmp, "%f,%f,%f,%f", &m_rShipClassUV.left, &m_rShipClassUV.top, &m_rShipClassUV.right, - &m_rShipClassUV.bottom); + &m_rShipClassUV.bottom); + pcTmp = pA->GetAttribute("mcshipclassoffset"); + if (pcTmp) + sscanf(pcTmp, "%f,%f", &m_pntMCShipClassOffset.x, &m_pntMCShipClassOffset.y); pcTmp = pA->GetAttribute("shipclassoffset"); if (pcTmp) sscanf(pcTmp, "%f,%f", &m_pntShipClassOffset.x, &m_pntShipClassOffset.y); + pcTmp = pA->GetAttribute("mcshipclassiconsize"); + if (pcTmp) + sscanf(pcTmp, "%f,%f", &m_pntMCShipClassIconSize.x, &m_pntMCShipClassIconSize.y); pcTmp = pA->GetAttribute("shipclassiconsize"); if (pcTmp) sscanf(pcTmp, "%f,%f", &m_pntShipClassIconSize.x, &m_pntShipClassIconSize.y); @@ -267,6 +399,7 @@ void BIShipIcon::Init(ATTRIBUTES *pRoot, ATTRIBUTES *pA) } while (pcTmp[0]); } + m_nCommandListVerticalOffsetMC = pA->GetAttributeAsDword("commandlistverticaloffsetMC"); m_nCommandListVerticalOffset = pA->GetAttributeAsDword("commandlistverticaloffset"); pcTmp = pA->GetAttribute("shiptexturename"); @@ -282,6 +415,10 @@ void BIShipIcon::Init(ATTRIBUTES *pRoot, ATTRIBUTES *pA) pcTmp = pA->GetAttribute("shipiconsize"); if (pcTmp) sscanf(pcTmp, "%f,%f", &m_pntShipIconSize.x, &m_pntShipIconSize.y); + + pcTmp = pA->GetAttribute("mcshipiconsize"); + if (pcTmp) + sscanf(pcTmp, "%f,%f", &m_pntMCShipIconSize.x, &m_pntMCShipIconSize.y); m_dwShipNCols = pA->GetAttributeAsDword("xsize"); m_dwShipNRows = pA->GetAttributeAsDword("ysize"); @@ -423,8 +560,11 @@ void BIShipIcon::Release() SetActive(false); // disable control STORM_DELETE(m_pCommandList); + TEXTURE_RELEASE(m_pRS, m_nBackMCTextureID); TEXTURE_RELEASE(m_pRS, m_nBackTextureID); + TEXTURE_RELEASE(m_pRS, m_nShipStateBackTextureID); TEXTURE_RELEASE(m_pRS, m_nShipTextureID); + TEXTURE_RELEASE(m_pRS, m_nShipStateMCTextureID); TEXTURE_RELEASE(m_pRS, m_nShipStateTextureID); TEXTURE_RELEASE(m_pRS, m_nShipClassTextureID); VERTEX_BUFFER_RELEASE(m_pRS, m_nVBufID); @@ -432,8 +572,11 @@ void BIShipIcon::Release() FONT_RELEASE(m_pRS, m_idSailorFont); m_nMaxSquareQ = 0; + m_nBackMCSquareQ = 0; m_nBackSquareQ = 0; + m_nShipStateBackSquareQ = 0; m_nShipSquareQ = 0; + m_nMCShipStateSquareQ = 0; m_nShipStateSquareQ = 0; m_nShipClassSquareQ = 0; } @@ -455,7 +598,7 @@ int32_t BIShipIcon::CalculateShipQuantity() m_Ship[n].sShipName.clear(); } - // take the ship of the main character + // take the ship of the main character pSD = g_ShipList.GetMainCharacterShip(); if (pSD) { @@ -466,11 +609,13 @@ int32_t BIShipIcon::CalculateShipQuantity() m_Ship[0].nMaxSP = pSD->maxSP; m_Ship[0].nShipClass = GetShipClass(m_Ship[0].nCharacterIndex); GetShipUVFromPictureIndex(pSD->pictureNum, m_Ship[0].rUV); + //belamour + GetShipClassUVFromPictureIndex(GetShipClass(m_Ship[0].nCharacterIndex), m_Ship[0].ShipClassUV); m_Ship[0].sShipName = pSD->pAttr ? pSD->pAttr->GetAttribute("name") : "noname"; m_nShipQuantity++; } - // take the following "our" ships + // take the following "our" ships for (pSD = g_ShipList.GetShipRoot(); pSD; pSD = pSD->next) { if (m_Ship[0].nCharacterIndex == pSD->characterIndex) @@ -484,6 +629,8 @@ int32_t BIShipIcon::CalculateShipQuantity() m_Ship[m_nShipQuantity].nMaxSP = pSD->maxSP; m_Ship[m_nShipQuantity].nShipClass = GetShipClass(m_Ship[m_nShipQuantity].nCharacterIndex); GetShipUVFromPictureIndex(pSD->pictureNum, m_Ship[m_nShipQuantity].rUV); + // belamour + GetShipClassUVFromPictureIndex(GetShipClass(m_Ship[m_nShipQuantity].nCharacterIndex), m_Ship[m_nShipQuantity].ShipClassUV); m_Ship[m_nShipQuantity].sShipName = pSD->pAttr ? pSD->pAttr->GetAttribute("name") : "noname"; m_nShipQuantity++; } @@ -494,13 +641,16 @@ int32_t BIShipIcon::CalculateShipQuantity() void BIShipIcon::UpdateBuffers(int32_t nShipQ) { - const auto nBackSquareQ = nShipQ; - const auto nShipStateSquareQ = nShipQ * 2; + const auto nBackSquareQ = nShipQ-1; + const int32_t nShipStateBackSquareQ = 1; + const int32_t nBackMCSquareQ = 1; + const auto nShipStateSquareQ = (nShipQ-1) * 2; + const int32_t nMCShipStateSquareQ = 2; const int32_t nShipClassSquareQ = nShipQ; const int32_t nShipSquareQ = nShipQ; const int32_t nMaxSquareQ = - BIUtils::GetMaxFromFourLong(nBackSquareQ, nShipStateSquareQ, nShipClassSquareQ, nShipSquareQ); + BIUtils::GetMaxFromSevenLong(nBackSquareQ, nBackMCSquareQ, nShipStateBackSquareQ, nShipStateSquareQ, nMCShipStateSquareQ, nShipClassSquareQ, nShipSquareQ); if (m_nMaxSquareQ != nMaxSquareQ) { m_nMaxSquareQ = nMaxSquareQ; @@ -509,17 +659,20 @@ void BIShipIcon::UpdateBuffers(int32_t nShipQ) FillIndexBuffer(); } - if ((nBackSquareQ + nShipStateSquareQ + nShipClassSquareQ + nShipSquareQ) != - (m_nBackSquareQ + m_nShipStateSquareQ + m_nShipClassSquareQ + m_nShipSquareQ)) + if ((nBackSquareQ + nBackMCSquareQ + nShipStateSquareQ + nShipStateBackSquareQ + nMCShipStateSquareQ + nShipClassSquareQ + nShipSquareQ) != + (m_nBackSquareQ + m_nBackMCSquareQ + m_nShipStateBackSquareQ + m_nShipStateSquareQ + m_nMCShipStateSquareQ + m_nShipClassSquareQ + m_nShipSquareQ)) { m_nBackSquareQ = nBackSquareQ; + m_nShipStateBackSquareQ = nShipStateBackSquareQ; + m_nBackMCSquareQ = nBackMCSquareQ; + m_nMCShipStateSquareQ = nMCShipStateSquareQ; m_nShipStateSquareQ = nShipStateSquareQ; m_nShipClassSquareQ = nShipClassSquareQ; m_nShipSquareQ = nShipSquareQ; VERTEX_BUFFER_RELEASE(m_pRS, m_nVBufID); m_nVBufID = m_pRS->CreateVertexBuffer( BI_COLOR_VERTEX_FORMAT, - (m_nBackSquareQ + m_nShipStateSquareQ + m_nShipClassSquareQ + m_nShipSquareQ) * 4 * sizeof(BI_COLOR_VERTEX), + (m_nBackSquareQ + m_nBackMCSquareQ + m_nShipStateBackSquareQ + m_nShipStateSquareQ + m_nMCShipStateSquareQ + m_nShipClassSquareQ + m_nShipSquareQ) * 4 * sizeof(BI_COLOR_VERTEX), D3DUSAGE_WRITEONLY); } FillVertexBuffer(); @@ -560,29 +713,55 @@ void BIShipIcon::FillVertexBuffer() for (n = 0; n < m_nShipQuantity; n++) { vn += WriteSquareToVBuff(&pV[vn], m_Ship[n].rUV, m_dwShipColor, m_Ship[n].pntPos + m_pntShipOffset, - m_pntShipIconSize); + n == 0 ? m_pntMCShipIconSize : m_pntShipIconSize); } for (n = 0; n < m_nShipQuantity; n++) - vn += WriteSquareToVBuff(&pV[vn], m_rBackUV, m_dwBackColor, m_Ship[n].pntPos + m_pntBackOffset, + { + if(n == 0) + { + vn += WriteSquareToVBuff(&pV[vn], m_rShipStateBackUV, m_dwShipStateBackColor, m_Ship[n].pntPos + m_pntShipStateBackOffset, + m_pntShipStateBackIconSize); + vn += WriteSquareToVBuff(&pV[vn], m_rBackMCUV, m_dwBackMCColor, m_Ship[n].pntPos + m_pntBackMCOffset, + m_pntBackMCIconSize); + } + else + { + vn += WriteSquareToVBuff(&pV[vn], m_rBackUV, m_dwBackColor, m_Ship[n].pntPos + m_pntBackOffset, m_pntBackIconSize); - + } + } for (n = 0; n < m_nShipQuantity; n++) { - vn += WriteSquareToVBuffWithProgress(&pV[vn], m_rShipHPUV, m_dwShipStateColor, + if(n == 0) + { + vn += WriteSquareToVBuffWithProgress(&pV[vn], m_rShipHPMCUV, m_dwShipStateMCColor, + m_Ship[n].pntPos + m_pntShipHPMCOffset, m_pntShipHPMCIconSize, + 0.f, 0.f, 0.f, GetProgressShipHP(n)); + vn += WriteSquareToVBuffWithProgress(&pV[vn], m_rShipSPMCUV, m_dwShipStateMCColor, + m_Ship[n].pntPos + m_pntShipSPMCOffset, m_pntShipSPMCIconSize, + 0.f, 0.f, 0.f, GetProgressShipSP(n)); + } + else + { + vn += WriteSquareToVBuffWithProgress(&pV[vn], m_rShipHPUV, m_dwShipStateColor, m_Ship[n].pntPos + m_pntShipHPOffset, m_pntShipHPIconSize, GetProgressShipHP(n), 0.f, 0.f, 0.f); - vn += WriteSquareToVBuffWithProgress(&pV[vn], m_rShipSPUV, m_dwShipStateColor, + vn += WriteSquareToVBuffWithProgress(&pV[vn], m_rShipSPUV, m_dwShipStateColor, m_Ship[n].pntPos + m_pntShipSPOffset, m_pntShipSPIconSize, GetProgressShipSP(n), 0.f, 0.f, 0.f); + } } - + for (n = 0; n < m_nShipQuantity; n++) - vn += WriteSquareToVBuffWithProgress(&pV[vn], m_rShipClassUV, m_dwShipClassColor, + /* vn += WriteSquareToVBuffWithProgress(&pV[vn], m_rShipClassUV, m_dwShipClassColor, m_Ship[n].pntPos + m_pntShipClassOffset, m_pntShipClassIconSize, 0.f, - 0.f, 0.f, 1.f - GetProgressShipClass(n)); - // vn += WriteSquareToVBuff( &pV[vn], m_rShipClassUV, m_dwShipClassColor, m_Ship[n].pntPos+m_pntShipClassOffset, - // m_pntShipClassIconSize ); + 0.f, 0.f, 1.f - GetProgressShipClass(n)); */ + // belamour + vn += n == 0 ? WriteSquareToVBuff( &pV[vn], m_Ship[n].ShipClassUV, m_dwShipClassColor, m_Ship[n].pntPos+m_pntMCShipClassOffset, + m_pntMCShipClassIconSize ) + : WriteSquareToVBuff( &pV[vn], m_Ship[n].ShipClassUV, m_dwShipClassColor, m_Ship[n].pntPos+m_pntShipClassOffset, + m_pntShipClassIconSize ); m_pRS->UnLockVertexBuffer(m_nVBufID); } @@ -705,6 +884,7 @@ int32_t BIShipIcon::GetCurrentCommandTopLine() if (n < 0 || n >= m_nShipQuantity) n = 0; m_nCurrentShipIndex = n; + if (n == 0) return static_cast(m_Ship[0].pntPos.y) + m_nCommandListVerticalOffsetMC; return static_cast(m_Ship[n].pntPos.y) + m_nCommandListVerticalOffset; } @@ -781,6 +961,18 @@ void BIShipIcon::GetShipUVFromPictureIndex(int32_t nPicIndex, FRECT &rUV) rUV.bottom = rUV.top + pictureHeight; // boal } +// belamour +void BIShipIcon::GetShipClassUVFromPictureIndex(int32_t nPicIndex, FRECT &ShipClassUV) +{ + + const float pw = 1.f/8.f; + + ShipClassUV.left = pw*(nPicIndex); + ShipClassUV.top = 0.f; + ShipClassUV.right = ShipClassUV.left + pw; + ShipClassUV.bottom = 1.f; +} + int32_t BIShipIcon::GetShipClass(int32_t nCharIdx) { VDATA *pVDat = core.Event("evntGetCharacterShipClass", "l", nCharIdx); diff --git a/src/libs/battle_interface/src/sea/battle_ship_sign.h b/src/libs/battle_interface/src/sea/battle_ship_sign.h index 4cbaa27be..b3540a4dc 100644 --- a/src/libs/battle_interface/src/sea/battle_ship_sign.h +++ b/src/libs/battle_interface/src/sea/battle_ship_sign.h @@ -68,6 +68,8 @@ class BIShipIcon float GetProgressShipSP(int32_t nShipNum); float GetProgressShipClass(int32_t nShipNum); void GetShipUVFromPictureIndex(int32_t nPicIndex, FRECT &rUV); + //belamour + void GetShipClassUVFromPictureIndex(int32_t nPicIndex, FRECT &ShipClassUV); int32_t GetShipClass(int32_t nCharIdx); @@ -77,29 +79,54 @@ class BIShipIcon int32_t m_nIBufID; int32_t m_nMaxSquareQ; - - int32_t m_nBackTextureID; + // belamour + int32_t m_nBackMCTextureID; + int32_t m_nBackMCSquareQ; + uint32_t m_dwBackMCColor; + FRECT m_rBackMCUV; + BIFPOINT m_pntBackMCOffset; + FPOINT m_pntBackMCIconSize; + + int32_t m_nBackTextureID; int32_t m_nBackSquareQ; uint32_t m_dwBackColor; FRECT m_rBackUV; BIFPOINT m_pntBackOffset; FPOINT m_pntBackIconSize; - + + int32_t m_nShipStateBackTextureID; + int32_t m_nShipStateBackSquareQ; + uint32_t m_dwShipStateBackColor; + FRECT m_rShipStateBackUV; + BIFPOINT m_pntShipStateBackOffset; + FPOINT m_pntShipStateBackIconSize; + + int32_t m_nShipStateMCTextureID; int32_t m_nShipStateTextureID; + int32_t m_nMCShipStateSquareQ; int32_t m_nShipStateSquareQ; + uint32_t m_dwShipStateMCColor; uint32_t m_dwShipStateColor; + FRECT m_rShipHPMCUV; FRECT m_rShipHPUV; BIFPOINT m_pntShipHPOffset; + BIFPOINT m_pntShipHPMCOffset; + FPOINT m_pntShipHPMCIconSize; FPOINT m_pntShipHPIconSize; + FRECT m_rShipSPMCUV; FRECT m_rShipSPUV; + BIFPOINT m_pntShipSPMCOffset; BIFPOINT m_pntShipSPOffset; + FPOINT m_pntShipSPMCIconSize; FPOINT m_pntShipSPIconSize; int32_t m_nShipClassTextureID; int32_t m_nShipClassSquareQ; uint32_t m_dwShipClassColor; FRECT m_rShipClassUV; + BIFPOINT m_pntMCShipClassOffset; BIFPOINT m_pntShipClassOffset; + FPOINT m_pntMCShipClassIconSize; FPOINT m_pntShipClassIconSize; std::vector m_aClassProgress; @@ -108,6 +135,7 @@ class BIShipIcon uint32_t m_dwShipColor; // FRECT m_rShipUV; BIFPOINT m_pntShipOffset; + FPOINT m_pntMCShipIconSize; FPOINT m_pntShipIconSize; uint32_t m_dwShipNCols; uint32_t m_dwShipNRows; @@ -123,20 +151,28 @@ class BIShipIcon FRECT rUV; std::string sShipName; int32_t nShipClass; + //belamour + FRECT ShipClassUV; } m_Ship[MAX_SHIP_QUANTITY]; int32_t m_nShipQuantity; int32_t m_nCurrentShipIndex; int32_t m_nCommandListVerticalOffset; + int32_t m_nCommandListVerticalOffsetMC; int32_t m_idSailorFont; uint32_t m_dwSailorFontColor; float m_fSailorFontScale; POINT m_SailorFontOffset; + float m_fMCSailorFontScale; + POINT m_MCSailorFontOffset; int32_t m_idShipNameFont; + uint32_t m_dwShipNameFontColorMC; uint32_t m_dwShipNameFontColor; + float m_fShipNameFontScaleMC; float m_fShipNameFontScale; + POINT m_ShipNameFontOffsetMC; POINT m_ShipNameFontOffset; bool m_bMakeUpdate; From 6153159566ff294a1e0a2fc0e34360d00783311c Mon Sep 17 00:00:00 2001 From: Blackmark3000 Date: Mon, 30 Jan 2023 20:18:36 +0300 Subject: [PATCH 08/14] Just fix arrow for new interface --- src/libs/battle_interface/src/battle_command.cpp | 11 ++++++++--- src/libs/battle_interface/src/battle_command.h | 1 + 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/libs/battle_interface/src/battle_command.cpp b/src/libs/battle_interface/src/battle_command.cpp index cbf3ea39c..b7998550f 100644 --- a/src/libs/battle_interface/src/battle_command.cpp +++ b/src/libs/battle_interface/src/battle_command.cpp @@ -229,6 +229,9 @@ void BICommandList::Init() FULLRECT(m_frDownArrowUV); m_pntUpArrowOffset.x = 32; m_pntUpArrowOffset.y = -34; + + m_pntDownArrowOffset0.x = 32; + m_pntDownArrowOffset0.y = 66; m_pntDownArrowOffset.x = 32; m_pntDownArrowOffset.y = 66; @@ -280,8 +283,10 @@ void BICommandList::Init() m_pntUpDownArrowSize.x, m_pntUpDownArrowSize.y); BIUtils::ReadPosFromAttr(pAList, "UDArrow_Offset_Up", m_pntUpArrowOffset.x, m_pntUpArrowOffset.y, m_pntUpArrowOffset.x, m_pntUpArrowOffset.y); - BIUtils::ReadPosFromAttr(pAList, "UDArrow_Offset_Down", m_pntDownArrowOffset.x, m_pntDownArrowOffset.y, + BIUtils::ReadPosFromAttr(pAList, "UDArrow_Offset_Down", m_pntDownArrowOffset.x, m_pntDownArrowOffset.y, m_pntDownArrowOffset.x, m_pntDownArrowOffset.y); + BIUtils::ReadPosFromAttr(pAList, "UDArrow_Offset_Down0", m_pntDownArrowOffset0.x, m_pntDownArrowOffset0.y, + m_pntDownArrowOffset0.x, m_pntDownArrowOffset0.y); if (attr = pAList->GetAttribute("LRArrow_Texture")) m_sLeftRightArrowTexture = attr; @@ -553,8 +558,8 @@ void BICommandList::UpdateShowIcon() } if (m_bDownArrow) { - rPos.left = m_LeftTopPoint.x + m_pntDownArrowOffset.x; - rPos.top = m_LeftTopPoint.y + m_pntDownArrowOffset.y; + rPos.left = m_bUpArrow ? m_LeftTopPoint.x + m_pntDownArrowOffset.x : m_LeftTopPoint.x + m_pntDownArrowOffset0.x; + rPos.top = m_bUpArrow ? m_LeftTopPoint.y + m_pntDownArrowOffset.y : m_LeftTopPoint.y + m_pntDownArrowOffset0.y; rPos.right = rPos.left + m_pntUpDownArrowSize.x; rPos.bottom = rPos.top + m_pntUpDownArrowSize.y; m_pImgRender->CreateImage(BIType_square, m_sUpDownArrowTexture.c_str(), 0xFF808080, m_frDownArrowUV, rPos); diff --git a/src/libs/battle_interface/src/battle_command.h b/src/libs/battle_interface/src/battle_command.h index c6a6c582e..86b8bdc79 100644 --- a/src/libs/battle_interface/src/battle_command.h +++ b/src/libs/battle_interface/src/battle_command.h @@ -116,6 +116,7 @@ class BICommandList IPOINT m_pntUpDownArrowSize; IPOINT m_pntUpArrowOffset; IPOINT m_pntDownArrowOffset; + IPOINT m_pntDownArrowOffset0; bool m_bLeftArrow; bool m_bRightArrow; From 1766df3c9148bedc27fdc4b5fd370e1e5df0c575 Mon Sep 17 00:00:00 2001 From: Blackmark3000 Date: Mon, 30 Jan 2023 22:25:42 +0300 Subject: [PATCH 09/14] =?UTF-8?q?espkk=20=D1=82=D1=8B=20=D0=BD=D0=B0=D0=BC?= =?UTF-8?q?=20=D0=BD=D1=83=D0=B6=D0=B5=D0=BD=20=D0=B6=D0=B8=D0=B2=D1=8B?= =?UTF-8?q?=D0=BC!!!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/libs/battle_interface/src/bi_utils.cpp | 28 ++++++++++++---------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/src/libs/battle_interface/src/bi_utils.cpp b/src/libs/battle_interface/src/bi_utils.cpp index d41b9ab9a..40fcc45f4 100644 --- a/src/libs/battle_interface/src/bi_utils.cpp +++ b/src/libs/battle_interface/src/bi_utils.cpp @@ -247,19 +247,21 @@ int32_t BIUtils::GetMaxFromFourLong(int32_t n1, int32_t n2, int32_t n3, int32_t int32_t BIUtils::GetMaxFromSevenLong(int32_t n1, int32_t n2, int32_t n3, int32_t n4, int32_t n5, int32_t n6, int32_t n7) { - if (n1 >= n2 && n1 >= n3 && n1 >= n4 && n1 >= n5 && n1 >= n6 && n1 >= n7) - return n1; - if (n2 >= n3 && n2 >= n4 && n2 >= n5 && n2 >= n6 && n2 >= n7) - return n2; - if (n3 >= n4 && n3 >= n5 && n3 >= n6 && n3 >= n7) - return n3; - if (n4 >= n5 && n4 >= n6 && n4 >= n7) - return n4; - if (n5 >= n6 && n5 >= n7) - return n5; - if (n6 >= n7) - return n6; - return n7; + int32_t max = n1; + + if (max Date: Mon, 6 Feb 2023 18:59:30 +0300 Subject: [PATCH 10/14] New logs type --- .../battle_interface/src/log_and_action.cpp | 864 +++++++++++++++++- .../battle_interface/src/log_and_action.h | 114 +++ .../include/shared/battle_interface/log_msg.h | 3 + 3 files changed, 977 insertions(+), 4 deletions(-) diff --git a/src/libs/battle_interface/src/log_and_action.cpp b/src/libs/battle_interface/src/log_and_action.cpp index 7ad9b4f53..b3211e195 100644 --- a/src/libs/battle_interface/src/log_and_action.cpp +++ b/src/libs/battle_interface/src/log_and_action.cpp @@ -32,6 +32,19 @@ ILogAndActions::ILogAndActions() m_bDontShowAll = false; m_sOldActionName[0] = 0; m_nTimeCounter = 0; + + //picinfo + m_pRoot = nullptr; + m_PicInfofontID = -1; + m_fPicInfoFontScale = 1.f; + m_nPicInfoStringBegin = 0; + + // TimeSpeed + bShowTimeSpeed = false; + + // level up + m_idLUBackTexture = -1; + AlphaLU = 0.f; } ILogAndActions::~ILogAndActions() @@ -96,6 +109,39 @@ void ILogAndActions::Execute(uint32_t delta_time) } top += m_nStringOffset; } + + // pic info string + + // fade out lines + const auto colDelta1 = delta_time * m_fPicInfoBlendSpeed; + STRING_DESCR *prev_pd = nullptr; + STRING_DESCR *pd; + for (pd = m_pRoot; pd != nullptr;) + { + if (pd->alpha <= 255.f) + if ((pd->alpha -= colDelta1) <= 0) + { + if (prev_pd == nullptr) + m_pRoot = pd->next; + else + prev_pd->next = pd->next; + STORM_DELETE(pd->str); + STORM_DELETE(pd); + pd = m_pRoot; + continue; + } + prev_pd = pd; + pd = pd->next; + } + + + if ((AlphaBI -= colDelta1) <= 0) AlphaBI = 0.f; + if ((AlphaBI2 -= colDelta1) <= 0) AlphaBI2 = 0.f; + if ((AlphaBI3 -= colDelta1) <= 0) AlphaBI3 = 0.f; + if (m_pRoot == nullptr) PIstage = 0; + const auto colDelta2 = delta_time * m_fLUStringSpeed; + if ((AlphaLU -= colDelta2) <= 0) AlphaLU = 0.f; + } uint64_t ILogAndActions::ProcessMessage(MESSAGE &message) @@ -147,6 +193,32 @@ uint64_t ILogAndActions::ProcessMessage(MESSAGE &message) SetString(param.c_str(), false); } break; + + case LOG_ADD_PIC: + { + if(PIstage == 3) break; + const std::string ¶m = message.String(); + m_nPicInfoIconIndex = message.Long(); + SetPicInfo(param.c_str()); + } + break; + + case LOG_TIME_SPEED: + { + TimeSpeedText = message.String(); + bShowTimeSpeed = message.Long() != 0 ; + if(!bShowTimeSpeed) break; + } + break; + + case LOG_LEVEL_UP: + { + LUStringText = message.String(); + LURankText = message.String(); + SetLevelUp(); + } + break; + case LOG_SET_ACTIVE_ACTION: { const std::string ¶m = message.String(); SetAction(param.c_str()); @@ -232,6 +304,14 @@ void ILogAndActions::Realize(uint32_t delta_time) { CMatrix matw; rs->SetTransform(D3DTS_WORLD, matw); + //backimage + if (m_idActionBackTexture != -1L && m_bThatRealAction) + { + rs->TextureSet(0, m_idActionBackTexture); + rs->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, BI_COLOR_VERTEX_FORMAT, 2, m_ActionBackVertex, + sizeof(BI_COLOR_VERTEX), "battle_rectangle"); + } + // show icon if ((m_idIconTexture != -1L) && m_bThatRealAction) { @@ -243,12 +323,45 @@ void ILogAndActions::Realize(uint32_t delta_time) m_ActionHint2.Print(); } } - + + // time speed + if(m_bShowLogStrings && bShowTimeSpeed) + { + + rs->TextureSet(0, m_idTimeSpeedIconTexture); + rs->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, BI_COLOR_VERTEX_FORMAT, 2, m_TimeSpeedIconVertex, + sizeof(BI_COLOR_VERTEX), "battle_tex_col_Rectangle"); + + rs->ExtPrint(m_TimeSpeedfontID, m_dwTimeSpeedColor, 0, PR_ALIGN_LEFT, true, m_fTimeSpeedFontScale, + 0, 0, m_nTimeSpeedLeft, m_nTimeSpeedUp, "%s", TimeSpeedText.c_str()); + + + } + + //level up + if (m_bShowLogStrings && AlphaLU > 0.f) + { + m_LUBackVertex[0].col = m_dwLUBackColor + (static_cast(AlphaLU) << 24); + m_LUBackVertex[1].col = m_dwLUBackColor + (static_cast(AlphaLU) << 24); + m_LUBackVertex[2].col = m_dwLUBackColor + (static_cast(AlphaLU) << 24); + m_LUBackVertex[3].col = m_dwLUBackColor + (static_cast(AlphaLU) << 24); + + rs->TextureSet(0, m_idLUBackTexture); + rs->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, BI_COLOR_VERTEX_FORMAT, 2, m_LUBackVertex, + sizeof(BI_COLOR_VERTEX), "battle_tex_col_Rectangle"); + + rs->ExtPrint(m_LUStringfontID, m_dwLUStringColor + (static_cast(AlphaLU) << 24), 0, PR_ALIGN_CENTER, true, m_fLUStringFontScale, + 0, 0, m_nLUStringLeft, m_nLUStringUp, "%s", LUStringText.c_str()); + + rs->ExtPrint(m_LURankfontID, m_dwLURankColor + (static_cast(AlphaLU) << 24), 0, PR_ALIGN_CENTER, true, m_fLURankFontScale, + 0, 0, m_nLURankLeft, m_nLURankUp, "%s", LURankText.c_str()); + } + // Show log strings if (m_bShowLogStrings) { - if (m_sRoot == nullptr) - return; + if (m_sRoot == nullptr && m_pRoot == nullptr) + return; auto *ptr = m_sRoot; int32_t nAlign = PR_ALIGN_LEFT; auto strX = m_nWindowLeft; @@ -273,6 +386,93 @@ void ILogAndActions::Realize(uint32_t delta_time) ptr = ptr->next; } } + + // Show Pic Info strings + if (m_bShowLogStrings) + { + if (m_pRoot == nullptr) + return; + auto *ptr = m_pRoot; + int32_t nPIAlign = PR_ALIGN_LEFT; + auto strPIX = m_nPicInfoWindowLeft; + if (m_nPicInfoWindowRight >= 0) + { + strPIX = m_nPicInfoWindowRight; + nPIAlign = PR_ALIGN_RIGHT; + } + + if(m_PicInfoBackVertex[0].col != m_dwPicInfoMinColor) + { + m_PicInfoBackVertex[0].col = m_dwPicInfoMinColor + (static_cast(AlphaBI) << 24); + m_PicInfoBackVertex[1].col = m_dwPicInfoMinColor + (static_cast(AlphaBI) << 24); + m_PicInfoBackVertex[2].col = m_dwPicInfoMinColor + (static_cast(AlphaBI) << 24); + m_PicInfoBackVertex[3].col = m_dwPicInfoMinColor + (static_cast(AlphaBI) << 24); + + m_PicInfoIconVertex[0].col = m_dwPicInfoMinColor + (static_cast(AlphaBI) << 24); + m_PicInfoIconVertex[1].col = m_dwPicInfoMinColor + (static_cast(AlphaBI) << 24); + m_PicInfoIconVertex[2].col = m_dwPicInfoMinColor + (static_cast(AlphaBI) << 24); + m_PicInfoIconVertex[3].col = m_dwPicInfoMinColor + (static_cast(AlphaBI) << 24); + + rs->TextureSet(0, m_idPicInfoBackTexture); + rs->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, BI_COLOR_VERTEX_FORMAT, 2, m_PicInfoBackVertex, + sizeof(BI_COLOR_VERTEX), "battle_tex_col_Rectangle"); + + rs->TextureSet(0, m_idPicInfoIconTexture); + rs->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, BI_COLOR_VERTEX_FORMAT, 2, m_PicInfoIconVertex, + sizeof(BI_COLOR_VERTEX), "battle_tex_col_Rectangle"); + } + + if(m_PicInfoBackVertex1[0].col != m_dwPicInfoMinColor) + { + m_PicInfoBackVertex1[0].col = m_dwPicInfoMinColor + (static_cast(AlphaBI2) << 24); + m_PicInfoBackVertex1[1].col = m_dwPicInfoMinColor + (static_cast(AlphaBI2) << 24); + m_PicInfoBackVertex1[2].col = m_dwPicInfoMinColor + (static_cast(AlphaBI2) << 24); + m_PicInfoBackVertex1[3].col = m_dwPicInfoMinColor + (static_cast(AlphaBI2) << 24); + + m_PicInfoIconVertex1[0].col = m_dwPicInfoMinColor + (static_cast(AlphaBI2) << 24); + m_PicInfoIconVertex1[1].col = m_dwPicInfoMinColor + (static_cast(AlphaBI2) << 24); + m_PicInfoIconVertex1[2].col = m_dwPicInfoMinColor + (static_cast(AlphaBI2) << 24); + m_PicInfoIconVertex1[3].col = m_dwPicInfoMinColor + (static_cast(AlphaBI2) << 24); + + rs->TextureSet(0, m_idPicInfoBackTexture); + rs->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, BI_COLOR_VERTEX_FORMAT, 2, m_PicInfoBackVertex1, + sizeof(BI_COLOR_VERTEX), "battle_tex_col_Rectangle"); + + rs->TextureSet(0, m_idPicInfoIconTexture); + rs->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, BI_COLOR_VERTEX_FORMAT, 2, m_PicInfoIconVertex1, + sizeof(BI_COLOR_VERTEX), "battle_tex_col_Rectangle"); + } + + if(m_PicInfoBackVertex2[0].col != m_dwPicInfoMinColor) + { + m_PicInfoBackVertex2[0].col = m_dwPicInfoMinColor + (static_cast(AlphaBI3) << 24); + m_PicInfoBackVertex2[1].col = m_dwPicInfoMinColor + (static_cast(AlphaBI3) << 24); + m_PicInfoBackVertex2[2].col = m_dwPicInfoMinColor + (static_cast(AlphaBI3) << 24); + m_PicInfoBackVertex2[3].col = m_dwPicInfoMinColor + (static_cast(AlphaBI3) << 24); + + m_PicInfoIconVertex2[0].col = m_dwPicInfoMinColor + (static_cast(AlphaBI3) << 24); + m_PicInfoIconVertex2[1].col = m_dwPicInfoMinColor + (static_cast(AlphaBI3) << 24); + m_PicInfoIconVertex2[2].col = m_dwPicInfoMinColor + (static_cast(AlphaBI3) << 24); + m_PicInfoIconVertex2[3].col = m_dwPicInfoMinColor + (static_cast(AlphaBI3) << 24); + + rs->TextureSet(0, m_idPicInfoBackTexture); + rs->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, BI_COLOR_VERTEX_FORMAT, 2, m_PicInfoBackVertex2, + sizeof(BI_COLOR_VERTEX), "battle_tex_col_Rectangle"); + + rs->TextureSet(0, m_idPicInfoIconTexture); + rs->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, BI_COLOR_VERTEX_FORMAT, 2, m_PicInfoIconVertex2, + sizeof(BI_COLOR_VERTEX), "battle_tex_col_Rectangle"); + } + auto strPIY = m_nPicInfoStringBegin; + while (ptr != nullptr) + { + rs->ExtPrint(m_PicInfofontID, m_dwPicInfoColor + (static_cast(ptr->alpha) << 24), 0, nPIAlign, true, m_fPicInfoFontScale, + 0, 0, strPIX, m_nPicInfoWindowUp + static_cast(ptr->offset), "%s", ptr->str); + + strPIY += m_nPicInfoStringOffset; + ptr = ptr->next; + } + } } void ILogAndActions::Create(bool bFastComShow, bool bLogStringShow) @@ -347,6 +547,434 @@ void ILogAndActions::Create(bool bFastComShow, bool bLogStringShow) m_fShiftSpeed = 1.f / 50.f; m_fBlendSpeed = 1.f / 50.f; } + + //backimage + pA = AttributesPointer->GetAttributeClass("ActiveActionsBack"); + if (pA != nullptr) + { + m_idActionBackTexture = rs->TextureCreate(pA->GetAttribute("TextureName")); + m_nActionBackWidth = pA->GetAttributeAsDword("width", 64); + m_nActionBackHeight = pA->GetAttributeAsDword("height", 64); + m_nActionBackCentr = pA->GetAttributeAsDword("centr", 0); + m_nActionBackUp = pA->GetAttributeAsDword("top", 0); + m_dwActionBackColor = pA->GetAttributeAsDword("color", 0x00FFFFFF); + } + else + { + m_idActionBackTexture = -1L; + m_nActionBackWidth = 64; + m_nActionBackHeight = 64; + m_nActionBackCentr = 0; + m_nActionBackUp = 0; + m_dwActionBackColor = 0x00FFFFFF; + } + m_ActionBackVertex[0].w = m_ActionBackVertex[1].w = m_ActionBackVertex[2].w = m_ActionBackVertex[3].w = .5f; + m_ActionBackVertex[0].pos.z = m_ActionBackVertex[1].pos.z = m_ActionBackVertex[2].pos.z = m_ActionBackVertex[3].pos.z = 1.f; + m_ActionBackVertex[0].col = m_ActionBackVertex[1].col = m_ActionBackVertex[2].col = m_ActionBackVertex[3].col = m_dwActionBackColor; + m_ActionBackVertex[0].pos.x = static_cast(m_nActionBackCentr); + m_ActionBackVertex[0].pos.y = static_cast(m_nActionBackUp); + m_ActionBackVertex[0].tu = 0.f; + m_ActionBackVertex[0].tv = 0.f; + + m_ActionBackVertex[1].pos.x = static_cast(m_nActionBackCentr); + m_ActionBackVertex[1].pos.y = static_cast(m_nActionBackUp + m_nActionBackHeight); + m_ActionBackVertex[1].tu = 0.f; + m_ActionBackVertex[1].tv = 1.f ; + + m_ActionBackVertex[2].pos.x = static_cast(m_nActionBackCentr + m_nActionBackWidth); + m_ActionBackVertex[2].pos.y = static_cast(m_nActionBackUp); + m_ActionBackVertex[2].tu = 1.f; + m_ActionBackVertex[2].tv = 0.f; + + m_ActionBackVertex[3].pos.x = static_cast(m_nActionBackCentr + m_nActionBackWidth); + m_ActionBackVertex[3].pos.y = static_cast(m_nActionBackUp + m_nActionBackHeight); + m_ActionBackVertex[3].tu = 1.f ; + m_ActionBackVertex[3].tv = 1.f ; + + + // set param for pic info + PIstage = 0; + pA = AttributesPointer->GetAttributeClass("PicInfo"); + if (pA != nullptr) + { + m_nPicInfoWindowWidth = pA->GetAttributeAsDword("width", 200); + m_nPicInfoWindowHeight = pA->GetAttributeAsDword("height", 128); + m_nPicInfoWindowLeft = pA->GetAttributeAsDword("left", -1); + m_nPicInfoWindowRight = pA->GetAttributeAsDword("right", -1); + m_nPicInfoWindowUp = pA->GetAttributeAsDword("up", 0); + m_PicInfofontID = rs->LoadFont(pA->GetAttribute("font")); + m_fPicInfoFontScale = pA->GetAttributeAsFloat("fontscale", 1.f); + m_dwPicInfoColor = pA->GetAttributeAsDword("color", 0x00FFFFFF); + m_nPicInfoStringOffset = pA->GetAttributeAsDword("offsetString", 24); + m_fPicInfoShiftSpeed = pA->GetAttributeAsFloat("speed", 1.f / 50.f); + m_fPicInfoBlendSpeed = pA->GetAttributeAsFloat("color_speed", 1.f / 50.f); + m_dwPicInfoMaxColor = pA->GetAttributeAsDword("maxcolor", 0x00FFFFFF); + m_dwPicInfoMinColor = pA->GetAttributeAsDword("mincolor", 0x00FFFFFF); + } + else + { + m_nPicInfoWindowWidth = 200; + m_nPicInfoWindowHeight = 128; + m_nPicInfoWindowLeft = 64; + m_nPicInfoWindowUp = 0; + m_PicInfofontID = -1L; + m_fPicInfoFontScale = 1.f; + m_dwPicInfoColor = 0x00FFFFFF; + m_nPicInfoStringBegin = 0; + m_nPicInfoStringOffset = 24; + m_fPicInfoShiftSpeed = 1.f / 50.f; + m_fPicInfoBlendSpeed = 1.f / 50.f; + m_dwPicInfoMaxColor = 0x00FFFFFF; + m_dwPicInfoMinColor = 0x00FFFFFF; + } + AlphaBI = 0.f; + AlphaBI2 = 0.f; + AlphaBI3 = 0.f; + // backimage + pA = AttributesPointer->GetAttributeClass("PicInfoBack"); + if (pA != nullptr) + { + m_idPicInfoBackTexture = rs->TextureCreate(pA->GetAttribute("TextureName")); + m_nPicInfoBackWidth = pA->GetAttributeAsDword("width", 64); + m_nPicInfoBackHeight = pA->GetAttributeAsDword("height", 64); + m_nPicInfoBackLeft = pA->GetAttributeAsDword("left", 0); + m_nPicInfoBackUp = pA->GetAttributeAsDword("top", 0); + } + else + { + m_idPicInfoBackTexture = -1L; + m_nPicInfoBackWidth = 64; + m_nPicInfoBackHeight = 64; + m_nPicInfoBackLeft = 0; + m_nPicInfoBackUp = 0; + } + m_PicInfoBackVertex[0].w = m_PicInfoBackVertex[1].w = m_PicInfoBackVertex[2].w = m_PicInfoBackVertex[3].w = .5f; + m_PicInfoBackVertex[0].pos.z = m_PicInfoBackVertex[1].pos.z = m_PicInfoBackVertex[2].pos.z = m_PicInfoBackVertex[3].pos.z = 1.f; + m_PicInfoBackVertex[0].col = m_PicInfoBackVertex[1].col = m_PicInfoBackVertex[2].col = m_PicInfoBackVertex[3].col = m_dwPicInfoMinColor; + m_PicInfoBackVertex[0].pos.x = static_cast(m_nPicInfoBackLeft); + m_PicInfoBackVertex[0].pos.y = static_cast(m_nPicInfoBackUp); + m_PicInfoBackVertex[0].tu = 0.f; + m_PicInfoBackVertex[0].tv = 0.f; + + m_PicInfoBackVertex[1].pos.x = static_cast(m_nPicInfoBackLeft); + m_PicInfoBackVertex[1].pos.y = static_cast(m_nPicInfoBackUp + m_nPicInfoBackHeight); + m_PicInfoBackVertex[1].tu = 0.f; + m_PicInfoBackVertex[1].tv = 1.f ; + + m_PicInfoBackVertex[2].pos.x = static_cast(m_nPicInfoBackLeft + m_nPicInfoBackWidth); + m_PicInfoBackVertex[2].pos.y = static_cast(m_nPicInfoBackUp); + m_PicInfoBackVertex[2].tu = 1.f; + m_PicInfoBackVertex[2].tv = 0.f; + + m_PicInfoBackVertex[3].pos.x = static_cast(m_nPicInfoBackLeft + m_nPicInfoBackWidth); + m_PicInfoBackVertex[3].pos.y = static_cast(m_nPicInfoBackUp + m_nPicInfoBackHeight); + m_PicInfoBackVertex[3].tu = 1.f ; + m_PicInfoBackVertex[3].tv = 1.f ; + + // Icon + pA = AttributesPointer->GetAttributeClass("PicInfoIcon"); + if (pA != nullptr) + { + m_idPicInfoIconTexture = rs->TextureCreate(pA->GetAttribute("TextureName")); + m_nPicInfoIconhorzDiv = pA->GetAttributeAsDword("horzQ", 1); + m_nPicInfoIconvertDiv = pA->GetAttributeAsDword("vertQ", 1); + m_nPicInfoIconWidth = pA->GetAttributeAsDword("width", 64); + m_nPicInfoIconHeight = pA->GetAttributeAsDword("height", 64); + m_nPicInfoIconLeft = pA->GetAttributeAsDword("left", 0); + m_nPicInfoIconUp = pA->GetAttributeAsDword("top", 0); + } + else + { + m_idPicInfoIconTexture = -1L; + m_nPicInfoIconhorzDiv = 1; + m_nPicInfoIconvertDiv = 1; + m_nPicInfoIconWidth = 64; + m_nPicInfoIconHeight = 64; + m_nPicInfoIconLeft = 0; + m_nPicInfoIconUp = 0; + } + + FRECT texRect; + CalculateTexturePos(texRect, m_nPicInfoIconhorzDiv, m_nPicInfoIconvertDiv, m_nPicInfoIconIndex); + + m_PicInfoIconVertex[0].w = m_PicInfoIconVertex[1].w = m_PicInfoIconVertex[2].w = m_PicInfoIconVertex[3].w = .5f; + m_PicInfoIconVertex[0].pos.z = m_PicInfoIconVertex[1].pos.z = m_PicInfoIconVertex[2].pos.z = m_PicInfoIconVertex[3].pos.z = 1.f; + m_PicInfoIconVertex[0].col = m_PicInfoIconVertex[1].col = m_PicInfoIconVertex[2].col = m_PicInfoIconVertex[3].col = m_dwPicInfoMinColor; + m_PicInfoIconVertex[0].pos.x = static_cast(m_nPicInfoIconLeft); + m_PicInfoIconVertex[0].pos.y = static_cast(m_nPicInfoIconUp); + m_PicInfoIconVertex[0].tu = texRect.left; + m_PicInfoIconVertex[0].tv = texRect.top; + + m_PicInfoIconVertex[1].pos.x = static_cast(m_nPicInfoIconLeft); + m_PicInfoIconVertex[1].pos.y = static_cast(m_nPicInfoIconUp + m_nPicInfoIconHeight); + m_PicInfoIconVertex[1].tu = texRect.left; + m_PicInfoIconVertex[1].tv = texRect.bottom; + + m_PicInfoIconVertex[2].pos.x = static_cast(m_nPicInfoIconLeft + m_nPicInfoIconWidth); + m_PicInfoIconVertex[2].pos.y = static_cast(m_nPicInfoIconUp); + m_PicInfoIconVertex[2].tu = texRect.right; + m_PicInfoIconVertex[2].tv = texRect.top; + + m_PicInfoIconVertex[3].pos.x = static_cast(m_nPicInfoIconLeft + m_nPicInfoIconWidth); + m_PicInfoIconVertex[3].pos.y = static_cast(m_nPicInfoIconUp + m_nPicInfoIconHeight); + m_PicInfoIconVertex[3].tu = texRect.right; + m_PicInfoIconVertex[3].tv = texRect.bottom; + + //second line + m_PicInfoBackVertex1[0].w = m_PicInfoBackVertex1[1].w = m_PicInfoBackVertex1[2].w = m_PicInfoBackVertex1[3].w = .5f; + m_PicInfoBackVertex1[0].pos.z = m_PicInfoBackVertex1[1].pos.z = m_PicInfoBackVertex1[2].pos.z = m_PicInfoBackVertex1[3].pos.z = 1.f; + m_PicInfoBackVertex1[0].col = m_PicInfoBackVertex[1].col = m_PicInfoBackVertex1[2].col = m_PicInfoBackVertex1[3].col = m_dwPicInfoMinColor; + m_PicInfoBackVertex1[0].pos.x = static_cast(m_nPicInfoBackLeft); + m_PicInfoBackVertex1[0].pos.y = static_cast(m_nPicInfoBackUp) + static_cast(m_nPicInfoStringOffset); + m_PicInfoBackVertex1[0].tu = 0.f; + m_PicInfoBackVertex1[0].tv = 0.f; + + m_PicInfoBackVertex1[1].pos.x = static_cast(m_nPicInfoBackLeft); + m_PicInfoBackVertex1[1].pos.y = static_cast(m_nPicInfoBackUp + m_nPicInfoBackHeight) + static_cast(m_nPicInfoStringOffset); + m_PicInfoBackVertex1[1].tu = 0.f; + m_PicInfoBackVertex1[1].tv = 1.f ; + + m_PicInfoBackVertex1[2].pos.x = static_cast(m_nPicInfoBackLeft + m_nPicInfoBackWidth); + m_PicInfoBackVertex1[2].pos.y = static_cast(m_nPicInfoBackUp) + static_cast(m_nPicInfoStringOffset); + m_PicInfoBackVertex1[2].tu = 1.f; + m_PicInfoBackVertex1[2].tv = 0.f; + + m_PicInfoBackVertex1[3].pos.x = static_cast(m_nPicInfoBackLeft + m_nPicInfoBackWidth); + m_PicInfoBackVertex1[3].pos.y = static_cast(m_nPicInfoBackUp + m_nPicInfoBackHeight) + static_cast(m_nPicInfoStringOffset); + m_PicInfoBackVertex1[3].tu = 1.f ; + m_PicInfoBackVertex1[3].tv = 1.f ; + + + CalculateTexturePos(texRect, m_nPicInfoIconhorzDiv, m_nPicInfoIconvertDiv, m_nPicInfoIconIndex); + + m_PicInfoIconVertex1[0].w = m_PicInfoIconVertex1[1].w = m_PicInfoIconVertex1[2].w = m_PicInfoIconVertex1[3].w = .5f; + m_PicInfoIconVertex1[0].pos.z = m_PicInfoIconVertex1[1].pos.z = m_PicInfoIconVertex1[2].pos.z = m_PicInfoIconVertex1[3].pos.z = 1.f; + m_PicInfoIconVertex1[0].col = m_PicInfoIconVertex1[1].col = m_PicInfoIconVertex1[2].col = m_PicInfoIconVertex1[3].col = m_dwPicInfoMinColor; + m_PicInfoIconVertex1[0].pos.x = static_cast(m_nPicInfoIconLeft); + m_PicInfoIconVertex1[0].pos.y = static_cast(m_nPicInfoIconUp) + static_cast(m_nPicInfoStringOffset); + m_PicInfoIconVertex1[0].tu = texRect.left; + m_PicInfoIconVertex1[0].tv = texRect.top; + + m_PicInfoIconVertex1[1].pos.x = static_cast(m_nPicInfoIconLeft); + m_PicInfoIconVertex1[1].pos.y = static_cast(m_nPicInfoIconUp + m_nPicInfoIconHeight) + static_cast(m_nPicInfoStringOffset); + m_PicInfoIconVertex1[1].tu = texRect.left; + m_PicInfoIconVertex1[1].tv = texRect.bottom; + + m_PicInfoIconVertex1[2].pos.x = static_cast(m_nPicInfoIconLeft + m_nPicInfoIconWidth); + m_PicInfoIconVertex1[2].pos.y = static_cast(m_nPicInfoIconUp) + static_cast(m_nPicInfoStringOffset); + m_PicInfoIconVertex1[2].tu = texRect.right; + m_PicInfoIconVertex1[2].tv = texRect.top; + + m_PicInfoIconVertex1[3].pos.x = static_cast(m_nPicInfoIconLeft + m_nPicInfoIconWidth); + m_PicInfoIconVertex1[3].pos.y = static_cast(m_nPicInfoIconUp + m_nPicInfoIconHeight) + static_cast(m_nPicInfoStringOffset); + m_PicInfoIconVertex1[3].tu = texRect.right; + m_PicInfoIconVertex1[3].tv = texRect.bottom; + + + //3d line + m_PicInfoBackVertex2[0].w = m_PicInfoBackVertex2[1].w = m_PicInfoBackVertex2[2].w = m_PicInfoBackVertex2[3].w = .5f; + m_PicInfoBackVertex2[0].pos.z = m_PicInfoBackVertex2[1].pos.z = m_PicInfoBackVertex2[2].pos.z = m_PicInfoBackVertex2[3].pos.z = 1.f; + m_PicInfoBackVertex2[0].col = m_PicInfoBackVertex[1].col = m_PicInfoBackVertex2[2].col = m_PicInfoBackVertex2[3].col = m_dwPicInfoMinColor; + m_PicInfoBackVertex2[0].pos.x = static_cast(m_nPicInfoBackLeft); + m_PicInfoBackVertex2[0].pos.y = static_cast(m_nPicInfoBackUp) + static_cast(m_nPicInfoStringOffset*2); + m_PicInfoBackVertex2[0].tu = 0.f; + m_PicInfoBackVertex2[0].tv = 0.f; + + m_PicInfoBackVertex2[1].pos.x = static_cast(m_nPicInfoBackLeft); + m_PicInfoBackVertex2[1].pos.y = static_cast(m_nPicInfoBackUp + m_nPicInfoBackHeight) + static_cast(m_nPicInfoStringOffset*2); + m_PicInfoBackVertex2[1].tu = 0.f; + m_PicInfoBackVertex2[1].tv = 1.f ; + + m_PicInfoBackVertex2[2].pos.x = static_cast(m_nPicInfoBackLeft + m_nPicInfoBackWidth); + m_PicInfoBackVertex2[2].pos.y = static_cast(m_nPicInfoBackUp) + static_cast(m_nPicInfoStringOffset*2); + m_PicInfoBackVertex2[2].tu = 1.f; + m_PicInfoBackVertex2[2].tv = 0.f; + + m_PicInfoBackVertex2[3].pos.x = static_cast(m_nPicInfoBackLeft + m_nPicInfoBackWidth); + m_PicInfoBackVertex2[3].pos.y = static_cast(m_nPicInfoBackUp + m_nPicInfoBackHeight) + static_cast(m_nPicInfoStringOffset*2); + m_PicInfoBackVertex2[3].tu = 1.f ; + m_PicInfoBackVertex2[3].tv = 1.f ; + + + CalculateTexturePos(texRect, m_nPicInfoIconhorzDiv, m_nPicInfoIconvertDiv, m_nPicInfoIconIndex); + + m_PicInfoIconVertex2[0].w = m_PicInfoIconVertex2[1].w = m_PicInfoIconVertex2[2].w = m_PicInfoIconVertex2[3].w = .5f; + m_PicInfoIconVertex2[0].pos.z = m_PicInfoIconVertex2[1].pos.z = m_PicInfoIconVertex2[2].pos.z = m_PicInfoIconVertex2[3].pos.z = 1.f; + m_PicInfoIconVertex2[0].col = m_PicInfoIconVertex2[1].col = m_PicInfoIconVertex2[2].col = m_PicInfoIconVertex2[3].col = m_dwPicInfoMinColor; + m_PicInfoIconVertex2[0].pos.x = static_cast(m_nPicInfoIconLeft); + m_PicInfoIconVertex2[0].pos.y = static_cast(m_nPicInfoIconUp) + static_cast(m_nPicInfoStringOffset*2); + m_PicInfoIconVertex2[0].tu = texRect.left; + m_PicInfoIconVertex2[0].tv = texRect.top; + + m_PicInfoIconVertex2[1].pos.x = static_cast(m_nPicInfoIconLeft); + m_PicInfoIconVertex2[1].pos.y = static_cast(m_nPicInfoIconUp + m_nPicInfoIconHeight) + static_cast(m_nPicInfoStringOffset*2); + m_PicInfoIconVertex2[1].tu = texRect.left; + m_PicInfoIconVertex2[1].tv = texRect.bottom; + + m_PicInfoIconVertex2[2].pos.x = static_cast(m_nPicInfoIconLeft + m_nPicInfoIconWidth); + m_PicInfoIconVertex2[2].pos.y = static_cast(m_nPicInfoIconUp) + static_cast(m_nPicInfoStringOffset*2); + m_PicInfoIconVertex2[2].tu = texRect.right; + m_PicInfoIconVertex2[2].tv = texRect.top; + + m_PicInfoIconVertex2[3].pos.x = static_cast(m_nPicInfoIconLeft + m_nPicInfoIconWidth); + m_PicInfoIconVertex2[3].pos.y = static_cast(m_nPicInfoIconUp + m_nPicInfoIconHeight) + static_cast(m_nPicInfoStringOffset*2); + m_PicInfoIconVertex2[3].tu = texRect.right; + m_PicInfoIconVertex2[3].tv = texRect.bottom; + + + // Time Speed + // text + pA = AttributesPointer->GetAttributeClass("timespeedtext"); + if (pA != nullptr) + { + m_nTimeSpeedLeft = pA->GetAttributeAsDword("left", -1); + m_nTimeSpeedUp = pA->GetAttributeAsDword("up", 0); + m_TimeSpeedfontID = rs->LoadFont(pA->GetAttribute("font")); + m_fTimeSpeedFontScale = pA->GetAttributeAsFloat("fontscale", 1.f); + m_dwTimeSpeedColor = pA->GetAttributeAsDword("color", 0x00FFFFFF); + } + else + { + + m_nTimeSpeedLeft = 64; + m_nTimeSpeedUp = 0; + m_TimeSpeedfontID = -1L; + m_fTimeSpeedFontScale = 1.f; + m_dwTimeSpeedColor = 0x00FFFFFF; + } + + // icon + pA = AttributesPointer->GetAttributeClass("timespeedicon"); + if (pA != nullptr) + { + m_idTimeSpeedIconTexture = rs->TextureCreate(pA->GetAttribute("texturename")); + m_nTimeSpeedIconWidth = pA->GetAttributeAsDword("width", 64); + m_nTimeSpeedIconHeight = pA->GetAttributeAsDword("height", 64); + m_nTimeSpeedIconLeft = pA->GetAttributeAsDword("left", 0); + m_nTimeSpeedIconUp = pA->GetAttributeAsDword("top", 0); + m_dwTimeSpeedIconColor = pA->GetAttributeAsDword("color", 0x00FFFFFF); + } + else + { + m_idTimeSpeedIconTexture = -1L; + m_nTimeSpeedIconWidth = 64; + m_nTimeSpeedIconHeight = 64; + m_nTimeSpeedIconLeft = 0; + m_nTimeSpeedIconUp = 0; + m_dwTimeSpeedIconColor = 0x00FFFFFF; + } + + m_TimeSpeedIconVertex[0].w = m_TimeSpeedIconVertex[1].w = m_TimeSpeedIconVertex[2].w = m_TimeSpeedIconVertex[3].w = .5f; + m_TimeSpeedIconVertex[0].pos.z = m_TimeSpeedIconVertex[1].pos.z = m_TimeSpeedIconVertex[2].pos.z = m_TimeSpeedIconVertex[3].pos.z = 1.f; + m_TimeSpeedIconVertex[0].col = m_TimeSpeedIconVertex[1].col = m_TimeSpeedIconVertex[2].col = m_TimeSpeedIconVertex[3].col = m_dwTimeSpeedIconColor; + m_TimeSpeedIconVertex[0].pos.x = static_cast(m_nTimeSpeedIconLeft); + m_TimeSpeedIconVertex[0].pos.y = static_cast(m_nTimeSpeedIconUp); + m_TimeSpeedIconVertex[0].tu = 0.f; + m_TimeSpeedIconVertex[0].tv = 0.f; + + m_TimeSpeedIconVertex[1].pos.x = static_cast(m_nTimeSpeedIconLeft); + m_TimeSpeedIconVertex[1].pos.y = static_cast(m_nTimeSpeedIconUp + m_nTimeSpeedIconHeight); + m_TimeSpeedIconVertex[1].tu = 0.f; + m_TimeSpeedIconVertex[1].tv = 1.f ; + + m_TimeSpeedIconVertex[2].pos.x = static_cast(m_nTimeSpeedIconLeft + m_nTimeSpeedIconWidth); + m_TimeSpeedIconVertex[2].pos.y = static_cast(m_nTimeSpeedIconUp); + m_TimeSpeedIconVertex[2].tu = 1.f; + m_TimeSpeedIconVertex[2].tv = 0.f; + + m_TimeSpeedIconVertex[3].pos.x = static_cast(m_nTimeSpeedIconLeft + m_nTimeSpeedIconWidth); + m_TimeSpeedIconVertex[3].pos.y = static_cast(m_nTimeSpeedIconUp + m_nTimeSpeedIconHeight); + m_TimeSpeedIconVertex[3].tu = 1.f ; + m_TimeSpeedIconVertex[3].tv = 1.f ; + + //level up + //backimage + pA = AttributesPointer->GetAttributeClass("levelupback"); + if (pA != nullptr) + { + m_idLUBackTexture = rs->TextureCreate(pA->GetAttribute("texturename")); + m_nLUBackWidth = pA->GetAttributeAsDword("width", 64); + m_nLUBackHeight = pA->GetAttributeAsDword("height", 64); + m_nLUBackLeft = pA->GetAttributeAsDword("left", 0); + m_nLUBackUp = pA->GetAttributeAsDword("top", 0); + m_dwLUBackColor = pA->GetAttributeAsDword("color", 0x00FFFFFF); + } + else + { + m_idLUBackTexture = -1L; + m_nLUBackWidth = 64; + m_nLUBackHeight = 64; + m_nLUBackLeft = 0; + m_nLUBackUp = 0; + m_dwLUBackColor = 0x00FFFFFF; + } + + m_LUBackVertex[0].w = m_LUBackVertex[1].w = m_LUBackVertex[2].w = m_LUBackVertex[3].w = .5f; + m_LUBackVertex[0].pos.z = m_LUBackVertex[1].pos.z = m_LUBackVertex[2].pos.z = m_LUBackVertex[3].pos.z = 1.f; + m_LUBackVertex[0].col = m_LUBackVertex[1].col = m_LUBackVertex[2].col = m_LUBackVertex[3].col = m_dwLUBackColor; + m_LUBackVertex[0].pos.x = static_cast(m_nLUBackLeft); + m_LUBackVertex[0].pos.y = static_cast(m_nLUBackUp); + m_LUBackVertex[0].tu = 0.f; + m_LUBackVertex[0].tv = 0.f; + + m_LUBackVertex[1].pos.x = static_cast(m_nLUBackLeft); + m_LUBackVertex[1].pos.y = static_cast(m_nLUBackUp + m_nLUBackHeight); + m_LUBackVertex[1].tu = 0.f; + m_LUBackVertex[1].tv = 1.f ; + + m_LUBackVertex[2].pos.x = static_cast(m_nLUBackLeft + m_nLUBackWidth); + m_LUBackVertex[2].pos.y = static_cast(m_nLUBackUp); + m_LUBackVertex[2].tu = 1.f; + m_LUBackVertex[2].tv = 0.f; + + m_LUBackVertex[3].pos.x = static_cast(m_nLUBackLeft + m_nLUBackWidth); + m_LUBackVertex[3].pos.y = static_cast(m_nLUBackUp + m_nLUBackHeight); + m_LUBackVertex[3].tu = 1.f ; + m_LUBackVertex[3].tv = 1.f ; + + //string + pA = AttributesPointer->GetAttributeClass("levelupstring"); + if (pA != nullptr) + { + m_nLUStringLeft = pA->GetAttributeAsDword("left", -1); + m_fLUStringSpeed = pA->GetAttributeAsFloat("color_speed", 1.f / 50.f); + m_nLUStringUp = pA->GetAttributeAsDword("up", 0); + m_LUStringfontID = rs->LoadFont(pA->GetAttribute("font")); + m_fLUStringFontScale = pA->GetAttributeAsFloat("fontscale", 1.f); + m_dwLUStringColor = pA->GetAttributeAsDword("color", 0x00FFFFFF); + } + else + { + + m_nLUStringLeft = 64; + m_nLUStringUp = 0; + m_LUStringfontID = -1L; + m_fLUStringFontScale = 1.f; + m_dwLUStringColor = 0x00FFFFFF; + m_fLUStringSpeed = 1.f / 50.f; + } + + //rank + pA = AttributesPointer->GetAttributeClass("leveluprank"); + if (pA != nullptr) + { + m_nLURankLeft = pA->GetAttributeAsDword("left", -1); + m_nLURankUp = pA->GetAttributeAsDword("up", 0); + m_LURankfontID = rs->LoadFont(pA->GetAttribute("font")); + m_fLURankFontScale = pA->GetAttributeAsFloat("fontscale", 1.f); + m_dwLURankColor = pA->GetAttributeAsDword("color", 0x00FFFFFF); + } + else + { + + m_nLURankLeft = 64; + m_nLURankUp = 0; + m_LURankfontID = -1L; + m_fLURankFontScale = 1.f; + m_dwLURankColor = 0x00FFFFFF; + } + + AlphaLU = 0.f; } void ILogAndActions::ActionChange(bool bFastComShow, bool bLogStringShow) @@ -395,11 +1023,70 @@ void ILogAndActions::ActionChange(bool bFastComShow, bool bLogStringShow) m_IconVertex[2].tu = m_IconVertex[3].tu = 1.f / static_cast(m_horzDiv); m_IconVertex[0].tv = m_IconVertex[2].tv = 0.f; m_IconVertex[1].tv = m_IconVertex[3].tv = 1.f / static_cast(m_vertDiv); + + //backimage + pA = AttributesPointer->GetAttributeClass("ActiveActionsBack"); + if (pA != nullptr) + { + m_idActionBackTexture = rs->TextureCreate(pA->GetAttribute("TextureName")); + m_nActionBackWidth = pA->GetAttributeAsDword("width", 64); + m_nActionBackHeight = pA->GetAttributeAsDword("height", 64); + m_nActionBackCentr = pA->GetAttributeAsDword("centr", 0); + m_nActionBackUp = pA->GetAttributeAsDword("top", 0); + m_dwActionBackColor = pA->GetAttributeAsDword("color", 0x00FFFFFF); + } + else + { + m_idActionBackTexture = -1L; + m_nActionBackWidth = 64; + m_nActionBackHeight = 64; + m_nActionBackCentr = 0; + m_nActionBackUp = 0; + m_dwActionBackColor = 0x00FFFFFF; + } + + m_ActionBackVertex[0].w = m_ActionBackVertex[1].w = m_ActionBackVertex[2].w = m_ActionBackVertex[3].w = .5f; + m_ActionBackVertex[0].pos.z = m_ActionBackVertex[1].pos.z = m_ActionBackVertex[2].pos.z = m_ActionBackVertex[3].pos.z = 1.f; + m_ActionBackVertex[0].col = m_ActionBackVertex[1].col = m_ActionBackVertex[2].col = m_ActionBackVertex[3].col = m_dwActionBackColor; + m_ActionBackVertex[0].pos.x = static_cast(m_nActionBackCentr); + m_ActionBackVertex[0].pos.y = static_cast(m_nActionBackUp); + m_ActionBackVertex[0].tu = 0.f; + m_ActionBackVertex[0].tv = 0.f; + + m_ActionBackVertex[1].pos.x = static_cast(m_nActionBackCentr); + m_ActionBackVertex[1].pos.y = static_cast(m_nActionBackUp + m_nActionBackHeight); + m_ActionBackVertex[1].tu = 0.f; + m_ActionBackVertex[1].tv = 1.f ; + + m_ActionBackVertex[2].pos.x = static_cast(m_nActionBackCentr + m_nActionBackWidth); + m_ActionBackVertex[2].pos.y = static_cast(m_nActionBackUp); + m_ActionBackVertex[2].tu = 1.f; + m_ActionBackVertex[2].tv = 0.f; + + m_ActionBackVertex[3].pos.x = static_cast(m_nActionBackCentr + m_nActionBackWidth); + m_ActionBackVertex[3].pos.y = static_cast(m_nActionBackUp + m_nActionBackHeight); + m_ActionBackVertex[3].tu = 1.f ; + m_ActionBackVertex[3].tv = 1.f ; + + const int32_t nOffset = rs->StringWidth(m_ActionHint2.sText.c_str(), m_ActionHint2.nFont, m_ActionHint2.fScale, 0); + m_ActionBackVertex[0].pos.x = static_cast(m_nActionBackCentr) - static_cast(nOffset/2) - static_cast(m_nActionBackWidth); + + m_ActionBackVertex[1].pos.x = static_cast(m_nActionBackCentr) - static_cast(nOffset/2) - static_cast(m_nActionBackWidth); + + m_ActionBackVertex[2].pos.x = static_cast(m_nActionBackCentr) + static_cast(nOffset/2) + static_cast(m_nActionBackWidth); + + m_ActionBackVertex[3].pos.x = static_cast(m_nActionBackCentr) + static_cast(nOffset/2) + static_cast(m_nActionBackWidth); } void ILogAndActions::Release() { TEXTURE_RELEASE(rs, m_idIconTexture); + TEXTURE_RELEASE(rs, m_idPicInfoBackTexture); + TEXTURE_RELEASE(rs, m_idPicInfoIconTexture); + TEXTURE_RELEASE(rs, m_idTimeSpeedIconTexture); + TEXTURE_RELEASE(rs, m_idLUBackTexture); + TEXTURE_RELEASE(rs, m_idActionBackTexture); + rs->UnloadFont(m_fontID); while (m_sRoot != nullptr) @@ -409,9 +1096,25 @@ void ILogAndActions::Release() STORM_DELETE(p->str); delete p; } + + rs->UnloadFont(m_PicInfofontID); + while (m_pRoot != nullptr) + { + STRING_DESCR *pp = m_pRoot; + m_pRoot = pp->next; + STORM_DELETE(pp->str); + delete pp; + } + + rs->UnloadFont(m_TimeSpeedfontID); + m_ActionHint1.Release(); m_ActionHint2.Release(); rs = nullptr; + + PIstage = 0; + + bShowTimeSpeed = false; } void ILogAndActions::SetString(const char *str, bool immortal) @@ -445,7 +1148,7 @@ void ILogAndActions::SetString(const char *str, bool immortal) } strcpy_s(newDescr->str, len, str); // set the maximum visibility - if (immortal) + if (immortal) newDescr->alpha = 10000.f; else newDescr->alpha = 255.f; @@ -480,6 +1183,149 @@ void ILogAndActions::SetString(const char *str, bool immortal) } } +void ILogAndActions::SetPicInfo(const char *str) +{ + if (str == nullptr) + return; + + // find the last element of the list + STRING_DESCR *last = m_pRoot; + if (last != nullptr) + while (last->next != nullptr) + last = last->next; + + // Return if such a line already exists and it is last + if (last != nullptr && last->str != nullptr && storm::iEquals(last->str, str)) + return; + + PIstage++; + FRECT texRect; + if(PIstage == 1) + { + if(AlphaBI < 0.1f) + { + AlphaBI = 255.f; + m_PicInfoBackVertex[0].col = m_PicInfoBackVertex[1].col = m_PicInfoBackVertex[2].col = m_PicInfoBackVertex[3].col = m_dwPicInfoMaxColor; + m_PicInfoIconVertex[0].col = m_PicInfoIconVertex[1].col = m_PicInfoIconVertex[2].col = m_PicInfoIconVertex[3].col = m_dwPicInfoMaxColor; + + + CalculateTexturePos(texRect, m_nPicInfoIconhorzDiv, m_nPicInfoIconvertDiv, m_nPicInfoIconIndex); + + m_PicInfoIconVertex[0].tu = texRect.left; + m_PicInfoIconVertex[0].tv = texRect.top; + + m_PicInfoIconVertex[1].tu = texRect.left; + m_PicInfoIconVertex[1].tv = texRect.bottom; + + m_PicInfoIconVertex[2].tu = texRect.right; + m_PicInfoIconVertex[2].tv = texRect.top; + + m_PicInfoIconVertex[3].tu = texRect.right; + m_PicInfoIconVertex[3].tv = texRect.bottom; + } + } + + if(PIstage == 2) + { + if(AlphaBI2 < 0.1f) + { + AlphaBI2 = 255.f; + m_PicInfoBackVertex1[0].col = m_PicInfoBackVertex1[1].col = m_PicInfoBackVertex1[2].col = m_PicInfoBackVertex1[3].col = m_dwPicInfoMaxColor; + m_PicInfoIconVertex1[0].col = m_PicInfoIconVertex1[1].col = m_PicInfoIconVertex1[2].col = m_PicInfoIconVertex1[3].col = m_dwPicInfoMaxColor; + + CalculateTexturePos(texRect, m_nPicInfoIconhorzDiv, m_nPicInfoIconvertDiv, m_nPicInfoIconIndex); + + m_PicInfoIconVertex1[0].tu = texRect.left; + m_PicInfoIconVertex1[0].tv = texRect.top; + + m_PicInfoIconVertex1[1].tu = texRect.left; + m_PicInfoIconVertex1[1].tv = texRect.bottom; + + m_PicInfoIconVertex1[2].tu = texRect.right; + m_PicInfoIconVertex1[2].tv = texRect.top; + + m_PicInfoIconVertex1[3].tu = texRect.right; + m_PicInfoIconVertex1[3].tv = texRect.bottom; + } + } + + if(PIstage == 3) + { + if(AlphaBI3 < 0.1f) + { + AlphaBI3 = 255.f; + m_PicInfoBackVertex2[0].col = m_PicInfoBackVertex2[1].col = m_PicInfoBackVertex2[2].col = m_PicInfoBackVertex2[3].col = m_dwPicInfoMaxColor; + m_PicInfoIconVertex2[0].col = m_PicInfoIconVertex2[1].col = m_PicInfoIconVertex2[2].col = m_PicInfoIconVertex2[3].col = m_dwPicInfoMaxColor; + + CalculateTexturePos(texRect, m_nPicInfoIconhorzDiv, m_nPicInfoIconvertDiv, m_nPicInfoIconIndex); + + m_PicInfoIconVertex2[0].tu = texRect.left; + m_PicInfoIconVertex2[0].tv = texRect.top; + + m_PicInfoIconVertex2[1].tu = texRect.left; + m_PicInfoIconVertex2[1].tv = texRect.bottom; + + m_PicInfoIconVertex2[2].tu = texRect.right; + m_PicInfoIconVertex2[2].tv = texRect.top; + + m_PicInfoIconVertex2[3].tu = texRect.right; + m_PicInfoIconVertex2[3].tv = texRect.bottom; + } + } + // create a new line descriptor + auto *newDescr = new STRING_DESCR; + if (newDescr == nullptr) + { + throw std::runtime_error("Allocate memory error"); + } + // it will be the last on the list + newDescr->next = nullptr; + // add the specified string to it + const auto len = strlen(str) + 1; + if ((newDescr->str = new char[len]) == nullptr) + { + throw std::runtime_error("Allocate memory error"); + } + strcpy_s(newDescr->str, len, str); + // set the maximum visibility + newDescr->alpha = 255.f; + + // if the list is empty, put the string as the root + if (last == nullptr) + { + newDescr->offset = static_cast(m_nPicInfoStringBegin); + m_pRoot = newDescr; + } + // otherwise add it to the end of the list + else + { + newDescr->offset = last->offset + m_nPicInfoStringOffset; + last->next = newDescr; + if (newDescr->offset + m_nPicInfoStringOffset > m_nPicInfoWindowHeight) + { + const int32_t offsetDelta = static_cast(newDescr->offset) + m_nPicInfoStringOffset - m_nPicInfoWindowHeight; + for (STRING_DESCR *tmpDescr = m_pRoot; tmpDescr != nullptr;) + { + if ((tmpDescr->offset -= offsetDelta) < 0) + { + m_pRoot = tmpDescr->next; + STORM_DELETE(tmpDescr->str); + delete tmpDescr; + tmpDescr = m_pRoot; + continue; + } + tmpDescr = tmpDescr->next; + } + } + } + +} + +void ILogAndActions::SetLevelUp() +{ + AlphaLU = 255.f; +} + void ILogAndActions::SetAction(const char *actionName) { ATTRIBUTES *pA; @@ -523,4 +1369,14 @@ void ILogAndActions::SetAction(const char *actionName) m_ActionHint1.Init(rs, nullptr); m_ActionHint2.Init(rs, nullptr); } + + const int32_t nOffset = rs->StringWidth(m_ActionHint2.sText.c_str(), m_ActionHint2.nFont, m_ActionHint2.fScale, 0); + m_ActionBackVertex[0].pos.x = static_cast(m_nActionBackCentr) - static_cast(nOffset/2) - static_cast(m_nActionBackWidth); + + m_ActionBackVertex[1].pos.x = static_cast(m_nActionBackCentr) - static_cast(nOffset/2) - static_cast(m_nActionBackWidth); + + m_ActionBackVertex[2].pos.x = static_cast(m_nActionBackCentr) + static_cast(nOffset/2) + static_cast(m_nActionBackWidth); + + m_ActionBackVertex[3].pos.x = static_cast(m_nActionBackCentr) + static_cast(nOffset/2) + static_cast(m_nActionBackWidth); + } diff --git a/src/libs/battle_interface/src/log_and_action.h b/src/libs/battle_interface/src/log_and_action.h index 065667700..79cad8a42 100644 --- a/src/libs/battle_interface/src/log_and_action.h +++ b/src/libs/battle_interface/src/log_and_action.h @@ -47,6 +47,8 @@ class ILogAndActions : public Entity void Release(); void SetString(const char *str, bool immortal); + void SetPicInfo(const char *str); + void SetLevelUp(); void SetAction(const char *actionName); protected: @@ -88,4 +90,116 @@ class ILogAndActions : public Entity BITextInfo m_ActionHint1; BITextInfo m_ActionHint2; + + // backimage for actions + int32_t m_nActionBackWidth; // X texture size + int32_t m_nActionBackHeight; // Y texture size + int32_t m_nActionBackCentr; + int32_t m_nActionBackUp; + int32_t m_idActionBackTexture; + uint32_t m_dwActionBackColor; + std::string ALtype; + BI_COLOR_VERTEX m_ActionBackVertex[4]; + + + + // pic info + // strings parameters----------------------- + int32_t m_nPicInfoWindowWidth; // X window size + int32_t m_nPicInfoWindowHeight; // Y window size + int32_t m_nPicInfoWindowLeft; + int32_t m_nPicInfoWindowRight; + int32_t m_nPicInfoWindowUp; + int32_t m_PicInfofontID; + float m_fPicInfoFontScale; + uint32_t m_dwPicInfoColor; + int32_t m_nPicInfoStringBegin; + int32_t m_nPicInfoStringOffset; + float m_fPicInfoShiftSpeed; + float m_fPicInfoBlendSpeed; + STRING_DESCR *m_pRoot; + + // backimage param + uint32_t m_dwPicInfoMaxColor; + uint32_t m_dwPicInfoMinColor; + int32_t m_nPicInfoBackWidth; // X texture size + int32_t m_nPicInfoBackHeight; // Y texture size + int32_t m_nPicInfoBackLeft; + int32_t m_nPicInfoBackUp; + int32_t m_idPicInfoBackTexture; + BI_COLOR_VERTEX m_PicInfoBackVertex[4]; + BI_COLOR_VERTEX m_PicInfoBackVertex1[4]; + BI_COLOR_VERTEX m_PicInfoBackVertex2[4]; + float AlphaBI; + float AlphaBI2; + float AlphaBI3; + + // icon param + int32_t m_nPicInfoIconWidth; // X texture size + int32_t m_nPicInfoIconHeight; // Y texture size + int32_t m_nPicInfoIconLeft; + int32_t m_nPicInfoIconUp; + int32_t m_idPicInfoIconTexture; + int32_t m_nPicInfoIconhorzDiv; + int32_t m_nPicInfoIconvertDiv; + int8_t m_nPicInfoIconIndex; + BI_COLOR_VERTEX m_PicInfoIconVertex[4]; + BI_COLOR_VERTEX m_PicInfoIconVertex1[4]; + BI_COLOR_VERTEX m_PicInfoIconVertex2[4]; + + int8_t PIstage; + + // time speed + // texture + bool bShowTimeSpeed; + int32_t m_nTimeSpeedIconWidth; // X icon size + int32_t m_nTimeSpeedIconHeight; // Y icon size + int32_t m_nTimeSpeedIconLeft; + //int32_t m_nTimeSpeedIconRight; + int32_t m_nTimeSpeedIconUp; + int32_t m_idTimeSpeedIconTexture; + uint32_t m_dwTimeSpeedIconColor; + BI_COLOR_VERTEX m_TimeSpeedIconVertex[4]; + // text + int32_t m_nTimeSpeedLeft; + //int32_t m_nTimeSpeedRight; + int32_t m_nTimeSpeedUp; + int32_t m_TimeSpeedfontID; + float m_fTimeSpeedFontScale; + uint32_t m_dwTimeSpeedColor; + std::string TimeSpeedText; + + + // level up + //backimage + uint32_t m_dwLUBackColor; + //uint32_t m_dwPicInfoMinColor; + int32_t m_nLUBackWidth; // X texture size + int32_t m_nLUBackHeight; // Y texture size + int32_t m_nLUBackLeft; + int32_t m_nLUBackUp; + int32_t m_idLUBackTexture; + BI_COLOR_VERTEX m_LUBackVertex[4]; + float AlphaLU; + + // string + int32_t m_nLUStringLeft; + int32_t m_nLUStringUp; + int32_t m_LUStringfontID; + float m_fLUStringFontScale; + uint32_t m_dwLUStringColor; + float m_fLUStringSpeed; + std::string LUStringText; + + //rank + int32_t m_nLURankLeft; + int32_t m_nLURankUp; + int32_t m_LURankfontID; + float m_fLURankFontScale; + uint32_t m_dwLURankColor; + //float m_fLURankSpeed; + std::string LURankText; + + + }; diff --git a/src/libs/shared_headers/include/shared/battle_interface/log_msg.h b/src/libs/shared_headers/include/shared/battle_interface/log_msg.h index 2cf3a9baa..69bfb187c 100644 --- a/src/libs/shared_headers/include/shared/battle_interface/log_msg.h +++ b/src/libs/shared_headers/include/shared/battle_interface/log_msg.h @@ -9,3 +9,6 @@ #define LI_CLEAR_STRINGS 45028 // "" // "s..." for different messages "SetTimeScale", float fScale #define LI_OTHER_MSG 45029 +#define LOG_ADD_PIC 45030 +#define LOG_TIME_SPEED 45031 +#define LOG_LEVEL_UP 45032 \ No newline at end of file From 113fd1b2eb5c8d6a3210dd4b7df63dbf4dee20e1 Mon Sep 17 00:00:00 2001 From: Blackmark3000 Date: Mon, 6 Feb 2023 19:07:39 +0300 Subject: [PATCH 11/14] =?UTF-8?q?=D0=A0=D0=B0=D0=B7=D0=BD=D0=B0=D1=8F=20?= =?UTF-8?q?=D0=BC=D0=B5=D0=BB=D0=BE=D1=87=D1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/libs/battle_interface/include/bi_utils.h | 4 +-- src/libs/battle_interface/src/bi_utils.cpp | 27 ++++--------------- .../src/sea/battle_ship_sign.cpp | 2 +- 3 files changed, 8 insertions(+), 25 deletions(-) diff --git a/src/libs/battle_interface/include/bi_utils.h b/src/libs/battle_interface/include/bi_utils.h index ec87f7e93..602c07800 100644 --- a/src/libs/battle_interface/include/bi_utils.h +++ b/src/libs/battle_interface/include/bi_utils.h @@ -24,6 +24,7 @@ class BITextInfo final float fScale; int32_t nFont; uint32_t dwColor; + int32_t nAlign; bool bShadow; ATTRIBUTES *pARefresh; @@ -107,8 +108,7 @@ class BIUtils static bool GetIntervalRect(float fk, const FRECT &r1, const FRECT &r2, FRECT &rOut); static int32_t GetMaxFromFourLong(int32_t n1, int32_t n2, int32_t n3, int32_t n4); - static int32_t GetMaxFromSevenLong(int32_t n1, int32_t n2, int32_t n3, int32_t n4, int32_t n5, int32_t n6, int32_t n7); - + static float GetFromStr_Float(const char *&pcStr, float fDefault); static void FillTextInfoArray(VDX9RENDER *pRS, ATTRIBUTES *pA, std::vector &tia); diff --git a/src/libs/battle_interface/src/bi_utils.cpp b/src/libs/battle_interface/src/bi_utils.cpp index 40fcc45f4..be770e377 100644 --- a/src/libs/battle_interface/src/bi_utils.cpp +++ b/src/libs/battle_interface/src/bi_utils.cpp @@ -245,25 +245,6 @@ int32_t BIUtils::GetMaxFromFourLong(int32_t n1, int32_t n2, int32_t n3, int32_t return n4; } -int32_t BIUtils::GetMaxFromSevenLong(int32_t n1, int32_t n2, int32_t n3, int32_t n4, int32_t n5, int32_t n6, int32_t n7) -{ - int32_t max = n1; - - if (maxGetAttributeAsFloat("scale", 1.f); dwColor = pA->GetAttributeAsDword("color", 0xFFFFFFFF); bShadow = pA->GetAttributeAsDword("shadow", 1) != 0; - + nAlign = BIUtils::GetAlignmentFromAttr(pA, "align", PR_ALIGN_CENTER); + ATTRIBUTES *pAttr = pA->GetAttributeClass("pos"); if (pAttr) { @@ -388,6 +370,7 @@ void BITextInfo::Print() const char *textAttr = pARefresh->GetAttribute("text"); sText = textAttr ? textAttr : ""; dwColor = pARefresh->GetAttributeAsDword("color", 0xFFFFFFFF); + nAlign = BIUtils::GetAlignmentFromAttr(pARefresh, "align", PR_ALIGN_CENTER); ATTRIBUTES *pAttr = pARefresh->GetAttributeClass("pos"); if (pAttr) { @@ -400,7 +383,7 @@ void BITextInfo::Print() } } if (!sText.empty()) - pRS->ExtPrint(nFont, dwColor, 0, PR_ALIGN_CENTER, bShadow, fScale, 0, 0, pos.x, pos.y, "%s", sText.c_str()); + pRS->ExtPrint(nFont, dwColor, 0, nAlign, bShadow, fScale, 0, 0, pos.x, pos.y, "%s", sText.c_str()); } } @@ -408,7 +391,7 @@ void BITextInfo::Print(std::string outputText) { if (nFont != -1 && !outputText.empty()) { - pRS->ExtPrint(nFont, dwColor, 0, PR_ALIGN_CENTER, bShadow, fScale, 0, 0, pos.x, pos.y, "%s", + pRS->ExtPrint(nFont, dwColor, 0, nAlign, bShadow, fScale, 0, 0, pos.x, pos.y, "%s", outputText.c_str()); } } diff --git a/src/libs/battle_interface/src/sea/battle_ship_sign.cpp b/src/libs/battle_interface/src/sea/battle_ship_sign.cpp index 427b3fbf0..d08fcd2eb 100644 --- a/src/libs/battle_interface/src/sea/battle_ship_sign.cpp +++ b/src/libs/battle_interface/src/sea/battle_ship_sign.cpp @@ -650,7 +650,7 @@ void BIShipIcon::UpdateBuffers(int32_t nShipQ) const int32_t nShipSquareQ = nShipQ; const int32_t nMaxSquareQ = - BIUtils::GetMaxFromSevenLong(nBackSquareQ, nBackMCSquareQ, nShipStateBackSquareQ, nShipStateSquareQ, nMCShipStateSquareQ, nShipClassSquareQ, nShipSquareQ); + std::max({nBackSquareQ, nBackMCSquareQ, nShipStateBackSquareQ, nShipStateSquareQ, nMCShipStateSquareQ, nShipClassSquareQ, nShipSquareQ}); if (m_nMaxSquareQ != nMaxSquareQ) { m_nMaxSquareQ = nMaxSquareQ; From be3f5d70558f774595e70f5a6fcb66a2a60c758a Mon Sep 17 00:00:00 2001 From: Blackmark3000 Date: Tue, 7 Feb 2023 14:49:41 +0300 Subject: [PATCH 12/14] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=BE=20=D0=BC=D0=B8=D0=B3=D0=B0=D0=BD=D0=B8=D0=B5?= =?UTF-8?q?=20=D0=BD=D0=B5=D0=B7=D0=B0=D1=80=D1=8F=D0=B6=D0=B5=D0=BD=D0=BD?= =?UTF-8?q?=D0=BE=D0=BC=D1=83=20=D0=B1=D0=BE=D1=80=D1=82=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sea_ai/src/ai_ship_cannon_controller.cpp | 26 ++++++++++++++++--- .../sea_ai/src/ai_ship_cannon_controller.h | 7 +++-- src/libs/sea_ai/src/sea_ai.cpp | 2 ++ 3 files changed, 30 insertions(+), 5 deletions(-) diff --git a/src/libs/sea_ai/src/ai_ship_cannon_controller.cpp b/src/libs/sea_ai/src/ai_ship_cannon_controller.cpp index d3823bca4..113854a80 100644 --- a/src/libs/sea_ai/src/ai_ship_cannon_controller.cpp +++ b/src/libs/sea_ai/src/ai_ship_cannon_controller.cpp @@ -11,7 +11,12 @@ int AIShipCannonController::ColorA = 0; int AIShipCannonController::ColorR = 0; int AIShipCannonController::ColorNA = 0; int AIShipCannonController::ColorNR = 0; +int AIShipCannonController::blinkcol = 0; +float alpha = 0.0f; +float AIShipCannonController::blinkUP = 0.0003f; +float AIShipCannonController::blinkDOWN = 0.003f; bool AIShipCannonController::bShowCannonsRange = true; +bool bUp = true; AIShipCannonController::AIShipCannonController(AIShip *_pShip) : bReload(false), bNotEnoughBalls(false) { @@ -680,11 +685,26 @@ void AIShipCannonController::Realize(float fDeltaTime) RotateAroundY(v[2].x, v[2].z, vZ.z, vZ.x); v[2] += v[0]; - if(debugDrawToggle) ColorA = ColorR = ColorNA = ColorNR = ARGB(0x0F, 0x90, 0xEE, 0x90); + if(debugDrawToggle) ColorA = ColorR = ColorNA = ColorNR = ARGB(0x0F, 0x90, 0xEE, 0x90); + if(!bort.isCharged()) + { + blinkcol = (ColorNR >> 24); + if(bUp) + { + alpha += blinkUP * core.GetDeltaTime(); + if(alpha > blinkcol) bUp = false; + } + else + { + alpha -= blinkDOWN * core.GetDeltaTime(); + if(alpha < 0) bUp = true; + } + blinkcol = ColorNA + (static_cast(alpha) << 24); + } Verts.emplace_back(tr_vertex{v[0], bort.isCharged() ? static_cast(ColorA) : static_cast(ColorNA)}); - Verts.emplace_back(tr_vertex{v[1], bort.isCharged() ? static_cast(ColorR) : static_cast(ColorNR)}); - Verts.emplace_back(tr_vertex{v[2], bort.isCharged() ? static_cast(ColorR) : static_cast(ColorNR)}); + Verts.emplace_back(tr_vertex{v[1], bort.isCharged() ? static_cast(ColorR) : static_cast(blinkcol)}); + Verts.emplace_back(tr_vertex{v[2], bort.isCharged() ? static_cast(ColorR) : static_cast(blinkcol)}); } } } diff --git a/src/libs/sea_ai/src/ai_ship_cannon_controller.h b/src/libs/sea_ai/src/ai_ship_cannon_controller.h index 48876ea39..3ac66f424 100644 --- a/src/libs/sea_ai/src/ai_ship_cannon_controller.h +++ b/src/libs/sea_ai/src/ai_ship_cannon_controller.h @@ -134,7 +134,7 @@ class AIShipCannonController // init section bool Init(ATTRIBUTES *_pAShip); - + uint32_t GetIntervalColor(uint32_t minV, uint32_t maxV, float fpar); void SetAIShip(AIShip *pShip) { pOurAIShip = pShip; @@ -151,8 +151,11 @@ class AIShipCannonController static float fMaxCannonDamageDistance; static float fMaxCannonDamageRadiusPoint; - static int ColorA, ColorR, ColorNA, ColorNR; + static int ColorA, ColorR, ColorNA, ColorNR, blinkcol; static bool bShowCannonsRange; + float alpha; + static float blinkUP; + static float blinkDOWN; void Save(CSaveLoad *pSL); void Load(CSaveLoad *pSL); diff --git a/src/libs/sea_ai/src/sea_ai.cpp b/src/libs/sea_ai/src/sea_ai.cpp index 08acb18ff..a84a6e52a 100644 --- a/src/libs/sea_ai/src/sea_ai.cpp +++ b/src/libs/sea_ai/src/sea_ai.cpp @@ -345,6 +345,8 @@ uint64_t SEA_AI::ProcessMessage(MESSAGE &message) AIShipCannonController::ColorR = message.Long(); AIShipCannonController::ColorNA = message.Long(); AIShipCannonController::ColorNR = message.Long(); + AIShipCannonController::blinkUP = message.Float(); + AIShipCannonController::blinkDOWN = message.Float(); AIShipCannonController::bShowCannonsRange = (message.Long() != 0); break; // boal 08.08.06 method of recounting guns on the ship <-- From e00a26a5d52f56036fcbd87d428226a72acebee9 Mon Sep 17 00:00:00 2001 From: Blackmark3000 Date: Tue, 7 Feb 2023 15:36:51 +0300 Subject: [PATCH 13/14] =?UTF-8?q?=D1=83=D0=B4=D0=B0=D0=BB=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20=D0=BB=D0=B8=D1=88=D0=BD=D0=B5=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/libs/sea_ai/src/ai_ship_cannon_controller.h | 1 - 1 file changed, 1 deletion(-) diff --git a/src/libs/sea_ai/src/ai_ship_cannon_controller.h b/src/libs/sea_ai/src/ai_ship_cannon_controller.h index 3ac66f424..1d2cc0c7e 100644 --- a/src/libs/sea_ai/src/ai_ship_cannon_controller.h +++ b/src/libs/sea_ai/src/ai_ship_cannon_controller.h @@ -134,7 +134,6 @@ class AIShipCannonController // init section bool Init(ATTRIBUTES *_pAShip); - uint32_t GetIntervalColor(uint32_t minV, uint32_t maxV, float fpar); void SetAIShip(AIShip *pShip) { pOurAIShip = pShip; From e6e3e3e2692156e3e51a3ee518a3e8f6c7b3c964 Mon Sep 17 00:00:00 2001 From: Blackmark3000 Date: Thu, 9 Feb 2023 12:00:13 +0300 Subject: [PATCH 14/14] =?UTF-8?q?=D0=9D=D0=B5=D0=B1=D0=BE=D0=BB=D1=8C?= =?UTF-8?q?=D1=88=D0=BE=D0=B9=20=D1=84=D0=B8=D0=BA=D1=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/libs/battle_interface/src/log_and_action.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/battle_interface/src/log_and_action.cpp b/src/libs/battle_interface/src/log_and_action.cpp index b3211e195..e8c3dcafe 100644 --- a/src/libs/battle_interface/src/log_and_action.cpp +++ b/src/libs/battle_interface/src/log_and_action.cpp @@ -305,7 +305,7 @@ void ILogAndActions::Realize(uint32_t delta_time) CMatrix matw; rs->SetTransform(D3DTS_WORLD, matw); //backimage - if (m_idActionBackTexture != -1L && m_bThatRealAction) + if (m_idActionBackTexture != -1L && m_bThatRealAction && rs->StringWidth(m_ActionHint2.sText.c_str(), m_ActionHint2.nFont, m_ActionHint2.fScale, 0) > 1) { rs->TextureSet(0, m_idActionBackTexture); rs->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, BI_COLOR_VERTEX_FORMAT, 2, m_ActionBackVertex,