You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

69 lines
2.0 KiB

use quests::{Quest, QuestList};
use libpso::packet::ship::*;
use libpso::util::{utf8_to_array, utf8_to_utf16_array};
pub const QUEST_CATEGORY_MENU_ID: u32 = 0xA2;
pub const QUEST_SELECT_MENU_ID: u32 = 0xA3;
pub fn quest_category_list(quests: &QuestList) -> QuestCategoryList {
let categories = quests.iter()
.enumerate()
.map(|(i, (category, _))| {
QuestCategory {
menu_id: QUEST_CATEGORY_MENU_ID,
option_id: i as u32,
name: utf8_to_utf16_array(&category.name),
description: utf8_to_utf16_array(&category.description),
}
})
.collect();
QuestCategoryList {
quest_categories: categories,
}
}
pub fn quest_list(category_id: u32, quests: &[Quest]) -> QuestOptionList {
let quest_entries = quests.iter()
.map(|quest| {
QuestEntry {
menu_id: QUEST_SELECT_MENU_ID,
category_id: category_id as u16,
quest_id: quest.id,
name: utf8_to_utf16_array(&quest.name),
description: utf8_to_utf16_array(&quest.description),
}
})
.collect();
QuestOptionList {
quests: quest_entries,
}
}
pub fn quest_detail(quest: &Quest) -> QuestDetail {
QuestDetail {
description: utf8_to_utf16_array(&quest.full_description),
}
}
pub fn quest_header(quest_menu_select: &QuestMenuSelect, data_blob: &[u8], suffix: &str) -> QuestHeader {
let path = format!("{}-{}.{}", quest_menu_select.category, quest_menu_select.quest, suffix);
QuestHeader {
unknown1: [0; 0x24],
filename: utf8_to_array(&path),
length: data_blob.len() as u32,
name: utf8_to_array(&path),
unknown2: [0; 8],
}
}
pub fn quest_chunk(chunk_num: u32, filename: [u8; 16], blob: [u8; 0x400], blob_length: usize) -> QuestChunk {
QuestChunk {
chunk_num,
filename,
blob,
blob_length: blob_length as u32,
unknown: 0,
}
}