void ONScripterLabel::restoreTextBuffer() { text_info.fill( 0, 0, 0, 0 ); char out_text[3] = { '\0','\0','\0' }; FontInfo f_info = sentence_font; f_info.clear(); for ( int i=0 ; i<current_page->text_count ; i++ ){ if ( current_page->text[i] == 0x0a ){ f_info.newLine(); } else{ out_text[0] = current_page->text[i]; #ifndef FORCE_1BYTE_CHAR if (out_text[0] == '('){ startRuby(current_page->text + i + 1, f_info); continue; } else if (out_text[0] == '/' && ruby_struct.stage == RubyStruct::BODY ){ f_info.addLineOffset(ruby_struct.margin); i = ruby_struct.ruby_end - current_page->text - 1; if (*ruby_struct.ruby_end == ')'){ endRuby(false, false, NULL, &text_info); i++; } continue; } else if (out_text[0] == ')' && ruby_struct.stage == RubyStruct::BODY ){ ruby_struct.stage = RubyStruct::NONE; continue; } #endif if ( IS_TWO_BYTE(out_text[0]) ){ out_text[1] = current_page->text[i+1]; if (IS_KINSOKU( current_page->text+i+2 )){ int i = 2; while (!f_info.isEndOfLine(i) && IS_KINSOKU( current_page->text+i+2 )){ i += 2; } if (f_info.isEndOfLine(i)) f_info.newLine(); } } else{ out_text[1] = '\0'; drawChar( out_text, &f_info, false, false, NULL, &text_info ); if (i+1 == current_page->text_count) break; out_text[0] = current_page->text[i+1]; if (out_text[0] == 0x0a) continue; } i++; drawChar( out_text, &f_info, false, false, NULL, &text_info ); } } }
bool ONScripter::processText() { //printf("textCommand %c %d %d %d\n", script_h.getStringBuffer()[ string_buffer_offset ], string_buffer_offset, event_mode, line_enter_status); char out_text[3]= {'\0', '\0', '\0'}; //printf("*** textCommand %d (%d,%d)\n", string_buffer_offset, sentence_font.xy[0], sentence_font.xy[1]); while( (!(script_h.getEndStatus() & ScriptHandler::END_1BYTE_CHAR) && script_h.getStringBuffer()[ string_buffer_offset ] == ' ') || script_h.getStringBuffer()[ string_buffer_offset ] == '\t' ) string_buffer_offset ++; if (script_h.getStringBuffer()[string_buffer_offset] == 0x00){ processEOT(); return false; } new_line_skip_flag = false; char ch = script_h.getStringBuffer()[string_buffer_offset]; if ( IS_TWO_BYTE(ch) ){ // Shift jis /* ---------------------------------------- */ /* Kinsoku process */ if ( checkLineBreak( script_h.getStringBuffer() + string_buffer_offset, &sentence_font ) ){ sentence_font.newLine(); current_page->add(0x0a); for (int i=0 ; i<indent_offset ; i++){ current_page->add(0x81); current_page->add(0x40); sentence_font.advanceCharInHankaku(2); } } out_text[0] = script_h.getStringBuffer()[string_buffer_offset]; out_text[1] = script_h.getStringBuffer()[string_buffer_offset+1]; if (script_h.checkClickstr(&script_h.getStringBuffer()[string_buffer_offset]) > 0){ if (sentence_font.getRemainingLine() <= clickstr_line) return clickNewPage( out_text ); else return clickWait( out_text ); } else{ clickstr_state = CLICK_NONE; } if ( skip_mode || ctrl_pressed_status ){ drawChar( out_text, &sentence_font, false, true, accumulation_surface, &text_info ); } else{ drawChar( out_text, &sentence_font, true, true, accumulation_surface, &text_info ); event_mode = WAIT_TIMER_MODE | WAIT_INPUT_MODE; if ( sentence_font.wait_time == -1 ) waitEvent( default_text_speed[text_speed_no] ); else waitEvent( sentence_font.wait_time ); } num_chars_in_sentence++; string_buffer_offset += 2; return true; } else if ( ch == '@' ){ // wait for click return clickWait( NULL ); } else if ( ch == '\\' ){ // new page return clickNewPage( NULL ); } else if ( ch == '_' ){ // Ignore an immediate click wait string_buffer_offset++; int matched_len = script_h.checkClickstr(script_h.getStringBuffer() + string_buffer_offset, true); if (matched_len > 0){ out_text[0] = script_h.getStringBuffer()[string_buffer_offset]; if (out_text[0] != '@' && out_text[0] != '\\'){ if (matched_len == 2) out_text[1] = script_h.getStringBuffer()[string_buffer_offset+1]; bool flush_flag = true; if ( skip_mode || ctrl_pressed_status ) flush_flag = false; drawChar( out_text, &sentence_font, flush_flag, true, accumulation_surface, &text_info ); } string_buffer_offset += matched_len; } return true; } else if ( ch == '!' && !(script_h.getEndStatus() & ScriptHandler::END_1BYTE_CHAR) ){ string_buffer_offset++; if ( script_h.getStringBuffer()[ string_buffer_offset ] == 's' ){ string_buffer_offset++; if ( script_h.getStringBuffer()[ string_buffer_offset ] == 'd' ){ sentence_font.wait_time = -1; string_buffer_offset++; } else{ int t = 0; while( script_h.getStringBuffer()[ string_buffer_offset ] >= '0' && script_h.getStringBuffer()[ string_buffer_offset ] <= '9' ){ t = t*10 + script_h.getStringBuffer()[ string_buffer_offset ] - '0'; string_buffer_offset++; } sentence_font.wait_time = t; while (script_h.getStringBuffer()[ string_buffer_offset ] == ' ' || script_h.getStringBuffer()[ string_buffer_offset ] == '\t') string_buffer_offset++; } } else if ( script_h.getStringBuffer()[ string_buffer_offset ] == 'w' || script_h.getStringBuffer()[ string_buffer_offset ] == 'd' ){ bool flag = false; if ( script_h.getStringBuffer()[ string_buffer_offset ] == 'd' ) flag = true; string_buffer_offset++; int t = 0; while( script_h.getStringBuffer()[ string_buffer_offset ] >= '0' && script_h.getStringBuffer()[ string_buffer_offset ] <= '9' ){ t = t*10 + script_h.getStringBuffer()[ string_buffer_offset ] - '0'; string_buffer_offset++; } while (script_h.getStringBuffer()[ string_buffer_offset ] == ' ' || script_h.getStringBuffer()[ string_buffer_offset ] == '\t') string_buffer_offset++; if (!skip_mode && !ctrl_pressed_status){ event_mode = WAIT_TIMER_MODE; if (flag) event_mode |= WAIT_INPUT_MODE; waitEvent(t); } } return true; } else if ( ch == '#' && !(script_h.getEndStatus() & ScriptHandler::END_1BYTE_CHAR) ){ readColor( &sentence_font.color, script_h.getStringBuffer() + string_buffer_offset ); readColor( &ruby_font.color, script_h.getStringBuffer() + string_buffer_offset ); string_buffer_offset += 7; return true; } else if ( ch == '(' && (!english_mode || !(script_h.getEndStatus() & ScriptHandler::END_1BYTE_CHAR)) ){ current_page->add('('); startRuby( script_h.getStringBuffer() + string_buffer_offset + 1, sentence_font ); string_buffer_offset++; return true; } else if ( ch == '/' && !(script_h.getEndStatus() & ScriptHandler::END_1BYTE_CHAR) ){ if ( ruby_struct.stage == RubyStruct::BODY ){ current_page->add('/'); sentence_font.addLineOffset(ruby_struct.margin); string_buffer_offset = ruby_struct.ruby_end - script_h.getStringBuffer(); if (*ruby_struct.ruby_end == ')'){ if ( skip_mode || ctrl_pressed_status ) endRuby(false, true, accumulation_surface, &text_info); else endRuby(true, true, accumulation_surface, &text_info); current_page->add(')'); string_buffer_offset++; } return true; } else{ // skip new line new_line_skip_flag = true; string_buffer_offset++; if (script_h.getStringBuffer()[string_buffer_offset] != 0x00) errorAndExit( "'new line' must follow '/'." ); return true; // skip the following eol } } else if ( ch == ')' && !(script_h.getEndStatus() & ScriptHandler::END_1BYTE_CHAR) && ruby_struct.stage == RubyStruct::BODY ){ current_page->add(')'); string_buffer_offset++; ruby_struct.stage = RubyStruct::NONE; return true; } else if ( ch == '<' && (!english_mode || !(script_h.getEndStatus() & ScriptHandler::END_1BYTE_CHAR)) ){ current_page->add('<'); string_buffer_offset++; int no = 0; while(script_h.getStringBuffer()[string_buffer_offset]>='0' && script_h.getStringBuffer()[string_buffer_offset]<='9'){ current_page->add(script_h.getStringBuffer()[string_buffer_offset]); no=no*10+script_h.getStringBuffer()[string_buffer_offset++]-'0'; } in_textbtn_flag = true; return true; } else if ( ch == '>' && in_textbtn_flag && (!english_mode || !(script_h.getEndStatus() & ScriptHandler::END_1BYTE_CHAR)) ){ current_page->add('>'); string_buffer_offset++; in_textbtn_flag = false; return true; } else{ out_text[0] = ch; int matched_len = script_h.checkClickstr(script_h.getStringBuffer() + string_buffer_offset); if (matched_len > 0){ if (matched_len == 2) out_text[1] = script_h.getStringBuffer()[ string_buffer_offset + 1 ]; if (sentence_font.getRemainingLine() <= clickstr_line) return clickNewPage( out_text ); else return clickWait( out_text ); } else if (script_h.getStringBuffer()[ string_buffer_offset + 1 ] && script_h.checkClickstr(&script_h.getStringBuffer()[string_buffer_offset+1]) == 1 && script_h.getEndStatus() & ScriptHandler::END_1BYTE_CHAR){ if ( script_h.getStringBuffer()[ string_buffer_offset + 2 ] && script_h.checkClickstr(&script_h.getStringBuffer()[string_buffer_offset+2]) > 0){ clickstr_state = CLICK_NONE; } else if (script_h.getStringBuffer()[ string_buffer_offset + 1 ] == '@'){ return clickWait( out_text ); } else if (script_h.getStringBuffer()[ string_buffer_offset + 1 ] == '\\'){ return clickNewPage( out_text ); } else{ out_text[1] = script_h.getStringBuffer()[ string_buffer_offset + 1 ]; if (sentence_font.getRemainingLine() <= clickstr_line) return clickNewPage( out_text ); else return clickWait( out_text ); } } else{ clickstr_state = CLICK_NONE; } bool flush_flag = true; if ( skip_mode || ctrl_pressed_status ) flush_flag = false; if ( script_h.getStringBuffer()[ string_buffer_offset + 1 ] && !(script_h.getEndStatus() & ScriptHandler::END_1BYTE_CHAR)){ out_text[1] = script_h.getStringBuffer()[ string_buffer_offset + 1 ]; drawChar( out_text, &sentence_font, flush_flag, true, accumulation_surface, &text_info ); num_chars_in_sentence++; } else if (script_h.getEndStatus() & ScriptHandler::END_1BYTE_CHAR){ drawChar( out_text, &sentence_font, flush_flag, true, accumulation_surface, &text_info ); num_chars_in_sentence++; } if (!skip_mode && !ctrl_pressed_status){ event_mode = WAIT_TIMER_MODE | WAIT_INPUT_MODE; if ( sentence_font.wait_time == -1 ) waitEvent( default_text_speed[text_speed_no] ); else waitEvent( sentence_font.wait_time ); } if ( script_h.getStringBuffer()[ string_buffer_offset + 1 ] && !(script_h.getEndStatus() & ScriptHandler::END_1BYTE_CHAR)) string_buffer_offset++; string_buffer_offset++; return true; } return false; }
void ONScripter::restoreTextBuffer(SDL_Surface *surface) { text_info.fill( 0, 0, 0, 0 ); char out_text[3] = { '\0','\0','\0' }; FontInfo f_info = sentence_font; f_info.clear(); for ( int i=0 ; i<current_page->text_count ; i++ ){ if ( current_page->text[i] == 0x0a ){ f_info.newLine(); } else{ out_text[0] = current_page->text[i]; #ifndef FORCE_1BYTE_CHAR if (out_text[0] == '('){ startRuby(current_page->text + i + 1, f_info); continue; } else if (out_text[0] == '/' && ruby_struct.stage == RubyStruct::BODY ){ f_info.addLineOffset(ruby_struct.margin); i = ruby_struct.ruby_end - current_page->text - 1; if (*ruby_struct.ruby_end == ')'){ endRuby(false, false, surface, &text_info); i++; } continue; } else if (out_text[0] == ')' && ruby_struct.stage == RubyStruct::BODY ){ ruby_struct.stage = RubyStruct::NONE; continue; } else if (out_text[0] == '<'){ int no = 0; while(current_page->text[i+1]>='0' && current_page->text[i+1]<='9') no=no*10+current_page->text[(i++)+1]-'0'; in_textbtn_flag = true; continue; } else if (out_text[0] == '>' && in_textbtn_flag){ in_textbtn_flag = false; continue; } #endif if (IS_TWO_BYTE(out_text[0])){ out_text[1] = current_page->text[i+1]; if ( checkLineBreak( current_page->text+i, &f_info ) ) f_info.newLine(); i++; } else{ out_text[1] = 0; if (i+1 != current_page->text_count && current_page->text[i+1] != 0x0a){ out_text[1] = current_page->text[i+1]; i++; } } drawChar( out_text, &f_info, false, false, surface, &text_info ); } } }
void ONScripter::drawString( const char *str, uchar3 color, FontInfo *info, bool flush_flag, SDL_Surface *surface, SDL_Rect *rect, AnimationInfo *cache_info ) { int i; int start_xy[2]; start_xy[0] = info->xy[0]; start_xy[1] = info->xy[1]; /* ---------------------------------------- */ /* Draw selected characters */ uchar3 org_color; for ( i=0 ; i<3 ; i++ ) org_color[i] = info->color[i]; for ( i=0 ; i<3 ; i++ ) info->color[i] = color[i]; bool skip_whitespace_flag = true; char text[3] = { '\0', '\0', '\0' }; while( *str ){ while (*str == ' ' && skip_whitespace_flag) str++; #ifdef ENABLE_1BYTE_CHAR if ( *str == '`' ){ str++; skip_whitespace_flag = false; continue; } #endif #ifndef FORCE_1BYTE_CHAR if (cache_info && !cache_info->is_tight_region){ if (*str == '('){ startRuby(str+1, *info); str++; continue; } else if (*str == '/' && ruby_struct.stage == RubyStruct::BODY ){ info->addLineOffset(ruby_struct.margin); str = ruby_struct.ruby_end; if (*ruby_struct.ruby_end == ')'){ endRuby(false, false, NULL, cache_info); str++; } continue; } else if (*str == ')' && ruby_struct.stage == RubyStruct::BODY ){ ruby_struct.stage = RubyStruct::NONE; str++; continue; } else if (*str == '<'){ str++; int no = 0; while(*str>='0' && *str<='9') no=no*10+(*str++)-'0'; in_textbtn_flag = true; continue; } else if (*str == '>' && in_textbtn_flag){ str++; in_textbtn_flag = false; continue; } } #endif if ( IS_TWO_BYTE(*str) ){ if ( checkLineBreak( str, info ) ){ info->newLine(); for (int i=0 ; i<indent_offset ; i++) info->advanceCharInHankaku(2); } text[0] = *str++; text[1] = *str++; drawChar( text, info, false, false, surface, cache_info ); } else if (*str == 0x0a || (*str == '\\' && info->is_newline_accepted)){ info->newLine(); str++; } else if (*str){ text[0] = *str++; if (*str && *str != 0x0a) text[1] = *str++; else text[1] = 0; drawChar( text, info, false, false, surface, cache_info ); } } for ( i=0 ; i<3 ; i++ ) info->color[i] = org_color[i]; /* ---------------------------------------- */ /* Calculate the area of selection */ SDL_Rect clipped_rect = info->calcUpdatedArea(start_xy); SDL_Rect scaled_clipped_rect; scaled_clipped_rect.x = clipped_rect.x * screen_ratio1 / screen_ratio2; scaled_clipped_rect.y = clipped_rect.y * screen_ratio1 / screen_ratio2; scaled_clipped_rect.w = clipped_rect.w * screen_ratio1 / screen_ratio2; scaled_clipped_rect.h = clipped_rect.h * screen_ratio1 / screen_ratio2; info->addShadeArea(scaled_clipped_rect, shade_distance); if ( flush_flag ) flush( refresh_shadow_text_mode, &scaled_clipped_rect ); if ( rect ) *rect = clipped_rect; }
int ONScripterLabel::processText() { //printf("textCommand %c %d %d %d\n", script_h.getStringBuffer()[ string_buffer_offset ], string_buffer_offset, event_mode, line_enter_status); char out_text[3]= {'\0', '\0', '\0'}; if ( event_mode & (WAIT_INPUT_MODE | WAIT_SLEEP_MODE) ){ draw_cursor_flag = false; if ( clickstr_state == CLICK_WAIT ){ if (script_h.checkClickstr(script_h.getStringBuffer() + string_buffer_offset) != 1) string_buffer_offset++; string_buffer_offset++; clickstr_state = CLICK_NONE; } else if ( clickstr_state == CLICK_NEWPAGE ){ event_mode = IDLE_EVENT_MODE; if (script_h.checkClickstr(script_h.getStringBuffer() + string_buffer_offset) != 1) string_buffer_offset++; string_buffer_offset++; newPage( true ); clickstr_state = CLICK_NONE; return RET_CONTINUE | RET_NOREAD; } else if ( IS_TWO_BYTE(script_h.getStringBuffer()[ string_buffer_offset ]) ){ string_buffer_offset += 2; } else if ( script_h.getStringBuffer()[ string_buffer_offset ] == '!' ){ string_buffer_offset++; if ( script_h.getStringBuffer()[ string_buffer_offset ] == 'w' || script_h.getStringBuffer()[ string_buffer_offset ] == 'd' ){ string_buffer_offset++; while ( script_h.getStringBuffer()[ string_buffer_offset ] >= '0' && script_h.getStringBuffer()[ string_buffer_offset ] <= '9' ) string_buffer_offset++; while (script_h.getStringBuffer()[ string_buffer_offset ] == ' ' || script_h.getStringBuffer()[ string_buffer_offset ] == '\t') string_buffer_offset++; } } else if ( script_h.getStringBuffer()[ string_buffer_offset + 1 ] && !(script_h.getEndStatus() & ScriptHandler::END_1BYTE_CHAR) ){ string_buffer_offset += 2; } else string_buffer_offset++; event_mode = IDLE_EVENT_MODE; } if (script_h.getStringBuffer()[string_buffer_offset] == 0x0a || script_h.getStringBuffer()[string_buffer_offset] == 0x00){ indent_offset = 0; // redundant return RET_CONTINUE; } new_line_skip_flag = false; //printf("*** textCommand %d (%d,%d)\n", string_buffer_offset, sentence_font.xy[0], sentence_font.xy[1]); while( (!(script_h.getEndStatus() & ScriptHandler::END_1BYTE_CHAR) && script_h.getStringBuffer()[ string_buffer_offset ] == ' ') || script_h.getStringBuffer()[ string_buffer_offset ] == '\t' ) string_buffer_offset ++; char ch = script_h.getStringBuffer()[string_buffer_offset]; if ( IS_TWO_BYTE(ch) ){ // Shift jis /* ---------------------------------------- */ /* Kinsoku process */ if (IS_KINSOKU( script_h.getStringBuffer() + string_buffer_offset + 2)){ int i = 2; while (!sentence_font.isEndOfLine(i) && IS_KINSOKU( script_h.getStringBuffer() + string_buffer_offset + i + 2)){ i += 2; } if (sentence_font.isEndOfLine(i)){ sentence_font.newLine(); for (int i=0 ; i<indent_offset ; i++){ current_page->add(LOC_TWOBYTE_SYMBOL(' ')[0]); current_page->add(LOC_TWOBYTE_SYMBOL(' ')[1]); sentence_font.advanceCharInHankaku(2); } } } out_text[0] = script_h.getStringBuffer()[string_buffer_offset]; out_text[1] = script_h.getStringBuffer()[string_buffer_offset+1]; if ( clickstr_state == CLICK_IGNORE ){ clickstr_state = CLICK_NONE; } else{ if (script_h.checkClickstr(&script_h.getStringBuffer()[string_buffer_offset]) > 0){ if (sentence_font.getRemainingLine() <= clickstr_line) return clickNewPage( out_text ); else return clickWait( out_text ); } else{ clickstr_state = CLICK_NONE; } } if ( skip_flag || draw_one_page_flag || ctrl_pressed_status ){ drawChar( out_text, &sentence_font, false, true, accumulation_surface, &text_info ); num_chars_in_sentence++; string_buffer_offset += 2; return RET_CONTINUE | RET_NOREAD; } else{ drawChar( out_text, &sentence_font, true, true, accumulation_surface, &text_info ); num_chars_in_sentence++; event_mode = WAIT_SLEEP_MODE; if ( sentence_font.wait_time == -1 ) advancePhase( default_text_speed[text_speed_no] ); else advancePhase( sentence_font.wait_time ); return RET_WAIT | RET_NOREAD; } } else if ( ch == '@' ){ // wait for click return clickWait( NULL ); } else if ( ch == '\\' ){ // new page return clickNewPage( NULL ); } else if ( ch == '_' ){ // Ignore following forced return clickstr_state = CLICK_IGNORE; string_buffer_offset++; return RET_CONTINUE | RET_NOREAD; } else if ( ch == '!' && !(script_h.getEndStatus() & ScriptHandler::END_1BYTE_CHAR) ){ string_buffer_offset++; if ( script_h.getStringBuffer()[ string_buffer_offset ] == 's' ){ string_buffer_offset++; if ( script_h.getStringBuffer()[ string_buffer_offset ] == 'd' ){ sentence_font.wait_time = -1; string_buffer_offset++; } else{ int t = 0; while( script_h.getStringBuffer()[ string_buffer_offset ] >= '0' && script_h.getStringBuffer()[ string_buffer_offset ] <= '9' ){ t = t*10 + script_h.getStringBuffer()[ string_buffer_offset ] - '0'; string_buffer_offset++; } sentence_font.wait_time = t; while (script_h.getStringBuffer()[ string_buffer_offset ] == ' ' || script_h.getStringBuffer()[ string_buffer_offset ] == '\t') string_buffer_offset++; } } else if ( script_h.getStringBuffer()[ string_buffer_offset ] == 'w' || script_h.getStringBuffer()[ string_buffer_offset ] == 'd' ){ bool flag = false; if ( script_h.getStringBuffer()[ string_buffer_offset ] == 'd' ) flag = true; string_buffer_offset++; int tmp_string_buffer_offset = string_buffer_offset; int t = 0; while( script_h.getStringBuffer()[ string_buffer_offset ] >= '0' && script_h.getStringBuffer()[ string_buffer_offset ] <= '9' ){ t = t*10 + script_h.getStringBuffer()[ string_buffer_offset ] - '0'; string_buffer_offset++; } while (script_h.getStringBuffer()[ string_buffer_offset ] == ' ' || script_h.getStringBuffer()[ string_buffer_offset ] == '\t') string_buffer_offset++; if ( skip_flag || draw_one_page_flag || ctrl_pressed_status ){ return RET_CONTINUE | RET_NOREAD; } else{ event_mode = WAIT_SLEEP_MODE; if ( flag ) event_mode |= WAIT_INPUT_MODE; key_pressed_flag = false; startTimer( t ); string_buffer_offset = tmp_string_buffer_offset - 2; return RET_WAIT | RET_NOREAD; } } return RET_CONTINUE | RET_NOREAD; } else if ( ch == '#' && !(script_h.getEndStatus() & ScriptHandler::END_1BYTE_CHAR) ){ readColor( &sentence_font.color, script_h.getStringBuffer() + string_buffer_offset ); readColor( &ruby_font.color, script_h.getStringBuffer() + string_buffer_offset ); string_buffer_offset += 7; return RET_CONTINUE | RET_NOREAD; } else if ( ch == '(' && !(script_h.getEndStatus() & ScriptHandler::END_1BYTE_CHAR)){ current_page->add('('); startRuby( script_h.getStringBuffer() + string_buffer_offset + 1, sentence_font ); string_buffer_offset++; return RET_CONTINUE | RET_NOREAD; } else if ( ch == '/' && !(script_h.getEndStatus() & ScriptHandler::END_1BYTE_CHAR) ){ if ( ruby_struct.stage == RubyStruct::BODY ){ current_page->add('/'); sentence_font.addLineOffset(ruby_struct.margin); string_buffer_offset = ruby_struct.ruby_end - script_h.getStringBuffer(); if (*ruby_struct.ruby_end == ')'){ if ( skip_flag || draw_one_page_flag || ctrl_pressed_status ) endRuby(false, true, accumulation_surface, &text_info); else endRuby(true, true, accumulation_surface, &text_info); current_page->add(')'); string_buffer_offset++; } return RET_CONTINUE | RET_NOREAD; } else{ // skip new line new_line_skip_flag = true; string_buffer_offset++; if (script_h.getStringBuffer()[string_buffer_offset] != 0x0a) errorAndExit( "'new line' must follow '/'." ); return RET_CONTINUE; // skip the following eol } } else if ( ch == ')' && !(script_h.getEndStatus() & ScriptHandler::END_1BYTE_CHAR) && ruby_struct.stage == RubyStruct::BODY ){ current_page->add(')'); string_buffer_offset++; ruby_struct.stage = RubyStruct::NONE; return RET_CONTINUE | RET_NOREAD; } else{ out_text[0] = ch; if ( clickstr_state == CLICK_IGNORE ){ clickstr_state = CLICK_NONE; } else{ int matched_len = script_h.checkClickstr(script_h.getStringBuffer() + string_buffer_offset); if (matched_len > 0){ if (matched_len == 2) out_text[1] = script_h.getStringBuffer()[ string_buffer_offset + 1 ]; if (sentence_font.getRemainingLine() <= clickstr_line) return clickNewPage( out_text ); else return clickWait( out_text ); } else if (script_h.getStringBuffer()[ string_buffer_offset + 1 ] && script_h.checkClickstr(&script_h.getStringBuffer()[string_buffer_offset+1]) == 1 && script_h.getEndStatus() & ScriptHandler::END_1BYTE_CHAR){ if ( script_h.getStringBuffer()[ string_buffer_offset + 2 ] && script_h.checkClickstr(&script_h.getStringBuffer()[string_buffer_offset+2]) > 0){ clickstr_state = CLICK_NONE; } else if (script_h.getStringBuffer()[ string_buffer_offset + 1 ] == '@'){ return clickWait( out_text ); } else if (script_h.getStringBuffer()[ string_buffer_offset + 1 ] == '\\'){ return clickNewPage( out_text ); } else{ out_text[1] = script_h.getStringBuffer()[ string_buffer_offset + 1 ]; if (sentence_font.getRemainingLine() <= clickstr_line) return clickNewPage( out_text ); else return clickWait( out_text ); } } else{ clickstr_state = CLICK_NONE; } } bool flush_flag = true; if ( skip_flag || draw_one_page_flag || ctrl_pressed_status ) flush_flag = false; if ( script_h.getStringBuffer()[ string_buffer_offset + 1 ] && script_h.getStringBuffer()[ string_buffer_offset + 1 ] != 0x0a && !(script_h.getEndStatus() & ScriptHandler::END_1BYTE_CHAR)){ out_text[1] = script_h.getStringBuffer()[ string_buffer_offset + 1 ]; drawDoubleChars( out_text, &sentence_font, flush_flag, true, accumulation_surface, &text_info ); num_chars_in_sentence++; } else if (script_h.getEndStatus() & ScriptHandler::END_1BYTE_CHAR){ drawDoubleChars( out_text, &sentence_font, flush_flag, true, accumulation_surface, &text_info ); num_chars_in_sentence++; } if ( skip_flag || draw_one_page_flag || ctrl_pressed_status ){ if ( script_h.getStringBuffer()[ string_buffer_offset + 1 ] && !(script_h.getEndStatus() & ScriptHandler::END_1BYTE_CHAR)) string_buffer_offset++; string_buffer_offset++; return RET_CONTINUE | RET_NOREAD; } else{ event_mode = WAIT_SLEEP_MODE; if ( sentence_font.wait_time == -1 ) advancePhase( default_text_speed[text_speed_no] ); else advancePhase( sentence_font.wait_time ); return RET_WAIT | RET_NOREAD; } } return RET_NOMATCH; }
void ONScripterLabel::drawString( const char *str, uchar3 color, FontInfo *info, bool flush_flag, SDL_Surface *surface, SDL_Rect *rect, AnimationInfo *cache_info ) { int i; int start_xy[2]; start_xy[0] = info->xy[0]; start_xy[1] = info->xy[1]; /* ---------------------------------------- */ /* Draw selected characters */ uchar3 org_color; for ( i=0 ; i<3 ; i++ ) org_color[i] = info->color[i]; for ( i=0 ; i<3 ; i++ ) info->color[i] = color[i]; bool skip_whitespace_flag = true; char text[3] = { '\0', '\0', '\0' }; while( *str ){ while (*str == ' ' && skip_whitespace_flag) str++; #ifdef ENABLE_1BYTE_CHAR if ( *str == '`' ){ str++; skip_whitespace_flag = false; continue; } #endif #ifndef FORCE_1BYTE_CHAR if (cache_info && !cache_info->is_tight_region){ if (*str == '('){ startRuby(str+1, *info); str++; continue; } else if (*str == '/' && ruby_struct.stage == RubyStruct::BODY ){ info->addLineOffset(ruby_struct.margin); str = ruby_struct.ruby_end; if (*ruby_struct.ruby_end == ')'){ endRuby(false, false, NULL, cache_info); str++; } continue; } else if (*str == ')' && ruby_struct.stage == RubyStruct::BODY ){ ruby_struct.stage = RubyStruct::NONE; str++; continue; } } #endif if ( IS_TWO_BYTE(*str) ){ /* Kinsoku process */ if (info->isEndOfLine(2) && IS_KINSOKU( str+2 )){ info->newLine(); for (int i=0 ; i<indent_offset ; i++){ sentence_font.advanceCharInHankaku(2); } } text[0] = *str++; text[1] = *str++; drawChar( text, info, false, false, surface, cache_info ); } else if (*str == 0x0a || *str == '\\' && info->is_newline_accepted){ info->newLine(); str++; } else{ text[0] = *str++; text[1] = '\0'; drawChar( text, info, false, false, surface, cache_info ); if (*str && *str != 0x0a){ text[0] = *str++; drawChar( text, info, false, false, surface, cache_info ); } } } for ( i=0 ; i<3 ; i++ ) info->color[i] = org_color[i]; /* ---------------------------------------- */ /* Calculate the area of selection */ SDL_Rect clipped_rect = info->calcUpdatedArea(start_xy, screen_ratio1, screen_ratio2); info->addShadeArea(clipped_rect, shade_distance); if ( flush_flag ) flush( refresh_shadow_text_mode, &clipped_rect ); if ( rect ) *rect = clipped_rect; }