Files
kichikuou_system3-sdl2/src/sys/nact_text.cpp
T
2026-09-02 12:28:14 +09:00

418 lines
11 KiB
C++
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
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);
}