From 62c6da56cb88e43c0d87fe2cdfd490f0a7cb8472 Mon Sep 17 00:00:00 2001 From: lessthanthree <83487515+lessthnthree@users.noreply.github.com> Date: Tue, 27 Jun 2023 15:46:16 -0700 Subject: [PATCH] Maptext 2023: I can see clearly now (#76356) ## About The Pull Request We needed to replace our maptext font. Closes https://github.com/tgstation/tgstation/issues/73002 Replaced with a pair of new fonts, made some improvements and fixes while we're at it. - Two new maptext fonts: Grand9K and TinyUnicode - These two scale cleanly with BYOND icon sizes, so no antialiasing of already tiny fonts making it look bad when enlarged on screen - Fixed size fonts now have metrics to be used properly on overlays (such as status display) where a client (a requirement for MeasureText) is not feasible - VCR OSD Mono still here, usable as a variable size font with larger text - Synchronizes status display scrolling speed between lines - Fixed special maptexts for yelling, clown, redtext, greentext https://github.com/tgstation/tgstation/assets/83487515/7dbaf1d1-f1d5-46ff-8903-d95cab059ed8 ## Why It's Good For The Game Maptext looks like crap if you're one of the players who no longer have the old font. Even if you do have Small Fonts, this looks better. ## Changelog :cl: LT3 refactor: Refactored maptext (those floating words) fix: Fixed special chat bubbles for yelling, clown, redtext, greentext fix: Fixed alignment of status display text code: Status displays now synchronize their message lines when scrolling /:cl: --- code/__DEFINES/fonts.dm | 8 + code/__DEFINES/text.dm | 11 +- code/datums/chatmessage.dm | 8 +- code/game/atoms.dm | 10 +- code/game/machinery/status_display.dm | 94 +++---- .../elevator/elevator_indicator.dm | 10 +- icons/obj/status_display.dmi | Bin 26857 -> 26869 bytes interface/fonts.dm | 10 - interface/fonts/Grand9K_Pixel.ttf | Bin 0 -> 22108 bytes interface/fonts/TinyUnicode.ttf | Bin 0 -> 23280 bytes interface/{ => fonts}/VCR_OSD_Mono.ttf | Bin interface/fonts/fonts_datum.dm | 78 ++++++ interface/fonts/grand_9k.dm | 253 ++++++++++++++++++ interface/fonts/license.txt | 8 + interface/fonts/tiny_unicode.dm | 253 ++++++++++++++++++ interface/fonts/vcr_osd_mono.dm | 3 + interface/license.txt | 2 - interface/skin.dmf | 6 +- tgstation.dme | 6 +- 19 files changed, 673 insertions(+), 87 deletions(-) delete mode 100644 interface/fonts.dm create mode 100644 interface/fonts/Grand9K_Pixel.ttf create mode 100644 interface/fonts/TinyUnicode.ttf rename interface/{ => fonts}/VCR_OSD_Mono.ttf (100%) create mode 100644 interface/fonts/fonts_datum.dm create mode 100644 interface/fonts/grand_9k.dm create mode 100644 interface/fonts/license.txt create mode 100644 interface/fonts/tiny_unicode.dm create mode 100644 interface/fonts/vcr_osd_mono.dm delete mode 100644 interface/license.txt diff --git a/code/__DEFINES/fonts.dm b/code/__DEFINES/fonts.dm index 6b00195f59b..e3e2e7ab7f6 100644 --- a/code/__DEFINES/fonts.dm +++ b/code/__DEFINES/fonts.dm @@ -14,3 +14,11 @@ /// Emoji icon set #define EMOJI_SET 'icons/ui_icons/emoji/emoji.dmi' + +// Font metrics bitfield +/// Include leading A width and trailing C width in GetWidth() or in DrawText() +#define INCLUDE_AC (1<<0) + +DEFINE_BITFIELD(font_flags, list( + "INCLUDE_AC" = INCLUDE_AC, +)) diff --git a/code/__DEFINES/text.dm b/code/__DEFINES/text.dm index 3cffec0521f..3ac499c7d93 100644 --- a/code/__DEFINES/text.dm +++ b/code/__DEFINES/text.dm @@ -4,9 +4,18 @@ /// Prepares a text to be used for maptext. Use this so it doesn't look hideous. #define MAPTEXT(text) {"[##text]"} -/// Prepares a text to be used for maptext, using a font that can handle larger text better. +/// Prepares a text to be used for maptext, using a variable size font. +/// Variable size font. More flexible but doesn't scale pixel perfect to BYOND icon resolutions. (May be blurry.) Can use any size in pt or px. #define MAPTEXT_VCR_OSD_MONO(text) {"[##text]"} +/// Prepares a text to be used for maptext using a pixel font. Cleaner but less size choices. +/// Standard size (ie: normal runechat) Use only sizing pt, multiples of 6: 6pt 12pt 18pt 24pt etc. - Not for use with px sizing +#define MAPTEXT_GRAND9K(text) {"[##text]"} + +/// Prepares a text to be used for maptext using a pixel font. Cleaner but less size choices. +/// Small size. (ie: whisper runechat) Use only size pt, multiples of 12: 12pt 24pt 48pt etc. - Not for use with px sizing +#define MAPTEXT_TINY_UNICODE(text) {"[##text]"} + /// Macro from Lummox used to get height from a MeasureText proc. /// resolves the MeasureText() return value once, then resolves the height, then sets return_var to that. #define WXH_TO_HEIGHT(measurement, return_var) \ diff --git a/code/datums/chatmessage.dm b/code/datums/chatmessage.dm index 3debadbda70..83494ef5361 100644 --- a/code/datums/chatmessage.dm +++ b/code/datums/chatmessage.dm @@ -13,7 +13,7 @@ /// Approximate height in pixels of an 'average' line, used for height decay #define CHAT_MESSAGE_APPROX_LHEIGHT 11 /// Max width of chat message in pixels -#define CHAT_MESSAGE_WIDTH 96 +#define CHAT_MESSAGE_WIDTH 112 /// The dimensions of the chat message icons #define CHAT_MESSAGE_ICON_SIZE 9 @@ -145,6 +145,10 @@ if (!ismob(target)) extra_classes |= "small" + // Why are you yelling? + if(copytext_char(text, -2) == "!!") + extra_classes |= SPAN_YELL + var/list/prefixes // Append radio icon if from a virtual speaker @@ -171,7 +175,7 @@ var/tgt_color = extra_classes.Find("italics") ? target.chat_color_darkened : target.chat_color // Approximate text height - var/complete_text = "[owner.say_emphasis(text)]" + var/complete_text = "[owner.say_emphasis(text)]" var/mheight WXH_TO_HEIGHT(owned_by.MeasureText(complete_text, null, CHAT_MESSAGE_WIDTH), mheight) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index d492272a612..d04e4df3058 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -2035,7 +2035,7 @@ active_hud.screentip_text.maptext = "" return - active_hud.screentip_text.maptext_y = 0 + active_hud.screentip_text.maptext_y = 16 // 16px lines us up with the action buttons top left corner var/lmb_rmb_line = "" var/ctrl_lmb_ctrl_rmb_line = "" var/alt_lmb_alt_rmb_line = "" @@ -2102,15 +2102,15 @@ extra_lines++ if(extra_lines) - extra_context = "
[lmb_rmb_line][ctrl_lmb_ctrl_rmb_line][alt_lmb_alt_rmb_line][shift_lmb_ctrl_shift_lmb_line]" - //first extra line pushes atom name line up 10px, subsequent lines push it up 9px, this offsets that and keeps the first line in the same place - active_hud.screentip_text.maptext_y = -10 + (extra_lines - 1) * -9 + extra_context = "
[lmb_rmb_line][ctrl_lmb_ctrl_rmb_line][alt_lmb_alt_rmb_line][shift_lmb_ctrl_shift_lmb_line]" + //first extra line pushes atom name line up 11px, subsequent lines push it up 8px, this offsets that and keeps the first line in the same place + active_hud.screentip_text.maptext_y = 5 + (extra_lines - 1) * -8 if (screentips_enabled == SCREENTIP_PREFERENCE_CONTEXT_ONLY && extra_context == "") active_hud.screentip_text.maptext = "" else //We inline a MAPTEXT() here, because there's no good way to statically add to a string like this - active_hud.screentip_text.maptext = "[name][extra_context]" + active_hud.screentip_text.maptext = "[name][extra_context]" /// Gets a merger datum representing the connected blob of objects in the allowed_types argument /atom/proc/GetMergeGroup(id, list/allowed_types) diff --git a/code/game/machinery/status_display.dm b/code/game/machinery/status_display.dm index 0d697d35111..4859d7b422d 100644 --- a/code/game/machinery/status_display.dm +++ b/code/game/machinery/status_display.dm @@ -1,11 +1,15 @@ // Status display -// (formerly Countdown timer display) -#define MAX_STATIC_WIDTH 25 -#define FONT_STYLE "5pt 'Small Fonts'" +#define MAX_STATIC_WIDTH 22 +#define FONT_STYLE "12pt 'TinyUnicode'" #define SCROLL_RATE (0.04 SECONDS) // time per pixel -#define LINE1_Y -8 -#define LINE2_Y -15 +#define SCROLL_PADDING 2 // how many pixels we chop to make a smooth loop +#define LINE1_X 1 +#define LINE1_Y -4 +#define LINE2_X 1 +#define LINE2_Y -11 +#define STATUS_DISPLAY_FONT_DATUM /datum/font/tiny_unicode/size_12pt + /// Status display which can show images and scrolling text. /obj/machinery/status_display name = "status display" @@ -124,14 +128,14 @@ * * message - the new message text. * Returns new /obj/effect/overlay/status_display_text or null if unchanged. */ -/obj/machinery/status_display/proc/update_message(obj/effect/overlay/status_display_text/overlay, line_y, message, x_offset) +/obj/machinery/status_display/proc/update_message(obj/effect/overlay/status_display_text/overlay, line_y, message, x_offset, line_pair) if(overlay && message == overlay.message) return null if(overlay) qdel(overlay) - var/obj/effect/overlay/status_display_text/new_status_display_text = new(src, line_y, message, text_color, header_text_color, x_offset) + var/obj/effect/overlay/status_display_text/new_status_display_text = new(src, line_y, message, text_color, header_text_color, x_offset, line_pair) // Draw our object visually "in front" of this display, taking advantage of sidemap new_status_display_text.pixel_y = -32 new_status_display_text.pixel_z = 32 @@ -149,7 +153,7 @@ return set_light(1.5, 0.7, LIGHT_COLOR_BLUE) // blue light -/obj/machinery/status_display/update_overlays() +/obj/machinery/status_display/update_overlays(updates) . = ..() if(machine_stat & (NOPOWER|BROKEN)) @@ -167,10 +171,18 @@ if(current_picture == AI_DISPLAY_DONT_GLOW) // If the thing's off, don't display the emissive yeah? return . else - var/overlay = update_message(message1_overlay, LINE1_Y, message1) + var/line1_metric + var/line2_metric + var/line_pair + var/datum/font/display_font = new STATUS_DISPLAY_FONT_DATUM() + line1_metric = display_font.get_metrics(message1) + line2_metric = display_font.get_metrics(message2) + line_pair = (line1_metric > line2_metric ? line1_metric : line2_metric) + + var/overlay = update_message(message1_overlay, LINE1_Y, message1, LINE1_X, line_pair) if(overlay) message1_overlay = overlay - overlay = update_message(message2_overlay, LINE2_Y, message2) + overlay = update_message(message2_overlay, LINE2_Y, message2, LINE2_X, line_pair) if(overlay) message2_overlay = overlay @@ -245,39 +257,23 @@ // If the line is short enough to not marquee, and it matches this, it's a header. var/static/regex/header_regex = regex("^-.*-$") - /// Width of each character, including kerning gap afterwards. - /// We don't use rich text or anything fancy, so we can bake these values. - var/static/list/char_widths = list( - // ! " # $ % & ' ( ) * + , - . / - 1, 2, 3, 5, 4, 5, 5, 2, 3, 3, 3, 4, 2, 3, 2, 3, - // 0 1 2 3 4 5 6 7 8 9 : ; < = > ? - 4, 3, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 3, 3, 3, 3, - // @ A B C D E F G H I J K L M N O - 7, 5, 5, 5, 5, 4, 4, 5, 5, 2, 4, 5, 4, 6, 5, 5, - // P Q R S T U V W X Y Z [ \ ] ^ _ - 5, 5, 5, 5, 4, 5, 4, 6, 4, 4, 4, 3, 3, 3, 4, 4, - // ` a b c d e f g h i j k l m n o - 3, 5, 5, 5, 5, 4, 4, 5, 5, 2, 4, 5, 4, 6, 5, 5, - // p q r s t u v w x y z { | } ~ - 5, 5, 5, 5, 4, 5, 4, 6, 4, 4, 4, 3, 2, 3, 4, - ) - -/obj/effect/overlay/status_display_text/Initialize(mapload, yoffset, line, text_color, header_text_color, xoffset = 0) +/obj/effect/overlay/status_display_text/Initialize(mapload, yoffset, line, text_color, header_text_color, xoffset = 0, line_pair) . = ..() maptext_y = yoffset message = line - var/line_width = measure_width(line) + var/datum/font/display_font = new STATUS_DISPLAY_FONT_DATUM() + var/line_width = display_font.get_metrics(line) if(line_width > MAX_STATIC_WIDTH) // Marquee text - var/marquee_message = "[line] - [line] - [line]" + var/marquee_message = "[line] [line] [line]" // Width of full content. Must of these is never revealed unless the user inputted a single character. - var/full_marquee_width = measure_width(marquee_message) + var/full_marquee_width = display_font.get_metrics("[marquee_message] ") // We loop after only this much has passed. - var/looping_marquee_width = measure_width("[line] - ") + var/looping_marquee_width = (display_font.get_metrics("[line] ]") - SCROLL_PADDING) maptext = generate_text(marquee_message, center = FALSE, text_color = text_color) maptext_width = full_marquee_width @@ -287,45 +283,24 @@ add_filter("mask", 1, alpha_mask_filter(icon = icon(icon, "outline"))) // Scroll. - var/time = looping_marquee_width * SCROLL_RATE - animate(src, maptext_x = -looping_marquee_width, time = time, loop = -1) - animate(maptext_x = 0, time = 0) + var/time = line_pair * SCROLL_RATE + animate(src, maptext_x = (-looping_marquee_width) + MAX_STATIC_WIDTH, time = time, loop = -1) + animate(maptext_x = MAX_STATIC_WIDTH, time = 0) else // Centered text var/color = header_regex.Find(line) ? header_text_color : text_color maptext = generate_text(line, center = TRUE, text_color = color) maptext_x = xoffset //Defaults to 0, this would be centered unless overided -/** - * A hyper-streamlined version of MeasureText that doesn't support different fonts, rich formatting, or multiline. - * But it also doesn't require a client. - * - * Returns the width in pixels - * - * Arguments: - * * text - the text to measure - */ -/obj/effect/overlay/status_display_text/proc/measure_width(text) - var/width = 0 - for(var/text_idx in 1 to length(text)) - var/ascii = text2ascii(text, text_idx) - if(!(ascii in 0x20 to 0x7E)) - // So we can't possibly runtime, even though the input should be in range already. - width += 3 - continue - width += char_widths[ascii - 0x1F] - - return width - /** * Generate the actual maptext. * Arguments: * * text - the text to display - * * center - center the text if TRUE, otherwise left-align + * * center - center the text if TRUE, otherwise right-align (the direction the text is coming from) * * text_color - the text color */ /obj/effect/overlay/status_display_text/proc/generate_text(text, center, text_color) - return {"
[text]
"} + return {"
[text]
"} /// Evac display which shows shuttle timer or message set by Command. /obj/machinery/status_display/evac @@ -576,5 +551,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/status_display/ai, 32) #undef MAX_STATIC_WIDTH #undef FONT_STYLE #undef SCROLL_RATE +#undef LINE1_X #undef LINE1_Y +#undef LINE2_X #undef LINE2_Y +#undef STATUS_DISPLAY_FONT_DATUM diff --git a/code/modules/industrial_lift/elevator/elevator_indicator.dm b/code/modules/industrial_lift/elevator/elevator_indicator.dm index 781ff35981b..f0aec0c2217 100644 --- a/code/modules/industrial_lift/elevator/elevator_indicator.dm +++ b/code/modules/industrial_lift/elevator/elevator_indicator.dm @@ -19,10 +19,10 @@ light_color = LIGHT_COLOR_DARK_BLUE luminosity = 1 - maptext_x = 17 - maptext_y = 21 - maptext_width = 4 - maptext_height = 8 + maptext_x = 18 + maptext_y = 20 + maptext_width = 8 + maptext_height = 16 /// What specific_lift_id do we link with? var/linked_elevator_id @@ -150,7 +150,7 @@ return set_light(l_on = TRUE) - maptext = {"
[current_lift_floor]
"} + maptext = MAPTEXT_TINY_UNICODE("
[current_lift_floor]
") /obj/machinery/lift_indicator/update_overlays() . = ..() diff --git a/icons/obj/status_display.dmi b/icons/obj/status_display.dmi index 6833e9ff244f2708f41c61e3282c34bc1c4d4e37..76d20addff766cee6d11128eacedb5190d45fab3 100644 GIT binary patch literal 26869 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 literal 26857 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 diff --git a/interface/fonts.dm b/interface/fonts.dm deleted file mode 100644 index 0bfc9c728c7..00000000000 --- a/interface/fonts.dm +++ /dev/null @@ -1,10 +0,0 @@ -/// A font datum, it exists to define a custom font to use in a span style later. -/datum/font - /// Font name, just so people know what to put in their span style. - var/name - /// The font file we link to. - var/font_family - -/datum/font/vcr_osd_mono - name = "VCR OSD Mono" - font_family = 'interface/VCR_OSD_Mono.ttf' diff --git a/interface/fonts/Grand9K_Pixel.ttf b/interface/fonts/Grand9K_Pixel.ttf new file mode 100644 index 0000000000000000000000000000000000000000..cf6fdf44e2ec74a0ebe28b4bbb21f89b66bf8420 GIT binary patch literal 22108 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 metrics.len) + idx = (default_character - start) * 3 + + if(!. && !(flags & INCLUDE_AC)) + . -= metrics[idx + 1] + . += metrics[idx + 1] + metrics[idx + 2] + metrics[idx +3] + + if(. && idx && !(flags & INCLUDE_AC)) + . -= max(metrics[idx + 3], 0) + + . = max(. + first_line, longest) + if(. > 0) + . += overhang diff --git a/interface/fonts/grand_9k.dm b/interface/fonts/grand_9k.dm new file mode 100644 index 00000000000..7993d307bcb --- /dev/null +++ b/interface/fonts/grand_9k.dm @@ -0,0 +1,253 @@ +/// For clean results on map, use only sizing pt, multiples of 6: 6pt 12pt 18pt 24pt etc. - Not for use with px sizing +/// Can be used in TGUI etc, px sizing is pt / 0.75. 6pt = 8px, 12pt = 16px etc. + +/// Base font +/datum/font/grand9k + name = "Grand9K Pixel" + font_family = 'interface/fonts/Grand9K_Pixel.ttf' + +/// For icon overlays +/// Grand9K 6pt metrics generated using Lummox's dmifontsplus (https://www.byond.com/developer/LummoxJR/DmiFontsPlus) +/// Note: these variable names have been changed, so you can't straight copy/paste from dmifontsplus.exe +/datum/font/grand9k/size_6pt + name = "Grand9K Pixel 6pt" + height = 12 + ascent = 10 + descent = 2 + average_width = 4 + max_width = 9 + overhang = 0 + in_leading = 4 + ex_leading = 1 + default_character = 31 + start = 30 + end = 255 + metrics = list( + 0, 5, 1, // char 30 + 0, 5, 1, // char 31 + 0, 1, 1, // char 32 + 0, 1, 1, // char 33 + 0, 3, 1, // char 34 + 0, 6, 1, // char 35 + 0, 5, 1, // char 36 + 0, 7, 1, // char 37 + 0, 5, 1, // char 38 + 0, 1, 1, // char 39 + 0, 3, 1, // char 40 + 0, 3, 1, // char 41 + 0, 5, 1, // char 42 + 0, 5, 1, // char 43 + 0, 1, 1, // char 44 + 0, 4, 1, // char 45 + 0, 1, 1, // char 46 + 0, 3, 1, // char 47 + 0, 5, 1, // char 48 + 0, 2, 1, // char 49 + 0, 5, 1, // char 50 + 0, 4, 1, // char 51 + 0, 5, 1, // char 52 + 0, 5, 1, // char 53 + 0, 5, 1, // char 54 + 0, 5, 1, // char 55 + 0, 5, 1, // char 56 + 0, 5, 1, // char 57 + 0, 1, 1, // char 58 + 0, 1, 1, // char 59 + 0, 4, 1, // char 60 + 0, 4, 1, // char 61 + 0, 4, 1, // char 62 + 0, 4, 1, // char 63 + 0, 7, 1, // char 64 + 0, 5, 1, // char 65 + 0, 5, 1, // char 66 + 0, 4, 1, // char 67 + 0, 5, 1, // char 68 + 0, 4, 1, // char 69 + 0, 4, 1, // char 70 + 0, 5, 1, // char 71 + 0, 5, 1, // char 72 + 0, 1, 1, // char 73 + 0, 5, 1, // char 74 + 0, 5, 1, // char 75 + 0, 5, 1, // char 76 + 0, 5, 1, // char 77 + 0, 5, 1, // char 78 + 0, 5, 1, // char 79 + 0, 5, 1, // char 80 + 0, 6, 1, // char 81 + 0, 5, 1, // char 82 + 0, 5, 1, // char 83 + 0, 5, 1, // char 84 + 0, 5, 1, // char 85 + 0, 5, 1, // char 86 + 0, 5, 1, // char 87 + 0, 5, 1, // char 88 + 0, 5, 1, // char 89 + 0, 5, 1, // char 90 + 0, 3, 1, // char 91 + 0, 3, 1, // char 92 + 0, 3, 1, // char 93 + 0, 5, 1, // char 94 + 0, 4, 0, // char 95 + 0, 2, 1, // char 96 + 0, 4, 1, // char 97 + 0, 4, 1, // char 98 + 0, 3, 1, // char 99 + 0, 4, 1, // char 100 + 0, 4, 1, // char 101 + 0, 4, 1, // char 102 + 0, 4, 1, // char 103 + 0, 4, 1, // char 104 + 0, 1, 1, // char 105 + 0, 3, 1, // char 106 + 0, 4, 1, // char 107 + 0, 1, 1, // char 108 + 0, 5, 1, // char 109 + 0, 4, 1, // char 110 + 0, 4, 1, // char 111 + 0, 4, 1, // char 112 + 0, 4, 1, // char 113 + 0, 4, 1, // char 114 + 0, 4, 1, // char 115 + 0, 4, 1, // char 116 + 0, 4, 1, // char 117 + 0, 5, 1, // char 118 + 0, 5, 1, // char 119 + 0, 5, 1, // char 120 + 0, 4, 1, // char 121 + 0, 5, 1, // char 122 + 0, 4, 1, // char 123 + 0, 1, 1, // char 124 + 0, 4, 1, // char 125 + 0, 6, 1, // char 126 + 0, 5, 1, // char 127 + 0, 5, 1, // char 128 + 0, 5, 1, // char 129 + 0, 1, 1, // char 130 + 0, 5, 1, // char 131 + 0, 3, 1, // char 132 + 0, 5, 1, // char 133 + 0, 5, 1, // char 134 + 0, 5, 1, // char 135 + 0, 5, 1, // char 136 + 0, 5, 1, // char 137 + 0, 5, 1, // char 138 + 0, 3, 1, // char 139 + 0, 6, 1, // char 140 + 0, 5, 1, // char 141 + 0, 5, 1, // char 142 + 0, 5, 1, // char 143 + 0, 5, 1, // char 144 + 0, 1, 1, // char 145 + 0, 1, 1, // char 146 + 0, 3, 1, // char 147 + 0, 3, 1, // char 148 + 0, 1, 1, // char 149 + 0, 5, 1, // char 150 + 0, 5, 1, // char 151 + 0, 5, 1, // char 152 + 0, 8, 1, // char 153 + 0, 4, 1, // char 154 + 0, 3, 1, // char 155 + 0, 5, 1, // char 156 + 0, 5, 1, // char 157 + 0, 5, 1, // char 158 + 0, 5, 1, // char 159 + 0, 1, 1, // char 160 + 0, 1, 1, // char 161 + 0, 4, 1, // char 162 + 0, 5, 1, // char 163 + 0, 5, 1, // char 164 + 0, 5, 1, // char 165 + 0, 1, 1, // char 166 + 0, 5, 1, // char 167 + 0, 3, 1, // char 168 + 0, 8, 1, // char 169 + 0, 5, 1, // char 170 + 0, 6, 1, // char 171 + 0, 4, 1, // char 172 + 0, 5, 1, // char 173 + 0, 8, 1, // char 174 + 0, 5, 1, // char 175 + 0, 3, 1, // char 176 + 0, 5, 1, // char 177 + 0, 5, 1, // char 178 + 0, 5, 1, // char 179 + 0, 2, 1, // char 180 + 0, 4, 1, // char 181 + 0, 5, 1, // char 182 + 0, 1, 1, // char 183 + 0, 2, 1, // char 184 + 0, 5, 1, // char 185 + 0, 5, 1, // char 186 + 0, 6, 1, // char 187 + 0, 5, 1, // char 188 + 0, 5, 1, // char 189 + 0, 5, 1, // char 190 + 0, 4, 1, // char 191 + 0, 5, 1, // char 192 + 0, 5, 1, // char 193 + 0, 5, 1, // char 194 + 0, 6, 0, // char 195 + 0, 5, 1, // char 196 + 0, 5, 1, // char 197 + 0, 6, 1, // char 198 + 0, 4, 1, // char 199 + 0, 4, 1, // char 200 + 0, 4, 1, // char 201 + 0, 4, 1, // char 202 + 0, 4, 1, // char 203 + 1, 2, 0, // char 204 + 0, 2, 1, // char 205 + 0, 3, 0, // char 206 + 0, 3, 0, // char 207 + 0, 6, 1, // char 208 + 0, 6, 0, // char 209 + 0, 5, 1, // char 210 + 0, 5, 1, // char 211 + 0, 5, 1, // char 212 + 0, 6, 1, // char 213 + 0, 5, 1, // char 214 + 0, 5, 1, // char 215 + 0, 5, 1, // char 216 + 0, 5, 1, // char 217 + 0, 5, 1, // char 218 + 0, 5, 1, // char 219 + 0, 5, 1, // char 220 + 0, 5, 1, // char 221 + 0, 5, 1, // char 222 + 0, 5, 1, // char 223 + 0, 4, 1, // char 224 + 0, 4, 1, // char 225 + 0, 4, 1, // char 226 + 0, 4, 1, // char 227 + 0, 4, 1, // char 228 + 0, 4, 1, // char 229 + 0, 5, 1, // char 230 + 0, 3, 1, // char 231 + 0, 4, 1, // char 232 + 0, 4, 1, // char 233 + 0, 4, 1, // char 234 + 0, 4, 1, // char 235 + 0, 2, 1, // char 236 + 1, 2, 0, // char 237 + 0, 3, 0, // char 238 + 0, 3, 0, // char 239 + 0, 5, 0, // char 240 + 0, 4, 1, // char 241 + 0, 4, 1, // char 242 + 0, 4, 1, // char 243 + 0, 4, 1, // char 244 + 0, 4, 1, // char 245 + 0, 4, 1, // char 246 + 0, 5, 1, // char 247 + 0, 4, 1, // char 248 + 0, 4, 1, // char 249 + 0, 4, 1, // char 250 + 0, 4, 1, // char 251 + 0, 4, 1, // char 252 + 0, 4, 1, // char 253 + 0, 4, 1, // char 254 + 0, 4, 1, // char 255 + 226 + ) diff --git a/interface/fonts/license.txt b/interface/fonts/license.txt new file mode 100644 index 00000000000..800b033f887 --- /dev/null +++ b/interface/fonts/license.txt @@ -0,0 +1,8 @@ +VCR OSD Mono created by Riciery Leal/mrmanet. Website indicates 100% free, author confirms it's free for all to use. +(https://www.dafont.com/font-comment.php?file=vcr_osd_mono) + +Grand9K Pixel created by Jayvee Enaguas. Licensed under Creative Commons Attribution 4.0 International (CC BY 4.0) +(https://creativecommons.org/licenses/by/4.0/) (https://www.dafont.com/grand9k-pixel.font) + +Tiny Unicode created by Jakob Riedle/DuffsDevice. Website indicates free for commercial use. +(https://fontmeme.com/fonts/tiny-unicode-font/) diff --git a/interface/fonts/tiny_unicode.dm b/interface/fonts/tiny_unicode.dm new file mode 100644 index 00000000000..d6af265d518 --- /dev/null +++ b/interface/fonts/tiny_unicode.dm @@ -0,0 +1,253 @@ +/// For clean results on map, use only sizing pt, multiples of 12: 12pt 24pt 48pt etc. - Not for use with px sizing +/// Can be used in TGUI etc, px sizing is pt / 0.75. 12pt = 16px, 24pt = 32px etc. + +/// Base font +/datum/font/tiny_unicode + name = "TinyUnicode" + font_family = 'interface/fonts/TinyUnicode.ttf' + +/// For icon overlays +/// TinyUnicode 12pt metrics generated using Lummox's dmifontsplus (https://www.byond.com/developer/LummoxJR/DmiFontsPlus) +/// Note: these variable names have been changed, so you can't straight copy/paste from dmifontsplus.exe +/datum/font/tiny_unicode/size_12pt + name = "TinyUnicode 12pt" + height = 13 + ascent = 11 + descent = 2 + average_width = 5 + max_width = 11 + overhang = 0 + in_leading = -3 + ex_leading = 1 + default_character = 31 + start = 30 + end = 255 + metrics = list( + 1, 5, 0, // char 30 + 1, 5, 0, // char 31 + 0, 1, 4, // char 32 + 0, 1, 1, // char 33 + 0, 3, 1, // char 34 + 0, 5, 1, // char 35 + 0, 4, 1, // char 36 + 0, 3, 1, // char 37 + 0, 5, 1, // char 38 + 0, 1, 1, // char 39 + 0, 2, 1, // char 40 + 0, 2, 1, // char 41 + 0, 3, 1, // char 42 + 0, 3, 1, // char 43 + 0, 2, 1, // char 44 + 0, 3, 1, // char 45 + 0, 1, 1, // char 46 + 0, 3, 1, // char 47 + 0, 4, 1, // char 48 + 0, 2, 1, // char 49 + 0, 4, 1, // char 50 + 0, 4, 1, // char 51 + 0, 4, 1, // char 52 + 0, 4, 1, // char 53 + 0, 4, 1, // char 54 + 0, 4, 1, // char 55 + 0, 4, 1, // char 56 + 0, 4, 1, // char 57 + 0, 1, 1, // char 58 + 0, 2, 1, // char 59 + 0, 2, 1, // char 60 + 0, 4, 1, // char 61 + 0, 2, 1, // char 62 + 0, 4, 1, // char 63 + 0, 7, 1, // char 64 + 0, 4, 1, // char 65 + 0, 4, 1, // char 66 + 0, 3, 1, // char 67 + 0, 4, 1, // char 68 + 0, 3, 1, // char 69 + 0, 3, 1, // char 70 + 0, 4, 1, // char 71 + 0, 4, 1, // char 72 + 0, 3, 1, // char 73 + 0, 4, 1, // char 74 + 0, 4, 1, // char 75 + 0, 3, 1, // char 76 + 0, 5, 1, // char 77 + 0, 4, 1, // char 78 + 0, 4, 1, // char 79 + 0, 4, 1, // char 80 + 0, 4, 1, // char 81 + 0, 4, 1, // char 82 + 0, 4, 1, // char 83 + 0, 3, 1, // char 84 + 0, 4, 1, // char 85 + 0, 4, 1, // char 86 + 0, 5, 1, // char 87 + 0, 4, 1, // char 88 + 0, 4, 1, // char 89 + 0, 3, 1, // char 90 + 0, 2, 1, // char 91 + 0, 3, 1, // char 92 + 0, 2, 1, // char 93 + 0, 3, 1, // char 94 + 0, 5, 1, // char 95 + 0, 2, 1, // char 96 + 0, 4, 1, // char 97 + 0, 4, 1, // char 98 + 0, 3, 1, // char 99 + 0, 4, 1, // char 100 + 0, 4, 1, // char 101 + 0, 3, 1, // char 102 + 0, 4, 1, // char 103 + 0, 4, 1, // char 104 + 0, 1, 1, // char 105 + 0, 2, 1, // char 106 + 0, 4, 1, // char 107 + 0, 1, 1, // char 108 + 0, 5, 1, // char 109 + 0, 4, 1, // char 110 + 0, 4, 1, // char 111 + 0, 4, 1, // char 112 + 0, 4, 1, // char 113 + 0, 3, 1, // char 114 + 0, 4, 1, // char 115 + 0, 3, 1, // char 116 + 0, 4, 1, // char 117 + 0, 4, 1, // char 118 + 0, 5, 1, // char 119 + 0, 3, 1, // char 120 + 0, 4, 1, // char 121 + 0, 4, 1, // char 122 + 0, 3, 1, // char 123 + 0, 1, 1, // char 124 + 0, 3, 1, // char 125 + 0, 5, 1, // char 126 + 1, 5, 0, // char 127 + 0, 4, 1, // char 128 + 1, 5, 0, // char 129 + 1, 5, 0, // char 130 + 1, 5, 0, // char 131 + 1, 5, 0, // char 132 + 1, 5, 0, // char 133 + 1, 5, 0, // char 134 + 1, 5, 0, // char 135 + 1, 5, 0, // char 136 + 0, 5, 1, // char 137 + 1, 5, 0, // char 138 + 1, 5, 0, // char 139 + 0, 6, 1, // char 140 + 1, 5, 0, // char 141 + 1, 5, 0, // char 142 + 1, 5, 0, // char 143 + 1, 5, 0, // char 144 + 1, 5, 0, // char 145 + 1, 5, 0, // char 146 + 1, 5, 0, // char 147 + 1, 5, 0, // char 148 + 0, 2, 1, // char 149 + 1, 5, 0, // char 150 + 1, 5, 0, // char 151 + 1, 5, 0, // char 152 + 0, 4, 1, // char 153 + 1, 5, 0, // char 154 + 1, 5, 0, // char 155 + 1, 5, 0, // char 156 + 1, 5, 0, // char 157 + 1, 5, 0, // char 158 + 0, 4, 1, // char 159 + 1, 5, 0, // char 160 + 0, 1, 1, // char 161 + 0, 4, 1, // char 162 + 0, 4, 1, // char 163 + 0, 5, 1, // char 164 + 0, 3, 1, // char 165 + 0, 1, 1, // char 166 + 0, 4, 1, // char 167 + 0, 3, 1, // char 168 + 0, 2, 1, // char 169 + 0, 8, 1, // char 170 + 0, 4, 1, // char 171 + 0, 4, 1, // char 172 + 1, 5, 0, // char 173 + 0, 2, 1, // char 174 + 0, 4, 1, // char 175 + 0, 3, 1, // char 176 + 0, 3, 1, // char 177 + 0, 2, 1, // char 178 + 0, 2, 1, // char 179 + 0, 2, 1, // char 180 + 0, 4, 1, // char 181 + 0, 5, 1, // char 182 + 1, 1, 1, // char 183 + 0, 8, 1, // char 184 + 0, 2, 1, // char 185 + 0, 2, 1, // char 186 + 0, 4, 1, // char 187 + 0, 7, 1, // char 188 + 0, 8, 1, // char 189 + 0, 8, 1, // char 190 + 0, 4, 1, // char 191 + 0, 4, 1, // char 192 + 0, 4, 1, // char 193 + 0, 4, 1, // char 194 + 0, 4, 1, // char 195 + 0, 4, 1, // char 196 + 0, 4, 1, // char 197 + 0, 6, 1, // char 198 + 0, 3, 1, // char 199 + 0, 3, 1, // char 200 + 0, 3, 1, // char 201 + 0, 3, 1, // char 202 + 0, 3, 1, // char 203 + 0, 3, 1, // char 204 + 0, 3, 1, // char 205 + 0, 3, 1, // char 206 + 0, 3, 1, // char 207 + 0, 10, 1, // char 208 + 0, 4, 1, // char 209 + 0, 4, 1, // char 210 + 0, 4, 1, // char 211 + 0, 4, 1, // char 212 + 0, 4, 1, // char 213 + 0, 4, 1, // char 214 + 0, 3, 1, // char 215 + 0, 5, 1, // char 216 + 0, 4, 1, // char 217 + 0, 4, 1, // char 218 + 0, 4, 1, // char 219 + 0, 4, 1, // char 220 + 0, 4, 1, // char 221 + 0, 3, 1, // char 222 + 0, 3, 1, // char 223 + 0, 4, 1, // char 224 + 0, 4, 1, // char 225 + 0, 4, 1, // char 226 + 0, 4, 1, // char 227 + 0, 4, 1, // char 228 + 0, 4, 1, // char 229 + 0, 7, 1, // char 230 + 0, 3, 1, // char 231 + 0, 4, 1, // char 232 + 0, 4, 1, // char 233 + 0, 4, 1, // char 234 + 0, 4, 1, // char 235 + 0, 2, 1, // char 236 + 0, 2, 1, // char 237 + 0, 3, 1, // char 238 + 0, 3, 1, // char 239 + 0, 5, 1, // char 240 + 0, 4, 1, // char 241 + 0, 4, 1, // char 242 + 0, 4, 1, // char 243 + 0, 4, 1, // char 244 + 0, 4, 1, // char 245 + 0, 4, 1, // char 246 + 0, 5, 1, // char 247 + 0, 4, 1, // char 248 + 0, 4, 1, // char 249 + 0, 4, 1, // char 250 + 0, 4, 1, // char 251 + 0, 4, 1, // char 252 + 0, 4, 1, // char 253 + 0, 10, 1, // char 254 + 0, 4, 1, // char 255 + 226 + ) diff --git a/interface/fonts/vcr_osd_mono.dm b/interface/fonts/vcr_osd_mono.dm new file mode 100644 index 00000000000..301d90d2f7e --- /dev/null +++ b/interface/fonts/vcr_osd_mono.dm @@ -0,0 +1,3 @@ +/datum/font/vcr_osd_mono + name = "VCR OSD Mono" + font_family = 'interface/fonts/VCR_OSD_Mono.ttf' diff --git a/interface/license.txt b/interface/license.txt deleted file mode 100644 index 5f74403c50a..00000000000 --- a/interface/license.txt +++ /dev/null @@ -1,2 +0,0 @@ -VCR OSD Mono created by Riciery Leal/mrmanet. Website indicates 100% free, author confirms it's free for all to use. -(https://www.dafont.com/font-comment.php?file=vcr_osd_mono) diff --git a/interface/skin.dmf b/interface/skin.dmf index ae43a3c401b..d0ebe3066c7 100644 --- a/interface/skin.dmf +++ b/interface/skin.dmf @@ -111,12 +111,12 @@ window "mapwindow" size = 640x480 anchor1 = 0,0 anchor2 = 100,100 - font-family = "Arial" - font-size = 7 + font-family = "Grand9K Pixel" + font-size = 6pt is-default = true right-click = true saved-params = "zoom;letterbox;zoom-mode" - style = ".center { text-align: center; } .maptext { font-family: 'Small Fonts'; font-size: 7px; -dm-text-outline: 1px black; color: white; line-height: 1.1; } .command_headset { font-weight: bold;\tfont-size: 8px; } .small { font-size: 6px; } .big { font-size: 8px; } .reallybig { font-size: 8px; } .extremelybig { font-size: 8px; } .greentext { color: #00FF00; font-size: 7px; } .redtext { color: #FF0000; font-size: 7px; } .clown { color: #FF69Bf; font-size: 7px; font-weight: bold; } .his_grace { color: #15D512; } .hypnophrase { color: #0d0d0d; font-weight: bold; } .yell { font-weight: bold; } .italics { font-size: 6px; }" + style = ".center { text-align: center; } .maptext { font-family: 'Grand9K Pixel'; font-size: 6pt; -dm-text-outline: 1px black; color: white; line-height: 1.0; } .command_headset { font-weight: bold; } .small { font-family: 'TinyUnicode'; font-size: 12pt; line-height: 0.75; } .big { font-size: 8pt; } .reallybig { font-size: 8pt; } .extremelybig { font-size: 8pt; } .greentext { color: #00FF00; font-size: 6pt; } .redtext { color: #FF0000; font-size: 6pt; } .clown { color: #FF69BF; font-weight: bold; } .his_grace { color: #15D512; } .hypnophrase { color: #0d0d0d; font-weight: bold; } .yell { font-weight: bold; } .italics { font-family: 'TinyUnicode'; font-size: 12pt; line-height: 0.75; }" elem "status_bar" type = LABEL pos = 0,464 diff --git a/tgstation.dme b/tgstation.dme index 0caa8826527..fcdae91e068 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1,6 +1,7 @@ // DM Environment file for tgstation.dme. // All manual changes should be made outside the BEGIN_ and END_ blocks. // New source code should be placed in .dm files: choose File/New --> Code File. +// interface\skin.dmf needs to be at the very end of the file. // BEGIN_INTERNALS // END_INTERNALS @@ -5350,9 +5351,12 @@ #include "code\modules\zombie\items.dm" #include "code\modules\zombie\organs.dm" #include "code\ze_genesis_call\genesis_call.dm" -#include "interface\fonts.dm" #include "interface\interface.dm" #include "interface\menu.dm" #include "interface\stylesheet.dm" +#include "interface\fonts\fonts_datum.dm" +#include "interface\fonts\grand_9k.dm" +#include "interface\fonts\tiny_unicode.dm" +#include "interface\fonts\vcr_osd_mono.dm" #include "interface\skin.dmf" // END_INCLUDE