From 85faba1a0f2c8a68b89e9f5b98e22745ce24777a Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Wed, 28 Jun 2023 06:05:25 +0200 Subject: [PATCH] [MIRROR] Maptext 2023: I can see clearly now [MDB IGNORE] (#22100) * Maptext 2023: I can see clearly now * skyrat edit * Update tgstation.dme --------- Co-authored-by: lessthanthree <83487515+lessthnthree@users.noreply.github.com> --- 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 | 96 +++---- .../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 | 7 +- tgstation.dme | 6 +- 19 files changed, 675 insertions(+), 88 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 3b2ec46b178..eab28820c41 100644 --- a/code/__DEFINES/fonts.dm +++ b/code/__DEFINES/fonts.dm @@ -14,3 +14,11 @@ /// Emoji icon set #define EMOJI_SET 'modular_skyrat/master_files/icons/emoji.dmi' // SKYRAT EDIT - ORIGINAL: '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 df891b4c5a8..33314003a51 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 28c80966a99..5772593f4cd 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -2064,7 +2064,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 = "" @@ -2131,15 +2131,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 ef865fb1958..81aba0a347e 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 -7 // SKYRAT EDIT CHANGE - AESTHETICS - originally -8 -#define LINE2_Y -14 // SKYRAT EDIT CHANGE - AESTHETICS - originally -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 @@ -178,7 +190,7 @@ if(message1 == "" && message2 == "") return - . += emissive_appearance(icon, "outline", src, alpha = src.alpha) + . += emissive_appearance('modular_skyrat/modules/aesthetics/status_display/icons/status_display.dmi', "outline", src, alpha = src.alpha) // SKYRAT EDIT CHANGE - AESTHETICS // Timed process - performs nothing in the base class /obj/machinery/status_display/process() @@ -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 f0e5881b0bd..5a465bd12e9 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 "title_browser" type = BROWSER pos = 0,0 @@ -128,6 +128,7 @@ window "mapwindow" is-disabled = true saved-params = "" auto-format = false + 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 f940c1db90f..cebcfea112c 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 @@ -5430,10 +5431,13 @@ #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" #include "modular_skyrat\master_files\code\_globalvars\configuration.dm" #include "modular_skyrat\master_files\code\_globalvars\religion.dm"