diff --git a/resources/cosmetic/territory_patterns.json b/resources/cosmetic/territory_patterns.json new file mode 100644 index 000000000..dbcae3ac9 --- /dev/null +++ b/resources/cosmetic/territory_patterns.json @@ -0,0 +1,76 @@ +{ + "role_groups": { + "donor": ["1286741019604299857", "1286741020556429383"], + "staff": [ + "1286745100411473930", + "1286738076386856991", + "1338654590043820148" + ] + }, + "pattern": { + "stripes_v": { + "pattern": "AQACAAIACAU=", + "role_group": ["all"] + }, + "stripes_h": { + "pattern": "AQACAAIACAM=", + "role_group": ["all"] + }, + "checkerboard": { + "pattern": "AQACAAIACAk=", + "role_group": ["all"] + }, + "diagonal": { + "pattern": "AQAQABAAAQEAAgAEAAgAEAAgAEAAgAAAAQACAAQACAAQACAAQACA", + "role_group": ["donor", "staff"] + }, + "cross": { + "pattern": "AQAQABAAAQGAAkAEIAgQEAggBEACgAGAAUACIAQQCAgQBCACQAGA", + "role_group": ["donor", "staff"] + }, + "mini_cross": { + "pattern": "AQAQAAgAAQPADDAwDMADwAMwDAwwA8A=", + "role_group": ["donor", "staff"] + }, + "horizontal_stripes": { + "pattern": "AQAQABAAAf//AAAAAAAAAAAAAAAAAAD//wAAAAAAAAAAAAAAAAAA", + "role_group": ["donor", "staff"] + }, + "sparse_dots": { + "pattern": "AQAQABAAAQEBAAAAAAAAAAAAAAAAAAABAQAAAAAAAAAAAAAAAAAA", + "role_group": ["donor", "staff"] + }, + "evan": { + "pattern": "AQAYAAcABQAAAJ7ESIIkWY7kaQIjSR4jSQAAAA==", + "role_group": ["staff"] + }, + "diagonal_stripe": { + "pattern": "AQAQAAgAAQGAAkAEIAgQEAggBEACgAE=", + "role_group": ["donor", "staff"] + }, + "mountain_ridge": { + "pattern": "AQAQAAgAAQAAGBg8PH5+//9+fjw8GBg=", + "role_group": ["donor", "staff"] + }, + "scattered_dots": { + "pattern": "AQAQAAgAAQAAAiAAAAAAAAAAAAgQAAA=", + "role_group": ["donor", "staff"] + }, + "circuit_board": { + "pattern": "AQAQAAgAAcPDw8MMDAwMMAwwDMPDw8M=", + "role_group": ["donor", "staff"] + }, + "vertical_bars": { + "pattern": "AQAQAAgAAUmSSZJJkkmSSZJJkkmSSZI=", + "role_group": ["donor", "staff"] + }, + ".w.": { + "pattern": "AQAQAAgAAQAAAAAAAAJAgkFEIi50Fmg=", + "role_group": ["donor", "staff"] + }, + "openfront": { + "pattern": "AQBCAAoABQAAAAAAAAAAAAAAAAAAAACAw/GJ8Hk4og+RSGBCIBKZCEQigQqBSKQiEHk8MjwekYxAJBCIEChEIgKRQCBCIBGJCDgCnwiBiCMiAAAAAAAAAAAA", + "role_group": ["staff"] + } + } +} diff --git a/resources/territory_patterns.json b/resources/territory_patterns.json deleted file mode 100644 index bf63398ed..000000000 --- a/resources/territory_patterns.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "stripes_v": "AQACAAIACAU=", - "stripes_h": "AQACAAIACAM=", - "checkerboard": "AQACAAIACAk=", - "diagonal": "AQAQABAAAQEAAgAEAAgAEAAgAEAAgAAAAQACAAQACAAQACAAQACA", - "cross": "AQAQABAAAQGAAkAEIAgQEAggBEACgAGAAUACIAQQCAgQBCACQAGA", - "mini_cross": "AQAQAAgAAQPADDAwDMADwAMwDAwwA8A=", - "horizontal_stripes": "AQAQABAAAf//AAAAAAAAAAAAAAAAAAD//wAAAAAAAAAAAAAAAAAA", - "sparse_dots": "AQAQABAAAQEBAAAAAAAAAAAAAAAAAAABAQAAAAAAAAAAAAAAAAAA", - "evan": "AQAYAAcABQAAAJ7ESIIkWY7kaQIjSR4jSQAAAA==", - "diagonal_stripe": "AQAQAAgAAQGAAkAEIAgQEAggBEACgAE=", - "mountain_ridge": "AQAQAAgAAQAAGBg8PH5+//9+fjw8GBg=", - "scattered_dots": "AQAQAAgAAQAAAiAAAAAAAAAAAAgQAAA=", - "circuit_board": "AQAQAAgAAcPDw8MMDAwMMAwwDMPDw8M=", - "vertical_bars": "AQAQAAgAAUmSSZJJkkmSSZJJkkmSSZI=", - ".w.": "AQAQAAgAAQAAAAAAAAJAgkFEIi50Fmg=", - "openfront": "AQBCAAoABQAAAAAAAAAAAAAAAAAAAACAw/GJ8Hk4og+RSGBCIBKZCEQigQqBSKQiEHk8MjwekYxAJBCIEChEIgKRQCBCIBGJCDgCnwiBiCMiAAAAAAAAAAAA" -} diff --git a/src/client/TerritoryPatterns.ts b/src/client/TerritoryPatterns.ts index 593e87dfa..5b89d8fc3 100644 --- a/src/client/TerritoryPatterns.ts +++ b/src/client/TerritoryPatterns.ts @@ -2,14 +2,17 @@ import { base64url } from "jose"; import { z } from "zod"; import rawTerritoryPatterns from "../../resources/cosmetic/territory_patterns.json"; -export const TerritoryPatternsSchema = z.record( - z.string(), - z.object({ - pattern: z.string().base64(), - role: z.array(z.string()).optional(), - role_group: z.array(z.string()).optional(), - }), -); +export const TerritoryPatternsSchema = z.object({ + role_group: z.record(z.string(), z.array(z.string())).optional(), + pattern: z.record( + z.string(), + z.object({ + pattern: z.string().base64(), + role: z.array(z.string()).optional(), + role_group: z.array(z.string()).optional(), + }), + ), +}); export const territoryPatterns = TerritoryPatternsSchema.parse(rawTerritoryPatterns); diff --git a/src/client/TerritoryPatternsModal.ts b/src/client/TerritoryPatternsModal.ts index 52592976f..02c5e10bb 100644 --- a/src/client/TerritoryPatternsModal.ts +++ b/src/client/TerritoryPatternsModal.ts @@ -138,27 +138,29 @@ export class TerritoryPatternsModal extends LitElement { class="flex flex-wrap gap-4 p-2" style="justify-content: center; align-items: flex-start;" > - ${Object.entries(territoryPatterns ?? {}).map(([key, pattern]) => { - const isLocked = this.isPatternLocked(key); - const reason = this.lockedReasons[key] || "Locked"; + ${Object.entries(territoryPatterns.pattern ?? {}).map( + ([key, pattern]) => { + const isLocked = this.isPatternLocked(key); + const reason = this.lockedReasons[key] || "Locked"; - return html` - - `; - })} + return tiles; + })()} + + `; + })()} + + + `; + }, + )} `; @@ -235,9 +238,9 @@ export class TerritoryPatternsModal extends LitElement { private selectPattern(patternKey: string) { this.selectedPattern = patternKey; TerritoryPatternStorage.setSelectedPattern(patternKey); - const base64 = territoryPatterns[patternKey]; + const base64 = territoryPatterns.pattern[patternKey]; if (base64) { - TerritoryPatternStorage.setSelectedPatternBase64(base64); + TerritoryPatternStorage.setSelectedPatternBase64(base64.pattern); } this.updatePreview(); this.close(); @@ -247,7 +250,7 @@ export class TerritoryPatternsModal extends LitElement { if (!this.previewButton) return; const pattern = this.selectedPattern - ? territoryPatterns[this.selectedPattern] + ? territoryPatterns.pattern[this.selectedPattern] : null; if (!pattern) { const blankPreview = html` @@ -290,7 +293,7 @@ export class TerritoryPatternsModal extends LitElement { const fixedHeight = 48; const fixedWidth = 48; - const decoder = new PatternDecoder(pattern); + const decoder = new PatternDecoder(pattern.pattern); const cellCountX = decoder.getTileWidth(); const cellCountY = decoder.getTileHeight();