comparison formats/src/th06/ecl.rs @ 774:d08eb4c9fce3

formats: Upgrade nom to version 8
author Link Mauve <linkmauve@linkmauve.fr>
date Mon, 29 Sep 2025 11:10:15 +0000
parents 21b186be2590
children 94033091458b
comparison
equal deleted inserted replaced
773:317e93b7d586 774:d08eb4c9fce3
1 //! ECL enemy script format support. 1 //! ECL enemy script format support.
2 2
3 use nom::{ 3 use nom::{
4 IResult, 4 IResult,
5 Parser,
5 number::complete::{le_u8, le_u16, le_u32, le_i16, le_i32, le_f32}, 6 number::complete::{le_u8, le_u16, le_u32, le_i16, le_i32, le_f32},
6 sequence::tuple,
7 multi::{count, many0}, 7 multi::{count, many0},
8 error::ErrorKind, 8 error::ErrorKind,
9 Err, 9 Err,
10 }; 10 };
11 use encoding_rs::SHIFT_JIS; 11 use encoding_rs::SHIFT_JIS;
327 135 => fn EnableSpellcardBonus(UNK1: i32), 327 135 => fn EnableSpellcardBonus(UNK1: i32),
328 } 328 }
329 329
330 fn parse_sub_instruction(input: &[u8]) -> IResult<&[u8], CallSub> { 330 fn parse_sub_instruction(input: &[u8]) -> IResult<&[u8], CallSub> {
331 let i = &input[..]; 331 let i = &input[..];
332 let (i, (time, opcode)) = tuple((le_i32, le_u16))(i)?; 332 let (i, (time, opcode)) = (le_i32, le_u16).parse(i)?;
333 if time == -1 || opcode == 0xffff { 333 if time == -1 || opcode == 0xffff {
334 return Err(Err::Error(nom::error::Error::new(i, ErrorKind::Eof))); 334 return Err(Err::Error(nom::error::Error::new(i, ErrorKind::Eof)));
335 } 335 }
336 336
337 let (i, (size, rank_mask, param_mask)) = tuple((le_u16, le_u16, le_u16))(i)?; 337 let (i, (size, rank_mask, param_mask)) = (le_u16, le_u16, le_u16).parse(i)?;
338 let rank_mask = Rank::from_bits(rank_mask).unwrap(); 338 let rank_mask = Rank::from_bits(rank_mask).unwrap();
339 let (i, instr) = parse_sub_instruction_args(i, opcode)?; 339 let (i, instr) = parse_sub_instruction_args(i, opcode)?;
340 assert_eq!(input.len() - i.len(), size as usize); 340 assert_eq!(input.len() - i.len(), size as usize);
341 let call = CallSub { time, rank_mask, param_mask, instr }; 341 let call = CallSub { time, rank_mask, param_mask, instr };
342 Ok((i, call)) 342 Ok((i, call))
343 } 343 }
344 344
345 fn parse_sub(i: &[u8]) -> IResult<&[u8], Sub> { 345 fn parse_sub(i: &[u8]) -> IResult<&[u8], Sub> {
346 let (i, instructions) = many0(parse_sub_instruction)(i)?; 346 let (i, instructions) = many0(parse_sub_instruction).parse(i)?;
347 let sub = Sub { instructions }; 347 let sub = Sub { instructions };
348 Ok((i, sub)) 348 Ok((i, sub))
349 } 349 }
350 350
351 fn parse_main_instruction(input: &[u8]) -> IResult<&[u8], CallMain> { 351 fn parse_main_instruction(input: &[u8]) -> IResult<&[u8], CallMain> {
352 let i = &input[..]; 352 let i = &input[..];
353 let (i, (time, sub)) = tuple((le_u16, le_u16))(i)?; 353 let (i, (time, sub)) = (le_u16, le_u16).parse(i)?;
354 if time == 0xffff && sub == 4 { 354 if time == 0xffff && sub == 4 {
355 return Err(Err::Error(nom::error::Error::new(i, ErrorKind::Eof))); 355 return Err(Err::Error(nom::error::Error::new(i, ErrorKind::Eof)));
356 } 356 }
357 357
358 let (i, (opcode, size)) = tuple((le_u16, le_u16))(i)?; 358 let (i, (opcode, size)) = (le_u16, le_u16).parse(i)?;
359 let size = size as usize; 359 let size = size as usize;
360 let (i, instr) = parse_main_instruction_args(i, opcode)?; 360 let (i, instr) = parse_main_instruction_args(i, opcode)?;
361 assert_eq!(input.len() - i.len(), size as usize); 361 assert_eq!(input.len() - i.len(), size as usize);
362 let call = CallMain { time, sub, instr }; 362 let call = CallMain { time, sub, instr };
363 Ok((i, call)) 363 Ok((i, call))
364 } 364 }
365 365
366 fn parse_main(i: &[u8]) -> IResult<&[u8], Main> { 366 fn parse_main(i: &[u8]) -> IResult<&[u8], Main> {
367 let (i, instructions) = many0(parse_main_instruction)(i)?; 367 let (i, instructions) = many0(parse_main_instruction).parse(i)?;
368 let main = Main { instructions }; 368 let main = Main { instructions };
369 Ok((i, main)) 369 Ok((i, main))
370 } 370 }
371 371
372 fn parse_ecl(input: &[u8]) -> IResult<&[u8], Ecl> { 372 fn parse_ecl(input: &[u8]) -> IResult<&[u8], Ecl> {
373 let i = input; 373 let i = input;
374 374
375 let (i, (sub_count, main_count)) = tuple((le_u16, le_u16))(i)?; 375 let (i, (sub_count, main_count)) = (le_u16, le_u16).parse(i)?;
376 let sub_count = sub_count as usize; 376 let sub_count = sub_count as usize;
377 377
378 if main_count != 0 { 378 if main_count != 0 {
379 // TODO: use a better error. 379 // TODO: use a better error.
380 return Err(Err::Error(nom::error::Error::new(i, ErrorKind::Eof))); 380 return Err(Err::Error(nom::error::Error::new(i, ErrorKind::Eof)));
381 } 381 }
382 382
383 let (_, (main_offsets, sub_offsets)) = tuple(( 383 let (_, (main_offsets, sub_offsets)) = (
384 count(le_u32, 3), 384 count(le_u32, 3),
385 count(le_u32, sub_count), 385 count(le_u32, sub_count),
386 ))(i)?; 386 ).parse(i)?;
387 387
388 // Read all subs. 388 // Read all subs.
389 let mut subs = Vec::new(); 389 let mut subs = Vec::new();
390 for offset in sub_offsets.into_iter().map(|offset| offset as usize) { 390 for offset in sub_offsets.into_iter().map(|offset| offset as usize) {
391 let (_, sub) = parse_sub(&input[offset..])?; 391 let (_, sub) = parse_sub(&input[offset..])?;