render = as white circle (closes #110)

This commit is contained in:
Sallai József 2022-07-23 14:57:40 +03:00
parent 6f95e6109c
commit 0415f917f8
5 changed files with 57 additions and 13 deletions

View File

@ -267,7 +267,11 @@ impl BMFontRenderer {
for chr in iter { for chr in iter {
if let Some(glyph) = self.font.chars.get(&chr) { if let Some(glyph) = self.font.chars.get(&chr) {
if let Some(rect) = rect_map.get(&chr) { if let Some(rect) = rect_map.get(&chr) {
sprite_rects.push((offset_x, self.line_height(constants) - rect.height() as f32 / 2.0, rect)); sprite_rects.push((
offset_x,
y + self.line_height(constants) / 2.0 - rect.height() as f32 / 2.0,
rect,
));
offset_x += rect.width() as f32; offset_x += rect.width() as f32;
} else { } else {
batch.add_rect_scaled_tinted( batch.add_rect_scaled_tinted(
@ -308,7 +312,11 @@ impl BMFontRenderer {
for (chr, glyph) in chars.iter() { for (chr, glyph) in chars.iter() {
if let Some(rect) = rect_map.get(&chr) { if let Some(rect) = rect_map.get(&chr) {
sprite_rects.push((offset_x, self.line_height(constants) - rect.height() as f32 / 2.0, rect)); sprite_rects.push((
offset_x,
y + self.line_height(constants) / 2.0 - rect.height() as f32 / 2.0,
rect,
));
offset_x += rect.width() as f32; offset_x += rect.width() as f32;
} else { } else {
if glyph.page == page { if glyph.page == page {

View File

@ -225,21 +225,25 @@ impl GameEntity<()> for TextBoxes {
for (idx, line) in lines.iter().enumerate() { for (idx, line) in lines.iter().enumerate() {
if !line.is_empty() { if !line.is_empty() {
if state.constants.textscript.text_shadow { if state.constants.textscript.text_shadow {
state.font.draw_text_with_shadow( state.font.draw_text_with_shadow_and_rects(
line.iter().copied(), line.iter().copied(),
left_pos + text_offset + 14.0, left_pos + text_offset + 14.0,
top_pos + 10.0 + idx as f32 * 16.0 - y_offset, top_pos + 10.0 + idx as f32 * 16.0 - y_offset,
&state.constants, &state.constants,
&mut state.texture_set, &mut state.texture_set,
&state.textscript_vm.substitution_rect_map,
Some("TextBox".into()),
ctx, ctx,
)?; )?;
} else { } else {
state.font.draw_text( state.font.draw_text_with_rects(
line.iter().copied(), line.iter().copied(),
left_pos + text_offset + 14.0, left_pos + text_offset + 14.0,
top_pos + 10.0 + idx as f32 * 16.0 - y_offset, top_pos + 10.0 + idx as f32 * 16.0 - y_offset,
&state.constants, &state.constants,
&mut state.texture_set, &mut state.texture_set,
&state.textscript_vm.substitution_rect_map,
Some("TextBox".into()),
ctx, ctx,
)?; )?;
} }
@ -251,15 +255,27 @@ impl GameEntity<()> for TextBoxes {
if tick > 10 { if tick > 10 {
let (mut x, y) = match state.textscript_vm.current_line { let (mut x, y) = match state.textscript_vm.current_line {
TextScriptLine::Line1 => ( TextScriptLine::Line1 => (
state.font.text_width(state.textscript_vm.line_1.iter().copied(), &state.constants), state.font.text_width_with_rects(
state.textscript_vm.line_1.iter().copied(),
&state.textscript_vm.substitution_rect_map,
&state.constants,
),
top_pos + 10.0, top_pos + 10.0,
), ),
TextScriptLine::Line2 => ( TextScriptLine::Line2 => (
state.font.text_width(state.textscript_vm.line_2.iter().copied(), &state.constants), state.font.text_width_with_rects(
state.textscript_vm.line_2.iter().copied(),
&state.textscript_vm.substitution_rect_map,
&state.constants,
),
top_pos + 10.0 + 16.0, top_pos + 10.0 + 16.0,
), ),
TextScriptLine::Line3 => ( TextScriptLine::Line3 => (
state.font.text_width(state.textscript_vm.line_3.iter().copied(), &state.constants), state.font.text_width_with_rects(
state.textscript_vm.line_3.iter().copied(),
&state.textscript_vm.substitution_rect_map,
&state.constants,
),
top_pos + 10.0 + 32.0, top_pos + 10.0 + 32.0,
), ),
}; };

View File

@ -222,6 +222,7 @@ pub struct TextScriptConsts {
pub textbox_rect_bottom: Rect<u16>, pub textbox_rect_bottom: Rect<u16>,
pub textbox_rect_yes_no: Rect<u16>, pub textbox_rect_yes_no: Rect<u16>,
pub textbox_rect_cursor: Rect<u16>, pub textbox_rect_cursor: Rect<u16>,
pub textbox_item_marker_rect: Rect<u16>,
pub inventory_rect_top: Rect<u16>, pub inventory_rect_top: Rect<u16>,
pub inventory_rect_middle: Rect<u16>, pub inventory_rect_middle: Rect<u16>,
pub inventory_rect_bottom: Rect<u16>, pub inventory_rect_bottom: Rect<u16>,
@ -1486,6 +1487,7 @@ impl EngineConstants {
textbox_rect_bottom: Rect { left: 0, top: 16, right: 244, bottom: 24 }, textbox_rect_bottom: Rect { left: 0, top: 16, right: 244, bottom: 24 },
textbox_rect_yes_no: Rect { left: 152, top: 48, right: 244, bottom: 80 }, textbox_rect_yes_no: Rect { left: 152, top: 48, right: 244, bottom: 80 },
textbox_rect_cursor: Rect { left: 112, top: 88, right: 128, bottom: 104 }, textbox_rect_cursor: Rect { left: 112, top: 88, right: 128, bottom: 104 },
textbox_item_marker_rect: Rect { left: 64, top: 48, right: 70, bottom: 54 },
inventory_rect_top: Rect { left: 0, top: 0, right: 244, bottom: 8 }, inventory_rect_top: Rect { left: 0, top: 0, right: 244, bottom: 8 },
inventory_rect_middle: Rect { left: 0, top: 8, right: 244, bottom: 16 }, inventory_rect_middle: Rect { left: 0, top: 8, right: 244, bottom: 16 },
inventory_rect_bottom: Rect { left: 0, top: 16, right: 244, bottom: 24 }, inventory_rect_bottom: Rect { left: 0, top: 16, right: 244, bottom: 24 },

View File

@ -133,6 +133,7 @@ pub struct TextScriptVM {
pub current_illustration: Option<String>, pub current_illustration: Option<String>,
pub illustration_state: IllustrationState, pub illustration_state: IllustrationState,
prev_char: char, prev_char: char,
pub substitution_rect_map: HashMap<char, Rect<u16>>,
} }
pub struct Scripts { pub struct Scripts {
@ -199,6 +200,7 @@ impl TextScriptVM {
current_illustration: None, current_illustration: None,
illustration_state: IllustrationState::Hidden, illustration_state: IllustrationState::Hidden,
prev_char: '\x00', prev_char: '\x00',
substitution_rect_map: HashMap::new(),
} }
} }
@ -234,6 +236,10 @@ impl TextScriptVM {
scripts.stage_select_script = script; scripts.stage_select_script = script;
} }
pub fn set_substitution_rect_map(&mut self, rect_map: HashMap<char, Rect<u16>>) {
self.substitution_rect_map = rect_map;
}
pub fn reset(&mut self) { pub fn reset(&mut self) {
self.state = TextScriptExecutionState::Ended; self.state = TextScriptExecutionState::Ended;
self.flags.0 = 0; self.flags.0 = 0;
@ -347,8 +353,11 @@ impl TextScriptVM {
state.textscript_vm.prev_char = chr; state.textscript_vm.prev_char = chr;
state.textscript_vm.line_1.push(chr); state.textscript_vm.line_1.push(chr);
let text_len = let text_len = state.font.text_width_with_rects(
state.font.text_width(state.textscript_vm.line_1.iter().copied(), &state.constants); state.textscript_vm.line_1.iter().copied(),
&state.textscript_vm.substitution_rect_map,
&state.constants,
);
if text_len >= 284.0 { if text_len >= 284.0 {
state.textscript_vm.current_line = TextScriptLine::Line2; state.textscript_vm.current_line = TextScriptLine::Line2;
} }
@ -357,8 +366,11 @@ impl TextScriptVM {
state.textscript_vm.prev_char = chr; state.textscript_vm.prev_char = chr;
state.textscript_vm.line_2.push(chr); state.textscript_vm.line_2.push(chr);
let text_len = let text_len = state.font.text_width_with_rects(
state.font.text_width(state.textscript_vm.line_2.iter().copied(), &state.constants); state.textscript_vm.line_2.iter().copied(),
&state.textscript_vm.substitution_rect_map,
&state.constants,
);
if text_len >= 284.0 { if text_len >= 284.0 {
state.textscript_vm.current_line = TextScriptLine::Line3; state.textscript_vm.current_line = TextScriptLine::Line3;
} }
@ -367,8 +379,11 @@ impl TextScriptVM {
state.textscript_vm.prev_char = chr; state.textscript_vm.prev_char = chr;
state.textscript_vm.line_3.push(chr); state.textscript_vm.line_3.push(chr);
let text_len = let text_len = state.font.text_width_with_rects(
state.font.text_width(state.textscript_vm.line_3.iter().copied(), &state.constants); state.textscript_vm.line_3.iter().copied(),
&state.textscript_vm.substitution_rect_map,
&state.constants,
);
if text_len >= 284.0 { if text_len >= 284.0 {
new_line = true; new_line = true;
} }

View File

@ -522,6 +522,9 @@ impl SharedGameState {
let stage_select_script = TextScript::load_from(stage_select_tsc, &self.constants)?; let stage_select_script = TextScript::load_from(stage_select_tsc, &self.constants)?;
self.textscript_vm.set_stage_select_script(stage_select_script); self.textscript_vm.set_stage_select_script(stage_select_script);
let substitution_rect_map = HashMap::from([('=', self.constants.textscript.textbox_item_marker_rect)]);
self.textscript_vm.set_substitution_rect_map(substitution_rect_map);
let credit_tsc = filesystem::open_find(ctx, &self.constants.base_paths, "Credit.tsc")?; let credit_tsc = filesystem::open_find(ctx, &self.constants.base_paths, "Credit.tsc")?;
let credit_script = CreditScript::load_from(credit_tsc, &self.constants)?; let credit_script = CreditScript::load_from(credit_tsc, &self.constants)?;
self.creditscript_vm.set_script(credit_script); self.creditscript_vm.set_script(credit_script);