diff options
-rw-r--r-- | simon/charset.cpp | 583 | ||||
-rw-r--r-- | simon/module.mk | 1 | ||||
-rw-r--r-- | simon/simon.cpp | 557 |
3 files changed, 584 insertions, 557 deletions
diff --git a/simon/charset.cpp b/simon/charset.cpp new file mode 100644 index 0000000000..1fb1152776 --- /dev/null +++ b/simon/charset.cpp @@ -0,0 +1,583 @@ +/* ScummVM - Scumm Interpreter + * Copyright (C) 2001-2003 The ScummVM project + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * $Header$ + * + */ + +#include "stdafx.h" +#include "simon/simon.h" +#include "simon/intern.h" + +void SimonState::print_char_helper_1(const byte *src, uint len) { + uint ind; + + if (_fcs_ptr_1 == NULL) + return; + + while (len-- != 0) { + if (*src != 12 && _fcs_ptr_1->fcs_data != NULL && + _fcs_data_1[ind = get_fcs_ptr_3_index(_fcs_ptr_1)] != 2) { + + _fcs_data_1[ind] = 2; + _fcs_data_2[ind] = 1; + } + + fcs_putchar(*src++); + } +} + +void SimonState::print_char_helper_5(FillOrCopyStruct *fcs) { + uint index = get_fcs_ptr_3_index(fcs); + print_char_helper_6(index); + _fcs_data_1[index] = 0; +} + +void SimonState::print_char_helper_6(uint i) { + FillOrCopyStruct *fcs; + + if (_fcs_data_2[i]) { + lock(); + fcs = _fcs_ptr_array_3[i]; + fcs_unk_proc_1(i, fcs->fcs_data->item_ptr, fcs->fcs_data->unk1, fcs->fcs_data->unk2); + _fcs_data_2[i] = 0; + unlock(); + } +} + +void SimonState::render_string(uint num_1, uint color, uint width, uint height, const char *txt) { + VgaPointersEntry *vpe = &_vga_buffer_pointers[2]; + byte *src, *dst, *p, *dst_org, chr; + uint count; + + if (num_1 >= 100) { + num_1 -= 100; + vpe++; + } + + src = dst = vpe->vgaFile2; + + count = 4000; + if (num_1 == 1) + count *= 2; + + p = dst + num_1 * 8; + + *(uint16 *)(p + 4) = TO_BE_16(height); + *(uint16 *)(p + 6) = TO_BE_16(width); + dst += READ_BE_UINT32_UNALIGNED(p); + + memset(dst, 0, count); + + dst_org = dst; + while ((chr = *txt++) != 0) { + if (chr == 10) { + dst_org += width * 10; + dst = dst_org; + } else if ((chr -= ' ') == 0) { + dst += 6; + } else { + byte *img_hdr = src + 48 + chr * 4; + uint img_height = img_hdr[2]; + uint img_width = img_hdr[3], i; + byte *img = src + READ_LE_UINT16(img_hdr); + byte *cur_dst = dst; + + assert(img_width > 0 && img_width < 50 && img_height > 0 && img_height < 50); + + do { + for (i = 0; i != img_width; i++) { + chr = *img++; + if (chr) { + if (chr == 0xF) + chr = 207; + else + chr += color; + cur_dst[i] = chr; + } + } + cur_dst += width; + } while (--img_height); + + dst += img_width - 1; + } + } +} + +void SimonState::showMessageFormat(const char *s, ...) { + char buf[1024], *str; + va_list va; + + va_start(va, s); + vsprintf(buf, s, va); + va_end(va); + + if (!_fcs_data_1[_fcs_unk_1]) { + showmessage_helper_2(); + if (!_showmessage_flag) { + _fcs_ptr_array_3[0] = _fcs_ptr_1; + showmessage_helper_3(_fcs_ptr_1->textLength, + _fcs_ptr_1->textMaxLength); + } + _showmessage_flag = true; + _fcs_data_1[_fcs_unk_1] = 1; + } + + for (str = buf; *str; str++) + showmessage_print_char(*str); +} + +void SimonState::showmessage_print_char(byte chr) { + if (chr == 12) { + _num_letters_to_print = 0; + _print_char_unk_1 = 0; + print_char_helper_1(&chr, 1); + print_char_helper_5(_fcs_ptr_1); + } else if (chr == 0 || chr == ' ' || chr == 10) { + if (_print_char_unk_2 - _print_char_unk_1 >= _num_letters_to_print) { + _print_char_unk_1 += _num_letters_to_print; + print_char_helper_1(_letters_to_print_buf, _num_letters_to_print); + + if (_print_char_unk_1 == _print_char_unk_2) { + _print_char_unk_1 = 0; + } else { + if (chr) + print_char_helper_1(&chr, 1); + if (chr == 10) + _print_char_unk_1 = 0; + else if (chr != 0) + _print_char_unk_1++; + } + } else { + const byte newline_character = 10; + _print_char_unk_1 = _num_letters_to_print; + print_char_helper_1(&newline_character, 1); + print_char_helper_1(_letters_to_print_buf, _num_letters_to_print); + if (chr == ' ') { + print_char_helper_1(&chr, 1); + _print_char_unk_1++; + } else { + print_char_helper_1(&chr, 1); + _print_char_unk_1 = 0; + } + } + _num_letters_to_print = 0; + } else { + _letters_to_print_buf[_num_letters_to_print++] = chr; + } +} + +void SimonState::showmessage_helper_2() { + if (_fcs_ptr_1) + return; + + _fcs_ptr_1 = fcs_alloc(8, 0x90, 0x18, 6, 1, 0, 0xF); +} + +void SimonState::showmessage_helper_3(uint a, uint b) { + _print_char_unk_1 = a; + _print_char_unk_2 = b; + _num_letters_to_print = 0; +} + +void SimonState::video_putchar(FillOrCopyStruct *fcs, byte c) { + if (c == 0xC) { + video_fill_or_copy_from_3_to_2(fcs); + } else if (c == 0xD || c == 0xA) { + video_putchar_newline(fcs); + } else if (c == 8 || c == 1) { + int8 val = (c == 8) ? 6 : 4; + if (fcs->textLength != 0) { + fcs->textLength--; + fcs->textColumnOffset -= val; + if ((int8)fcs->textColumnOffset < val) { + fcs->textColumnOffset += 8; + fcs->textColumn--; + } + } + } else if (c >= 0x20) { + if (fcs->textLength == fcs->textMaxLength) { + video_putchar_newline(fcs); + } else if (fcs->textRow == fcs->height) { + video_putchar_newline(fcs); + fcs->textRow--; + } + + video_putchar_drawchar(fcs, fcs->textColumn + fcs->x, + fcs->textRow * 8 + fcs->y, c); + + fcs->textLength++; + fcs->textColumnOffset += 6; + if (c == 'i' || c == 'l') + fcs->textColumnOffset -= 2; + + if (fcs->textColumnOffset >= 8) { + fcs->textColumnOffset -= 8; + fcs->textColumn++; + } + } +} + +void SimonState::video_putchar_newline(FillOrCopyStruct *fcs) { + fcs->textColumnOffset = 0; + fcs->textLength = 0; + fcs->textColumn = 0; + + if (fcs->textRow != fcs->height) + fcs->textRow++; +} + +static const byte hebrew_video_font[] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 176, 32, 112, 112, 32, 32, 0, + 32, 0, 48, 48, 96, 0, 0, 0, + 0, 0, 0, 144, 0, 96, 144, 144, + 104, 0, 0, 144, 0, 96, 144, 144, + 96, 0, 0, 144, 0, 144, 144, 144, + 96, 0, 0, 16, 40, 16, 42, 68, + 58, 0, 48, 48, 96, 0, 0, 0, + 0, 0, 0, 4, 8, 8, 8, 8, + 4, 0, 0, 32, 16, 16, 16, 16, + 32, 0, 0, 0, 20, 8, 62, 8, + 20, 0, 0, 112, 136, 240, 136, 136, + 240, 0, 0, 0, 0, 0, 0, 48, + 48, 96, 0, 0, 0, 240, 100, 0, + 178, 0, 9, 0, 176, 48, 48, 0, + 16, 32, 0, 120, 112, 64, 56, 0, + 112, 136, 152, 168, 200, 136, 112, 0, + 32, 96, 32, 32, 32, 32, 112, 0, + 112, 136, 8, 48, 64, 136, 248, 0, + 112, 136, 8, 48, 8, 136, 112, 0, + 16, 48, 80, 144, 248, 16, 56, 0, + 248, 128, 240, 8, 8, 136, 112, 0, + 48, 64, 128, 240, 136, 136, 112, 0, + 248, 136, 8, 16, 32, 32, 32, 0, + 112, 136, 136, 112, 136, 136, 112, 0, + 112, 136, 136, 120, 8, 16, 96, 0, + 0, 0, 48, 48, 0, 48, 48, 0, + 5, 5, 4, 6, 5, 3, 4, 5, + 6, 3, 5, 5, 4, 6, 5, 3, + 4, 6, 5, 6, 6, 6, 5, 5, + 5, 6, 5, 6, 6, 6, 6, 6, + 112, 136, 8, 16, 32, 0, 32, 0, + 0, 0, 144, 80, 160, 144, 144, 0, + 0, 0, 224, 32, 32, 32, 240, 0, + 0, 0, 224, 32, 96, 160, 160, 0, + 0, 0, 248, 16, 16, 16, 16, 0, + 0, 0, 240, 16, 16, 144, 144, 0, + 0, 0, 192, 64, 64, 64, 64, 0, + 0, 0, 224, 64, 32, 64, 64, 0, + 0, 0, 240, 144, 144, 144, 144, 0, + 0, 0, 184, 168, 136, 136, 112, 0, + 0, 0, 192, 64, 0, 0, 0, 0, + 0, 0, 240, 16, 16, 16, 16, 16, + 0, 0, 224, 16, 16, 16, 224, 0, + 128, 128, 224, 32, 32, 32, 192, 0, + 0, 0, 248, 72, 72, 72, 120, 0, + 0, 0, 176, 208, 144, 144, 176, 0, + 0, 0, 192, 64, 64, 64, 64, 64, + 0, 0, 96, 32, 32, 32, 224, 0, + 0, 0, 248, 72, 72, 72, 48, 0, + 0, 0, 80, 80, 80, 80, 224, 0, + 0, 0, 248, 72, 104, 8, 8, 8, + 0, 0, 248, 72, 104, 8, 248, 0, + 0, 0, 216, 72, 48, 16, 16, 16, + 0, 0, 144, 80, 32, 16, 240, 0, + 0, 0, 240, 16, 144, 160, 128, 128, + 0, 0, 240, 16, 16, 16, 16, 0, + 0, 0, 168, 168, 200, 136, 112, 0, + 0, 0, 240, 80, 80, 80, 208, 0, + 0, 14, 8, 8, 8, 8, 14, 0, + 0, 128, 64, 32, 16, 8, 4, 0, + 0, 112, 16, 16, 16, 16, 112, 0, + 0, 48, 72, 64, 72, 48, 16, 48, + 0, 80, 0, 96, 32, 40, 48, 0, + 32, 16, 0, 152, 144, 144, 232, 0, + 0, 0, 112, 8, 120, 136, 120, 0, + 192, 64, 80, 104, 72, 72, 112, 0, + 0, 0, 112, 136, 128, 136, 112, 0, + 24, 16, 80, 176, 144, 144, 112, 0, + 0, 0, 112, 136, 248, 128, 112, 0, + 48, 72, 64, 224, 64, 64, 224, 0, + 0, 0, 104, 144, 144, 112, 136, 112, + 192, 64, 80, 104, 72, 72, 200, 0, + 64, 0, 192, 64, 64, 64, 224, 0, + 8, 0, 8, 8, 8, 8, 136, 112, + 192, 64, 72, 80, 96, 80, 200, 0, + 192, 64, 64, 64, 64, 64, 224, 0, + 0, 0, 144, 216, 168, 136, 136, 0, + 0, 0, 240, 136, 136, 136, 136, 0, + 0, 0, 112, 136, 136, 136, 112, 0, + 0, 0, 176, 72, 72, 112, 64, 224, + 0, 0, 104, 144, 144, 112, 16, 56, + 0, 0, 176, 72, 72, 64, 224, 0, + 0, 0, 120, 128, 112, 8, 240, 0, + 64, 64, 240, 64, 64, 72, 48, 0, + 0, 0, 144, 144, 144, 144, 104, 0, + 0, 0, 136, 136, 136, 80, 32, 0, + 0, 0, 136, 136, 168, 216, 144, 0, + 0, 0, 136, 80, 32, 80, 136, 0, + 0, 0, 136, 136, 136, 112, 32, 192, + 0, 0, 248, 144, 32, 72, 248, 0, + 32, 80, 0, 96, 144, 144, 96, 0, + 0, 14, 8, 48, 8, 8, 14, 0, + 0, 8, 8, 8, 8, 8, 8, 0, + 0, 112, 16, 12, 16, 16, 112, 0, + 0, 0, 0, 0, 0, 0, 248, 0, + 139, 2, 178, 252, 8, 0, 176, 240, + 8, 0, 176, 32, 33, 34, 35, 36, +}; + +static const byte spanish_video_font[] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 32, 112, 112, 32, 32, 0, 32, 0, + 48, 48, 96, 0, 0, 0, 0, 0, + 80, 0, 112, 8, 120, 136, 120, 0, + 80, 0, 112, 136, 136, 136, 112, 0, + 80, 0, 144, 144, 144, 144, 104, 0, + 0, 16, 40, 16, 42, 68, 58, 0, + 48, 48, 96, 0, 0, 0, 0, 0, + 0, 4, 8, 8, 8, 8, 4, 0, + 0, 32, 16, 16, 16, 16, 32, 0, + 0, 0, 20, 8, 62, 8, 20, 0, + 96, 144, 144, 160, 144, 144, 160, 128, + 0, 0, 0, 0, 0, 48, 48, 96, + 0, 0, 0, 240, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 48, 48, 0, + 32, 64, 0, 112, 248, 128, 112, 0, + 112, 136, 152, 168, 200, 136, 112, 0, + 32, 96, 32, 32, 32, 32, 112, 0, + 112, 136, 8, 48, 64, 136, 248, 0, + 112, 136, 8, 48, 8, 136, 112, 0, + 16, 48, 80, 144, 248, 16, 56, 0, + 248, 128, 240, 8, 8, 136, 112, 0, + 48, 64, 128, 240, 136, 136, 112, 0, + 248, 136, 8, 16, 32, 32, 32, 0, + 112, 136, 136, 112, 136, 136, 112, 0, + 112, 136, 136, 120, 8, 16, 96, 0, + 0, 0, 48, 48, 0, 48, 48, 0, + 32, 64, 0, 112, 8, 248, 120, 0, + 32, 64, 0, 192, 64, 64, 224, 0, + 32, 64, 0, 112, 136, 136, 112, 0, + 32, 64, 0, 144, 144, 144, 104, 0, + 112, 136, 8, 16, 32, 0, 32, 0, + 80, 160, 0, 240, 136, 136, 136, 0, + 112, 136, 136, 248, 136, 136, 136, 0, + 240, 72, 72, 112, 72, 72, 240, 0, + 48, 72, 128, 128, 128, 72, 48, 0, + 224, 80, 72, 72, 72, 80, 224, 0, + 248, 72, 64, 112, 64, 72, 248, 0, + 248, 72, 64, 112, 64, 64, 224, 0, + 48, 72, 128, 152, 136, 72, 56, 0, + 136, 136, 136, 248, 136, 136, 136, 0, + 248, 32, 32, 32, 32, 32, 248, 0, + 24, 8, 8, 8, 136, 136, 112, 0, + 200, 72, 80, 96, 80, 72, 200, 0, + 224, 64, 64, 64, 64, 72, 248, 0, + 136, 216, 168, 168, 136, 136, 136, 0, + 136, 200, 168, 152, 136, 136, 136, 0, + 112, 136, 136, 136, 136, 136, 112, 0, + 240, 72, 72, 112, 64, 64, 224, 0, + 112, 136, 136, 136, 136, 168, 112, 8, + 240, 72, 72, 112, 72, 72, 200, 0, + 112, 136, 128, 112, 8, 136, 112, 0, + 248, 168, 32, 32, 32, 32, 112, 0, + 136, 136, 136, 136, 136, 136, 120, 0, + 136, 136, 136, 80, 80, 32, 32, 0, + 136, 136, 136, 136, 168, 216, 136, 0, + 136, 136, 80, 32, 80, 136, 136, 0, + 136, 136, 136, 112, 32, 32, 112, 0, + 248, 136, 16, 32, 64, 136, 248, 0, + 0, 14, 8, 8, 8, 8, 14, 0, + 0, 128, 64, 32, 16, 8, 4, 0, + 0, 112, 16, 16, 16, 16, 112, 0, + 32, 0, 32, 64, 128, 136, 112, 0, + 32, 0, 32, 32, 112, 112, 32, 0, + 80, 0, 144, 144, 144, 144, 104, 0, + 0, 0, 112, 8, 120, 136, 120, 0, + 192, 64, 80, 104, 72, 72, 112, 0, + 0, 0, 112, 136, 128, 136, 112, 0, + 24, 16, 80, 176, 144, 144, 112, 0, + 0, 0, 112, 136, 248, 128, 112, 0, + 48, 72, 64, 224, 64, 64, 224, 0, + 0, 0, 104, 144, 144, 112, 136, 112, + 192, 64, 80, 104, 72, 72, 200, 0, + 64, 0, 192, 64, 64, 64, 224, 0, + 8, 0, 8, 8, 8, 8, 136, 112, + 192, 64, 72, 80, 96, 80, 200, 0, + 192, 64, 64, 64, 64, 64, 224, 0, + 0, 0, 144, 216, 168, 136, 136, 0, + 0, 0, 240, 136, 136, 136, 136, 0, + 0, 0, 112, 136, 136, 136, 112, 0, + 0, 0, 176, 72, 72, 112, 64, 224, + 0, 0, 104, 144, 144, 112, 16, 56, + 0, 0, 176, 72, 72, 64, 224, 0, + 0, 0, 120, 128, 112, 8, 240, 0, + 64, 64, 240, 64, 64, 72, 48, 0, + 0, 0, 144, 144, 144, 144, 104, 0, + 0, 0, 136, 136, 136, 80, 32, 0, + 0, 0, 136, 136, 168, 216, 144, 0, + 0, 0, 136, 80, 32, 80, 136, 0, + 0, 0, 136, 136, 136, 112, 32, 192, + 0, 0, 248, 144, 32, 72, 248, 0, + 32, 80, 0, 96, 144, 144, 96, 0, + 0, 14, 8, 48, 8, 8, 14, 0, + 0, 8, 8, 8, 8, 8, 8, 0, + 0, 112, 16, 12, 16, 16, 112, 0, + 0, 0, 0, 0, 0, 0, 248, 0, + 139, 2, 178, 252, 8, 0, 176, 240, + 8, 0, 176, 0, 16, 0, 176, 255, +}; + +static const byte video_font[] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 32, 112, 112, 32, 32, 0, 32, 0, + 48, 48, 96, 0, 0, 0, 0, 0, + 0, 144, 0, 96, 144, 144, 104, 0, + 0, 144, 0, 96, 144, 144, 96, 0, + 0, 144, 0, 144, 144, 144, 96, 0, + 0, 16, 40, 16, 42, 68, 58, 0, + 48, 48, 96, 0, 0, 0, 0, 0, + 0, 4, 8, 8, 8, 8, 4, 0, + 0, 32, 16, 16, 16, 16, 32, 0, + 0, 0, 20, 8, 62, 8, 20, 0, + 0, 112, 136, 240, 136, 136, 240, 0, + 0, 0, 0, 0, 0, 48, 48, 96, + 0, 0, 0, 240, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 48, 48, 0, + 16, 32, 0, 120, 112, 64, 56, 0, + 112, 136, 152, 168, 200, 136, 112, 0, + 32, 96, 32, 32, 32, 32, 112, 0, + 112, 136, 8, 48, 64, 136, 248, 0, + 112, 136, 8, 48, 8, 136, 112, 0, + 16, 48, 80, 144, 248, 16, 56, 0, + 248, 128, 240, 8, 8, 136, 112, 0, + 48, 64, 128, 240, 136, 136, 112, 0, + 248, 136, 8, 16, 32, 32, 32, 0, + 112, 136, 136, 112, 136, 136, 112, 0, + 112, 136, 136, 120, 8, 16, 96, 0, + 0, 0, 48, 48, 0, 48, 48, 0, + 32, 16, 0, 112, 8, 248, 120, 0, + 32, 80, 0, 144, 144, 144, 104, 0, + 80, 0, 144, 144, 144, 144, 104, 0, + 32, 80, 0, 112, 248, 128, 112, 0, + 112, 136, 8, 16, 32, 0, 32, 0, + 32, 80, 0, 192, 64, 64, 224, 0, + 112, 136, 136, 248, 136, 136, 136, 0, + 240, 72, 72, 112, 72, 72, 240, 0, + 48, 72, 128, 128, 128, 72, 48, 0, + 224, 80, 72, 72, 72, 80, 224, 0, + 248, 72, 64, 112, 64, 72, 248, 0, + 248, 72, 64, 112, 64, 64, 224, 0, + 48, 72, 128, 152, 136, 72, 56, 0, + 136, 136, 136, 248, 136, 136, 136, 0, + 248, 32, 32, 32, 32, 32, 248, 0, + 24, 8, 8, 8, 136, 136, 112, 0, + 200, 72, 80, 96, 80, 72, 200, 0, + 224, 64, 64, 64, 64, 72, 248, 0, + 136, 216, 168, 168, 136, 136, 136, 0, + 136, 200, 168, 152, 136, 136, 136, 0, + 112, 136, 136, 136, 136, 136, 112, 0, + 240, 72, 72, 112, 64, 64, 224, 0, + 112, 136, 136, 136, 136, 168, 112, 8, + 240, 72, 72, 112, 72, 72, 200, 0, + 112, 136, 128, 112, 8, 136, 112, 0, + 248, 168, 32, 32, 32, 32, 112, 0, + 136, 136, 136, 136, 136, 136, 120, 0, + 136, 136, 136, 80, 80, 32, 32, 0, + 136, 136, 136, 136, 168, 216, 136, 0, + 136, 136, 80, 32, 80, 136, 136, 0, + 136, 136, 136, 112, 32, 32, 112, 0, + 248, 136, 16, 32, 64, 136, 248, 0, + 0, 14, 8, 8, 8, 8, 14, 0, + 0, 128, 64, 32, 16, 8, 4, 0, + 0, 112, 16, 16, 16, 16, 112, 0, + 0, 48, 72, 64, 72, 48, 16, 48, + 0, 80, 0, 96, 32, 40, 48, 0, + 32, 16, 0, 152, 144, 144, 232, 0, + 0, 0, 112, 8, 120, 136, 120, 0, + 192, 64, 80, 104, 72, 72, 112, 0, + 0, 0, 112, 136, 128, 136, 112, 0, + 24, 16, 80, 176, 144, 144, 112, 0, + 0, 0, 112, 136, 248, 128, 112, 0, + 48, 72, 64, 224, 64, 64, 224, 0, + 0, 0, 104, 144, 144, 112, 136, 112, + 192, 64, 80, 104, 72, 72, 200, 0, + 64, 0, 192, 64, 64, 64, 224, 0, + 8, 0, 8, 8, 8, 8, 136, 112, + 192, 64, 72, 80, 96, 80, 200, 0, + 192, 64, 64, 64, 64, 64, 224, 0, + 0, 0, 144, 216, 168, 136, 136, 0, + 0, 0, 240, 136, 136, 136, 136, 0, + 0, 0, 112, 136, 136, 136, 112, 0, + 0, 0, 176, 72, 72, 112, 64, 224, + 0, 0, 104, 144, 144, 112, 16, 56, + 0, 0, 176, 72, 72, 64, 224, 0, + 0, 0, 120, 128, 112, 8, 240, 0, + 64, 64, 240, 64, 64, 72, 48, 0, + 0, 0, 144, 144, 144, 144, 104, 0, + 0, 0, 136, 136, 136, 80, 32, 0, + 0, 0, 136, 136, 168, 216, 144, 0, + 0, 0, 136, 80, 32, 80, 136, 0, + 0, 0, 136, 136, 136, 112, 32, 192, + 0, 0, 248, 144, 32, 72, 248, 0, + 32, 80, 0, 96, 144, 144, 96, 0, + 0, 14, 8, 48, 8, 8, 14, 0, + 0, 8, 8, 8, 8, 8, 8, 0, + 0, 112, 16, 12, 16, 16, 112, 0, + 0, 0, 0, 0, 0, 0, 248, 0, + 252, 252, 252, 252, 252, 252, 252, 252, + 240, 240, 240, 240, 240, 240, 240, 240, +}; + +void SimonState::video_putchar_drawchar(FillOrCopyStruct *fcs, uint x, uint y, byte chr) { + const byte *src; + byte color, *dst; + uint h, i; + + _lock_word |= 0x8000; + + dst = dx_lock_2(); + dst += y * _dx_surface_pitch + x * 8 + fcs->textColumnOffset; + + if (_language == 20) { + src = hebrew_video_font + (chr - 0x20) * 8; + } else if (_language == 5) { + src = spanish_video_font + (chr - 0x20) * 8; + } else + src = video_font + (chr - 0x20) * 8; + + color = fcs->text_color; + + h = 8; + do { + int8 b = *src++; + i = 0; + do { + if (b < 0) + dst[i] = color; + b <<= 1; + } while (++i != 6); + dst += _dx_surface_pitch; + } while (--h); + + dx_unlock_2(); + + _lock_word &= ~0x8000; +} + + diff --git a/simon/module.mk b/simon/module.mk index e0861f6032..330fc34ba6 100644 --- a/simon/module.mk +++ b/simon/module.mk @@ -1,6 +1,7 @@ MODULE := simon MODULE_OBJS = \ + simon/charset.o \ simon/debug.o \ simon/items.o \ simon/midi.o \ diff --git a/simon/simon.cpp b/simon/simon.cpp index 55ac41fbe1..0550373443 100644 --- a/simon/simon.cpp +++ b/simon/simon.cpp @@ -1937,12 +1937,6 @@ void SimonState::startUp_helper_3() { showmessage_print_char(0); } -void SimonState::showmessage_helper_3(uint a, uint b) { - _print_char_unk_1 = a; - _print_char_unk_2 = b; - _num_letters_to_print = 0; -} - void SimonState::pollMouseXY() { _mouse_x = _sdl_mouse_x; _mouse_y = _sdl_mouse_y; @@ -3704,422 +3698,6 @@ void SimonState::video_copy_if_flag_0x8_c(FillOrCopyStruct *fcs) { fcs->mode = 0; } -void SimonState::showMessageFormat(const char *s, ...) { - char buf[1024], *str; - va_list va; - - va_start(va, s); - vsprintf(buf, s, va); - va_end(va); - - if (!_fcs_data_1[_fcs_unk_1]) { - showmessage_helper_2(); - if (!_showmessage_flag) { - _fcs_ptr_array_3[0] = _fcs_ptr_1; - showmessage_helper_3(_fcs_ptr_1->textLength, - _fcs_ptr_1->textMaxLength); - } - _showmessage_flag = true; - _fcs_data_1[_fcs_unk_1] = 1; - } - - for (str = buf; *str; str++) - showmessage_print_char(*str); -} - -void SimonState::showmessage_helper_2() { - if (_fcs_ptr_1) - return; - - _fcs_ptr_1 = fcs_alloc(8, 0x90, 0x18, 6, 1, 0, 0xF); -} - -void SimonState::video_putchar(FillOrCopyStruct *fcs, byte c) { - if (c == 0xC) { - video_fill_or_copy_from_3_to_2(fcs); - } else if (c == 0xD || c == 0xA) { - video_putchar_newline(fcs); - } else if (c == 8 || c == 1) { - int8 val = (c == 8) ? 6 : 4; - if (fcs->textLength != 0) { - fcs->textLength--; - fcs->textColumnOffset -= val; - if ((int8)fcs->textColumnOffset < val) { - fcs->textColumnOffset += 8; - fcs->textColumn--; - } - } - } else if (c >= 0x20) { - if (fcs->textLength == fcs->textMaxLength) { - video_putchar_newline(fcs); - } else if (fcs->textRow == fcs->height) { - video_putchar_newline(fcs); - fcs->textRow--; - } - - video_putchar_drawchar(fcs, fcs->textColumn + fcs->x, - fcs->textRow * 8 + fcs->y, c); - - fcs->textLength++; - fcs->textColumnOffset += 6; - if (c == 'i' || c == 'l') - fcs->textColumnOffset -= 2; - - if (fcs->textColumnOffset >= 8) { - fcs->textColumnOffset -= 8; - fcs->textColumn++; - } - } -} - -void SimonState::video_putchar_newline(FillOrCopyStruct *fcs) { - fcs->textColumnOffset = 0; - fcs->textLength = 0; - fcs->textColumn = 0; - - if (fcs->textRow != fcs->height) - fcs->textRow++; -} - -static const byte hebrew_video_font[] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 176, 32, 112, 112, 32, 32, 0, - 32, 0, 48, 48, 96, 0, 0, 0, - 0, 0, 0, 144, 0, 96, 144, 144, - 104, 0, 0, 144, 0, 96, 144, 144, - 96, 0, 0, 144, 0, 144, 144, 144, - 96, 0, 0, 16, 40, 16, 42, 68, - 58, 0, 48, 48, 96, 0, 0, 0, - 0, 0, 0, 4, 8, 8, 8, 8, - 4, 0, 0, 32, 16, 16, 16, 16, - 32, 0, 0, 0, 20, 8, 62, 8, - 20, 0, 0, 112, 136, 240, 136, 136, - 240, 0, 0, 0, 0, 0, 0, 48, - 48, 96, 0, 0, 0, 240, 100, 0, - 178, 0, 9, 0, 176, 48, 48, 0, - 16, 32, 0, 120, 112, 64, 56, 0, - 112, 136, 152, 168, 200, 136, 112, 0, - 32, 96, 32, 32, 32, 32, 112, 0, - 112, 136, 8, 48, 64, 136, 248, 0, - 112, 136, 8, 48, 8, 136, 112, 0, - 16, 48, 80, 144, 248, 16, 56, 0, - 248, 128, 240, 8, 8, 136, 112, 0, - 48, 64, 128, 240, 136, 136, 112, 0, - 248, 136, 8, 16, 32, 32, 32, 0, - 112, 136, 136, 112, 136, 136, 112, 0, - 112, 136, 136, 120, 8, 16, 96, 0, - 0, 0, 48, 48, 0, 48, 48, 0, - 5, 5, 4, 6, 5, 3, 4, 5, - 6, 3, 5, 5, 4, 6, 5, 3, - 4, 6, 5, 6, 6, 6, 5, 5, - 5, 6, 5, 6, 6, 6, 6, 6, - 112, 136, 8, 16, 32, 0, 32, 0, - 0, 0, 144, 80, 160, 144, 144, 0, - 0, 0, 224, 32, 32, 32, 240, 0, - 0, 0, 224, 32, 96, 160, 160, 0, - 0, 0, 248, 16, 16, 16, 16, 0, - 0, 0, 240, 16, 16, 144, 144, 0, - 0, 0, 192, 64, 64, 64, 64, 0, - 0, 0, 224, 64, 32, 64, 64, 0, - 0, 0, 240, 144, 144, 144, 144, 0, - 0, 0, 184, 168, 136, 136, 112, 0, - 0, 0, 192, 64, 0, 0, 0, 0, - 0, 0, 240, 16, 16, 16, 16, 16, - 0, 0, 224, 16, 16, 16, 224, 0, - 128, 128, 224, 32, 32, 32, 192, 0, - 0, 0, 248, 72, 72, 72, 120, 0, - 0, 0, 176, 208, 144, 144, 176, 0, - 0, 0, 192, 64, 64, 64, 64, 64, - 0, 0, 96, 32, 32, 32, 224, 0, - 0, 0, 248, 72, 72, 72, 48, 0, - 0, 0, 80, 80, 80, 80, 224, 0, - 0, 0, 248, 72, 104, 8, 8, 8, - 0, 0, 248, 72, 104, 8, 248, 0, - 0, 0, 216, 72, 48, 16, 16, 16, - 0, 0, 144, 80, 32, 16, 240, 0, - 0, 0, 240, 16, 144, 160, 128, 128, - 0, 0, 240, 16, 16, 16, 16, 0, - 0, 0, 168, 168, 200, 136, 112, 0, - 0, 0, 240, 80, 80, 80, 208, 0, - 0, 14, 8, 8, 8, 8, 14, 0, - 0, 128, 64, 32, 16, 8, 4, 0, - 0, 112, 16, 16, 16, 16, 112, 0, - 0, 48, 72, 64, 72, 48, 16, 48, - 0, 80, 0, 96, 32, 40, 48, 0, - 32, 16, 0, 152, 144, 144, 232, 0, - 0, 0, 112, 8, 120, 136, 120, 0, - 192, 64, 80, 104, 72, 72, 112, 0, - 0, 0, 112, 136, 128, 136, 112, 0, - 24, 16, 80, 176, 144, 144, 112, 0, - 0, 0, 112, 136, 248, 128, 112, 0, - 48, 72, 64, 224, 64, 64, 224, 0, - 0, 0, 104, 144, 144, 112, 136, 112, - 192, 64, 80, 104, 72, 72, 200, 0, - 64, 0, 192, 64, 64, 64, 224, 0, - 8, 0, 8, 8, 8, 8, 136, 112, - 192, 64, 72, 80, 96, 80, 200, 0, - 192, 64, 64, 64, 64, 64, 224, 0, - 0, 0, 144, 216, 168, 136, 136, 0, - 0, 0, 240, 136, 136, 136, 136, 0, - 0, 0, 112, 136, 136, 136, 112, 0, - 0, 0, 176, 72, 72, 112, 64, 224, - 0, 0, 104, 144, 144, 112, 16, 56, - 0, 0, 176, 72, 72, 64, 224, 0, - 0, 0, 120, 128, 112, 8, 240, 0, - 64, 64, 240, 64, 64, 72, 48, 0, - 0, 0, 144, 144, 144, 144, 104, 0, - 0, 0, 136, 136, 136, 80, 32, 0, - 0, 0, 136, 136, 168, 216, 144, 0, - 0, 0, 136, 80, 32, 80, 136, 0, - 0, 0, 136, 136, 136, 112, 32, 192, - 0, 0, 248, 144, 32, 72, 248, 0, - 32, 80, 0, 96, 144, 144, 96, 0, - 0, 14, 8, 48, 8, 8, 14, 0, - 0, 8, 8, 8, 8, 8, 8, 0, - 0, 112, 16, 12, 16, 16, 112, 0, - 0, 0, 0, 0, 0, 0, 248, 0, - 139, 2, 178, 252, 8, 0, 176, 240, - 8, 0, 176, 32, 33, 34, 35, 36, -}; - -static const byte spanish_video_font[] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 32, 112, 112, 32, 32, 0, 32, 0, - 48, 48, 96, 0, 0, 0, 0, 0, - 80, 0, 112, 8, 120, 136, 120, 0, - 80, 0, 112, 136, 136, 136, 112, 0, - 80, 0, 144, 144, 144, 144, 104, 0, - 0, 16, 40, 16, 42, 68, 58, 0, - 48, 48, 96, 0, 0, 0, 0, 0, - 0, 4, 8, 8, 8, 8, 4, 0, - 0, 32, 16, 16, 16, 16, 32, 0, - 0, 0, 20, 8, 62, 8, 20, 0, - 96, 144, 144, 160, 144, 144, 160, 128, - 0, 0, 0, 0, 0, 48, 48, 96, - 0, 0, 0, 240, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 48, 48, 0, - 32, 64, 0, 112, 248, 128, 112, 0, - 112, 136, 152, 168, 200, 136, 112, 0, - 32, 96, 32, 32, 32, 32, 112, 0, - 112, 136, 8, 48, 64, 136, 248, 0, - 112, 136, 8, 48, 8, 136, 112, 0, - 16, 48, 80, 144, 248, 16, 56, 0, - 248, 128, 240, 8, 8, 136, 112, 0, - 48, 64, 128, 240, 136, 136, 112, 0, - 248, 136, 8, 16, 32, 32, 32, 0, - 112, 136, 136, 112, 136, 136, 112, 0, - 112, 136, 136, 120, 8, 16, 96, 0, - 0, 0, 48, 48, 0, 48, 48, 0, - 32, 64, 0, 112, 8, 248, 120, 0, - 32, 64, 0, 192, 64, 64, 224, 0, - 32, 64, 0, 112, 136, 136, 112, 0, - 32, 64, 0, 144, 144, 144, 104, 0, - 112, 136, 8, 16, 32, 0, 32, 0, - 80, 160, 0, 240, 136, 136, 136, 0, - 112, 136, 136, 248, 136, 136, 136, 0, - 240, 72, 72, 112, 72, 72, 240, 0, - 48, 72, 128, 128, 128, 72, 48, 0, - 224, 80, 72, 72, 72, 80, 224, 0, - 248, 72, 64, 112, 64, 72, 248, 0, - 248, 72, 64, 112, 64, 64, 224, 0, - 48, 72, 128, 152, 136, 72, 56, 0, - 136, 136, 136, 248, 136, 136, 136, 0, - 248, 32, 32, 32, 32, 32, 248, 0, - 24, 8, 8, 8, 136, 136, 112, 0, - 200, 72, 80, 96, 80, 72, 200, 0, - 224, 64, 64, 64, 64, 72, 248, 0, - 136, 216, 168, 168, 136, 136, 136, 0, - 136, 200, 168, 152, 136, 136, 136, 0, - 112, 136, 136, 136, 136, 136, 112, 0, - 240, 72, 72, 112, 64, 64, 224, 0, - 112, 136, 136, 136, 136, 168, 112, 8, - 240, 72, 72, 112, 72, 72, 200, 0, - 112, 136, 128, 112, 8, 136, 112, 0, - 248, 168, 32, 32, 32, 32, 112, 0, - 136, 136, 136, 136, 136, 136, 120, 0, - 136, 136, 136, 80, 80, 32, 32, 0, - 136, 136, 136, 136, 168, 216, 136, 0, - 136, 136, 80, 32, 80, 136, 136, 0, - 136, 136, 136, 112, 32, 32, 112, 0, - 248, 136, 16, 32, 64, 136, 248, 0, - 0, 14, 8, 8, 8, 8, 14, 0, - 0, 128, 64, 32, 16, 8, 4, 0, - 0, 112, 16, 16, 16, 16, 112, 0, - 32, 0, 32, 64, 128, 136, 112, 0, - 32, 0, 32, 32, 112, 112, 32, 0, - 80, 0, 144, 144, 144, 144, 104, 0, - 0, 0, 112, 8, 120, 136, 120, 0, - 192, 64, 80, 104, 72, 72, 112, 0, - 0, 0, 112, 136, 128, 136, 112, 0, - 24, 16, 80, 176, 144, 144, 112, 0, - 0, 0, 112, 136, 248, 128, 112, 0, - 48, 72, 64, 224, 64, 64, 224, 0, - 0, 0, 104, 144, 144, 112, 136, 112, - 192, 64, 80, 104, 72, 72, 200, 0, - 64, 0, 192, 64, 64, 64, 224, 0, - 8, 0, 8, 8, 8, 8, 136, 112, - 192, 64, 72, 80, 96, 80, 200, 0, - 192, 64, 64, 64, 64, 64, 224, 0, - 0, 0, 144, 216, 168, 136, 136, 0, - 0, 0, 240, 136, 136, 136, 136, 0, - 0, 0, 112, 136, 136, 136, 112, 0, - 0, 0, 176, 72, 72, 112, 64, 224, - 0, 0, 104, 144, 144, 112, 16, 56, - 0, 0, 176, 72, 72, 64, 224, 0, - 0, 0, 120, 128, 112, 8, 240, 0, - 64, 64, 240, 64, 64, 72, 48, 0, - 0, 0, 144, 144, 144, 144, 104, 0, - 0, 0, 136, 136, 136, 80, 32, 0, - 0, 0, 136, 136, 168, 216, 144, 0, - 0, 0, 136, 80, 32, 80, 136, 0, - 0, 0, 136, 136, 136, 112, 32, 192, - 0, 0, 248, 144, 32, 72, 248, 0, - 32, 80, 0, 96, 144, 144, 96, 0, - 0, 14, 8, 48, 8, 8, 14, 0, - 0, 8, 8, 8, 8, 8, 8, 0, - 0, 112, 16, 12, 16, 16, 112, 0, - 0, 0, 0, 0, 0, 0, 248, 0, - 139, 2, 178, 252, 8, 0, 176, 240, - 8, 0, 176, 0, 16, 0, 176, 255, -}; - -static const byte video_font[] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 32, 112, 112, 32, 32, 0, 32, 0, - 48, 48, 96, 0, 0, 0, 0, 0, - 0, 144, 0, 96, 144, 144, 104, 0, - 0, 144, 0, 96, 144, 144, 96, 0, - 0, 144, 0, 144, 144, 144, 96, 0, - 0, 16, 40, 16, 42, 68, 58, 0, - 48, 48, 96, 0, 0, 0, 0, 0, - 0, 4, 8, 8, 8, 8, 4, 0, - 0, 32, 16, 16, 16, 16, 32, 0, - 0, 0, 20, 8, 62, 8, 20, 0, - 0, 112, 136, 240, 136, 136, 240, 0, - 0, 0, 0, 0, 0, 48, 48, 96, - 0, 0, 0, 240, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 48, 48, 0, - 16, 32, 0, 120, 112, 64, 56, 0, - 112, 136, 152, 168, 200, 136, 112, 0, - 32, 96, 32, 32, 32, 32, 112, 0, - 112, 136, 8, 48, 64, 136, 248, 0, - 112, 136, 8, 48, 8, 136, 112, 0, - 16, 48, 80, 144, 248, 16, 56, 0, - 248, 128, 240, 8, 8, 136, 112, 0, - 48, 64, 128, 240, 136, 136, 112, 0, - 248, 136, 8, 16, 32, 32, 32, 0, - 112, 136, 136, 112, 136, 136, 112, 0, - 112, 136, 136, 120, 8, 16, 96, 0, - 0, 0, 48, 48, 0, 48, 48, 0, - 32, 16, 0, 112, 8, 248, 120, 0, - 32, 80, 0, 144, 144, 144, 104, 0, - 80, 0, 144, 144, 144, 144, 104, 0, - 32, 80, 0, 112, 248, 128, 112, 0, - 112, 136, 8, 16, 32, 0, 32, 0, - 32, 80, 0, 192, 64, 64, 224, 0, - 112, 136, 136, 248, 136, 136, 136, 0, - 240, 72, 72, 112, 72, 72, 240, 0, - 48, 72, 128, 128, 128, 72, 48, 0, - 224, 80, 72, 72, 72, 80, 224, 0, - 248, 72, 64, 112, 64, 72, 248, 0, - 248, 72, 64, 112, 64, 64, 224, 0, - 48, 72, 128, 152, 136, 72, 56, 0, - 136, 136, 136, 248, 136, 136, 136, 0, - 248, 32, 32, 32, 32, 32, 248, 0, - 24, 8, 8, 8, 136, 136, 112, 0, - 200, 72, 80, 96, 80, 72, 200, 0, - 224, 64, 64, 64, 64, 72, 248, 0, - 136, 216, 168, 168, 136, 136, 136, 0, - 136, 200, 168, 152, 136, 136, 136, 0, - 112, 136, 136, 136, 136, 136, 112, 0, - 240, 72, 72, 112, 64, 64, 224, 0, - 112, 136, 136, 136, 136, 168, 112, 8, - 240, 72, 72, 112, 72, 72, 200, 0, - 112, 136, 128, 112, 8, 136, 112, 0, - 248, 168, 32, 32, 32, 32, 112, 0, - 136, 136, 136, 136, 136, 136, 120, 0, - 136, 136, 136, 80, 80, 32, 32, 0, - 136, 136, 136, 136, 168, 216, 136, 0, - 136, 136, 80, 32, 80, 136, 136, 0, - 136, 136, 136, 112, 32, 32, 112, 0, - 248, 136, 16, 32, 64, 136, 248, 0, - 0, 14, 8, 8, 8, 8, 14, 0, - 0, 128, 64, 32, 16, 8, 4, 0, - 0, 112, 16, 16, 16, 16, 112, 0, - 0, 48, 72, 64, 72, 48, 16, 48, - 0, 80, 0, 96, 32, 40, 48, 0, - 32, 16, 0, 152, 144, 144, 232, 0, - 0, 0, 112, 8, 120, 136, 120, 0, - 192, 64, 80, 104, 72, 72, 112, 0, - 0, 0, 112, 136, 128, 136, 112, 0, - 24, 16, 80, 176, 144, 144, 112, 0, - 0, 0, 112, 136, 248, 128, 112, 0, - 48, 72, 64, 224, 64, 64, 224, 0, - 0, 0, 104, 144, 144, 112, 136, 112, - 192, 64, 80, 104, 72, 72, 200, 0, - 64, 0, 192, 64, 64, 64, 224, 0, - 8, 0, 8, 8, 8, 8, 136, 112, - 192, 64, 72, 80, 96, 80, 200, 0, - 192, 64, 64, 64, 64, 64, 224, 0, - 0, 0, 144, 216, 168, 136, 136, 0, - 0, 0, 240, 136, 136, 136, 136, 0, - 0, 0, 112, 136, 136, 136, 112, 0, - 0, 0, 176, 72, 72, 112, 64, 224, - 0, 0, 104, 144, 144, 112, 16, 56, - 0, 0, 176, 72, 72, 64, 224, 0, - 0, 0, 120, 128, 112, 8, 240, 0, - 64, 64, 240, 64, 64, 72, 48, 0, - 0, 0, 144, 144, 144, 144, 104, 0, - 0, 0, 136, 136, 136, 80, 32, 0, - 0, 0, 136, 136, 168, 216, 144, 0, - 0, 0, 136, 80, 32, 80, 136, 0, - 0, 0, 136, 136, 136, 112, 32, 192, - 0, 0, 248, 144, 32, 72, 248, 0, - 32, 80, 0, 96, 144, 144, 96, 0, - 0, 14, 8, 48, 8, 8, 14, 0, - 0, 8, 8, 8, 8, 8, 8, 0, - 0, 112, 16, 12, 16, 16, 112, 0, - 0, 0, 0, 0, 0, 0, 248, 0, - 252, 252, 252, 252, 252, 252, 252, 252, - 240, 240, 240, 240, 240, 240, 240, 240, -}; - -void SimonState::video_putchar_drawchar(FillOrCopyStruct *fcs, uint x, uint y, byte chr) { - const byte *src; - byte color, *dst; - uint h, i; - - _lock_word |= 0x8000; - - dst = dx_lock_2(); - dst += y * _dx_surface_pitch + x * 8 + fcs->textColumnOffset; - - if (_language == 20) { - src = hebrew_video_font + (chr - 0x20) * 8; - } else if (_language == 5) { - src = spanish_video_font + (chr - 0x20) * 8; - } else - src = video_font + (chr - 0x20) * 8; - - color = fcs->text_color; - - h = 8; - do { - int8 b = *src++; - i = 0; - do { - if (b < 0) - dst[i] = color; - b <<= 1; - } while (++i != 6); - dst += _dx_surface_pitch; - } while (--h); - - dx_unlock_2(); - - _lock_word &= ~0x8000; -} - void SimonState::start_vga_code(uint b, uint vga_res, uint vga_struct_id, uint c, uint d, uint f) { VgaSprite *vsp; VgaPointersEntry *vpe; @@ -4489,141 +4067,6 @@ void SimonState::talk_with_text(uint num_1, uint num_2, const char *string_ptr, } } -void SimonState::render_string(uint num_1, uint color, uint width, uint height, const char *txt) { - VgaPointersEntry *vpe = &_vga_buffer_pointers[2]; - byte *src, *dst, *p, *dst_org, chr; - uint count; - - if (num_1 >= 100) { - num_1 -= 100; - vpe++; - } - - src = dst = vpe->vgaFile2; - - count = 4000; - if (num_1 == 1) - count *= 2; - - p = dst + num_1 * 8; - - *(uint16 *)(p + 4) = TO_BE_16(height); - *(uint16 *)(p + 6) = TO_BE_16(width); - dst += READ_BE_UINT32_UNALIGNED(p); - - memset(dst, 0, count); - - dst_org = dst; - while ((chr = *txt++) != 0) { - if (chr == 10) { - dst_org += width * 10; - dst = dst_org; - } else if ((chr -= ' ') == 0) { - dst += 6; - } else { - byte *img_hdr = src + 48 + chr * 4; - uint img_height = img_hdr[2]; - uint img_width = img_hdr[3], i; - byte *img = src + READ_LE_UINT16(img_hdr); - byte *cur_dst = dst; - - assert(img_width > 0 && img_width < 50 && img_height > 0 && img_height < 50); - - do { - for (i = 0; i != img_width; i++) { - chr = *img++; - if (chr) { - if (chr == 0xF) - chr = 207; - else - chr += color; - cur_dst[i] = chr; - } - } - cur_dst += width; - } while (--img_height); - - dst += img_width - 1; - } - } -} - -void SimonState::showmessage_print_char(byte chr) { - if (chr == 12) { - _num_letters_to_print = 0; - _print_char_unk_1 = 0; - print_char_helper_1(&chr, 1); - print_char_helper_5(_fcs_ptr_1); - } else if (chr == 0 || chr == ' ' || chr == 10) { - if (_print_char_unk_2 - _print_char_unk_1 >= _num_letters_to_print) { - _print_char_unk_1 += _num_letters_to_print; - print_char_helper_1(_letters_to_print_buf, _num_letters_to_print); - - if (_print_char_unk_1 == _print_char_unk_2) { - _print_char_unk_1 = 0; - } else { - if (chr) - print_char_helper_1(&chr, 1); - if (chr == 10) - _print_char_unk_1 = 0; - else if (chr != 0) - _print_char_unk_1++; - } - } else { - const byte newline_character = 10; - _print_char_unk_1 = _num_letters_to_print; - print_char_helper_1(&newline_character, 1); - print_char_helper_1(_letters_to_print_buf, _num_letters_to_print); - if (chr == ' ') { - print_char_helper_1(&chr, 1); - _print_char_unk_1++; - } else { - print_char_helper_1(&chr, 1); - _print_char_unk_1 = 0; - } - } - _num_letters_to_print = 0; - } else { - _letters_to_print_buf[_num_letters_to_print++] = chr; - } -} - -void SimonState::print_char_helper_1(const byte *src, uint len) { - uint ind; - - if (_fcs_ptr_1 == NULL) - return; - - while (len-- != 0) { - if (*src != 12 && _fcs_ptr_1->fcs_data != NULL && - _fcs_data_1[ind = get_fcs_ptr_3_index(_fcs_ptr_1)] != 2) { - - _fcs_data_1[ind] = 2; - _fcs_data_2[ind] = 1; - } - - fcs_putchar(*src++); - } -} - -void SimonState::print_char_helper_5(FillOrCopyStruct *fcs) { - uint index = get_fcs_ptr_3_index(fcs); - print_char_helper_6(index); - _fcs_data_1[index] = 0; -} - -void SimonState::print_char_helper_6(uint i) { - FillOrCopyStruct *fcs; - - if (_fcs_data_2[i]) { - lock(); - fcs = _fcs_ptr_array_3[i]; - fcs_unk_proc_1(i, fcs->fcs_data->item_ptr, fcs->fcs_data->unk1, fcs->fcs_data->unk2); - _fcs_data_2[i] = 0; - unlock(); - } -} - void SimonState::read_vga_from_datfile_1(uint vga_id) { if (_game & GF_AMIGAS || _game == GAME_SIMON1DEMO || _game == GAME_SIMON1DOS) { File in; |