diff --git a/index.css b/index.css index 01b41f67..4bd1a328 100644 --- a/index.css +++ b/index.css @@ -2357,6 +2357,41 @@ svg.button { opacity: 0.8; } +#markerTypeSelector { + font-size: 0.85em; +} + +#markerTypeSelectorWrapper { + position: relative; +} + +#markerTypeSelectMenu { + display: none; +} + +#markerTypeSelectMenu.visible { + display: block; + position: absolute; + height: 250px; + width: 170px; + overflow-y: scroll; + background: inherit; + bottom: 100%; + left: 0; + background: white; +} + +#markerTypeSelectMenu > button { + display: block; + width: 100%; + border: 1px solid #ddd; + margin-bottom: 1px; +} + +#markerTypeSelectMenu > button:hover { + background: #ccc; +} + @media print { div, canvas { diff --git a/index.html b/index.html index 8bf7b121..331dff69 100644 --- a/index.html +++ b/index.html @@ -30,6 +30,16 @@ /> + + + @@ -128,7 +138,7 @@ } - + @@ -5499,6 +5509,14 @@
The following states will be removed: ${statesToMerge.map(stateId => `${emblem(stateId)}${pack.states[stateId].name}`).join(", ")}.
+Removed states data (burgs, provinces, regiments) will be assigned to ${emblem(rullingState.i)}${rullingState.name}.
+Are you sure you want to merge states? This action cannot be reverted.
`, + confirm: "Merge", + onConfirm: () => { + mergeStates(statesToMerge, rulingStateId); + $(this).dialog("close"); + } + }); + }, + Cancel: function () { + $(this).dialog("close"); + } + } + }); + + function mergeStates(statesToMerge, rulingStateId) { + const rulingState = pack.states[rulingStateId]; + + // remove states to be merged + statesToMerge.forEach(stateId => { + const state = pack.states[stateId]; + state.removed = true; + + statesBody.select("#state" + stateId).remove(); + statesBody.select("#state-gap" + stateId).remove(); + statesHalo.select("#state-border" + stateId).remove(); + labels.select("#stateLabel" + stateId).remove(); + defs.select("#textPath_stateLabel" + stateId).remove(); + + byId("stateCOA" + stateId).remove(); + emblems.select(`#stateEmblems > use[data-i='${stateId}']`).remove(); + + // add merged state regiments to the ruling state + state.military.forEach(m => { + const oldId = `regiment${stateId}-${m.i}`; + + const newRegiment = {...m, i: rulingState.military.length}; + rulingState.military.push(newRegiment); + + const newId = `regiment${rulingStateId}-${newRegiment.i}`; + + const note = notes.find(n => n.id === oldId); + if (note) note.id = newId; + + const rulingStateArmy = armies.select("g#army" + rulingStateId); + armies + .select("g#army" + stateId) + .selectAll("g") + .each(function () { + this.setAttribute("id", newId); + rulingStateArmy.node().appendChild(this); + }); + armies.select("g#army" + stateId).remove(); + }); + }); + + // reassing burgs + pack.burgs.forEach(b => { + if (statesToMerge.includes(b.state)) { + if (b.capital) { + moveBurgToGroup(b.i, "towns"); + b.capital = 0; + } + b.state = rulingStateId; + } + }); + + // reassign provinces + pack.provinces.forEach((p, i) => { + if (statesToMerge.includes(p.state)) p.state = rulingStateId; + }); + + // reassing cells + pack.cells.state.forEach((s, i) => { + if (statesToMerge.includes(s)) pack.cells.state[i] = rulingStateId; + }); + + unfog(); + debug.selectAll(".highlight").remove(); + + layerIsOn("toggleStates") ? drawStates() : toggleStates(); + layerIsOn("toggleBorders") ? drawBorders() : toggleBorders(); + layerIsOn("toggleProvinces") && drawProvinces(); + BurgsAndStates.drawStateLabels([rulingStateId]); + + refreshStatesEditor(); + } +} + function downloadStatesCsv() { const unit = getAreaUnit("2"); const headers = `Id,State,Full Name,Form,Color,Capital,Culture,Type,Expansionism,Cells,Burgs,Area ${unit},Total Population,Rural Population,Urban Population`; diff --git a/modules/io/save.js b/modules/io/save.js index 8cdd5c03..bf78fd0e 100644 --- a/modules/io/save.js +++ b/modules/io/save.js @@ -165,7 +165,7 @@ async function initiateAutosave() { const mapData = getMapData(); const blob = new Blob([mapData], {type: "text/plain"}); await ldb.set("lastMap", blob); - console.log("Autosaved at", new Date().toLocaleTimeString()); + INFO && console.log("Autosaved at", new Date().toLocaleTimeString()); lastSavedAt = Date.now(); } diff --git a/modules/names-generator.js b/modules/names-generator.js index da4d9294..0ba44ed7 100644 --- a/modules/names-generator.js +++ b/modules/names-generator.js @@ -211,7 +211,7 @@ window.Names = (function () { // Finnic else if (base === 15 && rnd < 0.4 && l < 6) suffix = "orszag"; // Hungarian - else if (base === 16) suffix = rnd < 0.6 ? "stan" : "ya"; + else if (base === 16) suffix = rnd < 0.6 ? "yurt" : "eli"; // Turkish else if (base === 10) suffix = "guk"; // Korean @@ -279,7 +279,7 @@ window.Names = (function () { {name: "Portuguese", i: 13, min: 5, max: 11, d: "", m: .1, b: "Abrigada,Afonsoeiro,Agueda,Aguilada,Alagoas,Alagoinhas,Albufeira,Alcanhoes,Alcobaca,Alcoutim,Aldoar,Alenquer,Alfeizerao,Algarve,Almada,Almagreira,Almeirim,Alpalhao,Alpedrinha,Alvorada,Amieira,Anapolis,Apelacao,Aranhas,Arganil,Armacao,Assenceira,Aveiro,Avelar,Balsas,Barcarena,Barreiras,Barretos,Batalha,Beira,Benavente,Betim,Braga,Braganca,Brasilia,Brejo,Cabeceiras,Cabedelo,Cachoeiras,Cadafais,Calhandriz,Calheta,Caminha,Campinas,Canidelo,Canoas,Capinha,Carmoes,Cartaxo,Carvalhal,Carvoeiro,Cascavel,Castanhal,Caxias,Chapadinha,Chaves,Cocais,Coentral,Coimbra,Comporta,Conde,Coqueirinho,Coruche,Damaia,Dourados,Enxames,Ericeira,Ervidel,Escalhao,Esmoriz,Espinhal,Estela,Estoril,Eunapolis,Evora,Famalicao,Fanhoes,Faro,Fatima,Felgueiras,Ferreira,Figueira,Flecheiras,Florianopolis,Fornalhas,Fortaleza,Freiria,Freixeira,Fronteira,Fundao,Gracas,Gradil,Grainho,Gralheira,Guimaraes,Horta,Ilhavo,Ilheus,Lages,Lagos,Laranjeiras,Lavacolhos,Leiria,Limoeiro,Linhares,Lisboa,Lomba,Lorvao,Lourical,Lourinha,Luziania,Macedo,Machava,Malveira,Marinhais,Maxial,Mealhada,Milharado,Mira,Mirandela,Mogadouro,Montalegre,Mourao,Nespereira,Nilopolis,Obidos,Odemira,Odivelas,Oeiras,Oleiros,Olhalvo,Olinda,Olival,Oliveira,Oliveirinha,Palheiros,Palmeira,Palmital,Pampilhosa,Pantanal,Paradinha,Parelheiros,Pedrosinho,Pegoes,Penafiel,Peniche,Pinhao,Pinheiro,Pombal,Pontal,Pontinha,Portel,Portimao,Quarteira,Queluz,Ramalhal,Reboleira,Recife,Redinha,Ribadouro,Ribeira,Ribeirao,Rosais,Sabugal,Sacavem,Sagres,Sandim,Sangalhos,Santarem,Santos,Sarilhos,Seixas,Seixezelo,Seixo,Silvares,Silveira,Sinhaem,Sintra,Sobral,Sobralinho,Tabuaco,Tabuleiro,Taveiro,Teixoso,Telhado,Telheiro,Tomar,Torreira,Trancoso,Troviscal,Vagos,Varzea,Velas,Viamao,Viana,Vidigal,Vidigueira,Vidual,Vilamar,Vimeiro,Vinhais,Vitoria"}, {name: "Nahuatl", i: 14, min: 6, max: 13, d: "l", m: 0, b: "Acapulco,Acatepec,Acatlan,Acaxochitlan,Acolman,Actopan,Acuamanala,Ahuacatlan,Almoloya,Amacuzac,Amanalco,Amaxac,Apaxco,Apetatitlan,Apizaco,Atenco,Atizapan,Atlacomulco,Atlapexco,Atotonilco,Axapusco,Axochiapan,Axocomanitla,Axutla,Azcapotzalco,Aztahuacan,Calimaya,Calnali,Calpulalpan,Camotlan,Capulhuac,Chalco,Chapulhuacan,Chapultepec,Chiapan,Chiautempan,Chiconautla,Chihuahua,Chilcuautla,Chimalhuacan,Cholollan,Cihuatlan,Coahuila,Coatepec,Coatetelco,Coatlan,Coatlinchan,Coatzacoalcos,Cocotitlan,Cohetzala,Colima,Colotlan,Coyoacan,Coyohuacan,Cuapiaxtla,Cuauhnahuac,Cuauhtemoc,Cuauhtitlan,Cuautepec,Cuautla,Cuaxomulco,Culhuacan,Ecatepec,Eloxochitlan,Epatlan,Epazoyucan,Huamantla,Huascazaloya,Huatlatlauca,Huautla,Huehuetlan,Huehuetoca,Huexotla,Hueyapan,Hueyotlipan,Hueypoxtla,Huichapan,Huimilpan,Huitzilac,Ixtapallocan,Iztacalco,Iztaccihuatl,Iztapalapa,Lolotla,Malinalco,Mapachtlan,Mazatepec,Mazatlan,Metepec,Metztitlan,Mexico,Miacatlan,Michoacan,Minatitlan,Mixcoac,Mixtla,Molcaxac,Nanacamilpa,Naucalpan,Naupan,Nextlalpan,Nezahualcoyotl,Nopalucan,Oaxaca,Ocotepec,Ocotitlan,Ocotlan,Ocoyoacac,Ocuilan,Ocuituco,Omitlan,Otompan,Otzoloapan,Pacula,Pahuatlan,Panotla,Papalotla,Patlachican,Piaztla,Popocatepetl,Sultepec,Tecamac,Tecolotlan,Tecozautla,Temamatla,Temascalapa,Temixco,Temoac,Temoaya,Tenayuca,Tenochtitlan,Teocuitlatlan,Teotihuacan,Teotlalco,Tepeacac,Tepeapulco,Tepehuacan,Tepetitlan,Tepeyanco,Tepotzotlan,Tepoztlan,Tetecala,Tetlatlahuca,Texcalyacac,Texcoco,Tezontepec,Tezoyuca,Timilpan,Tizapan,Tizayuca,Tlacopan,Tlacotenco,Tlahuac,Tlahuelilpan,Tlahuiltepa,Tlalmanalco,Tlalnepantla,Tlalpan,Tlanchinol,Tlatelolco,Tlaxcala,Tlaxcoapan,Tlayacapan,Tocatlan,Tolcayuca,Toluca,Tonanitla,Tonantzintla,Tonatico,Totolac,Totolapan,Tototlan,Tuchtlan,Tulantepec,Tultepec,Tzompantepec,Xalatlaco,Xaloztoc,Xaltocan,Xiloxoxtla,Xochiatipan,Xochicoatlan,Xochimilco,Xochitepec,Xolotlan,Xonacatlan,Yahualica,Yautepec,Yecapixtla,Yehaultepec,Zacatecas,Zacazonapan,Zacoalco,Zacualpan,Zacualtipan,Zapotlan,Zimapan,Zinacantepec,Zoyaltepec,Zumpahuacan"}, {name: "Hungarian", i: 15, min: 6, max: 13, d: "", m: 0.1, b: "Aba,Abadszalok,Adony,Ajak,Albertirsa,Alsozsolca,Aszod,Babolna,Bacsalmas,Baktaloranthaza,Balassagyarmat,Balatonalmadi,Balatonboglar,Balkany,Balmazujvaros,Barcs,Bataszek,Batonyterenye,Battonya,Bekes,Berettyoujfalu,Berhida,Biatorbagy,Bicske,Biharkeresztes,Bodajk,Boly,Bonyhad,Budakalasz,Budakeszi,Celldomolk,Csakvar,Csenger,Csongrad,Csorna,Csorvas,Csurgo,Dabas,Demecser,Derecske,Devavanya,Devecser,Dombovar,Dombrad,Dunafoldvar,Dunaharaszti,Dunavarsany,Dunavecse,Edeleny,Elek,Emod,Encs,Enying,Ercsi,Fegyvernek,Fehergyarmat,Felsozsolca,Fertoszentmiklos,Fonyod,Fot,Fuzesabony,Fuzesgyarmat,Gardony,God,Gyal,Gyomaendrod,Gyomro,Hajdudorog,Hajduhadhaz,Hajdusamson,Hajduszoboszlo,Halasztelek,Harkany,Hatvan,Heves,Heviz,Ibrany,Isaszeg,Izsak,Janoshalma,Janossomorja,Jaszapati,Jaszarokszallas,Jaszfenyszaru,Jaszkiser,Kaba,Kalocsa,Kapuvar,Karcag,Kecel,Kemecse,Kenderes,Kerekegyhaza,Keszthely,Kisber,Kiskunmajsa,Kistarcsa,Kistelek,Kisujszallas,Kisvarda,Komadi,Komarom,Komlo,Kormend,Korosladany,Koszeg,Kozarmisleny,Kunhegyes,Kunszentmarton,Kunszentmiklos,Labatlan,Lajosmizse,Lenti,Letavertes,Letenye,Lorinci,Maglod,Mako,Mandok,Marcali,Martonvasar,Mateszalka,Melykut,Mezobereny,Mezocsat,Mezohegyes,Mezokeresztes,Mezokovesd,Mezotur,Mindszent,Mohacs,Monor,Mor,Morahalom,Nadudvar,Nagyatad,Nagyecsed,Nagyhalasz,Nagykallo,Nagykoros,Nagymaros,Nyekladhaza,Nyergesujfalu,Nyirbator,Nyirmada,Nyirtelek,Ocsa,Orkeny,Oroszlany,Paks,Pannonhalma,Paszto,Pecel,Pecsvarad,Pilisvorosvar,Polgar,Polgardi,Pomaz,Puspokladany,Pusztaszabolcs,Putnok,Racalmas,Rackeve,Rakamaz,Rakoczifalva,Sajoszent,Sandorfalva,Sarbogard,Sarkad,Sarospatak,Sarvar,Satoraljaujhely,Siklos,Simontornya,Soltvadkert,Sumeg,Szabadszallas,Szarvas,Szazhalombatta,Szecseny,Szeghalom,Szentgotthard,Szentlorinc,Szerencs,Szigethalom,Szigetvar,Szikszo,Tab,Tamasi,Tapioszele,Tapolca,Teglas,Tet,Tiszafoldvar,Tiszafured,Tiszakecske,Tiszalok,Tiszaujvaros,Tiszavasvari,Tokaj,Tokol,Tompa,Torokbalint,Torokszentmiklos,Totkomlos,Tura,Turkeve,Ujkigyos,ujszasz,Vamospercs,Varpalota,Vasarosnameny,Vasvar,Vecses,Veresegyhaz,Verpelet,Veszto,Zahony,Zalaszentgrot,Zirc,Zsambek"}, - {name: "Turkish", i: 16, min: 4, max: 10, d: "", m: 0, b: "Adapazari,Adiyaman,Afshin,Afyon,Akchaabat,Akchakoca,Akdamadeni,Akhisar,Aksaray,Akshehir,Amasya,Anamur,Antakya,Ardeshen,Ari,Artvin,Aydin,Babaeski,Bafra,Balikesir,Bandirma,Bartin,Bashiskele,Belen,Bergama,Besni,Biga,Bilecik,Bingul,Bitlis,Bodrum,Bolu,Bostanichi,Boyabat,Bozuyuk,Bucak,Bulancak,Bulanik,Burdur,Burhaniye,Ceyhan,Chanakkale,Chankiri,Chayeli,Cherkezkuy,Cheshme,Chivril,Chorlu,Cizre,Dalaman,Darica,Denizli,Derik,Develi,Devrek,Didim,Dilovasi,Dinar,Diyadin,Diyarbakir,Doubayazit,Durtyol,Duzce,Duzichi,Edirne,Elbistan,Emirda,Erbaa,Ercish,Erdek,Ereli,Ergani,Erzin,Erzincan,Erzurum,Eskishehir,Fethiye,Gazipasha,Gebze,Gelibolu,Gerede,Geyve,Giresun,Gulbashi,Gulcuk,Gumushhane,Gurnen,Guroymak,Hakkari,Harbiye,Havza,Hayrabolu,Hilvan,Imamolu,Inegul,Iskenderun,Islahiye,Kadirli,Kahta,Kaman,Kapakli,Karabuk,Karacabey,Karakupru,Karaman,Karamursel,Kars,Kartepe,Kastamonu,Kemer,Keshan,Kilimli,Kirklareli,Kirshehir,Kiziltepe,Korkuteli,Kovancilar,Kozan,Kozluk,Kulu,Kumluca,Kurfez,Kurtalan,Kutahya,Luleburgaz,Malatya,Malazgirt,Malkara,Manavgat,Manisa,Marmaris,Mersin,Merzifon,Midyat,Milas,Mula,Muratli,Mush,Nevshehir,Nide,Nizip,Nusaybin,Oltu,Ordu,Orhangazi,Ortaca,Osmancik,Osmaniye,Patnos,Payas,Pazarcik,Reyhanli,Rize,Safranbolu,Salihli,Samanda,Sandikli,Saray,Sarikamish,Sarikaya,Serik,Seydishehir,sharkishla,shirnak,Siirt,Silifke,Silvan,Simav,Sinop,Sivas,Siverek,Sorgun,Sungurlu,Surke,Suruch,Susurluk,Tarsus,Tatvan,Tekirda,Terme,Tire,Tokat,Tosya,Trabzon,Tunceli,Turgutlu,Turhal,udemish,Unye,Ushak,Uzunkurpru,Van,Vezirkurpru,Viranshehir,Yahyali,Yenishehir,Yerkury,Yozgat,Zile,Zonguldak"}, + {name: "Turkish", i: 16, min: 4, max: 10, d: "", m: 0, b: "Yelkaya,Buyrukkaya,Erdemtepe,Alakesen,Baharbeyli,Bozbay,Karaoklu,Altunbey,Yalkale,Yalkut,Akardere,Altayburnu,Esentepe,Okbelen,Derinsu,Alaoba,Yamanbeyli,Aykor,Ekinova,Saztepe,Baharkale,Devrekdibi,Alpseki,Ormanseki,Erkale,Yalbelen,Aytay,Yamanyaka,Altaydelen,Esen,Yedieli,Alpkor,Demirkor,Yediyol,Erdemkaya,Yayburnu,Ganiler,Bayatyurt,Kopuzteke,Aytepe,Deniz,Ayan,Ayazdere,Tepe,Kayra,Ayyaka,Deren,Adatepe,Kalkaneli,Bozkale,Yedidelen,Kocayolu,Sazdere,Bozkesen,Oguzeli,Yayladibi,Uluyol,Altay,Ayvar,Alazyaka,Yaloba,Suyaka,Baltaberi,Poyrazdelen,Eymir,Yediyuva,Kurt,Yeltepe,Oktar,Kara Ok,Ekinberi,Er Yurdu,Eren,Erenler,Ser,Oguz,Asay,Bozokeli,Aykut,Ormanyol,Yazkaya,Kalkanova,Yazbeyli,Dokuz Teke,Bilge,Ertensuyu,Kopuzyuva,Buyrukkut,Akardiken,Aybaray,Aslanbeyli,Altun Kaynak,Atikobasi,Yayla Eli,Kor Tepe,Salureli,Kor Kaya,Aybarberi,Kemerev,Yanaray,Beydileli,Buyrukoba,Yolduman,Tengri Tepe,Dokuzsu,Uzunkor,Erdem Yurdu,Kemer,Korteke,Bozokev,Bozoba,Ormankale,Askale,Oguztoprak,Yolberi,Kumseki,Esenobasi,Turkbelen,Ayazseki,Cereneli,Taykut,Bayramdelen,Beydilyaka,Boztepe,Uluoba,Yelyaka,Ulgardiken,Esensu,Baykale,Cerenkor,Bozyol,Duranoba,Aladuman,Denizli,Bahar,Yarkesen,Dokuzer,Yamankaya,Kocatarla,Alayaka,Toprakeli,Sarptarla,Sarpkoy,Serkaynak,Adayaka,Ayazkaynak,Kopuz,Turk,Kart,Kum,Erten,Buyruk,Yel,Ada,Alazova,Ayvarduman,Buyrukok,Ayvartoprak,Uzuntepe,Binseki,Yedibey,Durankale,Alaztoprak,Sarp Ok,Yaparobasi,Yaytepe,Asberi,Kalkankor,Beydiltepe,Adaberi,Bilgeyolu,Ganiyurt,Alkanteke,Esenerler,Asbey,Erdemkale,Erenkaynak,Oguzkoyu,Ayazoba,Boynuztoprak,Okova,Yaloklu,Sivriberi,Yuladiken,Sazbey,Karakaynak,Kopuzkoyu,Buyrukay,Kocakaya,Tepeduman,Yanarseki,Atikyurt,Esenev,Akarbeyli,Yayteke,Devreksungur,Akseki,Baykut,Kalkandere,Ulgarova,Devrekev,Yulabey,Bayatev,Yazsu,Vuraleli,Sivribeyli,Alaova,Alpobasi,Yalyurt,Elmatoprak,Alazkaynak,Esenay,Ertenev,Salurkor,Ekinok,Yalbey,Yeldere,Ganibay,Altaykut,Baltaboy,Ereli,Ayvarsu,Uzunsaz,Bayeli,Erenyol,Kocabay,Derintay,Ayazyol,Aslanoba,Esenkaynak,Ekinlik,Alpyolu,Alayunt,Bozeski,Erkil,Duransuyu,Yulak,Kut,Dodurga,Kutlubey,Kutluyurt,Boynuz,Alayol,Aybar,Aslaneli,Kemerseki,Baltasuyu,Akarer,Ayvarburnu,Boynuzbeyli,Adasungur,Esenkor,Yamanoba,Toprakkor,Uzunyurt,Sungur,Bozok,Kemerli,Alaz,Demirci,Kartepe"}, {name: "Berber", i: 17, min: 4, max: 10, d: "s", m: .2, b: "Abkhouch,Adrar,Aeraysh,Afrag,Agadir,Agelmam,Aghmat,Agrakal,Agulmam,Ahaggar,Ait Baha,Ajdir,Akka,Almou,Amegdul,Amizmiz,Amknas,Amlil,Amurakush,Anfa,Annaba,Aousja,Arbat,Arfud,Argoub,Arif,Asfi,Asfru,Ashawen,Assamer,Assif,Awlluz,Ayt Melel,Azaghar,Azila,Azilal,Azmour,Azro,Azrou,Beccar,Beja,Bennour,Benslimane,Berkane,Berrechid,Bizerte,Bjaed,Bouayach,Boudenib,Boufrah,Bouskoura,Boutferda,Darallouch,Dar Bouazza,Darchaabane,Dcheira,Demnat,Denden,Djebel,Djedeida,Drargua,Elhusima,Essaouira,Ezzahra,Fas,Fnideq,Ghezeze,Goubellat,Grisaffen,Guelmim,Guercif,Hammamet,Harrouda,Hdifa,Hoceima,Houara,Idhan,Idurar,Ifendassen,Ifoghas,Ifrane,Ighoud,Ikbir,Imilchil,Imzuren,Inezgane,Irherm,Izoughar,Jendouba,Kacem,Kelibia,Kenitra,Kerrando,Khalidia,Khemisset,Khenifra,Khouribga,Khourigba,Kidal,Korba,Korbous,Lahraouyine,Larache,Leyun,Lqliaa,Manouba,Martil,Mazagan,Mcherga,Mdiq,Megrine,Mellal,Melloul,Midelt,Misur,Mohammedia,Mornag,Mrirt,Nabeul,Nadhour,Nador,Nawaksut,Nefza,Ouarzazate,Ouazzane,Oued Zem,Oujda,Ouladteima,Qsentina,Rades,Rafraf,Safi,Sefrou,Sejnane,Settat,Sijilmassa,Skhirat,Slimane,Somaa,Sraghna,Susa,Tabarka,Tadrart,Taferka,Tafilalt,Tafrawt,Tafza,Tagbalut,Tagerdayt,Taghzut,Takelsa,Taliouine,Tanja,Tantan,Taourirt,Targuist,Taroudant,Tarudant,Tasfelalayt,Tassort,Tata,Tattiwin,Tawnat,Taza,Tazagurt,Tazerka,Tazizawt,Taznakht,Tebourba,Teboursouk,Temara,Testour,Tetouan,Tibeskert,Tifelt,Tijdit,Tinariwen,Tinduf,Tinja,Tittawan,Tiznit,Toubkal,Trables,Tubqal,Tunes,Ultasila,Urup,Wagguten,Wararni,Warzazat,Watlas,Wehran,Wejda,Xamida,Yedder,Youssoufia,Zaghouan,Zahret,Zemmour,Zriba"}, {name: "Arabic", i: 18, min: 4, max: 9, d: "ae", m: .2, b: "Abha,Ajman,Alabar,Alarjam,Alashraf,Alawali,Albawadi,Albirk,Aldhabiyah,Alduwaid,Alfareeq,Algayed,Alhazim,Alhrateem,Alhudaydah,Alhuwaya,Aljahra,Aljubail,Alkhafah,Alkhalas,Alkhawaneej,Alkhen,Alkhobar,Alkhuznah,Allisafah,Almshaykh,Almurjan,Almuwayh,Almuzaylif,Alnaheem,Alnashifah,Alqah,Alqouz,Alqurayyat,Alradha,Alraqmiah,Alsadyah,Alsafa,Alshagab,Alshuqaiq,Alsilaa,Althafeer,Alwasqah,Amaq,Amran,Annaseem,Aqbiyah,Arafat,Arar,Ardah,Asfan,Ashayrah,Askar,Ayaar,Aziziyah,Baesh,Bahrah,Balhaf,Banizayd,Bidiyah,Bisha,Biyatah,Buqhayq,Burayda,Dafiyat,Damad,Dammam,Dariyah,Dhafar,Dhahran,Dhalkut,Dhurma,Dibab,Doha,Dukhan,Duwaibah,Enaker,Fadhla,Fahaheel,Fanateer,Farasan,Fardah,Fujairah,Ghalilah,Ghar,Ghizlan,Ghomgyah,Ghran,Hadiyah,Haffah,Hajanbah,Hajrah,Haqqaq,Haradh,Hasar,Hawiyah,Hebaa,Hefar,Hijal,Husnah,Huwailat,Huwaitah,Irqah,Isharah,Ithrah,Jamalah,Jarab,Jareef,Jazan,Jeddah,Jiblah,Jihanah,Jilah,Jizan,Joraibah,Juban,Jumeirah,Kamaran,Keyad,Khab,Khaiybar,Khasab,Khathirah,Khawarah,Khulais,Kumzar,Limah,Linah,Madrak,Mahab,Mahalah,Makhtar,Mashwar,Masirah,Masliyah,Mastabah,Mazhar,Medina,Meeqat,Mirbah,Mokhtara,Muharraq,Muladdah,Musaykah,Mushayrif,Musrah,Mussafah,Nafhan,Najran,Nakhab,Nizwa,Oman,Qadah,Qalhat,Qamrah,Qasam,Qosmah,Qurain,Quriyat,Qurwa,Radaa,Rafha,Rahlah,Rakamah,Rasheedah,Rasmadrakah,Risabah,Rustaq,Ryadh,Sabtaljarah,Sadah,Safinah,Saham,Saihat,Salalah,Salmiya,Shabwah,Shalim,Shaqra,Sharjah,Sharurah,Shatifiyah,Shidah,Shihar,Shoqra,Shuwaq,Sibah,Sihmah,Sinaw,Sirwah,Sohar,Suhailah,Sulaibiya,Sunbah,Tabuk,Taif,Taqah,Tarif,Tharban,Thuqbah,Thuwal,Tubarjal,Turaif,Turbah,Tuwaiq,Ubar,Umaljerem,Urayarah,Urwah,Wabrah,Warbah,Yabreen,Yadamah,Yafur,Yarim,Yemen,Yiyallah,Zabid,Zahwah,Zallaq,Zinjibar,Zulumah"}, {name: "Inuit", i: 19, min: 5, max: 15, d: "alutsn", m: 0, b: "Aaluik,Aappilattoq,Aasiaat,Agissat,Agssaussat,Akuliarutsip,Akunnaaq,Alluitsup,Alluttoq,Amitsorsuaq,Ammassalik,Anarusuk,Anguniartarfik,Annertussoq,Annikitsoq,Apparsuit,Apusiaajik,Arsivik,Arsuk,Atammik,Ateqanaq,Atilissuaq,Attu,Augpalugtoq,Aukarnersuaq,Aumat,Auvilkikavsaup,Avadtlek,Avallersuaq,Bjornesk,Blabaerdalen,Blomsterdalen,Brattalhid,Bredebrae,Brededal,Claushavn,Edderfulegoer,Egger,Eqalugalinnguit,Eqalugarssuit,Eqaluit,Eqqua,Etah,Graah,Hakluyt,Haredalen,Hareoen,Hundeo,Igaliku,Igdlorssuit,Igdluluarssuk,Iginniafik,Ikamiut,Ikarissat,Ikateq,Ikermiut,Ikermoissuaq,Ikorfarssuit,Ilimanaq,Illorsuit,Illunnguit,Iluileq,Ilulissat,Imaarsivik,Imartunarssuk,Immikkoortukajik,Innaarsuit,Inneruulalik,Inussullissuaq,Iperaq,Ippik,Iqek,Isortok,Isungartussoq,Itileq,Itissaalik,Itivdleq,Ittit,Ittoqqortoormiit,Ivingmiut,Ivittuut,Kanajoorartuut,Kangaamiut,Kangeq,Kangerluk,Kangerlussuaq,Kanglinnguit,Kapisillit,Kekertamiut,Kiatak,Kiataussaq,Kigatak,Kinaussak,Kingittorsuaq,Kitak,Kitsissuarsuit,Kitsissut,Klenczner,Kook,Kraulshavn,Kujalleq,Kullorsuaq,Kulusuk,Kuurmiit,Kuusuaq,Laksedalen,Maniitsoq,Marrakajik,Mattaangassut,Mernoq,Mittivakkat,Moriusaq,Myggbukta,Naajaat,Nangissat,Nanuuseq,Nappassoq,Narsarmijt,Narsarsuaq,Narssaq,Nasiffik,Natsiarsiorfik,Naujanguit,Niaqornaarsuk,Niaqornat,Nordfjordspasset,Nugatsiaq,Nunarssit,Nunarsuaq,Nunataaq,Nunatakavsaup,Nutaarmiut,Nuugaatsiaq,Nuuk,Nuukullak,Olonkinbyen,Oodaaq,Oqaatsut,Oqaitsunguit,Oqonermiut,Paagussat,Paamiut,Paatuut,Palungataq,Pamialluk,Perserajoq,Pituffik,Puugutaa,Puulkuip,Qaanaq,Qaasuitsup,Qaersut,Qajartalik,Qallunaat,Qaneq,Qaqortok,Qasigiannguit,Qassimiut,Qeertartivaq,Qeqertaq,Qeqertasussuk,Qeqqata,Qernertoq,Qernertunnguit,Qianarreq,Qingagssat,Qoornuup,Qorlortorsuaq,Qullikorsuit,Qunnerit,Qutdleq,Ravnedalen,Ritenbenk,Rypedalen,Saarloq,Saatorsuaq,Saattut,Salliaruseq,Sammeqqat,Sammisoq,Sanningassoq,Saqqaq,Saqqarlersuaq,Saqqarliit,Sarfannguit,Sattiaatteq,Savissivik,Serfanguaq,Sermersooq,Sermiligaaq,Sermilik,Sermitsiaq,Simitakaja,Simiutaq,Singamaq,Siorapaluk,Sisimiut,Sisuarsuit,Sullorsuaq,Suunikajik,Sverdrup,Taartoq,Takiseeq,Tasirliaq,Tasiusak,Tiilerilaaq,Timilersua,Timmiarmiut,Tukingassoq,Tussaaq,Tuttulissuup,Tuujuk,Uiivaq,Uilortussoq,Ujuaakajiip,Ukkusissat,Upernavik,Uttorsiutit,Uumannaq,Uunartoq,Uvkusigssat,Ymer"}, diff --git a/modules/religions-generator.js b/modules/religions-generator.js index 916259a2..dcbc141f 100644 --- a/modules/religions-generator.js +++ b/modules/religions-generator.js @@ -363,23 +363,20 @@ window.Religions = (function () { Shamanism: 4, Animism: 4, Polytheism: 4, - Totemism: 2, - Druidism: 1, - "Ancestor Worship": 1, - "Nature Worship": 1 + "Ancestor Worship": 2, + "Nature Worship": 1, + Totemism: 1 }, Organized: { Polytheism: 14, Monotheism: 12, Dualism: 6, Pantheism: 6, - "Non-theism": 4, - Henotheism: 1, - Panentheism: 1 + "Non-theism": 4 }, Cult: { - Cult: 2, - "Dark Cult": 2, + Cult: 5, + "Dark Cult": 5, Sect: 1 }, Heresy: { @@ -418,17 +415,20 @@ window.Religions = (function () { }; const types = { - Shamanism: {Beliefs: 3, Shamanism: 2, Spirits: 1}, - Animism: {Spirits: 1, Beliefs: 1}, - "Ancestor worship": {Beliefs: 1, Forefathers: 2, Ancestors: 2}, + Shamanism: {Beliefs: 3, Shamanism: 2, Druidism: 1, Spirits: 1}, + Animism: {Spirits: 3, Beliefs: 1}, Polytheism: {Deities: 3, Faith: 1, Gods: 1, Pantheon: 1}, + "Ancestor worship": {Beliefs: 1, Forefathers: 2, Ancestors: 2}, + "Nature Worship": {Beliefs: 3, Druids: 1}, + Totemism: {Beliefs: 2, Totems: 2, Idols: 1}, + Monotheism: {Religion: 2, Church: 3, Faith: 1}, Dualism: {Religion: 3, Faith: 1, Cult: 1}, - Monotheism: {Religion: 1, Church: 1}, "Non-theism": {Beliefs: 3, Spirits: 1}, - Cult: {Cult: 4, Sect: 4, Arcanum: 1, Coterie: 1, Order: 1, Worship: 1}, - "Dark Cult": {Cult: 2, Sect: 2, Blasphemy: 1, Circle: 1, Coven: 1, Idols: 1, Occultism: 1}, + Cult: {Cult: 4, Sect: 2, Arcanum: 1, Order: 1, Worship: 1}, + "Dark Cult": {Cult: 2, Blasphemy: 1, Circle: 1, Coven: 1, Idols: 1, Occultism: 1}, + Sect: {Sect: 3, Society: 1}, Heresy: { Heresy: 3, @@ -893,9 +893,10 @@ window.Religions = (function () { const {cells, cultures, burgs, states} = pack; const random = () => Names.getCulture(cells.culture[center], null, null, "", 0); - const type = () => rw(types[form]); - const supreme = () => deity.split(/[ ,]+/)[0]; - const culture = () => cultures[cells.culture[center]].name; + const type = rw(types[form]); + const supreme = deity.split(/[ ,]+/)[0]; + const culture = cultures[cells.culture[center]].name; + const place = adj => { const burgId = cells.burg[center]; const stateId = cells.state[center]; @@ -906,18 +907,18 @@ window.Religions = (function () { }; const m = rw(namingMethods[variety]); - if (m === "Random + type") return [random() + " " + type(), "global"]; + if (m === "Random + type") return [random() + " " + type, "global"]; if (m === "Random + ism") return [trimVowels(random()) + "ism", "global"]; - if (m === "Supreme + ism" && deity) return [trimVowels(supreme()) + "ism", "global"]; + if (m === "Supreme + ism" && deity) return [trimVowels(supreme) + "ism", "global"]; if (m === "Faith of + Supreme" && deity) - return [ra(["Faith", "Way", "Path", "Word", "Witnesses"]) + " of " + supreme(), "global"]; + return [ra(["Faith", "Way", "Path", "Word", "Witnesses"]) + " of " + supreme, "global"]; if (m === "Place + ism") return [place() + "ism", "state"]; - if (m === "Culture + ism") return [trimVowels(culture()) + "ism", "culture"]; - if (m === "Place + ian + type") return [place("adj") + " " + type(), "state"]; - if (m === "Culture + type") return [culture() + " " + type(), "culture"]; - if (m === "Burg + ian + type") return [`${place("adj")} ${type()}`, "global"]; - if (m === "Random + ian + type") return [`${getAdjective(random())} ${type()}`, "global"]; - if (m === "Type + of the + meaning") return [`${type()} of the ${generateMeaning()}`, "global"]; + if (m === "Culture + ism") return [trimVowels(culture) + "ism", "culture"]; + if (m === "Place + ian + type") return [place("adj") + " " + type, "state"]; + if (m === "Culture + type") return [culture + " " + type, "culture"]; + if (m === "Burg + ian + type") return [`${place("adj")} ${type}`, "global"]; + if (m === "Random + ian + type") return [`${getAdjective(random())} ${type}`, "global"]; + if (m === "Type + of the + meaning") return [`${type} of the ${generateMeaning()}`, "global"]; return [trimVowels(random()) + "ism", "global"]; // else } diff --git a/modules/ui/diplomacy-editor.js b/modules/ui/diplomacy-editor.js index d5b7b183..0f363b7b 100644 --- a/modules/ui/diplomacy-editor.js +++ b/modules/ui/diplomacy-editor.js @@ -214,7 +214,6 @@ function editDiplomacy() { function selectRelation(subjectId, objectId, currentRelation) { const states = pack.states; const subject = states[subjectId]; - const object = states[objectId]; const relationsSelector = Object.entries(relations) .map( diff --git a/modules/ui/editors.js b/modules/ui/editors.js index 49a525eb..c3e72b35 100644 --- a/modules/ui/editors.js +++ b/modules/ui/editors.js @@ -1176,7 +1176,7 @@ function refreshAllEditors() { // dynamically loaded editors async function editStates() { if (customization) return; - const Editor = await import("../dynamic/editors/states-editor.js?v=1.89.05"); + const Editor = await import("../dynamic/editors/states-editor.js?v=1.89.35"); Editor.open(); } diff --git a/modules/ui/markers-overview.js b/modules/ui/markers-overview.js index e0909278..af0cc11f 100644 --- a/modules/ui/markers-overview.js +++ b/modules/ui/markers-overview.js @@ -14,6 +14,8 @@ function overviewMarkers() { const markersGenerationConfig = document.getElementById("markersGenerationConfig"); const markersRemoveAll = document.getElementById("markersRemoveAll"); const markersExport = document.getElementById("markersExport"); + const markerTypeInput = document.getElementById("addedMarkerType"); + const markerTypeSelector = document.getElementById("markerTypeSelector"); addLines(); @@ -33,9 +35,26 @@ function overviewMarkers() { listen(markersAddFromOverview, "click", toggleAddMarker), listen(markersGenerationConfig, "click", configMarkersGeneration), listen(markersRemoveAll, "click", triggerRemoveAll), - listen(markersExport, "click", exportMarkers) + listen(markersExport, "click", exportMarkers), + listen(markerTypeSelector, "click", toggleMarkerTypeMenu) ]; + const types = [{type: "empty", icon: "❓"}, ...Markers.getConfig()]; + types.forEach(({icon, type}) => { + const option = document.createElement("button"); + option.textContent = `${icon} ${type}`; + markerTypeSelectMenu.appendChild(option); + + listeners.push( + listen(option, "click", () => { + markerTypeSelector.textContent = icon; + markerTypeInput.value = type; + changeMarkerType(); + toggleMarkerTypeMenu(); + }) + ); + }); + function handleLineClick(ev) { const el = ev.target; const i = +el.parentNode.dataset.i; @@ -139,11 +158,21 @@ function overviewMarkers() { }); } + function toggleMarkerTypeMenu() { + document.getElementById("markerTypeSelectMenu").classList.toggle("visible"); + } + function toggleAddMarker() { markersAddFromOverview.classList.toggle("pressed"); addMarker.click(); } + function changeMarkerType() { + if (!markersAddFromOverview.classList.contains("pressed")) { + toggleAddMarker(); + } + } + function removeMarker(i) { notes = notes.filter(note => note.id !== `marker${i}`); pack.markers = pack.markers.filter(marker => marker.i !== i); diff --git a/modules/ui/tools.js b/modules/ui/tools.js index b4884c8b..af04f4f2 100644 --- a/modules/ui/tools.js +++ b/modules/ui/tools.js @@ -828,9 +828,17 @@ function addMarkerOnClick() { // Find the currently selected marker to use as a base const isMarkerSelected = markers.length && elSelected?.node()?.parentElement?.id === "markers"; const selectedMarker = isMarkerSelected ? markers.find(marker => marker.i === +elSelected.attr("id").slice(6)) : null; - const baseMarker = selectedMarker || {icon: "❓"}; + + const selectedType = document.getElementById("addedMarkerType").value; + const selectedConfig = Markers.getConfig().find(({type}) => type === selectedType); + + const baseMarker = selectedMarker || selectedConfig || {icon: "❓"}; const marker = Markers.add({...baseMarker, x, y, cell}); + if (selectedConfig && selectedConfig.add) { + selectedConfig.add("marker"+marker.i, cell); + } + const markersElement = document.getElementById("markers"); const rescale = +markersElement.getAttribute("rescale"); markersElement.insertAdjacentHTML("beforeend", drawMarker(marker, rescale)); diff --git a/versioning.js b/versioning.js index fa8ab0f5..0f05093f 100644 --- a/versioning.js +++ b/versioning.js @@ -1,7 +1,11 @@ "use strict"; // version and caching control -const version = "1.89.36"; // generator version, update each time + + + +const version = "1.89.39"; // generator version, update each time + { document.title += " v" + version;