Skip to content

Commit

Permalink
GLK: FROTZ: Use the Noto runic font for runes
Browse files Browse the repository at this point in the history
We already bundle other Noto fonts in the font.dat file, so using
further Noto fonts makes sense to me. Also, map upper-case letters
to lower-case runes since there are versions of Beyond Zork that
uses that. (The version I played many years ago did, and it looked
very strange. The version I tested with now did not, probably for
that very reason. So that part is untested for now.)
  • Loading branch information
Torbjörn Andersson authored and dreammaster committed Dec 18, 2018
1 parent a163fee commit 77f2330
Show file tree
Hide file tree
Showing 6 changed files with 30 additions and 18 deletions.
Binary file modified dists/engine-data/fonts.dat
Binary file not shown.
2 changes: 2 additions & 0 deletions engines/glk/conf.cpp
Expand Up @@ -45,6 +45,7 @@ WindowStyle T_STYLES[style_NUMSTYLES] = {
{ PROPB, { 0xff, 0xff, 0xff }, { 0x00, 0x60, 0x00 }, 0 }, ///< Input
{ MONOR, { 0xff, 0xff, 0xff }, { 0x00, 0x00, 0x00 }, 0 }, ///< User1
{ MONOR, { 0xff, 0xff, 0xff }, { 0x00, 0x00, 0x00 }, 0 }, ///< User2
{ RUNIC, { 0xff, 0xff, 0xff }, { 0x00, 0x00, 0x00 }, 0 }, ///< User3
};

WindowStyle G_STYLES[style_NUMSTYLES] = {
Expand All @@ -59,6 +60,7 @@ WindowStyle G_STYLES[style_NUMSTYLES] = {
{ MONOR, { 0xff, 0xff, 0xff }, { 0x60, 0x60, 0x60 }, 0 }, ///< Input
{ MONOR, { 0xff, 0xff, 0xff }, { 0x60, 0x60, 0x60 }, 0 }, ///< User1
{ MONOR, { 0xff, 0xff, 0xff }, { 0x60, 0x60, 0x60 }, 0 }, ///< User2
{ MONOR, { 0xff, 0xff, 0xff }, { 0x60, 0x60, 0x60 }, 0 }, ///< User3
};

Conf *g_conf;
Expand Down
30 changes: 18 additions & 12 deletions engines/glk/frotz/processor_screen.cpp
Expand Up @@ -46,13 +46,6 @@ void Processor::screen_mssg_off() {
static const uint32 zchar_runes[] = {
// This mapping is based on the Amiga font in the Z-Machine
// specification, with some liberties taken.
//
// There are only runic characters for a-z. As I recall it, there was
// at least one scene in Beyond Zork where it would use the runic font
// to display text which contained upper case letters (if your
// intelligence was too low to understand it), which came out as a
// mixture of runes and map-drawing characters. Maybe that can be
// fixed later?

0x16AA, // RUNIC LETTER AC A
0x16D2, // RUNIC LETTER BERKANAN BEORC BJARKAN B
Expand Down Expand Up @@ -83,7 +76,23 @@ static const uint32 zchar_runes[] = {
};

uint32 Processor::zchar_to_unicode_rune(zchar c) {
return (c >= 'a' && c <= 'z') ? zchar_runes[c - 'a'] : 0;
// There are only runic characters for a-z. Some versions of Beyond
// Zork will render the conversation between Prince Foo and the black
// rider in runic script, even though it contained upper case letters.
// This produced an ugly mix of runes and map-drawing characters, etc.
// which is probably why it was removed in later versions.
//
// Apart from the runes, I believe the up/down arrows are the only
// special characters to be printed in the lower window. Maybe they,
// too, should be mapped to Unicode characters, but since they are
// mapped to \ and ] respectively that probably menas we can convert
// upper case to lower case and use the appropriate rune for that.
if (c >= 'a' && c <= 'z')
return zchar_runes[c - 'a'];
else if (c >= 'A' && c <= 'Z')
return zchar_runes[c - 'A'];
else
return 0;
}

void Processor::screen_char(zchar c) {
Expand Down Expand Up @@ -149,10 +158,7 @@ void Processor::screen_char(zchar c) {
if (curr_font == GRAPHICS_FONT) {
uint32 runic_char = zchar_to_unicode_rune(c);
if (runic_char != 0) {
// FIXME: This will only work if we have a font which
// supports the Unicode Runic block. We currently don't.
// Perhaps Junicode is a good candidate for this?
glk_set_style(style_Normal);
glk_set_style(style_User3);
glk_put_char_uni(runic_char);
glk_set_style(style_User1);
} else
Expand Down
3 changes: 2 additions & 1 deletion engines/glk/glk_types.h
Expand Up @@ -137,7 +137,8 @@ enum Style {
style_Input = 8,
style_User1 = 9,
style_User2 = 10,
style_NUMSTYLES = 11
style_User3 = 11,
style_NUMSTYLES = 12
};

enum WinType {
Expand Down
9 changes: 6 additions & 3 deletions engines/glk/screen.cpp
Expand Up @@ -116,7 +116,7 @@ bool Screen::loadFonts() {
f.read(buffer, 3);
buffer[3] = '\0';

if (Common::String(buffer) != "1.0") {
if (Common::String(buffer) != "1.1") {
delete archive;
return false;
}
Expand Down Expand Up @@ -144,14 +144,17 @@ void Screen::loadFonts(Common::Archive *archive) {
_fonts[5] = loadFont(PROPB, archive, propSize, propAspect, FONTB);
_fonts[6] = loadFont(PROPI, archive, propSize, propAspect, FONTI);
_fonts[7] = loadFont(PROPZ, archive, propSize, propAspect, FONTZ);

_fonts[8] = loadFont(RUNIC, archive, propSize, propAspect, RUNIC);
}

const Graphics::Font *Screen::loadFont(FACES face, Common::Archive *archive, double size, double aspect, int
style) {
Common::File f;
const char *const FILENAMES[8] = {
const char *const FILENAMES[9] = {
"GoMono-Regular.ttf", "GoMono-Bold.ttf", "GoMono-Italic.ttf", "GoMono-Bold-Italic.ttf",
"NotoSerif-Regular.ttf", "NotoSerif-Bold.ttf", "NotoSerif-Italic.ttf", "NotoSerif-Bold-Italic.ttf"
"NotoSerif-Regular.ttf", "NotoSerif-Bold.ttf", "NotoSerif-Italic.ttf", "NotoSerif-Bold-Italic.ttf",
"NotoSansRunic-Regular.ttf"
};

if (!f.open(FILENAMES[face], *archive))
Expand Down
4 changes: 2 additions & 2 deletions engines/glk/screen.h
Expand Up @@ -31,13 +31,13 @@

namespace Glk {

#define FONTS_TOTAL 8
#define FONTS_TOTAL 9

enum CaretShape {
SMALL_DOT = 0, FAT_DOT = 1, THIN_LINE = 2, FAT_LINE = 3, BLOCK = 4
};

enum FACES { MONOR, MONOB, MONOI, MONOZ, PROPR, PROPB, PROPI, PROPZ, CUSTOM };
enum FACES { MONOR, MONOB, MONOI, MONOZ, PROPR, PROPB, PROPI, PROPZ, RUNIC, CUSTOM };
enum TYPES { MONOF, PROPF };
enum STYLES { FONTR, FONTB, FONTI, FONTZ };

Expand Down

0 comments on commit 77f2330

Please sign in to comment.