mirror of
https://github.com/Azgaar/Fantasy-Map-Generator.git
synced 2025-12-17 17:51:24 +01:00
commit
907e916b45
18 changed files with 452 additions and 110 deletions
|
|
@ -1,13 +1,3 @@
|
|||
interface INameBase {
|
||||
name: string;
|
||||
i: number; // id
|
||||
min: number; // recommended min length
|
||||
max: number; // recommended max length
|
||||
d: string; // letters allowed to be duplicated
|
||||
m: number; // multi-word name rate [deprecated]
|
||||
b: string; // training data, comma-separated list of names
|
||||
}
|
||||
|
||||
export enum NAMEBASE {
|
||||
German = 0,
|
||||
English = 1,
|
||||
|
|
@ -55,8 +45,18 @@ export enum NAMEBASE {
|
|||
|
||||
const NB = NAMEBASE;
|
||||
|
||||
interface INameBaseData {
|
||||
name: string;
|
||||
i: number; // id
|
||||
min: number; // recommended min length
|
||||
max: number; // recommended max length
|
||||
d: string; // letters allowed to be duplicated
|
||||
m: number; // multi-word name rate [deprecated]
|
||||
b: string; // training data, comma-separated list of names
|
||||
}
|
||||
|
||||
// prettier-ignore
|
||||
export const defaultNameBases: INameBase[] = [
|
||||
export const defaultNameBases: INameBaseData[] = [
|
||||
// real-world namebases by Azgaar:
|
||||
{name: "German", i: NB.German, min: 5, max: 12, d: "lt", m: 0, b: "Achern,Aichhalden,Aitern,Albbruck,Alpirsbach,Altensteig,Althengstett,Appenweier,Auggen,Wildbad,Badenen,Badenweiler,Baiersbronn,Ballrechten,Bellingen,Berghaupten,Bernau,Biberach,Biederbach,Binzen,Birkendorf,Birkenfeld,Bischweier,Blumberg,Bollen,Bollschweil,Bonndorf,Bosingen,Braunlingen,Breisach,Breisgau,Breitnau,Brigachtal,Buchenbach,Buggingen,Buhl,Buhlertal,Calw,Dachsberg,Dobel,Donaueschingen,Dornhan,Dornstetten,Dottingen,Dunningen,Durbach,Durrheim,Ebhausen,Ebringen,Efringen,Egenhausen,Ehrenkirchen,Ehrsberg,Eimeldingen,Eisenbach,Elzach,Elztal,Emmendingen,Endingen,Engelsbrand,Enz,Enzklosterle,Eschbronn,Ettenheim,Ettlingen,Feldberg,Fischerbach,Fischingen,Fluorn,Forbach,Freiamt,Freiburg,Freudenstadt,Friedenweiler,Friesenheim,Frohnd,Furtwangen,Gaggenau,Geisingen,Gengenbach,Gernsbach,Glatt,Glatten,Glottertal,Gorwihl,Gottenheim,Grafenhausen,Grenzach,Griesbach,Gutach,Gutenbach,Hag,Haiterbach,Hardt,Harmersbach,Hasel,Haslach,Hausach,Hausen,Hausern,Heitersheim,Herbolzheim,Herrenalb,Herrischried,Hinterzarten,Hochenschwand,Hofen,Hofstetten,Hohberg,Horb,Horben,Hornberg,Hufingen,Ibach,Ihringen,Inzlingen,Kandern,Kappel,Kappelrodeck,Karlsbad,Karlsruhe,Kehl,Keltern,Kippenheim,Kirchzarten,Konigsfeld,Krozingen,Kuppenheim,Kussaberg,Lahr,Lauchringen,Lauf,Laufenburg,Lautenbach,Lauterbach,Lenzkirch,Liebenzell,Loffenau,Loffingen,Lorrach,Lossburg,Mahlberg,Malsburg,Malsch,March,Marxzell,Marzell,Maulburg,Monchweiler,Muhlenbach,Mullheim,Munstertal,Murg,Nagold,Neubulach,Neuenburg,Neuhausen,Neuried,Neuweiler,Niedereschach,Nordrach,Oberharmersbach,Oberkirch,Oberndorf,Oberbach,Oberried,Oberwolfach,Offenburg,Ohlsbach,Oppenau,Ortenberg,otigheim,Ottenhofen,Ottersweier,Peterstal,Pfaffenweiler,Pfalzgrafenweiler,Pforzheim,Rastatt,Renchen,Rheinau,Rheinfelden,Rheinmunster,Rickenbach,Rippoldsau,Rohrdorf,Rottweil,Rummingen,Rust,Sackingen,Sasbach,Sasbachwalden,Schallbach,Schallstadt,Schapbach,Schenkenzell,Schiltach,Schliengen,Schluchsee,Schomberg,Schonach,Schonau,Schonenberg,Schonwald,Schopfheim,Schopfloch,Schramberg,Schuttertal,Schwenningen,Schworstadt,Seebach,Seelbach,Seewald,Sexau,Simmersfeld,Simonswald,Sinzheim,Solden,Staufen,Stegen,Steinach,Steinen,Steinmauern,Straubenhardt,Stuhlingen,Sulz,Sulzburg,Teinach,Tiefenbronn,Tiengen,Titisee,Todtmoos,Todtnau,Todtnauberg,Triberg,Tunau,Tuningen,uhlingen,Unterkirnach,Reichenbach,Utzenfeld,Villingen,Villingendorf,Vogtsburg,Vohrenbach,Waldachtal,Waldbronn,Waldkirch,Waldshut,Wehr,Weil,Weilheim,Weisenbach,Wembach,Wieden,Wiesental,Wildberg,Winzeln,Wittlingen,Wittnau,Wolfach,Wutach,Wutoschingen,Wyhlen,Zavelstein"},
|
||||
{name: "English", i: NB.English, min: 6, max: 11, d: "", m: .1, b: "Abingdon,Albrighton,Alcester,Almondbury,Altrincham,Amersham,Andover,Appleby,Ashboume,Atherstone,Aveton,Axbridge,Aylesbury,Baldock,Bamburgh,Barton,Basingstoke,Berden,Bere,Berkeley,Berwick,Betley,Bideford,Bingley,Birmingham,Blandford,Blechingley,Bodmin,Bolton,Bootham,Boroughbridge,Boscastle,Bossinney,Bramber,Brampton,Brasted,Bretford,Bridgetown,Bridlington,Bromyard,Bruton,Buckingham,Bungay,Burton,Calne,Cambridge,Canterbury,Carlisle,Castleton,Caus,Charmouth,Chawleigh,Chichester,Chillington,Chinnor,Chipping,Chisbury,Cleobury,Clifford,Clifton,Clitheroe,Cockermouth,Coleshill,Combe,Congleton,Crafthole,Crediton,Cuddenbeck,Dalton,Darlington,Dodbrooke,Drax,Dudley,Dunstable,Dunster,Dunwich,Durham,Dymock,Exeter,Exning,Faringdon,Felton,Fenny,Finedon,Flookburgh,Fowey,Frampton,Gateshead,Gatton,Godmanchester,Grampound,Grantham,Guildford,Halesowen,Halton,Harbottle,Harlow,Hatfield,Hatherleigh,Haydon,Helston,Henley,Hertford,Heytesbury,Hinckley,Hitchin,Holme,Hornby,Horsham,Kendal,Kenilworth,Kilkhampton,Kineton,Kington,Kinver,Kirby,Knaresborough,Knutsford,Launceston,Leighton,Lewes,Linton,Louth,Luton,Lyme,Lympstone,Macclesfield,Madeley,Malborough,Maldon,Manchester,Manningtree,Marazion,Marlborough,Marshfield,Mere,Merryfield,Middlewich,Midhurst,Milborne,Mitford,Modbury,Montacute,Mousehole,Newbiggin,Newborough,Newbury,Newenden,Newent,Norham,Northleach,Noss,Oakham,Olney,Orford,Ormskirk,Oswestry,Padstow,Paignton,Penkneth,Penrith,Penzance,Pershore,Petersfield,Pevensey,Pickering,Pilton,Pontefract,Portsmouth,Preston,Quatford,Reading,Redcliff,Retford,Rockingham,Romney,Rothbury,Rothwell,Salisbury,Saltash,Seaford,Seasalter,Sherston,Shifnal,Shoreham,Sidmouth,Skipsea,Skipton,Solihull,Somerton,Southam,Southwark,Standon,Stansted,Stapleton,Stottesdon,Sudbury,Swavesey,Tamerton,Tarporley,Tetbury,Thatcham,Thaxted,Thetford,Thornbury,Tintagel,Tiverton,Torksey,Totnes,Towcester,Tregoney,Trematon,Tutbury,Uxbridge,Wallingford,Wareham,Warenmouth,Wargrave,Warton,Watchet,Watford,Wendover,Westbury,Westcheap,Weymouth,Whitford,Wickwar,Wigan,Wigmore,Winchelsea,Winkleigh,Wiscombe,Witham,Witheridge,Wiveliscombe,Woodbury,Yeovil"},
|
||||
|
|
@ -85,7 +85,7 @@ export const defaultNameBases: INameBase[] = [
|
|||
{name: "Iranian", i: NB.Iranian, min: 5, max: 11, d: "", m: .1, b: "Abali,Abrisham,Absard,Abuzeydabad,Afus,Alavicheh,Alikosh,Amol,Anarak,Anbar,Andisheh,Anshan,Aran,Ardabil,Arderica,Ardestan,Arjomand,Asgaran,Asgharabad,Ashian,Awan,Babajan,Badrud,Bafran,Baghestan,Baghshad,Bahadoran,Baharan Shahr,Baharestan,Bakun,Bam,Baqershahr,Barzok,Bastam,Behistun,Bitistar,Bumahen,Bushehr,Chadegan,Chahardangeh,Chamgardan,Chermahin,Choghabonut,Chugan,Damaneh,Damavand,Darabgard,Daran,Dastgerd,Dehaq,Dehaqan,Dezful,Dizicheh,Dorcheh,Dowlatabad,Duruntash,Ecbatana,Eslamshahr,Estakhr,Ezhiyeh,Falavarjan,Farrokhi,Fasham,Ferdowsieh,Fereydunshahr,Ferunabad,Firuzkuh,Fuladshahr,Ganjdareh,Ganzak,Gaz,Geoy,Godin,Goldasht,Golestan,Golpayegan,Golshahr,Golshan,Gorgab,Guged,Habibabad,Hafshejan,Hajjifiruz,Hana,Harand,Hasanabad,Hasanlu,Hashtgerd,Hecatompylos,Hormirzad,Imanshahr,Isfahan,Jandaq,Javadabad,Jiroft,Jowsheqan,Jowzdan,Kabnak,Kahriz Sang,Kahrizak,Kangavar,Karaj,Karkevand,Kashan,Kelishad,Kermanshah,Khaledabad,Khansar,Khorramabad,Khur,Khvorzuq,Kilan,Komeh,Komeshcheh,Konar,Kuhpayeh,Kul,Kushk,Lavasan,Laybid,Liyan,Lyan,Mahabad,Mahallat,Majlesi,Malard,Manzariyeh,Marlik,Meshkat,Meymeh,Miandasht,Mish,Mobarakeh,Nahavand,Nain,Najafabad,Naqshe,Narezzash,Nasimshahr,Nasirshahr,Nasrabad,Natanz,Neyasar,Nikabad,Nimvar,Nushabad,Pakdasht,Parand,Pardis,Parsa,Pasargadai,Patigrabana,Pir Bakran,Pishva,Qahderijan,Qahjaverestan,Qamsar,Qarchak,Qods,Rabat,Ray-shahr,Rezvanshahr,Rhages,Robat Karim,Rozveh,Rudehen,Sabashahr,Safadasht,Sagzi,Salehieh,Sandal,Sarvestan,Sedeh,Sefidshahr,Semirom,Semnan,Shadpurabad,Shah,Shahdad,Shahedshahr,Shahin,Shahpour,Shahr,Shahreza,Shahriar,Sharifabad,Shemshak,Shiraz,Shushan,Shushtar,Sialk,Sin,Sukhteh,Tabas,Tabriz,Takhte,Talkhuncheh,Talli,Tarq,Temukan,Tepe,Tiran,Tudeshk,Tureng,Urmia,Vahidieh,Vahrkana,Vanak,Varamin,Varnamkhast,Varzaneh,Vazvan,Yahya,Yarim,Yasuj,Zarrin Shahr,Zavareh,Zayandeh,Zazeran,Ziar,Zibashahr,Zranka"},
|
||||
{name: "Hawaiian", i: NB.Hawaiian, min: 5, max: 10, d: "auo", m: 1, b: "Aapueo,Ahoa,Ahuakaio,Ahuakamalii,Ahuakeio,Ahupau,Aki,Alaakua,Alae,Alaeloa,Alaenui,Alamihi,Aleamai,Alena,Alio,Aupokopoko,Auwahi,Hahakea,Haiku,Halakaa,Halehaku,Halehana,Halemano,Haleu,Haliimaile,Hamakuapoko,Hamoa,Hanakaoo,Hanaulu,Hanawana,Hanehoi,Haneoo,Haou,Hikiaupea,Hoalua,Hokuula,Honohina,Honokahua,Honokala,Honokalani,Honokeana,Honokohau,Honokowai,Honolua,Honolulu,Honolulunui,Honomaele,Honomanu,Hononana,Honopou,Hoolawa,Hopenui,Hualele,Huelo,Hulaia,Ihuula,Ilikahi,Kaalaea,Kaalelehinale,Kaapahu,Kaehoeho,Kaeleku,Kaeo,Kahakuloa,Kahalawe,Kahalawe,Kahalehili,Kahana,Kahilo,Kahuai,Kaiaula,Kailihiakoko,Kailua,Kainehe,Kakalahale,Kakanoni,Kakio,Kakiweka,Kalena,Kalenanui,Kaleoaihe,Kalepa,Kaliae,Kalialinui,Kalihi,Kalihi,Kalihi,Kalimaohe,Kaloi,Kamani,Kamaole,Kamehame,Kanahena,Kanaio,Kaniaula,Kaonoulu,Kaopa,Kapaloa,Kapaula,Kapewakua,Kapohue,Kapuaikini,Kapunakea,Kapuuomahuka,Kauau,Kauaula,Kaukuhalahala,Kaulalo,Kaulanamoa,Kauluohana,Kaumahalua,Kaumakani,Kaumanu,Kaunauhane,Kaunuahane,Kaupakulua,Kawaipapa,Kawaloa,Kawaloa,Kawalua,Kawela,Keaa,Keaalii,Keaaula,Keahua,Keahuapono,Keakuapauaela,Kealahou,Keanae,Keauhou,Kekuapawela,Kelawea,Keokea,Keopuka,Kepio,Kihapuhala,Kikoo,Kilolani,Kipapa,Koakupuna,Koali,Koananai,Koheo,Kolea,Kolokolo,Kooka,Kopili,Kou,Kualapa,Kuhiwa,Kuholilea,Kuhua,Kuia,Kuiaha,Kuikui,Kukoae,Kukohia,Kukuiaeo,Kukuioolu,Kukuipuka,Kukuiula,Kulahuhu,Kumunui,Lapakea,Lapalapaiki,Lapueo,Launiupoko,Loiloa,Lole,Lualailua,Maalo,Mahinahina,Mahulua,Maiana,Mailepai,Makaakini,Makaalae,Makaehu,Makaiwa,Makaliua,Makapipi,Makapuu,Makawao,Makila,Mala,Maluaka,Mamalu,Manawaiapiki,Manawainui,Maulili,Mehamenui,Miana,Mikimiki,Moalii,Moanui,Mohopili,Mohopilo,Mokae,Mokuia,Mokupapa,Mooiki,Mooloa,Moomuku,Muolea,Nahuakamalii,Nailiilipoko,Nakaaha,Nakalepo,Nakaohu,Nakapehu,Nakula,Napili,Niniau,Niumalu,Nuu,Ohia,Oloewa,Olowalu,Omaopio,Onau,Onouli,Opaeula,Opana,Opikoula,Paakea,Paeahu,Paehala,Paeohi,Pahoa,Paia,Pakakia,Pakala,Palauea,Palemo,Panaewa,Paniau,Papaaea,Papaanui,Papaauhau,Papahawahawa,Papaka,Papauluana,Pauku,Paunau,Pauwalu,Pauwela,Peahi,Piapia,Pohakanele,Pohoula,Polaiki,Polanui,Polapola,Polua,Poopoo,Popoiwi,Popoloa,Poponui,Poupouwela,Puaa,Puaaluu,Puahoowali,Puakea,Puako,Pualaea,Puehuehu,Puekahi,Pueokauiki,Pukaauhuhu,Pukalani,Pukuilua,Pulehu,Pulehuiki,Pulehunui,Punaluu,Puolua,Puou,Puuhaehae,Puuhaoa,Puuiki,Puuki,Puukohola,Puulani,Puumaneoneo,Puunau,Puunoa,Puuomaiai,Puuomaile,Uaoa,Uhao,Ukumehame,Ulaino,Ulumalu,Wahikuli,Waiahole,Waiakoa,Waianae,Waianu,Waiawa,Waiehu,Waieli,Waihee,Waikapu,Wailamoa,Wailaulau,Wailua,Wailuku,Wainee,Waiohole,Waiohonu,Waiohue,Waiohuli,Waiokama,Waiokila,Waiopai,Waiopua,Waipao,Waipio,Waipioiki,Waipionui,Waipouli,Wakiu,Wananalua"},
|
||||
{name: "Karnataka", i: NB.Karnataka, min: 5, max: 11, d: "tnl", m: 0, b: "Adityapatna,Adyar,Afzalpur,Aland,Alnavar,Alur,Ambikanagara,Anekal,Ankola,Annigeri,Arkalgud,Arsikere,Athni,Aurad,Badami,Bagalkot,Bagepalli,Bail,Bajpe,Bangalore,Bangarapet,Bankapura,Bannur,Bantval,Basavakalyan,Basavana,Belgaum,Beltangadi,Belur,Bhadravati,Bhalki,Bhatkal,Bhimarayanagudi,Bidar,Bijapur,Bilgi,Birur,Bommasandra,Byadgi,Challakere,Chamarajanagar,Channagiri,Channapatna,Channarayapatna,Chik,Chikmagalur,Chiknayakanhalli,Chikodi,Chincholi,Chintamani,Chitapur,Chitgoppa,Chitradurga,Dandeli,Dargajogihalli,Devadurga,Devanahalli,Dod,Donimalai,Gadag,Gajendragarh,Gangawati,Gauribidanur,Gokak,Gonikoppal,Gubbi,Gudibanda,Gulbarga,Guledgudda,Gundlupet,Gurmatkal,Haliyal,Hangal,Harapanahalli,Harihar,Hassan,Hatti,Haveri,Hebbagodi,Heggadadevankote,Hirekerur,Holalkere,Hole,Homnabad,Honavar,Honnali,Hoovina,Hosakote,Hosanagara,Hosdurga,Hospet,Hubli,Hukeri,Hungund,Hunsur,Ilkal,Indi,Jagalur,Jamkhandi,Jevargi,Jog,Kadigenahalli,Kadur,Kalghatgi,Kamalapuram,Kampli,Kanakapura,Karkal,Karwar,Khanapur,Kodiyal,Kolar,Kollegal,Konnur,Koppa,Koppal,Koratagere,Kotturu,Krishnarajanagara,Krishnarajasagara,Krishnarajpet,Kudchi,Kudligi,Kudremukh,Kumta,Kundapura,Kundgol,Kunigal,Kurgunta,Kushalnagar,Kushtagi,Lakshmeshwar,Lingsugur,Londa,Maddur,Madhugiri,Madikeri,Mahalingpur,Malavalli,Mallar,Malur,Mandya,Mangalore,Manvi,Molakalmuru,Mudalgi,Mudbidri,Muddebihal,Mudgal,Mudhol,Mudigere,Mulbagal,Mulgund,Mulki,Mulur,Mundargi,Mundgod,Munirabad,Mysore,Nagamangala,Nanjangud,Narasimharajapura,Naregal,Nargund,Navalgund,Nipani,Pandavapura,Pavagada,Piriyapatna,Pudu,Puttur,Rabkavi,Raichur,Ramanagaram,Ramdurg,Ranibennur,Raybag,Robertson,Ron,Sadalgi,Sagar,Sakleshpur,Saligram,Sandur,Sankeshwar,Saundatti,Savanur,Sedam,Shahabad,Shahpur,Shaktinagar,Shiggaon,Shikarpur,Shirhatti,Shorapur,Shrirangapattana,Siddapur,Sidlaghatta,Sindgi,Sindhnur,Sira,Siralkoppa,Sirsi,Siruguppa,Somvarpet,Sorab,Sringeri,Srinivaspur,Sulya,Talikota,Tarikere,Tekkalakote,Terdal,Thumbe,Tiptur,Tirthahalli,Tirumakudal,Tumkur,Turuvekere,Udupi,Vijayapura,Wadi,Yadgir,Yelandur,Yelbarga,Yellapur,Yenagudde"},
|
||||
{name: "Quechua", i: NB.Quechua, min: 6, max: 12, d: "l", m: 0, b: "Altomisayoq,Ancash,Andahuaylas,Apachekta,Apachita,Apu ,Apurimac,Arequipa,Atahuallpa,Atawalpa,Atico,Ayacucho,Ayllu,Cajamarca,Carhuac,Carhuacatac,Cashan,Caullaraju,Caxamalca,Cayesh,Chacchapunta,Chacraraju,Champara,Chanchan,Chekiacraju,Chinchey,Chontah,Chopicalqui,Chucuito,Chuito,Chullo,Chumpi,Chuncho,Chuquiapo,Churup,Cochapata,Cojup,Collota,Conococha,Copa,Corihuayrachina,Cusichaca,Despacho,Haika,Hanpiq,Hatun,Haywarisqa,Huaca,Hualcan,Huamanga,Huamashraju,Huancarhuas,Huandoy,Huantsan,Huarmihuanusca,Huascaran,Huaylas,Huayllabamba,Huichajanca,Huinayhuayna,Huinioch,Illiasca,Intipunku,Ishinca,Jahuacocha,Jirishanca,Juli,Jurau,Kakananpunta,Kamasqa,Karpay,Kausay,Khuya ,Kuelap,Llaca,Llactapata,Llanganuco,Llaqta,Llupachayoc,Machu,Mallku,Matarraju,Mikhuy,Milluacocha,Munay,Ocshapalca,Ollantaytambo,Pacamayo,Paccharaju,Pachacamac,Pachakamaq,Pachakuteq,Pachakuti,Pachamama ,Paititi,Pajaten,Palcaraju,Pampa,Panaka,Paqarina,Paqo,Parap,Paria,Patallacta,Phuyupatamarca,Pisac,Pongos,Pucahirca,Pucaranra,Puscanturpa,Putaca,Qawaq ,Qayqa,Qochamoqo,Qollana,Qorihuayrachina,Qorimoqo,Quenuaracra,Queshque,Quillcayhuanca,Quillya,Quitaracsa,Quitaraju,Qusqu,Rajucolta,Rajutakanan,Rajutuna,Ranrahirca,Ranrapalca,Raria,Rasac,Rimarima,Riobamba,Runkuracay,Rurec,Sacsa,Saiwa,Sarapo,Sayacmarca,Sinakara,TamboColorado,Tamboccocha,Taripaypacha,Taulliraju,Tawantinsuyu,Taytanchis,Tiwanaku,Tocllaraju,Tsacra,Tuco,Tullparaju,Tumbes,Ulta,Uruashraju,Vallunaraju,Vilcabamba,Wacho ,Wankawillka,Wayra,Yachay,Yahuarraju,Yanamarey,Yanesha,Yerupaja"},
|
||||
{name: "Quechua", i: NB.Quechua, min: 6, max: 12, d: "l", m: 0, b: "Altomisayoq,Ancash,Andahuaylas,Apachekta,Apachita,Apu ,Apurimac,Arequipa,Atahuallpa,Atawalpa,Atico,Ayacucho,Ayllu,Cajamarca,Carhuac,Carhuacatac,Cashan,Caullaraju,Caxamalca,Cayesh,Chacchapunta,Chacraraju,Champara,Chanchan,Chekiacraju,Chinchey,Chontah,Chopicalqui,Chucuito,Chuito,Chullo,Chumpi,Chuncho,Chuquiapo,Churup,Cochapata,Cojup,Collota,Conococha,Copa,Corihuayrachina,Cusichaca,Despacho,Haika,Hanpiq,Hatun,Haywarisqa,Huaca,Hualcan,Huamanga,Huamashraju,Huancarhuas,Huandoy,Huantsan,Huarmihuanusca,Huascaran,Huaylas,Huayllabamba,Huichajanca,Huinayhuayna,Huinioch,Illiasca,Intipunku,Ishinca,Jahuacocha,Jirishanca,Juli,Jurau,Kakananpunta,Kamasqa,Karpay,Kausay,Khuya ,Kuelap,Llaca,Llactapata,Llanganuco,Llaqta,Llupachayoc,Machu,Mallku,Matarraju,Mikhuy,Milluacocha,Munay,Ocshapalca,Ollantaytambo,Pacamayo,Paccharaju,Pachacamac,Pachakamaq,Pachakuteq,Pachakuti,Pachamama,Paititi,Pajaten,Palcaraju,Pampa,Panaka,Paqarina,Paqo,Parap,Paria,Patallacta,Phuyupatamarca,Pisac,Pongos,Pucahirca,Pucaranra,Puscanturpa,Putaca,Qawaq ,Qayqa,Qochamoqo,Qollana,Qorihuayrachina,Qorimoqo,Quenuaracra,Queshque,Quillcayhuanca,Quillya,Quitaracsa,Quitaraju,Qusqu,Rajucolta,Rajutakanan,Rajutuna,Ranrahirca,Ranrapalca,Raria,Rasac,Rimarima,Riobamba,Runkuracay,Rurec,Sacsa,Saiwa,Sarapo,Sayacmarca,Sinakara,TamboColorado,Tamboccocha,Taripaypacha,Taulliraju,Tawantinsuyu,Taytanchis,Tiwanaku,Tocllaraju,Tsacra,Tuco,Tullparaju,Tumbes,Ulta,Uruashraju,Vallunaraju,Vilcabamba,Wacho ,Wankawillka,Wayra,Yachay,Yahuarraju,Yanamarey,Yanesha,Yerupaja"},
|
||||
{name: "Swahili", i: NB.Swahili, min: 4, max: 9, d: "", m: 0, b: "Abim,Adjumani,Alebtong,Amolatar,Amuria,Amuru,Apac,Arua,Arusha,Babati,Baragoi,Bombo,Budaka,Bugembe,Bugiri,Buikwe,Bukedea,Bukoba,Bukomansimbi,Bukungu,Buliisa,Bundibugyo,Bungoma,Busembatya,Bushenyi,Busia,Busia,Busolwe,Butaleja,Butambala,Butere,Buwenge,Buyende,Dadaab,Dodoma,Dokolo,Eldoret,Elegu,Emali,Embu,Entebbe,Garissa,Gede,Gulu,Handeni,Hima,Hoima,Hola,Ibanda,Iganga,Iringa,Isingiro,Isiolo,Jinja,Kaabong,Kabale,Kaberamaido,Kabuyanda,Kabwohe,Kagadi,Kahama,Kajiado,Kakamega,Kakinga,Kakira,Kakiri,Kakuma,Kalangala,Kaliro,Kalisizo,Kalongo,Kalungu,Kampala,Kamuli,Kamwenge,Kanoni,Kanungu,Kapchorwa,Kapenguria,Kasese,Kasulu,Katakwi,Kayunga,Kericho,Keroka,Kiambu,Kibaale,Kibaha,Kibingo,Kiboga,Kibwezi,Kigoma,Kihiihi,Kilifi,Kira,Kiruhura,Kiryandongo,Kisii,Kisoro,Kisumu,Kitale,Kitgum,Kitui,Koboko,Korogwe,Kotido,Kumi,Kyazanga,Kyegegwa,Kyenjojo,Kyotera,Lamu,Langata,Lindi,Lodwar,Lokichoggio,Londiani,Loyangalani,Lugazi,Lukaya,Luweero,Lwakhakha,Lwengo,Lyantonde,Machakos,Mafinga,Makambako,Makindu,Malaba,Malindi,Manafwa,Mandera,Maralal,Marsabit,Masaka,Masindi,MasindiPort,Masulita,Matugga,Mayuge,Mbale,Mbarara,Mbeya,Meru,Mitooma,Mityana,Mombasa,Morogoro,Moroto,Moshi,Moyale,Moyo,Mpanda,Mpigi,Mpondwe,Mtwara,Mubende,Mukono,Mumias,Muranga,Musoma,Mutomo,Mutukula,Mwanza,Nagongera,Nairobi,Naivasha,Nakapiripirit,Nakaseke,Nakasongola,Nakuru,Namanga,Namayingo,Namutumba,Nansana,Nanyuki,Narok,Naromoru,Nebbi,Ngora,Njeru,Njombe,Nkokonjeru,Ntungamo,Nyahururu,Nyeri,Oyam,Pader,Paidha,Pakwach,Pallisa,Rakai,Ruiru,Rukungiri,Rwimi,Sanga,Sembabule,Shimoni,Shinyanga,Singida,Sironko,Songea,Soroti,Ssabagabo,Sumbawanga,Tabora,Takaungu,Tanga,Thika,Tororo,Tunduma,Vihiga,Voi,Wajir,Wakiso,Watamu,Webuye,Wobulenzi,Wote,Wundanyi,Yumbe,Zanzibar"},
|
||||
{name: "Vietnamese", i: NB.Vietnamese, min: 3, max: 12, d: "", m: 1, b: "An Khe,An Nhon,Ayun Pa,Ba Don,Ba Ria,Bac Giang,Bac Kan,Bac Lieu,Bac Ninh,Bao Loc,Ben Cat,Ben Tre,Bien Hoa,Bim Son,Binh Long,Binh Minh,Buon Ho,Buon Ma Thuot,Ca Mau,Cai Lay,Cam Pha,Cam Ranh,Can Tho,Cao Bang,Cao Lanh,Chau Doc,Chi Linh,Cua Lo,Da Lat,Da Nang,Di An,Dien Ban,Dien Bien Phu,Dong Ha,Dong Hoi,Dong Trieu,Duyen Hai,Gia Nghia,Gia Rai,Go Cong,Ha Giang,Ha Long,Ha Noi,Ha Tinh,Hai Duong,Hai Phong,Hoa Binh,Hoang Mai,Hoi An,Hong Linh,Hong Ngu,Hue,Hung Yen,Huong Thuy,Huong Tra,Kien Tuong,Kon Tum,Ky Anh,La Gi,Lai Chau,Lang Son,Lao Cai,Long Khanh,Long My,Long Xuyen,Mong Cai,Muong Lay,My Hao,My Tho,Nam Dinh,Nga Bay,Nga Nam,Nghia Lo,Nha Trang,Ninh Binh,Ninh Hoa,Phan Rang Thap Cham,Phan Thiet,Pho Yen,Phu Ly,Phu My,Phu Tho,Phuoc Long,Pleiku,Quang Ngai,Quang Tri,Quang Yen,Quy Nhon,Rach Gia,Sa Dec,Sam Son,Soc Trang,Son La,Son Tay,Song Cau,Song Cong,Tam Diep,Tam Ky,Tan An,Tan Chau,Tan Uyen,Tay Ninh,Thai Binh,Thai Hoa,Thai Nguyen,Thanh Hoa,Thu Dau Mot,Thuan An,Tra Vinh,Tu Son,Tuy Hoa,Tuyen Quang,Uong Bi,Vi Thanh,Viet Tri,Vinh,Vinh Chau,Vinh Long,Vinh Yen,Vung Tau,Yen Bai"},
|
||||
{name: "Cantonese", i: NB.Cantonese, min: 5, max: 11, d: "", m: 0, b: "Chaiwan,Chekham,Cheungshawan,Chingchung,Chinghoi,Chingsen,Chingshing,Chiunam,Chiuon,Chiuyeung,Chiyuen,Choihung,Chuehoi,Chuiman,Chungfa,Chungfu,Chungsan,Chunguktsuen,Dakhing,Daopo,Daumun,Dingwu,Dinpak,Donggun,Dongyuen,Duenchau,Fachau,Fado,Fanling,Fatgong,Fatshan,Fotan,Fuktien,Fumun,Funggong,Funghoi,Fungshun,Fungtei,Gamtin,Gochau,Goming,Gonghoi,Gongshing,Goyiu,Hanghau,Hangmei,Hashan,Hengfachuen,Hengon,Heungchau,Heunggong,Heungkiu,Hingning,Hohfuktong,Hoichue,Hoifung,Hoiping,Hokong,Hokshan,Homantin,Hotin,Hoyuen,Hunghom,Hungshuikiu,Jiuling,Kamping,Kamsheung,Kamwan,Kaulongtong,Keilun,Kinon,Kinsang,Kityeung,Kongmun,Kukgong,Kwaifong,Kwaihing,Kwongchau,Kwongling,Kwongming,Kwuntong,Laichikok,Laiking,Laiwan,Lamtei,Lamtin,Leitung,Leungking,Limkong,Linchau,Linnam,Linping,Linshan,Loding,Lokcheong,Lokfu,Lokmachau,Longchuen,Longgong,Longmun,Longping,Longwa,Longwu,Lowu,Luichau,Lukfung,Lukho,Lungmun,Macheung,Maliushui,Maonshan,Mauming,Maunam,Meifoo,Mingkum,Mogong,Mongkok,Muichau,Muigong,Muiyuen,Naiwai,Namcheong,Namhoi,Namhong,Namo,Namsha,Namshan,Nganwai,Ngchuen,Ngoumun,Ngwa,Nngautaukok,Onting,Pakwun,Paotoishan,Pingshan,Pingyuen,Poklo,Polam,Pongon,Poning,Potau,Puito,Punyue,Saiwanho,Saiyingpun,Samshing,Samshui,Samtsen,Samyuenlei,Sanfung,Sanhing,Sanhui,Sanwai,Sanwui,Seiwui,Shamshuipo,Shanmei,Shantau,Shatin,Shatinwai,Shaukeiwan,Shauking,Shekkipmei,Shekmun,Shekpai,Sheungshui,Shingkui,Shiuhing,Shundak,Shunyi,Shupinwai,Simshing,Siuhei,Siuhong,Siukwan,Siulun,Suikai,Taihing,Taikoo,Taipo,Taishuihang,Taiwai,Taiwo,Taiwohau,Tinhau,Tinho,Tinking,Tinshuiwai,Tiukengleng,Toishan,Tongfong,Tonglowan,Tsakyoochung,Tsamgong,Tsangshing,Tseungkwano,Tsihing,Tsimshatsui,Tsinggong,Tsingshantsuen,Tsingwun,Tsingyi,Tsingyuen,Tsiuchau,Tsuenshekshan,Tsuenwan,Tuenmun,Tungchung,Waichap,Waichau,Waidong,Wailoi,Waishing,Waiyeung,Wanchai,Wanfau,Wanon,Wanshing,Wingon,Wongchukhang,Wongpo,Wongtaisin,Woping,Wukaisha,Yano,Yaumatei,Yauoi,Yautong,Yenfa,Yeungchun,Yeungdong,Yeunggong,Yeungsai,Yeungshan,Yimtin,Yingdak,Yiuping,Yongshing,Yongyuen,Yuenlong,Yuenshing,Yuetsau,Yuknam,Yunping,Yuyuen"},
|
||||
|
|
|
|||
|
|
@ -1000,7 +1000,6 @@ window.BurgsAndStates = (function () {
|
|||
}
|
||||
|
||||
TIME && console.timeEnd("generateDiplomacy");
|
||||
//console.table(states.map(s => s.diplomacy));
|
||||
};
|
||||
|
||||
// select a forms for listed or all valid states
|
||||
|
|
@ -1053,7 +1052,7 @@ window.BurgsAndStates = (function () {
|
|||
const isTheocracy =
|
||||
(religion && pack.religions[religion].expansion === "state") ||
|
||||
(P(0.1) && ["Organized", "Cult"].includes(pack.religions[religion].type));
|
||||
const isAnarchy = P(0.01 - tier / 500);
|
||||
const isAnarchy = P((1 - tier / 5) / 100); // 1% for smallest states, 0.2% for biggest
|
||||
|
||||
if (isTheocracy) s.form = "Theocracy";
|
||||
else if (isAnarchy) s.form = "Anarchy";
|
||||
|
|
|
|||
|
|
@ -157,8 +157,7 @@ window.Names = (function () {
|
|||
base = 1;
|
||||
}
|
||||
const min = nameBases[base].min - 1;
|
||||
const max = Math.max(nameBases[base].max - 2, min);
|
||||
return getBase(base, min, max, "", 0);
|
||||
return getBase(base, min, min, "", 0);
|
||||
};
|
||||
|
||||
// generate state name based on capital or random name and culture-specific suffix
|
||||
|
|
|
|||
|
|
@ -16,6 +16,7 @@ import {
|
|||
} from "utils/unitUtils";
|
||||
import {showMainTip, tip} from "scripts/tooltips";
|
||||
import {defineEmblemData} from "./utils";
|
||||
import {isState} from "utils/typeUtils";
|
||||
|
||||
export const onMouseMove = debounce(handleMouseMove, 100);
|
||||
|
||||
|
|
@ -75,8 +76,9 @@ const getHoveredElement = (tagName: string, group: string, subgroup: string, isL
|
|||
if (layerIsOn("togglePopulation")) return "populationLayer";
|
||||
if (layerIsOn("toggleTemp")) return "temperatureLayer";
|
||||
if (layerIsOn("toggleBiomes") && biome[cellId]) return "biomesLayer";
|
||||
if (religion[cellId]) return "religionsLayer"; // layerIsOn("toggleReligions") &&
|
||||
if (layerIsOn("toggleProvinces") || (layerIsOn("toggleStates") && state[cellId])) return "statesLayer";
|
||||
if (layerIsOn("toggleReligions") && religion[cellId]) return "religionsLayer";
|
||||
// if (layerIsOn("toggleProvinces") || (layerIsOn("toggleStates") && state[cellId])) return "statesLayer";
|
||||
if (state[cellId]) return "statesLayer";
|
||||
if (layerIsOn("toggleCultures") && culture[cellId]) return "culturesLayer";
|
||||
if (layerIsOn("toggleHeight")) return "heightLayer";
|
||||
|
||||
|
|
@ -193,16 +195,18 @@ const onHoverEventsMap: OnHoverEventMap = {
|
|||
},
|
||||
|
||||
statesLayer: ({packCellId}) => {
|
||||
const state = pack.cells.state[packCellId];
|
||||
const stateName = pack.states[state].fullName;
|
||||
const province = pack.cells.province[packCellId];
|
||||
const prov = province ? `${pack.provinces[province].fullName}, ` : "";
|
||||
tip(prov + stateName);
|
||||
const stateId = pack.cells.state[packCellId];
|
||||
const state = pack.states[stateId];
|
||||
const stateName = isState(state) ? state.fullName : state.name;
|
||||
|
||||
highlightDialogLine("statesEditor", state);
|
||||
highlightDialogLine("diplomacyEditor", state);
|
||||
highlightDialogLine("militaryEditor", state);
|
||||
highlightDialogLine("provincesEditor", province);
|
||||
const provinceId = pack.cells.province[packCellId];
|
||||
const provinceName = provinceId ? `${pack.provinces[provinceId].fullName}, ` : "";
|
||||
tip(provinceName + stateName);
|
||||
|
||||
highlightDialogLine("statesEditor", stateId);
|
||||
highlightDialogLine("diplomacyEditor", stateId);
|
||||
highlightDialogLine("militaryEditor", stateId);
|
||||
highlightDialogLine("provincesEditor", provinceId);
|
||||
},
|
||||
|
||||
culturesLayer: ({packCellId}) => {
|
||||
|
|
|
|||
|
|
@ -70,8 +70,8 @@ async function generate(options?: IGenerationOptions) {
|
|||
// renderLayer("biomes");
|
||||
renderLayer("burgs");
|
||||
renderLayer("routes");
|
||||
// renderLayer("states");
|
||||
renderLayer("religions");
|
||||
renderLayer("states");
|
||||
// renderLayer("religions");
|
||||
|
||||
// pack.cells.route.forEach((route, index) => {
|
||||
// if (route === 2) drawPoint(pack.cells.p[index], {color: "black"});
|
||||
|
|
|
|||
|
|
@ -0,0 +1,46 @@
|
|||
import {MIN_LAND_HEIGHT} from "config/generation";
|
||||
import {TIME} from "config/logging";
|
||||
|
||||
export type TStateStatistics = Record<number, typeof initialData>;
|
||||
const initialData = {cells: 0, area: 0, burgs: 0, rural: 0, urban: 0, neighbors: [] as number[]};
|
||||
|
||||
// calculate states data like area, population, etc.
|
||||
export function collectStatistics(
|
||||
cells: Pick<IPack["cells"], "i" | "c" | "h" | "area" | "pop" | "state" | "burg">,
|
||||
burgs: TBurgs
|
||||
) {
|
||||
TIME && console.time("collectStatistics");
|
||||
|
||||
const statesData: TStateStatistics = {};
|
||||
const initiate = (stateId: number) => {
|
||||
statesData[stateId] = structuredClone(initialData);
|
||||
};
|
||||
|
||||
// check for neighboring states
|
||||
const checkNeib = (neibCellId: number, stateId: number) => {
|
||||
const neibStateId = cells.state[neibCellId];
|
||||
if (!neibStateId || neibStateId === stateId) return;
|
||||
if (!statesData[stateId].neighbors.includes(neibStateId)) statesData[stateId].neighbors.push(neibStateId);
|
||||
};
|
||||
|
||||
for (const cellId of cells.i) {
|
||||
if (cells.h[cellId] < MIN_LAND_HEIGHT) continue;
|
||||
const stateId = cells.state[cellId];
|
||||
if (!statesData[stateId]) initiate(stateId);
|
||||
|
||||
cells.c[cellId].forEach(neibCellId => checkNeib(neibCellId, stateId));
|
||||
|
||||
statesData[stateId].cells += 1;
|
||||
statesData[stateId].area += cells.area[cellId];
|
||||
statesData[stateId].rural += cells.pop[cellId];
|
||||
|
||||
const burgId = cells.burg[cellId];
|
||||
if (burgId) {
|
||||
statesData[stateId].burgs += 1;
|
||||
statesData[stateId].urban += (burgs[burgId] as IBurg)?.population || 0;
|
||||
}
|
||||
}
|
||||
|
||||
TIME && console.timeEnd("collectStatistics");
|
||||
return statesData;
|
||||
}
|
||||
|
|
@ -1,2 +1,108 @@
|
|||
import {NAMEBASE as NB} from "config/namebases";
|
||||
|
||||
export const NO_BURG: TNoBurg = {i: 0, name: undefined};
|
||||
export const NEUTRALS: TNeutrals = {i: 0, name: "Neutrals"};
|
||||
|
||||
export enum AreaTiers {
|
||||
DUCHY = 0,
|
||||
GRAND_DUCHY = 1,
|
||||
PRINCIPALITY = 2,
|
||||
KINGDOM = 3,
|
||||
EMPIRE = 4
|
||||
}
|
||||
|
||||
export const StateForms = {
|
||||
monarchy: ["Duchy", "Grand Duchy", "Principality", "Kingdom", "Empire"] as const, // per area tier
|
||||
republic: {
|
||||
Republic: 75,
|
||||
Federation: 4,
|
||||
"Trade Company": 4,
|
||||
"Most Serene Republic": 2,
|
||||
Oligarchy: 2,
|
||||
Tetrarchy: 1,
|
||||
Triumvirate: 1,
|
||||
Diarchy: 1,
|
||||
Junta: 1
|
||||
},
|
||||
union: {
|
||||
Union: 3,
|
||||
League: 4,
|
||||
Confederation: 1,
|
||||
"United Kingdom": 1,
|
||||
"United Republic": 1,
|
||||
"United Provinces": 2,
|
||||
Commonwealth: 1,
|
||||
Heptarchy: 1
|
||||
},
|
||||
theocracy: {Theocracy: 20, Brotherhood: 1, Thearchy: 2, See: 1, "Holy State": 1},
|
||||
anarchy: {"Free Territory": 2, Council: 3, Commune: 1, Community: 1}
|
||||
};
|
||||
|
||||
type TMonarchyForms = typeof StateForms.monarchy[number];
|
||||
|
||||
// prettier-ignore
|
||||
export const culturalMonarchyFormsMap: {[key: number]: {[key in TMonarchyForms]?: string}} = {
|
||||
[NB.Ruthenian]: {Kingdom: "Tsardom", Empire: "Tsardom"},
|
||||
[NB.Greek]: {Duchy: "Despotate", "Grand Duchy": "Despotate"},
|
||||
[NB.Japanese]: {"Grand Duchy": "Shogunate", Kingdom: "Shogunate"},
|
||||
[NB.Turkish]: {Duchy: "Beylik", "Grand Duchy": "Horde", Principality: "Great Horde", Kingdom: "Khanate", Empire: "Sultanate"},
|
||||
[NB.Berber]: {Duchy: "Sheikhdom", "Grand Duchy": "Emirate", Principality: "Emirate", Empire: "Sultanate"},
|
||||
[NB.Arabic]: {Duchy: "Sheikhdom", "Grand Duchy": "Emirate", Principality: "Emirate", Empire: "Sultanate"},
|
||||
[NB.Iranian]: {Duchy: "Satrapy", "Grand Duchy": "Satrapy", Kingdom: "Shahdom"},
|
||||
[NB.Mongolian]: {Duchy: "Horde", "Grand Duchy": "Horde", Principality: "Ulus", Kingdom: "Khanate", Empire: "Khaganate"}
|
||||
};
|
||||
|
||||
const Catholic = {Duchy: "Diocese", "Grand Duchy": "Аrchdiocese"};
|
||||
const Orthodox = {
|
||||
Duchy: "Eparchy",
|
||||
"Grand Duchy": "Eparchy",
|
||||
Principality: "Exarchate",
|
||||
Kingdom: "Metropolia",
|
||||
Empire: "Patriarchate"
|
||||
};
|
||||
const Islamic = {
|
||||
Duchy: "Imamah",
|
||||
"Grand Duchy": "Imamah",
|
||||
Principality: "Imamah",
|
||||
Kingdom: "Caliphate",
|
||||
Empire: "Caliphate"
|
||||
};
|
||||
|
||||
export const culturalTheocracyFormsMap: {[key: number]: {[key in TMonarchyForms]?: string}} = {
|
||||
[NB.German]: Catholic,
|
||||
[NB.English]: Catholic,
|
||||
[NB.French]: Catholic,
|
||||
[NB.Italian]: Catholic,
|
||||
[NB.Castillian]: Catholic,
|
||||
[NB.Roman]: Catholic,
|
||||
[NB.Portuguese]: Catholic,
|
||||
[NB.Ruthenian]: Orthodox,
|
||||
[NB.Ruthenian]: Orthodox,
|
||||
[NB.Turkish]: Islamic,
|
||||
[NB.Nigerian]: Islamic,
|
||||
[NB.Berber]: Islamic,
|
||||
[NB.Arabic]: Islamic,
|
||||
[NB.Iranian]: Islamic,
|
||||
[NB.Swahili]: Islamic
|
||||
};
|
||||
|
||||
// state forms requiring Adjective + Name, all other forms use scheme Form + Of + Name
|
||||
export const adjectivalForms = [
|
||||
"Empire",
|
||||
"Sultanate",
|
||||
"Khaganate",
|
||||
"Shogunate",
|
||||
"Caliphate",
|
||||
"Despotate",
|
||||
"Theocracy",
|
||||
"Oligarchy",
|
||||
"Union",
|
||||
"Confederation",
|
||||
"Trade Company",
|
||||
"League",
|
||||
"Tetrarchy",
|
||||
"Triumvirate",
|
||||
"Diarchy",
|
||||
"Horde",
|
||||
"Marches"
|
||||
];
|
||||
|
|
|
|||
|
|
@ -0,0 +1,29 @@
|
|||
import {TIME} from "config/logging";
|
||||
import {getInputNumber} from "utils/nodeUtils";
|
||||
import {rn} from "utils/numberUtils";
|
||||
import type {createCapitals} from "./createCapitals";
|
||||
import {generateStateEmblem} from "./generateStateEmblem";
|
||||
|
||||
type TCapitals = ReturnType<typeof createCapitals>;
|
||||
export type TStateData = Pick<IState, "i" | "type" | "culture" | "center" | "expansionism" | "capital" | "coa">;
|
||||
|
||||
export function createStateData(capitals: TCapitals, cultures: TCultures) {
|
||||
TIME && console.time("createStates");
|
||||
|
||||
const powerInput = getInputNumber("powerInput");
|
||||
|
||||
const statesData: TStateData[] = capitals.map((capital, index) => {
|
||||
const {cell: cellId, culture: cultureId} = capital;
|
||||
const id = index + 1;
|
||||
|
||||
if (cultureId === 0) throw new Error("Culture id cannot be 0");
|
||||
const {type, shield} = cultures[cultureId] as ICulture;
|
||||
const expansionism = rn(Math.random() * powerInput + 1, 1);
|
||||
const coa = generateStateEmblem(type, shield);
|
||||
|
||||
return {i: id, type, center: cellId, expansionism, capital: id, culture: cultureId, coa};
|
||||
});
|
||||
|
||||
TIME && console.timeEnd("createStates");
|
||||
return statesData;
|
||||
}
|
||||
|
|
@ -1,44 +0,0 @@
|
|||
import {TIME} from "config/logging";
|
||||
import {getColors} from "utils/colorUtils";
|
||||
import {getInputNumber} from "utils/nodeUtils";
|
||||
import {rn} from "utils/numberUtils";
|
||||
import {each} from "utils/probabilityUtils";
|
||||
import {NEUTRALS} from "./config";
|
||||
import type {createCapitals} from "./createCapitals";
|
||||
|
||||
const {Names, COA} = window;
|
||||
|
||||
type TCapitals = ReturnType<typeof createCapitals>;
|
||||
|
||||
export function createStates(capitals: TCapitals, cultures: TCultures): TStates {
|
||||
TIME && console.time("createStates");
|
||||
|
||||
const colors = getColors(capitals.length);
|
||||
const powerInput = getInputNumber("powerInput");
|
||||
|
||||
const states = capitals.map((capital, index) => {
|
||||
const {cell: cellId, culture: cultureId, name: capitalName} = capital;
|
||||
const id = index + 1;
|
||||
const name = getStateName(cellId, capitalName, cultureId, cultures);
|
||||
const color = colors[index];
|
||||
|
||||
const {type, shield: cultureShield} = cultures[cultureId] as ICulture;
|
||||
const expansionism = rn(Math.random() * powerInput + 1, 1);
|
||||
|
||||
const shield = COA.getShield(cultureShield, null);
|
||||
const coa: ICoa = {...COA.generate(null, null, null, type), shield};
|
||||
|
||||
return {i: id, name, type, center: cellId, color, expansionism, capital: id, culture: cultureId, coa} as IState;
|
||||
});
|
||||
|
||||
TIME && console.timeEnd("createStates");
|
||||
return [NEUTRALS, ...states];
|
||||
}
|
||||
|
||||
function getStateName(cellId: number, capitalName: string, cultureId: number, cultures: TCultures): string {
|
||||
const useCapitalName = capitalName.length < 9 && each(5)(cellId);
|
||||
const nameBase = cultures[cultureId].base;
|
||||
const basename: string = useCapitalName ? capitalName : Names.getBaseShort(nameBase);
|
||||
|
||||
return Names.getState(basename, basename);
|
||||
}
|
||||
102
src/scripts/generation/pack/burgsAndStates/defineStateForm.ts
Normal file
102
src/scripts/generation/pack/burgsAndStates/defineStateForm.ts
Normal file
|
|
@ -0,0 +1,102 @@
|
|||
import {NAMEBASE} from "config/namebases";
|
||||
import * as d3 from "d3";
|
||||
|
||||
import {getInputNumber} from "utils/nodeUtils";
|
||||
import {P, rand, rw} from "utils/probabilityUtils";
|
||||
import type {TStateStatistics} from "./collectStatistics";
|
||||
import {AreaTiers, culturalMonarchyFormsMap, culturalTheocracyFormsMap, StateForms} from "./config";
|
||||
|
||||
// create 5 area tiers, 4 is the biggest, 0 the smallest
|
||||
export function createAreaTiers(statistics: TStateStatistics) {
|
||||
const stateAreas = Object.entries(statistics)
|
||||
.filter(([id]) => Number(id))
|
||||
.map(([, {area}]) => area);
|
||||
const medianArea = d3.median(stateAreas)!;
|
||||
|
||||
const topTierIndex = Math.max(Math.ceil(stateAreas.length ** 0.4) - 2, 0);
|
||||
const minTopTierArea = stateAreas.sort((a, b) => b - a)[topTierIndex];
|
||||
|
||||
return (area: number) => {
|
||||
const tier = Math.min(Math.floor((area / medianArea) * 2.6), 4) as AreaTiers;
|
||||
if (tier === AreaTiers.EMPIRE && area < minTopTierArea) return AreaTiers.KINGDOM;
|
||||
return tier;
|
||||
};
|
||||
}
|
||||
|
||||
export function defineStateForm(type: TCultureType, areaTier: AreaTiers, nameBase: number, burgsNumber: number) {
|
||||
const form = defineForm(type, areaTier);
|
||||
const formName = defineFormName(form, nameBase, areaTier, burgsNumber);
|
||||
|
||||
return {form, formName};
|
||||
}
|
||||
|
||||
const generic = {Monarchy: 25, Republic: 2, Union: 1};
|
||||
const naval = {Monarchy: 6, Republic: 2, Union: 1};
|
||||
|
||||
function defineForm(type: TCultureType, areaTier: AreaTiers) {
|
||||
const isAnarchy = P((1 - areaTier / 5) / 100); // [1% - 0.2%] chance
|
||||
if (isAnarchy) return "Anarchy";
|
||||
|
||||
// TODO: define Theocracies based on actual religion spread
|
||||
const religionsNumberModifier = Math.min(getInputNumber("religionsInput") / 10, 2.5); // [0-2.5]
|
||||
const isTheocracy = P(0.2 * religionsNumberModifier); // [0% - 50%] chance, av. 12%
|
||||
if (isTheocracy) return "Theocracy";
|
||||
|
||||
if (type === "Naval") return rw(naval);
|
||||
|
||||
return rw(generic);
|
||||
}
|
||||
|
||||
function defineFormName(
|
||||
form: ReturnType<typeof defineForm>,
|
||||
nameBase: number,
|
||||
areaTier: AreaTiers,
|
||||
burgsNumber: number
|
||||
) {
|
||||
if (form === "Monarchy") return defineMonarchyForm(nameBase, areaTier);
|
||||
if (form === "Republic") return defineRepublicForm(areaTier, burgsNumber);
|
||||
if (form === "Union") return rw(StateForms.union);
|
||||
if (form === "Theocracy") return defineTheocracyForm(nameBase, areaTier);
|
||||
if (form === "Anarchy") return rw(StateForms.anarchy);
|
||||
|
||||
return "test";
|
||||
}
|
||||
|
||||
// Default name depends on area tier, some name bases have special names for tiers
|
||||
function defineMonarchyForm(nameBase: number, areaTier: AreaTiers, diplomacy = [""], neighbors = []) {
|
||||
const form = StateForms.monarchy[areaTier];
|
||||
|
||||
// TODO: specific names for vassals
|
||||
const isVassal = diplomacy.includes("Vassal");
|
||||
if (isVassal) {
|
||||
if (areaTier === AreaTiers.DUCHY && neighbors.length > 1 && rand(6) < neighbors.length) return "Marches";
|
||||
if (nameBase === NAMEBASE.English && P(0.3)) return "Dominion";
|
||||
if (P(0.3)) return "Protectorate";
|
||||
}
|
||||
|
||||
if (culturalMonarchyFormsMap[nameBase]) {
|
||||
const culturalForm = culturalMonarchyFormsMap[nameBase][form];
|
||||
if (culturalForm) return culturalForm;
|
||||
}
|
||||
|
||||
return form;
|
||||
}
|
||||
|
||||
// Default name is from weighted array, special case for small states with only 1 burg
|
||||
function defineRepublicForm(areaTier: AreaTiers, burgsNumber: number) {
|
||||
if (areaTier < AreaTiers.PRINCIPALITY && burgsNumber === 1) return P(0.7) ? "Free City" : "City-state";
|
||||
return rw(StateForms.republic);
|
||||
}
|
||||
|
||||
function defineTheocracyForm(nameBase: number, areaTier: AreaTiers) {
|
||||
const form = StateForms.monarchy[areaTier];
|
||||
|
||||
if (P(0.05)) return "Divine " + form; // 5%
|
||||
|
||||
if (culturalTheocracyFormsMap[nameBase]) {
|
||||
const culturalForm = culturalTheocracyFormsMap[nameBase][form];
|
||||
if (culturalForm) return culturalForm;
|
||||
}
|
||||
|
||||
return rw(StateForms.theocracy);
|
||||
}
|
||||
|
|
@ -0,0 +1,22 @@
|
|||
import {getAdjective} from "utils/languageUtils";
|
||||
import {each} from "utils/probabilityUtils";
|
||||
import {adjectivalForms} from "./config";
|
||||
|
||||
const {Names} = window;
|
||||
|
||||
export function defineStateName(center: number, capitalName: string, nameBase: number, formName: string): string {
|
||||
if (["Free City", "City-state"].includes(formName)) return capitalName;
|
||||
|
||||
const useCapitalName = capitalName.length < 9 && each(5)(center);
|
||||
const basename: string = useCapitalName ? capitalName : Names.getBaseShort(nameBase);
|
||||
|
||||
return Names.getState(basename, basename);
|
||||
}
|
||||
|
||||
export function defineFullStateName(name: string, formName: string) {
|
||||
if (!formName) return name;
|
||||
if (!name && formName) return "The " + formName;
|
||||
|
||||
const isAdjectival = adjectivalForms.includes(formName) && !/-| /.test(name);
|
||||
return isAdjectival ? `${getAdjective(name)} ${formName}` : `${formName} of ${name}`;
|
||||
}
|
||||
|
|
@ -4,12 +4,12 @@ import {TIME} from "config/logging";
|
|||
import {getInputNumber} from "utils/nodeUtils";
|
||||
import {minmax} from "utils/numberUtils";
|
||||
import {ELEVATION, FOREST_BIOMES, MIN_LAND_HEIGHT, DISTANCE_FIELD} from "config/generation";
|
||||
import {isNeutals} from "utils/typeUtils";
|
||||
import type {TStateData} from "./createStateData";
|
||||
|
||||
// growth algorithm to assign cells to states
|
||||
export function expandStates(
|
||||
capitalCells: Map<number, boolean>,
|
||||
states: TStates,
|
||||
statesData: TStateData[],
|
||||
features: TPackFeatures,
|
||||
cells: Pick<IPack["cells"], "c" | "h" | "f" | "t" | "r" | "fl" | "s" | "biome" | "culture">
|
||||
) {
|
||||
|
|
@ -24,10 +24,7 @@ export function expandStates(
|
|||
const neutralInput = getInputNumber("neutralInput");
|
||||
const maxExpansionCost = (cellsNumber / 2) * neutralInput * statesNeutral;
|
||||
|
||||
for (const state of states) {
|
||||
if (state.i === 0) continue;
|
||||
|
||||
const {i: stateId, center: cellId} = state as IState;
|
||||
for (const {i: stateId, center: cellId} of statesData) {
|
||||
stateIds[cellId] = stateId;
|
||||
cost[cellId] = 1;
|
||||
queue.push({cellId, stateId}, 0);
|
||||
|
|
@ -66,11 +63,13 @@ export function expandStates(
|
|||
const GENERIC_LANDLOCKED_FEE = 0;
|
||||
const NAVAL_LANDLOCKED_FEE = 30;
|
||||
|
||||
const statesMap = new Map<number, TStateData>(statesData.map(stateData => [stateData.i, stateData]));
|
||||
|
||||
while (queue.length) {
|
||||
const priority = queue.peekValue()!;
|
||||
const {cellId, stateId} = queue.pop()!;
|
||||
|
||||
const {type, culture, center, expansionism} = getState(stateId);
|
||||
const {type, culture, center, expansionism} = statesMap.get(stateId)!;
|
||||
const capitalBiome = cells.biome[center];
|
||||
|
||||
cells.c[cellId].forEach(neibCellId => {
|
||||
|
|
@ -100,12 +99,6 @@ export function expandStates(
|
|||
|
||||
return normalizeStates(stateIds, capitalCells, cells.c, cells.h);
|
||||
|
||||
function getState(stateId: number) {
|
||||
const state = states[stateId];
|
||||
if (isNeutals(state)) throw new Error("Neutrals cannot expand");
|
||||
return state;
|
||||
}
|
||||
|
||||
function getCultureCost(cellId: number, stateCulture: number) {
|
||||
return cells.culture[cellId] === stateCulture ? SAME_CULTURE_BONUS : DIFFERENT_CULTURES_FEE;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,12 +1,36 @@
|
|||
import {WARN} from "config/logging";
|
||||
import {pick} from "utils/functionUtils";
|
||||
import {getInputNumber} from "utils/nodeUtils";
|
||||
import {collectStatistics} from "./collectStatistics";
|
||||
import {NEUTRALS, NO_BURG} from "./config";
|
||||
import {createCapitals} from "./createCapitals";
|
||||
import {createStates} from "./createStates";
|
||||
import {createStateData} from "./createStateData";
|
||||
import {createTowns} from "./createTowns";
|
||||
import {expandStates} from "./expandStates";
|
||||
import {specifyBurgs} from "./specifyBurgs";
|
||||
import {specifyStates} from "./specifyStates";
|
||||
|
||||
type TCellsData = Pick<
|
||||
IPack["cells"],
|
||||
| "v"
|
||||
| "c"
|
||||
| "p"
|
||||
| "b"
|
||||
| "i"
|
||||
| "g"
|
||||
| "area"
|
||||
| "h"
|
||||
| "f"
|
||||
| "t"
|
||||
| "haven"
|
||||
| "harbor"
|
||||
| "r"
|
||||
| "fl"
|
||||
| "biome"
|
||||
| "s"
|
||||
| "pop"
|
||||
| "culture"
|
||||
>;
|
||||
|
||||
export function generateBurgsAndStates(
|
||||
cultures: TCultures,
|
||||
|
|
@ -14,10 +38,7 @@ export function generateBurgsAndStates(
|
|||
temp: Int8Array,
|
||||
rivers: Omit<IRiver, "name" | "basin" | "type">[],
|
||||
vertices: IGraphVertices,
|
||||
cells: Pick<
|
||||
IPack["cells"],
|
||||
"v" | "c" | "p" | "b" | "i" | "g" | "h" | "f" | "t" | "haven" | "harbor" | "r" | "fl" | "biome" | "s" | "culture"
|
||||
>
|
||||
cells: TCellsData
|
||||
): {burgIds: Uint16Array; stateIds: Uint16Array; burgs: TBurgs; states: TStates} {
|
||||
const cellsNumber = cells.i.length;
|
||||
|
||||
|
|
@ -34,7 +55,7 @@ export function generateBurgsAndStates(
|
|||
|
||||
const capitals = createCapitals(statesNumber, scoredCellIds, cultures, pick(cells, "p", "f", "culture"));
|
||||
const capitalCells = new Map(capitals.map(({cell}) => [cell, true]));
|
||||
const states = createStates(capitals, cultures);
|
||||
const statesData = createStateData(capitals, cultures);
|
||||
|
||||
const towns = createTowns(
|
||||
cultures,
|
||||
|
|
@ -44,7 +65,7 @@ export function generateBurgsAndStates(
|
|||
|
||||
const stateIds = expandStates(
|
||||
capitalCells,
|
||||
states,
|
||||
statesData,
|
||||
features,
|
||||
pick(cells, "c", "h", "f", "t", "r", "fl", "s", "biome", "culture")
|
||||
);
|
||||
|
|
@ -57,13 +78,16 @@ export function generateBurgsAndStates(
|
|||
temp,
|
||||
vertices,
|
||||
cultures,
|
||||
states,
|
||||
statesData,
|
||||
rivers,
|
||||
pick(cells, "v", "p", "g", "h", "f", "haven", "harbor", "s", "biome", "fl", "r")
|
||||
);
|
||||
|
||||
const burgIds = assignBurgIds(burgs);
|
||||
|
||||
const statistics = collectStatistics({...cells, state: stateIds, burg: burgIds}, burgs);
|
||||
const states = specifyStates(statesData, statistics, cultures, burgs);
|
||||
|
||||
return {burgIds, stateIds, burgs, states};
|
||||
|
||||
function getScoredCellIds() {
|
||||
|
|
|
|||
|
|
@ -0,0 +1,8 @@
|
|||
const {COA} = window;
|
||||
|
||||
export function generateStateEmblem(type: string, cultureShield: string) {
|
||||
const shield = COA.getShield(cultureShield, null);
|
||||
const coa: ICoa = {...COA.generate(null, null, null, type), shield};
|
||||
|
||||
return coa;
|
||||
}
|
||||
|
|
@ -6,14 +6,13 @@ import {gauss, P} from "utils/probabilityUtils";
|
|||
import {NO_BURG} from "./config";
|
||||
|
||||
import type {createCapitals} from "./createCapitals";
|
||||
import type {createStates} from "./createStates";
|
||||
import type {TStateData} from "./createStateData";
|
||||
import type {createTowns} from "./createTowns";
|
||||
|
||||
const {COA} = window;
|
||||
|
||||
type TCapitals = ReturnType<typeof createCapitals>;
|
||||
type TTowns = ReturnType<typeof createTowns>;
|
||||
type TStatesReturn = ReturnType<typeof createStates>;
|
||||
|
||||
export function specifyBurgs(
|
||||
capitals: TCapitals,
|
||||
|
|
@ -23,12 +22,14 @@ export function specifyBurgs(
|
|||
temp: Int8Array,
|
||||
vertices: IGraphVertices,
|
||||
cultures: TCultures,
|
||||
states: TStatesReturn,
|
||||
statesData: TStateData[],
|
||||
rivers: Omit<IRiver, "name" | "basin" | "type">[],
|
||||
cells: Pick<IPack["cells"], "v" | "p" | "g" | "h" | "f" | "haven" | "harbor" | "s" | "biome" | "fl" | "r">
|
||||
): TBurgs {
|
||||
TIME && console.time("specifyBurgs");
|
||||
|
||||
const stateDataMap = new Map(statesData.map(data => [data.i, data]));
|
||||
|
||||
const burgs = [...capitals, ...towns].map((burgData, index) => {
|
||||
const {cell, culture, capital} = burgData;
|
||||
const state = stateIds[cell];
|
||||
|
|
@ -38,7 +39,8 @@ export function specifyBurgs(
|
|||
const [x, y] = defineLocation(cell, port);
|
||||
|
||||
const type = defineType(cell, port, population);
|
||||
const coa: ICoa = defineEmblem(state, culture, port, capital, type, cultures, states);
|
||||
const stateData = stateDataMap.get(state)!;
|
||||
const coa: ICoa = defineEmblem(culture, port, capital, type, cultures, stateData);
|
||||
|
||||
const burg: IBurg = {i: index + 1, ...burgData, state, port, population, x, y, type, coa};
|
||||
return burg;
|
||||
|
|
@ -119,28 +121,27 @@ export function specifyBurgs(
|
|||
}
|
||||
|
||||
function defineEmblem(
|
||||
stateId: number,
|
||||
cultureId: number,
|
||||
port: number,
|
||||
capital: Logical,
|
||||
type: TCultureType,
|
||||
cultures: TCultures,
|
||||
states: TStatesReturn
|
||||
stateData: TStateData
|
||||
) {
|
||||
const coaType = capital && P(0.2) ? "Capital" : type === "Generic" ? "City" : type;
|
||||
const cultureShield = cultures[cultureId].shield;
|
||||
const stateShield = ((states[stateId] as IState)?.coa as ICoa)?.shield;
|
||||
|
||||
if (stateId === 0) {
|
||||
if (!stateData) {
|
||||
const baseCoa = COA.generate(null, 0, null, coaType);
|
||||
const shield = COA.getShield(cultureShield, stateShield);
|
||||
const shield = COA.getShield(cultureShield);
|
||||
return {...baseCoa, shield};
|
||||
}
|
||||
|
||||
const {culture: stateCultureId, coa: stateCOA} = states[stateId] as IState;
|
||||
const {culture: stateCultureId, coa: stateCOA} = stateData;
|
||||
const kinship = defineKinshipToStateEmblem();
|
||||
|
||||
const baseCoa = COA.generate(stateCOA, kinship, null, coaType);
|
||||
const stateShield = (stateData.coa as ICoa)?.shield;
|
||||
const shield = COA.getShield(cultureShield, stateShield);
|
||||
return {...baseCoa, shield};
|
||||
|
||||
|
|
|
|||
45
src/scripts/generation/pack/burgsAndStates/specifyStates.ts
Normal file
45
src/scripts/generation/pack/burgsAndStates/specifyStates.ts
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
import {TIME} from "config/logging";
|
||||
import {getColors} from "utils/colorUtils";
|
||||
import {NEUTRALS} from "./config";
|
||||
import {createAreaTiers, defineStateForm} from "./defineStateForm";
|
||||
import {defineFullStateName, defineStateName} from "./defineStateName";
|
||||
import {isBurg} from "utils/typeUtils";
|
||||
|
||||
import type {TStateStatistics} from "./collectStatistics";
|
||||
import type {TStateData} from "./createStateData";
|
||||
|
||||
export function specifyStates(
|
||||
statesData: TStateData[],
|
||||
statistics: TStateStatistics,
|
||||
cultures: TCultures,
|
||||
burgs: TBurgs
|
||||
): TStates {
|
||||
TIME && console.time("specifyStates");
|
||||
|
||||
const colors = getColors(statesData.length);
|
||||
const getAreaTier = createAreaTiers(statistics);
|
||||
const getNameBase = (cultureId: number) => cultures[cultureId].base;
|
||||
|
||||
const states: IState[] = statesData.map((stateData, index) => {
|
||||
const {i, center, type, culture, capital} = stateData;
|
||||
const {area, burgs: burgsNumber, ...stats} = statistics[i];
|
||||
|
||||
const capitalBurg = burgs[capital];
|
||||
const capitalName = isBurg(capitalBurg) ? capitalBurg.name : null;
|
||||
if (!capitalName) throw new Error("State capital is not a burg");
|
||||
|
||||
const nameBase = getNameBase(culture);
|
||||
const areaTier = getAreaTier(area);
|
||||
const {form, formName} = defineStateForm(type, areaTier, nameBase, burgsNumber);
|
||||
const name = defineStateName(center, capitalName, nameBase, formName);
|
||||
const fullName = defineFullStateName(name, formName);
|
||||
|
||||
const color = colors[index];
|
||||
|
||||
const state: IState = {name, ...stateData, form, formName, fullName, color, area, burgs: burgsNumber, ...stats};
|
||||
return state;
|
||||
});
|
||||
|
||||
TIME && console.timeEnd("specifyStates");
|
||||
return [NEUTRALS, ...states];
|
||||
}
|
||||
|
|
@ -104,7 +104,7 @@ export function createPack(grid: IGrid): IPack {
|
|||
rawRivers,
|
||||
vertices,
|
||||
{
|
||||
...pick(cells, "v", "c", "p", "b", "i", "g"),
|
||||
...pick(cells, "v", "c", "p", "b", "i", "g", "area"),
|
||||
h: heights,
|
||||
f: featureIds,
|
||||
t: distanceField,
|
||||
|
|
@ -114,6 +114,7 @@ export function createPack(grid: IGrid): IPack {
|
|||
fl: flux,
|
||||
biome,
|
||||
s: suitability,
|
||||
pop: population,
|
||||
culture: cultureIds
|
||||
}
|
||||
);
|
||||
|
|
@ -148,7 +149,6 @@ export function createPack(grid: IGrid): IPack {
|
|||
}
|
||||
});
|
||||
|
||||
// Religions.generate();
|
||||
// BurgsAndStates.defineStateForms();
|
||||
// BurgsAndStates.generateProvinces();
|
||||
// BurgsAndStates.defineBurgFeatures();
|
||||
|
|
|
|||
10
src/types/pack/states.d.ts
vendored
10
src/types/pack/states.d.ts
vendored
|
|
@ -2,14 +2,22 @@ interface IState {
|
|||
i: number;
|
||||
name: string;
|
||||
center: number;
|
||||
capital: number;
|
||||
color: Hex | CssUrls;
|
||||
type: TCultureType;
|
||||
culture: number;
|
||||
expansionism: number;
|
||||
form: string;
|
||||
formName: string;
|
||||
fullName: string;
|
||||
capital: Logical;
|
||||
coa: ICoa | string;
|
||||
// pole: TPoint ?
|
||||
area: number;
|
||||
cells: number;
|
||||
burgs: number;
|
||||
rural: number;
|
||||
urban: number;
|
||||
neighbors: number[];
|
||||
removed?: boolean;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue