1package com.fs.starfarer.api.impl.campaign.procgen;
3import java.util.ArrayList;
4import java.util.Collection;
5import java.util.HashMap;
6import java.util.HashSet;
7import java.util.LinkedHashSet;
10import java.util.Random;
13import com.fs.starfarer.api.Global;
14import com.fs.starfarer.api.util.WeightedRandomPicker;
19 public static String
START =
"@";
20 public static String
END =
"#";
22 public static float [][]
prob;
25 public static Map<String, Integer>
stringToIndex =
new HashMap<String, Integer>();
26 public static Map<Integer, String>
indexToString =
new HashMap<Integer, String>();
31 List<String> names =
new ArrayList<String>();
35 names.add(spec.getName());
41 public static void load(List<String> names,
int order) {
42 MarkovNames.order =
order;
45 List<String> all =
new ArrayList<String>();
46 for (
int i = 1; i <
alphabet.length(); i++) {
49 for (
int j = 1; j <
alphabet.length(); j++) {
54 for (
int k = 1; k <
alphabet.length(); k++) {
56 all.add(s1 + s2 + s3);
61 for (String str : all) {
72 for (String name : names) {
73 if (name.contains(
"$"))
continue;
88 public static void load(String name) {
90 for (
int i = 0; i < name.length() - 1; i++) {
91 String curr =
"" + name.charAt(i);
92 if (i > 0) curr =
"" + name.charAt(i - 1) + curr;
93 if (i > 1 &&
order == 3) curr =
"" + name.charAt(i - 2) + curr;
95 String next =
"" + name.charAt(i + 1);
97 int x =
getIndex(curr.toLowerCase());
98 int y =
getIndex(next.toLowerCase());
105 if (name.length() <= 2)
return false;
106 if (name.length() > 20)
return false;
109 int currUnbroken = 0;
111 for (
int i = 0; i < name.length(); i++) {
112 String curr =
"" + name.charAt(i);
113 if (
" ".equals(curr) ||
"-".equals(curr)) {
116 if (
" ".equals(curr)) {
121 if (currUnbroken > maxUnbroken) {
122 maxUnbroken = currUnbroken;
126 if (numSpaces >= 2)
return false;
127 if (maxUnbroken >= 12)
return false;
134 public static class MarkovNameResult {
136 public double probability;
139 public static MarkovNameResult
generate(Random random) {
140 if (
prob ==
null)
return null;
141 if (random ==
null) random =
new Random();
143 double probability = 1f;
147 while (!
END.equals(add) && add !=
null) {
151 if (name.length() > 1) {
152 curr =
"" + name.charAt(name.length() - 2) + curr;
154 if (name.length() > 2 &&
order == 3) {
155 curr =
"" + name.charAt(name.length() - 3) + curr;
158 WeightedRandomPicker<String> picker =
new WeightedRandomPicker<String>(random);
161 for (
int i = 0; i <
prob[index].length; i++) {
162 float weight =
prob[index][i];
165 picker.add(next, weight);
172 int pickIndex = picker.getItems().indexOf(add);
173 if (pickIndex >= 0) {
174 probability *= (double) (picker.getWeight(pickIndex) / picker.getTotal());
179 if (name.length() > 50)
break;
181 if (add !=
null) name += add;
184 if (name.startsWith(
START)) name = name.substring(1);
185 if (name.endsWith(
END)) name = name.substring(0, name.length() - 1);
187 StringBuffer result =
new StringBuffer();
189 for (
int i = 0; i < name.length(); i++) {
190 String curr =
"" + name.charAt(i);
191 if (
" ".equals(prev) ||
"-".equals(prev) || prev ==
null) {
192 curr = curr.toUpperCase();
198 name = result.toString();
201 if (name ==
null)
return null;
203 MarkovNameResult r =
new MarkovNameResult();
205 r.probability = probability * 1000000;
232 for (
int i = 0; i < str.length(); i++) {
233 int val =
alphabet.indexOf(
"" + str.charAt(i));
234 if (val < 0)
continue;
236 index += val * Math.pow(radix, i);
244 public static void main(String[] args) {
256 Set<String> generated =
new LinkedHashSet<String>();
257 for (
int i = 0; i < 20000; i++) {
259 if (r ==
null)
continue;
260 if (r.name ==
null)
continue;
261 if (names.contains(r.name))
continue;
262 if (generated.contains(r.name))
continue;
264 System.out.println(r.name);
265 generated.add(r.name);
270 String [] split = in.split(
" |-");
271 for (String curr : split) {
272 if (curr.toLowerCase().equals(word.toLowerCase())) {
280 if (
blocked.contains(in.toLowerCase()))
return true;
282 String [] split = in.split(
" |-");
283 for (String curr : split) {
284 if (
badWords.contains(curr.toLowerCase()))
return true;
287 boolean allBlocked =
true;
288 for (String curr : split) {
289 if (!
blocked.contains(curr.toLowerCase())) {
294 if (allBlocked)
return true;
299 public static Set<String>
badWords =
new HashSet<String>();
300 public static Set<String>
blocked =
new HashSet<String>();
302 blocked =
new HashSet<String>();
384 List<String> names =
new ArrayList<String>();
386 names.add(
"Aelurus");
391 names.add(
"Kydoimos");
393 names.add(
"Mysminai");
394 names.add(
"Polemos");
396 names.add(
"Alexiares");
397 names.add(
"Anicetus");
399 names.add(
"Dysnomia");
404 names.add(
"Eleuthia");
406 names.add(
"Enyalius");
408 names.add(
"Zumurrud");
410 names.add(
"Temblor");
419 names.add(
"Ninsutu");
420 names.add(
"Ninkasi");
421 names.add(
"Dazimua");
422 names.add(
"Enshagag");
425 names.add(
"Ninkurra");
431 names.add(
"Galatura");
432 names.add(
"Kurjara");
436 names.add(
"Great Dismal");
438 names.add(
"Pandemonium");
439 names.add(
"Mulciber");
441 names.add(
"Leviathon");
442 names.add(
"Asmodeus");
443 names.add(
"Belphegor");
446 names.add(
"Ashtoreth");
451 names.add(
"Azathoth");
452 names.add(
"Abaddon");
455 names.add(
"Crucible");
457 names.add(
"Dantalion");
458 names.add(
"Humility");
459 names.add(
"Romance");
462 names.add(
"Zhu Que");
465 names.add(
"Zenobia");
466 names.add(
"Labyrinth");
469 names.add(
"Black Emperor");
470 names.add(
"Myrkheim");
472 names.add(
"Draupnir");
477 names.add(
"Gullinbursti");
479 names.add(
"Jotunheim");
482 names.add(
"Bardarbunga");
483 names.add(
"Thrivaldi");
484 names.add(
"Zosimos");
485 names.add(
"$parent's Wheel");
486 names.add(
"Ezekial's Wheel");
487 names.add(
"Arc of $parent");
488 names.add(
"$parent's Wreath");
489 names.add(
"Torq of $parent");
490 names.add(
"Crown of $parent");
491 names.add(
"Ring System");
492 names.add(
"Accretion Disk");
493 names.add(
"The Ouroboros");
494 names.add(
"$parent's Girdle");
495 names.add(
"Iron Stream");
496 names.add(
"Stone River");
497 names.add(
"The Glittering Band");
498 names.add(
"Asteroid Belt");
499 names.add(
"Stone Conclave");
501 names.add(
"Brisingamen");
503 names.add(
"Draupnir");
504 names.add(
"Hlidskjalf");
505 names.add(
"Ring of Gyges");
508 names.add(
"Sledovik");
509 names.add(
"Sessho-seki");
511 names.add(
"Rocannon's World");
514 names.add(
"Zakalwe");
515 names.add(
"Darkense");
516 names.add(
"Livueta");
517 names.add(
"Elethiomel ");
518 names.add(
"Staberinde");
521 names.add(
"Palaver");
522 names.add(
"Rigamarole");
523 names.add(
"Scrimshaw");
528 names.add(
"Asmoday");
531 names.add(
"Komarov");
534 names.add(
"Perseus");
535 names.add(
"Cerenkov");
542 names.add(
"Irkalla");
543 names.add(
"Meropis");
545 names.add(
"Paititi");
546 names.add(
"Suddene");
550 names.add(
"Jeremiah's World");
551 names.add(
"Strathcona");
557 names.add(
"Asphodel");
560 names.add(
"Acheron");
562 names.add(
"Tartarus");
564 names.add(
"Bothros");
565 names.add(
"Megaron");
566 names.add(
"Thanatos");
568 names.add(
"Morpheus");
569 names.add(
"Phobetor");
570 names.add(
"Phantasos");
571 names.add(
"Oneiroi");
573 names.add(
"Cocytus");
574 names.add(
"Oceanus Nebula");
575 names.add(
"Elysion");
578 names.add(
"Mnemosyne");
579 names.add(
"Calliope");
584 names.add(
"Hyacinth ");
585 names.add(
"Euterpe");
588 names.add(
"Melpomene");
589 names.add(
"Polymnia");
590 names.add(
"Aglaope");
591 names.add(
"Leucosia");
594 names.add(
"Pathenope");
595 names.add(
"Peisinoe");
596 names.add(
"Thelxiope");
597 names.add(
"Terpsichore");
599 names.add(
"The Korybantes");
603 names.add(
"Helicon");
607 names.add(
"Parnassos");
608 names.add(
"The Banshee");
609 names.add(
"The Sirens");
610 names.add(
"Orpheus");
611 names.add(
"Tragedy");
612 names.add(
"The Kuretes");
613 names.add(
"Mangindusa");
614 names.add(
"Bugawasin");
616 names.add(
"Sedumunadoc");
617 names.add(
"Tabiacoud");
618 names.add(
"Anggugru");
620 names.add(
"Kalabagang");
621 names.add(
"Taliyakad");
625 names.add(
"Dibuwat");
626 names.add(
"Kavacha");
629 names.add(
"Ring of Morred");
630 names.add(
"Selidor");
637 names.add(
"Hanuman");
641 names.add(
"The Nagas");
644 names.add(
"Bakunawa");
645 names.add(
"Karkotaka");
646 names.add(
"Mucalinda");
647 names.add(
"Padmavati");
648 names.add(
"Pearl River");
653 names.add(
"Cimmeria");
655 names.add(
"Zirnitra");
658 names.add(
"Kolobok");
668 names.add(
"Stribog");
669 names.add(
"Gamayun");
671 names.add(
"Alkonost");
672 names.add(
"The Simargl");
673 names.add(
"Baba Yaga");
675 names.add(
"Koschei");
683 names.add(
"Usumgallu");
684 names.add(
"Masmahhu");
685 names.add(
"Mushussu");
688 names.add(
"Uridimmu");
689 names.add(
"Girtablullu");
690 names.add(
"Umu Dabrutu");
691 names.add(
"Kulullu");
692 names.add(
"Kusarikku");
704 names.add(
"Rota Fortunae");
705 names.add(
"Siege Perilous");
706 names.add(
"World Mill");
708 names.add(
"Durer's Star");
709 names.add(
"Melancholia");
711 names.add(
"Griseus");
713 names.add(
"Hungry Ghost");
716 names.add(
"Naihe Qiao");
718 names.add(
"Qinguang");
719 names.add(
"Bing Diyu");
720 names.add(
"Chujiang");
721 names.add(
"Heisheng Dadi");
726 names.add(
"Diancheng");
727 names.add(
"Jiaohuan");
728 names.add(
"Taishan");
729 names.add(
"Roujiang");
732 names.add(
"Pingden");
736 names.add(
"Gargoyle");
737 names.add(
"Familiar");
740 names.add(
"Youming");
741 names.add(
"Yinjian");
745 names.add(
"Robinson's Moon");
747 names.add(
"Morthanveld");
748 names.add(
"Issorile");
750 names.add(
"Gormenghast");
752 names.add(
"Carcassonne");
754 names.add(
"Rameumptom");
756 names.add(
"Jahannam");
759 names.add(
"Haawiyah");
760 names.add(
"Barzakh");
767 names.add(
"Rephaim");
768 names.add(
"Perdition");
770 names.add(
"Neter-hkertet");
772 names.add(
"Karoaglanlar");
773 names.add(
"Karakizlar");
776 names.add(
"Shyngay");
784 names.add(
"Maidere");
785 names.add(
"The Ordog");
791 names.add(
"The Chechidla");
792 names.add(
"Comiaken");
794 names.add(
"Gingolx");
795 names.add(
"The Nechako");
796 names.add(
"Tsimshian");
798 names.add(
"Ghost Dance");
799 names.add(
"Mag Mell");
801 names.add(
"Cipactli");
802 names.add(
"Ehecatl");
803 names.add(
"Spirit Wind");
808 names.add(
"Bered Kai Nev");
810 names.add(
"Agrat bat Mahlat");
814 names.add(
"Eisheth");
816 names.add(
"The Grigori");
817 names.add(
"The Sentinels");
819 names.add(
"Old Goat");
823 names.add(
"Gadreel");
824 names.add(
"Penemue");
825 names.add(
"Kasdaye");
826 names.add(
"Cambriel Nebula");
827 names.add(
"Armaros' Work");
828 names.add(
"The Myriad");
829 names.add(
"The Lost Legion");
830 names.add(
"Al Kathab");
831 names.add(
"The Armada");
833 names.add(
"The Gengris");
834 names.add(
"New Suroch");
835 names.add(
"Xezbeth");
838 names.add(
"The Erinyes");
844 names.add(
"Stray Dog");
845 names.add(
"Valefar");
846 names.add(
"Laverna");
847 names.add(
"Maderakka");
848 names.add(
"Sarakka");
849 names.add(
"Juksakka");
850 names.add(
"Uksakka");
851 names.add(
"Jabme-Akka");
852 names.add(
"Maan-Emo");
860 names.add(
"Art of the Jinns");
861 names.add(
"The Qarin");
862 names.add(
"Tuchulcha");
863 names.add(
"Suanggi");
865 names.add(
"The Imp");
867 names.add(
"The Raven");
868 names.add(
"The Murder");
870 names.add(
"Puloman");
871 names.add(
"Indrani Sachi");
872 names.add(
"Sivasri");
873 names.add(
"The Pontianak");
874 names.add(
"The Pocong");
875 names.add(
"O Tokata");
879 names.add(
"Onoskelis");
881 names.add(
"Krampus");
883 names.add(
"Ravanan");
884 names.add(
"Kaliyan");
885 names.add(
"Thuriothanan");
887 names.add(
"The Marid");
888 names.add(
"Hantu Raya");
890 names.add(
"Koman-tong");
891 names.add(
"Koman-lay");
892 names.add(
"Kwee Kia");
893 names.add(
"Jenglot");
897 names.add(
"Dzoavits");
898 names.add(
"Klabautermann");
899 names.add(
"$parent's Jinx");
900 names.add(
"$parent's Hex");
901 names.add(
"The Hecatomb");
904 names.add(
"Jumbee's Dance");
905 names.add(
"Kigatilik");
907 names.add(
"Tupilaq");
908 names.add(
"Tizheruk");
909 names.add(
"Run of the Haietlik");
910 names.add(
"Unhcegila");
912 names.add(
"Shapishico");
913 names.add(
"Atahsaya");
915 names.add(
"Gualichu");
916 names.add(
"Babi Ngepet");
921 names.add(
"Caprica");
923 names.add(
"Pallida");
927 names.add(
"The Pactolus");
928 names.add(
"Socordia");
929 names.add(
"Ignavia");
930 names.add(
"Sabriel");
932 names.add(
"Clariel");
934 names.add(
"Mosrael");
937 names.add(
"Belgaer");
938 names.add(
"Astarael");
939 names.add(
"Saraneth");
942 names.add(
"Bentusle");
943 names.add(
"Asmaidas");
944 names.add(
"Groclant");
949 names.add(
"Sharkara");
954 names.add(
"Mahatamaha");
955 names.add(
"Achuguayo");
959 names.add(
"Chijoraji");
960 names.add(
"Achuhucanac");
962 names.add(
"Tagoror");
966 names.add(
"Bona Dea");
969 names.add(
"Kelaineus");
970 names.add(
"Argennon");
971 names.add(
"Aigikoros");
972 names.add(
"Eugeneios");
973 names.add(
"Omester");
974 names.add(
"Daphoenus");
975 names.add(
"Philamnos");
976 names.add(
"Xanthos");
977 names.add(
"Glaukos");
978 names.add(
"Phorbas");
980 names.add(
"Kang Admi");
982 names.add(
"Bun Manchi");
984 names.add(
"Dzu-teh");
986 names.add(
"Sarkomand");
987 names.add(
"Cerenerian Sea");
988 names.add(
"Kephalos");
989 names.add(
"Procris");
992 names.add(
"Arcesius");
993 names.add(
"Astraeus");
997 names.add(
"Zephyrus");
999 names.add(
"Coatlicue");
1000 names.add(
"Centeotl");
1001 names.add(
"Chicomecoatl");
1002 names.add(
"Texcatlipoca");
1003 names.add(
"Xantico");
1004 names.add(
"Chantico");
1005 names.add(
"Mayahue");
1006 names.add(
"Mixcoatl");
1007 names.add(
"Centzon Huitznauhtin");
1008 names.add(
"Tlaloc");
1009 names.add(
"The Anillo");
1011 names.add(
"Denyen");
1012 names.add(
"Ekwesh");
1013 names.add(
"Peleset");
1014 names.add(
"Sherden");
1015 names.add(
"Teresh");
1016 names.add(
"Weshesh");
1017 names.add(
"Tjeker");
1018 names.add(
"Bull Moose");
1019 names.add(
"Minnow");
1020 names.add(
"Will-o-wisp");
1021 names.add(
"Stingy Jack");
1022 names.add(
"City of Brass");
1023 names.add(
"Saraph");
1027 names.add(
"Ningishzida");
1028 names.add(
"Azimua");
1029 names.add(
"Nehushtan");
1030 names.add(
"Oberon");
1031 names.add(
"Cymnea");
1032 names.add(
"Faiella");
1033 names.add(
"Clarissa");
1037 names.add(
"Mandor");
1039 names.add(
"Corwin");
1040 names.add(
"Merlin");
1044 names.add(
"Random");
1045 names.add(
"Morganthe");
1046 names.add(
"Martin");
1047 names.add(
"Morganna");
1048 names.add(
"Moronoe");
1050 names.add(
"Gliten");
1051 names.add(
"Glitonea");
1052 names.add(
"Tyronoe");
1053 names.add(
"Thiten");
1054 names.add(
"Pomorum");
1055 names.add(
"Basilia");
1056 names.add(
"Mentonomon");
1057 names.add(
"Suroch");
1058 names.add(
"Grimnebulin");
1059 names.add(
"Weaver");
1061 names.add(
"Shining Tor");
1062 names.add(
"Vannin");
1064 names.add(
"Monabia");
1065 names.add(
"Cushag");
1072 names.add(
"Netzach");
1075 names.add(
"Simchah");
1077 names.add(
"Grimsnes");
1079 names.add(
"Grensdalur");
1083 names.add(
"Surtsey");
1085 names.add(
"Krossa");
1087 names.add(
"Olfusa");
1088 names.add(
"Grendel");
1090 names.add(
"The Chiral Wisp");
1092 names.add(
"Maculatus");
1093 names.add(
"Deinos");
1094 names.add(
"Vuzgrimeti");
1095 names.add(
"Balwom");
1097 names.add(
"Zaranya");
1098 names.add(
"The Motley");
1105 names.add(
"Wonder");
1106 names.add(
"The Confluence");
1107 names.add(
"Cirrus");
1109 names.add(
"Pantheon");
1111 names.add(
"Pharos");
1112 names.add(
"Tempest");
1113 names.add(
"The Precipice");
1114 names.add(
"Archon");
1115 names.add(
"Sabazios");
1116 names.add(
"Terror");
1117 names.add(
"Despair");
1118 names.add(
"Abandon");
1119 names.add(
"Legion");
1120 names.add(
"Golgotha");
1127 names.add(
"Naacal");
1132 names.add(
"Troano");
1134 names.add(
"Bolunda");
1135 names.add(
"Brazir");
1137 names.add(
"Vlaanderen");
1138 names.add(
"Asmaida");
1139 names.add(
"Chagos");
1142 names.add(
"Vigrid");
1146 names.add(
"Cormoran");
1147 names.add(
"Morvah");
1148 names.add(
"Zennor");
1149 names.add(
"Madron");
1151 names.add(
"Cadmus");
1152 names.add(
"Echion");
1154 names.add(
"The Spartoi");
1155 names.add(
"Bellerophon");
1157 names.add(
"Telephassa");
1158 names.add(
"Telephe");
1159 names.add(
"Agriope");
1160 names.add(
"Shevar");
1161 names.add(
"Ferragut");
1164 names.add(
"Zipacna");
1165 names.add(
"Mbombo");
1167 names.add(
"Wendigo");
1168 names.add(
"Abraxas");
1169 names.add(
"Vassago");
1170 names.add(
"Ukobach");
1174 names.add(
"Shedim");
1179 names.add(
"Killakee Cat");
1181 names.add(
"Hantu Raya");
1182 names.add(
"The Polong");
1183 names.add(
"Pelesit");
1184 names.add(
"Blue Crow");
1185 names.add(
"Marathon");
1187 names.add(
"Svarga");
1189 names.add(
"Garbhodaka");
1190 names.add(
"Pitrloka");
1191 names.add(
"Dalar's Star");
1192 names.add(
"Kardashev");
1195 names.add(
"Zendar");
1197 names.add(
"Sahara");
1199 names.add(
"Kalahari");
1200 names.add(
"Karakum");
1201 names.add(
"Sonora");
1202 names.add(
"Atacama");
1203 names.add(
"Mojave");
1206 names.add(
"New Labrador");
1207 names.add(
"New Biscay");
1208 names.add(
"New Azov");
1209 names.add(
"New Cordova");
1210 names.add(
"New Pender");
1211 names.add(
"New Guayaquil");
1212 names.add(
"Third Bogota");
1213 names.add(
"Yuendumu");
1214 names.add(
"Yulara");
1216 names.add(
"Warmun");
1217 names.add(
"The Ord");
1218 names.add(
"Naikoon");
1219 names.add(
"Haanas");
1220 names.add(
"The Pines");
1221 names.add(
"New Caldwell");
1222 names.add(
"Potato");
static SettingsAPI getSettings()
static boolean sanityCheck(String name)
static Map< String, Integer > stringToIndex
static void load(List< String > names, int order)
static List< String > createNames()
static MarkovNameResult generate(Random random)
static int computeIndex(String str)
static String getString(Integer index)
static void main(String[] args)
static void load(String name)
static boolean containsWord(String in, String word)
static void loadIfNeeded()
static Set< String > blocked
static boolean containsBad(String in)
static Map< Integer, String > indexToString
static Integer getIndex(String str)
static Set< String > badWords
< T > Collection< T > getAllSpecs(Class< T > c)