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::{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, 32),
description: utf8_to_utf16_array!(category.description, 122),
}
})
.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, 32),
description: utf8_to_utf16_array!(quest.description, 122),
}
})
.collect();
QuestOptionList {
quests: quest_entries,
}
}
pub fn quest_detail(quest: &Quest) -> QuestDetail {
QuestDetail {
description: utf8_to_utf16_array!(quest.full_description, 288),
}
}
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, 16),
length: data_blob.len() as u32,
name: utf8_to_array!(path, 16),
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,
}
}