map name, camera and other fixes

This commit is contained in:
Alula 2020-09-05 01:47:09 +02:00
parent 497d29a9c4
commit cb066cbf9c
No known key found for this signature in database
GPG Key ID: 3E00485503A1D8BA
5 changed files with 65 additions and 15 deletions

View File

@ -49,6 +49,18 @@ impl BMFontRenderer {
})
}
pub fn text_width<I: Iterator<Item=char>>(&self, iter: I, constants: &EngineConstants) -> f32 {
let mut offset_x = 0.0;
for chr in iter {
if let Some(glyph) = self.font.chars.get(&chr) {
offset_x += ((glyph.width as f32 + glyph.xoffset as f32) * constants.font_scale).floor() + if chr != ' ' { 1.0 } else { constants.font_space_offset };
}
}
offset_x
}
pub fn draw_text<I: Iterator<Item=char>>(&self, iter: I, x: f32, y: f32, constants: &EngineConstants, texture_set: &mut TextureSet, ctx: &mut Context) -> GameResult {
if self.pages.len() == 1 {
let batch = texture_set.get_or_load_batch(ctx, constants, self.pages.get(0).unwrap())?;

View File

@ -14,12 +14,30 @@ impl Frame {
self.x = -(((state.canvas_size.0 as isize - ((stage.map.width - 1) * 16) as isize) * 0x200) / 2);
} else {
self.x = player.target_x - (state.canvas_size.0 as isize * 0x200 / 2);
if self.x < 0 {
self.x = 0;
}
let max_x = (((stage.map.width as isize - 1) * 16) - state.canvas_size.0 as isize) * 0x200;
if self.x > max_x {
self.x = max_x;
}
}
if (stage.map.height - 1) * 16 < state.canvas_size.1 as usize {
self.y = -(((state.canvas_size.1 as isize - ((stage.map.height - 1) * 16) as isize) * 0x200) / 2);
} else {
self.y = player.target_y - (state.canvas_size.1 as isize * 0x200 / 2);
if self.y < 0 {
self.y = 0;
}
let max_y = (((stage.map.height as isize - 1) * 16) - state.canvas_size.1 as isize) * 0x200;
if self.y > max_y {
self.y = max_y;
}
}
}

View File

@ -24,8 +24,9 @@ pub struct GameScene {
pub npc_map: NPCMap,
tex_background_name: String,
tex_tileset_name: String,
life_bar: usize,
life_bar_count: usize,
life_bar: u16,
life_bar_counter: u16,
map_name_counter: u16,
}
#[derive(Debug, EnumIter, PartialEq, Eq, Hash, Copy, Clone)]
@ -65,10 +66,15 @@ impl GameScene {
tex_background_name,
tex_tileset_name,
life_bar: 3,
life_bar_count: 0,
life_bar_counter: 0,
map_name_counter: 0,
})
}
pub fn display_map_name(&mut self, ticks: u16) {
self.map_name_counter = ticks;
}
fn draw_number(&self, x: f32, y: f32, val: usize, align: Alignment, state: &mut SharedGameState, ctx: &mut Context) -> GameResult {
let batch = state.texture_set.get_or_load_batch(ctx, &state.constants, "TextBox")?;
let n = val.to_string();
@ -409,7 +415,7 @@ impl Scene for GameScene {
let npcs = self.stage.load_npcs(&state.base_path, ctx)?;
for npc_data in npcs.iter() {
let mut npc = self.npc_map.create_npc_from_data(&state.npc_table, npc_data);
let npc = self.npc_map.create_npc_from_data(&state.npc_table, npc_data);
if npc.npc_flags.appear_when_flag_set() {
if let Some(true) = state.game_flags.get(npc_data.flag_id as usize) {
npc.cond.set_alive(true);
@ -426,6 +432,8 @@ impl Scene for GameScene {
state.npc_table.tex_npc1_name = ["Npc/", &self.stage.data.npc1.filename()].join("");
state.npc_table.tex_npc2_name = ["Npc/", &self.stage.data.npc2.filename()].join("");
self.player.target_x = self.player.x;
self.player.target_y = self.player.y;
self.frame.immediate_update(state, &self.player, &self.stage);
//self.player.equip.set_booster_2_0(true);
Ok(())
@ -471,20 +479,24 @@ impl Scene for GameScene {
if state.control_flags.control_enabled() {
// update health bar
if self.life_bar < self.player.life as usize {
self.life_bar = self.player.life as usize;
if self.life_bar < self.player.life as u16 {
self.life_bar = self.player.life as u16;
}
if self.life_bar > self.player.life as usize {
self.life_bar_count += 1;
if self.life_bar_count > 30 {
if self.life_bar > self.player.life as u16 {
self.life_bar_counter += 1;
if self.life_bar_counter > 30 {
self.life_bar -= 1;
}
} else {
self.life_bar_count = 0;
self.life_bar_counter = 0;
}
}
if self.map_name_counter > 0 {
self.map_name_counter -= 1;
}
TextScriptVM::run(state, self, ctx)?;
self.tick = self.tick.wrapping_add(1);
Ok(())
@ -506,6 +518,13 @@ impl Scene for GameScene {
self.draw_hud(state, ctx)?;
}
if self.map_name_counter > 0 {
let width = state.font.text_width(self.stage.data.name.chars(), &state.constants);
state.font.draw_text(self.stage.data.name.chars(),
((state.canvas_size.0 - width) / 2.0).floor(), 80.0,
&state.constants, &mut state.texture_set, ctx)?;
}
self.draw_fade(state, ctx)?;
self.draw_text_boxes(state, ctx)?;

View File

@ -643,6 +643,11 @@ impl TextScriptVM {
exec_state = TextScriptExecutionState::Running(event, cursor.position() as u32);
}
OpCode::MNA => {
game_scene.display_map_name(160);
exec_state = TextScriptExecutionState::Running(event, cursor.position() as u32);
}
OpCode::CMU => {
let song_id = read_cur_varint(&mut cursor)? as usize;
state.sound_manager.play_song(song_id, &state.constants, ctx)?;
@ -663,7 +668,7 @@ impl TextScriptVM {
// Zero operands
OpCode::AEp | OpCode::CAT | OpCode::CIL | OpCode::CPS |
OpCode::CRE | OpCode::CSS | OpCode::ESC | OpCode::FLA |
OpCode::INI | OpCode::LDP | OpCode::MLP | OpCode::MNA |
OpCode::INI | OpCode::LDP | OpCode::MLP |
OpCode::SAT | OpCode::SLP | OpCode::SPS |
OpCode::STC | OpCode::SVP | OpCode::TUR | OpCode::WAS | OpCode::ZAM => {
log::warn!("unimplemented opcode: {:?}", op);

View File

@ -185,8 +185,4 @@ impl TextureSet {
Ok(self.tex_map.get_mut(name).unwrap())
}
pub fn draw_text(&mut self, ctx: &mut Context, text: &str) -> GameResult {
Ok(())
}
}