Skip to content

Commit 085a5a4

Browse files
authored
Merge branch 'diasurgical:master' into fix-emscripten
2 parents 43ff37b + cb75236 commit 085a5a4

22 files changed

Lines changed: 3118 additions & 1478 deletions

File tree

.github/workflows/Linux_x86_64_test.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,6 @@ jobs:
5151
run: cd build && ctest --output-on-failure
5252

5353
- name: Upload results
54-
uses: codecov/codecov-action@v6
54+
uses: codecov/codecov-action@v7
5555
with:
5656
token: ${{ secrets.CODECOV_TOKEN }}

CMake/Tests.cmake

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ set(standalone_tests
6060
vision_test
6161
random_test
6262
rectangle_test
63+
sheen_bidi_test
6364
static_vector_test
6465
str_cat_test
6566
utf8_test
@@ -204,6 +205,7 @@ if(DEVILUTIONX_SCREENSHOT_FORMAT STREQUAL DEVILUTIONX_SCREENSHOT_FORMAT_PNG AND
204205
)
205206
add_dependencies(text_render_integration_test text_render_integration_test_resources)
206207
endif()
208+
target_link_dependencies(sheen_bidi_test PRIVATE libdevilutionx_sheen_bidi)
207209
target_link_dependencies(utf8_test PRIVATE libdevilutionx_utf8)
208210

209211
target_include_directories(writehero_test PRIVATE 3rdParty/PicoSHA2)

Packaging/xbox-one/build.bat

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,10 @@ cd ..\..\build
55

66
git clone --branch SDL2 https://github.com/libsdl-org/SDL.git
77
git -C SDL reset --hard 10135b2d7bbed6ea0cba24410ebc12887d92968d
8-
msbuild /p:PlatformToolset=v143;TargetPlatformVersion=10.0.26100.0;TargetPlatformMinVersion=10.0.14393.0;ConfigurationType=StaticLibrary;Configuration=Release;Platform=x64 SDL\VisualC-WinRT\SDL-UWP.vcxproj
8+
msbuild /p:PlatformToolset=v145;TargetPlatformVersion=10.0.26100.0;TargetPlatformMinVersion=10.0.14393.0;ConfigurationType=StaticLibrary;Configuration=Release;Platform=x64 SDL\VisualC-WinRT\SDL-UWP.vcxproj
99

10-
cmake -DUWP_LIB=1 -DUWP_SDL2_DIR="%CD%/SDL" -DCMAKE_BUILD_TYPE=x64-Release ..
11-
12-
msbuild /p:Configuration=Release;Platform=x64 /m DevilutionX.sln
10+
cmake -DUWP_LIB=1 -DUWP_SDL2_DIR="%CD%/SDL" -A x64 ..
11+
cmake --build . --config Release -j
1312

1413
powershell "Get-Content ..\uwp-project\Package.appxmanifest.template | %% {$_ -replace '__PROJECT_VERSION__',$(Select-String -Path ..\VERSION -Pattern \d+\.\d+\.\d+).Matches[0].Value} | Out-File -FilePath ..\uwp-project\Package.appxmanifest -encoding ASCII"
1514

Source/CMakeLists.txt

Lines changed: 67 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,6 @@ set(libdevilutionx_SRCS
3434
towners.cpp
3535
track.cpp
3636

37-
control/control_chat.cpp
38-
control/control_chat_commands.cpp
39-
control/control_flasks.cpp
40-
control/control_gold.cpp
41-
control/control_infobox.cpp
42-
control/control_panel.cpp
43-
4437
controls/axis_direction.cpp
4538
controls/controller_motion.cpp
4639
controls/controller.cpp
@@ -69,7 +62,6 @@ set(libdevilutionx_SRCS
6962
DiabloUI/settingsmenu.cpp
7063
DiabloUI/support_lines.cpp
7164
DiabloUI/title.cpp
72-
DiabloUI/text_input.cpp
7365

7466
dvlnet/abstract_net.cpp
7567
dvlnet/base.cpp
@@ -245,6 +237,33 @@ target_link_dependencies(libdevilutionx_codec PRIVATE
245237
libdevilutionx_log
246238
)
247239

240+
add_devilutionx_object_library(libdevilutionx_control
241+
control/control_chat.cpp
242+
control/control_chat_commands.cpp
243+
control/control_flasks.cpp
244+
control/control_gold.cpp
245+
control/control_infobox.cpp
246+
control/control_panel.cpp
247+
)
248+
target_link_dependencies(libdevilutionx_control
249+
PUBLIC
250+
DevilutionX::SDL
251+
tl
252+
libdevilutionx_text_input
253+
PRIVATE
254+
fmt::fmt
255+
libdevilutionx_clx_render
256+
libdevilutionx_control_mode
257+
libdevilutionx_format_int
258+
libdevilutionx_load_cel
259+
libdevilutionx_log
260+
libdevilutionx_options
261+
libdevilutionx_parse_int
262+
libdevilutionx_primitive_render
263+
libdevilutionx_quick_messages
264+
libdevilutionx_strings
265+
)
266+
248267
add_devilutionx_object_library(libdevilutionx_controller_buttons
249268
controls/controller_buttons.cpp
250269
)
@@ -497,7 +516,8 @@ add_devilutionx_object_library(libdevilutionx_items
497516
tables/itemdat.cpp
498517
items.cpp
499518
)
500-
target_link_dependencies(libdevilutionx_items PUBLIC
519+
target_link_dependencies(libdevilutionx_items
520+
PUBLIC
501521
DevilutionX::SDL
502522
sol2::sol2
503523
tl
@@ -506,6 +526,15 @@ target_link_dependencies(libdevilutionx_items PUBLIC
506526
libdevilutionx_spells
507527
libdevilutionx_stores
508528
libdevilutionx_strings
529+
PRIVATE
530+
libdevilutionx_control
531+
)
532+
533+
add_library(libdevilutionx_sheen_bidi INTERFACE)
534+
target_include_directories(libdevilutionx_sheen_bidi INTERFACE
535+
${PROJECT_SOURCE_DIR}/Source)
536+
target_link_dependencies(libdevilutionx_sheen_bidi INTERFACE
537+
SheenBidi::SheenBidi
509538
)
510539

511540
add_devilutionx_object_library(libdevilutionx_ini
@@ -564,6 +593,7 @@ target_link_dependencies(libdevilutionx_monster
564593
libdevilutionx_txtdata
565594
PRIVATE
566595
libdevilutionx_cl2_to_clx
596+
libdevilutionx_control
567597
)
568598

569599
add_devilutionx_object_library(libdevilutionx_palette_blending
@@ -660,16 +690,20 @@ target_link_dependencies(libdevilutionx_player
660690
unordered_dense::unordered_dense
661691
libdevilutionx_game_mode
662692
PRIVATE
693+
libdevilutionx_control
663694
libdevilutionx_load_cl2
664695
libdevilutionx_strings
665696
)
666697

667698
add_devilutionx_object_library(libdevilutionx_quests
668699
quests.cpp
669700
)
670-
target_link_dependencies(libdevilutionx_quests PUBLIC
701+
target_link_dependencies(libdevilutionx_quests
702+
PUBLIC
671703
libdevilutionx_surface
672704
libdevilutionx_gendung
705+
PRIVATE
706+
libdevilutionx_control
673707
)
674708

675709
add_devilutionx_object_library(libdevilutionx_random
@@ -684,10 +718,27 @@ add_devilutionx_object_library(libdevilutionx_spells
684718
tables/spelldat.cpp
685719
spells.cpp
686720
)
687-
target_link_dependencies(libdevilutionx_spells PUBLIC
721+
target_link_dependencies(libdevilutionx_spells
722+
PUBLIC
688723
tl
689724
libdevilutionx_player
690725
libdevilutionx_txtdata
726+
PRIVATE
727+
libdevilutionx_control
728+
)
729+
730+
add_devilutionx_object_library(libdevilutionx_text_input
731+
DiabloUI/text_input.cpp
732+
)
733+
target_link_dependencies(libdevilutionx_text_input
734+
PUBLIC
735+
DevilutionX::SDL
736+
libdevilutionx_utf8
737+
PRIVATE
738+
tl
739+
libdevilutionx_log
740+
libdevilutionx_parse_int
741+
libdevilutionx_strings
691742
)
692743

693744
add_devilutionx_object_library(libdevilutionx_text_render
@@ -734,8 +785,8 @@ target_link_dependencies(libdevilutionx_txtdata PUBLIC
734785
add_devilutionx_object_library(libdevilutionx_utf8
735786
utils/utf8.cpp
736787
)
737-
target_link_dependencies(libdevilutionx_utf8 PRIVATE
738-
SheenBidi::SheenBidi
788+
target_link_dependencies(libdevilutionx_utf8 PUBLIC
789+
libdevilutionx_sheen_bidi
739790
)
740791

741792
if(NOSOUND)
@@ -790,6 +841,7 @@ target_link_dependencies(libdevilutionx_stores PUBLIC
790841
fmt::fmt
791842
tl
792843
libdevilutionx_clx_render
844+
libdevilutionx_control
793845
libdevilutionx_options
794846
libdevilutionx_sound
795847
libdevilutionx_strings
@@ -916,6 +968,7 @@ target_link_dependencies(libdevilutionx PUBLIC
916968
libdevilutionx_clx_render
917969
libdevilutionx_codec
918970
libdevilutionx_config
971+
libdevilutionx_control
919972
libdevilutionx_controller_buttons
920973
libdevilutionx_control_mode
921974
libdevilutionx_crawl
@@ -951,6 +1004,7 @@ target_link_dependencies(libdevilutionx PUBLIC
9511004
libdevilutionx_spells
9521005
libdevilutionx_stores
9531006
libdevilutionx_strings
1007+
libdevilutionx_text_input
9541008
libdevilutionx_text_render
9551009
libdevilutionx_txtdata
9561010
libdevilutionx_ticks

Source/DiabloUI/text_input.hpp

Lines changed: 31 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -311,46 +311,53 @@ class TextInputState {
311311
}
312312

313313
private:
314-
[[nodiscard]] static bool isWordSeparator(unsigned char c)
314+
[[nodiscard]] static bool isWordSeparator(char32_t c)
315315
{
316-
const bool isAsciiWordChar = (c >= '0' && c <= '9')
317-
|| (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || c == '_';
318-
return c <= '\x7E' && !isAsciiWordChar;
316+
const bool isAsciiWordChar = (c >= U'0' && c <= U'9')
317+
|| (c >= U'A' && c <= U'Z') || (c >= U'a' && c <= U'z') || c == U'_';
318+
return c <= U'\x7E' && !isAsciiWordChar;
319319
}
320320

321321
[[nodiscard]] size_t prevPosition(bool word) const
322322
{
323323
const std::string_view str = beforeCursor();
324-
size_t pos = FindLastUtf8Symbols(str);
324+
if (str.empty()) return 0;
325+
326+
auto it = Utf8CodePoints(str).rbegin();
327+
const auto end = Utf8CodePoints(str).rend();
325328
if (!word)
326-
return pos;
327-
while (pos > 0 && isWordSeparator(str[pos])) {
328-
pos = FindLastUtf8Symbols({ str.data(), pos });
329+
return static_cast<size_t>(std::prev(it.base()).data() - str.data());
330+
331+
while (it != end && isWordSeparator(*it)) {
332+
++it;
329333
}
330-
while (pos > 0) {
331-
const size_t prevPos = FindLastUtf8Symbols({ str.data(), pos });
332-
if (isWordSeparator(str[prevPos]))
333-
break;
334-
pos = prevPos;
334+
while (it != end && !isWordSeparator(*it)) {
335+
++it;
335336
}
336-
return pos;
337+
if (it == end) return 0;
338+
339+
return static_cast<size_t>(it.base().data() - str.data());
337340
}
338341

339342
[[nodiscard]] size_t nextPosition(bool word) const
340343
{
341344
const std::string_view str = afterCursor();
342-
size_t pos = Utf8CodePointLen(str.data());
343-
if (!word)
344-
return cursor_->position + pos;
345-
while (pos < str.size() && isWordSeparator(str[pos])) {
346-
pos += Utf8CodePointLen(str.data() + pos);
345+
if (str.empty()) return cursor_->position;
346+
347+
auto it = Utf8CodePoints(str).begin();
348+
const auto end = Utf8CodePoints(str).end();
349+
if (!word) return cursor_->position + it.size();
350+
351+
++it;
352+
while (it != end && isWordSeparator(*it)) {
353+
++it;
347354
}
348-
while (pos < str.size()) {
349-
pos += Utf8CodePointLen(str.data() + pos);
350-
if (isWordSeparator(str[pos]))
351-
break;
355+
while (it != end && !isWordSeparator(*it)) {
356+
++it;
352357
}
353-
return cursor_->position + pos;
358+
if (it == end) return cursor_->position + str.size();
359+
360+
return cursor_->position + static_cast<size_t>(it.data() - str.data());
354361
}
355362

356363
[[nodiscard]] std::string_view beforeCursor() const

Source/diablo.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2816,6 +2816,7 @@ bool TryIconCurs()
28162816
else if (pcursstashitem != StashStruct::EmptyCell) {
28172817
Item &item = Stash.stashList[pcursstashitem];
28182818
item._iIdentified = true;
2819+
Stash.dirty = true;
28192820
}
28202821
NewCursor(CURSOR_HAND);
28212822
return true;
@@ -2830,6 +2831,7 @@ bool TryIconCurs()
28302831
} else if (pcursstashitem != StashStruct::EmptyCell) {
28312832
Item &item = Stash.stashList[pcursstashitem];
28322833
RepairItem(item, myPlayer.getCharacterLevel());
2834+
Stash.dirty = true;
28332835
}
28342836
NewCursor(CURSOR_HAND);
28352837
return true;
@@ -2841,6 +2843,7 @@ bool TryIconCurs()
28412843
else if (pcursstashitem != StashStruct::EmptyCell) {
28422844
Item &item = Stash.stashList[pcursstashitem];
28432845
RechargeItem(item, myPlayer);
2846+
Stash.dirty = true;
28442847
}
28452848
NewCursor(CURSOR_HAND);
28462849
return true;
@@ -2853,6 +2856,7 @@ bool TryIconCurs()
28532856
else if (pcursstashitem != StashStruct::EmptyCell) {
28542857
Item &item = Stash.stashList[pcursstashitem];
28552858
changeCursor = ApplyOilToItem(item, myPlayer);
2859+
Stash.dirty = true;
28562860
}
28572861
if (changeCursor)
28582862
NewCursor(CURSOR_HAND);

0 commit comments

Comments
 (0)