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 = ""
+ var/complete_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 6833e9ff244..76d20addff7 100644
Binary files a/icons/obj/status_display.dmi and b/icons/obj/status_display.dmi differ
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 00000000000..cf6fdf44e2e
Binary files /dev/null and b/interface/fonts/Grand9K_Pixel.ttf differ
diff --git a/interface/fonts/TinyUnicode.ttf b/interface/fonts/TinyUnicode.ttf
new file mode 100644
index 00000000000..74d0d3e386e
Binary files /dev/null and b/interface/fonts/TinyUnicode.ttf differ
diff --git a/interface/VCR_OSD_Mono.ttf b/interface/fonts/VCR_OSD_Mono.ttf
similarity index 100%
rename from interface/VCR_OSD_Mono.ttf
rename to interface/fonts/VCR_OSD_Mono.ttf
diff --git a/interface/fonts/fonts_datum.dm b/interface/fonts/fonts_datum.dm
new file mode 100644
index 00000000000..a346706d7fa
--- /dev/null
+++ b/interface/fonts/fonts_datum.dm
@@ -0,0 +1,78 @@
+/// 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
+
+ /// Font features and metrics
+ /// Generated by 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
+
+ /// list of font size/spacing metrics
+ var/list/metrics
+ /// total height of a line
+ var/height
+ /// distance above baseline (including whitespace)
+ var/ascent
+ /// distance below baseline
+ var/descent
+ /// average character width
+ var/average_width
+ /// maximum character width
+ var/max_width
+ /// extra width, such as from italics, for a line
+ var/overhang
+ /// internal leading vertical space, for accent marks
+ var/in_leading
+ /// external leading vertical space, just plain blank
+ var/ex_leading
+ /// default character (for undefined chars)
+ var/default_character
+ /// first character in metrics
+ var/start
+ /// last character in metrics
+ var/end
+
+/// Get font metrics
+/// From Lummox's dmifontsplus (https://www.byond.com/developer/LummoxJR/DmiFontsPlus)
+/datum/font/proc/get_metrics(text, flags, first_line)
+ . = 0
+ var/longest = 0
+ if(!length(text))
+ return
+
+ var/i = 1
+ var/idx
+ while(i <= length(text))
+ var/character = text2ascii(text, i++)
+ if(character <= 10)
+ if(character <= 7)
+ . += character // spacers for justification
+
+ if(character <= 9)
+ continue // soft-break chars
+
+ if(. && idx && !(flags & INCLUDE_AC))
+ . -= max(metrics[idx + 3], 0)
+
+ longest = max(longest, . + first_line)
+ . = 0
+ first_line = 0
+ idx = 0
+ continue
+
+ idx = (character - start) * 3
+ if(idx <= 0 || idx >= 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