Skip to content

Commit

Permalink
Text parsing in .DTm
Browse files Browse the repository at this point in the history
  • Loading branch information
LedinecMing committed Nov 15, 2024
1 parent db4ad3e commit d54235a
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 9 deletions.
50 changes: 42 additions & 8 deletions dt_lib/src/map/convert.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ use bytes::*;
use bzip2::*;
use encoding_rs::*;
use num_enum::{Default, FromPrimitive, IntoPrimitive};
use core::str;
use std::{
fs,
fs::File,
Expand Down Expand Up @@ -225,7 +226,7 @@ pub struct EventData {
pub repeat_after_answ_yes_checkmark: u8, // 150
pub _empty4: [u8; 14], // 151-163
pub custom_picture_for_event: u16, // 164-???(165) кол-во байт кастомной картинки к событию, которая лежит в файле после текстовых данных.
pub _empty5: [u8; 6], // 166-171
pub _empty5: [u8; 5], // 166-171
}
#[repr(packed(1))]
#[derive(FromBytes, Unaligned, Debug, Clone)]
Expand Down Expand Up @@ -341,8 +342,9 @@ pub struct LightOrEvent {
pub y: u16,
pub id: u8,
pub map_model: u8,
pub empty: [u8; 33],
pub _empty: [u8; 33],
pub light_radius: u8,
pub _empty1: [u8; 59]
}
#[derive(FromBytes, Unaligned, PartialEq, Eq, Debug, Copy, Clone)]
#[repr(packed(1))]
Expand All @@ -357,6 +359,9 @@ pub struct MapData {
pub map: Vec<u8>,
pub decos: Vec<Decoration>,
pub armies: Vec<ArmyData>,
pub lanterns: Vec<LightOrEvent>,
pub events: Vec<EventData>,
pub text: Vec<String>
}
pub fn parse_dtm_map(path: &Path) -> Result<MapData, ()> {
let mut buf: bytes::Bytes = {
Expand Down Expand Up @@ -408,7 +413,7 @@ pub fn parse_dtm_map(path: &Path) -> Result<MapData, ()> {
let mut armies_data = data.copy_to_bytes(settings.armies_size as usize);
let mut lanterns_data = data.copy_to_bytes(settings.lanterns_size as usize);
let mut events_data = data.copy_to_bytes(settings.events_size as usize);
// let mut texts_data = data.copy_to_bytes(settings.text_size as usize);
let mut texts_data = data;
dbg!(surface_data.remaining());
fn parse_by_2_bytes(mut bytes: Bytes) -> Vec<u8> {
let mut map = vec![];
Expand Down Expand Up @@ -443,11 +448,37 @@ pub fn parse_dtm_map(path: &Path) -> Result<MapData, ()> {
fn parse_lanterns(bytes: Bytes) -> Vec<LightOrEvent> {
parse_vec_by_bytes(bytes)
}
fn parse_text(mut bytes: Bytes) -> Vec<String> {
fn parse_text(bytes: &mut Bytes) -> Vec<String> {
fn copy_until(bytes: &mut Bytes, amount: usize, until: &[u8]) -> Vec<u8> {
let mut buf = vec![];
loop {
if bytes.is_empty() {
break buf;
}
let copy = bytes.copy_to_bytes(amount);
if copy.as_bytes() == until {
break buf;
} else {
buf.extend_from_slice(copy.as_bytes());
}
}
}
const TEXT_SECTION_START: [u8; 8] = *b"\x00>-Text-";
let section = bytes.copy_to_bytes(TEXT_SECTION_START.len());
if section.as_bytes() != TEXT_SECTION_START {
println!("Wrong text section start {:?} {:?}", section.as_bytes(), str::from_utf8(section.as_bytes()));
}
let mut text_buffer = vec![];
for i in bytes.utf8_chunks() {
println!("{}", i.valid());
}
loop {
let buf = copy_until(bytes, 1, &[0]);
let string = if buf.is_empty() {
String::new()
} else { WINDOWS_1251.decode(&buf).0.to_string() };
if string.contains("LIT") || bytes.is_empty() {
break;
}
text_buffer.push(string);
}
text_buffer
}
let mut map = parse_by_2_bytes(surface_data);
Expand All @@ -456,13 +487,16 @@ pub fn parse_dtm_map(path: &Path) -> Result<MapData, ()> {
let buildings = parse_buildings(buildings_data);
let lanterns = parse_lanterns(lanterns_data);
let events = parse_events(events_data);
//let texts = parse_text(texts_data);
let text = parse_text(&mut texts_data);
Ok(MapData {
settings,
buildings,
decos,
map,
events,
lanterns,
armies,
text,
})
}
mod test {
Expand Down
18 changes: 17 additions & 1 deletion dtm_info/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ use std::path::{Path, PathBuf};

use clap::*;
use dt_lib::map::convert::{
parse_dtm_map, ArmyTroopsData, BuildingData, GarrisonUnit, HeroInfoData, PatrolData, ToBool,
parse_dtm_map, ArmyTroopsData, BuildingData, EventData, GarrisonUnit, HeroInfoData, PatrolData, ToBool
};
use zerocopy::FromZeros;
#[derive(Parser)]
Expand All @@ -16,6 +16,12 @@ struct Args {
/// To show buildings info
#[arg(short, default_value_t = false)]
buildings: bool,
/// To show texts
#[arg(short, default_value_t = false)]
texts: bool,
/// To show events
#[arg(short, default_value_t = false)]
events: bool,
/// To show map
#[arg(short, default_value_t = false)]
map: bool,
Expand Down Expand Up @@ -337,4 +343,14 @@ fn main() {
if_not_zero(empty6, |empty6| println!("Empty6/ is: {:?}", empty6));
if_not_zero(empty7, |empty7| println!("Empty7/ is: {:?}", empty7));
}
if args.events {
dbg!(data.events);
}
if args.texts {
for text in data.text {
if !text.is_empty() {
print!("{} | ", text);
}
}
}
}

0 comments on commit d54235a

Please sign in to comment.