mirror of
https://github.com/kichikuou/system3-sdl2.git
synced 2026-10-08 22:59:54 +03:00
418 lines
11 KiB
C++
418 lines
11 KiB
C++
/*
|
||
ALICE SOFT SYSTEM 3 for Win32
|
||
|
||
[ NACT - text ]
|
||
*/
|
||
|
||
#include <string>
|
||
#include "nact.h"
|
||
#include "ags.h"
|
||
#include "encoding.h"
|
||
#include "texthook.h"
|
||
|
||
namespace {
|
||
|
||
int convert_to_zenkaku(int code)
|
||
{
|
||
switch(code) {
|
||
case u' ': return u' ';
|
||
case u'!': return u'!';
|
||
case u'"': return u'”';
|
||
case u'#': return u'#';
|
||
case u'$': return u'$';
|
||
case u'%': return u'%';
|
||
case u'&': return u'&';
|
||
case u'\'': return u'’';
|
||
case u'(': return u'(';
|
||
case u')': return u')';
|
||
case u'*': return u'*';
|
||
case u'+': return u'+';
|
||
case u',': return u',';
|
||
case u'-': return u'-';
|
||
case u'.': return u'.';
|
||
case u'/': return u'/';
|
||
case u'0': return u'0';
|
||
case u'1': return u'1';
|
||
case u'2': return u'2';
|
||
case u'3': return u'3';
|
||
case u'4': return u'4';
|
||
case u'5': return u'5';
|
||
case u'6': return u'6';
|
||
case u'7': return u'7';
|
||
case u'8': return u'8';
|
||
case u'9': return u'9';
|
||
case u':': return u':';
|
||
case u';': return u';';
|
||
case u'<': return u'<';
|
||
case u'=': return u'=';
|
||
case u'>': return u'>';
|
||
case u'?': return u'?';
|
||
case u'@': return u'@';
|
||
case u'A': return u'A';
|
||
case u'B': return u'B';
|
||
case u'C': return u'C';
|
||
case u'D': return u'D';
|
||
case u'E': return u'E';
|
||
case u'F': return u'F';
|
||
case u'G': return u'G';
|
||
case u'H': return u'H';
|
||
case u'I': return u'I';
|
||
case u'J': return u'J';
|
||
case u'K': return u'K';
|
||
case u'L': return u'L';
|
||
case u'M': return u'M';
|
||
case u'N': return u'N';
|
||
case u'O': return u'O';
|
||
case u'P': return u'P';
|
||
case u'Q': return u'Q';
|
||
case u'R': return u'R';
|
||
case u'S': return u'S';
|
||
case u'T': return u'T';
|
||
case u'U': return u'U';
|
||
case u'V': return u'V';
|
||
case u'W': return u'W';
|
||
case u'X': return u'X';
|
||
case u'Y': return u'Y';
|
||
case u'Z': return u'Z';
|
||
case u'[': return u'[';
|
||
case u'\\': return u'¥';
|
||
case u']': return u']';
|
||
case u'^': return u'^';
|
||
case u'_': return u'_';
|
||
case u'`': return u'‘';
|
||
case u'a': return u'a';
|
||
case u'b': return u'b';
|
||
case u'c': return u'c';
|
||
case u'd': return u'd';
|
||
case u'e': return u'e';
|
||
case u'f': return u'f';
|
||
case u'g': return u'g';
|
||
case u'h': return u'h';
|
||
case u'i': return u'i';
|
||
case u'j': return u'j';
|
||
case u'k': return u'k';
|
||
case u'l': return u'l';
|
||
case u'm': return u'm';
|
||
case u'n': return u'n';
|
||
case u'o': return u'o';
|
||
case u'p': return u'p';
|
||
case u'q': return u'q';
|
||
case u'r': return u'r';
|
||
case u's': return u's';
|
||
case u't': return u't';
|
||
case u'u': return u'u';
|
||
case u'v': return u'v';
|
||
case u'w': return u'w';
|
||
case u'x': return u'x';
|
||
case u'y': return u'y';
|
||
case u'z': return u'z';
|
||
case u'{': return u'{';
|
||
case u'|': return u'|';
|
||
case u'}': return u'}';
|
||
case u'~': return u'~';
|
||
case u'。': return u'。';
|
||
case u'「': return u'「';
|
||
case u'」': return u'」';
|
||
case u'、': return u'、';
|
||
case u'・': return u'・';
|
||
case u'ヲ': return u'を';
|
||
case u'ァ': return u'ぁ';
|
||
case u'ィ': return u'ぃ';
|
||
case u'ゥ': return u'ぅ';
|
||
case u'ェ': return u'ぇ';
|
||
case u'ォ': return u'ぉ';
|
||
case u'ャ': return u'ゃ';
|
||
case u'ュ': return u'ゅ';
|
||
case u'ョ': return u'ょ';
|
||
case u'ッ': return u'っ';
|
||
case u'ー': return u'ー';
|
||
case u'ア': return u'あ';
|
||
case u'イ': return u'い';
|
||
case u'ウ': return u'う';
|
||
case u'エ': return u'え';
|
||
case u'オ': return u'お';
|
||
case u'カ': return u'か';
|
||
case u'キ': return u'き';
|
||
case u'ク': return u'く';
|
||
case u'ケ': return u'け';
|
||
case u'コ': return u'こ';
|
||
case u'サ': return u'さ';
|
||
case u'シ': return u'し';
|
||
case u'ス': return u'す';
|
||
case u'セ': return u'せ';
|
||
case u'ソ': return u'そ';
|
||
case u'タ': return u'た';
|
||
case u'チ': return u'ち';
|
||
case u'ツ': return u'つ';
|
||
case u'テ': return u'て';
|
||
case u'ト': return u'と';
|
||
case u'ナ': return u'な';
|
||
case u'ニ': return u'に';
|
||
case u'ヌ': return u'ぬ';
|
||
case u'ネ': return u'ね';
|
||
case u'ノ': return u'の';
|
||
case u'ハ': return u'は';
|
||
case u'ヒ': return u'ひ';
|
||
case u'フ': return u'ふ';
|
||
case u'ヘ': return u'へ';
|
||
case u'ホ': return u'ほ';
|
||
case u'マ': return u'ま';
|
||
case u'ミ': return u'み';
|
||
case u'ム': return u'む';
|
||
case u'メ': return u'め';
|
||
case u'モ': return u'も';
|
||
case u'ヤ': return u'や';
|
||
case u'ユ': return u'ゆ';
|
||
case u'ヨ': return u'よ';
|
||
case u'ラ': return u'ら';
|
||
case u'リ': return u'り';
|
||
case u'ル': return u'る';
|
||
case u'レ': return u'れ';
|
||
case u'ロ': return u'ろ';
|
||
case u'ワ': return u'わ';
|
||
case u'ン': return u'ん';
|
||
case u'゙': return u'゛';
|
||
case u'゚': return u'゜';
|
||
}
|
||
return code;
|
||
}
|
||
|
||
int convert_to_hankaku(int code)
|
||
{
|
||
switch(code) {
|
||
case u' ': return u' ';
|
||
case u'!': return u'!';
|
||
case u'”': return u'"';
|
||
case u'#': return u'#';
|
||
case u'$': return u'$';
|
||
case u'%': return u'%';
|
||
case u'&': return u'&';
|
||
case u'’': return u'\'';
|
||
case u'(': return u'(';
|
||
case u')': return u')';
|
||
case u'*': return u'*';
|
||
case u'+': return u'+';
|
||
case u',': return u',';
|
||
case u'-': return u'-';
|
||
case u'.': return u'.';
|
||
case u'/': return u'/';
|
||
case u'0': return u'0';
|
||
case u'1': return u'1';
|
||
case u'2': return u'2';
|
||
case u'3': return u'3';
|
||
case u'4': return u'4';
|
||
case u'5': return u'5';
|
||
case u'6': return u'6';
|
||
case u'7': return u'7';
|
||
case u'8': return u'8';
|
||
case u'9': return u'9';
|
||
case u':': return u':';
|
||
case u';': return u';';
|
||
case u'<': return u'<';
|
||
case u'=': return u'=';
|
||
case u'>': return u'>';
|
||
case u'?': return u'?';
|
||
case u'@': return u'@';
|
||
case u'A': return u'A';
|
||
case u'B': return u'B';
|
||
case u'C': return u'C';
|
||
case u'D': return u'D';
|
||
case u'E': return u'E';
|
||
case u'F': return u'F';
|
||
case u'G': return u'G';
|
||
case u'H': return u'H';
|
||
case u'I': return u'I';
|
||
case u'J': return u'J';
|
||
case u'K': return u'K';
|
||
case u'L': return u'L';
|
||
case u'M': return u'M';
|
||
case u'N': return u'N';
|
||
case u'O': return u'O';
|
||
case u'P': return u'P';
|
||
case u'Q': return u'Q';
|
||
case u'R': return u'R';
|
||
case u'S': return u'S';
|
||
case u'T': return u'T';
|
||
case u'U': return u'U';
|
||
case u'V': return u'V';
|
||
case u'W': return u'W';
|
||
case u'X': return u'X';
|
||
case u'Y': return u'Y';
|
||
case u'Z': return u'Z';
|
||
case u'[': return u'[';
|
||
case u'¥': return u'\\';
|
||
case u']': return u']';
|
||
case u'^': return u'^';
|
||
case u'_': return u'_';
|
||
case u'‘': return u'`';
|
||
case u'a': return u'a';
|
||
case u'b': return u'b';
|
||
case u'c': return u'c';
|
||
case u'd': return u'd';
|
||
case u'e': return u'e';
|
||
case u'f': return u'f';
|
||
case u'g': return u'g';
|
||
case u'h': return u'h';
|
||
case u'i': return u'i';
|
||
case u'j': return u'j';
|
||
case u'k': return u'k';
|
||
case u'l': return u'l';
|
||
case u'm': return u'm';
|
||
case u'n': return u'n';
|
||
case u'o': return u'o';
|
||
case u'p': return u'p';
|
||
case u'q': return u'q';
|
||
case u'r': return u'r';
|
||
case u's': return u's';
|
||
case u't': return u't';
|
||
case u'u': return u'u';
|
||
case u'v': return u'v';
|
||
case u'w': return u'w';
|
||
case u'x': return u'x';
|
||
case u'y': return u'y';
|
||
case u'z': return u'z';
|
||
case u'{': return u'{';
|
||
case u'|': return u'|';
|
||
case u'}': return u'}';
|
||
case u'~': return u'~';
|
||
case u'。': return u'。';
|
||
case u'「': return u'「';
|
||
case u'」': return u'」';
|
||
case u'、': return u'、';
|
||
case u'・': return u'・';
|
||
case u'ヲ': return u'を';
|
||
case u'ァ': return u'ぁ';
|
||
case u'ィ': return u'ぃ';
|
||
case u'ゥ': return u'ぅ';
|
||
case u'ェ': return u'ぇ';
|
||
case u'ォ': return u'ぉ';
|
||
case u'ャ': return u'ゃ';
|
||
case u'ュ': return u'ゅ';
|
||
case u'ョ': return u'ょ';
|
||
case u'ッ': return u'っ';
|
||
case u'ー': return u'ー';
|
||
case u'ア': return u'あ';
|
||
case u'イ': return u'い';
|
||
case u'ウ': return u'う';
|
||
case u'エ': return u'え';
|
||
case u'オ': return u'お';
|
||
case u'カ': return u'か';
|
||
case u'キ': return u'き';
|
||
case u'ク': return u'く';
|
||
case u'ケ': return u'け';
|
||
case u'コ': return u'こ';
|
||
case u'サ': return u'さ';
|
||
case u'シ': return u'し';
|
||
case u'ス': return u'す';
|
||
case u'セ': return u'せ';
|
||
case u'ソ': return u'そ';
|
||
case u'タ': return u'た';
|
||
case u'チ': return u'ち';
|
||
case u'ツ': return u'つ';
|
||
case u'テ': return u'て';
|
||
case u'ト': return u'と';
|
||
case u'ナ': return u'な';
|
||
case u'ニ': return u'に';
|
||
case u'ヌ': return u'ぬ';
|
||
case u'ネ': return u'ね';
|
||
case u'ノ': return u'の';
|
||
case u'ハ': return u'は';
|
||
case u'ヒ': return u'ひ';
|
||
case u'フ': return u'ふ';
|
||
case u'ヘ': return u'へ';
|
||
case u'ホ': return u'ほ';
|
||
case u'マ': return u'ま';
|
||
case u'ミ': return u'み';
|
||
case u'ム': return u'む';
|
||
case u'メ': return u'め';
|
||
case u'モ': return u'も';
|
||
case u'ヤ': return u'や';
|
||
case u'ユ': return u'ゆ';
|
||
case u'ヨ': return u'よ';
|
||
case u'ラ': return u'ら';
|
||
case u'リ': return u'り';
|
||
case u'ル': return u'る';
|
||
case u'レ': return u'れ';
|
||
case u'ロ': return u'ろ';
|
||
case u'ワ': return u'わ';
|
||
case u'ン': return u'ん';
|
||
case u'゙': return u'゛';
|
||
case u'゚': return u'゜';
|
||
}
|
||
return code;
|
||
}
|
||
|
||
} // namespace
|
||
|
||
void NACT::init_text()
|
||
{
|
||
text.reset_pos(text_w[0].sx, text_w[0].sy + 2);
|
||
text.line_space = 2;
|
||
text.font_size = 16;
|
||
if (game_id.sys_ver == 1) {
|
||
text.font_color = 15 + 16;
|
||
text.frame_color = 15 + 16;
|
||
text.back_color = 0 + 16;
|
||
} else {
|
||
text.font_color = 15;
|
||
text.frame_color = 15;
|
||
text.back_color = 0;
|
||
}
|
||
|
||
menu.reset_pos(2, 2);
|
||
menu.line_space = 4;
|
||
menu.font_size = 16;
|
||
if (game_id.sys_ver == 1) {
|
||
menu.font_color = 15 + 16;
|
||
menu.frame_color = 15 + 16;
|
||
menu.back_color = 0 + 16;
|
||
} else {
|
||
menu.font_color = 15;
|
||
menu.frame_color = 15;
|
||
menu.back_color = 0;
|
||
}
|
||
}
|
||
|
||
void NACT::draw_text(std::string_view string, bool wait)
|
||
{
|
||
if (string.empty())
|
||
return;
|
||
|
||
TextContext& ctx = draw_menu ? menu : text;
|
||
int screen = draw_menu ? 2 : ags->dest_screen;
|
||
if (ctx.current_line_height < ctx.font_size)
|
||
ctx.current_line_height = ctx.font_size;
|
||
|
||
std::u16string codes;
|
||
while (!string.empty()) {
|
||
int code = encoding->next_codepoint(string);
|
||
if (draw_hankaku) {
|
||
code = convert_to_hankaku(code);
|
||
} else {
|
||
code = convert_to_zenkaku(code);
|
||
}
|
||
if (!draw_menu && !(GAIJI_FIRST <= code && code <= GAIJI_LAST))
|
||
texthook_character(sco.page(), code);
|
||
codes.push_back(code);
|
||
}
|
||
|
||
if (draw_menu || !wait) {
|
||
ctx.pos.x = ags->draw_text(screen, ctx.pos.x, ctx.pos.y, codes, ctx.font_size, ctx.font_color);
|
||
return;
|
||
}
|
||
|
||
// Typewriter effect.
|
||
std::u16string_view rest(codes);
|
||
for (;;) {
|
||
size_t next_nonspace = rest.find_first_not_of(u' ');
|
||
if (next_nonspace == std::u16string_view::npos)
|
||
break;
|
||
ctx.pos.x = ags->draw_text(screen, ctx.pos.x, ctx.pos.y, rest.substr(0, next_nonspace + 1),
|
||
ctx.font_size, ctx.font_color);
|
||
rest.remove_prefix(next_nonspace + 1);
|
||
text_wait();
|
||
}
|
||
if (!rest.empty())
|
||
ctx.pos.x = ags->draw_text(screen, ctx.pos.x, ctx.pos.y, rest, ctx.font_size, ctx.font_color);
|
||
}
|