Mercurial > otakunoraifu
diff scn2k/scn2k_textimpl.cc @ 56:c7bcc0ec2267
* replaced Grp and Text classes by the TextImpl and GrpImpl ones
* splitted scn2k.h into smaller header files
* moved some definitions from scn2k_*.cc to the header files
* moved opcode implementation to scn2k_*impl.cc
author | thib |
---|---|
date | Thu, 30 Apr 2009 19:05:09 +0000 |
parents | |
children | 6d9146f56ccf |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/scn2k/scn2k_textimpl.cc @@ -0,0 +1,198 @@ +/* + * Copyright (c) 2009 Thibaut GIRKA + * Copyright (c) 2004-2006 Kazunori "jagarl" Ueno + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "scn2k_text.h" + +void Text::impl_txtClear(Cmd& cmd) { + if (text != NULL) { + text->ResetFace(); + if (cmd.cmd2 == 3 && cmd.cmd3 == 151) + text->wid->Clear(); + } + cur_backlog_item.face = ""; + if (cmd.cmd2 == 3 && cmd.cmd3 == 151) + text_stream.Clear(); + hide(); +} + +void Text::impl_logKoe(Cmd& cmd) { + // PlayKoe ; 声出力コマンドをチェックする */ + cur_backlog_item.koe = cmd.args[0].value; +} + +void Text::impl_pause(Cmd& cmd) { + if (text != NULL) { + eprintf("start\n"); + text->StartText(text_stream); + if (skip_mode & SKIP_TEXT) text->wid->Flush(); + else if (kcursor) kcursor->show(); + status = WAIT_TEXT; + text_parsing = false; + } + backlog_item = cur_backlog_item; + if (cur_backlog_item.scn == 0 && cur_backlog_item.pos == -1) backlog_item.text = text_stream; + cur_backlog_item.Clear(); + + cmd.clear(); + cmd.cmd_type = CMD_WAITFRAMEUPDATE; // 画像描画に戻る(skip時にテキストが描画されやすくするため) +} + +void Text::impl_br(Cmd& cmd) { + text_stream.AddReturn(); + cur_backlog_item.DeleteTextPos(); + cmd.clear(); +} + +void Text::impl_FaceOpen(Cmd& cmd) { + if (text == NULL) + show(); + string s = cmd.Str(cmd.args[0]); + s += ".g00"; + if (text != NULL) + text->ShowFace(s.c_str()); + cur_backlog_item.face = s; + cmd.cmd_type = CMD_SAVECMD_ONCE; +} + +void Text::impl_FaceClear(Cmd& cmd) { + if (text == NULL) + show(); + if (text) + text->ResetFace(); + cur_backlog_item.face = ""; + cmd.cmd_type = CMD_SAVECMD_ONCE; +} + +void Text::impl_doRuby(Cmd& cmd) { + if (text == NULL) { + show(); + } + if (cmd.cmd4 == 1) { + ruby_text_flag = true; + eprintf("SetRubyText."); + cmd.clear(); + } else if (cmd.cmd4 == 0) { + if (ruby_text.length() == 0) { // ルビを振るテキストがない + eprintf("Cannot find ruby text.\n"); + return; + } + if (cmd.args.size() != 1) return; + char debug1[1024], debug2[1024]; + kconv( (unsigned char*)ruby_text.c_str(), (unsigned char*)debug1); + kconv( (unsigned char*)cmd.Str(cmd.args[0]), (unsigned char*)debug2); + eprintf("SetRuby. %s, %s",debug1, debug2); + text_stream.AddRuby(ruby_text.c_str(), cmd.Str(cmd.args[0])); + cur_backlog_item.DeleteTextPos(); + cmd.clear(); + } +} + +void Text::impl_TextWindow(Cmd& cmd) { + if (cmd.cmd4 == 0) { + eprintf("set text window <- %d\n",cmd.args[0].value); + if (text != NULL) show(cmd.args[0].value); + else text_window_number = cmd.args[0].value; + } else if (cmd.cmd4 == 1) { // default value + eprintf("set text window <- default\n"); + if (text != NULL) show(0); + else text_window_number = 0; + } + cmd.clear(); +} + +void Text::impl_FastText(Cmd& cmd) { + //I think it's broken. For now, it's disabled. + if (cmd.cmd3 == 103) { + // テキストウィンドウ表示? + show(); +// 表示の際はテキストをクリアしない? +// if (text) text->wid->Clear(); +// text_stream.Clear(); + cmd.clear(); + } + else if (cmd.cmd3 == 104) { // テキスト表示? + // 全テキスト表示 + if (text != NULL) { + text->StartText(text_stream); + text->wid->Flush(); + } + cmd.clear(); + } +} + +void Text::impl_msgClear(Cmd& cmd) { + show(); + if (text != NULL) text->wid->Clear(); + text_stream.Clear(); + cmd.clear(); +} + +void Text::impl_createSelect(Cmd& cmd) { + if (cmd.cmd4 == 0) { + // 選択肢 + CreateSelect(cmd); + //FIXME: Check if it's really clean + if (text_parsing) { + show(); + text->StartText(text_stream); + if (skip_mode & SKIP_TEXT) text->wid->Flush(); + else if (kcursor) kcursor->hide(); + text_parsing = false; + text_stream.Clear(); + } + cmd.cmd_type = CMD_ROLLBACKPOINT; /* 選択肢はセーブ位置 / シナリオ巻き戻し位置 */ + // cmd.clear(); + } + else + PrintCmd(cmd); //FIXME +} + +void Text::impl_ShowBackground(Cmd& cmd) { + status_mask = Status(CLEARSCR_MASK | status_mask); + cmd.clear(); +} + +void Text::impl_SetSkipMode(Cmd& cmd) { + status_mask = Status(SKIPMASK | status_mask); + cmd.clear(); +} + +void Text::impl_Wait(Cmd& cmd) { + eprintf("wait %dmsec\n",cmd.args[0].value); + if (cmd.cmd3 == 100 && text != NULL) { + /* 0x64 だと文字描画中の待ちに使うことがある */ + text->StartText(text_stream); + text->wid->Flush(); + } + if (cmd.cmd3 == 111 || cmd.cmd3 == 121) + wait_time = base_time + cmd.args[0].value; //FIXME: second argument, counter + else + wait_time = old_time + cmd.args[0].value; + status = WAIT; + cmd.cmd_type = CMD_WAITFRAMEUPDATE; // 画像描画に戻る(skip時にテキストが描画されやすくするため) +}