From d7f5cae2298cef6748f90d92d6a2161b39e62b74 Mon Sep 17 00:00:00 2001 From: "Ryan D. Guild" Date: Sat, 26 Oct 2024 08:26:59 -0400 Subject: [PATCH] Removed priority queue in favor of FlatQueue (#1157) * removed priority queue in favor of simple array extension as it will be easier to migrate to esm * patch: bump version * spacing * moved references to globalThis * demonstrate module interop * added version to priority-queue and moved to utils to follow dom loading pattern * removed PriorityQueue in favor of FlatQueue * update index.html * never mind that force push I don't know how to amend commits right * missing capitalization * priority set to 0 on 541 --------- Co-authored-by: RyanGuild --- index.html | 11 +++++------ libs/priority-queue.min.js | 1 - modules/burgs-and-states.js | 10 ++++++---- modules/cultures-generator.js | 8 ++++---- modules/provinces-generator.js | 22 +++++++++++----------- modules/religions-generator.js | 8 ++++---- modules/zones-generator.js | 16 ++++++++-------- versioning.js | 3 ++- 8 files changed, 40 insertions(+), 39 deletions(-) delete mode 100644 libs/priority-queue.min.js diff --git a/index.html b/index.html index 96b9374e..3b2d7203 100644 --- a/index.html +++ b/index.html @@ -8022,7 +8022,6 @@ - @@ -8053,14 +8052,14 @@ - - - + + + - + - + diff --git a/libs/priority-queue.min.js b/libs/priority-queue.min.js deleted file mode 100644 index acf2506b..00000000 --- a/libs/priority-queue.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).PriorityQueue=t()}}(function(){return function t(e,i,r){function o(n,s){if(!i[n]){if(!e[n]){var h="function"==typeof require&&require;if(!s&&h)return h(n,!0);if(a)return a(n,!0);var u=new Error("Cannot find module '"+n+"'");throw u.code="MODULE_NOT_FOUND",u}var p=i[n]={exports:{}};e[n][0].call(p.exports,function(t){var i=e[n][1][t];return o(i||t)},p,p.exports,t,e,i,r)}return i[n].exports}for(var a="function"==typeof require&&require,n=0;n>>1],e)>=0?o=a+1:r=a;return o},e.exports=function(){function t(t){var e;this.options=t,this.comparator=this.options.comparator,this.data=(null!=(e=this.options.initialValues)?e.slice(0):void 0)||[],this.data.sort(this.comparator).reverse()}return t.prototype.queue=function(t){var e;e=r(this.data,t,this.comparator),this.data.splice(e,0,t)},t.prototype.dequeue=function(){return this.data.pop()},t.prototype.peek=function(){return this.data[this.data.length-1]},t.prototype.clear=function(){this.data.length=0},t}()},{}],4:[function(t,e,i){e.exports=function(){function t(t){var e,i,r,o,a,n,s,h;for(this.comparator=(null!=t?t.comparator:void 0)||function(t,e){return t-e},this.pageSize=(null!=t?t.pageSize:void 0)||512,this.length=0,s=0;1<a;0<=a?++i:--i)e.push(null);if(this._memory=[],this._mask=this.pageSize-1,t.initialValues)for(r=0,o=(n=t.initialValues).length;r0&&(this._write(1,e),this._bubbleDown(1,e)),t},t.prototype.peek=function(){return this._read(1)},t.prototype.clear=function(){this.length=0,this._memory.length=0},t.prototype._write=function(t,e){var i;for(i=t>>this._shift;i>=this._memory.length;)this._memory.push(this._emptyMemoryPageTemplate.slice(0));return this._memory[i][t&this._mask]=e},t.prototype._read=function(t){return this._memory[t>>this._shift][t&this._mask]},t.prototype._bubbleUp=function(t,e){var i,r,o,a;for(i=this.comparator;t>1&&(r=t&this._mask,t3?o=t&~this._mask|r>>1:r<2?(o=t-this.pageSize>>this._shift,o+=o&~(this._mask>>1),o|=this.pageSize>>1):o=t-2,!(i(a=this._read(o),e)<0));)this._write(o,e),this._write(t,a),t=o},t.prototype._bubbleDown=function(t,e){var i,r,o,a,n;for(n=this.comparator;tthis._mask&&!(t&this._mask-1)?i=r=t+2:t&this.pageSize>>1?(i=(t&~this._mask)>>1,r=(i=(i|=t&this._mask>>1)+1<0)for(t=e=1,i=this.data.length;1<=i?ei;t=1<=i?++e:--e)this._bubbleUp(t)},t.prototype.queue=function(t){this.data.push(t),this._bubbleUp(this.data.length-1)},t.prototype.dequeue=function(){var t,e;return e=this.data[0],t=this.data.pop(),this.data.length>0&&(this.data[0]=t,this._bubbleDown(0)),e},t.prototype.peek=function(){return this.data[0]},t.prototype.clear=function(){this.length=0,this.data.length=0},t.prototype._bubbleUp=function(t){for(var e,i;t>0&&(e=t-1>>>1,this.comparator(this.data[t],this.data[e])<0);)i=this.data[e],this.data[e]=this.data[t],this.data[t]=i,t=e},t.prototype._bubbleDown=function(t){var e,i,r,o,a;for(e=this.data.length-1;o=(i=1+(t<<1))+1,r=t,i<=e&&this.comparator(this.data[i],this.data[r])<0&&(r=i),o<=e&&this.comparator(this.data[o],this.data[r])<0&&(r=o),r!==t;)a=this.data[r],this.data[r]=this.data[t],this.data[t]=a,t=r},t}()},{}]},{},[1])(1)}); \ No newline at end of file diff --git a/modules/burgs-and-states.js b/modules/burgs-and-states.js index 90ab2bf2..4b73276b 100644 --- a/modules/burgs-and-states.js +++ b/modules/burgs-and-states.js @@ -286,7 +286,8 @@ window.BurgsAndStates = (() => { const {cells, states, cultures, burgs} = pack; cells.state = cells.state || new Uint16Array(cells.i.length); - const queue = new PriorityQueue({comparator: (a, b) => a.p - b.p}); + + const queue = new FlatQueue(); const cost = []; const globalGrowthRate = byId("growthRate").valueAsNumber || 1; @@ -307,12 +308,13 @@ window.BurgsAndStates = (() => { cells.state[capitalCell] = state.i; const cultureCenter = cultures[state.culture].center; const b = cells.biome[cultureCenter]; // state native biome - queue.queue({e: state.center, p: 0, s: state.i, b}); + queue.push({e: state.center, p: 0, s: state.i, b}, 0); cost[state.center] = 1; } while (queue.length) { - const next = queue.dequeue(); + const next = queue.pop(); + const {e, p, s, b} = next; const {type, culture} = states[s]; @@ -335,7 +337,7 @@ window.BurgsAndStates = (() => { if (!cost[e] || totalCost < cost[e]) { if (cells.h[e] >= 20) cells.state[e] = s; // assign state to cell cost[e] = totalCost; - queue.queue({e, p: totalCost, s, b}); + queue.push({e, p: totalCost, s, b}, totalCost); } }); } diff --git a/modules/cultures-generator.js b/modules/cultures-generator.js index f2203146..34dc5edd 100644 --- a/modules/cultures-generator.js +++ b/modules/cultures-generator.js @@ -518,7 +518,7 @@ window.Cultures = (function () { TIME && console.time("expandCultures"); const {cells, cultures} = pack; - const queue = new PriorityQueue({comparator: (a, b) => a.priority - b.priority}); + const queue = new FlatQueue(); const cost = []; const neutralRate = byId("neutralRate")?.valueAsNumber || 1; @@ -538,11 +538,11 @@ window.Cultures = (function () { for (const culture of cultures) { if (!culture.i || culture.removed || culture.lock) continue; - queue.queue({cellId: culture.center, cultureId: culture.i, priority: 0}); + queue.push({cellId: culture.center, cultureId: culture.i, priority: 0}, 0); } while (queue.length) { - const {cellId, priority, cultureId} = queue.dequeue(); + const {cellId, priority, cultureId} = queue.pop(); const {type, expansionism} = cultures[cultureId]; cells.c[cellId].forEach(neibCellId => { @@ -566,7 +566,7 @@ window.Cultures = (function () { if (!cost[neibCellId] || totalCost < cost[neibCellId]) { if (cells.pop[neibCellId] > 0) cells.culture[neibCellId] = cultureId; // assign culture to populated cell cost[neibCellId] = totalCost; - queue.queue({cellId: neibCellId, cultureId, priority: totalCost}); + queue.push({cellId: neibCellId, cultureId, priority: totalCost}, totalCost); } }); } diff --git a/modules/provinces-generator.js b/modules/provinces-generator.js index 8563f682..c0f8e8f7 100644 --- a/modules/provinces-generator.js +++ b/modules/provinces-generator.js @@ -77,18 +77,18 @@ window.Provinces = (function () { }); // expand generated provinces - const queue = new PriorityQueue({comparator: (a, b) => a.p - b.p}); + const queue = new FlatQueue(); const cost = []; provinces.forEach(p => { if (!p.i || p.removed || isProvinceLocked(p)) return; provinceIds[p.center] = p.i; - queue.queue({e: p.center, p: 0, province: p.i, state: p.state}); + queue.push({e: p.center, province: p.i, state: p.state, p: 0}, 0); cost[p.center] = 1; }); while (queue.length) { - const {e, p, province, state} = queue.dequeue(); + const {e, p, province, state} = queue.pop(); cells.c[e].forEach(e => { if (isProvinceCellLocked(e)) return; // do not overwrite cell of locked provinces @@ -103,7 +103,7 @@ window.Provinces = (function () { if (!cost[e] || totalCost < cost[e]) { if (land) provinceIds[e] = province; // assign province to a cell cost[e] = totalCost; - queue.queue({e, p: totalCost, province, state}); + queue.push({e, province, state, p: totalCost}, totalCost); } }); } @@ -158,9 +158,9 @@ window.Provinces = (function () { // expand province const cost = []; cost[center] = 1; - queue.queue({e: center, p: 0}); + queue.push({e: center, p: 0}, 0); while (queue.length) { - const {e, p} = queue.dequeue(); + const {e, p} = queue.pop(); cells.c[e].forEach(nextCellId => { if (provinceIds[nextCellId]) return; @@ -173,7 +173,7 @@ window.Provinces = (function () { if (!cost[nextCellId] || totalCost < cost[nextCellId]) { if (land && cells.state[nextCellId] === s.i) provinceIds[nextCellId] = provinceId; // assign province to a cell cost[nextCellId] = totalCost; - queue.queue({e: nextCellId, p: totalCost}); + queue.push({e: nextCellId, p: totalCost}, totalCost); } }); } @@ -216,15 +216,15 @@ window.Provinces = (function () { // check if there is a land way within the same state between two cells function isPassable(from, to) { if (cells.f[from] !== cells.f[to]) return false; // on different islands - const queue = [from], + const passableQueue = [from], used = new Uint8Array(cells.i.length), state = cells.state[from]; - while (queue.length) { - const current = queue.pop(); + while (passableQueue.length) { + const current = passableQueue.pop(); if (current === to) return true; // way is found cells.c[current].forEach(c => { if (used[c] || cells.h[c] < 20 || cells.state[c] !== state) return; - queue.push(c); + passableQueue.push(c); used[c] = 1; }); } diff --git a/modules/religions-generator.js b/modules/religions-generator.js index 5e5e08f6..2bb972db 100644 --- a/modules/religions-generator.js +++ b/modules/religions-generator.js @@ -695,7 +695,7 @@ window.Religions = (function () { const {cells, routes} = pack; const religionIds = spreadFolkReligions(religions); - const queue = new PriorityQueue({comparator: (a, b) => a.p - b.p}); + const queue = new FlatQueue(); const cost = []; // limit cost for organized religions growth @@ -705,14 +705,14 @@ window.Religions = (function () { .filter(r => r.i && !r.lock && r.type !== "Folk" && !r.removed) .forEach(r => { religionIds[r.center] = r.i; - queue.queue({e: r.center, p: 0, r: r.i, s: cells.state[r.center]}); + queue.push({e: r.center, p: 0, r: r.i, s: cells.state[r.center]}, 0); cost[r.center] = 1; }); const religionsMap = new Map(religions.map(r => [r.i, r])); while (queue.length) { - const {e: cellId, p, r, s: state} = queue.dequeue(); + const {e: cellId, p, r, s: state} = queue.pop(); const {culture, expansion, expansionism} = religionsMap.get(r); cells.c[cellId].forEach(nextCell => { @@ -732,7 +732,7 @@ window.Religions = (function () { if (cells.culture[nextCell]) religionIds[nextCell] = r; // assign religion to cell cost[nextCell] = totalCost; - queue.queue({e: nextCell, p: totalCost, r, s: state}); + queue.push({e: nextCell, p: totalCost, r, s: state}, totalCost); } }); } diff --git a/modules/zones-generator.js b/modules/zones-generator.js index 7e8ec94b..0fdab688 100644 --- a/modules/zones-generator.js +++ b/modules/zones-generator.js @@ -209,11 +209,11 @@ window.Zones = (function () { const cost = []; const maxCells = rand(20, 40); - const queue = new PriorityQueue({comparator: (a, b) => a.p - b.p}); - queue.queue({e: burg.cell, p: 0}); + const queue = new FlatQueue(); + queue.push({e: burg.cell, p: 0}, 0); while (queue.length) { - const next = queue.dequeue(); + const next = queue.pop(); if (cells.burg[next.e] || cells.pop[next.e]) cellsArray.push(next.e); usedCells[next.e] = 1; @@ -224,7 +224,7 @@ window.Zones = (function () { if (!cost[nextCellId] || p < cost[nextCellId]) { cost[nextCellId] = p; - queue.queue({e: nextCellId, p}); + queue.push({e: nextCellId, p}, p); } }); } @@ -251,11 +251,11 @@ window.Zones = (function () { const cost = []; const maxCells = rand(5, 25); - const queue = new PriorityQueue({comparator: (a, b) => a.p - b.p}); - queue.queue({e: burg.cell, p: 0}); + const queue = new FlatQueue(); + queue.push({e: burg.cell, p: 0}, 0); while (queue.length) { - const next = queue.dequeue(); + const next = queue.pop(); if (cells.burg[next.e] || cells.pop[next.e]) cellsArray.push(next.e); usedCells[next.e] = 1; @@ -266,7 +266,7 @@ window.Zones = (function () { if (!cost[e] || p < cost[e]) { cost[e] = p; - queue.queue({e, p}); + queue.push({e, p}), p; } }); } diff --git a/versioning.js b/versioning.js index fcd5504b..c5bf2fa4 100644 --- a/versioning.js +++ b/versioning.js @@ -12,7 +12,8 @@ * * Example: 1.102.2 -> Major version 1, Minor version 102, Patch version 2 */ -const VERSION = "1.105.20"; + +const VERSION = "1.105.21"; if (parseMapVersion(VERSION) !== VERSION) alert("versioning.js: Invalid format or parsing function"); {