/** * Script to convert trusts.txt to JSON format */ const fs = require('fs'); // Read the trusts.txt file const trustsText = fs.readFileSync('trusts.txt', 'utf8'); // Define the sections we want to extract const sections = [ 'Job', 'Spells', 'Abilities', 'Weapon Skills', 'Acquisition', 'Special Features', 'Trust Synergy' ]; // Function to parse the trusts data function parseTrustsData(text) { // First, let's clean up the text and split it into character entries const cleanedText = text.replace(/\r\n/g, '\n'); // Split by character name pattern (name followed by "Job") const characterEntries = cleanedText.split(/\n\n(?=[A-Za-z][A-Za-z\s\-']+\n(?:Job|Spells|Abilities|Weapon Skills|Acquisition|Special Features|Trust Synergy))/); const characters = []; // Process each character entry for (const entry of characterEntries) { if (!entry.trim()) continue; // Extract the character name (first line) const lines = entry.split('\n'); const name = lines[0].trim(); // Skip if this doesn't look like a character name if (!name || name.length > 50 || name.includes(':') || name.includes('\t')) continue; // Create a new character entry const character = { name: name, role: '' }; // Extract role from char_list.txt if available try { const charList = fs.readFileSync('char_list.txt', 'utf8'); const roleRegex = new RegExp(`(Tank|Melee Fighter|Ranged Fighter|Offensive Caster|Healer|Support|Special|Unity Concord)\\s*\\n[^\\n]*${name}\\b`, 'i'); const roleMatch = charList.match(roleRegex); if (roleMatch) { character.role = roleMatch[1]; } } catch (err) { // If char_list.txt can't be read, continue without role information } // Process the character's data let currentSection = ''; let sectionContent = ''; // Skip the name line for (let i = 1; i < lines.length; i++) { const line = lines[i].trim(); if (!line) continue; // Check for section headers let sectionFound = false; for (const section of sections) { if (line.startsWith(section)) { // If we were collecting content for a previous section, save it if (currentSection) { character[currentSection] = sectionContent.trim(); } // Start a new section currentSection = section.toLowerCase().replace(/\s+/g, '_'); sectionContent = line.substring(section.length).trim(); sectionFound = true; break; } } // If no section header was found, add content to the current section if (!sectionFound && currentSection) { sectionContent += '\n' + line; } else if (!sectionFound && !currentSection) { // This is part of the character's basic info (like Job) if (line.startsWith('Job')) { character.job = line; } } } // Save the last section if there is one if (currentSection) { character[currentSection] = sectionContent.trim(); } characters.push(character); } return characters; } // Parse the data const characters = parseTrustsData(trustsText); // Write the JSON file fs.writeFileSync('trusts.json', JSON.stringify(characters, null, 2)); console.log(`Converted ${characters.length} characters to JSON format.`);