From dfef74e72742ec01618cf8f26ec381fcc84eae8d Mon Sep 17 00:00:00 2001 From: MysterD Date: Mon, 21 Jun 2021 21:18:27 -0700 Subject: [PATCH] Added custom title font Adjusted text system to have multiple fonts Added color escape to text --- Makefile.split | 3 + bin/custom_font_title.c | 482 ++++++++++++++++++ build-windows-visual-studio/sm64ex.vcxproj | 4 + .../sm64ex.vcxproj.filters | 12 + src/pc/djui/djui.c | 69 +-- src/pc/djui/djui.h | 2 + src/pc/djui/djui_font.c | 116 +++++ src/pc/djui/djui_font.h | 17 + src/pc/djui/djui_gfx.c | 48 +- src/pc/djui/djui_gfx.h | 2 - src/pc/djui/djui_panel_debug.c | 66 +++ src/pc/djui/djui_panel_debug.h | 4 + src/pc/djui/djui_panel_main.c | 30 +- src/pc/djui/djui_panel_quit.c | 2 +- src/pc/djui/djui_text.c | 184 ++++--- src/pc/djui/djui_text.h | 6 +- .../custom_font_title_01.rgba32.png | Bin 0 -> 480 bytes .../custom_font_title_02.rgba32.png | Bin 0 -> 663 bytes .../custom_font_title_03.rgba32.png | Bin 0 -> 1027 bytes .../custom_font_title_04.rgba32.png | Bin 0 -> 1131 bytes .../custom_font_title_05.rgba32.png | Bin 0 -> 973 bytes .../custom_font_title_06.rgba32.png | Bin 0 -> 992 bytes .../custom_font_title_07.rgba32.png | Bin 0 -> 512 bytes .../custom_font_title_08.rgba32.png | Bin 0 -> 893 bytes .../custom_font_title_09.rgba32.png | Bin 0 -> 896 bytes .../custom_font_title_10.rgba32.png | Bin 0 -> 722 bytes .../custom_font_title_11.rgba32.png | Bin 0 -> 646 bytes .../custom_font_title_12.rgba32.png | Bin 0 -> 507 bytes .../custom_font_title_13.rgba32.png | Bin 0 -> 365 bytes .../custom_font_title_14.rgba32.png | Bin 0 -> 405 bytes .../custom_font_title_15.rgba32.png | Bin 0 -> 646 bytes .../custom_font_title_16.rgba32.png | Bin 0 -> 778 bytes .../custom_font_title_17.rgba32.png | Bin 0 -> 717 bytes .../custom_font_title_18.rgba32.png | Bin 0 -> 712 bytes .../custom_font_title_19.rgba32.png | Bin 0 -> 773 bytes .../custom_font_title_20.rgba32.png | Bin 0 -> 824 bytes .../custom_font_title_21.rgba32.png | Bin 0 -> 767 bytes .../custom_font_title_22.rgba32.png | Bin 0 -> 709 bytes .../custom_font_title_23.rgba32.png | Bin 0 -> 664 bytes .../custom_font_title_24.rgba32.png | Bin 0 -> 734 bytes .../custom_font_title_25.rgba32.png | Bin 0 -> 744 bytes .../custom_font_title_26.rgba32.png | Bin 0 -> 534 bytes .../custom_font_title_27.rgba32.png | Bin 0 -> 690 bytes .../custom_font_title_28.rgba32.png | Bin 0 -> 511 bytes .../custom_font_title_29.rgba32.png | Bin 0 -> 494 bytes .../custom_font_title_30.rgba32.png | Bin 0 -> 518 bytes .../custom_font_title_31.rgba32.png | Bin 0 -> 785 bytes .../custom_font_title_32.rgba32.png | Bin 0 -> 1211 bytes .../custom_font_title_33.rgba32.png | Bin 0 -> 667 bytes .../custom_font_title_34.rgba32.png | Bin 0 -> 796 bytes .../custom_font_title_35.rgba32.png | Bin 0 -> 739 bytes .../custom_font_title_36.rgba32.png | Bin 0 -> 781 bytes .../custom_font_title_37.rgba32.png | Bin 0 -> 619 bytes .../custom_font_title_38.rgba32.png | Bin 0 -> 781 bytes .../custom_font_title_39.rgba32.png | Bin 0 -> 639 bytes .../custom_font_title_40.rgba32.png | Bin 0 -> 730 bytes .../custom_font_title_41.rgba32.png | Bin 0 -> 557 bytes .../custom_font_title_42.rgba32.png | Bin 0 -> 706 bytes .../custom_font_title_43.rgba32.png | Bin 0 -> 898 bytes .../custom_font_title_44.rgba32.png | Bin 0 -> 751 bytes .../custom_font_title_45.rgba32.png | Bin 0 -> 943 bytes .../custom_font_title_46.rgba32.png | Bin 0 -> 785 bytes .../custom_font_title_47.rgba32.png | Bin 0 -> 609 bytes .../custom_font_title_48.rgba32.png | Bin 0 -> 754 bytes .../custom_font_title_49.rgba32.png | Bin 0 -> 773 bytes .../custom_font_title_50.rgba32.png | Bin 0 -> 829 bytes .../custom_font_title_51.rgba32.png | Bin 0 -> 803 bytes .../custom_font_title_52.rgba32.png | Bin 0 -> 551 bytes .../custom_font_title_53.rgba32.png | Bin 0 -> 458 bytes .../custom_font_title_54.rgba32.png | Bin 0 -> 876 bytes .../custom_font_title_55.rgba32.png | Bin 0 -> 1017 bytes .../custom_font_title_56.rgba32.png | Bin 0 -> 854 bytes .../custom_font_title_57.rgba32.png | Bin 0 -> 800 bytes .../custom_font_title_58.rgba32.png | Bin 0 -> 771 bytes .../custom_font_title_59.rgba32.png | Bin 0 -> 622 bytes .../custom_font_title_60.rgba32.png | Bin 0 -> 928 bytes .../custom_font_title_61.rgba32.png | Bin 0 -> 610 bytes .../custom_font_title_62.rgba32.png | Bin 0 -> 653 bytes .../custom_font_title_63.rgba32.png | Bin 0 -> 438 bytes .../custom_font_title_64.rgba32.png | Bin 0 -> 453 bytes .../custom_font_title_65.rgba32.png | Bin 0 -> 847 bytes .../custom_font_title_66.rgba32.png | Bin 0 -> 818 bytes .../custom_font_title_67.rgba32.png | Bin 0 -> 583 bytes .../custom_font_title_68.rgba32.png | Bin 0 -> 835 bytes .../custom_font_title_69.rgba32.png | Bin 0 -> 757 bytes .../custom_font_title_70.rgba32.png | Bin 0 -> 753 bytes .../custom_font_title_71.rgba32.png | Bin 0 -> 871 bytes .../custom_font_title_72.rgba32.png | Bin 0 -> 567 bytes .../custom_font_title_73.rgba32.png | Bin 0 -> 520 bytes .../custom_font_title_74.rgba32.png | Bin 0 -> 822 bytes .../custom_font_title_75.rgba32.png | Bin 0 -> 906 bytes .../custom_font_title_76.rgba32.png | Bin 0 -> 508 bytes .../custom_font_title_77.rgba32.png | Bin 0 -> 734 bytes .../custom_font_title_78.rgba32.png | Bin 0 -> 543 bytes .../custom_font_title_79.rgba32.png | Bin 0 -> 538 bytes .../custom_font_title_80.rgba32.png | Bin 0 -> 813 bytes .../custom_font_title_81.rgba32.png | Bin 0 -> 921 bytes .../custom_font_title_82.rgba32.png | Bin 0 -> 638 bytes .../custom_font_title_83.rgba32.png | Bin 0 -> 623 bytes .../custom_font_title_84.rgba32.png | Bin 0 -> 646 bytes .../custom_font_title_85.rgba32.png | Bin 0 -> 538 bytes .../custom_font_title_86.rgba32.png | Bin 0 -> 684 bytes .../custom_font_title_87.rgba32.png | Bin 0 -> 678 bytes .../custom_font_title_88.rgba32.png | Bin 0 -> 708 bytes .../custom_font_title_89.rgba32.png | Bin 0 -> 652 bytes .../custom_font_title_90.rgba32.png | Bin 0 -> 640 bytes .../custom_font_title_91.rgba32.png | Bin 0 -> 981 bytes .../custom_font_title_92.rgba32.png | Bin 0 -> 398 bytes .../custom_font_title_93.rgba32.png | Bin 0 -> 952 bytes .../custom_font_title_94.rgba32.png | Bin 0 -> 682 bytes .../custom_font_title_95.rgba32.png | Bin 0 -> 500 bytes 111 files changed, 848 insertions(+), 199 deletions(-) create mode 100644 bin/custom_font_title.c create mode 100644 src/pc/djui/djui_font.c create mode 100644 src/pc/djui/djui_font.h create mode 100644 src/pc/djui/djui_panel_debug.c create mode 100644 src/pc/djui/djui_panel_debug.h create mode 100644 textures/custom_font_title/custom_font_title_01.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_02.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_03.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_04.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_05.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_06.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_07.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_08.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_09.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_10.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_11.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_12.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_13.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_14.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_15.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_16.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_17.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_18.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_19.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_20.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_21.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_22.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_23.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_24.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_25.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_26.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_27.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_28.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_29.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_30.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_31.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_32.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_33.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_34.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_35.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_36.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_37.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_38.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_39.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_40.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_41.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_42.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_43.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_44.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_45.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_46.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_47.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_48.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_49.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_50.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_51.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_52.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_53.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_54.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_55.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_56.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_57.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_58.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_59.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_60.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_61.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_62.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_63.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_64.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_65.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_66.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_67.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_68.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_69.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_70.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_71.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_72.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_73.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_74.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_75.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_76.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_77.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_78.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_79.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_80.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_81.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_82.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_83.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_84.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_85.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_86.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_87.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_88.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_89.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_90.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_91.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_92.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_93.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_94.rgba32.png create mode 100644 textures/custom_font_title/custom_font_title_95.rgba32.png diff --git a/Makefile.split b/Makefile.split index fec05f97..1ccade88 100644 --- a/Makefile.split +++ b/Makefile.split @@ -193,6 +193,7 @@ SKY_FILES := $(patsubst %.png,%.inc.c,$(wildcard $(TEXTURE_DI MACHINE_FILES := $(patsubst %.png,%.inc.c,$(wildcard $(TEXTURE_DIR)/machine/*.png)) MOUNTAIN_FILES := $(patsubst %.png,%.inc.c,$(wildcard $(TEXTURE_DIR)/mountain/*.png)) GRASS_FILES := $(patsubst %.png,%.inc.c,$(wildcard $(TEXTURE_DIR)/grass/*.png)) +CUSTOM_FONT_TITLE_FILES := $(patsubst %.png,%.inc.c,$(wildcard $(TEXTURE_DIR)/custom_font_title/*.png)) # Texture Files $(BUILD_DIR)/bin/segment2.o: $(addprefix $(BUILD_DIR)/,$(SEGMENT2_FILES)) @@ -210,6 +211,7 @@ $(BUILD_DIR)/bin/sky.o: $(addprefix $(BUILD_DIR)/,$(SKY_FILES)) $(BUILD_DIR)/bin/machine.o: $(addprefix $(BUILD_DIR)/,$(MACHINE_FILES)) $(BUILD_DIR)/bin/mountain.o: $(addprefix $(BUILD_DIR)/,$(MOUNTAIN_FILES)) $(BUILD_DIR)/bin/grass.o: $(addprefix $(BUILD_DIR)/,$(GRASS_FILES)) +$(BUILD_DIR)/bin/custom_font_title.o: $(addprefix $(BUILD_DIR)/,$(CUSTOM_FONT_TITLE_FILES)) # Others $(BUILD_DIR)/bin/segment2.elf: SEGMENT_ADDRESS := 0x02000000 @@ -228,6 +230,7 @@ $(BUILD_DIR)/bin/sky.elf: SEGMENT_ADDRESS := 0x09000000 $(BUILD_DIR)/bin/machine.elf: SEGMENT_ADDRESS := 0x09000000 $(BUILD_DIR)/bin/mountain.elf: SEGMENT_ADDRESS := 0x09000000 $(BUILD_DIR)/bin/grass.elf: SEGMENT_ADDRESS := 0x09000000 +$(BUILD_DIR)/bin/custom_font_title.elf: SEGMENT_ADDRESS := 0x09000000 # EU segment 19 translations $(BUILD_DIR)/bin/eu/translation_de.elf: SEGMENT_ADDRESS := 0x19000000 diff --git a/bin/custom_font_title.c b/bin/custom_font_title.c new file mode 100644 index 00000000..2b259d7c --- /dev/null +++ b/bin/custom_font_title.c @@ -0,0 +1,482 @@ +#include +#include "sm64.h" +#include "game/ingame_menu.h" +#include "make_const_nonconst.h" + +ALIGNED8 static const u8 texture_font_title_char_01[] = { +#include "textures/custom_font_title/custom_font_title_01.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_02[] = { +#include "textures/custom_font_title/custom_font_title_02.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_03[] = { +#include "textures/custom_font_title/custom_font_title_03.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_04[] = { +#include "textures/custom_font_title/custom_font_title_04.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_05[] = { +#include "textures/custom_font_title/custom_font_title_05.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_06[] = { +#include "textures/custom_font_title/custom_font_title_06.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_07[] = { +#include "textures/custom_font_title/custom_font_title_07.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_08[] = { +#include "textures/custom_font_title/custom_font_title_08.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_09[] = { +#include "textures/custom_font_title/custom_font_title_09.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_10[] = { +#include "textures/custom_font_title/custom_font_title_10.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_11[] = { +#include "textures/custom_font_title/custom_font_title_11.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_12[] = { +#include "textures/custom_font_title/custom_font_title_12.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_13[] = { +#include "textures/custom_font_title/custom_font_title_13.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_14[] = { +#include "textures/custom_font_title/custom_font_title_14.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_15[] = { +#include "textures/custom_font_title/custom_font_title_15.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_16[] = { +#include "textures/custom_font_title/custom_font_title_16.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_17[] = { +#include "textures/custom_font_title/custom_font_title_17.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_18[] = { +#include "textures/custom_font_title/custom_font_title_18.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_19[] = { +#include "textures/custom_font_title/custom_font_title_19.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_20[] = { +#include "textures/custom_font_title/custom_font_title_20.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_21[] = { +#include "textures/custom_font_title/custom_font_title_21.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_22[] = { +#include "textures/custom_font_title/custom_font_title_22.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_23[] = { +#include "textures/custom_font_title/custom_font_title_23.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_24[] = { +#include "textures/custom_font_title/custom_font_title_24.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_25[] = { +#include "textures/custom_font_title/custom_font_title_25.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_26[] = { +#include "textures/custom_font_title/custom_font_title_26.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_27[] = { +#include "textures/custom_font_title/custom_font_title_27.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_28[] = { +#include "textures/custom_font_title/custom_font_title_28.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_29[] = { +#include "textures/custom_font_title/custom_font_title_29.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_30[] = { +#include "textures/custom_font_title/custom_font_title_30.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_31[] = { +#include "textures/custom_font_title/custom_font_title_31.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_32[] = { +#include "textures/custom_font_title/custom_font_title_32.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_33[] = { +#include "textures/custom_font_title/custom_font_title_33.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_34[] = { +#include "textures/custom_font_title/custom_font_title_34.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_35[] = { +#include "textures/custom_font_title/custom_font_title_35.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_36[] = { +#include "textures/custom_font_title/custom_font_title_36.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_37[] = { +#include "textures/custom_font_title/custom_font_title_37.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_38[] = { +#include "textures/custom_font_title/custom_font_title_38.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_39[] = { +#include "textures/custom_font_title/custom_font_title_39.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_40[] = { +#include "textures/custom_font_title/custom_font_title_40.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_41[] = { +#include "textures/custom_font_title/custom_font_title_41.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_42[] = { +#include "textures/custom_font_title/custom_font_title_42.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_43[] = { +#include "textures/custom_font_title/custom_font_title_43.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_44[] = { +#include "textures/custom_font_title/custom_font_title_44.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_45[] = { +#include "textures/custom_font_title/custom_font_title_45.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_46[] = { +#include "textures/custom_font_title/custom_font_title_46.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_47[] = { +#include "textures/custom_font_title/custom_font_title_47.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_48[] = { +#include "textures/custom_font_title/custom_font_title_48.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_49[] = { +#include "textures/custom_font_title/custom_font_title_49.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_50[] = { +#include "textures/custom_font_title/custom_font_title_50.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_51[] = { +#include "textures/custom_font_title/custom_font_title_51.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_52[] = { +#include "textures/custom_font_title/custom_font_title_52.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_53[] = { +#include "textures/custom_font_title/custom_font_title_53.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_54[] = { +#include "textures/custom_font_title/custom_font_title_54.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_55[] = { +#include "textures/custom_font_title/custom_font_title_55.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_56[] = { +#include "textures/custom_font_title/custom_font_title_56.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_57[] = { +#include "textures/custom_font_title/custom_font_title_57.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_58[] = { +#include "textures/custom_font_title/custom_font_title_58.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_59[] = { +#include "textures/custom_font_title/custom_font_title_59.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_60[] = { +#include "textures/custom_font_title/custom_font_title_60.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_61[] = { +#include "textures/custom_font_title/custom_font_title_61.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_62[] = { +#include "textures/custom_font_title/custom_font_title_62.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_63[] = { +#include "textures/custom_font_title/custom_font_title_63.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_64[] = { +#include "textures/custom_font_title/custom_font_title_64.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_65[] = { +#include "textures/custom_font_title/custom_font_title_65.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_66[] = { +#include "textures/custom_font_title/custom_font_title_66.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_67[] = { +#include "textures/custom_font_title/custom_font_title_67.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_68[] = { +#include "textures/custom_font_title/custom_font_title_68.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_69[] = { +#include "textures/custom_font_title/custom_font_title_69.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_70[] = { +#include "textures/custom_font_title/custom_font_title_70.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_71[] = { +#include "textures/custom_font_title/custom_font_title_71.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_72[] = { +#include "textures/custom_font_title/custom_font_title_72.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_73[] = { +#include "textures/custom_font_title/custom_font_title_73.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_74[] = { +#include "textures/custom_font_title/custom_font_title_74.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_75[] = { +#include "textures/custom_font_title/custom_font_title_75.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_76[] = { +#include "textures/custom_font_title/custom_font_title_76.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_77[] = { +#include "textures/custom_font_title/custom_font_title_77.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_78[] = { +#include "textures/custom_font_title/custom_font_title_78.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_79[] = { +#include "textures/custom_font_title/custom_font_title_79.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_80[] = { +#include "textures/custom_font_title/custom_font_title_80.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_81[] = { +#include "textures/custom_font_title/custom_font_title_81.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_82[] = { +#include "textures/custom_font_title/custom_font_title_82.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_83[] = { +#include "textures/custom_font_title/custom_font_title_83.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_84[] = { +#include "textures/custom_font_title/custom_font_title_84.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_85[] = { +#include "textures/custom_font_title/custom_font_title_85.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_86[] = { +#include "textures/custom_font_title/custom_font_title_86.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_87[] = { +#include "textures/custom_font_title/custom_font_title_87.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_88[] = { +#include "textures/custom_font_title/custom_font_title_88.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_89[] = { +#include "textures/custom_font_title/custom_font_title_89.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_90[] = { +#include "textures/custom_font_title/custom_font_title_90.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_91[] = { +#include "textures/custom_font_title/custom_font_title_91.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_92[] = { +#include "textures/custom_font_title/custom_font_title_92.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_93[] = { +#include "textures/custom_font_title/custom_font_title_93.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_94[] = { +#include "textures/custom_font_title/custom_font_title_94.rgba32.inc.c" +}; + +ALIGNED8 static const u8 texture_font_title_char_95[] = { +#include "textures/custom_font_title/custom_font_title_95.rgba32.inc.c" +}; + +const u8 *const font_title_chars[] = { + texture_font_title_char_01, + texture_font_title_char_02, + texture_font_title_char_03, + texture_font_title_char_04, + texture_font_title_char_05, + texture_font_title_char_06, + texture_font_title_char_07, + texture_font_title_char_08, + texture_font_title_char_09, + texture_font_title_char_10, + texture_font_title_char_11, + texture_font_title_char_12, + texture_font_title_char_13, + texture_font_title_char_14, + texture_font_title_char_15, + texture_font_title_char_16, + texture_font_title_char_17, + texture_font_title_char_18, + texture_font_title_char_19, + texture_font_title_char_20, + texture_font_title_char_21, + texture_font_title_char_22, + texture_font_title_char_23, + texture_font_title_char_24, + texture_font_title_char_25, + texture_font_title_char_26, + texture_font_title_char_27, + texture_font_title_char_28, + texture_font_title_char_29, + texture_font_title_char_30, + texture_font_title_char_31, + texture_font_title_char_32, + texture_font_title_char_33, + texture_font_title_char_34, + texture_font_title_char_35, + texture_font_title_char_36, + texture_font_title_char_37, + texture_font_title_char_38, + texture_font_title_char_39, + texture_font_title_char_40, + texture_font_title_char_41, + texture_font_title_char_42, + texture_font_title_char_43, + texture_font_title_char_44, + texture_font_title_char_45, + texture_font_title_char_46, + texture_font_title_char_47, + texture_font_title_char_48, + texture_font_title_char_49, + texture_font_title_char_50, + texture_font_title_char_51, + texture_font_title_char_52, + texture_font_title_char_53, + texture_font_title_char_54, + texture_font_title_char_55, + texture_font_title_char_56, + texture_font_title_char_57, + texture_font_title_char_58, + texture_font_title_char_59, + texture_font_title_char_60, + texture_font_title_char_61, + texture_font_title_char_62, + texture_font_title_char_63, + texture_font_title_char_64, + texture_font_title_char_65, + texture_font_title_char_66, + texture_font_title_char_67, + texture_font_title_char_68, + texture_font_title_char_69, + texture_font_title_char_70, + texture_font_title_char_71, + texture_font_title_char_72, + texture_font_title_char_73, + texture_font_title_char_74, + texture_font_title_char_75, + texture_font_title_char_76, + texture_font_title_char_77, + texture_font_title_char_78, + texture_font_title_char_79, + texture_font_title_char_80, + texture_font_title_char_81, + texture_font_title_char_82, + texture_font_title_char_83, + texture_font_title_char_84, + texture_font_title_char_85, + texture_font_title_char_86, + texture_font_title_char_87, + texture_font_title_char_88, + texture_font_title_char_89, + texture_font_title_char_90, + texture_font_title_char_91, + texture_font_title_char_92, + texture_font_title_char_93, + texture_font_title_char_94, + texture_font_title_char_95, +}; diff --git a/build-windows-visual-studio/sm64ex.vcxproj b/build-windows-visual-studio/sm64ex.vcxproj index b61021a5..c757d2b1 100644 --- a/build-windows-visual-studio/sm64ex.vcxproj +++ b/build-windows-visual-studio/sm64ex.vcxproj @@ -3945,9 +3945,11 @@ + + @@ -4369,10 +4371,12 @@ + + diff --git a/build-windows-visual-studio/sm64ex.vcxproj.filters b/build-windows-visual-studio/sm64ex.vcxproj.filters index 09a11b39..2b5d71a4 100644 --- a/build-windows-visual-studio/sm64ex.vcxproj.filters +++ b/build-windows-visual-studio/sm64ex.vcxproj.filters @@ -15198,6 +15198,12 @@ Source Files\src\pc\utils + + Source Files\src\pc\djui + + + Source Files\src\pc\djui\panel + @@ -16216,5 +16222,11 @@ Source Files\src\pc\utils + + Source Files\src\pc\djui + + + Source Files\src\pc\djui\panel + \ No newline at end of file diff --git a/src/pc/djui/djui.c b/src/pc/djui/djui.c index d09d7ebb..f965212f 100644 --- a/src/pc/djui/djui.c +++ b/src/pc/djui/djui.c @@ -4,14 +4,6 @@ #include "src/pc/controller/controller_sdl.h" #include "src/pc/controller/controller_mouse.h" -ALIGNED8 static const u8 texture32x32[] = { -#include "actors/bubble/mr_i_bubble.rgba16.inc.c" -}; - -ALIGNED8 static const u8 texture16x16[] = { -#include "textures/segment2/custom_luigi_head.rgba16.inc.c" -}; - ALIGNED8 static u8 texture_hand_open[] = { #include "textures/intro_raw/hand_open.rgba16.inc.c" }; @@ -20,10 +12,6 @@ ALIGNED8 static u8 texture_hand_closed[] = { #include "textures/intro_raw/hand_closed.rgba16.inc.c" }; -ALIGNED8 static u8 texture_title[] = { -#include "textures/segment2/custom_title.rgba32.inc.c" -}; - static Gfx* sSavedDisplayListHead = NULL; struct DjuiRoot* gDjuiRoot = NULL; @@ -38,61 +26,7 @@ static void djui_init(void) { djui_base_set_size(&sMouseCursor->base, 64, 64); djui_panel_main_create(); -} - -static void djui_debug_update(void) { - /*static struct DjuiImage* sDjuiImage = NULL; - static struct DjuiRect* sDjuiRect = NULL;; - static struct DjuiRect* sDjuiRect2 = NULL;; - static struct DjuiText* sDjuiText = NULL;; - if (sDjuiImage == NULL) { - struct DjuiRect* imageContainer = djui_rect_create(&gDjuiRoot->base); - djui_base_set_location(&imageContainer->base, 32, 32); - djui_base_set_size(&imageContainer->base, 128, 128); - djui_base_set_padding(&imageContainer->base, 48, 48, 48, 48); - - sDjuiImage = djui_image_create(&imageContainer->base, texture16x16, 16, 16, 16); - djui_base_set_location(&sDjuiImage->base, 0, 0); - djui_base_set_size(&sDjuiImage->base, 32, 32); - djui_base_set_size_type(&sDjuiImage->base, DJUI_SVT_RELATIVE, DJUI_SVT_RELATIVE); - djui_base_set_size(&sDjuiImage->base, 1.0f, 1.0f); - - sDjuiRect = djui_rect_create(&gDjuiRoot->base); - djui_base_set_location(&sDjuiRect->base, 64, 64); - djui_base_set_size(&sDjuiRect->base, 188, 64); - djui_base_set_color(&sDjuiRect->base, 255, 255, 255, 200); - djui_base_set_alignment(&sDjuiRect->base, DJUI_HALIGN_LEFT, DJUI_VALIGN_BOTTOM); - - sDjuiRect2 = djui_rect_create(&sDjuiRect->base); - djui_base_set_location(&sDjuiRect2->base, 0, 0); - djui_base_set_size(&sDjuiRect2->base, 188 - 8, 64 - 8); - djui_base_set_alignment(&sDjuiRect2->base, DJUI_HALIGN_CENTER, DJUI_VALIGN_CENTER); - - sDjuiText = djui_text_create(&sDjuiRect2->base, "Host"); - djui_base_set_location(&sDjuiText->base, 0, 0); - djui_base_set_size(&sDjuiText->base, 188 - 8, 64 - 8); - djui_base_set_color(&sDjuiText->base, 111, 111, 111, 255); - djui_text_set_font_size(sDjuiText, 2); - djui_text_set_alignment(sDjuiText, DJUI_HALIGN_CENTER, DJUI_VALIGN_CENTER); - }*/ - static u32 sTimer = 0; - sTimer++; - /*djui_base_set_size(&buttonContainer->base, - 512.0f + cos((sTimer) / 20.0f) * 256.0f, - buttonContainer->base.height.value);*/ - /*djui_base_set_location(&sDjuiImage->base, - 0.0f + cos((sTimer) / 30.0f) * 128.0f, - 0.0f + fabs(sin((sTimer) / 30.0f)) * 128.0f);*/ - - /*djui_base_set_color(&sDjuiImage->base, - 127.0f + sin((sTimer) / 13.0f) * 127.0f, - 127.0f + sin((sTimer) / 17.0f) * 127.0f, - 127.0f + sin((sTimer) / 23.0f) * 127.0f, - 255); - - djui_base_set_location(&sDjuiRect2->base, - 32.0f + cos((sTimer) / 10.0f) * 64.0f, - 32.0f + sin((sTimer) / 31.0f) * 64.0f);*/ + //djui_panel_debug_create(); } static void djui_mouse_update(void) { @@ -127,7 +61,6 @@ void djui_render(void) { create_dl_ortho_matrix(); djui_mouse_update(); - djui_debug_update(); djui_base_render(&gDjuiRoot->base); djui_base_render(&sMouseCursor->base); diff --git a/src/pc/djui/djui.h b/src/pc/djui/djui.h index 1e9e3a2d..41c332b2 100644 --- a/src/pc/djui/djui.h +++ b/src/pc/djui/djui.h @@ -8,6 +8,7 @@ #include "game/ingame_menu.h" #include "djui_types.h" +#include "djui_font.h" #include "djui_gfx.h" #include "djui_base.h" #include "djui_interactable.h" @@ -20,6 +21,7 @@ #include "djui_button.h" #include "djui_flow_layout.h" +#include "djui_panel_debug.h" #include "djui_panel_main.h" #include "djui_panel_quit.h" diff --git a/src/pc/djui/djui_font.c b/src/pc/djui/djui_font.c new file mode 100644 index 00000000..5e81c44d --- /dev/null +++ b/src/pc/djui/djui_font.c @@ -0,0 +1,116 @@ +#include "djui.h" +#include "game/segment2.h" + + /////////////////////////////////// + // font 0 (built-in normal font) // +/////////////////////////////////// + +static Vtx djui_font_normal_vertices[] = { + {{{ 0, -1, 0}, 0, { 0, 256}, { 0xff, 0xff, 0xff, 0xff }}}, + {{{ 0.5f, -1, 0}, 0, { 0, 0}, { 0xff, 0xff, 0xff, 0xff }}}, + {{{ 0.5f, 0, 0}, 0, { 512, 0}, { 0xff, 0xff, 0xff, 0xff }}}, + {{{ 0, 0, 0}, 0, { 512, 256}, { 0xff, 0xff, 0xff, 0xff }}}, +}; + +static const Gfx djui_font_normal_text_begin[] = { + gsDPPipeSync(), + gsSPClearGeometryMode(G_LIGHTING), + gsDPSetCombineMode(G_CC_FADEA, G_CC_FADEA), + gsDPSetEnvColor(255, 255, 255, 255), + gsDPSetRenderMode(G_RM_XLU_SURF, G_RM_XLU_SURF2), + gsDPSetTextureFilter(G_TF_POINT), + gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON), + gsSPEndDisplayList(), +}; + +static const Gfx djui_font_normal_text_settings[] = { + gsDPSetTile(G_IM_FMT_IA, G_IM_SIZ_16b, 0, 0, G_TX_LOADTILE, 0, G_TX_WRAP | G_TX_NOMIRROR, 3, G_TX_NOLOD, G_TX_WRAP | G_TX_NOMIRROR, 4, G_TX_NOLOD), + gsDPLoadSync(), + gsDPLoadBlock(G_TX_LOADTILE, 0, 0, ((16 * 8 + G_IM_SIZ_4b_INCR) >> G_IM_SIZ_4b_SHIFT) - 1, CALC_DXT(16, G_IM_SIZ_4b_BYTES)), + gsDPSetTile(G_IM_FMT_IA, G_IM_SIZ_4b, 1, 0, G_TX_RENDERTILE, 0, G_TX_WRAP | G_TX_NOMIRROR, 3, G_TX_NOLOD, G_TX_WRAP | G_TX_NOMIRROR, 4, G_TX_NOLOD), + gsDPSetTileSize(0, 0, 0, (16 - 1) << G_TEXTURE_IMAGE_FRAC, (8 - 1) << G_TEXTURE_IMAGE_FRAC), + gsSPVertex(djui_font_normal_vertices, 4, 0), + gsSPExecuteDjui(G_TEXCLIP_DJUI), + gsSP2Triangles(0, 1, 2, 0x0, 0, 2, 3, 0x0), + gsSPEndDisplayList(), +}; + +static void djui_font_normal_render_char(char c) { + void** fontLUT; + void* packedTexture; + + u8 d = str_ascii_char_to_dialog(c); + fontLUT = segmented_to_virtual(main_font_lut); + packedTexture = segmented_to_virtual(fontLUT[d]); + + gDPPipeSync(gDisplayListHead++); + gDPSetTextureImage(gDisplayListHead++, G_IM_FMT_IA, G_IM_SIZ_16b, 1, VIRTUAL_TO_PHYSICAL(packedTexture)); + gSPDisplayList(gDisplayListHead++, djui_font_normal_text_settings); +} + +static f32 djui_font_normal_char_width(char c) { + u8 d = str_ascii_char_to_dialog(c); + return gDialogCharWidths[d] / 16.0f; +} + +static const struct DjuiFont sDjuiFontNormal = { + .charWidth = 0.5f, + .charHeight = 1.0f, + .lineHeight = 0.8f, + .defaultFontScale = 32.0f, + .rotatedUV = true, + .textBeginDisplayList = djui_font_normal_text_begin, + .render_char = djui_font_normal_render_char, + .char_width = djui_font_normal_char_width, +}; + + //////////////////////////////// + // font 1 (custom title font) // +//////////////////////////////// + +static f32 sDjuiFontTitleCharWidths[] = { +/* ! " # $ % & ' ( ) * + , - . / */ + 0.50f, 0.50f, 0.50f, 0.50f, 0.50f, 0.50f, 0.50f, 0.50f, 0.50f, 0.50f, 0.50f, 0.50f, 0.50f, 0.50f, 0.50f, +/* 0 1 2 3 4 5 6 7 8 9 */ + 0.45f, 0.35f, 0.45f, 0.45f, 0.45f, 0.45f, 0.45f, 0.45f, 0.45f, 0.45f, +/* : ; < = > ? @ */ + 0.50f, 0.50f, 0.50f, 0.50f, 0.50f, 0.50f, 0.50f, +/* A B C D E F G H I J K L M N O P Q R S T U V W X Y Z */ + 0.55f, 0.50f, 0.50f, 0.50f, 0.45f, 0.45f, 0.50f, 0.55f, 0.28f, 0.60f, 0.50f, 0.45f, 0.55f, 0.50f, 0.50f, 0.45f, 0.50f, 0.50f, 0.55f, 0.50f, 0.50f, 0.50f, 0.60f, 0.52f, 0.60f, 0.45f, +/* [ \ ] ^ _ ` */ + 0.50f, 0.50f, 0.50f, 0.50f, 0.50f, 0.50f, +/* a b c d e f g h i j k l m n o p q r s t u v w x y z */ + 0.45f, 0.45f, 0.40f, 0.40f, 0.45f, 0.37f, 0.40f, 0.40f, 0.20f, 0.45f, 0.40f, 0.30f, 0.50f, 0.40f, 0.40f, 0.40f, 0.45f, 0.40f, 0.50f, 0.45f, 0.50f, 0.40f, 0.50f, 0.50f, 0.45f, 0.45f, +/* { | } ~ ! */ + 0.50f, 0.50f, 0.50f, 0.50f, 0.50f, +}; + +static void djui_font_title_render_char(char c) { + extern const u8* const font_title_chars[]; + djui_gfx_render_texture(font_title_chars[c - '!'], 64, 64, 32); +} + +static f32 djui_font_title_char_width(char c) { + if (c == ' ') { return 0.30f; } + return sDjuiFontTitleCharWidths[c - '!']; +} + +static const struct DjuiFont sDjuiFontTitle = { + .charWidth = 1.0f, + .charHeight = 1.0f, + .lineHeight = 0.7f, + .defaultFontScale = 64.0f, + .rotatedUV = false, + .textBeginDisplayList = NULL, + .render_char = djui_font_title_render_char, + .char_width = djui_font_title_char_width, +}; + + /////////////// + // font list // +/////////////// + +struct DjuiFont gDjuiFonts[] = { + sDjuiFontNormal, + sDjuiFontTitle, +}; \ No newline at end of file diff --git a/src/pc/djui/djui_font.h b/src/pc/djui/djui_font.h new file mode 100644 index 00000000..fda22bfd --- /dev/null +++ b/src/pc/djui/djui_font.h @@ -0,0 +1,17 @@ +#pragma once +#include "djui.h" + +#pragma pack(1) +struct DjuiFont { + f32 charWidth; + f32 charHeight; + f32 lineHeight; + f32 defaultFontScale; + u8 textureBitSize; + bool rotatedUV; + const Gfx* textBeginDisplayList; + void (*render_char)(char); + f32 (*char_width)(char); +}; + +extern struct DjuiFont gDjuiFonts[]; \ No newline at end of file diff --git a/src/pc/djui/djui_gfx.c b/src/pc/djui/djui_gfx.c index e31060dd..a4daa06f 100644 --- a/src/pc/djui/djui_gfx.c +++ b/src/pc/djui/djui_gfx.c @@ -26,55 +26,11 @@ const Gfx dl_djui_simple_rect[] = { ///////////////////////////////////////////// -static Vtx vertex_djui_ia_char[] = { - {{{ 0, -16, 0}, 0, { 0, 256}, { 0xff, 0xff, 0xff, 0xff }}}, - {{{ 8, -16, 0}, 0, { 0, 0}, { 0xff, 0xff, 0xff, 0xff }}}, - {{{ 8, 0, 0}, 0, { 512, 0}, { 0xff, 0xff, 0xff, 0xff }}}, - {{{ 0, 0, 0}, 0, { 512, 256}, { 0xff, 0xff, 0xff, 0xff }}}, -}; - -const Gfx dl_djui_ia_text_begin[] = { - gsDPPipeSync(), - gsSPClearGeometryMode(G_LIGHTING), - gsDPSetCombineMode(G_CC_FADEA, G_CC_FADEA), - gsDPSetEnvColor(255, 255, 255, 255), - gsDPSetRenderMode(G_RM_XLU_SURF, G_RM_XLU_SURF2), - gsDPSetTextureFilter(G_TF_POINT), - gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON), - gsSPEndDisplayList(), -}; - -const Gfx dl_djui_ia_text_settings[] = { - gsDPSetTile(G_IM_FMT_IA, G_IM_SIZ_16b, 0, 0, G_TX_LOADTILE, 0, G_TX_WRAP | G_TX_NOMIRROR, 3, G_TX_NOLOD, G_TX_WRAP | G_TX_NOMIRROR, 4, G_TX_NOLOD), - gsDPLoadSync(), - gsDPLoadBlock(G_TX_LOADTILE, 0, 0, ((16 * 8 + G_IM_SIZ_4b_INCR) >> G_IM_SIZ_4b_SHIFT) - 1, CALC_DXT(16, G_IM_SIZ_4b_BYTES)), - gsDPSetTile(G_IM_FMT_IA, G_IM_SIZ_4b, 1, 0, G_TX_RENDERTILE, 0, G_TX_WRAP | G_TX_NOMIRROR, 3, G_TX_NOLOD, G_TX_WRAP | G_TX_NOMIRROR, 4, G_TX_NOLOD), - gsDPSetTileSize(0, 0, 0, (16 - 1) << G_TEXTURE_IMAGE_FRAC, (8 - 1) << G_TEXTURE_IMAGE_FRAC), - gsSPVertex(vertex_djui_ia_char, 4, 0), - gsSPExecuteDjui(G_TEXCLIP_DJUI), - gsSP2Triangles(0, 1, 2, 0x0, 0, 2, 3, 0x0), - gsSPEndDisplayList(), -}; - -void djui_gfx_render_char(u8 c) { - void** fontLUT; - void* packedTexture; - - fontLUT = segmented_to_virtual(main_font_lut); - packedTexture = segmented_to_virtual(fontLUT[c]); - - gDPPipeSync(gDisplayListHead++); - gDPSetTextureImage(gDisplayListHead++, G_IM_FMT_IA, G_IM_SIZ_16b, 1, VIRTUAL_TO_PHYSICAL(packedTexture)); - gSPDisplayList(gDisplayListHead++, dl_djui_ia_text_settings); - -} -///////////////////////////////////////////// - static const Vtx vertex_djui_image[] = { {{{ 0, -1, 0 }, 0, { 0, 512 }, { 0xff, 0xff, 0xff, 0xff }}}, - {{{ 1, -1, 0 }, 0, { 512, 512 }, { 0xff, 0xff, 0xff, 0xff }}}, + {{{ 1, -1, 0 }, 0, { 512, 512 }, { 0xff, 0xff, 0xff, 0xff }}}, {{{ 1, 0, 0 }, 0, { 512, 0 }, { 0xff, 0xff, 0xff, 0xff }}}, - {{{ 0, 0, 0 }, 0, { 0, 0 }, { 0xff, 0xff, 0xff, 0xff }}}, + {{{ 0, 0, 0 }, 0, { 0, 0 }, { 0xff, 0xff, 0xff, 0xff }}}, }; const Gfx dl_djui_image[] = { diff --git a/src/pc/djui/djui_gfx.h b/src/pc/djui/djui_gfx.h index e9184739..ff830767 100644 --- a/src/pc/djui/djui_gfx.h +++ b/src/pc/djui/djui_gfx.h @@ -6,11 +6,9 @@ #define DJUI_MTX_NOPUSH 2 extern const Gfx dl_djui_simple_rect[]; -extern const Gfx dl_djui_ia_text_begin[]; extern const Gfx dl_djui_img_begin[]; extern const Gfx dl_djui_img_end[]; -void djui_gfx_render_char(u8 c); void djui_gfx_render_texture(const u8* texture, u32 w, u32 h, u32 bitSize); void djui_gfx_position_translate(f32* x, f32* y); diff --git a/src/pc/djui/djui_panel_debug.c b/src/pc/djui/djui_panel_debug.c new file mode 100644 index 00000000..23c2cae0 --- /dev/null +++ b/src/pc/djui/djui_panel_debug.c @@ -0,0 +1,66 @@ +#include "djui.h" + +static struct DjuiRect* sDjuiRect = NULL; +static struct DjuiText* sDjuiText = NULL; + +static struct DjuiRect* sDjuiRect2 = NULL; +static struct DjuiText* sDjuiText2 = NULL; + +static void djui_panel_debug_render_pre(struct DjuiBase* base, bool* skipRender) { + static u32 sTimer = 0; + sTimer++; + if (sDjuiText != NULL) { + djui_base_set_location(&sDjuiText->base, + 32.0f + cos(sTimer / 20.0f) * 100.0f, + 32.0f + sin(sTimer / 62.0f) * 50.0f); + djui_text_set_font_scale(sDjuiText, 16.0f + sin((sTimer) / 72.0f) * 4.0f); + } + + if (sDjuiText2 != NULL) { + djui_base_set_location(&sDjuiText2->base, + 32.0f + cos(sTimer / 20.0f) * 100.0f, + 32.0f + sin(sTimer / 62.0f) * 100.0f); + djui_text_set_font_scale(sDjuiText2, 64.0f + sin((sTimer) / 72.0f) * 8.0f); + } +} + +void djui_panel_debug_create(void) { + sDjuiRect = djui_rect_create(&gDjuiRoot->base); + djui_base_set_location(&sDjuiRect->base, 64, 64); + djui_base_set_size(&sDjuiRect->base, 300, 100); + djui_base_set_color(&sDjuiRect->base, 0, 0, 0, 255); + djui_base_set_alignment(&sDjuiRect->base, DJUI_HALIGN_RIGHT, DJUI_VALIGN_TOP); + sDjuiRect->base.on_render_pre = djui_panel_debug_render_pre; + + sDjuiText = djui_text_create(&sDjuiRect->base, "hello\nworld"); + djui_base_set_location(&sDjuiText->base, 0, 0); + djui_base_set_size(&sDjuiText->base, 300, 300); + djui_base_set_color(&sDjuiText->base, 255, 255, 255, 255); + djui_text_set_drop_shadow(sDjuiText, 255, 0, 0, 255); + djui_text_set_alignment(sDjuiText, DJUI_HALIGN_LEFT, DJUI_VALIGN_TOP); + + sDjuiRect2 = djui_rect_create(&gDjuiRoot->base); + djui_base_set_location(&sDjuiRect2->base, 64, 64); + djui_base_set_size(&sDjuiRect2->base, 300, 100); + djui_base_set_color(&sDjuiRect2->base, 100, 100, 100, 255); + djui_base_set_alignment(&sDjuiRect2->base, DJUI_HALIGN_RIGHT, DJUI_VALIGN_BOTTOM); + + sDjuiText2 = djui_text_create(&sDjuiRect2->base, "hello\nworld"); + djui_base_set_location(&sDjuiText2->base, 0, 0); + djui_base_set_size(&sDjuiText2->base, 400, 400); + djui_base_set_color(&sDjuiText2->base, 255, 255, 255, 255); + djui_text_set_drop_shadow(sDjuiText2, 255, 0, 0, 255); + djui_text_set_alignment(sDjuiText2, DJUI_HALIGN_LEFT, DJUI_VALIGN_TOP); + djui_text_set_font(sDjuiText2, &gDjuiFonts[1]); + + struct DjuiText* alphabet = djui_text_create(&gDjuiRoot->base, "abcdefghijklmnopqrstuvwxyz\nABCDEFGHIJKLMNOPQRSTUVWXYZ\n01234567890\nthe quick brown fox jumps over the lazy dog\ngeqkbnfjsortelydg\nTHE QUICK BROWN FOX JUMPS OVER THE LAZY DOG\nGEQKBNFJSORTELYDG"); + djui_base_set_location(&alphabet->base, 0, 0); + djui_base_set_size(&alphabet->base, 400, 400); + djui_base_set_size_type(&alphabet->base, DJUI_SVT_RELATIVE, DJUI_SVT_RELATIVE); + djui_base_set_size(&alphabet->base, 1, 1); + djui_base_set_color(&alphabet->base, 255, 255, 255, 255); + djui_text_set_drop_shadow(alphabet, 255, 0, 0, 255); + djui_text_set_alignment(alphabet, DJUI_HALIGN_CENTER, DJUI_VALIGN_CENTER); + djui_text_set_font(alphabet, &gDjuiFonts[1]); + djui_text_set_font_scale(alphabet, 64); +} diff --git a/src/pc/djui/djui_panel_debug.h b/src/pc/djui/djui_panel_debug.h new file mode 100644 index 00000000..a7499b35 --- /dev/null +++ b/src/pc/djui/djui_panel_debug.h @@ -0,0 +1,4 @@ +#pragma once +#include "djui.h" + +void djui_panel_debug_create(void); diff --git a/src/pc/djui/djui_panel_main.c b/src/pc/djui/djui_panel_main.c index c491e850..277076d0 100644 --- a/src/pc/djui/djui_panel_main.c +++ b/src/pc/djui/djui_panel_main.c @@ -5,19 +5,19 @@ ALIGNED8 static u8 texture_title[] = { }; struct DjuiRect* gPanelMainMenu = NULL; -struct DjuiRect* sTitleContainer = NULL; struct DjuiFlowLayout* sButtonContainer = NULL; +struct DjuiText* sTitleText = NULL; struct DjuiText* sVersionText = NULL; static void djui_panel_main_render_pre(struct DjuiBase* base, bool* skipRender) { - sTitleContainer->base.height.value = sButtonContainer->base.clip.y - gPanelMainMenu->base.comp.y; - sVersionText->base.height.value = sTitleContainer->base.height.value; + sTitleText->base.height.value = sButtonContainer->base.clip.y - gPanelMainMenu->base.comp.y; + sVersionText->base.height.value = sTitleText->base.height.value; } void djui_panel_main_create(void) { gPanelMainMenu = djui_rect_create(&gDjuiRoot->base); djui_base_set_size_type(&gPanelMainMenu->base, DJUI_SVT_ABSOLUTE, DJUI_SVT_RELATIVE); - djui_base_set_size(&gPanelMainMenu->base, 512.0f + (16 * 2.0f), 1.0f); + djui_base_set_size(&gPanelMainMenu->base, 350.0f + (16 * 2.0f), 1.0f); djui_base_set_color(&gPanelMainMenu->base, 0, 0, 0, 230); djui_base_set_border_color(&gPanelMainMenu->base, 0, 0, 0, 200); djui_base_set_border_width(&gPanelMainMenu->base, 8); @@ -49,18 +49,16 @@ void djui_panel_main_create(void) { button4->base.interactable->on_click = djui_panel_quit_open; } - sTitleContainer = djui_rect_create(&gPanelMainMenu->base); - djui_base_set_alignment(&sTitleContainer->base, DJUI_HALIGN_CENTER, DJUI_VALIGN_TOP); - djui_base_set_size_type(&sTitleContainer->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); - djui_base_set_size(&sTitleContainer->base, 1.0f, 1.0f); - djui_base_set_color(&sTitleContainer->base, 0, 0, 0, 0); - sTitleContainer->base.on_render_pre = djui_panel_main_render_pre; - { - struct DjuiImage* title = djui_image_create(&sTitleContainer->base, texture_title, 512, 128, 32); - djui_base_set_size(&title->base, 1.0f, 128.0f / 512.0f); - djui_base_set_size_type(&title->base, DJUI_SVT_RELATIVE, DJUI_SVT_ASPECT_RATIO); - djui_base_set_alignment(&title->base, DJUI_HALIGN_CENTER, DJUI_VALIGN_CENTER); - } + //sTitleText = djui_text_create(&gPanelMainMenu->base, "SM64EX\nCOOP"); + sTitleText = djui_text_create(&gPanelMainMenu->base, "\\#ff0800\\SM\\#1be700\\64\\#00b3ff\\EX\n\\#ffef00\\COOP"); + djui_base_set_alignment(&sTitleText->base, DJUI_HALIGN_CENTER, DJUI_VALIGN_TOP); + djui_base_set_size_type(&sTitleText->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); + djui_base_set_size(&sTitleText->base, 1.0f, 1.0f); + djui_base_set_color(&sTitleText->base, 255, 8, 0, 255); + djui_text_set_alignment(sTitleText, DJUI_HALIGN_CENTER, DJUI_VALIGN_CENTER); + djui_text_set_font(sTitleText, &gDjuiFonts[1]); + djui_text_set_font_scale(sTitleText, gDjuiFonts[1].defaultFontScale); + sTitleText->base.on_render_pre = djui_panel_main_render_pre; sVersionText = djui_text_create(&gPanelMainMenu->base, "version - unst 5"); djui_base_set_alignment(&sVersionText->base, DJUI_HALIGN_CENTER, DJUI_VALIGN_BOTTOM); diff --git a/src/pc/djui/djui_panel_quit.c b/src/pc/djui/djui_panel_quit.c index de0362bd..cfa0fdb5 100644 --- a/src/pc/djui/djui_panel_quit.c +++ b/src/pc/djui/djui_panel_quit.c @@ -48,7 +48,7 @@ static void djui_panel_quit_create(void) { sClosing = false; sPanelQuit = djui_rect_create(&gDjuiRoot->base); djui_base_set_size_type(&sPanelQuit->base, DJUI_SVT_ABSOLUTE, DJUI_SVT_RELATIVE); - djui_base_set_size(&sPanelQuit->base, 512.0f + (16 * 2.0f), 1.0f); + djui_base_set_size(&sPanelQuit->base, 350.0f + (16 * 2.0f), 1.0f); djui_base_set_color(&sPanelQuit->base, 0, 0, 0, 230); djui_base_set_border_color(&sPanelQuit->base, 0, 0, 0, 200); djui_base_set_border_width(&sPanelQuit->base, 8); diff --git a/src/pc/djui/djui_text.c b/src/pc/djui/djui_text.c index 653b10d5..9cabc822 100644 --- a/src/pc/djui/djui_text.c +++ b/src/pc/djui/djui_text.c @@ -2,6 +2,8 @@ #include "djui.h" #include "game/segment2.h" +static u8 sSavedAlpha = 0; + //////////////// // properties // //////////////// @@ -18,8 +20,12 @@ void djui_text_set_text(struct DjuiText* text, const char* message) { memcpy(text->message, message, sizeof(char) * (messageLen + 1)); } -void djui_text_set_font_size(struct DjuiText* text, f32 fontSize) { - text->fontSize = fontSize; +void djui_text_set_font(struct DjuiText* text, struct DjuiFont* font) { + text->font = font; +} + +void djui_text_set_font_scale(struct DjuiText* text, f32 fontScale) { + text->fontScale = fontScale; } void djui_text_set_drop_shadow(struct DjuiText* text, f32 r, f32 g, f32 b, f32 a) { @@ -38,9 +44,6 @@ void djui_text_set_alignment(struct DjuiText* text, enum DjuiHAlign hAlign, enum // rendering // /////////////// -#define DJUI_TEXT_CHAR_HEIGHT 16 -#define DJUI_TEXT_CHAR_WIDTH 8 - static f32 sTextRenderX = 0; static f32 sTextRenderY = 0; static f32 sTextRenderLastX = 0; @@ -51,84 +54,99 @@ static void djui_text_translate(f32 x, f32 y) { sTextRenderY += y; } -static void djui_text_render_single_char(struct DjuiText* text, u8 d) { +static void djui_text_render_single_char(struct DjuiText* text, char c) { struct DjuiBaseRect* comp = &text->base.comp; - f32 dX = comp->x + sTextRenderX * text->fontSize; - f32 dY = comp->y + sTextRenderY * text->fontSize; - f32 dW = DJUI_TEXT_CHAR_WIDTH * text->fontSize; - f32 dH = DJUI_TEXT_CHAR_HEIGHT * text->fontSize; + f32 dX = comp->x + sTextRenderX * text->fontScale; + f32 dY = comp->y + sTextRenderY * text->fontScale; + f32 dW = text->font->charWidth * text->fontScale; + f32 dH = text->font->charHeight * text->fontScale; - if (djui_gfx_add_clipping_specific(&text->base, true, dX, dY, dW, dH)) { + if (djui_gfx_add_clipping_specific(&text->base, text->font->rotatedUV, dX, dY, dW, dH)) { return; } create_dl_translation_matrix(DJUI_MTX_NOPUSH, sTextRenderX - sTextRenderLastX, (sTextRenderY - sTextRenderLastY) * -1.0f, 0); - djui_gfx_render_char(d); + text->font->render_char(c); sTextRenderLastX = sTextRenderX; sTextRenderLastY = sTextRenderY; } -static void djui_text_render_char(struct DjuiText* text, u8 d) { +static void djui_text_render_char(struct DjuiText* text, char c) { if (text->dropShadow.a > 0) { // render drop shadow struct DjuiBase* base = &text->base; - sTextRenderX += 0.5f; - sTextRenderY += 0.5f; + sTextRenderX += 1.0f / text->fontScale; + sTextRenderY += 1.0f / text->fontScale; gDPSetEnvColor(gDisplayListHead++, text->dropShadow.r, text->dropShadow.g, text->dropShadow.b, text->dropShadow.a); - djui_text_render_single_char(text, d); + djui_text_render_single_char(text, c); gDPSetEnvColor(gDisplayListHead++, base->color.r, base->color.g, base->color.b, base->color.a); - sTextRenderX -= 0.5f; - sTextRenderY -= 0.5f; + sTextRenderX -= 1.0f / text->fontScale; + sTextRenderY -= 1.0f / text->fontScale; } - djui_text_render_single_char(text, d); + djui_text_render_single_char(text, c); } -static f32 djui_text_measure_word_width(char* message) { +static f32 djui_text_measure_word_width(struct DjuiText* text, char* message) { f32 width = 0; + bool skipping = false; while (*message != '\0') { - u8 d = str_ascii_char_to_dialog(*message); - if (d == DIALOG_CHAR_SPACE) { return width; } - if (d == DIALOG_CHAR_NEWLINE) { return width; } - if (d == DIALOG_CHAR_TERMINATOR) { return width; } - width += gDialogCharWidths[d]; + char c = *message; + if (c == ' ') { return width; } + if (c == '\n') { return width; } + if (c == '\0') { return width; } + if (c == '\\') { skipping = !skipping; } + if (!skipping) { + width += text->font->char_width(c); + } message++; } return width; } -static void djui_text_read_line(char* message, u16* index, f32* lineWidth, f32 maxLineWidth, bool onLastLine, bool* ellipses) { +static void djui_text_read_line(struct DjuiText* text, u16* index, f32* lineWidth, f32 maxLineWidth, bool onLastLine, bool* ellipses) { + char* message = text->message; *lineWidth = 0; - u8 lastD = DIALOG_CHAR_TERMINATOR; + char lastC = '\0'; f32 ellipsesWidth = gDialogCharWidths[0x3F] * 3.0f; u16 lastSafeEllipsesIndex = *index; u16 lastSafeEllipsesLineWidth = *lineWidth + ellipsesWidth; + bool skipping = false; while (message[*index] != '\0') { - u8 d = str_ascii_char_to_dialog(message[*index]); + char c = message[*index]; + f32 charWidth = text->font->char_width(c); + + // check for special escape sequences + if (c == '\\') { skipping = !skipping; } + if (skipping || c == '\\') { + *index = *index + 1; + lastC = c; + continue; + } // check for newline - if (d == DIALOG_CHAR_NEWLINE) { + if (c == '\n') { *index = *index + 1; break; } // check to see if this character would exceed size - if (*lineWidth + gDialogCharWidths[d] >= maxLineWidth) { + if (*lineWidth + charWidth >= maxLineWidth) { break; } // check to see if this word exceeds size - if (!onLastLine && lastD == DIALOG_CHAR_SPACE && d != DIALOG_CHAR_SPACE) { - f32 wordWidth = djui_text_measure_word_width(&message[*index]); + if (!onLastLine && lastC == ' ' && c != ' ') { + f32 wordWidth = djui_text_measure_word_width(text, &message[*index]); if (*lineWidth + wordWidth >= maxLineWidth) { return; } } - *lineWidth += gDialogCharWidths[d]; + *lineWidth += charWidth; // check for safe ellipses index if (onLastLine && ((*lineWidth + ellipsesWidth) < maxLineWidth)) { @@ -137,7 +155,7 @@ static void djui_text_read_line(char* message, u16* index, f32* lineWidth, f32 m } *index = *index + 1; - lastD = d; + lastC = c; } // check to see if we should replace the end of the last line with ellipses @@ -148,6 +166,37 @@ static void djui_text_read_line(char* message, u16* index, f32* lineWidth, f32 m } } +static int djui_text_render_line_parse_escape(struct DjuiText* text, u16 startIndex, u16 endIndex) { + bool parsingColor = text->message[startIndex + 1] == '#'; + u16 i = parsingColor ? (startIndex + 1) : startIndex; + + u32 color = 0; + u8 colorPieces = 0; + while (++i < endIndex) { + char c = text->message[i]; + if (c == '\\') { break; } + if (parsingColor) { + u8 colorPiece = 0; + if (c >= '0' && c <= '9') { colorPiece = c - '0'; } + else if (c >= 'a' && c <= 'f') { colorPiece = 10 + c - 'a'; } + else if (c >= 'A' && c <= 'F') { colorPiece = 10 + c - 'A'; } + color = (color << 4) | colorPiece; + colorPieces++; + } + } + + if (parsingColor) { + if (colorPieces == 6) { + gDPSetEnvColor(gDisplayListHead++, ((color >> 16) & 0xFF), ((color >> 8) & 0xFF), ((color >> 0) & 0xFF), sSavedAlpha); + } else if (colorPieces == 8) { + gDPSetEnvColor(gDisplayListHead++, ((color >> 24) & 0xFF), ((color >> 16) & 0xFF), ((color >> 8) & 0xFF), ((color >> 0) & 0xFF)); + sSavedAlpha = ((color << 0) & 0xFF); + } + } + + return i; +} + static void djui_text_render_line(struct DjuiText* text, u16 startIndex, u16 endIndex, f32 lineWidth, bool ellipses) { struct DjuiBase* base = &text->base; struct DjuiBaseRect* comp = &base->comp; @@ -156,44 +205,47 @@ static void djui_text_render_line(struct DjuiText* text, u16 startIndex, u16 end // horizontal alignment if (text->textHAlign == DJUI_HALIGN_CENTER) { // center text - f32 offset = (comp->width / text->fontSize) / 2.0f - lineWidth / 2.0f; + f32 offset = (comp->width / text->fontScale) / 2.0f - lineWidth / 2.0f; djui_text_translate(offset, 0); curWidth = offset; } else if (text->textHAlign == DJUI_HALIGN_RIGHT) { // right align text - f32 offset = (comp->width / text->fontSize) - lineWidth; + f32 offset = (comp->width / text->fontScale) - lineWidth; djui_text_translate(offset, 0); curWidth = offset; } // render the line + bool escapeCode = false; for (int i = startIndex; i < endIndex; i++) { - u8 d = str_ascii_char_to_dialog(text->message[i]); - switch (d) { - case DIALOG_CHAR_SPACE: - break; - case DIALOG_CHAR_NEWLINE: - break; - default: - djui_text_render_char(text, d); - break; + char c = text->message[i]; + if (c == '\\') { + i = djui_text_render_line_parse_escape(text, i, endIndex); + continue; } - djui_text_translate(gDialogCharWidths[d], 0); - curWidth += gDialogCharWidths[d]; + + f32 charWidth = text->font->char_width(c); + if (c != '\n' && c != ' ') { + djui_text_render_char(text, c); + } + + djui_text_translate(charWidth, 0); + curWidth += charWidth; } // render ellipses if (ellipses) { for (int i = 0; i < 3; i++) { - u8 d = str_ascii_char_to_dialog('.'); - djui_text_render_char(text, d); - djui_text_translate(gDialogCharWidths[d], 0); - curWidth += gDialogCharWidths[d]; + char c = '.'; + f32 charWidth = text->font->char_width(c); + djui_text_render_char(text, c); + djui_text_translate(charWidth, 0); + curWidth += charWidth; } } // reset translation matrix - djui_text_translate(-curWidth, DJUI_TEXT_CHAR_HEIGHT); + djui_text_translate(-curWidth, text->font->lineHeight); } //////////// @@ -201,11 +253,13 @@ static void djui_text_render_line(struct DjuiText* text, u16 startIndex, u16 end //////////// static void djui_text_render(struct DjuiBase* base) { - gSPDisplayList(gDisplayListHead++, dl_djui_ia_text_begin); - struct DjuiText* text = (struct DjuiText*)base; struct DjuiBaseRect* comp = &base->comp; + if (text->font->textBeginDisplayList != NULL) { + gSPDisplayList(gDisplayListHead++, text->font->textBeginDisplayList); + } + // reset render location sTextRenderX = 0; sTextRenderY = 0; @@ -224,24 +278,25 @@ static void djui_text_render(struct DjuiBase* base) { djui_gfx_scale_translate(&translatedWidth, &translatedHeight); // compute font size - f32 translatedFontSize = text->fontSize; + f32 translatedFontSize = text->fontScale; djui_gfx_size_translate(&translatedFontSize); create_dl_scale_matrix(DJUI_MTX_NOPUSH, translatedFontSize, translatedFontSize, 1.0f); // set color gDPSetEnvColor(gDisplayListHead++, base->color.r, base->color.g, base->color.b, base->color.a); + sSavedAlpha = base->color.a; // count lines u16 startIndex = 0; u16 endIndex = 0; - f32 maxLineWidth = comp->width / text->fontSize; + f32 maxLineWidth = comp->width / text->fontScale; u16 lineCount = 0; - u16 maxLines = comp->height / ((f32)DJUI_TEXT_CHAR_HEIGHT * text->fontSize); + u16 maxLines = comp->height / ((f32)text->font->charHeight * text->fontScale); while (text->message[startIndex] != '\0') { bool onLastLine = lineCount + 1 >= maxLines; f32 lineWidth; bool ellipses; - djui_text_read_line(text->message, &endIndex, &lineWidth, maxLineWidth, onLastLine, &ellipses); + djui_text_read_line(text, &endIndex, &lineWidth, maxLineWidth, onLastLine, &ellipses); startIndex = endIndex; lineCount++; if (onLastLine) { break; } @@ -250,11 +305,11 @@ static void djui_text_render(struct DjuiBase* base) { // do vertical alignment f32 vOffset = 0; if (text->textVAlign == DJUI_VALIGN_CENTER) { - vOffset += (comp->height / text->fontSize) / 2.0f; - vOffset -= (lineCount * DJUI_TEXT_CHAR_HEIGHT) / 2.0f; + vOffset += (comp->height / text->fontScale) / 2.0f; + vOffset -= (lineCount * text->font->charHeight) / 2.0f; } else if (text->textVAlign == DJUI_VALIGN_BOTTOM) { - vOffset += (comp->height / text->fontSize); - vOffset -= (lineCount * DJUI_TEXT_CHAR_HEIGHT); + vOffset += (comp->height / text->fontScale); + vOffset -= (lineCount * text->font->charHeight); } djui_text_translate(0, vOffset); @@ -266,7 +321,7 @@ static void djui_text_render(struct DjuiBase* base) { bool ellipses = false; while (text->message[startIndex] != '\0') { bool onLastLine = lineIndex + 1 >= maxLines; - djui_text_read_line(text->message, &endIndex, &lineWidth, maxLineWidth, onLastLine, &ellipses); + djui_text_read_line(text, &endIndex, &lineWidth, maxLineWidth, onLastLine, &ellipses); djui_text_render_line(text, startIndex, endIndex, lineWidth, ellipses); startIndex = endIndex; lineIndex++; @@ -290,8 +345,9 @@ struct DjuiText* djui_text_create(struct DjuiBase* parent, const char* message) djui_base_init(parent, base, djui_text_render, djui_text_destroy); text->message = NULL; + djui_text_set_font(text, &gDjuiFonts[0]); + djui_text_set_font_scale(text, text->font->defaultFontScale); djui_text_set_text(text, message); - djui_text_set_font_size(text, 2.0f); djui_text_set_alignment(text, DJUI_HALIGN_LEFT, DJUI_VALIGN_TOP); return text; diff --git a/src/pc/djui/djui_text.h b/src/pc/djui/djui_text.h index 229d6af5..92c40e29 100644 --- a/src/pc/djui/djui_text.h +++ b/src/pc/djui/djui_text.h @@ -5,14 +5,16 @@ struct DjuiText { struct DjuiBase base; char* message; - f32 fontSize; + struct DjuiFont* font; + f32 fontScale; struct DjuiColor dropShadow; enum DjuiHAlign textHAlign; enum DjuiVAlign textVAlign; }; void djui_text_set_text(struct DjuiText* text, const char* message); -void djui_text_set_font_size(struct DjuiText* text, f32 fontSize); +void djui_text_set_font(struct DjuiText* text, struct DjuiFont* font); +void djui_text_set_font_scale(struct DjuiText* text, f32 fontScale); void djui_text_set_drop_shadow(struct DjuiText* text, f32 r, f32 g, f32 b, f32 a); void djui_text_set_alignment(struct DjuiText* text, enum DjuiHAlign hAlign, enum DjuiVAlign vAlign); diff --git a/textures/custom_font_title/custom_font_title_01.rgba32.png b/textures/custom_font_title/custom_font_title_01.rgba32.png new file mode 100644 index 0000000000000000000000000000000000000000..d8a695387b3c6f11dd66cc7c57f1c1a88fc5d88c GIT binary patch literal 480 zcmV<60U!Q}P)Px$nn^@KRCt{2ncaH|Ks^E!&0GL^mv5tJQ@HpZgqT@K+2m#}K#Ke=y8eL`4;V*z>~DTkd`fsrAS9i& zmq3c>i&tcI7?k#?_F>QwKPx%QAtEWRCt{2nczO7+#-yC;$e3M2H0ifB;wk^^UD}Y}JST zI*b}~P|Io&&#?Av^$`w!8b2rkFd|$MZNSz5kcW8sAwmKy>*m>-h@Ay+ImqAt&K+?9 z==J?l5-|ZzT@rgiEhV8c>#RWU_dC^fow7-Flww#p z-L@?e5gB7h2$2-P7(+xvZQG`7i!KR)NKiyX)>=|ZMFp_dzHNtLpsK1;g83b#2sSS^ zSAd0BN%&Z6>2|xNL@2IRZUk_%>M{(&t^hlNjlU9M0QWGosZAlm@2tn;vAR|&eiWFd zDRjHZaqeg~yTB0ET9Q((?37YL+i@I=&OWd`4!?i90;Jp?>bkDO^ZCsB;p_Dpx?NoDy8^79V_$%2nqrUirUd%F zN8k6pS^ru^k?aC4P18iP?~4@?s<`a?Z1(m$^&H$V8DnDSfTEG`oR(6)1KT;|P*qhl z3-`UQ-mk@$3m&+-$zmOV-h1yw;oy7^V@1ig}y%#(%4>|U1PdOG7 zNN3pX7Rw(gvFsN=07(%liBLTYgh%A3%)XCb5~+H2OXBp|cM+J!;W=+}iMb?BGX!NA xhG7_nVHk#C7=~dOhG7_nVHk#C7>4=td;^6eswuk7ek}k1002ovPDHLkV1h@GBWVBt literal 0 HcmV?d00001 diff --git a/textures/custom_font_title/custom_font_title_03.rgba32.png b/textures/custom_font_title/custom_font_title_03.rgba32.png new file mode 100644 index 0000000000000000000000000000000000000000..db512f96a4bb73954e317c87a5b6cae5b7dcc063 GIT binary patch literal 1027 zcmV+e1pNDnP)Px&y-7qtRCt{2n(c9;Fc5~{++71|fh$2RkP?&}YQDWz0JQK%$Iq7biC+)Ei+apJka>UMZy*V>ScOrIq>hgJ(w3TaqM562G&)TrQ)(DGlpURh7~8XsZ(n za3;S^O6jB-BZP3p69Nk_gFkb>AWi+@d{tGWw;3~I%CfX|Cs-ja_{kC&5i)?T3}ehI z-*uhK0IM*|0F+V?;@_I5uK%(u(RJIE7lKP5NfKmP=KPpSCYInxEUD~lAFy}c-T*-#&@>Is=QDu&n(v)nj04;QQ3g1j zPDa0!(&^EwsxqFTl#ZO6?U|wX-^#$f0fr+B#;Jr5?{-#}C2qIds4wLGKR-V=-TrhY zRcmbN?+{xGtf#+2ilUhE`_JD6LT_Jxlc5=-&z5H}X$JU`8Cx3bn=y4=Px@^vJOg?k z&>^zixDTS2w zQvT_5`d=!GDU+>@?bzCAF0w4M%IA4*mDkJU5pA{efM_4!+RMAHGs<2)t|j1-e+K;$ zIN=@$4J)ssK)_`HUm)WufNojz{3*uiuMomIo%Nc3-(00MDWy$b;=T+8?gycpEddv! zx}fVU&lkt{r@uORp4;SK?jFGC_J=E(aVXebG=?| z^7g&;i5RE97%0XVQ=D_-$Xjn|nkvq@5<;l9ZIx2iRJq+;y9h?NKbC3^XIX5e)D)tE zqJ`SaUX)C5-wHY6ufxU4^{w7an*|{78)T?V`j89Fq?fqvVx(P>5Zue>>EpA4J6r2z xdilQe_7@A6xAp?X3vPV}2L}fS2L}gl$3J(Ni15kGbSMA-002ovPDHLkV1gyu;6?xd literal 0 HcmV?d00001 diff --git a/textures/custom_font_title/custom_font_title_04.rgba32.png b/textures/custom_font_title/custom_font_title_04.rgba32.png new file mode 100644 index 0000000000000000000000000000000000000000..5a65b2475cc19c8d962eb3751078696e0637a27d GIT binary patch literal 1131 zcmV-x1eE)UP)Px(B}qg(pI+-{E90AhK z;0T(4#%7VkVh}Sm`l?iABO3G`dMf}PkH_Qjcsw4@8Uz5f^N;`%0K}mjn>j)O-3T4Z zfv+2X*X+8AA;p2$p73qs?*afn`v-&&AcWxQ=?PU;4Ni`t2#hfVK>$Js?)SUx+P?u< zPxu>P7;RlCrRr1HwThxhJ2##mjT#R9z*ZBe=1w4lfKqCmH%*~+hECX`fE++MKG-zt z-NM*ZdT_M6>~Pj9K)~RoEy8TYNl5&@;#>wG-t*>+F)+qJ2tk%*czb*6Pt(W!E_>c{ zD+KMfH^y%v#Kh5+WvQf;s;=wFoX#l{LQc;MOr#hsjB~E?Jf9V84QZO{6p)`L^#hL4 zq6i_2p6V7DV>%`5YI- zJYg6bx4!Opp65ykp~|wH%q2-;^&w#x>Xg7;2~RaQw=P%+F-du)l*Uw82%#8b+H2)` zZc>1=G%v?|7sA#kfOD<@s3b`S*NNkJu3UDq3nmJ%(Ji_!%$x!`Z{I}}DW#&6 z+62#WKzh6;6Vy^w6|UDSfNk|a(=>Q_d9kI^4S*XC$_PKL07@y8QpmE*R^d&^vh4kD zi|`qMUszCm?#(I_Fj3dFO4C#u1;*Fc3@5g3>IhMcIzF$juc)dD_xl}`QUpOTd+{I$ z@cjI&-5FhXC

mhbV*N_E?|E4j2!{m@&q$#gO=%S_sW5pg$<3Dvo2Vw_l2-J$6b8 zOaMffDS>t4GZ>Pe94EXhAh7iQ2_Y&?)Au;vAN`bAN~suQi_N62Yf~=Zv<_gfJbBLf zK*(|C);9xFB4krYp68~Hc)XRt=i4nSd!|>KyB1IC)P%Vc899Ji1b?e@K#K zRTMbO0gj1HN+5)6+6_xEK`;X6XKj&YaWFo&TLQsOW8V8R+2_t*`F_W=qHYJo2c z&kNDMtJ5wh48uXiCuN(s6-9x|n^PTc_>kH_Qjcs!o}l|M=Jc#yoDDU|>K002ovPDHLkV1j+v1c(3t literal 0 HcmV?d00001 diff --git a/textures/custom_font_title/custom_font_title_05.rgba32.png b/textures/custom_font_title/custom_font_title_05.rgba32.png new file mode 100644 index 0000000000000000000000000000000000000000..08037c519c094c11e2d7d59c341da860bbcf805c GIT binary patch literal 973 zcmV;;12X)HP)Px&hea_W4;C+v z88Px2!BwfNRJ#SzSlxQeXao=u5fKp)5fKp{34mhnPV5B*paswYDEI8hACI~Qea9(0 zzKRs($X53C_vFz&I5PC3bF`cz`Qj9SiiLr}I=kJwLUDGsOS(b+rfhFIzZ8t~Twk{Ed z-F{)OEX$XTBZ=Teek?+kWgLlxy);c1HjW?yNnUGBlDF0_o;gHVwYRqjBzdJ&SJyR5 z^c@i>dmbW~tpu>XJ8NnRjAyOjtN0VL#yk|fEZUQraHdM?y;-6^Gl zi7*j>8mXpf$PNwe%q0L-=O`llmR8hS!&(carh8FYme5)|+e+$izsa;y=wpkIVRZ&j zqmt)2S!X;0vMlo+`K}Yi7axUa4;YK!TGN97Yw?52z9USQo;tly&3|Z31Xt&W8S>Ni zp~wTwNzGS;ap$EjPe{JqlKe+RsH*DKd0&^;b^G{!3K|{}A=P;X-CqA!RfRN_d#KChg7f*zz6QX)+!AjkLpZm{L2`IPfVI!TO9W%g7UVY< zfm#A%kjr5Xr4+2S>=GH{`F!GZI^lY~0s!(npG23}>lOF=ooaeUza)agpigfNWidih zmp6~@##te*&aCX7HC_ZvRCecG@<$h8aiJk~dGpYg8~HgL`$TXN$PJOo2vOw6(H%v8 zsN^5)Uq8hMv(D#H|tJbR(xL!LVua7W(xQrJs? z)e8*@KKVdu22crKKkY$*()@+^70vL(} z*SWTB*?RyV5nSSi^a2V%Lv_BYDzej#h|N2%K-o`{BxoF>gtx+^m=Y28 z42Kn%L(f2^kZ<`SA|fIpA|fIpBHqJ4S#HzazUx>E00000NkvXXu0mjfPtvx5 literal 0 HcmV?d00001 diff --git a/textures/custom_font_title/custom_font_title_06.rgba32.png b/textures/custom_font_title/custom_font_title_06.rgba32.png new file mode 100644 index 0000000000000000000000000000000000000000..50222212dae3a62fc78a6e40ff5cb2407710c4a9 GIT binary patch literal 992 zcmV<610Vc}P)Px&nn^@KRCt{2n#*zIAP|QCs@(**?vWI9-6JU|1yYbhAO#!(DUbpVffU#fdJmeh zM-nfMUgI)f6{nF#bgSw98w4~OjYgxudgEim1JD5E?Z3Vi41mKn2c(vb!Z%npi_jNBkoTU9 zF*FPVbzQfIQ(n>$0<(!S#>jh5F|4(ulp-MnF~-(9K%H-19)>YgClfWsM2(N(oFkK1Ri|d6@($5efYe!X^jIoiTp~MlEqU9Ffqs)>av2ttIDN z)wPi*aF<#Az(VZ}!%+1``@a8-mKrB0rD9QVsc>3^K7eG_Cn5?V&@c?q#HO{*I>0#> zyH8$V_k=|R2qBV2+~0a?l$;Q$4(0-zCq&DiQYvYLlrn0(QmU9ZBlm_YjGnU)KqzQ{ z$Mr0w%r2Wpj4>~(3J0uEfp=qSs|C@RKZFo3s|p1oOQGw!UG#u4CMTEeMK%K%4UcVn ztSXB+QdI+AIe?#U_Sbe-Hmk2$-*cREwVk8I$$B7K|MxPSh)8R_wnOwdu{TI=cWpJC zC|xFTE0qN;aY}!%a6sSpn+?B{P<)f_G9il}#nGWlVv_W7%I{gU))S*R=Zk7$t<5cy zLzl$F0aD7{9Y8eA{;6guqYdsA;*efpvgw(Vy)m3~#5u28GE&N7e{jDp;RM0~k+4Wi zwS*8pOWR%|>G3}!4bI4W3FFL;(2c!}e=bVHP z)!SlM8vi@>17rD;`~LopuInI#0OuTxF>ubo`STL~?d=U8A0M%w4nKWfM8H)Pnk0>b z#Lz+oUP+-%b~vB}E*!8{2kedaK9>)67emoT=zaitB?U3G+mh&04`GaLjt1}jXUDfj zBzf<1lK378{T>bg#+K8k9=0|bLI|X_UW9S2QY>_agt0q3WY;LUFHjQ=TI=FDK~5xD zYfGod9y`AE6df{Ogmhgu5jn;fl2WeP?U_3vgiu=Vgz@E^x=oh-D5~1>2kz=tO zkI`T;s98vlaf#QXHAmeX`XbhrTKGY<({s+xrG6ZGTi#b+j9S0-h-UB_ z{fi1aJOl-w&xy#s9_HNb6qPiMA-TtAYp!-^sIF?F1Ea3tT^3hP0YS;O#I>p{>@l43 z-u4=z{k2O)e(iIQRX6VlXXt<4x~)HxDebDa>Ve&N^HyG-{=8+&`b;LXuOGfv9sOI! z?;p?LqTZi&?R@TSx9<$k=V&YqdiRO+<@K^hrzX4mg-|W&`RhPsg zx9eAMAd{2t}(cx;JKz@6Pry&om(Pw#Hf3+~YmPprB9Ih@I79mDq|!*k!aud4G< zyeo7x+}>m^U;NDElgp0X5IXu_-@yeHge;NI^GW8~@ksVDFiIIbUHx3vIVCg!053`3 Au>b%7 literal 0 HcmV?d00001 diff --git a/textures/custom_font_title/custom_font_title_08.rgba32.png b/textures/custom_font_title/custom_font_title_08.rgba32.png new file mode 100644 index 0000000000000000000000000000000000000000..7d4fece2ccc983e6cd9e93eed4cc3f9329a77164 GIT binary patch literal 893 zcmV-@1A_dCP)Px&H%UZ6RCt{2n#+;nAP|QCeI&q!Knm<}kEEdM9+iSN1g9W}Acr7_Acvp{feC>* z*xC}%2$1a&c=T0KHI_AqZd(1qz|PLj&KKs#ljaow{s8!U`~3E#=iJTDJN}p9Dk#5= z`QP?^=R2PBRK7*rGYKVcpT%vk$Y;C*_?5o2Jg5Qa2MqDq3yV>q2oxLhvtTP^^8uU+IbS#pBTt_dLwK{@A;k~R`c0h7;ozh|+Z z%>mZC9Lq2alpm-!lVl|$W&%`I6|DfRwdS1L3TQW!#f#4gI`Q0R>OP43vvh<$1vraM zRe%sq{Bf(odrYDsXrKae#862sp(j+Ed%3K4uB2AxEus>1&2csx><{~_Zx zm=CA<5flCxW7O^!Nr#yrob#aYZQH&?)iQx z8wL8lUsQl61pOVP1S%9#^-(1E0X=1KvAIBl6{RrI|5qre`#Z;J zhJ>;~t-bYtLLm)M8>1d*nkJ|Kr4&^W7F!r4SA<$$&jJ^eP?S$_{J=Pl(Mlky!{Wjt zhqd^ars({2SWv=%LPF%Kw)k8Lo-A=vLiQL3Be8zKrfC{V0poUJ#j~n6NLhkC4>EL! z)ZwU8>z>c)m9D2`CNFLYrGR%_f7JA!P+dSlDDBOjH)o9Um@yWt4ofuuC7dI2+#KTJ za0u22p7gk=`hbBBV@7!NSp{)cSY*50NQ-^LwhE8=7n2FvNLYEn(x~g&7yq;WQA7xa zYn@|w>pH;k^`G>Hr;$_W028qIwpPikZoiE1+ayYb_ T7FVAR00000NkvXXu0mjf*(RZ! literal 0 HcmV?d00001 diff --git a/textures/custom_font_title/custom_font_title_09.rgba32.png b/textures/custom_font_title/custom_font_title_09.rgba32.png new file mode 100644 index 0000000000000000000000000000000000000000..0dbc492befc0f3c70147a4bd32b0212c43ea5451 GIT binary patch literal 896 zcmV-`1AqL9P)Px&I!Q!9RCt{2n(c9;Fc5~{`)EKd(1KdvN}vU`Knt{hOR!6T5}*Vq0ZP#QNSuh( z%94DU!1{P*G>#QQ*wwD~LjWfyCnx_gzXJ0HK;?X2zu{SS;YVP80ieiSk2gik07mCi zG@Jr7fFa`^Gd`8EzJK0-7D)rZe!(cd`@x^#Co@-m(Y>qqCHwQ6d{=mLfe-4shEfXi zJY$|`jN^!PO|otszhr;t9$)~p?!+(*(0VJ&x~>?<5##u_2ljpcp`gh94^IonkCjq3 zm9Fc!eL#d8xGZo4FvcV+z*=jSQd9xWj+s(S3seeY${0Fz=%Av+~zqJZ7;`B_pepaRL_jEUzoj0K2Y{Y{CSQWggaqQmtE zQ!K!MoEKJA1*IN$xn9Np*^}aw_L!umNC>t?mJ<4`m0brY1lnR+>!g-g;Cw(tC0KwI zJ@;XZNj@nGoDdzp7ob5hJvhSW!1({Pmr$t$g>Tz7OL%K#w#5q&!Ie_>dc9@~FS!%6 z@%?8GN3E52H0CBkn`k zFfa9u#r|oUY+cvf&VR`AH-^{#4u!$CZMk;WOSHc>Zs48*C9L-0%ik0{H%MG1;kCj~PEJlvUW~tR W_xiF-Qk!)E0000zIK6 literal 0 HcmV?d00001 diff --git a/textures/custom_font_title/custom_font_title_10.rgba32.png b/textures/custom_font_title/custom_font_title_10.rgba32.png new file mode 100644 index 0000000000000000000000000000000000000000..6b0012fc28e3ed1ca86f270ee5bd65a1b4b2ccfb GIT binary patch literal 722 zcmV;@0xkWCP)Px%j7da6RCt{2nc%rjffZPx9U&{w5t0$e2xJ7m4=KHd zK$7OJExqTTWK}6B!p1f>0T_m1eg+Ak1yH?vA+Mswq;P$GZUN9$3;^+_bv+e{NjZlv zWgP%@_ZXv}x}sCWR)YnOkVt=;~PSWID5Bn@`%wv>{D z5XmvEHPv;!^$znwy>^pIWHV`+hOD(jL}aZ^8YW<^B`M|F`#KbuBn=XaHO7$lo??_z zvw3aX&c?m>WQ^JJhGIe@sXP*j1)OuYIZCPI93rB&Z9gIuvWZU!k@Nr}BCRz6pswqZ z{$Gch~1ibec#}R$s0|3Tx#4rpv zpU)VE;qbeEnqYvZ^zcFmC^fHjE|*JD2KbX3_>KpB62Su&)tC^+JJ`POF^=Qn|6v%4 z+WmX7RbVW8PJ*4sUlB<#u-gE8Plt_0s5k>`7C`{0s;Y&eTI*zil^j!XU`PAaO6yb=|DkN%ac%-Qu0NH|X~e0*Omb=iE)PT!)tmh0rZV zQdAopvq*?Sh}oq`?#e3;1?ODuMDQr|rdVR*2+Z{MvrsU`Y|g`U|4Px%KuJVFRCt{2na^>AAQZ;G{Aqw|j}xagU-gF2Jj8w_h2iA=fMB-u^qu2d_O8N*8l(jV+=wFNGZWN zhf)e{+uDEWW7|AJr~s?zNhu+O0OuS+2naFHa$4&n{v{_=fK~Lmu8ZW#IZOiFnzDk6 z7^T$m5yOx*ZlOn}HKW1K6}{`a-z}t+MQ4jC3lz05jjV=F3MK)v7z-pzP$mIPE`tGN z_h+^aFvd3Lc1)V4an1iMrL|oN&J;Jspzrep!C@!c>hBc*a5|O*j{sS)1<+%=dXYf@ zt+lIKJVgLtkqsP0OmsXpvSp>E05j!1(TR#3T;N$zGAV&I5wx;8rI+;w(F9|NaWG9RrsD8iSLmO3?}hZN7XbLM?{5xQvt; zpEn0=-o>HldqSH9%; z6DQYrY5HEi6014k6GPsU^eXLE!InMW=S^8Z1a`K3GkE{g+;hcOruVgZE^;$s%91C} z{9Ej)al+hMBvpJt<}9&KiY<2xp3F?L=PA;-rE%Zq`}&PLWP1$fe=dTDK&nkq{r(#vmxUW9$s9LSzyF18#^D6j$O+qH9PdpQ&bawC^Ox(7 zogZ?&jjLHd)CK6&_Z{WkU=GDQ}Bl z0-6K@d-^Va|L%I}YNr0AS34f|TxWamdHV5l<+r@j>)&qq`i*}pOWmi2*Ts8X=T;nD z@JjRKPE36zC z&i#%po4HLq>6YG-HNRz(7B1yIP_^xom?q!G0!D}r85sUO;nrRLeA2yb;h#W4p00i_ I>zopr04<`TYXATM literal 0 HcmV?d00001 diff --git a/textures/custom_font_title/custom_font_title_14.rgba32.png b/textures/custom_font_title/custom_font_title_14.rgba32.png new file mode 100644 index 0000000000000000000000000000000000000000..28744986979ef164cf33654427fce94794101d79 GIT binary patch literal 405 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D%z{XJbALn`LH zy>YSkuz~=~h0I2=ONX`%TTrjd*yvi}(9i{cVT%;}1>zaCllmTlu+{ zCcayRmbq2$jWPYRNoUonS9{k_eIWhzr_t_*-Gbf)783s)IPH6l<~-Z5?{)iOait{D z2^;4v)0@M$e$}kvcl%m69!ngTC_gN&x%Ad@0jbnqUSC~HDp&UF?kt#Q0w8% t5_evkg2(%hav!XE%wPKw6dJtmSzj|MF5BtMZ2$~s22WQ%mvv4FO#nE-si6P> literal 0 HcmV?d00001 diff --git a/textures/custom_font_title/custom_font_title_15.rgba32.png b/textures/custom_font_title/custom_font_title_15.rgba32.png new file mode 100644 index 0000000000000000000000000000000000000000..4a955f03006d1903761c2200d6c2fda2209cfe77 GIT binary patch literal 646 zcmV;10(t$3P)Px%KuJVFRCt{2n$eZ3AQVOSdL7V$E!aX@paoj61z!nRg0%Nh6z+EmC9>$K$E(NRJ4HoS`%|KMAC|WnV#+iD+voURoV&B1*{yyvcb$!;u^Fe5W;Es09+z!NrJcjE}EusJsz`q8bs-Dt+iTfm->CWTM6gHlj$Fkem0XI=1Co; ze+lWsoLH3ppPGKiQ$VsP*mwF5!@%XT8u9~h4fy-XiPry9(+?#||5En8By#$fl75u_ zrKArF{gqOON`IyQIF5%(|3QBt#G%rM2>nY+KT7|S(ht_Zr1T+Be`8E`>F<3P2!8i3 z<(>aVkp9LP*9q`Prw`8!`2HaG|GPB|1J~;+=xoyun*O<_zekY%8%Nz;y7FH`u(+AM z>A#WwIbHc-xMsj=v+qs+jlKW(wX)JO;;Db`>AMKhe`D{fWYzxw3eV|ZV)_uEe~IaP z>tAa6EB&WwI!yYo(7$P#L!^Iu4-k01`OV07*qoM6N<$f>>WhjsO4v literal 0 HcmV?d00001 diff --git a/textures/custom_font_title/custom_font_title_16.rgba32.png b/textures/custom_font_title/custom_font_title_16.rgba32.png new file mode 100644 index 0000000000000000000000000000000000000000..e2055c5f21777c6914b7e6b8f6075314769a76d6 GIT binary patch literal 778 zcmV+l1NHogP)Px%#7RU!RCt{2n(?utAP~mCyAEi_+j-O`dc{DvwpF`6-Ewbt(vz+zZhMGohdDB&@< z>$)iCt+iHbZM&}fH#p}Z5%lBt4nqM?u_J_tc0NSYG;`5V=W*9XVPafWRhyk3ky2X5 z*kLP0XWbV?5xwrM9YTL8T9i_@D2l@gP{9+LN~u-ObIxs9mW!ViLSzvjR0?wpY3T(i z=ANjk=E8mu|NkPN&lr=YfprP{LE}#IAd#ly_50 zSOPYO^YzpS##r>a4>|u`1mHfyrIeeUj}ahHDeg+rAt%Op0JiV@!wZmf$cb?t5oL2O z0mdxgoWg_b{F_h(@PPh)vp(hrt_3S3NrjGDDznf|=0>m6%o|(%8YnmoG z1$gQ8t$AxBzBCqFM1`KuCP1nPDQK;2RaK!Sv|Crmd&l=_5rhy+MbxhC^4&z}``(si zIp?^>(2&`kpa^R=vpE8%zUPtsejs?|y=GIJvd{{*7!G5HDHb?9r$Z!&ptW9Ve_IS` z_;9yE44#%aR*2BHt*_hrJQOltu`k^YGYl!xF>K1Py@Sk8yZ{k&rlA9Q6Kg zj(3QVEw#OiaXF+of5=S^Nc#_w2J4*p^B4p{5ClOG1VJ2!zu;*-z|a@2Qvd(}07*qo IM6N<$g0|pb`~Uy| literal 0 HcmV?d00001 diff --git a/textures/custom_font_title/custom_font_title_17.rgba32.png b/textures/custom_font_title/custom_font_title_17.rgba32.png new file mode 100644 index 0000000000000000000000000000000000000000..7a4e85a785ff75d98a1fb93cb75a094a44e43cb0 GIT binary patch literal 717 zcmV;;0y6!HP)Px%he2wVuJ;DjI{I3Z{VUI-cj_s6VT zil8{_EpXevDynAuU<&9%6n29g zW6acbZ9-5=`JB)J;4#GQaTw&Jlx7^qAn`MGUHgtV;(4)?pu|p)AEgC z`@b!IYkQ>-*TyETH>Yr(Hx`>=aMieJ6b>UcsyK-quYP?0s!7|`?1cG<~p~v=mGo*+WCuF4TG{Qot9Qg8OB&pMmP*Z zlJ*CHpN?f3i_U4Sal74C8%)!LzVA_06&O3tVN#F&HUfdu+Ry|^2$6jBw>d0&NGXHF zr)>W{YFu>ptEzJCpWGDKrogin(87@-`vT+tVt<>B8$zeV9{Xoi9cFOM4ny(SKbhi3 z2%E~#nSzMJ{zE(|=V5r3t5y}EP{wi0!v1zDykt`e-mCuF@Qob}J+F_i{GDFtCj=I{UA9 z<Px%f=NU{RCt{2n(fh}AQXkqz8%~aY=IVR!7ag*kd#0R*us`zN^naEC145c4_{|Z z0xI|c*}cyUlgwl^oP)r<7XgN07=~dOhGCfhkRLnT;|hQxuKNYx_YVJ`3<016U?ZCW zP@UfEosftZ{@Uu3`@V^-qn@1!A!~rdFyG%GA_yT?-9&2*t+nf?3xFn|Kc_J}>SbBl z$KzqwVvMmui0qyOAKtl6L{>_M`b_1sgbK<9a zdQlX6h&O5E4+uwxY+cuj;zOp)g7|gG#evia%<4kKE2Xj)KeF0{Q1PDoWF>xNvH0Pd z8WG|j7#86yQ8-ro*ji+0f-^qA{^F-iBCgQ7J6`c2q3-p1eKSr<>01P+>p{{2i8nh` zO05<@MuuZjHO(y+(&4c=%Wy~I42BRPUI?*xP1kj{EX%p+kX}3y1&MFlc6Bs3;)xAT zHK6o~4;2%O<4HKwfUn8-8pAg9wE7Ye+O}O?_Wm?R0}6O*aR0J+;I9E1!@@p! zMc?;mn#Ol%avILC_o$knF~%yTeD%O&yMQz74cP&95S`QjU}qB|L{Af>WJl{2p u?PElTz9uKIye(xvrx}J}7=~dOhQS|$o)#Ylmnw_^0000Px%zez+vRCt{2n&FM(AP|M$UI(;5N}vU<1h>GI;1);;ZoyXqF2OE=Ex|5<`{7vf zT?_`tF+?|?gd$}nFYk>9h9Lk!5ClOG1VIqQf5_K~&td@7<1>Zd0EQFikp&6B0&oY$ z2tZsv<#S*FG>!@XcoSZUdNC#(T>~_Ldg~92F$l4*V;BZZ)AaAx6M&y6cuf!hdU&E( zRh1jZ(Z$gBy+0$9-rR; zer-C#Ih0aK51pn7_xl~U+YMdUVHk?7Yo1WpcngFO(GfJpJmqn0jbN?Kx&{PIP)hAi zzN)IH^l6$VN_^Y4zIxzt1CmY9T0c#mbME@S-xWTNqf<(S4oNzLegFXzj4{p_LE7>$5H1<+up=lc5EAKFG$Jxu^g&L9KQ?|>%Yd>P%mWv{) z@gamrIv52^=#k!Ad>aiCQXqEmTc?8OS=mis09qu7Uj}3BEE6m;tpyC8bHRESSdXn5 zAf*Hjm~eStz$<=lk=t6?V+$eYg2m8fCV0ii3fXFIq?oYNA(BOlU!%4D>lt-jpJ9T- zT$`MZw-*pw)%k=hhZ`Y8bUz`70l`ZS&iSFPuXA&)ueCm_UH%sF3%l1`@9qkf(jn%U zkDy*7-q9BE;Qs;z00000NkvXXu0mjf D8rfT| literal 0 HcmV?d00001 diff --git a/textures/custom_font_title/custom_font_title_20.rgba32.png b/textures/custom_font_title/custom_font_title_20.rgba32.png new file mode 100644 index 0000000000000000000000000000000000000000..d368ec86595f1a306478ea356b63e854f42c55f1 GIT binary patch literal 824 zcmV-81IPS{P)Px%@<~KNRCt{2n(dXVAP|P%yJs7q1zMm5QbJOKE!YAn!7U*v0ZY&lpad*|`y*cl zQ7|83c6rX>B+-a7Zy1=t0GUiClgVTrz@D1|P$aczVH(_= z@3%i8gn-|9SBNr|f$xMP?0ml&{Gw4oa3A*;fZcAlmJkvnM0xJxW0CMUZ>_b)7%PN` z5yAqf@PR@M;+|4!jWM>*MF>i1tPnJXGjn0^I3T68Q&d$oM~KxzaGJ#Kj21#nI`0ZG z5gG<3fmh1`j?tX+Xy-2ixP9QZRIb|j5{}V?kU`u}A%qxnzQM{T!iVC%Pf-*f>-^Jk zKjFN=2h98x9K#u7uW-IEf=J?71O+^Cuat@wKq(a?f<51lV?{LsgD2HJ91cOJjWGj} zlu~oD!{iWnO5Cz6qnu}qjgFGbdADz@On^bE8x!|U(^x`?rIb#7&+XgOlCp(k5Fx}i zO%vrja4U*@D5X{{fV;J20obalqMb)ziIh^VT7W^^7ez7Yyf3$(8ZA;vD}=ZvQ6t%5 z61;IgmFkY=^>aumz<2Mxcm1uZ3WSVjsmJ3H06+)gFt+M?#*24rD<;)#nr2o~ zw6+m&fw~5Sma$ioQh=}Xs|N7XKcTfoUDr$5k&Lh2`@MT|zaJd>b^LQaS8(?0rIg_O zb&vYA*3ep`ZQJXyx~_er&9&_i_^{SxySJ z*=%A%YY_o_3~K*5EtD=t?g}T(1m`~Lx~msL%;;|szCFk4bDJIbp#*4T=(hm6-scXd zRcR4?0syBKVYUFF$?`H!IBak)z@m%^Py^UuXjuOzWH=R0w*!F@;7*?B{*yTmj0*q& z$H29NpF1Q#f9bm%3f$xEObHNT;O%a=o4jC+0zAXuIl%*MwOipK2F25ZE&0F6zQSMe z@~VP=vE^=zN9TYJp5o~Nk_(W@WHOmdCX>nhQT_w1BTH3p-9*^{0000Px%xk*GpRCt{2n*9x%Fc8IGr7qwV+!4G28NnHWj=&1;2<`}3fs9~ANJcOtT>n5s z2yDI###Q{2kRk}k?+M?X&j6WBCX>lzGMP*!^M(A_d7l8ljvNSp20(l8GfzPPpc4)q zQ$z?g&M|-h6cKgoqQrUP37xsg!T?yDYXG4$IT~AnpaM`0PgGTfqS*h|wrz|1{XRJj z;1?1Lh?Bs_IVWo^g`$*ly#?wrr5+}M@9}s9izgzo))MF3WdgrU?TAU>D~jR}@jY5= zmjRE<6c2C)zSrw@r~yPoMNuS~78OQ=Qc4{zo`|TfYnK79%ar59z~`eZOP2|icZ3J< zbLQG45-X*^*t#V^(==#Xe@Wa#{=ue8!lgi=(J%F(~jEV~8^N4Ap}V&Nhw7_h&=|JvQ8M6!UBL9p5UCr7_&I{+qT8+cKh5TgaGIK^V{{` zrfHmyLf0E`@f*NS4Hy{-g zoSh!V*jJe#;g|*?CRl4pYfVzhRnuw4glMfY5o*Fv^za!{%GLKf`U6pWg_}+Ai5?$o zgQ{a`9KBiUHKDHy)`(_|k(83O)|={t6bt~mnBWxVXxjQOu{2E`qRK|;I0TM7MK#^B-t x2iX6aTu+7lBK{z;uRt=HOeT}bWHOmA;vb8{S(ElLf9wDN002ovPDHLkV1oX)T3-MF literal 0 HcmV?d00001 diff --git a/textures/custom_font_title/custom_font_title_22.rgba32.png b/textures/custom_font_title/custom_font_title_22.rgba32.png new file mode 100644 index 0000000000000000000000000000000000000000..f56fb2597dddb772c146c3b2b31349493c021c70 GIT binary patch literal 709 zcmV;$0y_PPP)Px%e@R3^RCt{2n(M8jFc5`LwgcZ1Xu&DLEw}|zLRz2&Qo?QtZo#(%D8ZEA{gGwG z!#sunHdpgWND&f-bC?;AO#p^r7=~dOhG7_np&|fS0Dk4+{$2B9_>J}A+oOo`qzCW> zUHp%U0*P(nlZ%4ehHKiq&$=hI){s&LFL=FPsO!3WssZq|;oeDLFnFU%DL+S9mZ2!f zqbc}+0s|pJ2=APmHNZLNg%Cpns(3QCp%BPtW6Z4hmZB&w9R(TQ)w?I4D2i3$+b9@b zj|)Y?sM*n4uNLq9WF7Dr6w?$L<$acAi+SJ0S{teXmq-DPz+1D{l0rYrvP(8Z5`nxg z%aRoOTI;!n$Rbe_f{UCy&q?AZD*q)+C^2|YDJ3cIjWLwgI4Kiy1ezU6-p?^J8zfr7DnGT`JHUj)yTo6e z-vR^Ir`Gpfnx?`1e#h;0>m85BW7PvlDPfF(5Tp7haB`bG%KxRxZ>^o`^8QEA+Nsl8 z8yZ8MX#hF@l~RjyJSB}{7|>0D-p!QS=iW`z>@v<#v<7U-|3Kbe7IOZ3|6b`yDJR39 z+Cc`!IIRYZ*8FRW*OUoc+UJ-Cj8=Y>#m~?LDW$KfiX=YI^Ryy>YQiT>h(CQA9IXP6 zHo-YJw_#GADgJa577Az-@hy`kQ1g1D_$0m?22I#wV`M>mQoF=C0-K_rn2@6QrLV&h z?~kFqmQM(=s#6?N*Y)r#amxe1i#*^-1h>a`Jdz6gDUL9~;oX8?hCNM)y6@M8`VSF_ recsw10N*=|!!QiPFbu;m%r^c4gw5Ex2g_%_00000NkvXXu0mjf&6Y|R literal 0 HcmV?d00001 diff --git a/textures/custom_font_title/custom_font_title_23.rgba32.png b/textures/custom_font_title/custom_font_title_23.rgba32.png new file mode 100644 index 0000000000000000000000000000000000000000..8336aa391a24e8c52f2d7a3352552b43491353c0 GIT binary patch literal 664 zcmV;J0%!e+P)Px%Qb|NXRCt{2neC0^AP|P%J6!{`z?DD?Zh;njCAbA|3E2|j5}Xon32uRu!2Zax zvg~1vag52{JQ9kO?`Ifb0Dxf_hG7_nVHk#C)(`*;0CzweKfk|Nj+FQ9n$2b-Iplq7 zGC4(~@JP=b^1fAB%mDmad0heML5$6&X&}V@Av+8Mx~`i)eFyOO^YJtk0E=1g2qBy? z#yyj&s;DgJ&k_eR$~)(rwbltCs35dIUfyGj3C#yOr+j^eyr*qjDgYLM%q7401G(fq zT5Bo@1_u{Oijr4KIcse;d26jxN}ZAgRl)LE=7B{3Qsj*>U$c4Jw$GBUkCrC`u$Adj zCWP1&z`CwamERqJc@J*s{SxHK0Q7yIBrm0WIe9Vwi0sLE85Tt0UinkE!oh8?Qfg5QQ4-@guF5w}6OzB=S6(9UIF%tQ!pr3nl!%@90-K&99*w}fFmFCH)(DLKq7OnPR?Y&IQc?1O^e^@hbc(*(Gm(%+t^vK;|piHuqHzDfULCqIe?iOb$kN&m&NxO2DnQt1!O0Px%m`OxIRCt{2n(eitAP|P%yJs7q1zVs6wgg)sB_t(~5|R?!5@-QR&=O1u><`yH z-YcRQB;@Wq=kUi5@EwO?1_cO$AP9mW2!bH~Lp~y|5rL#+Y3mptauo_NA0d z`9M|}hIBOA2wx4Llu99fmW38;1g*6@pU+MR5jF2i6FMDi_aP$~WK4vnJ3_PM zgLA&QCb(X&-s6lhNa?R_PNx&@_q*@Z1Hdl~Tj<%?{pJI~&2i3y_bR29?(LDWDx4W$ zYdRYc@NfBC<954+f@8LC2)hihu%Y1qxT>l)=ME*T5W91FUqKWbJXZo^mZ>lsSP0?T zwq1RAt@Wpek4>0L5brer{?6eTZ-}K7@xV|6%&I{|dc(VlpW>|pkk}ha6+aU6hPtkw z$_`5xKPBi5P1Ag9@gvE+p+xa9zsM*oWMzyoaK8R^yX(5I`~M>+0N$dYGz5l^m%;Qm zvK8s}As7O&A+o)l_$kkNLlNR*Vt@~ZK}hT_js@`h$*~E7AP9mW2!hzp9~WIM4;}`v QcK`qY07*qoM6N<$g0PlIod5s; literal 0 HcmV?d00001 diff --git a/textures/custom_font_title/custom_font_title_25.rgba32.png b/textures/custom_font_title/custom_font_title_25.rgba32.png new file mode 100644 index 0000000000000000000000000000000000000000..e4f9f7521b2331671f18da15da0dc10a532173fc GIT binary patch literal 744 zcmVP)Px%qDe$SRCt{2n%$L~Fc5`ra?*fWPz!27DS<747H|o;1i1un2~Ywq0ZNcdP#(M_ z7)cmm7}%5f&e03D1v6Jaql*ECVHk#C7=~e(|BxRuzn1|}E8h1Lz-`6;HYEq(R&ExL zq#m9U>jytv`zQA{4OHNfC8^q){lL5Stg+I1bet_yv11MmSL_#rhx z7dH>S#~9;;5V0f}>I7)Y;Cq^; zaZ<`y5*iRLj$Q)FvfMQI9&4>rO6@)!yaZ5_=lL#m!moEbsOuWH+YL%RSIVhdrZEOx z*P*WKr*7VTzPT(O0Yy$cxLhuwBk~2rM`LdUD5a9-@QUhN5YGJ``E_H` z!;mp%m-078^hDUU?IsC`s84E-jV-YpFIHczAEu2E;&1&grG(ZxsrEmg&p4e<-emyZ zMQW0rU@2vi^48jr8A7i96iJS7%AW6B)Dk@Tm)BME!P`2xp?dnm0944?7d; z?_z|e;*E$@+pKNdQ1FLVzb8YWP)a3YdwmP_TZ|su7_)}@n>#*h;q3~k$K8nfyT1ua zp}{DCEX&?epUmu7i{N=-&O#V5JHD0rJ>Fsnz%@-14SsK{>lJhVA~U1}Pz)~&&jn*5 zuf%@?n6{G-&a5gi(#T(YZh=5xJ($_Z&5o@I`UfxC;nZKU1`J94`y9E~$1n`TFbu;m aOpre^o>6i)0^Px$&`Cr=RCt{2nbD1eFbqUT*8wf0g|u)j&_Y_E1zJc8w2&6k0xjf9;684VR(p0Z zXz#M|`biN#e0TPx%Y)M2xRCt{2n$2zFFc5_wvZow*^^w;-vIV9DZwcHI)Ph>jd2eb#E`ct=DSGJhmn4$TQaz(@cY$-D=S=Z6L=l}e>jsZ=VJN@Y0=z&>{nxnKY^01H57j^*2N z#ajRdfXEurH!>Ihqf7{icTM2gqI)ta@#9N>y_Xb0@r*I@CIrQIU1zn{q)mv59~p)r zlnz~myTy+vr9vjW?A-9?{Qmi*|8WLz zc+%hA9PcUU`~Hy>D6UPuF@Z5=wbnuLk#bl}{=0a4fRG81hN!p-;Nmrbb8d|>SMkOe zD}?ZgA94l0B@CA-Zz4_zaW!GT-}}U$K%f;K5%8EGrL;}cgvR3HKJ-!uq(|YGulJ9@ za5>f~@uZIaNU$PEDSalixdMF#(Q;^v36(z*p8<<{fk5}Ca|OL60~QWO6jNc4>H$bhh7D%oT=9W*7^$&%asoK#R|5j;FmfBA9*#gM zrL{JC14K$ZFf*WSTM~DGYnT`i$oV2`{ZhQ8aP}&?*1sj5pA*jy0RC_OaU5b#a^)VQ34fs)Cke(Yrveu_4ZojuB;|VCb);|h~xxNzM YKg@+CgO6=2;Q#;t07*qoM6N<$f>%&1)&Kwi literal 0 HcmV?d00001 diff --git a/textures/custom_font_title/custom_font_title_28.rgba32.png b/textures/custom_font_title/custom_font_title_28.rgba32.png new file mode 100644 index 0000000000000000000000000000000000000000..95497fb9e50199619fa48277ba1a7a6ba81f306c GIT binary patch literal 511 zcmVPx$xk*GpRCt{2+U;$FFc1ddx82}Y@Csgm72FZL0xNh0R$v7>0vUl7%m~*XEt2J6 zLP%7T+&vQF2N2y$E{^#Clu}A5rIb=iDRDk(7XZKju*v$XZaM#_1rPynw!FQ7>(C-j zz^&kKdjeXl1SKLi#=P|j@F;xC&N=S;o{1>m=4uuDOvT{F7#@a!V~lLA&9{eI1wTtM zI1zCOftk4!eyCOSGgxd4YR);HrfDnuRH^QV5q^u`Z1}dCt_kL}E zTdDrTiobIJ?7in0zM+;!b%aAxLl9M`6}44|o$X%~ZyL9T7v&34}r z{`7<1YRflG!{a#K49?6vO;aiSsi(Q0f9r1mbH34g4{P_$RW6qc=K1O)=D)?@3#3HP15#pVf+^A00x7XqgE_JH19D>T2&F{d6HJM{E1VPiTp%a*$xu%0 zv%#F$r^7k1?+4_>z9Eu3#XCa!mY7mXDW#MW>Id1!UW9PuFq8lQ002ovPDHLkV1nqf B?VkVu literal 0 HcmV?d00001 diff --git a/textures/custom_font_title/custom_font_title_29.rgba32.png b/textures/custom_font_title/custom_font_title_29.rgba32.png new file mode 100644 index 0000000000000000000000000000000000000000..c568aa8f4db0306cfe8c81664a374a6e6327a8e7 GIT binary patch literal 494 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D%zS9rQOhE&XX zJM(XDvw^_T_*Hrr`X-1*G=k6zj(0k;igJoQ0sR5}4*xZ>WOfvX3e`;eR2Rg;B6B3UQN^X&@dp30YEZQ%{Ty*m7yU~!<;a#z2;#mH#udyx!%op4rmyXVKz5E%U;s{6%>ICp00i_>zopr07)FxTL1t6 literal 0 HcmV?d00001 diff --git a/textures/custom_font_title/custom_font_title_30.rgba32.png b/textures/custom_font_title/custom_font_title_30.rgba32.png new file mode 100644 index 0000000000000000000000000000000000000000..ba38bc7a9c665b4985c670d4c1a128a20fb4fc2c GIT binary patch literal 518 zcmV+h0{Q)kP)Px$z)3_wRCt{2n$2y*AP|M0k~F|IM_Ql-x8N3NVOyXDw?Im8O0Y{HCE#mrlS90c z&3gT#Y!=~}PqMhI(7d<2Spy3Qf*=TjAP9mW2m(7^$I%1O0Nw$70~oSZlnF|n2;h>n zq9>CYFnwIcx}L_G0W6G|iPc(@QtF-&r;J98iAbdsdGD#N>$MeOa~1nvI7|c@V<^T* zZQGL8nvD@H7EB-_a?Y*A;#5Wi+%X}9uoVjeU^3PHFccC|bzRex9kB@GJjG&=h_cpF z%8pq0O!YqmiybD!7|B|@6^ml~LxV(&bMD53Yb=a0Td^pzKg^mU0BV|M(S!rBD6T); z2w5}XjIq#I5aGSQYr@W0bmQDbP$3bZl%lTdR!txxYMN#%7R79|Zkpm=6Jm^Xxm>oI zWD%=j_PUJGgb>1}2}DF)*HKkfYms;=F9$xW@cRu7NRG^gVL;#ayCyNlz}m(BHvsrN zP){~awE~X9x(BfS6=44!!1_&)^Px%%Sl8*RCt{2ncbC}Fc5`ra?*fWASEazh!SXFQvxo5ErFCkN{~yCOMntY3EBrt z;x&>$=m&OJ-#PQ-W1%}5?hF8AGMP*!lgVVhCf|1cuK_?ku1hTcF9BRV){agKKt+rm zQ-V&(3*w5Oqe~^og;e6_s8fjA>H!rrr$Q+OAz_q?C#fa+n`Hix)LlxyZCg_t zRG1DX*<=W;RD&%DA*yK_r;@L#%C=^UgPstr)u0Q;m{ac;LfEQFBH|F_!fG{aZJUqS z<_AoDKbqO?!B`D0CO4P7;XS|{%^?am@-7LCF{e}KoZE~}Vwy{$@;&wiOk6G(lx2x= z9Cbfm0sI8;H|?(6*;N5j%F~qmkCYdix!sH}dVd4>lW;3uw?K`Z!-ypT!|vVe#HRw- zJyscp0mJZL+x2?tPk)=?(DZ-Cn9bSOVpBrTLX3~3$rIpn3oQB2b=}p1bjT(f5O)TZV1~Aw6BLUnM@{=$z(E_OmN-+Hm(U7ua&b; P00000NkvXXu0mjfjqYG+ literal 0 HcmV?d00001 diff --git a/textures/custom_font_title/custom_font_title_32.rgba32.png b/textures/custom_font_title/custom_font_title_32.rgba32.png new file mode 100644 index 0000000000000000000000000000000000000000..3f1b4eebbb655ed07df3fa14b18ec56c24d55655 GIT binary patch literal 1211 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 V4R)F2bvFP2002ovPDHLkV1f?yP5J-; literal 0 HcmV?d00001 diff --git a/textures/custom_font_title/custom_font_title_36.rgba32.png b/textures/custom_font_title/custom_font_title_36.rgba32.png new file mode 100644 index 0000000000000000000000000000000000000000..bfd0240f2698a0a54bdaa6966c6f54eb7dd1946b GIT binary patch literal 781 zcmV+o1M>WdP)Px%$4Nv%RCt{2n*EWgFcihlzIhGA64C-K#1gQCSOS)SB_t(42~dKRASI9z*gsb0 z@evSWOmJU*GZ_^jdJZ?qy-^?#2m}IwKp+tKFZo(|9_u}i0FcLX0zd)C0aO;hmoqv8 z7yyo;uxMjnoe|~Z@uOe>T8pg#AOOTJMZAJ-13u1-%?2>WTE^JNo6(;H+x{Dzb3{=D zN+|$<5P~S0P76vYuhc;T<>8dA#1@gzxhIr+^oNQWt}%XEbY@xY29@QMLdRY56*s;Xx92=F6(nnOE6XF!GF zUt(tI3mm^*Id^y!53G!UuF5kIIEMmofoJh^OzHv4&3SgWl}SBdsWtdn<98)qHv~*$ zyY4mhXjSiVmpq*VdW;3uqxO;L{wPTRB={u)1A#yw5C{YUfq<58?lMs471(b=00000 LNkvXXu0mjfDu!7F literal 0 HcmV?d00001 diff --git a/textures/custom_font_title/custom_font_title_37.rgba32.png b/textures/custom_font_title/custom_font_title_37.rgba32.png new file mode 100644 index 0000000000000000000000000000000000000000..2deb89e80eddc513cf2e7d5a70839faad1487422 GIT binary patch literal 619 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 M07*qoM6N<$f`}?TYXATM literal 0 HcmV?d00001 diff --git a/textures/custom_font_title/custom_font_title_41.rgba32.png b/textures/custom_font_title/custom_font_title_41.rgba32.png new file mode 100644 index 0000000000000000000000000000000000000000..59ce962a1c65e46e7d0137ce69e2eecc4cd97334 GIT binary patch literal 557 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D%zpL@DEhE&XX zd+U5|vw;ZPhxPSh39MF5R!rI@t#Q?FxYkS%O=ziVsc89iD|*MbXL1Kl3eV_b+yCJD zp7|+?ijIe-r~lSu3h>fgIwi>K?xOaGJD5MPEnxV-`k;Dq{+5Yc4eE~>68Im8I_!M- zJ?Xneah-Y30mco74Gw>dmkd8J=_BI;xpkuNCovp*++a6B{7ZJH#$<+5n_{F-sGoby zG1o70r*xm_uSs?v?;W;ePd@W9H$B7H4a5#{G+LOiEMb4}a?xz#C=*t_K#`+6 z{(Qe}`|OJC^RsKWZq%IU`jUMOqeODj^5}Et|E$htPq>)helszW`Pg@t`cGz{%?-@!!(UyPVq*r6Is8xBba8~{I^NFzCp9$#CrLEfv3VQ zCa3Y(B%WvMpUXO@geCyPx%d`Uz>RCt{2n(dLRAQXn*+_?>$7ETMaKnrQXTY@QpErGORO3)IL5^TZyL&@X= zj0%Egd1jdXk=e7nk7p4jKqiyPWHOn|FXfPW0yAI$Vi-37=MY8zhA6TUau_`Pq=(Ob zLj94g2oRPLg%kn^{S`GqWr8`}i6P)ItU%w=n<2CS^Z#lVEbpr;rNrfO@h#&dqyP<| z@F~E|kWzw~A%uXGy}!d@y_;1?0Y8`_fQarPO>iRm{ELAJDZt#DtrCO~Z{r(b0NvwY z=FXSbngCR&3I7RIXy9#!cDvnHUBtG?TNel+eoY4emM&E=VC@QgCMOwAN3-4OLYI>w=g9BrNxE zSMX09kH^ujv58A1KuifPgqU^ZuGecvM9z9jsZ9xRE^t!HuBxiZ!5>jdd3Qk!0Zs|b zJh@d}2qC<>AeI22-_=<=zz5fYNJL#-*P9aHlu#6fmxQ7y7KKkCU=;~%+uj$%IpI?Y zSVe+TYIgXxZIcNAfHJg%x#1lPXw+u`>yB{hJ=}+pyGQinG^>QAFF2;~x@bNOufrD~ zqDk0dc*E)vwjADIeP#$DVI+K+D616$P-Ee)&V|<66<#OGIZ99odkb#}A|Z8n--CBT zza~5#^%4=Z)*p|%o2J3(bh3SP2Jp{wZqZPx&JV``BRCt{2n%|M6AP~mCy1N8OffPuA3&9lF5WEn$5WEmf!4#YjxYv7QL*O19 zcUArfGb&6izbeYAT^0N5w!2{jDwRs5Qu(rczhDk=KmNO5u4147BmfP-0N{Ba=QKrn^5g5PkT01Th6$8x-c2ozJ8y9|gC zK1{^qv5Okf?hFL>R9S!76h{ z2tWui<2XiNpHl?tdidDTcL^|O`c!g?Ah(mYZTpY_obzPywjwwLI9&t+N8L^dVR$lq z3Q8%%IS(b&?koX-sqMAuek`F(A4A{wzVM%iJk$6YD*dAJI(=<)U@DUewhleD@ zSW5Bw7Aqk>QWir*cwHgmmKxta&@c>#89xj|jMq{-^$Hx} zbxLW`USF~jfH8Ka*EI_9`jS;COz8!dD5dtiZcyl6;A)THnLZ#Q^bID#i;9B78=8^k$(sAV38VQ&d+FeTD-Sdwj=EJ9yk@7uJcH@ELJwCwm>oW>8-dYA9 zFoyfRLn34`{)gjlbE|nI@Au=M`*CaRZvejzp0j9{k?;~9N1lPi7dF09sZ=VJN~MyU Y|B5wX;gLo*-~a#s07*qoM6N<$g664<;s5{u literal 0 HcmV?d00001 diff --git a/textures/custom_font_title/custom_font_title_44.rgba32.png b/textures/custom_font_title/custom_font_title_44.rgba32.png new file mode 100644 index 0000000000000000000000000000000000000000..4a4e66cc9626a34ce1859c121d6ace958e3cda06 GIT binary patch literal 751 zcmVPx%sYygZRCt{2n&GkHAQXkq?rZ~C0+v7vyb`jl?3SPoO{oO5P(Lb(P%UpjYcCk41n0W5iZ{%&h7Bpflz1o^YC#7@DXv( zs^|ecRvw4qt)Aig!t<(3Uka8AAc^j0h^|A%kA>&GM4vGRA-;YRLVz*$@&{uKj>n^W zol8O+tKh}|UDrM4IGs+u8bFmvWGu13oBzkrkEFT`SR%k%)TEpbKQm1RbhNe_&pKWd8>&P#tpuB>6u;m5R&>knI24?Uvf6qC{mtO!WT+ z0Vv0RV0aR&jwu0>{eM1J*;g-90#J?rmMT55I0Fd$U!?${r@>YJ_e_ES+6N&rkA(!F z9RDq+wHJ6|0PKja6|}%A|7R|Oit=J10h0Y+fb0US9{&S1fC3HTV(O~_tNnjCtY7@q zT0^O~V3S5a!~vsaEXLUE@>dQx=k9XaHAiQC7TDbXT5I22B1`mL0jTHyNocKoKNm^= z4$ew$-}gmR|9ZXpR+Ina>ad#u)bsynJcSP^6n!9J{hu1fm>c~*XNSibu(|)0QocDv zvFLB^e<`IK{d=j-1J3vl;Bmj-i*>&5`%PY_k7t5!1O9F|JakDZKMNvb44iZF`N3Aj z&+ZUmNJuv;3g`UuV2nkJV~oLmzjytw0sM?@Q!F+ElEP_>2|oH-L2TBHKV1UF&pR8U z#%6$g9s<*Qd`Pfj*i2DMxl`X8fPKz3Sf(~fSuq3#i;TbL<_O?-f%`=55*s7&l_?y9 zD3n!kheB_Ymu``939WhA$&?jFAbx|DLcv$*sTq)hPZVFh`9P&_k#Zt1Sm@W*4QVtQ hjYgxPx&X-PyuRCt{2n%i}wFc60Sy}azBwgg%rB|r(J1g8Wj0ZL#?z$K6ppafHbRl@9p zO_s|D35~h*q*SacfLmg_`Pw?hlw!0 z8@i+1xDI#chsR;86<~`90hWy?IH&}BCczVc)Nrf-P(h#Qf`_i?0k(KRf1EUP3jodZ zJRt-LA*ORVDTN#}0XR;l(^}V68s9VxMNu@Jr?O|_GDZRr5hY2&32?={iYyvWM3koK zbe_h(sXWF4T(4IO!%!tcAH!PXiHPz%f0{~QEPzIY1~(CA#si?Lsz&qFb9%Wgwb1-8Mc_>;fz#0)a<9nF#rloaPHVHsPR8`exLW&wzZ z%Cg*KJP~oF(8)v5t^yFvGrEcK+<5>lHVyr0YvMFb5r(&|fDq#2vkoCIeaV%2TX$hn`LVCIoSH~_ zO$-~q^|c~Ei`$(WF2V(9pt*p)CQg%{gryf7&&2F8+T-zfJRXn7Px%%Sl8*RCt{2n(Ni0AP|P%y)-}zw!oG^N=OTQC72Sh1T7(!pe2|RVhN!H_J^Ol z-XLC3;e_WL{;1&ah8adCKp+qZ1OkCT;4}HPqK^O&0eD!p#S2mZ>bvoiZ8;PIpu+#j z&lO?#{MvRZ6u=XD?KG{KH@ZZy~+!bnV)1t_K_A%u8qu)*k2b5Vewx*KVl zB92FKaFRHVk*2zx&}~`)WcMOt44f~^bUEi}n(Cz|{$M*9MN~!ZASPgb(7Hff z&tDWtlDvI}QVL4x>@km`E5K@}Pm;t+%s7Lt0KIj*WCZ}g*O&Gfz-g?w0MP6jb6mkS zthhi+k|dk+hoiBY2S_P#yWKV!bTnE4*8Y-NmYsU0x0J2`)~xnv6=+ugus$93DIjXM zL15blkuL$!>MqblO1U^UkWwPgbDL%?X4RqSupbs4ges*}RaGjAqSH%by&|X$0ir0H zHF-jaZj4>a@WUY3OaE;6a9!8NfLN9#E|<&HyCj-2+o%S&C%yUrV{G#Z0H6pV>iK+* z`lV^A>+?cWtT`M3I|7XUPjJ0nou51~5MYk~Y6K84l*ZyXHkH%N<>Q^{39z9FG=Hub z1;jVC#M6(AuCONnpeeOaw9_U(+y!i>Znqg@W&r-|@a|a{zXdEH0hm4tG8q0*as)pn zt}zSa*68OH#l*M?nicX9P#l=uxk|gkeB|VTCd#{47zhLcfj}S-_*DJ^ivBu*Ko&J( P00000NkvXXu0mjft)ySz literal 0 HcmV?d00001 diff --git a/textures/custom_font_title/custom_font_title_47.rgba32.png b/textures/custom_font_title/custom_font_title_47.rgba32.png new file mode 100644 index 0000000000000000000000000000000000000000..181d0863cf7dd4ae8dee6fb586e1ea271c6eee9b GIT binary patch literal 609 zcmV-n0-pVeP)Px%8%ab#RCt{2n%!}$Fc5`LGHGC2Pz&1vEw}}_1W|%o;FjQ9f?B{OxCL$r+=q-Z z&IEw~{duzA%)T(N=p2K*tON*xAP9mW2!ik%c}tLk0bF)oa|iG@!M&@)044zQfzTDk zn-q=X;(gfSqfUgzIpNPS6dwC&Qi}KC08mL0M_Cll%=0u&a|~MRkO?CiH{rB+k1-}> z!ULZZYjY$M?-_<6WWt2TOh_*N*#sgAnb5@FWH#}haU4S?RIe4Xi+?sjDb-Z1a9aE{ zP2VEsd}eNdU)PeLy7ZP&_AEVj^3 v#Dx93%&L>hgy!}F2!bF8f*=Tj@H_YqvX0k2{ghnR00000NkvXXu0mjfQ@jxE literal 0 HcmV?d00001 diff --git a/textures/custom_font_title/custom_font_title_48.rgba32.png b/textures/custom_font_title/custom_font_title_48.rgba32.png new file mode 100644 index 0000000000000000000000000000000000000000..d0526bf00eff722c4e77ac2a2a43bffdcef1412a GIT binary patch literal 754 zcmVPx%tVu*cRCt{2n(?usFc8MSySWC^0xj@Lh$YZMC_zg|N-!m82~a{TK}vuUa)03S z2_^^v8@$VJW@ls~&)v^mHX9!hi9{liNF)-OMF!v$+KG4gGxPowfCRvA*Lwi!_L@8I z=u+M6<6vk5w>_%?2mr>h<}*R;`)mZ-K*t6+#`dHUya~s&Z+5C3=|Y)Cg4VgU0)Mm< z+VUdf*Nb(DHszg8B}oD)CCajd*1EGMgg};M-ao9h#`%19EnNWY05mUrTa^sJ6`pU3 zF=nNdwytYyt+jPsTgI3LU^(a37-PpEgz#m;6>WzhCjn4+oU#CHmSy&Oy*>qVI-P7$ z6r%!vL`v!VtQv$O_}bdt(lmW5z%d+;$KY);^*QjJ?rUR=xtEc{NZRC6>I)(6bxwgX z#wJM;tW9#40MyiVZPPUMiLg4IEMSb0X27EeoO2QZe)q0Bjk#%>r~Xa>V+@>+nWg5_ z7eJ#oohhZzG}HGaWm!Tgg*?yk_4S3zC>{Md7Sp&iSM=@azv3r=J0U zBMX)&1J`zW3%CRTde4HYsupqna5%hGPHW;5K%qB`D5X4a{cL;!G-ylVPE}RD>1{Mp zN-#z`?Y_h(0Pu6RcV~_OoO1~Aai?G1jnSAVxvvY19g(eVha=BiusCy1g`fC7Bzc4} zhBO^F*=ntk=ecVs$kTIj2Fzh#EH)rMDkB$Qi@}o#u+`uJ0s;2>{bqv)Ru*93P;?W) z11kzJ5IpG*B#XDfM|Qg%%Cektiw5BAfon0e6QqVbcwjpM1PLD4h5*5W2UdOtIH=G) zYq<2T$q6CAf%r2A*+K~fB?=JQfvq$6Q~4WK(7OMc|2_kv0HGZS&8vOD8SQ3eDL(SQ kLL-q#Boc{4B9VWPzh=MG5Ay#(r~m)}07*qoM6N<$f`txEWdHyG literal 0 HcmV?d00001 diff --git a/textures/custom_font_title/custom_font_title_49.rgba32.png b/textures/custom_font_title/custom_font_title_49.rgba32.png new file mode 100644 index 0000000000000000000000000000000000000000..b61e8b785016dd801b3b274dae8ae2ebf73c0846 GIT binary patch literal 773 zcmV+g1N!`lP)Px%zez+vRCt{2n&GjdAQXkq?ra0J5KAB>kP=J@Sb~bdQkAOKpp5&v-}7{yac_2qK;)+QLm3nBCplu}wssil;fQubWXgmN=27JkoQq#zLW`4_K=JIB&c%O%36tUpAp2w^fo_%^`1__LYta`QaTy@)@92|rz5@bOr`*yEf-h)Jz{bAx7ZWlOF=9ev-giszgoj*nX?TE7BPO3fIX?82OLt(01Ptvt`CuCpuFJ)rMQMhQ%Dx4V5G!5#ywvI2$(q!W9yGXxm zf(Rl1B(=J(t>*GsmYJS>58!6gzBO1GKq-Zk(n$j-r67b%z5f?Hx6w)`H=5zFf{4~{ zYlPkkBfD0Dm!Om~ZJvxK>^igBy&S&O1k=(Q&tmDW?6M(JRn_X4IF6?baFcX=nlLVJ z*TgENO!?sA!vJR{bY1r%Bu&#racP=PiT6H_Hk!aWUnFGeU7jnE844|jZJt`2P*s(& zGDImgnqU|O4*#Ua)u%BwhnK{+gdPx%_en%SRCt{2n%kADAQXoG%$Wvk0ZYIVumoBlC72Sh1TDdoKuXXOG9~Eiym21P z#U$P@sORvl#fmF&fc>-Cuwej;#bU8oEEbF9zvRzK?ULK)?@H|(hXIfP5&$^>4Isr+ zh<^$SKmdqP8mU`KetUnnICze(!gF+olwFBH0R$*V_ln`hwu!(E+R+PwvQziboopy$ zOb0=r9mi>UN0>6M4u*1c6U;EWgb>X+*HTKYl+snwG~JvCtjnOT!Wh$1N}VK$&huP% zk>|Olls45DnKT|K=XP&nDWzHnp{0~MP18aR}{xFilP7jP)flV>-dX~jvWr~UxffplPc}tWw*x|8#I3z zW3vWPe8z#=xiOXM6v*bRIF4huu8Y&@^ze)=^40XiT%8WX5U%UaQr8kR3Xo;P<#;?Ij^kC@{>TW2Bs%Y_00!Gn^Q0-jIj`OPP)gxA&4ZU^8GPSw3Y3d)e%=}F0b@`~ZSG{qSVkB{QIp|D4@evL z0ZS5wVcSx725>Rhofls6fh9bkCFidTe$z6lsR9TgW)~pOb1kLRgpj^Mq%b%oCS`;} zQA+joi2ix`L?V*{-09&J#srXS2v8+Sk~$$46QFe!7@86O{7gSph~pUN^BF>j)}*M)nw~T0lGI=^whGL3Dzuv@xI{7(0`PBTe^C(A zT=iO0pTPA0I9Y58eB3`_+6~MZ8#!FHSS%Kc#bU8oEUo+n_Cwc*X-y4>00000NkvXX Hu0mjf<>qm% literal 0 HcmV?d00001 diff --git a/textures/custom_font_title/custom_font_title_51.rgba32.png b/textures/custom_font_title/custom_font_title_51.rgba32.png new file mode 100644 index 0000000000000000000000000000000000000000..fc8a9cee4d7bd2808bd0c0542985a899442e821a GIT binary patch literal 803 zcmV+;1Kj+HP)Px%-AP12RCt{2n&FkBAQXk~mOu-%Knt|slt4=Bew zzD!{2($^=u0-(W(IlTFAjeujwN&V*v(XSCLDV?uH9?_|Ph;@`o9Dnw(t9o zFd>V0A%q2Bwbq-zHw=SsXRw&ILpG1Z#J}Td+1o)bzRYp4~YAHz}zXW-pg^$K}29|-wrj7BQBQ<#&LZ8=nmj3 zVxHLvHctuS^jF~_ICk6MMRd@T)ANgoFX?yu|@~T^Gi{IW2yV+5tT}% hQmIrbl}aTae*qY%{IvnR&g%dG002ovPDHLkV1mexeeD1M literal 0 HcmV?d00001 diff --git a/textures/custom_font_title/custom_font_title_52.rgba32.png b/textures/custom_font_title/custom_font_title_52.rgba32.png new file mode 100644 index 0000000000000000000000000000000000000000..f475c4381cea2cea7a368069849f99b4b84d387c GIT binary patch literal 551 zcmV+?0@(eDP)Px$;Ymb6RCt{2n(b|aFc5~HR9%1-vH~l(BXos!gswnFC@XXXSivLU6&Qj3Xd!$S zhc8q69w|~J1h(J1_k1P+K@bE%5ClOGLgdo={sz3dn#c?U*&)HgU@Jly+$ zMPYPtT;7^hjnInpKMiwzKwXeDKQ{SnU-V6Yl6y7I8TvEn-|WMQu@>N+`Te#NZXf&) z_Znc+Y;?lyL-fJE2uAcWzz6?>y#Rx7hn4{Y!-pn7r&IK0@vzVW!3*F^0R%e%y!AiW z2{2f#FHI2G3DC)RpP~;7GQcPQ!vX<(%YZpz_WRq*;B@JNxeV|=+;al>W%v<-&j6cO pVtf6D<@}AXAP9mW2!bF4%r}#TlW5NO;jjPz002ovPDHLkV1jlR_#^-T literal 0 HcmV?d00001 diff --git a/textures/custom_font_title/custom_font_title_53.rgba32.png b/textures/custom_font_title/custom_font_title_53.rgba32.png new file mode 100644 index 0000000000000000000000000000000000000000..a09c87772930a02dc1e5952b961b488f0ada9627 GIT binary patch literal 458 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D%zTRdGHLn`LH zz4bo#kbwZ}2luP2d8}a{xL$I^F4QhzUC*GM!eZQH%p`fR=RuvuKL=69pO1Gh*)u;y zal+#}wvyg13@#AxC9CZE^?ZiAldpfd{&D>iug5$J8s7|~ZZhutRBM+OS0A;ci!qAv z%+_j~)LGl3xbu(xzR<47V&dC;`Q^{K*Gu=OXWaj8A=iI8WciC{AGj2staRcq<-454 zR_?%iuiE0d+_~)AVWsRVSs%=CzHGw(eCqm1)27?ANH&x*UX#E@urcq5(VHxO=lyqq ziL<}AAAYzpzG+&XoI{64pP^r!#-qLGl_u@|Zn@Ot*RB0uGgt(s^CjjyzQ*X$D{!pK zFip^qb3seNHm-+$p98fS7z!9Bm2s5M^1nVSWM$iiZO^!;3IuuGwA{YyS@$Z%HG6+9 z^5Tfj+!tZeveq=7r)|TBh}_SvX9f0&{GPGYjbk=Y#)#$fv*rIjA7cD5r}90YgLN^l f5)drvtYbK+bNAnpxP5gTe~DWM4fX%EIc literal 0 HcmV?d00001 diff --git a/textures/custom_font_title/custom_font_title_54.rgba32.png b/textures/custom_font_title/custom_font_title_54.rgba32.png new file mode 100644 index 0000000000000000000000000000000000000000..5d58d93b060f2858a35f146bd4e1557b5c1d6df7 GIT binary patch literal 876 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

2Fua1LF7KE&g7 z2cX4;M5yr$tRLgx7yvVxV*&8}ZgYD|OoQr2HJa-asTV=)bibRy0BHCF>W3N3=aIP% zfZXZcS5u*TYO#PEo@Ut0oKJbjA>arE!Wg3hlH8R5~0Dt%#nd!zYc(tQaWp` z6GHgb_as}4G0s}+%Ce;1vqe``K8^rwa;_)}*EEgm(OO5-ysm3EL`q4`{b+?4*7R9{ z^b|!wUQ-l>v(`?osq6Ys=2#MF+qNMQ-qt>|$D5N+uBs|;>QZ>jFqkz%thJ#Ev3dI(tm&L{*S78KzASQL+l8Ho#N6a zr>AL}(0bQ6*qH#}IoLp=2ui8Ydf#Q^lM08Ydz`aL8bTa|Se)cs@MSqL#uf!n2(YW! zeZ{8)dFjE0*yKd}&tvSu8UX}G=2VuUZ^4eq8UbFSWsGf=0lTs`1D?N}FnAzcfJ>x5 zkS@R_(jQot0slDb(+AQ7xJ>#3X#z~5J!|>{8wenTIK??1#Zmz{M%&Uer$4Y}MmxIgr+39mKnM@{= e$z(E_|Czs^-_f=@+^1;(0000Px%y-7qtRCt{2nZL24Fc8MSxqA($1+}2`LQ;pcfJ@+&peun(FEb_J)EO!PmmsCi zbOGl#7#9CUE8bYY8I5h3LA#&OqFn)rL?V$$Boc|lTcZK^2(999?jCZ)5nweU2*eX$ zH6pZlLlHg(-wgmY{8MWkWKd%a>bf3x7ym!EK?c2p0;5^!y3U89D2i1*2>>9+##B`m zOn|kDV26g3Wf@d}8zL05Rt97@G(ssAT!6KSP>zk@Vl5(MV*{F|c{>p<2G?4%39uFs zn&H4%maz)pz4uC~s3Ke>MnVX70j#xiBG{#!{Xz7Z;Sc8=j4{Mz;SfSVN=g0oXX&v% zh`#-}qpoW>=e~YB=Wsk8FRn4hz&Qt{)XQ7w{eDkvm5%^EU%K%FJe3$JrM$KFW)>^N%zBWe5?fe;y z{z=F%vm{=1zG<4d^*(ITS=@PRt=e;Lifl-Phi#bmPxjfIk)|xE25y?>dZJj>{x$!JtW9E(Uy`1m5&R116 zJIl93BWz&V1(L^OuLQhjA?yfKpT8vlS50sXkqQUf3J=ra-{>>0FN`tlsW1R!+2n~2 zwig%*;6S9C+b#b=4N(h_V9Wd@Y)gp`i;@zwfGl^RveiG#E2~llT+h} zZPBNIIvJwaqkk)~M_~eY`;tT=kw_#Gi9{lCgMWGW=$Xm BR}=sM literal 0 HcmV?d00001 diff --git a/textures/custom_font_title/custom_font_title_59.rgba32.png b/textures/custom_font_title/custom_font_title_59.rgba32.png new file mode 100644 index 0000000000000000000000000000000000000000..2a68e90516858d83cde3b06d9c93e47c13ba0a5b GIT binary patch literal 622 zcmV-!0+IcRP)Px%C`m*?RCt{2n(d8)FbsxYoo<1wkQK6mS73#%&>Nv$p(EUlKv!UetiTA|j~-IW zM+o@<%=wW}soJLT8^>`>06`Fh?NEDnV8}WPvMy-K`fpQcQrhZPB)E&L)d68v{Z+Z>@#37ERN<-E%O0NWWw2 z0CYsug+N4|`@4nfwufOpBnUe9Q8{a%t6RL1t;K|EYm(~$6S;nam!S=S76&wXjvJi$ zs+09tTJF?nPfi&Rta$WWiVonv-f~EA_QRP z6462M3>zU}EC9O^OeOa+$j&XiB{83y&#VBor@1d2(8F?_5$f?hGCt(f)ucS&3`7fX zhJ64KFa@l&(0Y7$L@DJxB*Ar=Bn-;jbzKLQ#{Px&T1iAfRCt{2n&GjdAP~p@cXJKc0x5wOxDreWwqOgkU`jA0XbD;ZmY^kYAB;IA zfU6Obo8vdL^Cp_*vCFc%@E#C}L?V$$B(jeLK=Fod34otBov4Z~m@!x2qED}>Q_)2bbDLQxdXF{G4=b8geG;JHE^Hhw10bF1+}2+|nCFeo8} zt3r5jg0)Ghs*3CYrRVv z%c06!2l&(1z(={?@21BbQ&|jJ1%gL_lyWN%oPJm6$^qi+Up9^-x~@albpU|A@6q=? z0HA4_E%gRKfA*YQysUtYwry2i*PCUKu);10el_-Tk6#ppO4C#cA&m8$a_l7IkaeS7=Eft^h zAv-{?)62=vKRM?R!W}eC)7ZK_6CXJP%)HzN2_am6)g_g|ohL%?x4>IDU)O!SOcY`~?a%b?7Mh5_XINr_w)&fl72u!OpE}qr8l81SGHSZj5mJ+Pr z(D}Lxk0000Px%97#k$RCt{2n&FXyAP|M0H)((tXn_`J;aa#_ObaQ&D~~+C;-DS40Bu>=lTo4XMr}p0bB~yn}w5eEdl64?T{7VW9trV&EW+& z&E0Iz}+n=v~7ETspqzxNz1$=1mqjqNapZ4AiDrcsoYf-g*{;I zX45p2<$ONJv{Pz>~SIV%Zkw@=@zf&1MC?A@w`^Zw-F-g7FK{OGQYbQLSP)noK+Sf zIs`)Z0ktH;C;_CD)fg6v_ke^D0$OV*r68ruWjIOYyaFht&~@Fr`?3kec7wHqN-+Uy zSqv2uz%vDsbcxwhVxf%V2xAO}VSq6Pec$^8An6iG0$3w$8HV6bisV=nz%|sCJ#vL} zwoeFg*IK`x_e(7|03FtSUN43{EuL#HFaqdb3hDS*n*@724n7R{Gq@^Z1aOVChF8y& w0In;W=P&)eZ30#RH(sqvGYrEp46|>30BI@1W;V%f!2kdN07*qoM6N<$f}dOY*8l(j literal 0 HcmV?d00001 diff --git a/textures/custom_font_title/custom_font_title_62.rgba32.png b/textures/custom_font_title/custom_font_title_62.rgba32.png new file mode 100644 index 0000000000000000000000000000000000000000..9dd6910fc6f5e413aed084f306252eea92b7d872 GIT binary patch literal 653 zcmV;80&@L{P)Px%M@d9MRCt{2ncb0tAQXkq%vL}Pwm=KEKnu2D3$#EBw&3%=(Sj||0{aqnUATxQ zCSY>E8D5e}hI55;e*_rjqxm}Vzcc^|;QPe?ybKC}zb#dHFE2*|aQF*=yM6W%2mlNI z#D`^X-@QFEQt@HU75DWLH1guZGSznXWCoPQhc#5%F7}01iM`Y0sx(5s8yhdgq*9Bc-H*aQVz&5Q!2(B;vjI-Z|&HuA_o5Ronf8 zj3Dl|wKfqSu-1AZ1Qi5bOT@kOAjBJEvf=~An9FB|4h7RIk;x2~D3=8Y)9d?wxA?$D zW@y?JCq$d>x{frx63)5HWrn286+ -ku<2OtHCgdEMI|GQASk+MFpilNsXP{y**XtQaI-h`-4)73c^xL{6nUvlsasZnE+HX#H8BG z)%h{&9KZKBnc`?c<&>D5g3|q`3Y^llS(YW24*M#qSCA$+&-0O|SPVkn_f4n4@Ed7k|=O*s(;nL%j?LZ%mJ=IF;H z<**PUXI|?gOa>t{9cuo)LDCHpi|Xd~yf3)Kkd(X%*cKm1d?Z@qGdF%FTh8eja zTy8KL_XtOtmiQVqKLw&#&jpWmZ1GsFddqt+!PxG}*&ztcO@5B@$kP+J;L&FohG7_n nVHk#C7=~dOhG7_nc`JSZ11gCRyiEx_00000NkvXXu0mjfz8@(0 literal 0 HcmV?d00001 diff --git a/textures/custom_font_title/custom_font_title_63.rgba32.png b/textures/custom_font_title/custom_font_title_63.rgba32.png new file mode 100644 index 0000000000000000000000000000000000000000..7c40a2536e2d622fc2b7a2c0af6a52ea1599530b GIT binary patch literal 438 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D%z3p`yMLn`LH zy>Yj)SwV#D!FfBq16(C7>ke?Od%#uJa%O_4gyNb5Ts;A98^o&`xda#YD*nAE-P^=3 z!*9=~paciM%vXKtZ=GNH0{h(=9p+x`ko8HkjOS>~@x8cTm|;Ag12X7zXCu7`h>wI5c_Dc-ofK6bS@ z+kzbjWp~9bu8rk&c+sR#+ai#j{zc8Hqw?4NA}iUn11itGrI?~#M^tZC+rM3cDN6s> ztBH~gPwW^Zrim_{x7m5ywY1c^#d(2xLJYlU-p@2(=sw$Y&1xr~d)l4Yr+m|Fe}-

5*sL@;=|`njxgN@xNAyC}8V literal 0 HcmV?d00001 diff --git a/textures/custom_font_title/custom_font_title_64.rgba32.png b/textures/custom_font_title/custom_font_title_64.rgba32.png new file mode 100644 index 0000000000000000000000000000000000000000..33a5522591a24c3571e67fbe06dedd5f2400231d GIT binary patch literal 453 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D%z>pfi@Ln`LH zy%F2nY9PY$U}J&K6(`*UM((Wv+z|(u#IhEOZD?rS%pbey?x*U_HyKj*Em?1VX36(0 z3<4L~-+ZrH%aOqJU|rn=?Ggr)==E9$AC&*NK2=~t+yQN`4>$PYYdM=tzVvYgERhVH z%jg>Les5IvcCQ!ft1kS%u!tk0=i(FzVbM+c4_5S3@O{spUe2I5+7TfFQPusTd`+w;{ odcZ!tnsrCJ4+{&Tg1hI$Z6@87)s}kG0E`y~Pgg&ebxsLQ0OhL11ONa4 literal 0 HcmV?d00001 diff --git a/textures/custom_font_title/custom_font_title_65.rgba32.png b/textures/custom_font_title/custom_font_title_65.rgba32.png new file mode 100644 index 0000000000000000000000000000000000000000..0f9e40b46dc91f355ef20d716f880cbf1c0fa1c2 GIT binary patch literal 847 zcmV-V1F-ywP)Px&2}wjjRCt{2n*GtDFc8L{ySWBp327mgKnt;iSOS(1O287Z1X6;Q040zTxIYkI z2;oDNkDJ@yOy(V55VD))+1(&O5ClOG1VIo4K@bE%5Crib@$1Xi!uOX8U;kq=d}+0X5G7;G z{r`PUV|@G>I40o;nh*kvvDe=k#uzx~t~GGBBo{g};y!I`L1>LcT8IOnbdlI_gw7r~A=N%1Gl{n|4D;oqs znWpLJd1;#Z9)n#up_BWy)`LcAtzSBEzu!ll;K>H@X4ZPpa2$|jS+6l!mbDC;;sm9X z>ws)4V|}!8Kj(Z<{evLrg!GtT#&Nuxs?hBPBt}%(&GFV+2qC~ZM-T+w{O@9|#o^Ft z10rnD9Jz&%+qt!1jJ=GkN3$TBO6|nQ<1zW(YtYI4^^j5y>cAXo;l#!|(5wRldP-8I zRIAh-!diwl4vcNs`zP>*@szs0kFmW2&m+)T zfHkPopf_HR$0IJ6%Phf~Q6SCTUH%Fjl?Ztwfpb2o)qRJ(h@eXdpg@l!!Z4h)Emjmo z8OQNp8y$w>Znwu~MMG_Lv%ncDqCBPWCR#A`W=Nr$jQ81;QbKDDV+@QjxZQ5vi)gLA z9ip`sr_-tL-d6zUp^2{rL)9Ml?)NV^609JMQ(ulsR8`{A6MCS^NcAvSxJi2F?Jz^- zgs}}w`y74kqibaSd7sUJhXCDIW(B&=Y3?mPx%>`6pHRCt{2n(eWwFc5}c&)f#Kg|v_summhYOUNw&OTZGagjfQU040PHa(^fe z9|=YdNVw*iVHgQu_Dy!PEC7K(AP@)y0$<8*hI?=T1R!c1`#ZyZKf)h}a|m}M*<+)} zzA?PddA8ntfJT7+C^o~A6tWqfB#P|0L&A;H#a4$0!*CVn--vhivYLVAl^j)v}G${es)-uwg5{n>I{Hb z_&?s}S3z(B0^P^v)oBaR3F$5oeqx+R;gKt}3nCE!*=|%yfymz1-EIdVgfUHSxLhu{ zUa$SbXLwjN83ZsXr5+>8ve9;}wN^@LA~FTVcr{Bc5Z)BPl`P9l0w{Ro3Jsl3rfE8h z09tDu$FWI-Y&}!&SXTky{Z#jIx!`a(7~9e`1!Js#IEH7gAkiA3BuSh{I8D=+t|O)N z-W56mL{a2q{PB3~7{wT~o-2g#(iIv~yeUB6c)XZBN-514GhO3F1v){iQ=D_F;YumZ zIk)Bgnuv5+md0x>tHLT7;%E>YONVc_+h}`T*VasNEV=qLeF2;w0OB}Cp66Z}GljkY zgLQ9glsV^+Qf^v=mjb-X1vux(^W0cL-hwcbU7!tP3{uLc2t;HR#WzNSAmCmXAR7f2GQCAA;9+GLFce1@+Puz`mNq{5oGH^-()j#?c1)&|49&cG wHT7-Z3fn$|wNYV%-v$H%fj}S-2n4>Fe}INGA?Jsv{{R3007*qoM6N<$g5Jty0RR91 literal 0 HcmV?d00001 diff --git a/textures/custom_font_title/custom_font_title_67.rgba32.png b/textures/custom_font_title/custom_font_title_67.rgba32.png new file mode 100644 index 0000000000000000000000000000000000000000..702ba04d6fe2d4138c2eb58c42d5afe7aebf8d4c GIT binary patch literal 583 zcmV-N0=WH&P)Px%0ZBwbRCt{2+1qi0Fc1aMn@k!|3$&mX+=5bqQUWP~l%SMgN=OT$1X|b@ln+KT zF=iEE%OH|HGy1|0?pjX_2qAxzh)*$PYem-46F# z)IH&2`vRc0zVQ+|+#kNmA@P*)8i(oEzo4~-F(&!OVHnW&J$Ly7z6~(;Q+*08@C6Lg6DK3dWdJZ%B`)jjRqoj$?LVy!Tvq zj|zrD117w4jtzA>ow9m|_dY14stvEf?Cw(G&*$^SYmG6BlVk1S0cM>~g(srLiEX|@ zB*GJ>URQ;y0(kF}UAk>sc0!9qAflkP=ECdkWAd&F@S8aHxu&%~MEI9Seef_0+@)6l z?8U7;m;OL&ErjTnYoGGso_3EXX~DpCX@Iz)Kxsj$Yv*vxqn z9QA$Aod-Svysfy$-54ZJdpEYj{X10R-=Nso(^2h86ydPpqZa=-ybwYNA%qZr&^OWQ VBG}{FJnR4f002ovPDHLkV1n_@23r6C literal 0 HcmV?d00001 diff --git a/textures/custom_font_title/custom_font_title_68.rgba32.png b/textures/custom_font_title/custom_font_title_68.rgba32.png new file mode 100644 index 0000000000000000000000000000000000000000..aab4433440bd454e682c85d0a2828cbe1e1a6edb GIT binary patch literal 835 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 literal 0 HcmV?d00001 diff --git a/textures/custom_font_title/custom_font_title_71.rgba32.png b/textures/custom_font_title/custom_font_title_71.rgba32.png new file mode 100644 index 0000000000000000000000000000000000000000..c353935563982ebbc7c5abd6231f50bc5e90d1f6 GIT binary patch literal 871 zcmV-t1DO1YP)Px&AxT6*RCt{2n#+-+Fc60SeI(G=IVuGa0uF%*0YbnbC+ zBI=Y<#y(0Z>t?_`Ar=bX(=<(2mgO!L5P%Urj$@-RRaJGT(`mADY*oO|+vk(xhG7V$ z%ppLUrg(pU$Kh~5U0W60EkZ%F{uo5`&|fLlHBGbI88C}9P0_ZGInVKUgy(s?n+=N; zkYySBz3=;Tw>oR0%*ifLmL(ei1wpW65$s+f?H#jc0B3zEC6XjrWk6dqTLEz#KSX;% z2;_MVB5P*zEM_Z!h>+(wq?8~coKC0R3J)wSi1bRR>)IIm?}bIX0B}{p-h~GS6mUMD zw;adIFe-P|t15zpF=w9DbRTXFb>SYowK!Dj9OsBs(%t>&E z>q2W4V{y0yb4j8vhv^6*K5~WQ@#*Hv8GyHRps$489v3u!>w&KcyFJcm)`YxYfxSC0 xu~`%H>ddJMN4VbUxp)34g7w$o91e$l`~|u^U4I5-@%jJ&002ovPDHLkV1h0HgBSn+ literal 0 HcmV?d00001 diff --git a/textures/custom_font_title/custom_font_title_72.rgba32.png b/textures/custom_font_title/custom_font_title_72.rgba32.png new file mode 100644 index 0000000000000000000000000000000000000000..4cf43bea67e4300099aa732c081d745841c81296 GIT binary patch literal 567 zcmV-70?7S|P)Px$@kvBMRCt{2n(vW4}5nvdGVHk#C_RW37l}3m+7#{)V5CP_hMhF2`&F%&GbiJsQ zf>O#kpePDluh&U~iot`i8Ds8UD5aiF@EkGj(S$exGQb?s*u4jM3((~aYlU|}fH`*W z0lODq)p!da<*L8%e|QTZ#M|13hJ_M`P)FblphTM)Rsb3RtN6VPC4k1`4NJ6woU!n7 zd1@2XXm^92c%8v`3qa(3#07qj$l@H-Sq{I#Wr9QmDJ6&qbzS3fxwwWZw7Ve(kom4V z72W~>K$@lyLV$>zwSl!3Ns@H+4N?GK01^Op$of;zyC2Y(+wFEY#=L8&8Z5*lgA4FO zRaLGg%HOMub<@BMsW1_tEK3+;`Xo`aGg~c?rYV}HSzIbTN`Rs$a5|k(*LAPY3n8{6 zK$c}lk_6UT9FIrjc^)#Z+3_+#t+mt8wAOD;(P4<&F~K!HFBl}i($4W1xFZxhfY`7A zLk2A|qZ5!ve$(AU4j9khQNHHC-8>wHAlN!TFw)5>m?Eh11-O`J3F>Ydf{T z8ri)7KOPXGJ6k`^LwMcr6lk9lEYlPihG7_nVHjrHd;Px$!bwCyRCt{2nc;22AP|M0t1iF_tUyM%jKB(6AsvCP&=Imi86k{dR`3Y)Ph2T6 zZY)Efi2EeV(#b;4FAwk$fMFPhVHk#Cm>wB!cLhLX9M|8jX7~mWGG3;v{QbPu7El{D zptgY8yvK^C(+OJZ&4V0|$83U16E#3e2_h=3r3&3o0XCqvfZDJDwFT5>Hb7NXQIUBY zylaH4wGcvph#;k`Agdg6HyG9)kWxY^1*H^-2udx(G7Q6G=@Y<5HkAd~-02A+g4Q}1 zW5V@%4IzZ4yTO^=t*;OwRv!!N-%WHEnB%^MX_~SMDowN(&|2esJ_7)pbMW57dki4Dg#iJsB7=~e(Uikr6AmDJbhpCJJ0000< KMNUMnLSTXlu-_yA literal 0 HcmV?d00001 diff --git a/textures/custom_font_title/custom_font_title_74.rgba32.png b/textures/custom_font_title/custom_font_title_74.rgba32.png new file mode 100644 index 0000000000000000000000000000000000000000..04edae812a6fc46c8bb24c557457d13c7c3e9bd7 GIT binary patch literal 822 zcmV-61Ihe}P)Px%@JU2LRCt{2n&GjlAP|Mmd-EEg1zNBLS}-NpLRz2&TQDVH30Q(Dft0}e;Z0%` z5DXD=hi`_-glm*NEDO6{pin3j3WY+UP$(1%yI=rxpHEJ(p}eS&belc{b~UKKw)OU`Fu7eK2l1}IoEYv zZ+XerAuuz5G3J#CN-2{I5bGp3%)j{N_m;E5p$CXq0<0{aZ-0TD-Wy67AMpU-EdjpL z18xAW^N#EFYPoci-OBADW;VDh4x}cg054PSvjpB)Cee6TfCkTWcs1qU;05mpzyY)X z&X|OVxf2}5o@|g{I{3`%04=5^FwFaR1j54=3-tg7V1%Iv0-#%V?C^lYt0*A?a7;6A zt7;G|gxL}xhpLf}00h(Qp7%V!6$o>P5nBRO03@cI{{>1Z+P2*+bLC*93s(?qFa@_2 zj4^aw2SNx4A&(lMi9i9;uL(>p-@=lsbIyHVaB2X$X&P%fY$%i@FR@chF26E_5Tb<; zR%4o`G1mN)QpW4Yanyv6tOTgBsO;QZRaJT%M`v+EDW$8bdikA{(t3Se*Cvl?QWy?6 zD!YUb>nxf?xX-F-soW7ln4Trmm_9+VC~ILMg3F*eQcCB#*IL`^fyQ?WN7KNv4DeIy zbGfw-mVjy8ZBpUf1@PnEzRO~cCGaWOPnSu#pZkp>P)eP%bR+Ge`!utO8#Mn?cf}WgGZHa0bbZmVMy!g~0#+ z10<$6vZ@@VPx&L`g(JRCt{2n(dLRAQXn*d*?Pl3vLOvU`p_o;Fe%Y&=O1uu>?~BmOx6764)PE zvxK$;J@?$)xFM zA2vFVQ~<=rR(TljX8!sffNyjHq?+$v4wDbKLkK~druR<(NYfNalHl#_O}?Bzc#K{c zFxl5tRS6wf`hd*eu-(yZ0b+AA=Rbe4RRS!GAD6vM-}jFm&(l!}@M|0(U>OFp%xPO+ zwhhG(Dgl0!6Whz`3P=)t*88eHU}mvNfLCBO3J_uy5l2+}zd*o_byWae2(%yp&;e*Z zo0F2yVpkZvT(l0q0>JR)P*Vh2C9c*2jw>JmK%o|~0MG+Cx%}XFBd>tHAuxe?1vM-E zPiHj@?(hLR&Ir^W06+<;x-&rt(Vh$uLPS+nB280O|Jj3WR?LpV2q8uRpfNtnGQk)V zLI}Ya(+L%%Q=AEqWto!z&Mgj6Xzt6ggs;X213<%60%mgr<1W`)w zvwl9GjY5rNS*8+!db1Wg!XW1yd7gtYhCI(#uRWbkxL&WS?x2#S+3eWPtZ9`LMPZB< zlV(=&o0w*Ti-7M~2m$z-?Y3=g%VmyRcIdsf&LGVSrPO-1hhY$9S-L(&3MwBc;E)9A zXqrakdF~bjP{<^cY0{ohBDK-!aC*RA>h`JSREl-CZ! zpvwjeFV-qpBtcsQ03e#CSzN0rf`Uqd76PncsPShaXuLi{U}dm#5@Zr!43A^UtZ3e| zz7g%Q_~D>_)sJ(&TI6ufwfEx|^1K&5GH19IFrEQ4$r!{DR#qbV5(CgiDLc+3o^ zkY2EwG%p7pYm7eN`q@-)L*Ljx?&%)4S(cZ2jTd=^)|Tnn0!3gU?^#s1ZHHh&o)3Pt g@sUU*5{U%P2M|gUuS2X4b^rhX07*qoM6N<$f-{|wJ^%m! literal 0 HcmV?d00001 diff --git a/textures/custom_font_title/custom_font_title_76.rgba32.png b/textures/custom_font_title/custom_font_title_76.rgba32.png new file mode 100644 index 0000000000000000000000000000000000000000..e5129c9ba7fcf783f62834a921cc05d0f5ab45d3 GIT binary patch literal 508 zcmVPx$wn;=mRCt{2n%!}OFc5?{nKYmlXn_{gLRv@-DS@6s3$$=0m=efK$Y78#k`Bz` z`(}6$mT%Vo48t%C!!TZyx7qj$z-MNxZvb7{a*pR?Hm(5p%vc_T0=z56a*DAI zLsNiCG1g(sQ=py>oO7t_8X-gkB62rfcWKYz2f#2M-uod&(=@|$E`Zw;*PTsv3OKj; z!zmrGDuDO#f>2e#l&9MVG#voEk^qs-kzRnLCMe(ndI6FMxPWdWEE3@I4u~~DE1zFW zfDEVwNY3AgL#XzFsQ~MK-;P$CLnumtNT*2afCZ6m?-AE=z@sVvtY0rMpj`z3Vh3cE zuz&+-_W-RLPV0ayBKHMohzhXvheav{&CXaXz?MpJW{OkbN)E_QW@Z-@T@3wyap?jY zMN}Fg=1LG1AjQ@J0r(w|av{Y0kYvvkpm4!dfb7y05rD!4<^Zig0TH+zklNe?1fZym zY7Stn1fu}Oi)DRCGQJ|SSbf)Z5E1l!|1gM%pl#dvX$k>GJnmn2(K=2q!X7t8rGR^z@4W0000Px%m`OxIRCt{2neDNoAQ*+u-q{9dffj7Rlwb?n0x3aDpaoNcmS9TI60`*N$4%}a zf+9h5cHd{lNdlt0hr?$8f*=TjAP9mW2!bF8f*}4Ue!V_9fIktQcaQLlQ{VtpgewD3 z0_XuWNh63r3<1nbSl+{5={*2>STq6jI7WmF0K<3Coh6^A2+oHF#|SWPqf&j}uZpmS5JCY^j4>sIP+iw;b)WLAz~5vrD%CViumIyY zs=BV7`J8jxV7a^R#Aa5hwE#XvN_j~a%qmot1z#$L)5*^XXl5hQkFhcBVm;@LUU+Q(5SYF^;2R zjF~RzQw1FCfIY0agE3}vL9FwM-7FSEu9ofl-h0Z##+c%8L6Y-?Uu zx`#1_EX&N~eVdU$OaT`2Ug+RvD{qRX)3&XdbnG1b!W00Ath|qa4reSBIf6|A)&kIN z>(d2XILcnb0c!#1`+k=Ix`26}Z{DLPJ6{|Tn*g(j_a2Ox1a^TW!2=%(uyyh?O;czW zNHPNeb^#XZyF}2(09#9&X|7qoG6S3{z@o`~x`C~w&2l!!IG&xX3;gzZ`Q!1hwy@c9 zRaLF#+i(bw%mFTr_K@bE%5X6=F3;rUN)MrrH QHvj+t07*qoM6N<$f&wE=5&!@I literal 0 HcmV?d00001 diff --git a/textures/custom_font_title/custom_font_title_78.rgba32.png b/textures/custom_font_title/custom_font_title_78.rgba32.png new file mode 100644 index 0000000000000000000000000000000000000000..1c729d443dc5cae989b69f544054a068f5b43f3e GIT binary patch literal 543 zcmV+)0^t3LP)Px$*-1n}RCt{2+3#_KAOHpMcfBs)3amgzfD!BnIzlo6E07V)2xJ5up&22LU_aQT zNe@%SKbYqI?)+jz@f{!mfQX2Qh=_=Yh=}L~IRH)IVItIbGH(;#PXI^(Bop6vc4JzA z15f}s-<>5lH0QUQcI%k+I z0H7T(i=u$FwrlXr(0(bRnKgimEX&}WgOqZK#|<(%fV%GYd6!bcIXCuklN%L4p6Ae7 z<8(Upx;|hIF}t7u>bi#38vFeoRaIfL+2D9QPF=S}1O=eAzI)+IAcw>1CVGDg3ZU!1 zK;N#gCX0Lp){Ftfu0U)IAa(^}V*s%$5E}ysDI~<|7IcDn7e$|SULT?}fL96um~Ug` zdMKqDrPS&+PrNN)4r^^umjHTi_5AWw`+q){0Cs`po2e=i%h)ckLHDw@eDGU>pUsiy hTSOotA|j%H;0yZ$LitD=K#c$Z002ovPDHLkV1idC?I!>L literal 0 HcmV?d00001 diff --git a/textures/custom_font_title/custom_font_title_79.rgba32.png b/textures/custom_font_title/custom_font_title_79.rgba32.png new file mode 100644 index 0000000000000000000000000000000000000000..80a71bcf042a91855e0d397b5ff3e1d9380537e0 GIT binary patch literal 538 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D%zuXwsRhE&XX zJM(VtVFeMl{e1_x;u=NwG=(ovu3)ud(q5vhqP(FgTtWFl`>~*ukLeqZmR9#4@n*Vl zzmu1Rp)FAY3C*ZK;_iI=VQ7(!)H+8o&I61eSdTIY)aHGb`PLHOeN=v8fbhRqr<2;w z)24mME?i%y*Y2dSXUZl0(~q1bl7obf*%`hH;9!{;RP{W@;LoYIWuKioW^i29Jg>Lv z@cM}CV4-JzJG(OY{_8n<&77rna-;R0;&a}bdxNxo)~<*bh}I5ikAI!DcJbF`nM!-Z zGWhn3CHs7t8sK$QrDU!wA2j@dk$q4ECGjLj`Kj4DpsoL|Di!0xFbD!Pl0 zBWKDSEk)zv2|tWk=BPZ(s%C2UI`M|?QGMa2m`^zmG&ob-en~~C-f=YebMJ9sPx%=Sf6CRCt{2n#*ykFcgOW`)EKd;1Wa$atUq$T5t(a0&MTjEj}!8SYH z1yKeB0s#h#MBfbK0b|hlt@F?Uz~k|FJRXn7723T=7<=y1*@Aw(8MVP(96F?NWokYGZ9q9|q?FQt@aSxQ2P^I4%I zKoA784ISeMu8^TMIL6ph1(4F{3d}sD?f5-#EZF*{S(a^m3u}f1=+I7o&mssm*VvjN z0Tx>$H8_;@@HZ~PFms=zGEjB9>Eh;gBGyWO0L z0Xnm*K(#P}WdN+I%IWn$rxj*f2J2aXQffT+a=AFYBJ2n-md13-vXqq4(bQ>}`XvBj z8qnTY=kXz`sxtm&WGU=~?<*Enfi@hW8M3Gfw878=aBAuU7QH~7D2gU~g06Rg{*HY) zwG<7}Y1G6z6j<<~i}=!(4h* z;EK(u72Xt+UE%M}pU+PL;2lks_Wrpob?^@W|JDy}A51SvwP9#-yGm~qjW{NO-f*B| r$VPxMln@k+NCBGJbhses`KkN|E?TX!zPwO600000NkvXXu0mjf1Hf|` literal 0 HcmV?d00001 diff --git a/textures/custom_font_title/custom_font_title_81.rgba32.png b/textures/custom_font_title/custom_font_title_81.rgba32.png new file mode 100644 index 0000000000000000000000000000000000000000..0f551eb36c687934d5a52664e066269b0e96fda7 GIT binary patch literal 921 zcmV;K17`e*P)Px&Q%OWYRCt{2n!AzPFc60Svz<6Z3upnUL%0OE1gZpH31kVn5~vbzC6FbMsWT{b z1_vi-Ks@-;gSa_-GZ<+|isb$Pb{7i)nM@{=$z(E_OeT}bWHOn|m*V@1YYPA^fL~Sv z00Q7|T9_!yRCbdWJfDM84`;b9ms3Tk(uba2@ybU1)ocqyj7}81p9xA{JcAEmW z0Heve#Q3_d@%s9@`k^U}02>KwUJ4;5J-i*}ilSKM8{kKPYA>U0MlV%WRn!36c+<+V zyhVUr(qJ0~=cPj4d%}RlQKN0!qy#WNzzfzU-*2zBA9&uHlNDpW66GAC9yR?n{R_nCVU|<{uYx~4748h?{2tiTAYZp~j zp>5l{z2GzPR)Vpf46Wvb5W4UCStl460lTHaAu2441|}48&L<;=ix47d0Vo^+IOoxx z+_G2-l+&91%nfsdBf^rQeS-i=WPvu`C|H~7PT}4g2?_u>>jKPVhK9cHXX}RUeF2oa zS&8`05J$v0F~&eCy?#O3<7D2D6QA zoRvwNuLvQwJb!mZrhLE@p0%OsuS=j7@M#4Yc{>vp=SXo=^e!V{N$*G4U6CyUFgO*Y zr2>3rCurl%f3xooOy>eA3b2J1D>KB2wkdSnleJTTBCv&a1G|@q*9x%v2FATv>jNmp vD>suNZe{lPx%I7vi7RCt{2m@%@lFc8Q8^S!UJOl!#%(pqu_EMFOq;CF<01Uv#B0gix2h({pp z>+%X^1|ta|O7e~So7r&;JFvUiU6ud@K@bE%5ClOG1VIo4K|Be&$w$Ef>;aSj41hGO zIq!!7$N=O36s}HpMTRr&IsT5&;kfQ>D?XCh7Dd3&F8f3Uu=gb}+}H9PaW%pOfWS4d z(Pc`42~IM`OqOLv2+?=FEt9rE7I@60d>OZX&ow&498jA9glPQ&SYhL+LoOMFjEGgM?+I-S});Jt2gt z>)NTOl=?4bhlf|95W*V(DWy?Ld3CzF_Wf~vT}DL?%gC_~4$(A?VT{=UXb|X2^2@RQ z1K_*6uwJjR*=%M%aJ52&@8mpeai;`I{>{GL-W!A^l$+1@6FGc#k&I# zJrsb@288D012Ab0IGs*7pU=+gm&>9v%p%M=@HB|<%+KcIOMn6p+5mze2!bF8f*^wM Y3pp>CZHP_Px%DM>^@RCt{2nccOUFc5?%C8!0ppca%8)Ph>TC2R|{KnuDh;1Xy-DPi+~O>S%< z#7`_Z+3%cvu`w`%JiD?1K@bE%5ClOG1VIo4K@f!hh#v=>!vIhlKKFINwX5R+@WyH@ z-0z|65r26Tju3xY6OI&rITMoNjWHZ!+?n3;!R;I?hKX&N@h zlum>3am`btKQNO4M6|jC#2C5jx||u+6FufDVF_rvIaa$DaGD< z?)&}-6RIVC3XO4TX2lcH)W@~fOhh~k!yXe(u`?u$p)@Prdp~7CN|3cS`xS{X<~l+( z6FkQLJ1g8;n|#746H2DQvzTB3geBoif`(yWrPLIXC1mD?kA|X0X2~n1id$db_r+6V zW+PN33>APbXTsXHmm`F5ilv{zA+s9hGGGmT-%nqam+IgBF>t zV6814fS9xWznb`xzs3}R=21zA2*#Mj6Wwk%-0%0-mwy5H3E=IGvth6>8E&ZfIPaw> z+9MQJ)gL_eps_GG71Zf=e_LpPx%KuJVFRCt{2n(dK;AP|P%+*|{+Knt`$3%1~ua4nD$k`mH_lyH;~N(d$7e#97~ zp!gLr*=NQ{R8UxV-vtyP2!bF8f*=TjAP9m8a{zE1xycpU8^zavvTm_ftjG`pyd@uR zfbS`ll~S!^)><5o$0?Ux6$KyzAOh!}#LY)h6hlOimFMz~GK}Y7eSxfzdawH1v(9o=Q*UDSDU1i$g*tKYfhmv z4IU1M>c24t)>>F=VT`HvIp?iS;C+!XGhnj~rh~^wZ*;cMfu-l-u`!E<#Vg zeqQU=)V_Y;zQzzb|1uUaKwu2B&IuA>a^x^Yi4-eePdXYKK9R`LRy}I2xW2 zYk+_dCanWLax~)qd_G5oz~yrB<@$WJo&<>TfX7a`)D;6`%vUzKId-1`M#XPx$)Ja4^RCt{2+5K^YAOHpMmtGfO1y{fk$Ox=pM`%XC5!w;x2yuisf{uVA&_6W2 zOB0BR-|hR|amk$#@d+dlfQX2Qh=_=Yh=}MP*>$f;S3>Hp{8+ zw*UiJx&cdL082MuX$)YhijyR^y|5mG0#Hf?Z#2uYAyv=rYB}7ObIxn6f6fy^cx!F1 zbCptyFNX&QaAvLbQc8b1oqC_M>Hr?Ok!P(TfZ!aErYZ6~-^`-sS;dfVf8-$<+Ay9~0yvD+79t`d cA|eX=24P|y?1!0*{Qv*}07*qoM6N<$g0_e2SO5S3 literal 0 HcmV?d00001 diff --git a/textures/custom_font_title/custom_font_title_86.rgba32.png b/textures/custom_font_title/custom_font_title_86.rgba32.png new file mode 100644 index 0000000000000000000000000000000000000000..ff9c2bdeeb301a337ee066a9ae646f2ed2b39079 GIT binary patch literal 684 zcmV;d0#p5oP)Px%W=TXrRCt{2ncK14APk28WYPdB!7b1NEw}}z1X>^^uqA9ta0|46OCTkX2geyN zH)HQP1J3B1(aZXVgy5H0fFKBhAP9mW2!bF8f*`Ik02o^jq7?%G1;7KC0f@H4`Ft4G z+13CoR>worSOfFlAh6D|LE7P*DXamz9UOqfn$l++PMO0E0xVmNnx#x z?hR~i;q;y;3#Ms041m@;TK^@CF`jdt3P2YM5$V3Qw&;+x_T_%9^DUIZ-l^w zEZEOzZo}MoKA)-CZ@&KbL|NdRD>@~mj1(Y;5F)h!c2y;gNa%Wrd7l3jMPDrBi>rVP|L|IVV zByDUG8CX|^&k<1;994UJ?j(IVF1N~IpMZ`FpCh7Hxh4ztCGyU?Iu5JlbgS%~OC5rk zb}qcn6DL~bJ4;`VQ?2qH3!fUQ4ovRQ^8>(_3(p7y4NR&BSe6CL^3qBGz;^(@FMP8* za({@H?3U7(BWjf^>{f+O4QH~T`EhrSZ*M&N1N8;XuQ$F!5ClOG1VIqQ$MXjPy4>0K S`gU*t0000Px%U`a$lRCt{2nBkGzAP|LLGHF09kP>Kt7Se)Sa7w@>kP_??a0zk=s0363`H|Dz z85S8yHYjuZ%`i9SR=_TA7bJjT7=~dOhG7_nVHk#C80HJ{?d`8#@$3NL&lA_ul(3@N zCM$h1lLEquXGgqN0l!~3_B&ew@Ja>%KWj|%y~ZRf7-~&K20&|#5W-!vwra}XYEATm z>J&m051^E~`#lT;h9TX+uInJBO!~)h#O;>&TTKBIcNN}R8)CfoS3znK9m6P01jPx%en~_@RCt{2naz>hAP|LLl}|pB0x2j3r9cWwK`D>|DNG7VffRJ!8!5C8GHZt6 zPiq-5>;9^^Ou-bdscv2)fMFPhVHk#C7=~dOhGG6Ie*DE+1>h%ukBj#5RxAJrfCC^Z zb0-|Z`ZlaM#QR~955j~aNCZH4+1)?J;90yMCNVb@9|lWy+3CdyV+?PSGEDRZaWB0fxssh^y4WKU9SO+-ZVJXb{uA;=g*(=_Gg zI2^aiP-Mj$W60y2D+wbZ1X*i8=Pt`q3YNhjDX}0S-k)TQwU&esMe!lVnB;s6k`mtF zG>P$S+jeTcwRXsq(5VecDT`t}TI(k9p2n2u%9l<*WL?+hxkUN&xhnvd1mPm_Yi564 zP{X zpn0BY+qP!$CAWw{I>XC_d%QoWj19otS@RRc4(=<$L-u{InV#DN5kGTXBK+L~vBewl zZSU2b3`DovLB<;pLXdN=Nt7|>v{Bmky;dL}=zK%GG(<|Nst|vgXN^+96cKKGMc(7h z4O(H{jzJvZizf&LRXVxPu`J7zcx!F$ zF_kcwBNRw@18Z%qlS^Ku&N+HK9>ewiH53x55dVhfyiK~v!aBkr?Qf13Z;%*qCzpI$ z%dETA{Nh6u$*w* q??V^67Bs$r2!>%8hG7`yH@^VshcK_ek`kN%0000?^ literal 0 HcmV?d00001 diff --git a/textures/custom_font_title/custom_font_title_89.rgba32.png b/textures/custom_font_title/custom_font_title_89.rgba32.png new file mode 100644 index 0000000000000000000000000000000000000000..e35c2d47810fba97f9c278d7031d8d4bd859f44e GIT binary patch literal 652 zcmV;70(1R|P)Px%MoC0LRCt{2n&FYFAQXkqzIhGM0EyNN?3BD3+fs_zR&=Q~o_Qxg} zH5WDN1hcu{4C6>d?mfl>G5`$2Fbu;m48t%C!!QiPFdxL%^{B5$55P{evDfQ<1vdf0 z2KPE+T0DyX0NM@uUqwh*)C=;9@+W2Id*I^*_)Ar4t#Lda0RZRonQVAC9LRbpC8U(m z4rBLAP4B(bT8AlyZRWNm+OP+tgat?)Kx$Zk)B&W11xOu0YFL2O0isP}g;@?wxr0Ti}M)Iw+;W<#L&I{je`2{ua2=3#urJ*#bPvurKUU z09-|I&V7sk4ul9sU&q5pN6!eQl&h1E7+;ev#c>J@f?Ycu&a!OR&Obz95Uep~ zaq(%Y+#J#Z__sLH7qZEem?*n7z9A1rxIr;5&0r-0+Y7KOPx%I!Q!9RCt{2n6Z(gFcgOW-Mhr0(hF%psYA7(D}ffYCFn{}e3@N>C;?JuatTX% znJ!@2!5~<$B?GhXo6*?F9`XJkB)unqAP9mW2!bF8f*=TjAPC|c@$&J>0PsZjxPG)v zBLMhB?H%dNjY=v5S`*mwq}+!^S`$ia(1h2{_bTzdI2w~TXF`ia@2Od9{k@cB=^10Y zc@uypsGDH5)^{7QR})Hf0?qUMAp=?yu%k7>pc7=4We*$Rz4ykL-I$Q07o>CUTbYod z7vSl1iekVF6IS81cYOs=cRQ*o-tL&^Ih0b-#*4wvKwp7oOKdKR0!2~W{Gn@#5CWXf z&veh{bEx}m_5e>nVPbeGUthsH50Xq;qLVYEcNbI#{^zN;D`ig;_Smr_oRwXFrA z!)ReNN4&Mx3nAuAqfNp9I0OP#N=*tk#(2*8k_vHi=L8JBbhvHCm`U+t!a3(&DdnxT zo1X%Ai|?=QQcAD29%PXLlQy*j1n2!%;+=D!Px-5?F|ZT3)zk*i2)w>A8A*k+)f5L9 zOo2xZMf!}C#&R^86&NHzu}b2WzyXO~PcHDIcYOu$3!Uw$u4^0)2ON*bC^xLC3YW{J z+w~8?-zbAef}u%KKc5m~EZVuiNIkGQ1_hCnGKv8s`G8nU=*z@!C3=~f5Rb=M*LCQO z;SIo_hX;?$U|USsPEXRbn43e=gzf!Vf|fE^5EHgl5~9$NSeF{WZ>+dT5d=XH1VIo4 ak%a%Qxj70OLS>c!0000Px&k4Z#9RCt{2o86V0Fc5`r(t%QfT2KpWffh&!Zh;nP0hfSFfD%LrP{QPaCB|Y# z#*Wu$eDa;67Z%$ZAV2hQs)RFI7)%tzv5sgX8*8S$}D&pOQA3~Md7 z0REtPehYD!`#Z|ABqHJ#pgL%-FNX_r1b|Mb6D@e})8n(!3oh0;I@9(b$e3bWvHqQ9U=p`kSCmXX=D=#_UHjU=52eu z(D&?(WqH@ZUjUrZ`y_5+sGdq9|190DC2|OMF2(2HtOuw}Has zhvVkSR#hd&eq&6$3z`Gx{SqvIfR$0+dvO7nDo|bMTd+vTT@pf0psG7$FgrfB?q7yf z1qutWO&>F4m*L*~r16Xo$UYhX^A^2pc-ywgt)DPH>(-bkbKxuTNg1x)_yvc^(_^&& zsoFnbJV99wU@)hy8$(jk*N!5nhO#gyhQ3(&C7PwLs;W}EU^xl}_hY#tHaaCmXdFi= z3CgYv-iz1(@!pGmA%sBAIc@<|lI;IUFjb-YrpU%Gr0N02A7rTpKk|miZ$!$Fb9{L3 z`ySIYZ7x4Fvp4a`0vJTfjTov+3$?> z1pt_)iED^t`}Cha0@C)sTsHC{z-WrOuy+9rq8%VPK%pI0#GluOM|A$B@|bCcu15of z=`g_b2PNYBgwa7+nS7H4N}VC1Yh}2jL{^~@F5J`tdtZ*I>pFELRH?*lAtVVTF-&1Z zP}DCJUx)vU00000NkvXXu0mjf DB4fRu literal 0 HcmV?d00001 diff --git a/textures/custom_font_title/custom_font_title_92.rgba32.png b/textures/custom_font_title/custom_font_title_92.rgba32.png new file mode 100644 index 0000000000000000000000000000000000000000..9459ec5e320b3d5fc5d1b0f877b313d2ab14c63e GIT binary patch literal 398 zcmV;90df9`P)Px$NJ&INRCt{2n%fP7FbqZAiUqPlS73z>#|&MeBfto-0xK{A{Ru5e15CH%H000!q$=BDwGe<;qr2X>Nb|<2npk0Si`MOOUXGk?fi?h%;qtG~q zvp6921I#*Lk-$iwx_;uEqq=^jgRbj#HtTp=BAS=dG|e2N@B4ZEt}me^Y65l+n5JnD zJJgU$f@TRiU>w;wEw5>Cg9FU!0utbM7zVS^9t08KYqJ_oMPeyzS`!iyFdaR}0o)F` zZG;d3p~l?)@;4+Rp!iw9G&m37cF1)vkk?l+kk|{D)&yn&Z3DDnIbg$4+20d&Kq%W6 z<$&Dg`xp{Az;sx^0on#=!#WepZ5d1?cR#=^kU(O8^O{I?fceEj6?;(1N^ni+>dUW^ sdc95^BtdNhv?+cT00000005v+9&;6QV=RmoXaE2J07*qoM6N<$g1gt9MgRZ+ literal 0 HcmV?d00001 diff --git a/textures/custom_font_title/custom_font_title_93.rgba32.png b/textures/custom_font_title/custom_font_title_93.rgba32.png new file mode 100644 index 0000000000000000000000000000000000000000..20cfe3f0821a3568e134977fe433b121be064776 GIT binary patch literal 952 zcmV;p14sOcP)Px&a!Eu%RCt`_Tg!2zFc5vUd)lK?AO%v;hM*Kkfek?^upy8F4grS%*S*OhXb+gO ze%*jQHPHA~>EM~dqkd|2zitWOo8u?*odNI*z`rNW0AdrXb)J215cD_ zObCpvs){4wmT59FwCg(G_q|t2QAFG-O==_t4#VKR_kJ8lj)dE!$rg!mA*N~abzM^= z+#*d{1V+_$?Nd1CI1&a3Pm`ep_QsfufR%)%X>O?%B4ezzMFLhZB#2CtHHZMnq3gQa zkdR5>aU3@ZSV6cwn*6U1Q89?224!=!1sM$+y)z6A`#~ZY*nbW zE;dRwI>sXe1;7zRB}kRR!!U4Jpog#~X%_stuDkVqPmz_u(=;75-a$Y=fKq~)xG$8u z0D!70rt=xVZvcNkJF#bhB47p(Y2Skc{DF{akVAAwpmapG0)qEFR}M!N4&?y=pmkQ~ zh>*DePe2w2h`Jwjouzj%`Th_A2jV~lA$fnRDH@S*zykn5UO*wM1(Z^^41^&RmWh)^ z5Or9pwH8_Ku3MnOB7Ys0D>CH%rQ(3(KnN71Z#tT$VebkMl2}9_1PWbXyzhByEm;Tb zAV5?jG^+sj819_&ZQD|w)1GC_XOP_v;YwidmwSUu1H?l}_a{Wu3F7oWb0tPx_a{Vl z9*}MW=bSgjaI4-yQ1DBUy(rPPZRGMB7pE`Z0NI1+p3tiPHriez1XX}r$TR`7>S84? z2ZfFE0DQQ-xG29D#Urs`-2RoB?8+=|?D7=S(;)|8()OzeUz`wkvhxV6nn0AEe>85t a>i+=-^UL!1B)2gD0000U`p|HaSW-L z^LEBAv=Fl^o|C-|HUA{?rp4 zSYIZi)6nvL!FQ3wtRJ2XXEFolA8Dx9y}xPR1LyYn%E_fx-n#p@bJ(5?-yI{u+rXjd zpp>L^E2!n@lfB<{?WcDxYQFI4T9lt=p=!$ottQvS6Yl-qU$-nX>QiB-Mi-N5pYrse zA5+}~xmX_7`0O*{X%0EDK7rv(&?lEKVg>1fyK1Kf-H590)UaZx)Qm{xIW95#WO$HQ zPEV$qyi>$i#Xr~UwSF#bZDIUiz|#$KNA}5Zsk=|k`P^AhsIzwKpKD5A)Z#zh^PW|7 zYSI&hj>(2?&nxfE{gW)XX6tOX7oyMaxVv0*ws}e_=l{PPZ>aA(hm;Al%f_G2g ztjd?K^TiGyX6-OE+uyUb?DLv-fhAAVJ^yg1=d><*wcX7jBDlOa=y;8N)UjM++pkr3 zbel9)Jv(PVn^P^ke~z(m;QJc)nu3pvVSNWB9!G6pH5U}R&)H+><1#1cmeu|E-Hc}9 z3){|C_0Uf;M)PE+m6UMbsi<`3QH?LTt*!rfPQ>w34AAAa?E z@#nqbE2n0*uV31leXRb|n^Px$u1Q2eRCt{2n*EJ~Fbu^Xr!K$>tiTGHg%yqwxD{C8MxZOO0;}}?I8{mm2?QJ* zgMU&b#D`^G;};VE6h%=KMNyP{QdrwHfQ~r+FMysnCMgeVy98i}S(6@WVdZfp;j0Q>;>woho9231w925Q^Z-PHql9?b7_DmV{B!!T@m5OS}B zBV?|)C9wWidnn6twrg*!Gg^ zm|?vjfJhIxeF=PUa0G}TI1R>lfal!oM?uOy01)5HgJ|M*%P`_&=#};7T%SLzr zAkzqg0>ln$=>nuEf$WXJYl3@BO`;KcOCYxXJ=bKfh%G>h0+!ncY+VPikzN9+vd_8~ z2u_2sNS+1{_W*!bfUJGsy(~Vv+qP|Y%>)b7`2SuoOT6y}$1(d){7870K+59H+8E9d qK!gXRe1#?V!$Cz+6h%>#EAt1Y1&^CIc3Xu20000