diff --git a/server/src/bin/generate_corporations/main.rs b/server/src/bin/generate_corporations/main.rs index d927d72e5..225e31e6b 100644 --- a/server/src/bin/generate_corporations/main.rs +++ b/server/src/bin/generate_corporations/main.rs @@ -477,8 +477,7 @@ fn assign_brands( .iter() .filter(|com| { // Fuzzy match: commodity words appear in specialization - com.split('_') - .any(|word| spec.contains(word)) + com.split('_').any(|word| spec.contains(word)) }) .count() as f64; (*c, 1.0 + relevance) @@ -733,11 +732,7 @@ fn fill_coverage_gaps( let corp_id = make_corp_id(&name); // Generate enough to reach the 3-corp minimum - let current_count = report - .commodity_coverage - .get(com_id) - .copied() - .unwrap_or(0); + let current_count = report.commodity_coverage.get(com_id).copied().unwrap_or(0); for _ in current_count..3 { let n = names::generate_name(rng, sector, &lore.category); let cid = make_corp_id(&n); @@ -793,7 +788,10 @@ fn write_output(path: &PathBuf, generated: &BTreeMap) { out.push_str(&format!("location_id = {:?}\n", corp.location_id)); out.push_str(&format!("location_type = {:?}\n", corp.location_type)); out.push_str(&format!("system_id = {:?}\n", corp.system_id)); - out.push_str(&format!("geographic_sector = {:?}\n", corp.geographic_sector)); + out.push_str(&format!( + "geographic_sector = {:?}\n", + corp.geographic_sector + )); let brands_str: Vec = corp.brands.iter().map(|b| format!("{:?}", b)).collect(); out.push_str(&format!("brands = [{}]\n", brands_str.join(", "))); out.push('\n'); @@ -952,10 +950,7 @@ fn main() { // Print coverage summary println!("\n Coverage Report:"); println!(" Total generated: {}", report.total_generated); - println!( - " Systems with presence: {}", - report.system_coverage.len() - ); + println!(" Systems with presence: {}", report.system_coverage.len()); let mut by_sector: BTreeMap = BTreeMap::new(); for corp in generated.values() { @@ -984,10 +979,7 @@ fn main() { // Write output write_output(&cli.output, &generated); - println!( - "\n Output written to: {}", - cli.output.display() - ); + println!("\n Output written to: {}", cli.output.display()); println!(" Done.\n"); } diff --git a/server/src/bin/generate_corporations/names.rs b/server/src/bin/generate_corporations/names.rs index beb5064d5..2eff3d766 100644 --- a/server/src/bin/generate_corporations/names.rs +++ b/server/src/bin/generate_corporations/names.rs @@ -16,79 +16,326 @@ use rand_chacha::ChaCha8Rng; /// Core systems: cosmopolitan mix — the Reach's center of gravity. const CORE_NAMES: &[&str] = &[ - "Alvarez", "Benoit", "Carvalho", "Durand", "Eriksen", "Fournier", "Gao", - "Hartmann", "Ishida", "Johansson", "Kirchner", "Lemaire", "Moreau", - "Nakamura", "Olsson", "Pelletier", "Richter", "Saito", "Torres", - "Ueda", "Vasquez", "Werner", "Xu", "Yamada", "Zhou", "Andersen", - "Beaumont", "Costa", "Delacroix", "Engel", "Fujita", "Gutierrez", - "Hayashi", "Ibarra", "Jensen", "Klein", "Laurent", "Mercier", - "Novak", "Ortiz", "Park", "Reuter", "Suzuki", "Takahashi", - "Ulrich", "Valentin", "Wagner", "Xie", "Yilmaz", "Zhang", + "Alvarez", + "Benoit", + "Carvalho", + "Durand", + "Eriksen", + "Fournier", + "Gao", + "Hartmann", + "Ishida", + "Johansson", + "Kirchner", + "Lemaire", + "Moreau", + "Nakamura", + "Olsson", + "Pelletier", + "Richter", + "Saito", + "Torres", + "Ueda", + "Vasquez", + "Werner", + "Xu", + "Yamada", + "Zhou", + "Andersen", + "Beaumont", + "Costa", + "Delacroix", + "Engel", + "Fujita", + "Gutierrez", + "Hayashi", + "Ibarra", + "Jensen", + "Klein", + "Laurent", + "Mercier", + "Novak", + "Ortiz", + "Park", + "Reuter", + "Suzuki", + "Takahashi", + "Ulrich", + "Valentin", + "Wagner", + "Xie", + "Yilmaz", + "Zhang", ]; /// North reach: Nordic, Scottish, northern European — Calloway heritage. const NORTH_REACH_NAMES: &[&str] = &[ - "Andersson", "Bjornsson", "Calloway", "Dalsgaard", "Eklund", "Falk", - "Grimstad", "Hedlund", "Ivarsson", "Jonasson", "Kirkpatrick", "Lindqvist", - "MacLeod", "Nordstrom", "Olafsson", "Pettersson", "Rehn", "Strandberg", - "Thorsen", "Ulvskog", "Vikstrom", "Wahlberg", "Aberg", "Berglund", - "Carlsen", "Dalgaard", "Engstrom", "Forsell", "Gustafsson", "Halvorsen", - "Ingvarsson", "Jansson", "Knudsen", "Lundin", "MacPherson", "Nylund", - "Ostergaard", "Palsson", "Rasmussen", "Sjoberg", "Toft", "Ulfsson", - "Vestergaard", "Wiklund", "Aasen", "Brannstrom", "Dahl", "Eide", - "Friberg", "Gren", + "Andersson", + "Bjornsson", + "Calloway", + "Dalsgaard", + "Eklund", + "Falk", + "Grimstad", + "Hedlund", + "Ivarsson", + "Jonasson", + "Kirkpatrick", + "Lindqvist", + "MacLeod", + "Nordstrom", + "Olafsson", + "Pettersson", + "Rehn", + "Strandberg", + "Thorsen", + "Ulvskog", + "Vikstrom", + "Wahlberg", + "Aberg", + "Berglund", + "Carlsen", + "Dalgaard", + "Engstrom", + "Forsell", + "Gustafsson", + "Halvorsen", + "Ingvarsson", + "Jansson", + "Knudsen", + "Lundin", + "MacPherson", + "Nylund", + "Ostergaard", + "Palsson", + "Rasmussen", + "Sjoberg", + "Toft", + "Ulfsson", + "Vestergaard", + "Wiklund", + "Aasen", + "Brannstrom", + "Dahl", + "Eide", + "Friberg", + "Gren", ]; /// South reach: Eastern European, East Asian industrial — Stalownia corridor. const SOUTH_REACH_NAMES: &[&str] = &[ - "Adamski", "Baranov", "Chernov", "Dubois", "Egorov", "Filipov", - "Gromov", "Horvat", "Ivanova", "Jankovic", "Kowalski", "Lazarev", - "Morozov", "Novikov", "Ostrowski", "Petrov", "Reznik", "Sokolov", - "Tkachenko", "Uvarov", "Volkov", "Wojcik", "Yakimov", "Zheng", - "Babic", "Chernyshev", "Dragunov", "Fedorov", "Grushevsky", "Havel", - "Ito", "Jovanovic", "Katsaros", "Lebedev", "Mazur", "Nemec", - "Ochoa", "Popov", "Radic", "Smirnov", "Tanaka", "Urasawa", - "Vasiliev", "Watanabe", "Xiang", "Yegorov", "Zaytsev", "Borysko", - "Chen", "Dimitrov", + "Adamski", + "Baranov", + "Chernov", + "Dubois", + "Egorov", + "Filipov", + "Gromov", + "Horvat", + "Ivanova", + "Jankovic", + "Kowalski", + "Lazarev", + "Morozov", + "Novikov", + "Ostrowski", + "Petrov", + "Reznik", + "Sokolov", + "Tkachenko", + "Uvarov", + "Volkov", + "Wojcik", + "Yakimov", + "Zheng", + "Babic", + "Chernyshev", + "Dragunov", + "Fedorov", + "Grushevsky", + "Havel", + "Ito", + "Jovanovic", + "Katsaros", + "Lebedev", + "Mazur", + "Nemec", + "Ochoa", + "Popov", + "Radic", + "Smirnov", + "Tanaka", + "Urasawa", + "Vasiliev", + "Watanabe", + "Xiang", + "Yegorov", + "Zaytsev", + "Borysko", + "Chen", + "Dimitrov", ]; /// West reach: German, Central European — Compact territory, Westphalian influence. const WEST_REACH_NAMES: &[&str] = &[ - "Albrecht", "Baumann", "Christensen", "Dietrich", "Eisenberg", "Fischer", - "Gruber", "Hoffmann", "Ingolstadt", "Jaeger", "Kessler", "Lehmann", - "Mueller", "Neumann", "Obermann", "Pfeiffer", "Quandt", "Roth", - "Schaefer", "Thiel", "Urban", "Vogt", "Weidenfeld", "Ziegler", - "Becker", "Claussen", "Dorfmann", "Eberhardt", "Fleischer", "Gerstner", - "Haber", "Imhof", "Jung", "Kraemer", "Linden", "Metzger", - "Niedermann", "Opitz", "Preuss", "Raabe", "Steinbach", "Trautmann", - "Unger", "Vollmer", "Winterberg", "Zahn", "Auerbach", "Bruckner", - "Dahlem", "Eckhardt", + "Albrecht", + "Baumann", + "Christensen", + "Dietrich", + "Eisenberg", + "Fischer", + "Gruber", + "Hoffmann", + "Ingolstadt", + "Jaeger", + "Kessler", + "Lehmann", + "Mueller", + "Neumann", + "Obermann", + "Pfeiffer", + "Quandt", + "Roth", + "Schaefer", + "Thiel", + "Urban", + "Vogt", + "Weidenfeld", + "Ziegler", + "Becker", + "Claussen", + "Dorfmann", + "Eberhardt", + "Fleischer", + "Gerstner", + "Haber", + "Imhof", + "Jung", + "Kraemer", + "Linden", + "Metzger", + "Niedermann", + "Opitz", + "Preuss", + "Raabe", + "Steinbach", + "Trautmann", + "Unger", + "Vollmer", + "Winterberg", + "Zahn", + "Auerbach", + "Bruckner", + "Dahlem", + "Eckhardt", ]; /// East reach: Filipino, Korean, maritime Asian — distinctive identity. const EAST_REACH_NAMES: &[&str] = &[ - "Aquino", "Bautista", "Cruz", "Dalisay", "Espiritu", "Flores", - "Garcia", "Hernandez", "Ilagan", "Jeon", "Kim", "Lim", - "Magalang", "Navarro", "Ocampo", "Park", "Quijano", "Reyes", - "Santos", "Tan", "Uy", "Villanueva", "Wong", "Yoo", - "Aguilar", "Buenaventura", "Castillo", "Dizon", "Enriquez", "Fernandez", - "Gonzales", "Hwang", "Ignacio", "Jeong", "Kwon", "Lee", - "Marasigan", "Nakamura", "Oh", "Perez", "Ramos", "Son", - "Tolentino", "Umali", "Valdez", "Yun", "Zamora", "Baek", - "Choi", "Dela Cruz", + "Aquino", + "Bautista", + "Cruz", + "Dalisay", + "Espiritu", + "Flores", + "Garcia", + "Hernandez", + "Ilagan", + "Jeon", + "Kim", + "Lim", + "Magalang", + "Navarro", + "Ocampo", + "Park", + "Quijano", + "Reyes", + "Santos", + "Tan", + "Uy", + "Villanueva", + "Wong", + "Yoo", + "Aguilar", + "Buenaventura", + "Castillo", + "Dizon", + "Enriquez", + "Fernandez", + "Gonzales", + "Hwang", + "Ignacio", + "Jeong", + "Kwon", + "Lee", + "Marasigan", + "Nakamura", + "Oh", + "Perez", + "Ramos", + "Son", + "Tolentino", + "Umali", + "Valdez", + "Yun", + "Zamora", + "Baek", + "Choi", + "Dela Cruz", ]; /// Deep frontier: mixed backgrounds from all settler waves — no dominant culture. const FRONTIER_NAMES: &[&str] = &[ - "Adeyemi", "Bergstrom", "Chandra", "Duval", "Emeka", "Fonseca", - "Gupta", "Hassan", "Ibrahim", "Jansson", "Kovac", "Liu", - "Martinez", "Nkosi", "Okafor", "Patel", "Quinn", "Rodriguez", - "Sousa", "Thorne", "Uddin", "Varga", "Wu", "Xiong", - "Yoshida", "Zhao", "Abara", "Beaumont", "Cardenas", "Doyle", - "Ekwueme", "Ferreira", "Gomes", "Henriksen", "Idris", "Juma", - "Kato", "Larsen", "Morales", "Ndlovu", "Osei", "Petrov", - "Ruiz", "Singh", "Tavares", "Uchida", "Volkov", "Wang", - "Yang", "Zaman", + "Adeyemi", + "Bergstrom", + "Chandra", + "Duval", + "Emeka", + "Fonseca", + "Gupta", + "Hassan", + "Ibrahim", + "Jansson", + "Kovac", + "Liu", + "Martinez", + "Nkosi", + "Okafor", + "Patel", + "Quinn", + "Rodriguez", + "Sousa", + "Thorne", + "Uddin", + "Varga", + "Wu", + "Xiong", + "Yoshida", + "Zhao", + "Abara", + "Beaumont", + "Cardenas", + "Doyle", + "Ekwueme", + "Ferreira", + "Gomes", + "Henriksen", + "Idris", + "Juma", + "Kato", + "Larsen", + "Morales", + "Ndlovu", + "Osei", + "Petrov", + "Ruiz", + "Singh", + "Tavares", + "Uchida", + "Volkov", + "Wang", + "Yang", + "Zaman", ]; // --------------------------------------------------------------------------- @@ -96,38 +343,106 @@ const FRONTIER_NAMES: &[&str] = &[ // --------------------------------------------------------------------------- const EXTRACTION_SUFFIXES: &[&str] = &[ - "Mining Co.", "Extraction", "Resources", "Minerals", "Mining", - "Quarry Works", "Deep Drill", "Ore Works", "Claims", "Mining & Salvage", - "Prospecting", "Dig Co.", "Rock Works", "Shaft Mining", "Surface Mining", + "Mining Co.", + "Extraction", + "Resources", + "Minerals", + "Mining", + "Quarry Works", + "Deep Drill", + "Ore Works", + "Claims", + "Mining & Salvage", + "Prospecting", + "Dig Co.", + "Rock Works", + "Shaft Mining", + "Surface Mining", ]; const AGRICULTURE_SUFFIXES: &[&str] = &[ - "Farms", "Agricultural Co.", "Growers", "Harvest", "Provisions", - "Ranchers", "Fisheries", "Food Co.", "Plantations", "Cultivators", - "Produce", "Orchard", "Dairy", "Stockfeed", "Processing", + "Farms", + "Agricultural Co.", + "Growers", + "Harvest", + "Provisions", + "Ranchers", + "Fisheries", + "Food Co.", + "Plantations", + "Cultivators", + "Produce", + "Orchard", + "Dairy", + "Stockfeed", + "Processing", ]; const MANUFACTURING_SUFFIXES: &[&str] = &[ - "Manufacturing", "Works", "Industries", "Fabrication", "Engineering", - "Precision", "Assembly", "Components", "Foundry", "Machine Works", - "Systems", "Technical", "Metalworks", "Forging", "Production", + "Manufacturing", + "Works", + "Industries", + "Fabrication", + "Engineering", + "Precision", + "Assembly", + "Components", + "Foundry", + "Machine Works", + "Systems", + "Technical", + "Metalworks", + "Forging", + "Production", ]; const TRADE_LOGISTICS_SUFFIXES: &[&str] = &[ - "Freight", "Logistics", "Shipping", "Transport", "Haulage", - "Cargo", "Transit", "Distribution", "Forwarding", "Express", - "Lines", "Carriers", "Fleet", "Couriers", "Supply Co.", + "Freight", + "Logistics", + "Shipping", + "Transport", + "Haulage", + "Cargo", + "Transit", + "Distribution", + "Forwarding", + "Express", + "Lines", + "Carriers", + "Fleet", + "Couriers", + "Supply Co.", ]; const SERVICES_SUFFIXES: &[&str] = &[ - "Services", "Associates", "Consulting", "Partners", "Group", - "Holdings", "Clinic", "Bureau", "Agency", "Office", - "Practice", "Solutions", "Advisors", "Trust", "Institute", + "Services", + "Associates", + "Consulting", + "Partners", + "Group", + "Holdings", + "Clinic", + "Bureau", + "Agency", + "Office", + "Practice", + "Solutions", + "Advisors", + "Trust", + "Institute", ]; const INTELLIGENCE_SUFFIXES: &[&str] = &[ - "Analytics", "Intelligence", "Data Services", "Information", "Research", - "Advisory", "Insights", "Consulting", "Networks", "Analysis", + "Analytics", + "Intelligence", + "Data Services", + "Information", + "Research", + "Advisory", + "Insights", + "Consulting", + "Networks", + "Analysis", ]; // --------------------------------------------------------------------------- @@ -203,8 +518,22 @@ mod tests { #[test] fn names_not_empty() { let mut rng = ChaCha8Rng::seed_from_u64(1); - for sector in &["core", "north_reach", "south_reach", "west_reach", "east_reach", "deep_frontier"] { - for cat in &["extraction", "agriculture", "manufacturing", "trade_logistics", "services", "intelligence"] { + for sector in &[ + "core", + "north_reach", + "south_reach", + "west_reach", + "east_reach", + "deep_frontier", + ] { + for cat in &[ + "extraction", + "agriculture", + "manufacturing", + "trade_logistics", + "services", + "intelligence", + ] { let name = generate_name(&mut rng, sector, cat); assert!(!name.is_empty(), "Empty name for {}/{}", sector, cat); assert!(name.contains(' '), "No space in name: {}", name);