/* ALICE SOFT SYSTEM 3 for Win32 [ NACT - text ] */ #include #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); }