001package com.fs.starfarer.api.impl.campaign.missions.academy; 002 003import java.util.ArrayList; 004import java.util.Arrays; 005import java.util.Collection; 006import java.util.HashSet; 007import java.util.List; 008import java.util.Random; 009import java.util.Set; 010 011import com.fs.starfarer.api.impl.campaign.missions.hub.ReqMode; 012import com.fs.starfarer.api.util.WeightedRandomPicker; 013 014public class GADepartments { 015 016 public static String SOCIAL = "social"; 017 public static String INDUSTRIAL = "industrial"; 018 public static String MILITARY = "military"; 019 public static String SCIENCE = "science"; 020 public static String WEIRD = "weird"; 021 022 023 public static class Department { 024 public String name; 025 public Set<String> tags = new HashSet<String>(); 026 027 public Department(String name, String ... tags) { 028 this.name = name; 029 for (String tag : tags) { 030 this.tags.add(tag); 031 } 032 } 033 } 034 035 public static List<Department> departments = new ArrayList<Department>(); 036 public static void add(String name, String ... tags) { 037 departments.add(new Department(name, tags)); 038 } 039 040 static { 041 add("Ancient Earth Studies", SOCIAL); 042 add("Ancient Terran Philosophy", SOCIAL); 043 add("Applied Anorthic Geometry", SCIENCE, WEIRD); 044 add("Applied Holoarts", SOCIAL); 045 add("Astrochemistry", INDUSTRIAL, SCIENCE); 046 add("Astrometrics", SCIENCE); 047 add("AI Defense Studies", SCIENCE, WEIRD, MILITARY); 048 add("Classical Terran Studies", SOCIAL); 049 add("Cybermedical Engineering", INDUSTRIAL, SOCIAL); 050 add("Cybernetic Physiology", SCIENCE, SOCIAL); 051 add("Demographic Calculus", SOCIAL); 052 add("Domain Sociology", SOCIAL); 053 add("Domain History", SOCIAL); 054 add("Environmental Engineering", INDUSTRIAL); 055 add("Exotic Manifold Engineering", INDUSTRIAL, WEIRD); 056 add("Gravity Control", INDUSTRIAL, SCIENCE, MILITARY); 057 add("Gravity Dynamics", SCIENCE); 058 add("Holoart Studies", SOCIAL); 059 add("Hyperspace Physics", SCIENCE); 060 add("LAMBDA-F", SCIENCE, WEIRD); 061 add("Nanotech Engineering", INDUSTRIAL); 062 add("Nanorobotics", INDUSTRIAL, SCIENCE, WEIRD); 063 add("Nonlinear Mathematics", SCIENCE, WEIRD); 064 add("Orbital Architecture", SOCIAL, INDUSTRIAL, MILITARY); 065 add("Post-Expansion Philosophy", SOCIAL); 066 add("Persean Sociology", SOCIAL); 067 add("Phase Physics", SCIENCE); 068 add("Quantum Chemistry", SCIENCE, WEIRD); 069 add("N-Space Resonance", SCIENCE, WEIRD); 070 add("Special Collections", SOCIAL, INDUSTRIAL, SCIENCE, WEIRD, MILITARY); 071 add("Tau Hyperphysics", SCIENCE, WEIRD); 072 add("Talos Containment", WEIRD); 073 add("Templeman Hyperwave Theory", WEIRD); 074 add("Terran Biology", SCIENCE); 075 add("Xenobiology", SCIENCE); 076 } 077 078 079 public static String pick(Random random, ReqMode mode, String ... tags) { 080 WeightedRandomPicker<Department> picker = new WeightedRandomPicker<Department>(random); 081 082 Set<String> tagSet = new HashSet<String>(); 083 tagSet.addAll(Arrays.asList(tags)); 084 085 for (Department d : departments) { 086 if (!matchesTags(mode, tagSet, d.tags)) { 087 continue; 088 } 089 picker.add(d); 090 break; 091 } 092 093 Department d = picker.pick(); 094 if (d == null) d = departments.get(0); 095 096 return d.name; 097 } 098 099 protected static boolean matchesTags(ReqMode mode, Collection<String> tags, Collection<String> set) { 100 switch (mode) { 101 case ALL: 102 for (String tag : tags) if (!set.contains(tag)) return false; 103 return true; 104 case ANY: 105 for (String tag : tags) if (set.contains(tag)) return true; 106 return false; 107 case NOT_ALL: 108 for (String tag : tags) if (!set.contains(tag)) return true; 109 return false; 110 case NOT_ANY: 111 for (String tag : tags) if (set.contains(tag)) return false; 112 return true; 113 } 114 return false; 115 } 116 117 public static String pick(Random random, String ... tags) { 118 WeightedRandomPicker<Department> picker = new WeightedRandomPicker<Department>(random); 119 120 for (Department d : departments) { 121 for (String tag : tags) { 122 if (d.tags.contains(tag)) { 123 picker.add(d); 124 break; 125 } 126 } 127 } 128 129 Department d = picker.pick(); 130 if (d == null) d = departments.get(0); 131 132 return d.name; 133 } 134 135 public static String pickWithAllTags(Random random, String ... tags) { 136 WeightedRandomPicker<Department> picker = new WeightedRandomPicker<Department>(random); 137 138 OUTER: for (Department d : departments) { 139 for (String tag : tags) { 140 if (!d.tags.contains(tag)) { 141 continue OUTER; 142 } 143 } 144 picker.add(d); 145 } 146 147 Department d = picker.pick(); 148 if (d == null) d = departments.get(0); 149 150 return d.name; 151 } 152 153 154 155 156} 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175