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