gotchi-generator 1.1.1 → 1.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/config.json +30 -30
- package/dist/index.cjs +81 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +81 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- /package/Trait Files/Sprites/meleebody/Wearable (Hands) L/{Legendary Wizard Stuff.png → Legendary Wizard Staff.png} +0 -0
- /package/Trait Files/Sprites/meleebody/Wearable (Hands) R/{Legendary Wizard Stuff.png → Legendary Wizard Staff.png} +0 -0
- /package/Trait Files/Sprites/meleebody/Wearable (Head)/{Gentelmen Hat.png → Gentleman Hat.png} +0 -0
- /package/Trait Files/Sprites/meleegunbody/Wearable (Hands) L/{Legendary Wizard Stuff.png → Legendary Wizard Staff.png} +0 -0
- /package/Trait Files/Sprites/meleegunbody/Wearable (Hands) R/{Legendary Wizard Stuff.png → Legendary Wizard Staff.png} +0 -0
- /package/Trait Files/Sprites/meleegunbody/Wearable (Head)/{Gentelmen Hat.png → Gentleman Hat.png} +0 -0
- /package/Trait Files/Sprites/projectiles/{Legendary Wizard Stuff.png → Legendary Wizard Staff.png} +0 -0
- /package/Trait Files/Sprites/punchbody/Wearable (Head)/{Gentelmen Hat.png → Gentleman Hat.png} +0 -0
- /package/Trait Files/Sprites/punchgunbody/Wearable (Hands) L/{Legendary Wizard Stuff.png → Legendary Wizard Staff.png} +0 -0
- /package/Trait Files/Sprites/punchgunbody/Wearable (Hands) R/{Legendary Wizard Stuff.png → Legendary Wizard Staff.png} +0 -0
- /package/Trait Files/Sprites/punchgunbody/Wearable (Head)/{Gentelmen Hat.png → Gentleman Hat.png} +0 -0
- /package/Trait Files/Sprites/wandbody/Wearable (Hands) L/{Legendary Wizard Stuff.png → Legendary Wizard Staff.png} +0 -0
- /package/Trait Files/Sprites/wandbody/Wearable (Hands) R/{Legendary Wizard Stuff.png → Legendary Wizard Staff.png} +0 -0
- /package/Trait Files/Sprites/wandbody/Wearable (Head)/{Gentelmen Hat.png → Gentleman Hat.png} +0 -0
package/config.json
CHANGED
|
@@ -2695,7 +2695,7 @@
|
|
|
2695
2695
|
"Jamaican Flag",
|
|
2696
2696
|
"L2 Sign",
|
|
2697
2697
|
"Lasso",
|
|
2698
|
-
"Legendary Wizard
|
|
2698
|
+
"Legendary Wizard Staff",
|
|
2699
2699
|
"Lick Tentacle",
|
|
2700
2700
|
"Lil Pump Drank",
|
|
2701
2701
|
"Link Bubbly",
|
|
@@ -2847,7 +2847,7 @@
|
|
|
2847
2847
|
"Jamaican Flag",
|
|
2848
2848
|
"L2 Sign",
|
|
2849
2849
|
"Lasso",
|
|
2850
|
-
"Legendary Wizard
|
|
2850
|
+
"Legendary Wizard Staff",
|
|
2851
2851
|
"Lick Tentacle",
|
|
2852
2852
|
"Lil Pump Drank",
|
|
2853
2853
|
"Link Bubbly",
|
|
@@ -2999,7 +2999,7 @@
|
|
|
2999
2999
|
"Jamaican Flag",
|
|
3000
3000
|
"L2 Sign",
|
|
3001
3001
|
"Lasso",
|
|
3002
|
-
"Legendary Wizard
|
|
3002
|
+
"Legendary Wizard Staff",
|
|
3003
3003
|
"Lick Tentacle",
|
|
3004
3004
|
"Lil Pump Drank",
|
|
3005
3005
|
"Link Bubbly",
|
|
@@ -3151,7 +3151,7 @@
|
|
|
3151
3151
|
"Jamaican Flag",
|
|
3152
3152
|
"L2 Sign",
|
|
3153
3153
|
"Lasso",
|
|
3154
|
-
"Legendary Wizard
|
|
3154
|
+
"Legendary Wizard Staff",
|
|
3155
3155
|
"Lick Tentacle",
|
|
3156
3156
|
"Lil Pump Drank",
|
|
3157
3157
|
"Link Bubbly",
|
|
@@ -3303,7 +3303,7 @@
|
|
|
3303
3303
|
"Jamaican Flag",
|
|
3304
3304
|
"L2 Sign",
|
|
3305
3305
|
"Lasso",
|
|
3306
|
-
"Legendary Wizard
|
|
3306
|
+
"Legendary Wizard Staff",
|
|
3307
3307
|
"Lick Tentacle",
|
|
3308
3308
|
"Lil Pump Drank",
|
|
3309
3309
|
"Link Bubbly",
|
|
@@ -3455,7 +3455,7 @@
|
|
|
3455
3455
|
"Jamaican Flag",
|
|
3456
3456
|
"L2 Sign",
|
|
3457
3457
|
"Lasso",
|
|
3458
|
-
"Legendary Wizard
|
|
3458
|
+
"Legendary Wizard Staff",
|
|
3459
3459
|
"Lick Tentacle",
|
|
3460
3460
|
"Lil Pump Drank",
|
|
3461
3461
|
"Link Bubbly",
|
|
@@ -3607,7 +3607,7 @@
|
|
|
3607
3607
|
"Jamaican Flag",
|
|
3608
3608
|
"L2 Sign",
|
|
3609
3609
|
"Lasso",
|
|
3610
|
-
"Legendary Wizard
|
|
3610
|
+
"Legendary Wizard Staff",
|
|
3611
3611
|
"Lick Tentacle",
|
|
3612
3612
|
"Lil Pump Drank",
|
|
3613
3613
|
"Link Bubbly",
|
|
@@ -3759,7 +3759,7 @@
|
|
|
3759
3759
|
"Jamaican Flag",
|
|
3760
3760
|
"L2 Sign",
|
|
3761
3761
|
"Lasso",
|
|
3762
|
-
"Legendary Wizard
|
|
3762
|
+
"Legendary Wizard Staff",
|
|
3763
3763
|
"Lick Tentacle",
|
|
3764
3764
|
"Lil Pump Drank",
|
|
3765
3765
|
"Link Bubbly",
|
|
@@ -3911,7 +3911,7 @@
|
|
|
3911
3911
|
"Jamaican Flag",
|
|
3912
3912
|
"L2 Sign",
|
|
3913
3913
|
"Lasso",
|
|
3914
|
-
"Legendary Wizard
|
|
3914
|
+
"Legendary Wizard Staff",
|
|
3915
3915
|
"Lick Tentacle",
|
|
3916
3916
|
"Lil Pump Drank",
|
|
3917
3917
|
"Link Bubbly",
|
|
@@ -4063,7 +4063,7 @@
|
|
|
4063
4063
|
"Jamaican Flag",
|
|
4064
4064
|
"L2 Sign",
|
|
4065
4065
|
"Lasso",
|
|
4066
|
-
"Legendary Wizard
|
|
4066
|
+
"Legendary Wizard Staff",
|
|
4067
4067
|
"Lick Tentacle",
|
|
4068
4068
|
"Lil Pump Drank",
|
|
4069
4069
|
"Link Bubbly",
|
|
@@ -4215,7 +4215,7 @@
|
|
|
4215
4215
|
"Jamaican Flag",
|
|
4216
4216
|
"L2 Sign",
|
|
4217
4217
|
"Lasso",
|
|
4218
|
-
"Legendary Wizard
|
|
4218
|
+
"Legendary Wizard Staff",
|
|
4219
4219
|
"Lick Tentacle",
|
|
4220
4220
|
"Lil Pump Drank",
|
|
4221
4221
|
"Link Bubbly",
|
|
@@ -4367,7 +4367,7 @@
|
|
|
4367
4367
|
"Jamaican Flag",
|
|
4368
4368
|
"L2 Sign",
|
|
4369
4369
|
"Lasso",
|
|
4370
|
-
"Legendary Wizard
|
|
4370
|
+
"Legendary Wizard Staff",
|
|
4371
4371
|
"Lick Tentacle",
|
|
4372
4372
|
"Lil Pump Drank",
|
|
4373
4373
|
"Link Bubbly",
|
|
@@ -4519,7 +4519,7 @@
|
|
|
4519
4519
|
"Jamaican Flag",
|
|
4520
4520
|
"L2 Sign",
|
|
4521
4521
|
"Lasso",
|
|
4522
|
-
"Legendary Wizard
|
|
4522
|
+
"Legendary Wizard Staff",
|
|
4523
4523
|
"Lick Tentacle",
|
|
4524
4524
|
"Lil Pump Drank",
|
|
4525
4525
|
"Link Bubbly",
|
|
@@ -4671,7 +4671,7 @@
|
|
|
4671
4671
|
"Jamaican Flag",
|
|
4672
4672
|
"L2 Sign",
|
|
4673
4673
|
"Lasso",
|
|
4674
|
-
"Legendary Wizard
|
|
4674
|
+
"Legendary Wizard Staff",
|
|
4675
4675
|
"Lick Tentacle",
|
|
4676
4676
|
"Lil Pump Drank",
|
|
4677
4677
|
"Link Bubbly",
|
|
@@ -4823,7 +4823,7 @@
|
|
|
4823
4823
|
"Jamaican Flag",
|
|
4824
4824
|
"L2 Sign",
|
|
4825
4825
|
"Lasso",
|
|
4826
|
-
"Legendary Wizard
|
|
4826
|
+
"Legendary Wizard Staff",
|
|
4827
4827
|
"Lick Tentacle",
|
|
4828
4828
|
"Lil Pump Drank",
|
|
4829
4829
|
"Link Bubbly",
|
|
@@ -4975,7 +4975,7 @@
|
|
|
4975
4975
|
"Jamaican Flag",
|
|
4976
4976
|
"L2 Sign",
|
|
4977
4977
|
"Lasso",
|
|
4978
|
-
"Legendary Wizard
|
|
4978
|
+
"Legendary Wizard Staff",
|
|
4979
4979
|
"Lick Tentacle",
|
|
4980
4980
|
"Lil Pump Drank",
|
|
4981
4981
|
"Link Bubbly",
|
|
@@ -5127,7 +5127,7 @@
|
|
|
5127
5127
|
"Jamaican Flag",
|
|
5128
5128
|
"L2 Sign",
|
|
5129
5129
|
"Lasso",
|
|
5130
|
-
"Legendary Wizard
|
|
5130
|
+
"Legendary Wizard Staff",
|
|
5131
5131
|
"Lick Tentacle",
|
|
5132
5132
|
"Lil Pump Drank",
|
|
5133
5133
|
"Link Bubbly",
|
|
@@ -5279,7 +5279,7 @@
|
|
|
5279
5279
|
"Jamaican Flag",
|
|
5280
5280
|
"L2 Sign",
|
|
5281
5281
|
"Lasso",
|
|
5282
|
-
"Legendary Wizard
|
|
5282
|
+
"Legendary Wizard Staff",
|
|
5283
5283
|
"Lick Tentacle",
|
|
5284
5284
|
"Lil Pump Drank",
|
|
5285
5285
|
"Link Bubbly",
|
|
@@ -5431,7 +5431,7 @@
|
|
|
5431
5431
|
"Jamaican Flag",
|
|
5432
5432
|
"L2 Sign",
|
|
5433
5433
|
"Lasso",
|
|
5434
|
-
"Legendary Wizard
|
|
5434
|
+
"Legendary Wizard Staff",
|
|
5435
5435
|
"Lick Tentacle",
|
|
5436
5436
|
"Lil Pump Drank",
|
|
5437
5437
|
"Link Bubbly",
|
|
@@ -5583,7 +5583,7 @@
|
|
|
5583
5583
|
"Jamaican Flag",
|
|
5584
5584
|
"L2 Sign",
|
|
5585
5585
|
"Lasso",
|
|
5586
|
-
"Legendary Wizard
|
|
5586
|
+
"Legendary Wizard Staff",
|
|
5587
5587
|
"Lick Tentacle",
|
|
5588
5588
|
"Lil Pump Drank",
|
|
5589
5589
|
"Link Bubbly",
|
|
@@ -5735,7 +5735,7 @@
|
|
|
5735
5735
|
"Jamaican Flag",
|
|
5736
5736
|
"L2 Sign",
|
|
5737
5737
|
"Lasso",
|
|
5738
|
-
"Legendary Wizard
|
|
5738
|
+
"Legendary Wizard Staff",
|
|
5739
5739
|
"Lick Tentacle",
|
|
5740
5740
|
"Lil Pump Drank",
|
|
5741
5741
|
"Link Bubbly",
|
|
@@ -5887,7 +5887,7 @@
|
|
|
5887
5887
|
"Jamaican Flag",
|
|
5888
5888
|
"L2 Sign",
|
|
5889
5889
|
"Lasso",
|
|
5890
|
-
"Legendary Wizard
|
|
5890
|
+
"Legendary Wizard Staff",
|
|
5891
5891
|
"Lick Tentacle",
|
|
5892
5892
|
"Lil Pump Drank",
|
|
5893
5893
|
"Link Bubbly",
|
|
@@ -6039,7 +6039,7 @@
|
|
|
6039
6039
|
"Jamaican Flag",
|
|
6040
6040
|
"L2 Sign",
|
|
6041
6041
|
"Lasso",
|
|
6042
|
-
"Legendary Wizard
|
|
6042
|
+
"Legendary Wizard Staff",
|
|
6043
6043
|
"Lick Tentacle",
|
|
6044
6044
|
"Lil Pump Drank",
|
|
6045
6045
|
"Link Bubbly",
|
|
@@ -6191,7 +6191,7 @@
|
|
|
6191
6191
|
"Jamaican Flag",
|
|
6192
6192
|
"L2 Sign",
|
|
6193
6193
|
"Lasso",
|
|
6194
|
-
"Legendary Wizard
|
|
6194
|
+
"Legendary Wizard Staff",
|
|
6195
6195
|
"Lick Tentacle",
|
|
6196
6196
|
"Lil Pump Drank",
|
|
6197
6197
|
"Link Bubbly",
|
|
@@ -6343,7 +6343,7 @@
|
|
|
6343
6343
|
"Jamaican Flag",
|
|
6344
6344
|
"L2 Sign",
|
|
6345
6345
|
"Lasso",
|
|
6346
|
-
"Legendary Wizard
|
|
6346
|
+
"Legendary Wizard Staff",
|
|
6347
6347
|
"Lick Tentacle",
|
|
6348
6348
|
"Lil Pump Drank",
|
|
6349
6349
|
"Link Bubbly",
|
|
@@ -6487,7 +6487,7 @@
|
|
|
6487
6487
|
"Jamaican Flag",
|
|
6488
6488
|
"L2 Sign",
|
|
6489
6489
|
"Lasso",
|
|
6490
|
-
"Legendary Wizard
|
|
6490
|
+
"Legendary Wizard Staff",
|
|
6491
6491
|
"Lick Tentacle",
|
|
6492
6492
|
"Lil Pump Drank",
|
|
6493
6493
|
"Link Bubbly",
|
|
@@ -6631,7 +6631,7 @@
|
|
|
6631
6631
|
"Jamaican Flag",
|
|
6632
6632
|
"L2 Sign",
|
|
6633
6633
|
"Lasso",
|
|
6634
|
-
"Legendary Wizard
|
|
6634
|
+
"Legendary Wizard Staff",
|
|
6635
6635
|
"Lick Tentacle",
|
|
6636
6636
|
"Lil Pump Drank",
|
|
6637
6637
|
"Link Bubbly",
|
|
@@ -6775,7 +6775,7 @@
|
|
|
6775
6775
|
"Jamaican Flag",
|
|
6776
6776
|
"L2 Sign",
|
|
6777
6777
|
"Lasso",
|
|
6778
|
-
"Legendary Wizard
|
|
6778
|
+
"Legendary Wizard Staff",
|
|
6779
6779
|
"Lick Tentacle",
|
|
6780
6780
|
"Lil Pump Drank",
|
|
6781
6781
|
"Link Bubbly",
|
|
@@ -6919,7 +6919,7 @@
|
|
|
6919
6919
|
"Jamaican Flag",
|
|
6920
6920
|
"L2 Sign",
|
|
6921
6921
|
"Lasso",
|
|
6922
|
-
"Legendary Wizard
|
|
6922
|
+
"Legendary Wizard Staff",
|
|
6923
6923
|
"Lick Tentacle",
|
|
6924
6924
|
"Lil Pump Drank",
|
|
6925
6925
|
"Link Bubbly",
|
|
@@ -7063,7 +7063,7 @@
|
|
|
7063
7063
|
"Jamaican Flag",
|
|
7064
7064
|
"L2 Sign",
|
|
7065
7065
|
"Lasso",
|
|
7066
|
-
"Legendary Wizard
|
|
7066
|
+
"Legendary Wizard Staff",
|
|
7067
7067
|
"Lick Tentacle",
|
|
7068
7068
|
"Lil Pump Drank",
|
|
7069
7069
|
"Link Bubbly",
|
package/dist/index.cjs
CHANGED
|
@@ -100,6 +100,12 @@ function mapHandToProjectile(value) {
|
|
|
100
100
|
};
|
|
101
101
|
return aliases[value] ?? value;
|
|
102
102
|
}
|
|
103
|
+
function getCollateralTint(baseBody) {
|
|
104
|
+
const table = {
|
|
105
|
+
aAAVE: { r: 220, g: 120, b: 255 }
|
|
106
|
+
};
|
|
107
|
+
return table[baseBody] ?? null;
|
|
108
|
+
}
|
|
103
109
|
async function generateSpritesheet(gotchi, config, basePath, outputFolder, verbose = false) {
|
|
104
110
|
const attributes = normalizeAttributes(gotchi.attributes);
|
|
105
111
|
const matchingConfig = findMatchingConfig(attributes, config);
|
|
@@ -130,6 +136,29 @@ async function generateSpritesheet(gotchi, config, basePath, outputFolder, verbo
|
|
|
130
136
|
for (const prop of matchingConfig.properties || []) {
|
|
131
137
|
propertyMap[prop.key] = prop;
|
|
132
138
|
}
|
|
139
|
+
if (!propertyMap["Eye Color"]) {
|
|
140
|
+
const eyeShapeAttr = attributes.find((a) => a.trait_type === "Eye Shape");
|
|
141
|
+
const eyeShapeValue = eyeShapeAttr?.value ?? "";
|
|
142
|
+
const shouldAddEyeColor = /^common/.test(eyeShapeValue);
|
|
143
|
+
if (shouldAddEyeColor) {
|
|
144
|
+
const maticMappingLocal = {
|
|
145
|
+
amUSDT: "aUSDT",
|
|
146
|
+
amAAVE: "aAAVE",
|
|
147
|
+
amDAI: "aDAI",
|
|
148
|
+
amUSDC: "aUSDC"
|
|
149
|
+
};
|
|
150
|
+
const baseBodyAttr = attributes.find((a) => a.trait_type === "Base Body");
|
|
151
|
+
const baseBody = baseBodyAttr ? maticMappingLocal[baseBodyAttr.value] || baseBodyAttr.value : void 0;
|
|
152
|
+
const baseFolderForCycle = propertyMap["Base Body"]?.folder || propertyMap["Eye Shape"]?.folder;
|
|
153
|
+
const cycle = baseFolderForCycle ? baseFolderForCycle.split("/")[0] : "punchbody";
|
|
154
|
+
if (baseBody) {
|
|
155
|
+
propertyMap["Eye Color"] = {
|
|
156
|
+
key: "Eye Color",
|
|
157
|
+
folder: `${cycle}/mythic_high_${baseBody}`
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
133
162
|
let compositeImage = null;
|
|
134
163
|
const layersUsed = [];
|
|
135
164
|
const layerBuffers = [];
|
|
@@ -163,6 +192,7 @@ async function generateSpritesheet(gotchi, config, basePath, outputFolder, verbo
|
|
|
163
192
|
let prop = propertyMap[traitKey];
|
|
164
193
|
let matchingAttributes = [];
|
|
165
194
|
let folder = null;
|
|
195
|
+
let eyeShapeTint = null;
|
|
166
196
|
if (traitKey === "Wearable (Hands) L") {
|
|
167
197
|
prop = propertyMap["Wearable (Hands)"];
|
|
168
198
|
if (prop && selectedLeft) {
|
|
@@ -232,6 +262,49 @@ async function generateSpritesheet(gotchi, config, basePath, outputFolder, verbo
|
|
|
232
262
|
(attr) => attr.trait_type === traitKey
|
|
233
263
|
);
|
|
234
264
|
folder = prop.folder;
|
|
265
|
+
if (traitKey === "Eye Shape" && matchingAttributes.length > 0 && matchingAttributes[0]) {
|
|
266
|
+
const eyeShapeValue = matchingAttributes[0].value;
|
|
267
|
+
const rarityMatch = eyeShapeValue.match(
|
|
268
|
+
/^(uncommon_low|uncommon_high|rare_low|rare_high|mythical_low|mythical_high|mythic_low|mythic_high|common)/
|
|
269
|
+
);
|
|
270
|
+
if (rarityMatch) {
|
|
271
|
+
const rawRarity = rarityMatch[1];
|
|
272
|
+
const normalizedRarity = rawRarity.startsWith("mythic_") ? rawRarity.replace(/^mythic_/, "mythical_") : rawRarity;
|
|
273
|
+
const folderParts = prop.folder.split("/");
|
|
274
|
+
const cycle = folderParts[0];
|
|
275
|
+
const baseFromProp = folderParts.includes("common") ? folderParts[folderParts.length - 1] : null;
|
|
276
|
+
if (normalizedRarity === "common") {
|
|
277
|
+
folder = prop.folder;
|
|
278
|
+
} else {
|
|
279
|
+
const maticMappingLocal = {
|
|
280
|
+
amUSDT: "aUSDT",
|
|
281
|
+
amAAVE: "aAAVE",
|
|
282
|
+
amDAI: "aDAI",
|
|
283
|
+
amUSDC: "aUSDC"
|
|
284
|
+
};
|
|
285
|
+
const baseBodyAttr = attributes.find(
|
|
286
|
+
(a) => a.trait_type === "Base Body"
|
|
287
|
+
);
|
|
288
|
+
const baseBody = baseBodyAttr ? maticMappingLocal[baseBodyAttr.value] || baseBodyAttr.value : baseFromProp;
|
|
289
|
+
let chosenFolder = `${cycle}/${normalizedRarity}`;
|
|
290
|
+
if (baseBody) {
|
|
291
|
+
const preferred = `${cycle}/common/${baseBody}`;
|
|
292
|
+
const preferredPath = getImagePath(
|
|
293
|
+
basePath,
|
|
294
|
+
preferred,
|
|
295
|
+
eyeShapeValue
|
|
296
|
+
);
|
|
297
|
+
if (preferredPath) {
|
|
298
|
+
chosenFolder = preferred;
|
|
299
|
+
} else {
|
|
300
|
+
const tint = getCollateralTint(baseBody);
|
|
301
|
+
if (tint) eyeShapeTint = tint;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
folder = chosenFolder;
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
}
|
|
235
308
|
}
|
|
236
309
|
}
|
|
237
310
|
if (!prop || matchingAttributes.length === 0 || !folder) continue;
|
|
@@ -241,7 +314,14 @@ async function generateSpritesheet(gotchi, config, basePath, outputFolder, verbo
|
|
|
241
314
|
const imagePath = getImagePath(basePath, folder, traitValue);
|
|
242
315
|
if (imagePath) {
|
|
243
316
|
try {
|
|
244
|
-
|
|
317
|
+
let imageBuffer = await sharp__default.default(imagePath).png().toBuffer();
|
|
318
|
+
if (traitKey === "Eye Shape" && eyeShapeTint) {
|
|
319
|
+
if (verbose)
|
|
320
|
+
console.log(
|
|
321
|
+
` Tinting Eye Shape to base color rgb(${eyeShapeTint.r},${eyeShapeTint.g},${eyeShapeTint.b})`
|
|
322
|
+
);
|
|
323
|
+
imageBuffer = await sharp__default.default(imageBuffer).tint(eyeShapeTint).png().toBuffer();
|
|
324
|
+
}
|
|
245
325
|
const metadata = await sharp__default.default(imageBuffer).metadata();
|
|
246
326
|
if (!compositeImage) {
|
|
247
327
|
compositeImage = sharp__default.default({
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/generate_spritesheets.ts","../src/index.ts"],"names":["fs","path","sharp","fileURLToPath"],"mappings":"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","file":"index.cjs","sourcesContent":["import fs from \"fs\";\nimport path from \"path\";\nimport sharp from \"sharp\";\nimport {\n Config,\n ConditionSet,\n Gotchi,\n GotchiAttribute,\n GenerationResult,\n} from \"./types.js\";\n\nfunction loadConfig(configPath: string): Config {\n const data = fs.readFileSync(configPath, \"utf8\");\n return JSON.parse(data) as Config;\n}\n\nfunction loadGotchis(jsonPath: string): Gotchi[] {\n const data = fs.readFileSync(jsonPath, \"utf8\");\n return JSON.parse(data) as Gotchi[];\n}\n\nfunction normalizeAttributes(\n originalAttributes: GotchiAttribute[]\n): GotchiAttribute[] {\n const normalized: GotchiAttribute[] = [];\n let hasPet = originalAttributes.some(\n (attr) => attr.trait_type === \"Wearable (Pet)\" && attr.value.trim() !== \"\"\n );\n\n for (const attr of originalAttributes) {\n if (attr.trait_type === \"Wearable (Body)\" && attr.value === \"Foxy Tail\") {\n if (hasPet) {\n // Skip mis-slotted Foxy Tail if a proper pet is already present\n continue;\n }\n normalized.push({ trait_type: \"Wearable (Pet)\", value: attr.value });\n hasPet = true;\n continue;\n }\n normalized.push(attr);\n }\n\n return normalized;\n}\n\nfunction matchCondition(\n gotchiAttributes: GotchiAttribute[],\n conditionSet: ConditionSet\n): boolean {\n const maticMapping: Record<string, string> = {\n amUSDT: \"aUSDT\",\n amAAVE: \"aAAVE\",\n amDAI: \"aDAI\",\n amUSDC: \"aUSDC\",\n };\n\n for (const condition of conditionSet.keys_and_values || []) {\n const keys = condition.keys || [];\n const values = condition.values || [];\n\n for (const key of keys) {\n if (values.length > 0) {\n const attrValues = gotchiAttributes\n .filter((attr) => attr.trait_type === key)\n .map((attr) => maticMapping[attr.value] || attr.value);\n\n if (!attrValues.some((val) => values.includes(val))) return false;\n } else {\n const hasKey = gotchiAttributes.some((attr) => attr.trait_type === key);\n if (!hasKey) return false;\n }\n }\n }\n return true;\n}\n\nfunction findMatchingConfig(\n gotchiAttributes: GotchiAttribute[],\n config: Config\n): ConditionSet | null {\n for (const conditionSet of config.if_keys_and_values || []) {\n if (matchCondition(gotchiAttributes, conditionSet)) return conditionSet;\n }\n return null;\n}\n\nfunction getImagePath(\n basePath: string,\n folder: string,\n traitValue: string\n): string | null {\n const maticMapping: Record<string, string> = {\n amUSDT: \"aUSDT\",\n amAAVE: \"aAAVE\",\n amDAI: \"aDAI\",\n amUSDC: \"aUSDC\",\n };\n\n const mappedValue = maticMapping[traitValue] || traitValue;\n const traitsBase = path.join(basePath, \"Trait Files\", \"Sprites\");\n const searchPath = path.join(traitsBase, ...folder.split(\"/\"));\n\n const possibleExtensions = [\".png\", \".PNG\", \".jpg\", \".JPG\", \".jpeg\", \".JPEG\"];\n\n for (const ext of possibleExtensions) {\n const imagePath = path.join(searchPath, `${mappedValue}${ext}`);\n if (fs.existsSync(imagePath)) return imagePath;\n }\n\n if (fs.existsSync(searchPath) && fs.statSync(searchPath).isDirectory()) {\n const files = fs.readdirSync(searchPath);\n for (const file of files) {\n const fileName = path.parse(file).name;\n if (fileName.toLowerCase() === mappedValue.toLowerCase()) {\n return path.join(searchPath, file);\n }\n }\n }\n\n return null;\n}\n\nfunction mapHandToProjectile(value: string): string {\n // Alias table for any hand->projectile name differences. Defaults to identity.\n const aliases: Record<string, string> = {\n // \"Common Wizard Staff\": \"Common Wizard Staff\",\n // Add overrides here if wearable name differs from projectile filename\n };\n return aliases[value] ?? value;\n}\n\nconst TOTAL_ROWS = 6;\n\nfunction getProjectileOffsets(name: string): { x: number; y: number } {\n // Base offsets to align projectile with hand; positive x => right, positive y => down\n const base = { x: 24, y: 30 };\n const overrides: Record<string, { x: number; y: number }> = {\n // Example: \"Witchy Wand\": { x: 14, y: 20 },\n };\n return overrides[name] ?? base;\n}\n\nasync function generateSpritesheet(\n gotchi: Gotchi,\n config: Config,\n basePath: string,\n outputFolder: string,\n verbose = false\n): Promise<GenerationResult> {\n const attributes = normalizeAttributes(gotchi.attributes);\n const matchingConfig = findMatchingConfig(attributes, config);\n\n if (!matchingConfig) {\n return {\n success: false,\n error: \"No matching configuration found\",\n details: {\n // Add a helpful detail for debugging\n layersUsed: attributes.map((a) => `${a.trait_type}: ${a.value}`),\n },\n };\n }\n\n const layerOrder = [\n \"Base Body\",\n \"Eye Shape\",\n \"Eye Color\",\n \"Wearable (Body)\",\n \"Wearable (Face)\",\n \"Wearable (Eyes)\",\n \"Wearable (Head)\",\n \"Wearable (Hands) L\",\n \"Wearable (Hands) R\",\n \"Wearable (Pet)\",\n \"Projectile\",\n ];\n\n const propertyMap: Record<string, { key: string; folder: string }> = {};\n for (const prop of matchingConfig.properties || []) {\n propertyMap[prop.key] = prop;\n }\n\n let compositeImage: sharp.Sharp | null = null;\n const layersUsed: string[] = [];\n const layerBuffers: sharp.OverlayOptions[] = [];\n const missingImages: string[] = [];\n const loadErrors: string[] = [];\n const projectilePaths: string[] = [];\n\n const handWearables = attributes.filter(\n (attr) => attr.trait_type === \"Wearable (Hands)\"\n );\n\n // Decide which hand(s) should render when only a single hand item is present.\n // If both hands are present, map first to L and second to R. If only one is present,\n // prefer the side that actually has an asset; if both sides exist, default to R.\n let selectedLeft: GotchiAttribute | null = null;\n let selectedRight: GotchiAttribute | null = null;\n const handsPropForSelection = propertyMap[\"Wearable (Hands)\"];\n if (handsPropForSelection) {\n const baseFolderParts = handsPropForSelection.folder.split(\"/\");\n const folderBase = baseFolderParts\n .slice(0, baseFolderParts.length - 1)\n .join(\"/\");\n const folderLForSelection = `${folderBase}/Wearable (Hands) L`;\n const folderRForSelection = `${folderBase}/Wearable (Hands) R`;\n\n if (handWearables.length >= 2) {\n selectedLeft = handWearables[0];\n selectedRight = handWearables[1];\n } else if (handWearables.length === 1) {\n const single = handWearables[0];\n const imageR = getImagePath(basePath, folderRForSelection, single.value);\n const imageL = getImagePath(basePath, folderLForSelection, single.value);\n if (imageR && !imageL) selectedRight = single;\n else if (!imageR && imageL) selectedLeft = single;\n else selectedRight = single; // both/neither found: default to right hand\n }\n }\n\n for (const traitKey of layerOrder) {\n let prop = propertyMap[traitKey];\n let matchingAttributes: (GotchiAttribute | undefined)[] = [];\n let folder: string | null = null;\n\n if (traitKey === \"Wearable (Hands) L\") {\n prop = propertyMap[\"Wearable (Hands)\"];\n if (prop && selectedLeft) {\n matchingAttributes = [selectedLeft];\n const baseFolderParts = prop.folder.split(\"/\");\n baseFolderParts[baseFolderParts.length - 1] = \"Wearable (Hands) L\";\n folder = baseFolderParts.join(\"/\");\n if (verbose)\n console.log(\n ` Processing left hand: ${selectedLeft.value} from ${folder}`\n );\n }\n } else if (traitKey === \"Wearable (Hands) R\") {\n prop = propertyMap[\"Wearable (Hands)\"];\n if (prop && selectedRight) {\n matchingAttributes = [selectedRight];\n const baseFolderParts = prop.folder.split(\"/\");\n baseFolderParts[baseFolderParts.length - 1] = \"Wearable (Hands) R\";\n folder = baseFolderParts.join(\"/\");\n if (verbose)\n console.log(\n ` Processing right hand: ${selectedRight.value} from ${folder}`\n );\n }\n } else if (traitKey === \"Projectile\") {\n // Special-case: composite projectile overlays based on selected hand item(s)\n const projectileFolder = \"projectiles\"; // under Trait Files/Sprites\n const handCandidates: string[] = [];\n if (selectedRight) handCandidates.push(selectedRight.value);\n if (selectedLeft) handCandidates.push(selectedLeft.value);\n\n // Try right first, then left; composite both if available\n for (const handName of handCandidates) {\n const projectileName = mapHandToProjectile(handName);\n const imagePath = getImagePath(\n basePath,\n projectileFolder,\n projectileName\n );\n if (imagePath) {\n try {\n // Do not composite; record path for viewer overlay\n projectilePaths.push(imagePath);\n layersUsed.push(`ProjectileRef: ${projectileName}`);\n if (verbose)\n console.log(\n ` Found projectile ref: ${projectileName} at ${imagePath}`\n );\n } catch (error) {\n const message =\n error instanceof Error ? error.message : String(error);\n loadErrors.push(`Projectile/${projectileName}: ${message}`);\n if (verbose)\n console.log(\n ` Error loading: Projectile/${projectileName}: ${message}`\n );\n }\n } else {\n missingImages.push(\n `Projectile/${projectileName} in ${projectileFolder}`\n );\n if (verbose)\n console.log(\n ` Missing image: Projectile/${projectileName} in ${projectileFolder}`\n );\n }\n }\n continue;\n } else {\n if (prop) {\n matchingAttributes = attributes.filter(\n (attr) => attr.trait_type === traitKey\n );\n folder = prop.folder;\n }\n }\n\n if (!prop || matchingAttributes.length === 0 || !folder) continue;\n\n for (const attr of matchingAttributes) {\n if (!attr) continue;\n const traitValue = attr.value;\n const imagePath = getImagePath(basePath, folder, traitValue);\n\n if (imagePath) {\n try {\n const imageBuffer = await sharp(imagePath).png().toBuffer();\n const metadata = await sharp(imageBuffer).metadata();\n\n if (!compositeImage) {\n compositeImage = sharp({\n create: {\n width: metadata.width as number,\n height: metadata.height as number,\n channels: 4,\n background: { r: 0, g: 0, b: 0, alpha: 0 },\n },\n });\n }\n\n layerBuffers.push({ input: imageBuffer });\n const layerLabel =\n traitKey.includes(\"Hands\") && traitKey !== \"Wearable (Hands)\"\n ? `${traitKey}: ${traitValue}`\n : `${attr.trait_type}: ${traitValue}`;\n layersUsed.push(layerLabel);\n if (verbose)\n console.log(` Found and added: ${layerLabel} from ${imagePath}`);\n } catch (error) {\n const message =\n error instanceof Error ? error.message : String(error);\n loadErrors.push(`${traitKey}/${traitValue}: ${message}`);\n if (verbose)\n console.log(\n ` Error loading: ${traitKey}/${traitValue}: ${message}`\n );\n }\n } else if (traitValue) {\n missingImages.push(`${traitKey}/${traitValue} in ${folder}`);\n if (verbose)\n console.log(\n ` Missing image: ${traitKey}/${traitValue} in ${folder}`\n );\n }\n }\n }\n\n if (compositeImage && layerBuffers.length > 0) {\n try {\n const outputPath = path.join(outputFolder, `${gotchi.id}.png`);\n await compositeImage.composite(layerBuffers).png().toFile(outputPath);\n return {\n success: true,\n details: {\n layersUsed,\n missingImages,\n loadErrors,\n projectiles: projectilePaths,\n },\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n success: false,\n error: `Failed to save spritesheet: ${message}`,\n details: {\n layersUsed,\n missingImages,\n loadErrors,\n projectiles: projectilePaths,\n },\n };\n }\n } else {\n return {\n success: false,\n error: \"No layers found to composite\",\n details: {\n layersUsed,\n missingImages,\n loadErrors,\n projectiles: projectilePaths,\n },\n };\n }\n}\n\nasync function main(): Promise<void> {\n const args = process.argv.slice(2);\n\n if (args.length < 1) {\n console.log(\n \"Usage: node generate_spritesheets.js <input_json_file> [options]\"\n );\n console.log(\n 'Example: node generate_spritesheets.js \"processedAavegotchis.json\"'\n );\n console.log(\"Options:\");\n console.log(\" --limit <n> Process only first n gotchis\");\n console.log(\n \" --ids <id1,id2> Process only specific IDs (comma-separated)\"\n );\n console.log(\" --start <n> Start processing from gotchi at index n\");\n console.log(\n \" --batch <n> Number of gotchis to process in parallel (default: 10)\"\n );\n console.log(\" --verbose Show detailed layer information\");\n console.log(\"\");\n console.log(\"Example with all gotchis in batches of 20:\");\n console.log(\n ' node generate_spritesheets.js \"processedAavegotchis.json\" --batch 20'\n );\n process.exit(1);\n }\n\n const inputJson = args[0];\n const configFile = \"config.json\";\n const outputFolder = \"website/spritesheets\";\n const basePath = \".\";\n\n let limit: number | null = null;\n let specificIds: number[] | null = null;\n let startIndex = 0;\n let verbose = false;\n\n for (let i = 1; i < args.length; i++) {\n if (args[i] === \"--limit\" && args[i + 1]) {\n limit = parseInt(args[i + 1]);\n i++;\n } else if (args[i] === \"--ids\" && args[i + 1]) {\n specificIds = args[i + 1]\n .split(\",\")\n .map((id) => parseInt(id))\n .filter((n) => !Number.isNaN(n));\n i++;\n } else if (args[i] === \"--start\" && args[i + 1]) {\n startIndex = parseInt(args[i + 1]);\n i++;\n } else if (args[i] === \"--verbose\") {\n verbose = true;\n }\n }\n\n if (!fs.existsSync(inputJson)) {\n console.log(`Error: Input file '${inputJson}' not found`);\n process.exit(1);\n }\n\n if (!fs.existsSync(configFile)) {\n console.log(`Error: Config file '${configFile}' not found`);\n process.exit(1);\n }\n\n if (!fs.existsSync(outputFolder)) {\n fs.mkdirSync(outputFolder, { recursive: true });\n }\n\n console.log(`Loading configuration from ${configFile}...`);\n const config = loadConfig(configFile);\n\n console.log(`Loading gotchis from ${inputJson}...`);\n let gotchis = loadGotchis(inputJson);\n\n if (specificIds) {\n gotchis = gotchis.filter((g) => specificIds!.includes(g.id));\n console.log(`Filtering to ${gotchis.length} specific gotchis`);\n }\n\n if (startIndex > 0) {\n gotchis = gotchis.slice(startIndex);\n console.log(`Starting from index ${startIndex}`);\n }\n\n if (limit) {\n gotchis = gotchis.slice(0, limit);\n console.log(`Limiting to ${gotchis.length} gotchis`);\n }\n\n const batchSize = args.includes(\"--batch\")\n ? parseInt(args[args.indexOf(\"--batch\") + 1]) || 10\n : 10;\n\n console.log(\n `Processing ${gotchis.length} gotchis in batches of ${batchSize}...`\n );\n console.log(\"-\".repeat(50));\n\n let successCount = 0;\n let failCount = 0;\n const failedGotchis: Array<{\n id: number;\n attributes: GotchiAttribute[];\n error: string;\n details?: unknown;\n }> = [];\n const allMissingLayers: Array<{\n gotchiId: number;\n missingLayer: string;\n attributes: GotchiAttribute[];\n }> = [];\n\n const idToProjectiles: Record<number, string[]> = {};\n const uniqueProjectileFiles = new Set<string>();\n\n for (let i = 0; i < gotchis.length; i += batchSize) {\n const batch = gotchis.slice(i, Math.min(i + batchSize, gotchis.length));\n const batchNum = Math.floor(i / batchSize) + 1;\n const totalBatches = Math.ceil(gotchis.length / batchSize);\n\n console.log(\n `\\nProcessing batch ${batchNum}/${totalBatches} (${batch.length} gotchis)...`\n );\n\n const batchResults = await Promise.all(\n batch.map(async (gotchi, index) => {\n try {\n const result = await generateSpritesheet(\n gotchi,\n config,\n basePath,\n outputFolder,\n verbose\n );\n\n if (\n result.details?.missingImages &&\n result.details.missingImages.length > 0\n ) {\n result.details.missingImages.forEach((missing) => {\n allMissingLayers.push({\n gotchiId: gotchi.id,\n missingLayer: missing,\n attributes: gotchi.attributes,\n });\n });\n }\n\n if (!result.success) {\n console.log(` ✗ Failed gotchi ${gotchi.id}: ${result.error}`);\n return {\n success: false as const,\n gotchi,\n error: result.error ?? \"Unknown error\",\n details: result.details,\n };\n }\n\n if (verbose && result.details) {\n console.log(\n ` ✓ Completed gotchi ${\n gotchi.id\n } - Layers: ${result.details.layersUsed?.join(\", \")}`\n );\n } else {\n console.log(\n ` ✓ Completed gotchi ${gotchi.id} (${i + index + 1}/${\n gotchis.length\n })`\n );\n }\n return { success: true as const, gotchi, details: result.details };\n } catch (error) {\n const message =\n error instanceof Error ? error.message : String(error);\n console.log(` ✗ Error processing gotchi ${gotchi.id}: ${message}`);\n return {\n success: false as const,\n gotchi,\n error: `Unexpected error: ${message}`,\n };\n }\n })\n );\n\n batchResults.forEach((result) => {\n if (result.success) {\n successCount++;\n const proj =\n result.details && Array.isArray(result.details.projectiles)\n ? result.details.projectiles\n : [];\n if (proj && proj.length > 0) {\n const rels = proj.map((abs: string) => {\n const base = path.parse(abs).base;\n uniqueProjectileFiles.add(base);\n return `projectiles/${base}`;\n });\n idToProjectiles[result.gotchi.id] = rels;\n }\n } else {\n failCount++;\n failedGotchis.push({\n id: result.gotchi.id,\n attributes: result.gotchi.attributes,\n error: result.error,\n details: result.details || {},\n });\n }\n });\n\n console.log(\n `Batch ${batchNum} complete: ${\n batchResults.filter((r) => r.success).length\n } succeeded, ${batchResults.filter((r) => !r.success).length} failed`\n );\n }\n\n console.log(\"\\n\" + \"=\".repeat(50));\n console.log(\"Processing complete!\");\n console.log(`Successfully generated: ${successCount} spritesheets`);\n console.log(`Failed: ${failCount}`);\n console.log(`Output saved to: ${outputFolder}/`);\n\n if (failedGotchis.length > 0) {\n const failedLogPath = \"failed_gotchis.json\";\n fs.writeFileSync(failedLogPath, JSON.stringify(failedGotchis, null, 2));\n console.log(`\\nFailed gotchis logged to: ${failedLogPath}`);\n console.log(\"Failed IDs:\", failedGotchis.map((g) => g.id).join(\", \"));\n }\n\n if (allMissingLayers.length > 0) {\n const missingByItem: Record<\n string,\n { layer: string; count: number; gotchiIds: number[] }\n > = {};\n allMissingLayers.forEach((item) => {\n if (!missingByItem[item.missingLayer]) {\n missingByItem[item.missingLayer] = {\n layer: item.missingLayer,\n count: 0,\n gotchiIds: [],\n };\n }\n missingByItem[item.missingLayer].count++;\n missingByItem[item.missingLayer].gotchiIds.push(item.gotchiId);\n });\n\n const missingLayersSummary = Object.values(missingByItem).sort(\n (a, b) => b.count - a.count\n );\n\n const missingLayersLog = {\n totalMissing: allMissingLayers.length,\n uniqueMissingLayers: missingLayersSummary.length,\n summary: missingLayersSummary,\n detailed: allMissingLayers,\n };\n\n const missingLogPath = \"missing_layers.json\";\n fs.writeFileSync(missingLogPath, JSON.stringify(missingLayersLog, null, 2));\n console.log(`\\nMissing layers logged to: ${missingLogPath}`);\n console.log(`Total missing layer instances: ${allMissingLayers.length}`);\n console.log(`Unique missing layers: ${missingLayersSummary.length}`);\n\n console.log(\"\\nTop missing layers:\");\n missingLayersSummary.slice(0, 5).forEach((item) => {\n console.log(` - ${item.layer} (${item.count} gotchis)`);\n });\n }\n\n try {\n // Ensure unique projectile assets are available under website/projectiles\n const websiteRoot = path.dirname(outputFolder); // website/\n const projectilesOutDir = path.join(websiteRoot, \"projectiles\");\n if (!fs.existsSync(projectilesOutDir))\n fs.mkdirSync(projectilesOutDir, { recursive: true });\n uniqueProjectileFiles.forEach((fileName) => {\n // Source under Trait Files/Sprites/projectiles\n const srcPath = path.join(\n \"Trait Files\",\n \"Sprites\",\n \"projectiles\",\n fileName\n );\n if (fs.existsSync(srcPath)) {\n const destPath = path.join(projectilesOutDir, fileName);\n try {\n fs.copyFileSync(srcPath, destPath);\n } catch {}\n }\n });\n\n const outputFiles = fs.readdirSync(outputFolder);\n const spriteList = outputFiles\n .filter((fileName) => fileName.toLowerCase().endsWith(\".png\"))\n .map((fileName) => path.parse(fileName).name)\n .filter((baseName) => /^\\d+$/.test(baseName))\n .map((baseName) => {\n const id = parseInt(baseName, 10);\n return {\n id,\n path: `spritesheets/${baseName}.png`,\n projectiles: idToProjectiles[id] || [],\n };\n })\n .sort((a, b) => a.id - b.id);\n\n const listPath = path.join(outputFolder, \"list.json\");\n fs.writeFileSync(listPath, JSON.stringify(spriteList, null, 2));\n console.log(`\\nSprite list written to: ${listPath}`);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n console.log(`\\nWarning: Failed to write sprite list: ${message}`);\n }\n}\n\n// Execute only when run directly via tsx/node\nif (import.meta.url === `file://${process.argv[1]}`) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n main().catch((error) => {\n console.error(\"Error:\", error);\n process.exit(1);\n });\n}\n\nexport { generateSpritesheet };\n","import path from \"path\";\nimport { fileURLToPath } from \"url\";\nexport { generateSpritesheet } from \"./generate_spritesheets.js\";\nexport type {\n Gotchi,\n GotchiAttribute,\n Config,\n ConfigProperty,\n ConditionKV,\n ConditionSet,\n GenerationResult,\n GenerationDetails,\n} from \"./types.js\";\nexport function getPackageBasePath(): string {\n const distDirectoryPath = path.dirname(fileURLToPath(import.meta.url));\n return path.resolve(distDirectoryPath, \"..\");\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/generate_spritesheets.ts","../src/index.ts"],"names":["fs","path","sharp","fileURLToPath"],"mappings":"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","file":"index.cjs","sourcesContent":["import fs from \"fs\";\nimport path from \"path\";\nimport sharp from \"sharp\";\nimport {\n Config,\n ConditionSet,\n Gotchi,\n GotchiAttribute,\n GenerationResult,\n} from \"./types.js\";\n\nfunction loadConfig(configPath: string): Config {\n const data = fs.readFileSync(configPath, \"utf8\");\n return JSON.parse(data) as Config;\n}\n\nfunction loadGotchis(jsonPath: string): Gotchi[] {\n const data = fs.readFileSync(jsonPath, \"utf8\");\n return JSON.parse(data) as Gotchi[];\n}\n\nfunction normalizeAttributes(\n originalAttributes: GotchiAttribute[]\n): GotchiAttribute[] {\n const normalized: GotchiAttribute[] = [];\n let hasPet = originalAttributes.some(\n (attr) => attr.trait_type === \"Wearable (Pet)\" && attr.value.trim() !== \"\"\n );\n\n for (const attr of originalAttributes) {\n if (attr.trait_type === \"Wearable (Body)\" && attr.value === \"Foxy Tail\") {\n if (hasPet) {\n // Skip mis-slotted Foxy Tail if a proper pet is already present\n continue;\n }\n normalized.push({ trait_type: \"Wearable (Pet)\", value: attr.value });\n hasPet = true;\n continue;\n }\n normalized.push(attr);\n }\n\n return normalized;\n}\n\nfunction matchCondition(\n gotchiAttributes: GotchiAttribute[],\n conditionSet: ConditionSet\n): boolean {\n const maticMapping: Record<string, string> = {\n amUSDT: \"aUSDT\",\n amAAVE: \"aAAVE\",\n amDAI: \"aDAI\",\n amUSDC: \"aUSDC\",\n };\n\n for (const condition of conditionSet.keys_and_values || []) {\n const keys = condition.keys || [];\n const values = condition.values || [];\n\n for (const key of keys) {\n if (values.length > 0) {\n const attrValues = gotchiAttributes\n .filter((attr) => attr.trait_type === key)\n .map((attr) => maticMapping[attr.value] || attr.value);\n\n if (!attrValues.some((val) => values.includes(val))) return false;\n } else {\n const hasKey = gotchiAttributes.some((attr) => attr.trait_type === key);\n if (!hasKey) return false;\n }\n }\n }\n return true;\n}\n\nfunction findMatchingConfig(\n gotchiAttributes: GotchiAttribute[],\n config: Config\n): ConditionSet | null {\n for (const conditionSet of config.if_keys_and_values || []) {\n if (matchCondition(gotchiAttributes, conditionSet)) return conditionSet;\n }\n return null;\n}\n\nfunction getImagePath(\n basePath: string,\n folder: string,\n traitValue: string\n): string | null {\n const maticMapping: Record<string, string> = {\n amUSDT: \"aUSDT\",\n amAAVE: \"aAAVE\",\n amDAI: \"aDAI\",\n amUSDC: \"aUSDC\",\n };\n\n const mappedValue = maticMapping[traitValue] || traitValue;\n const traitsBase = path.join(basePath, \"Trait Files\", \"Sprites\");\n const searchPath = path.join(traitsBase, ...folder.split(\"/\"));\n\n const possibleExtensions = [\".png\", \".PNG\", \".jpg\", \".JPG\", \".jpeg\", \".JPEG\"];\n\n for (const ext of possibleExtensions) {\n const imagePath = path.join(searchPath, `${mappedValue}${ext}`);\n if (fs.existsSync(imagePath)) return imagePath;\n }\n\n if (fs.existsSync(searchPath) && fs.statSync(searchPath).isDirectory()) {\n const files = fs.readdirSync(searchPath);\n for (const file of files) {\n const fileName = path.parse(file).name;\n if (fileName.toLowerCase() === mappedValue.toLowerCase()) {\n return path.join(searchPath, file);\n }\n }\n }\n\n return null;\n}\n\nfunction mapHandToProjectile(value: string): string {\n // Alias table for any hand->projectile name differences. Defaults to identity.\n const aliases: Record<string, string> = {\n // \"Common Wizard Staff\": \"Common Wizard Staff\",\n // Add overrides here if wearable name differs from projectile filename\n };\n return aliases[value] ?? value;\n}\n\nfunction getCollateralTint(\n baseBody: string\n): { r: number; g: number; b: number } | null {\n // Minimal mapping: only apply where generic rarity art is visibly wrong (e.g., aAAVE turns blue)\n const table: Record<string, { r: number; g: number; b: number }> = {\n aAAVE: { r: 220, g: 120, b: 255 },\n };\n return table[baseBody] ?? null;\n}\n\nconst TOTAL_ROWS = 6;\n\nfunction getProjectileOffsets(name: string): { x: number; y: number } {\n // Base offsets to align projectile with hand; positive x => right, positive y => down\n const base = { x: 24, y: 30 };\n const overrides: Record<string, { x: number; y: number }> = {\n // Example: \"Witchy Wand\": { x: 14, y: 20 },\n };\n return overrides[name] ?? base;\n}\n\nasync function generateSpritesheet(\n gotchi: Gotchi,\n config: Config,\n basePath: string,\n outputFolder: string,\n verbose = false\n): Promise<GenerationResult> {\n const attributes = normalizeAttributes(gotchi.attributes);\n const matchingConfig = findMatchingConfig(attributes, config);\n\n if (!matchingConfig) {\n return {\n success: false,\n error: \"No matching configuration found\",\n details: {\n // Add a helpful detail for debugging\n layersUsed: attributes.map((a) => `${a.trait_type}: ${a.value}`),\n },\n };\n }\n\n const layerOrder = [\n \"Base Body\",\n \"Eye Shape\",\n \"Eye Color\",\n \"Wearable (Body)\",\n \"Wearable (Face)\",\n \"Wearable (Eyes)\",\n \"Wearable (Head)\",\n \"Wearable (Hands) L\",\n \"Wearable (Hands) R\",\n \"Wearable (Pet)\",\n \"Projectile\",\n ];\n\n const propertyMap: Record<string, { key: string; folder: string }> = {};\n for (const prop of matchingConfig.properties || []) {\n propertyMap[prop.key] = prop;\n }\n\n // Ensure Eye Color overlay is available even when not specified by the config.\n // Many legacy configs encoded color inside Eye Shape under common/<base>, but we now\n // resolve Eye Shape by rarity folders. To preserve correct coloring, provide a\n // default Eye Color folder that contains per-base color overlays keyed by rarity.\n if (!propertyMap[\"Eye Color\"]) {\n const eyeShapeAttr = attributes.find((a) => a.trait_type === \"Eye Shape\");\n const eyeShapeValue = eyeShapeAttr?.value ?? \"\";\n // Only auto-add Eye Color for 'common*' eye shapes. Non-common eye shapes already\n // encode color in their sprites and adding Eye Color would double-tint them.\n const shouldAddEyeColor = /^common/.test(eyeShapeValue);\n if (shouldAddEyeColor) {\n const maticMappingLocal: Record<string, string> = {\n amUSDT: \"aUSDT\",\n amAAVE: \"aAAVE\",\n amDAI: \"aDAI\",\n amUSDC: \"aUSDC\",\n };\n const baseBodyAttr = attributes.find((a) => a.trait_type === \"Base Body\");\n const baseBody = baseBodyAttr\n ? maticMappingLocal[baseBodyAttr.value] || baseBodyAttr.value\n : undefined;\n // Derive cycle from Base Body folder when available, otherwise fall back to Eye Shape\n const baseFolderForCycle =\n propertyMap[\"Base Body\"]?.folder || propertyMap[\"Eye Shape\"]?.folder;\n const cycle = baseFolderForCycle\n ? baseFolderForCycle.split(\"/\")[0]\n : \"punchbody\";\n if (baseBody) {\n propertyMap[\"Eye Color\"] = {\n key: \"Eye Color\",\n folder: `${cycle}/mythic_high_${baseBody}`,\n } as { key: string; folder: string };\n }\n }\n }\n\n let compositeImage: sharp.Sharp | null = null;\n const layersUsed: string[] = [];\n const layerBuffers: sharp.OverlayOptions[] = [];\n const missingImages: string[] = [];\n const loadErrors: string[] = [];\n const projectilePaths: string[] = [];\n\n const handWearables = attributes.filter(\n (attr) => attr.trait_type === \"Wearable (Hands)\"\n );\n\n // Decide which hand(s) should render when only a single hand item is present.\n // If both hands are present, map first to L and second to R. If only one is present,\n // prefer the side that actually has an asset; if both sides exist, default to R.\n let selectedLeft: GotchiAttribute | null = null;\n let selectedRight: GotchiAttribute | null = null;\n const handsPropForSelection = propertyMap[\"Wearable (Hands)\"];\n if (handsPropForSelection) {\n const baseFolderParts = handsPropForSelection.folder.split(\"/\");\n const folderBase = baseFolderParts\n .slice(0, baseFolderParts.length - 1)\n .join(\"/\");\n const folderLForSelection = `${folderBase}/Wearable (Hands) L`;\n const folderRForSelection = `${folderBase}/Wearable (Hands) R`;\n\n if (handWearables.length >= 2) {\n selectedLeft = handWearables[0];\n selectedRight = handWearables[1];\n } else if (handWearables.length === 1) {\n const single = handWearables[0];\n const imageR = getImagePath(basePath, folderRForSelection, single.value);\n const imageL = getImagePath(basePath, folderLForSelection, single.value);\n if (imageR && !imageL) selectedRight = single;\n else if (!imageR && imageL) selectedLeft = single;\n else selectedRight = single; // both/neither found: default to right hand\n }\n }\n\n for (const traitKey of layerOrder) {\n let prop = propertyMap[traitKey];\n let matchingAttributes: (GotchiAttribute | undefined)[] = [];\n let folder: string | null = null;\n let eyeShapeTint: { r: number; g: number; b: number } | null = null;\n\n if (traitKey === \"Wearable (Hands) L\") {\n prop = propertyMap[\"Wearable (Hands)\"];\n if (prop && selectedLeft) {\n matchingAttributes = [selectedLeft];\n const baseFolderParts = prop.folder.split(\"/\");\n baseFolderParts[baseFolderParts.length - 1] = \"Wearable (Hands) L\";\n folder = baseFolderParts.join(\"/\");\n if (verbose)\n console.log(\n ` Processing left hand: ${selectedLeft.value} from ${folder}`\n );\n }\n } else if (traitKey === \"Wearable (Hands) R\") {\n prop = propertyMap[\"Wearable (Hands)\"];\n if (prop && selectedRight) {\n matchingAttributes = [selectedRight];\n const baseFolderParts = prop.folder.split(\"/\");\n baseFolderParts[baseFolderParts.length - 1] = \"Wearable (Hands) R\";\n folder = baseFolderParts.join(\"/\");\n if (verbose)\n console.log(\n ` Processing right hand: ${selectedRight.value} from ${folder}`\n );\n }\n } else if (traitKey === \"Projectile\") {\n // Special-case: composite projectile overlays based on selected hand item(s)\n const projectileFolder = \"projectiles\"; // under Trait Files/Sprites\n const handCandidates: string[] = [];\n if (selectedRight) handCandidates.push(selectedRight.value);\n if (selectedLeft) handCandidates.push(selectedLeft.value);\n\n // Try right first, then left; composite both if available\n for (const handName of handCandidates) {\n const projectileName = mapHandToProjectile(handName);\n const imagePath = getImagePath(\n basePath,\n projectileFolder,\n projectileName\n );\n if (imagePath) {\n try {\n // Do not composite; record path for viewer overlay\n projectilePaths.push(imagePath);\n layersUsed.push(`ProjectileRef: ${projectileName}`);\n if (verbose)\n console.log(\n ` Found projectile ref: ${projectileName} at ${imagePath}`\n );\n } catch (error) {\n const message =\n error instanceof Error ? error.message : String(error);\n loadErrors.push(`Projectile/${projectileName}: ${message}`);\n if (verbose)\n console.log(\n ` Error loading: Projectile/${projectileName}: ${message}`\n );\n }\n } else {\n missingImages.push(\n `Projectile/${projectileName} in ${projectileFolder}`\n );\n if (verbose)\n console.log(\n ` Missing image: Projectile/${projectileName} in ${projectileFolder}`\n );\n }\n }\n continue;\n } else {\n if (prop) {\n matchingAttributes = attributes.filter(\n (attr) => attr.trait_type === traitKey\n );\n folder = prop.folder;\n\n // Special handling for Eye Shape: determine the correct folder based on the Eye Shape value\n if (\n traitKey === \"Eye Shape\" &&\n matchingAttributes.length > 0 &&\n matchingAttributes[0]\n ) {\n const eyeShapeValue = matchingAttributes[0].value;\n // Extract rarity from Eye Shape value (e.g., \"rare_high_3\" -> \"rare_high\")\n const rarityMatch = eyeShapeValue.match(\n /^(uncommon_low|uncommon_high|rare_low|rare_high|mythical_low|mythical_high|mythic_low|mythic_high|common)/\n );\n if (rarityMatch) {\n const rawRarity = rarityMatch[1];\n // Normalize mythic_* -> mythical_* to match directory names\n const normalizedRarity = rawRarity.startsWith(\"mythic_\")\n ? rawRarity.replace(/^mythic_/, \"mythical_\")\n : rawRarity;\n\n // Extract the cycle name from the prop folder (e.g., \"meleebody/common/amWETH\" -> \"meleebody\")\n const folderParts = prop.folder.split(\"/\");\n const cycle = folderParts[0];\n const baseFromProp = folderParts.includes(\"common\")\n ? folderParts[folderParts.length - 1]\n : null;\n\n // For 'common', assets live under cycle/common/<token>/common_?.png\n // Keep the configured folder (which includes the token) instead of dropping it.\n if (normalizedRarity === \"common\") {\n folder = prop.folder;\n } else {\n // Prefer collateral-specific art if it exists under common/<base>\n const maticMappingLocal: Record<string, string> = {\n amUSDT: \"aUSDT\",\n amAAVE: \"aAAVE\",\n amDAI: \"aDAI\",\n amUSDC: \"aUSDC\",\n };\n const baseBodyAttr = attributes.find(\n (a) => a.trait_type === \"Base Body\"\n );\n const baseBody = baseBodyAttr\n ? maticMappingLocal[baseBodyAttr.value] || baseBodyAttr.value\n : baseFromProp;\n\n let chosenFolder = `${cycle}/${normalizedRarity}`;\n if (baseBody) {\n const preferred = `${cycle}/common/${baseBody}`;\n const preferredPath = getImagePath(\n basePath,\n preferred,\n eyeShapeValue\n );\n if (preferredPath) {\n chosenFolder = preferred;\n } else {\n // No collateral-specific asset: use rarity folder and tint to base color if known\n const tint = getCollateralTint(baseBody);\n if (tint) eyeShapeTint = tint;\n }\n }\n folder = chosenFolder;\n }\n }\n }\n }\n }\n\n if (!prop || matchingAttributes.length === 0 || !folder) continue;\n\n for (const attr of matchingAttributes) {\n if (!attr) continue;\n const traitValue = attr.value;\n const imagePath = getImagePath(basePath, folder, traitValue);\n\n if (imagePath) {\n try {\n let imageBuffer = await sharp(imagePath).png().toBuffer();\n if (traitKey === \"Eye Shape\" && eyeShapeTint) {\n if (verbose)\n console.log(\n ` Tinting Eye Shape to base color rgb(${eyeShapeTint.r},${eyeShapeTint.g},${eyeShapeTint.b})`\n );\n imageBuffer = await sharp(imageBuffer)\n .tint(eyeShapeTint)\n .png()\n .toBuffer();\n }\n const metadata = await sharp(imageBuffer).metadata();\n\n if (!compositeImage) {\n compositeImage = sharp({\n create: {\n width: metadata.width as number,\n height: metadata.height as number,\n channels: 4,\n background: { r: 0, g: 0, b: 0, alpha: 0 },\n },\n });\n }\n\n layerBuffers.push({ input: imageBuffer });\n const layerLabel =\n traitKey.includes(\"Hands\") && traitKey !== \"Wearable (Hands)\"\n ? `${traitKey}: ${traitValue}`\n : `${attr.trait_type}: ${traitValue}`;\n layersUsed.push(layerLabel);\n if (verbose)\n console.log(` Found and added: ${layerLabel} from ${imagePath}`);\n } catch (error) {\n const message =\n error instanceof Error ? error.message : String(error);\n loadErrors.push(`${traitKey}/${traitValue}: ${message}`);\n if (verbose)\n console.log(\n ` Error loading: ${traitKey}/${traitValue}: ${message}`\n );\n }\n } else if (traitValue) {\n missingImages.push(`${traitKey}/${traitValue} in ${folder}`);\n if (verbose)\n console.log(\n ` Missing image: ${traitKey}/${traitValue} in ${folder}`\n );\n }\n }\n }\n\n if (compositeImage && layerBuffers.length > 0) {\n try {\n const outputPath = path.join(outputFolder, `${gotchi.id}.png`);\n await compositeImage.composite(layerBuffers).png().toFile(outputPath);\n return {\n success: true,\n details: {\n layersUsed,\n missingImages,\n loadErrors,\n projectiles: projectilePaths,\n },\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n success: false,\n error: `Failed to save spritesheet: ${message}`,\n details: {\n layersUsed,\n missingImages,\n loadErrors,\n projectiles: projectilePaths,\n },\n };\n }\n } else {\n return {\n success: false,\n error: \"No layers found to composite\",\n details: {\n layersUsed,\n missingImages,\n loadErrors,\n projectiles: projectilePaths,\n },\n };\n }\n}\n\nasync function main(): Promise<void> {\n const args = process.argv.slice(2);\n\n if (args.length < 1) {\n console.log(\n \"Usage: node generate_spritesheets.js <input_json_file> [options]\"\n );\n console.log(\n 'Example: node generate_spritesheets.js \"processedAavegotchis.json\"'\n );\n console.log(\"Options:\");\n console.log(\" --limit <n> Process only first n gotchis\");\n console.log(\n \" --ids <id1,id2> Process only specific IDs (comma-separated)\"\n );\n console.log(\" --start <n> Start processing from gotchi at index n\");\n console.log(\n \" --batch <n> Number of gotchis to process in parallel (default: 10)\"\n );\n console.log(\" --verbose Show detailed layer information\");\n console.log(\"\");\n console.log(\"Example with all gotchis in batches of 20:\");\n console.log(\n ' node generate_spritesheets.js \"processedAavegotchis.json\" --batch 20'\n );\n process.exit(1);\n }\n\n const inputJson = args[0];\n const configFile = \"config.json\";\n const outputFolder = \"website/spritesheets\";\n const basePath = \".\";\n\n let limit: number | null = null;\n let specificIds: number[] | null = null;\n let startIndex = 0;\n let verbose = false;\n\n for (let i = 1; i < args.length; i++) {\n if (args[i] === \"--limit\" && args[i + 1]) {\n limit = parseInt(args[i + 1]);\n i++;\n } else if (args[i] === \"--ids\" && args[i + 1]) {\n specificIds = args[i + 1]\n .split(\",\")\n .map((id) => parseInt(id))\n .filter((n) => !Number.isNaN(n));\n i++;\n } else if (args[i] === \"--start\" && args[i + 1]) {\n startIndex = parseInt(args[i + 1]);\n i++;\n } else if (args[i] === \"--verbose\") {\n verbose = true;\n }\n }\n\n if (!fs.existsSync(inputJson)) {\n console.log(`Error: Input file '${inputJson}' not found`);\n process.exit(1);\n }\n\n if (!fs.existsSync(configFile)) {\n console.log(`Error: Config file '${configFile}' not found`);\n process.exit(1);\n }\n\n if (!fs.existsSync(outputFolder)) {\n fs.mkdirSync(outputFolder, { recursive: true });\n }\n\n console.log(`Loading configuration from ${configFile}...`);\n const config = loadConfig(configFile);\n\n console.log(`Loading gotchis from ${inputJson}...`);\n let gotchis = loadGotchis(inputJson);\n\n if (specificIds) {\n gotchis = gotchis.filter((g) => specificIds!.includes(g.id));\n console.log(`Filtering to ${gotchis.length} specific gotchis`);\n }\n\n if (startIndex > 0) {\n gotchis = gotchis.slice(startIndex);\n console.log(`Starting from index ${startIndex}`);\n }\n\n if (limit) {\n gotchis = gotchis.slice(0, limit);\n console.log(`Limiting to ${gotchis.length} gotchis`);\n }\n\n const batchSize = args.includes(\"--batch\")\n ? parseInt(args[args.indexOf(\"--batch\") + 1]) || 10\n : 10;\n\n console.log(\n `Processing ${gotchis.length} gotchis in batches of ${batchSize}...`\n );\n console.log(\"-\".repeat(50));\n\n let successCount = 0;\n let failCount = 0;\n const failedGotchis: Array<{\n id: number;\n attributes: GotchiAttribute[];\n error: string;\n details?: unknown;\n }> = [];\n const allMissingLayers: Array<{\n gotchiId: number;\n missingLayer: string;\n attributes: GotchiAttribute[];\n }> = [];\n\n const idToProjectiles: Record<number, string[]> = {};\n const uniqueProjectileFiles = new Set<string>();\n\n for (let i = 0; i < gotchis.length; i += batchSize) {\n const batch = gotchis.slice(i, Math.min(i + batchSize, gotchis.length));\n const batchNum = Math.floor(i / batchSize) + 1;\n const totalBatches = Math.ceil(gotchis.length / batchSize);\n\n console.log(\n `\\nProcessing batch ${batchNum}/${totalBatches} (${batch.length} gotchis)...`\n );\n\n const batchResults = await Promise.all(\n batch.map(async (gotchi, index) => {\n try {\n const result = await generateSpritesheet(\n gotchi,\n config,\n basePath,\n outputFolder,\n verbose\n );\n\n if (\n result.details?.missingImages &&\n result.details.missingImages.length > 0\n ) {\n result.details.missingImages.forEach((missing) => {\n allMissingLayers.push({\n gotchiId: gotchi.id,\n missingLayer: missing,\n attributes: gotchi.attributes,\n });\n });\n }\n\n if (!result.success) {\n console.log(` ✗ Failed gotchi ${gotchi.id}: ${result.error}`);\n return {\n success: false as const,\n gotchi,\n error: result.error ?? \"Unknown error\",\n details: result.details,\n };\n }\n\n if (verbose && result.details) {\n console.log(\n ` ✓ Completed gotchi ${\n gotchi.id\n } - Layers: ${result.details.layersUsed?.join(\", \")}`\n );\n } else {\n console.log(\n ` ✓ Completed gotchi ${gotchi.id} (${i + index + 1}/${\n gotchis.length\n })`\n );\n }\n return { success: true as const, gotchi, details: result.details };\n } catch (error) {\n const message =\n error instanceof Error ? error.message : String(error);\n console.log(` ✗ Error processing gotchi ${gotchi.id}: ${message}`);\n return {\n success: false as const,\n gotchi,\n error: `Unexpected error: ${message}`,\n };\n }\n })\n );\n\n batchResults.forEach((result) => {\n if (result.success) {\n successCount++;\n const proj =\n result.details && Array.isArray(result.details.projectiles)\n ? result.details.projectiles\n : [];\n if (proj && proj.length > 0) {\n const rels = proj.map((abs: string) => {\n const base = path.parse(abs).base;\n uniqueProjectileFiles.add(base);\n return `projectiles/${base}`;\n });\n idToProjectiles[result.gotchi.id] = rels;\n }\n } else {\n failCount++;\n failedGotchis.push({\n id: result.gotchi.id,\n attributes: result.gotchi.attributes,\n error: result.error,\n details: result.details || {},\n });\n }\n });\n\n console.log(\n `Batch ${batchNum} complete: ${\n batchResults.filter((r) => r.success).length\n } succeeded, ${batchResults.filter((r) => !r.success).length} failed`\n );\n }\n\n console.log(\"\\n\" + \"=\".repeat(50));\n console.log(\"Processing complete!\");\n console.log(`Successfully generated: ${successCount} spritesheets`);\n console.log(`Failed: ${failCount}`);\n console.log(`Output saved to: ${outputFolder}/`);\n\n if (failedGotchis.length > 0) {\n const failedLogPath = \"failed_gotchis.json\";\n fs.writeFileSync(failedLogPath, JSON.stringify(failedGotchis, null, 2));\n console.log(`\\nFailed gotchis logged to: ${failedLogPath}`);\n console.log(\"Failed IDs:\", failedGotchis.map((g) => g.id).join(\", \"));\n }\n\n if (allMissingLayers.length > 0) {\n const missingByItem: Record<\n string,\n { layer: string; count: number; gotchiIds: number[] }\n > = {};\n allMissingLayers.forEach((item) => {\n if (!missingByItem[item.missingLayer]) {\n missingByItem[item.missingLayer] = {\n layer: item.missingLayer,\n count: 0,\n gotchiIds: [],\n };\n }\n missingByItem[item.missingLayer].count++;\n missingByItem[item.missingLayer].gotchiIds.push(item.gotchiId);\n });\n\n const missingLayersSummary = Object.values(missingByItem).sort(\n (a, b) => b.count - a.count\n );\n\n const missingLayersLog = {\n totalMissing: allMissingLayers.length,\n uniqueMissingLayers: missingLayersSummary.length,\n summary: missingLayersSummary,\n detailed: allMissingLayers,\n };\n\n const missingLogPath = \"missing_layers.json\";\n fs.writeFileSync(missingLogPath, JSON.stringify(missingLayersLog, null, 2));\n console.log(`\\nMissing layers logged to: ${missingLogPath}`);\n console.log(`Total missing layer instances: ${allMissingLayers.length}`);\n console.log(`Unique missing layers: ${missingLayersSummary.length}`);\n\n console.log(\"\\nTop missing layers:\");\n missingLayersSummary.slice(0, 5).forEach((item) => {\n console.log(` - ${item.layer} (${item.count} gotchis)`);\n });\n }\n\n try {\n // Ensure unique projectile assets are available under website/projectiles\n const websiteRoot = path.dirname(outputFolder); // website/\n const projectilesOutDir = path.join(websiteRoot, \"projectiles\");\n if (!fs.existsSync(projectilesOutDir))\n fs.mkdirSync(projectilesOutDir, { recursive: true });\n uniqueProjectileFiles.forEach((fileName) => {\n // Source under Trait Files/Sprites/projectiles\n const srcPath = path.join(\n \"Trait Files\",\n \"Sprites\",\n \"projectiles\",\n fileName\n );\n if (fs.existsSync(srcPath)) {\n const destPath = path.join(projectilesOutDir, fileName);\n try {\n fs.copyFileSync(srcPath, destPath);\n } catch {}\n }\n });\n\n const outputFiles = fs.readdirSync(outputFolder);\n const spriteList = outputFiles\n .filter((fileName) => fileName.toLowerCase().endsWith(\".png\"))\n .map((fileName) => path.parse(fileName).name)\n .filter((baseName) => /^\\d+$/.test(baseName))\n .map((baseName) => {\n const id = parseInt(baseName, 10);\n return {\n id,\n path: `spritesheets/${baseName}.png`,\n projectiles: idToProjectiles[id] || [],\n };\n })\n .sort((a, b) => a.id - b.id);\n\n const listPath = path.join(outputFolder, \"list.json\");\n fs.writeFileSync(listPath, JSON.stringify(spriteList, null, 2));\n console.log(`\\nSprite list written to: ${listPath}`);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n console.log(`\\nWarning: Failed to write sprite list: ${message}`);\n }\n}\n\n// Execute only when run directly via tsx/node\nif (import.meta.url === `file://${process.argv[1]}`) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n main().catch((error) => {\n console.error(\"Error:\", error);\n process.exit(1);\n });\n}\n\nexport { generateSpritesheet };\n","import path from \"path\";\nimport { fileURLToPath } from \"url\";\nexport { generateSpritesheet } from \"./generate_spritesheets.js\";\nexport type {\n Gotchi,\n GotchiAttribute,\n Config,\n ConfigProperty,\n ConditionKV,\n ConditionSet,\n GenerationResult,\n GenerationDetails,\n} from \"./types.js\";\nexport function getPackageBasePath(): string {\n const distDirectoryPath = path.dirname(fileURLToPath(import.meta.url));\n return path.resolve(distDirectoryPath, \"..\");\n}\n"]}
|
package/dist/index.js
CHANGED
|
@@ -91,6 +91,12 @@ function mapHandToProjectile(value) {
|
|
|
91
91
|
};
|
|
92
92
|
return aliases[value] ?? value;
|
|
93
93
|
}
|
|
94
|
+
function getCollateralTint(baseBody) {
|
|
95
|
+
const table = {
|
|
96
|
+
aAAVE: { r: 220, g: 120, b: 255 }
|
|
97
|
+
};
|
|
98
|
+
return table[baseBody] ?? null;
|
|
99
|
+
}
|
|
94
100
|
async function generateSpritesheet(gotchi, config, basePath, outputFolder, verbose = false) {
|
|
95
101
|
const attributes = normalizeAttributes(gotchi.attributes);
|
|
96
102
|
const matchingConfig = findMatchingConfig(attributes, config);
|
|
@@ -121,6 +127,29 @@ async function generateSpritesheet(gotchi, config, basePath, outputFolder, verbo
|
|
|
121
127
|
for (const prop of matchingConfig.properties || []) {
|
|
122
128
|
propertyMap[prop.key] = prop;
|
|
123
129
|
}
|
|
130
|
+
if (!propertyMap["Eye Color"]) {
|
|
131
|
+
const eyeShapeAttr = attributes.find((a) => a.trait_type === "Eye Shape");
|
|
132
|
+
const eyeShapeValue = eyeShapeAttr?.value ?? "";
|
|
133
|
+
const shouldAddEyeColor = /^common/.test(eyeShapeValue);
|
|
134
|
+
if (shouldAddEyeColor) {
|
|
135
|
+
const maticMappingLocal = {
|
|
136
|
+
amUSDT: "aUSDT",
|
|
137
|
+
amAAVE: "aAAVE",
|
|
138
|
+
amDAI: "aDAI",
|
|
139
|
+
amUSDC: "aUSDC"
|
|
140
|
+
};
|
|
141
|
+
const baseBodyAttr = attributes.find((a) => a.trait_type === "Base Body");
|
|
142
|
+
const baseBody = baseBodyAttr ? maticMappingLocal[baseBodyAttr.value] || baseBodyAttr.value : void 0;
|
|
143
|
+
const baseFolderForCycle = propertyMap["Base Body"]?.folder || propertyMap["Eye Shape"]?.folder;
|
|
144
|
+
const cycle = baseFolderForCycle ? baseFolderForCycle.split("/")[0] : "punchbody";
|
|
145
|
+
if (baseBody) {
|
|
146
|
+
propertyMap["Eye Color"] = {
|
|
147
|
+
key: "Eye Color",
|
|
148
|
+
folder: `${cycle}/mythic_high_${baseBody}`
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
124
153
|
let compositeImage = null;
|
|
125
154
|
const layersUsed = [];
|
|
126
155
|
const layerBuffers = [];
|
|
@@ -154,6 +183,7 @@ async function generateSpritesheet(gotchi, config, basePath, outputFolder, verbo
|
|
|
154
183
|
let prop = propertyMap[traitKey];
|
|
155
184
|
let matchingAttributes = [];
|
|
156
185
|
let folder = null;
|
|
186
|
+
let eyeShapeTint = null;
|
|
157
187
|
if (traitKey === "Wearable (Hands) L") {
|
|
158
188
|
prop = propertyMap["Wearable (Hands)"];
|
|
159
189
|
if (prop && selectedLeft) {
|
|
@@ -223,6 +253,49 @@ async function generateSpritesheet(gotchi, config, basePath, outputFolder, verbo
|
|
|
223
253
|
(attr) => attr.trait_type === traitKey
|
|
224
254
|
);
|
|
225
255
|
folder = prop.folder;
|
|
256
|
+
if (traitKey === "Eye Shape" && matchingAttributes.length > 0 && matchingAttributes[0]) {
|
|
257
|
+
const eyeShapeValue = matchingAttributes[0].value;
|
|
258
|
+
const rarityMatch = eyeShapeValue.match(
|
|
259
|
+
/^(uncommon_low|uncommon_high|rare_low|rare_high|mythical_low|mythical_high|mythic_low|mythic_high|common)/
|
|
260
|
+
);
|
|
261
|
+
if (rarityMatch) {
|
|
262
|
+
const rawRarity = rarityMatch[1];
|
|
263
|
+
const normalizedRarity = rawRarity.startsWith("mythic_") ? rawRarity.replace(/^mythic_/, "mythical_") : rawRarity;
|
|
264
|
+
const folderParts = prop.folder.split("/");
|
|
265
|
+
const cycle = folderParts[0];
|
|
266
|
+
const baseFromProp = folderParts.includes("common") ? folderParts[folderParts.length - 1] : null;
|
|
267
|
+
if (normalizedRarity === "common") {
|
|
268
|
+
folder = prop.folder;
|
|
269
|
+
} else {
|
|
270
|
+
const maticMappingLocal = {
|
|
271
|
+
amUSDT: "aUSDT",
|
|
272
|
+
amAAVE: "aAAVE",
|
|
273
|
+
amDAI: "aDAI",
|
|
274
|
+
amUSDC: "aUSDC"
|
|
275
|
+
};
|
|
276
|
+
const baseBodyAttr = attributes.find(
|
|
277
|
+
(a) => a.trait_type === "Base Body"
|
|
278
|
+
);
|
|
279
|
+
const baseBody = baseBodyAttr ? maticMappingLocal[baseBodyAttr.value] || baseBodyAttr.value : baseFromProp;
|
|
280
|
+
let chosenFolder = `${cycle}/${normalizedRarity}`;
|
|
281
|
+
if (baseBody) {
|
|
282
|
+
const preferred = `${cycle}/common/${baseBody}`;
|
|
283
|
+
const preferredPath = getImagePath(
|
|
284
|
+
basePath,
|
|
285
|
+
preferred,
|
|
286
|
+
eyeShapeValue
|
|
287
|
+
);
|
|
288
|
+
if (preferredPath) {
|
|
289
|
+
chosenFolder = preferred;
|
|
290
|
+
} else {
|
|
291
|
+
const tint = getCollateralTint(baseBody);
|
|
292
|
+
if (tint) eyeShapeTint = tint;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
folder = chosenFolder;
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
}
|
|
226
299
|
}
|
|
227
300
|
}
|
|
228
301
|
if (!prop || matchingAttributes.length === 0 || !folder) continue;
|
|
@@ -232,7 +305,14 @@ async function generateSpritesheet(gotchi, config, basePath, outputFolder, verbo
|
|
|
232
305
|
const imagePath = getImagePath(basePath, folder, traitValue);
|
|
233
306
|
if (imagePath) {
|
|
234
307
|
try {
|
|
235
|
-
|
|
308
|
+
let imageBuffer = await sharp(imagePath).png().toBuffer();
|
|
309
|
+
if (traitKey === "Eye Shape" && eyeShapeTint) {
|
|
310
|
+
if (verbose)
|
|
311
|
+
console.log(
|
|
312
|
+
` Tinting Eye Shape to base color rgb(${eyeShapeTint.r},${eyeShapeTint.g},${eyeShapeTint.b})`
|
|
313
|
+
);
|
|
314
|
+
imageBuffer = await sharp(imageBuffer).tint(eyeShapeTint).png().toBuffer();
|
|
315
|
+
}
|
|
236
316
|
const metadata = await sharp(imageBuffer).metadata();
|
|
237
317
|
if (!compositeImage) {
|
|
238
318
|
compositeImage = sharp({
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/generate_spritesheets.ts","../src/index.ts"],"names":["path"],"mappings":"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","file":"index.js","sourcesContent":["import fs from \"fs\";\nimport path from \"path\";\nimport sharp from \"sharp\";\nimport {\n Config,\n ConditionSet,\n Gotchi,\n GotchiAttribute,\n GenerationResult,\n} from \"./types.js\";\n\nfunction loadConfig(configPath: string): Config {\n const data = fs.readFileSync(configPath, \"utf8\");\n return JSON.parse(data) as Config;\n}\n\nfunction loadGotchis(jsonPath: string): Gotchi[] {\n const data = fs.readFileSync(jsonPath, \"utf8\");\n return JSON.parse(data) as Gotchi[];\n}\n\nfunction normalizeAttributes(\n originalAttributes: GotchiAttribute[]\n): GotchiAttribute[] {\n const normalized: GotchiAttribute[] = [];\n let hasPet = originalAttributes.some(\n (attr) => attr.trait_type === \"Wearable (Pet)\" && attr.value.trim() !== \"\"\n );\n\n for (const attr of originalAttributes) {\n if (attr.trait_type === \"Wearable (Body)\" && attr.value === \"Foxy Tail\") {\n if (hasPet) {\n // Skip mis-slotted Foxy Tail if a proper pet is already present\n continue;\n }\n normalized.push({ trait_type: \"Wearable (Pet)\", value: attr.value });\n hasPet = true;\n continue;\n }\n normalized.push(attr);\n }\n\n return normalized;\n}\n\nfunction matchCondition(\n gotchiAttributes: GotchiAttribute[],\n conditionSet: ConditionSet\n): boolean {\n const maticMapping: Record<string, string> = {\n amUSDT: \"aUSDT\",\n amAAVE: \"aAAVE\",\n amDAI: \"aDAI\",\n amUSDC: \"aUSDC\",\n };\n\n for (const condition of conditionSet.keys_and_values || []) {\n const keys = condition.keys || [];\n const values = condition.values || [];\n\n for (const key of keys) {\n if (values.length > 0) {\n const attrValues = gotchiAttributes\n .filter((attr) => attr.trait_type === key)\n .map((attr) => maticMapping[attr.value] || attr.value);\n\n if (!attrValues.some((val) => values.includes(val))) return false;\n } else {\n const hasKey = gotchiAttributes.some((attr) => attr.trait_type === key);\n if (!hasKey) return false;\n }\n }\n }\n return true;\n}\n\nfunction findMatchingConfig(\n gotchiAttributes: GotchiAttribute[],\n config: Config\n): ConditionSet | null {\n for (const conditionSet of config.if_keys_and_values || []) {\n if (matchCondition(gotchiAttributes, conditionSet)) return conditionSet;\n }\n return null;\n}\n\nfunction getImagePath(\n basePath: string,\n folder: string,\n traitValue: string\n): string | null {\n const maticMapping: Record<string, string> = {\n amUSDT: \"aUSDT\",\n amAAVE: \"aAAVE\",\n amDAI: \"aDAI\",\n amUSDC: \"aUSDC\",\n };\n\n const mappedValue = maticMapping[traitValue] || traitValue;\n const traitsBase = path.join(basePath, \"Trait Files\", \"Sprites\");\n const searchPath = path.join(traitsBase, ...folder.split(\"/\"));\n\n const possibleExtensions = [\".png\", \".PNG\", \".jpg\", \".JPG\", \".jpeg\", \".JPEG\"];\n\n for (const ext of possibleExtensions) {\n const imagePath = path.join(searchPath, `${mappedValue}${ext}`);\n if (fs.existsSync(imagePath)) return imagePath;\n }\n\n if (fs.existsSync(searchPath) && fs.statSync(searchPath).isDirectory()) {\n const files = fs.readdirSync(searchPath);\n for (const file of files) {\n const fileName = path.parse(file).name;\n if (fileName.toLowerCase() === mappedValue.toLowerCase()) {\n return path.join(searchPath, file);\n }\n }\n }\n\n return null;\n}\n\nfunction mapHandToProjectile(value: string): string {\n // Alias table for any hand->projectile name differences. Defaults to identity.\n const aliases: Record<string, string> = {\n // \"Common Wizard Staff\": \"Common Wizard Staff\",\n // Add overrides here if wearable name differs from projectile filename\n };\n return aliases[value] ?? value;\n}\n\nconst TOTAL_ROWS = 6;\n\nfunction getProjectileOffsets(name: string): { x: number; y: number } {\n // Base offsets to align projectile with hand; positive x => right, positive y => down\n const base = { x: 24, y: 30 };\n const overrides: Record<string, { x: number; y: number }> = {\n // Example: \"Witchy Wand\": { x: 14, y: 20 },\n };\n return overrides[name] ?? base;\n}\n\nasync function generateSpritesheet(\n gotchi: Gotchi,\n config: Config,\n basePath: string,\n outputFolder: string,\n verbose = false\n): Promise<GenerationResult> {\n const attributes = normalizeAttributes(gotchi.attributes);\n const matchingConfig = findMatchingConfig(attributes, config);\n\n if (!matchingConfig) {\n return {\n success: false,\n error: \"No matching configuration found\",\n details: {\n // Add a helpful detail for debugging\n layersUsed: attributes.map((a) => `${a.trait_type}: ${a.value}`),\n },\n };\n }\n\n const layerOrder = [\n \"Base Body\",\n \"Eye Shape\",\n \"Eye Color\",\n \"Wearable (Body)\",\n \"Wearable (Face)\",\n \"Wearable (Eyes)\",\n \"Wearable (Head)\",\n \"Wearable (Hands) L\",\n \"Wearable (Hands) R\",\n \"Wearable (Pet)\",\n \"Projectile\",\n ];\n\n const propertyMap: Record<string, { key: string; folder: string }> = {};\n for (const prop of matchingConfig.properties || []) {\n propertyMap[prop.key] = prop;\n }\n\n let compositeImage: sharp.Sharp | null = null;\n const layersUsed: string[] = [];\n const layerBuffers: sharp.OverlayOptions[] = [];\n const missingImages: string[] = [];\n const loadErrors: string[] = [];\n const projectilePaths: string[] = [];\n\n const handWearables = attributes.filter(\n (attr) => attr.trait_type === \"Wearable (Hands)\"\n );\n\n // Decide which hand(s) should render when only a single hand item is present.\n // If both hands are present, map first to L and second to R. If only one is present,\n // prefer the side that actually has an asset; if both sides exist, default to R.\n let selectedLeft: GotchiAttribute | null = null;\n let selectedRight: GotchiAttribute | null = null;\n const handsPropForSelection = propertyMap[\"Wearable (Hands)\"];\n if (handsPropForSelection) {\n const baseFolderParts = handsPropForSelection.folder.split(\"/\");\n const folderBase = baseFolderParts\n .slice(0, baseFolderParts.length - 1)\n .join(\"/\");\n const folderLForSelection = `${folderBase}/Wearable (Hands) L`;\n const folderRForSelection = `${folderBase}/Wearable (Hands) R`;\n\n if (handWearables.length >= 2) {\n selectedLeft = handWearables[0];\n selectedRight = handWearables[1];\n } else if (handWearables.length === 1) {\n const single = handWearables[0];\n const imageR = getImagePath(basePath, folderRForSelection, single.value);\n const imageL = getImagePath(basePath, folderLForSelection, single.value);\n if (imageR && !imageL) selectedRight = single;\n else if (!imageR && imageL) selectedLeft = single;\n else selectedRight = single; // both/neither found: default to right hand\n }\n }\n\n for (const traitKey of layerOrder) {\n let prop = propertyMap[traitKey];\n let matchingAttributes: (GotchiAttribute | undefined)[] = [];\n let folder: string | null = null;\n\n if (traitKey === \"Wearable (Hands) L\") {\n prop = propertyMap[\"Wearable (Hands)\"];\n if (prop && selectedLeft) {\n matchingAttributes = [selectedLeft];\n const baseFolderParts = prop.folder.split(\"/\");\n baseFolderParts[baseFolderParts.length - 1] = \"Wearable (Hands) L\";\n folder = baseFolderParts.join(\"/\");\n if (verbose)\n console.log(\n ` Processing left hand: ${selectedLeft.value} from ${folder}`\n );\n }\n } else if (traitKey === \"Wearable (Hands) R\") {\n prop = propertyMap[\"Wearable (Hands)\"];\n if (prop && selectedRight) {\n matchingAttributes = [selectedRight];\n const baseFolderParts = prop.folder.split(\"/\");\n baseFolderParts[baseFolderParts.length - 1] = \"Wearable (Hands) R\";\n folder = baseFolderParts.join(\"/\");\n if (verbose)\n console.log(\n ` Processing right hand: ${selectedRight.value} from ${folder}`\n );\n }\n } else if (traitKey === \"Projectile\") {\n // Special-case: composite projectile overlays based on selected hand item(s)\n const projectileFolder = \"projectiles\"; // under Trait Files/Sprites\n const handCandidates: string[] = [];\n if (selectedRight) handCandidates.push(selectedRight.value);\n if (selectedLeft) handCandidates.push(selectedLeft.value);\n\n // Try right first, then left; composite both if available\n for (const handName of handCandidates) {\n const projectileName = mapHandToProjectile(handName);\n const imagePath = getImagePath(\n basePath,\n projectileFolder,\n projectileName\n );\n if (imagePath) {\n try {\n // Do not composite; record path for viewer overlay\n projectilePaths.push(imagePath);\n layersUsed.push(`ProjectileRef: ${projectileName}`);\n if (verbose)\n console.log(\n ` Found projectile ref: ${projectileName} at ${imagePath}`\n );\n } catch (error) {\n const message =\n error instanceof Error ? error.message : String(error);\n loadErrors.push(`Projectile/${projectileName}: ${message}`);\n if (verbose)\n console.log(\n ` Error loading: Projectile/${projectileName}: ${message}`\n );\n }\n } else {\n missingImages.push(\n `Projectile/${projectileName} in ${projectileFolder}`\n );\n if (verbose)\n console.log(\n ` Missing image: Projectile/${projectileName} in ${projectileFolder}`\n );\n }\n }\n continue;\n } else {\n if (prop) {\n matchingAttributes = attributes.filter(\n (attr) => attr.trait_type === traitKey\n );\n folder = prop.folder;\n }\n }\n\n if (!prop || matchingAttributes.length === 0 || !folder) continue;\n\n for (const attr of matchingAttributes) {\n if (!attr) continue;\n const traitValue = attr.value;\n const imagePath = getImagePath(basePath, folder, traitValue);\n\n if (imagePath) {\n try {\n const imageBuffer = await sharp(imagePath).png().toBuffer();\n const metadata = await sharp(imageBuffer).metadata();\n\n if (!compositeImage) {\n compositeImage = sharp({\n create: {\n width: metadata.width as number,\n height: metadata.height as number,\n channels: 4,\n background: { r: 0, g: 0, b: 0, alpha: 0 },\n },\n });\n }\n\n layerBuffers.push({ input: imageBuffer });\n const layerLabel =\n traitKey.includes(\"Hands\") && traitKey !== \"Wearable (Hands)\"\n ? `${traitKey}: ${traitValue}`\n : `${attr.trait_type}: ${traitValue}`;\n layersUsed.push(layerLabel);\n if (verbose)\n console.log(` Found and added: ${layerLabel} from ${imagePath}`);\n } catch (error) {\n const message =\n error instanceof Error ? error.message : String(error);\n loadErrors.push(`${traitKey}/${traitValue}: ${message}`);\n if (verbose)\n console.log(\n ` Error loading: ${traitKey}/${traitValue}: ${message}`\n );\n }\n } else if (traitValue) {\n missingImages.push(`${traitKey}/${traitValue} in ${folder}`);\n if (verbose)\n console.log(\n ` Missing image: ${traitKey}/${traitValue} in ${folder}`\n );\n }\n }\n }\n\n if (compositeImage && layerBuffers.length > 0) {\n try {\n const outputPath = path.join(outputFolder, `${gotchi.id}.png`);\n await compositeImage.composite(layerBuffers).png().toFile(outputPath);\n return {\n success: true,\n details: {\n layersUsed,\n missingImages,\n loadErrors,\n projectiles: projectilePaths,\n },\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n success: false,\n error: `Failed to save spritesheet: ${message}`,\n details: {\n layersUsed,\n missingImages,\n loadErrors,\n projectiles: projectilePaths,\n },\n };\n }\n } else {\n return {\n success: false,\n error: \"No layers found to composite\",\n details: {\n layersUsed,\n missingImages,\n loadErrors,\n projectiles: projectilePaths,\n },\n };\n }\n}\n\nasync function main(): Promise<void> {\n const args = process.argv.slice(2);\n\n if (args.length < 1) {\n console.log(\n \"Usage: node generate_spritesheets.js <input_json_file> [options]\"\n );\n console.log(\n 'Example: node generate_spritesheets.js \"processedAavegotchis.json\"'\n );\n console.log(\"Options:\");\n console.log(\" --limit <n> Process only first n gotchis\");\n console.log(\n \" --ids <id1,id2> Process only specific IDs (comma-separated)\"\n );\n console.log(\" --start <n> Start processing from gotchi at index n\");\n console.log(\n \" --batch <n> Number of gotchis to process in parallel (default: 10)\"\n );\n console.log(\" --verbose Show detailed layer information\");\n console.log(\"\");\n console.log(\"Example with all gotchis in batches of 20:\");\n console.log(\n ' node generate_spritesheets.js \"processedAavegotchis.json\" --batch 20'\n );\n process.exit(1);\n }\n\n const inputJson = args[0];\n const configFile = \"config.json\";\n const outputFolder = \"website/spritesheets\";\n const basePath = \".\";\n\n let limit: number | null = null;\n let specificIds: number[] | null = null;\n let startIndex = 0;\n let verbose = false;\n\n for (let i = 1; i < args.length; i++) {\n if (args[i] === \"--limit\" && args[i + 1]) {\n limit = parseInt(args[i + 1]);\n i++;\n } else if (args[i] === \"--ids\" && args[i + 1]) {\n specificIds = args[i + 1]\n .split(\",\")\n .map((id) => parseInt(id))\n .filter((n) => !Number.isNaN(n));\n i++;\n } else if (args[i] === \"--start\" && args[i + 1]) {\n startIndex = parseInt(args[i + 1]);\n i++;\n } else if (args[i] === \"--verbose\") {\n verbose = true;\n }\n }\n\n if (!fs.existsSync(inputJson)) {\n console.log(`Error: Input file '${inputJson}' not found`);\n process.exit(1);\n }\n\n if (!fs.existsSync(configFile)) {\n console.log(`Error: Config file '${configFile}' not found`);\n process.exit(1);\n }\n\n if (!fs.existsSync(outputFolder)) {\n fs.mkdirSync(outputFolder, { recursive: true });\n }\n\n console.log(`Loading configuration from ${configFile}...`);\n const config = loadConfig(configFile);\n\n console.log(`Loading gotchis from ${inputJson}...`);\n let gotchis = loadGotchis(inputJson);\n\n if (specificIds) {\n gotchis = gotchis.filter((g) => specificIds!.includes(g.id));\n console.log(`Filtering to ${gotchis.length} specific gotchis`);\n }\n\n if (startIndex > 0) {\n gotchis = gotchis.slice(startIndex);\n console.log(`Starting from index ${startIndex}`);\n }\n\n if (limit) {\n gotchis = gotchis.slice(0, limit);\n console.log(`Limiting to ${gotchis.length} gotchis`);\n }\n\n const batchSize = args.includes(\"--batch\")\n ? parseInt(args[args.indexOf(\"--batch\") + 1]) || 10\n : 10;\n\n console.log(\n `Processing ${gotchis.length} gotchis in batches of ${batchSize}...`\n );\n console.log(\"-\".repeat(50));\n\n let successCount = 0;\n let failCount = 0;\n const failedGotchis: Array<{\n id: number;\n attributes: GotchiAttribute[];\n error: string;\n details?: unknown;\n }> = [];\n const allMissingLayers: Array<{\n gotchiId: number;\n missingLayer: string;\n attributes: GotchiAttribute[];\n }> = [];\n\n const idToProjectiles: Record<number, string[]> = {};\n const uniqueProjectileFiles = new Set<string>();\n\n for (let i = 0; i < gotchis.length; i += batchSize) {\n const batch = gotchis.slice(i, Math.min(i + batchSize, gotchis.length));\n const batchNum = Math.floor(i / batchSize) + 1;\n const totalBatches = Math.ceil(gotchis.length / batchSize);\n\n console.log(\n `\\nProcessing batch ${batchNum}/${totalBatches} (${batch.length} gotchis)...`\n );\n\n const batchResults = await Promise.all(\n batch.map(async (gotchi, index) => {\n try {\n const result = await generateSpritesheet(\n gotchi,\n config,\n basePath,\n outputFolder,\n verbose\n );\n\n if (\n result.details?.missingImages &&\n result.details.missingImages.length > 0\n ) {\n result.details.missingImages.forEach((missing) => {\n allMissingLayers.push({\n gotchiId: gotchi.id,\n missingLayer: missing,\n attributes: gotchi.attributes,\n });\n });\n }\n\n if (!result.success) {\n console.log(` ✗ Failed gotchi ${gotchi.id}: ${result.error}`);\n return {\n success: false as const,\n gotchi,\n error: result.error ?? \"Unknown error\",\n details: result.details,\n };\n }\n\n if (verbose && result.details) {\n console.log(\n ` ✓ Completed gotchi ${\n gotchi.id\n } - Layers: ${result.details.layersUsed?.join(\", \")}`\n );\n } else {\n console.log(\n ` ✓ Completed gotchi ${gotchi.id} (${i + index + 1}/${\n gotchis.length\n })`\n );\n }\n return { success: true as const, gotchi, details: result.details };\n } catch (error) {\n const message =\n error instanceof Error ? error.message : String(error);\n console.log(` ✗ Error processing gotchi ${gotchi.id}: ${message}`);\n return {\n success: false as const,\n gotchi,\n error: `Unexpected error: ${message}`,\n };\n }\n })\n );\n\n batchResults.forEach((result) => {\n if (result.success) {\n successCount++;\n const proj =\n result.details && Array.isArray(result.details.projectiles)\n ? result.details.projectiles\n : [];\n if (proj && proj.length > 0) {\n const rels = proj.map((abs: string) => {\n const base = path.parse(abs).base;\n uniqueProjectileFiles.add(base);\n return `projectiles/${base}`;\n });\n idToProjectiles[result.gotchi.id] = rels;\n }\n } else {\n failCount++;\n failedGotchis.push({\n id: result.gotchi.id,\n attributes: result.gotchi.attributes,\n error: result.error,\n details: result.details || {},\n });\n }\n });\n\n console.log(\n `Batch ${batchNum} complete: ${\n batchResults.filter((r) => r.success).length\n } succeeded, ${batchResults.filter((r) => !r.success).length} failed`\n );\n }\n\n console.log(\"\\n\" + \"=\".repeat(50));\n console.log(\"Processing complete!\");\n console.log(`Successfully generated: ${successCount} spritesheets`);\n console.log(`Failed: ${failCount}`);\n console.log(`Output saved to: ${outputFolder}/`);\n\n if (failedGotchis.length > 0) {\n const failedLogPath = \"failed_gotchis.json\";\n fs.writeFileSync(failedLogPath, JSON.stringify(failedGotchis, null, 2));\n console.log(`\\nFailed gotchis logged to: ${failedLogPath}`);\n console.log(\"Failed IDs:\", failedGotchis.map((g) => g.id).join(\", \"));\n }\n\n if (allMissingLayers.length > 0) {\n const missingByItem: Record<\n string,\n { layer: string; count: number; gotchiIds: number[] }\n > = {};\n allMissingLayers.forEach((item) => {\n if (!missingByItem[item.missingLayer]) {\n missingByItem[item.missingLayer] = {\n layer: item.missingLayer,\n count: 0,\n gotchiIds: [],\n };\n }\n missingByItem[item.missingLayer].count++;\n missingByItem[item.missingLayer].gotchiIds.push(item.gotchiId);\n });\n\n const missingLayersSummary = Object.values(missingByItem).sort(\n (a, b) => b.count - a.count\n );\n\n const missingLayersLog = {\n totalMissing: allMissingLayers.length,\n uniqueMissingLayers: missingLayersSummary.length,\n summary: missingLayersSummary,\n detailed: allMissingLayers,\n };\n\n const missingLogPath = \"missing_layers.json\";\n fs.writeFileSync(missingLogPath, JSON.stringify(missingLayersLog, null, 2));\n console.log(`\\nMissing layers logged to: ${missingLogPath}`);\n console.log(`Total missing layer instances: ${allMissingLayers.length}`);\n console.log(`Unique missing layers: ${missingLayersSummary.length}`);\n\n console.log(\"\\nTop missing layers:\");\n missingLayersSummary.slice(0, 5).forEach((item) => {\n console.log(` - ${item.layer} (${item.count} gotchis)`);\n });\n }\n\n try {\n // Ensure unique projectile assets are available under website/projectiles\n const websiteRoot = path.dirname(outputFolder); // website/\n const projectilesOutDir = path.join(websiteRoot, \"projectiles\");\n if (!fs.existsSync(projectilesOutDir))\n fs.mkdirSync(projectilesOutDir, { recursive: true });\n uniqueProjectileFiles.forEach((fileName) => {\n // Source under Trait Files/Sprites/projectiles\n const srcPath = path.join(\n \"Trait Files\",\n \"Sprites\",\n \"projectiles\",\n fileName\n );\n if (fs.existsSync(srcPath)) {\n const destPath = path.join(projectilesOutDir, fileName);\n try {\n fs.copyFileSync(srcPath, destPath);\n } catch {}\n }\n });\n\n const outputFiles = fs.readdirSync(outputFolder);\n const spriteList = outputFiles\n .filter((fileName) => fileName.toLowerCase().endsWith(\".png\"))\n .map((fileName) => path.parse(fileName).name)\n .filter((baseName) => /^\\d+$/.test(baseName))\n .map((baseName) => {\n const id = parseInt(baseName, 10);\n return {\n id,\n path: `spritesheets/${baseName}.png`,\n projectiles: idToProjectiles[id] || [],\n };\n })\n .sort((a, b) => a.id - b.id);\n\n const listPath = path.join(outputFolder, \"list.json\");\n fs.writeFileSync(listPath, JSON.stringify(spriteList, null, 2));\n console.log(`\\nSprite list written to: ${listPath}`);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n console.log(`\\nWarning: Failed to write sprite list: ${message}`);\n }\n}\n\n// Execute only when run directly via tsx/node\nif (import.meta.url === `file://${process.argv[1]}`) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n main().catch((error) => {\n console.error(\"Error:\", error);\n process.exit(1);\n });\n}\n\nexport { generateSpritesheet };\n","import path from \"path\";\nimport { fileURLToPath } from \"url\";\nexport { generateSpritesheet } from \"./generate_spritesheets.js\";\nexport type {\n Gotchi,\n GotchiAttribute,\n Config,\n ConfigProperty,\n ConditionKV,\n ConditionSet,\n GenerationResult,\n GenerationDetails,\n} from \"./types.js\";\nexport function getPackageBasePath(): string {\n const distDirectoryPath = path.dirname(fileURLToPath(import.meta.url));\n return path.resolve(distDirectoryPath, \"..\");\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/generate_spritesheets.ts","../src/index.ts"],"names":["path"],"mappings":"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","file":"index.js","sourcesContent":["import fs from \"fs\";\nimport path from \"path\";\nimport sharp from \"sharp\";\nimport {\n Config,\n ConditionSet,\n Gotchi,\n GotchiAttribute,\n GenerationResult,\n} from \"./types.js\";\n\nfunction loadConfig(configPath: string): Config {\n const data = fs.readFileSync(configPath, \"utf8\");\n return JSON.parse(data) as Config;\n}\n\nfunction loadGotchis(jsonPath: string): Gotchi[] {\n const data = fs.readFileSync(jsonPath, \"utf8\");\n return JSON.parse(data) as Gotchi[];\n}\n\nfunction normalizeAttributes(\n originalAttributes: GotchiAttribute[]\n): GotchiAttribute[] {\n const normalized: GotchiAttribute[] = [];\n let hasPet = originalAttributes.some(\n (attr) => attr.trait_type === \"Wearable (Pet)\" && attr.value.trim() !== \"\"\n );\n\n for (const attr of originalAttributes) {\n if (attr.trait_type === \"Wearable (Body)\" && attr.value === \"Foxy Tail\") {\n if (hasPet) {\n // Skip mis-slotted Foxy Tail if a proper pet is already present\n continue;\n }\n normalized.push({ trait_type: \"Wearable (Pet)\", value: attr.value });\n hasPet = true;\n continue;\n }\n normalized.push(attr);\n }\n\n return normalized;\n}\n\nfunction matchCondition(\n gotchiAttributes: GotchiAttribute[],\n conditionSet: ConditionSet\n): boolean {\n const maticMapping: Record<string, string> = {\n amUSDT: \"aUSDT\",\n amAAVE: \"aAAVE\",\n amDAI: \"aDAI\",\n amUSDC: \"aUSDC\",\n };\n\n for (const condition of conditionSet.keys_and_values || []) {\n const keys = condition.keys || [];\n const values = condition.values || [];\n\n for (const key of keys) {\n if (values.length > 0) {\n const attrValues = gotchiAttributes\n .filter((attr) => attr.trait_type === key)\n .map((attr) => maticMapping[attr.value] || attr.value);\n\n if (!attrValues.some((val) => values.includes(val))) return false;\n } else {\n const hasKey = gotchiAttributes.some((attr) => attr.trait_type === key);\n if (!hasKey) return false;\n }\n }\n }\n return true;\n}\n\nfunction findMatchingConfig(\n gotchiAttributes: GotchiAttribute[],\n config: Config\n): ConditionSet | null {\n for (const conditionSet of config.if_keys_and_values || []) {\n if (matchCondition(gotchiAttributes, conditionSet)) return conditionSet;\n }\n return null;\n}\n\nfunction getImagePath(\n basePath: string,\n folder: string,\n traitValue: string\n): string | null {\n const maticMapping: Record<string, string> = {\n amUSDT: \"aUSDT\",\n amAAVE: \"aAAVE\",\n amDAI: \"aDAI\",\n amUSDC: \"aUSDC\",\n };\n\n const mappedValue = maticMapping[traitValue] || traitValue;\n const traitsBase = path.join(basePath, \"Trait Files\", \"Sprites\");\n const searchPath = path.join(traitsBase, ...folder.split(\"/\"));\n\n const possibleExtensions = [\".png\", \".PNG\", \".jpg\", \".JPG\", \".jpeg\", \".JPEG\"];\n\n for (const ext of possibleExtensions) {\n const imagePath = path.join(searchPath, `${mappedValue}${ext}`);\n if (fs.existsSync(imagePath)) return imagePath;\n }\n\n if (fs.existsSync(searchPath) && fs.statSync(searchPath).isDirectory()) {\n const files = fs.readdirSync(searchPath);\n for (const file of files) {\n const fileName = path.parse(file).name;\n if (fileName.toLowerCase() === mappedValue.toLowerCase()) {\n return path.join(searchPath, file);\n }\n }\n }\n\n return null;\n}\n\nfunction mapHandToProjectile(value: string): string {\n // Alias table for any hand->projectile name differences. Defaults to identity.\n const aliases: Record<string, string> = {\n // \"Common Wizard Staff\": \"Common Wizard Staff\",\n // Add overrides here if wearable name differs from projectile filename\n };\n return aliases[value] ?? value;\n}\n\nfunction getCollateralTint(\n baseBody: string\n): { r: number; g: number; b: number } | null {\n // Minimal mapping: only apply where generic rarity art is visibly wrong (e.g., aAAVE turns blue)\n const table: Record<string, { r: number; g: number; b: number }> = {\n aAAVE: { r: 220, g: 120, b: 255 },\n };\n return table[baseBody] ?? null;\n}\n\nconst TOTAL_ROWS = 6;\n\nfunction getProjectileOffsets(name: string): { x: number; y: number } {\n // Base offsets to align projectile with hand; positive x => right, positive y => down\n const base = { x: 24, y: 30 };\n const overrides: Record<string, { x: number; y: number }> = {\n // Example: \"Witchy Wand\": { x: 14, y: 20 },\n };\n return overrides[name] ?? base;\n}\n\nasync function generateSpritesheet(\n gotchi: Gotchi,\n config: Config,\n basePath: string,\n outputFolder: string,\n verbose = false\n): Promise<GenerationResult> {\n const attributes = normalizeAttributes(gotchi.attributes);\n const matchingConfig = findMatchingConfig(attributes, config);\n\n if (!matchingConfig) {\n return {\n success: false,\n error: \"No matching configuration found\",\n details: {\n // Add a helpful detail for debugging\n layersUsed: attributes.map((a) => `${a.trait_type}: ${a.value}`),\n },\n };\n }\n\n const layerOrder = [\n \"Base Body\",\n \"Eye Shape\",\n \"Eye Color\",\n \"Wearable (Body)\",\n \"Wearable (Face)\",\n \"Wearable (Eyes)\",\n \"Wearable (Head)\",\n \"Wearable (Hands) L\",\n \"Wearable (Hands) R\",\n \"Wearable (Pet)\",\n \"Projectile\",\n ];\n\n const propertyMap: Record<string, { key: string; folder: string }> = {};\n for (const prop of matchingConfig.properties || []) {\n propertyMap[prop.key] = prop;\n }\n\n // Ensure Eye Color overlay is available even when not specified by the config.\n // Many legacy configs encoded color inside Eye Shape under common/<base>, but we now\n // resolve Eye Shape by rarity folders. To preserve correct coloring, provide a\n // default Eye Color folder that contains per-base color overlays keyed by rarity.\n if (!propertyMap[\"Eye Color\"]) {\n const eyeShapeAttr = attributes.find((a) => a.trait_type === \"Eye Shape\");\n const eyeShapeValue = eyeShapeAttr?.value ?? \"\";\n // Only auto-add Eye Color for 'common*' eye shapes. Non-common eye shapes already\n // encode color in their sprites and adding Eye Color would double-tint them.\n const shouldAddEyeColor = /^common/.test(eyeShapeValue);\n if (shouldAddEyeColor) {\n const maticMappingLocal: Record<string, string> = {\n amUSDT: \"aUSDT\",\n amAAVE: \"aAAVE\",\n amDAI: \"aDAI\",\n amUSDC: \"aUSDC\",\n };\n const baseBodyAttr = attributes.find((a) => a.trait_type === \"Base Body\");\n const baseBody = baseBodyAttr\n ? maticMappingLocal[baseBodyAttr.value] || baseBodyAttr.value\n : undefined;\n // Derive cycle from Base Body folder when available, otherwise fall back to Eye Shape\n const baseFolderForCycle =\n propertyMap[\"Base Body\"]?.folder || propertyMap[\"Eye Shape\"]?.folder;\n const cycle = baseFolderForCycle\n ? baseFolderForCycle.split(\"/\")[0]\n : \"punchbody\";\n if (baseBody) {\n propertyMap[\"Eye Color\"] = {\n key: \"Eye Color\",\n folder: `${cycle}/mythic_high_${baseBody}`,\n } as { key: string; folder: string };\n }\n }\n }\n\n let compositeImage: sharp.Sharp | null = null;\n const layersUsed: string[] = [];\n const layerBuffers: sharp.OverlayOptions[] = [];\n const missingImages: string[] = [];\n const loadErrors: string[] = [];\n const projectilePaths: string[] = [];\n\n const handWearables = attributes.filter(\n (attr) => attr.trait_type === \"Wearable (Hands)\"\n );\n\n // Decide which hand(s) should render when only a single hand item is present.\n // If both hands are present, map first to L and second to R. If only one is present,\n // prefer the side that actually has an asset; if both sides exist, default to R.\n let selectedLeft: GotchiAttribute | null = null;\n let selectedRight: GotchiAttribute | null = null;\n const handsPropForSelection = propertyMap[\"Wearable (Hands)\"];\n if (handsPropForSelection) {\n const baseFolderParts = handsPropForSelection.folder.split(\"/\");\n const folderBase = baseFolderParts\n .slice(0, baseFolderParts.length - 1)\n .join(\"/\");\n const folderLForSelection = `${folderBase}/Wearable (Hands) L`;\n const folderRForSelection = `${folderBase}/Wearable (Hands) R`;\n\n if (handWearables.length >= 2) {\n selectedLeft = handWearables[0];\n selectedRight = handWearables[1];\n } else if (handWearables.length === 1) {\n const single = handWearables[0];\n const imageR = getImagePath(basePath, folderRForSelection, single.value);\n const imageL = getImagePath(basePath, folderLForSelection, single.value);\n if (imageR && !imageL) selectedRight = single;\n else if (!imageR && imageL) selectedLeft = single;\n else selectedRight = single; // both/neither found: default to right hand\n }\n }\n\n for (const traitKey of layerOrder) {\n let prop = propertyMap[traitKey];\n let matchingAttributes: (GotchiAttribute | undefined)[] = [];\n let folder: string | null = null;\n let eyeShapeTint: { r: number; g: number; b: number } | null = null;\n\n if (traitKey === \"Wearable (Hands) L\") {\n prop = propertyMap[\"Wearable (Hands)\"];\n if (prop && selectedLeft) {\n matchingAttributes = [selectedLeft];\n const baseFolderParts = prop.folder.split(\"/\");\n baseFolderParts[baseFolderParts.length - 1] = \"Wearable (Hands) L\";\n folder = baseFolderParts.join(\"/\");\n if (verbose)\n console.log(\n ` Processing left hand: ${selectedLeft.value} from ${folder}`\n );\n }\n } else if (traitKey === \"Wearable (Hands) R\") {\n prop = propertyMap[\"Wearable (Hands)\"];\n if (prop && selectedRight) {\n matchingAttributes = [selectedRight];\n const baseFolderParts = prop.folder.split(\"/\");\n baseFolderParts[baseFolderParts.length - 1] = \"Wearable (Hands) R\";\n folder = baseFolderParts.join(\"/\");\n if (verbose)\n console.log(\n ` Processing right hand: ${selectedRight.value} from ${folder}`\n );\n }\n } else if (traitKey === \"Projectile\") {\n // Special-case: composite projectile overlays based on selected hand item(s)\n const projectileFolder = \"projectiles\"; // under Trait Files/Sprites\n const handCandidates: string[] = [];\n if (selectedRight) handCandidates.push(selectedRight.value);\n if (selectedLeft) handCandidates.push(selectedLeft.value);\n\n // Try right first, then left; composite both if available\n for (const handName of handCandidates) {\n const projectileName = mapHandToProjectile(handName);\n const imagePath = getImagePath(\n basePath,\n projectileFolder,\n projectileName\n );\n if (imagePath) {\n try {\n // Do not composite; record path for viewer overlay\n projectilePaths.push(imagePath);\n layersUsed.push(`ProjectileRef: ${projectileName}`);\n if (verbose)\n console.log(\n ` Found projectile ref: ${projectileName} at ${imagePath}`\n );\n } catch (error) {\n const message =\n error instanceof Error ? error.message : String(error);\n loadErrors.push(`Projectile/${projectileName}: ${message}`);\n if (verbose)\n console.log(\n ` Error loading: Projectile/${projectileName}: ${message}`\n );\n }\n } else {\n missingImages.push(\n `Projectile/${projectileName} in ${projectileFolder}`\n );\n if (verbose)\n console.log(\n ` Missing image: Projectile/${projectileName} in ${projectileFolder}`\n );\n }\n }\n continue;\n } else {\n if (prop) {\n matchingAttributes = attributes.filter(\n (attr) => attr.trait_type === traitKey\n );\n folder = prop.folder;\n\n // Special handling for Eye Shape: determine the correct folder based on the Eye Shape value\n if (\n traitKey === \"Eye Shape\" &&\n matchingAttributes.length > 0 &&\n matchingAttributes[0]\n ) {\n const eyeShapeValue = matchingAttributes[0].value;\n // Extract rarity from Eye Shape value (e.g., \"rare_high_3\" -> \"rare_high\")\n const rarityMatch = eyeShapeValue.match(\n /^(uncommon_low|uncommon_high|rare_low|rare_high|mythical_low|mythical_high|mythic_low|mythic_high|common)/\n );\n if (rarityMatch) {\n const rawRarity = rarityMatch[1];\n // Normalize mythic_* -> mythical_* to match directory names\n const normalizedRarity = rawRarity.startsWith(\"mythic_\")\n ? rawRarity.replace(/^mythic_/, \"mythical_\")\n : rawRarity;\n\n // Extract the cycle name from the prop folder (e.g., \"meleebody/common/amWETH\" -> \"meleebody\")\n const folderParts = prop.folder.split(\"/\");\n const cycle = folderParts[0];\n const baseFromProp = folderParts.includes(\"common\")\n ? folderParts[folderParts.length - 1]\n : null;\n\n // For 'common', assets live under cycle/common/<token>/common_?.png\n // Keep the configured folder (which includes the token) instead of dropping it.\n if (normalizedRarity === \"common\") {\n folder = prop.folder;\n } else {\n // Prefer collateral-specific art if it exists under common/<base>\n const maticMappingLocal: Record<string, string> = {\n amUSDT: \"aUSDT\",\n amAAVE: \"aAAVE\",\n amDAI: \"aDAI\",\n amUSDC: \"aUSDC\",\n };\n const baseBodyAttr = attributes.find(\n (a) => a.trait_type === \"Base Body\"\n );\n const baseBody = baseBodyAttr\n ? maticMappingLocal[baseBodyAttr.value] || baseBodyAttr.value\n : baseFromProp;\n\n let chosenFolder = `${cycle}/${normalizedRarity}`;\n if (baseBody) {\n const preferred = `${cycle}/common/${baseBody}`;\n const preferredPath = getImagePath(\n basePath,\n preferred,\n eyeShapeValue\n );\n if (preferredPath) {\n chosenFolder = preferred;\n } else {\n // No collateral-specific asset: use rarity folder and tint to base color if known\n const tint = getCollateralTint(baseBody);\n if (tint) eyeShapeTint = tint;\n }\n }\n folder = chosenFolder;\n }\n }\n }\n }\n }\n\n if (!prop || matchingAttributes.length === 0 || !folder) continue;\n\n for (const attr of matchingAttributes) {\n if (!attr) continue;\n const traitValue = attr.value;\n const imagePath = getImagePath(basePath, folder, traitValue);\n\n if (imagePath) {\n try {\n let imageBuffer = await sharp(imagePath).png().toBuffer();\n if (traitKey === \"Eye Shape\" && eyeShapeTint) {\n if (verbose)\n console.log(\n ` Tinting Eye Shape to base color rgb(${eyeShapeTint.r},${eyeShapeTint.g},${eyeShapeTint.b})`\n );\n imageBuffer = await sharp(imageBuffer)\n .tint(eyeShapeTint)\n .png()\n .toBuffer();\n }\n const metadata = await sharp(imageBuffer).metadata();\n\n if (!compositeImage) {\n compositeImage = sharp({\n create: {\n width: metadata.width as number,\n height: metadata.height as number,\n channels: 4,\n background: { r: 0, g: 0, b: 0, alpha: 0 },\n },\n });\n }\n\n layerBuffers.push({ input: imageBuffer });\n const layerLabel =\n traitKey.includes(\"Hands\") && traitKey !== \"Wearable (Hands)\"\n ? `${traitKey}: ${traitValue}`\n : `${attr.trait_type}: ${traitValue}`;\n layersUsed.push(layerLabel);\n if (verbose)\n console.log(` Found and added: ${layerLabel} from ${imagePath}`);\n } catch (error) {\n const message =\n error instanceof Error ? error.message : String(error);\n loadErrors.push(`${traitKey}/${traitValue}: ${message}`);\n if (verbose)\n console.log(\n ` Error loading: ${traitKey}/${traitValue}: ${message}`\n );\n }\n } else if (traitValue) {\n missingImages.push(`${traitKey}/${traitValue} in ${folder}`);\n if (verbose)\n console.log(\n ` Missing image: ${traitKey}/${traitValue} in ${folder}`\n );\n }\n }\n }\n\n if (compositeImage && layerBuffers.length > 0) {\n try {\n const outputPath = path.join(outputFolder, `${gotchi.id}.png`);\n await compositeImage.composite(layerBuffers).png().toFile(outputPath);\n return {\n success: true,\n details: {\n layersUsed,\n missingImages,\n loadErrors,\n projectiles: projectilePaths,\n },\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n success: false,\n error: `Failed to save spritesheet: ${message}`,\n details: {\n layersUsed,\n missingImages,\n loadErrors,\n projectiles: projectilePaths,\n },\n };\n }\n } else {\n return {\n success: false,\n error: \"No layers found to composite\",\n details: {\n layersUsed,\n missingImages,\n loadErrors,\n projectiles: projectilePaths,\n },\n };\n }\n}\n\nasync function main(): Promise<void> {\n const args = process.argv.slice(2);\n\n if (args.length < 1) {\n console.log(\n \"Usage: node generate_spritesheets.js <input_json_file> [options]\"\n );\n console.log(\n 'Example: node generate_spritesheets.js \"processedAavegotchis.json\"'\n );\n console.log(\"Options:\");\n console.log(\" --limit <n> Process only first n gotchis\");\n console.log(\n \" --ids <id1,id2> Process only specific IDs (comma-separated)\"\n );\n console.log(\" --start <n> Start processing from gotchi at index n\");\n console.log(\n \" --batch <n> Number of gotchis to process in parallel (default: 10)\"\n );\n console.log(\" --verbose Show detailed layer information\");\n console.log(\"\");\n console.log(\"Example with all gotchis in batches of 20:\");\n console.log(\n ' node generate_spritesheets.js \"processedAavegotchis.json\" --batch 20'\n );\n process.exit(1);\n }\n\n const inputJson = args[0];\n const configFile = \"config.json\";\n const outputFolder = \"website/spritesheets\";\n const basePath = \".\";\n\n let limit: number | null = null;\n let specificIds: number[] | null = null;\n let startIndex = 0;\n let verbose = false;\n\n for (let i = 1; i < args.length; i++) {\n if (args[i] === \"--limit\" && args[i + 1]) {\n limit = parseInt(args[i + 1]);\n i++;\n } else if (args[i] === \"--ids\" && args[i + 1]) {\n specificIds = args[i + 1]\n .split(\",\")\n .map((id) => parseInt(id))\n .filter((n) => !Number.isNaN(n));\n i++;\n } else if (args[i] === \"--start\" && args[i + 1]) {\n startIndex = parseInt(args[i + 1]);\n i++;\n } else if (args[i] === \"--verbose\") {\n verbose = true;\n }\n }\n\n if (!fs.existsSync(inputJson)) {\n console.log(`Error: Input file '${inputJson}' not found`);\n process.exit(1);\n }\n\n if (!fs.existsSync(configFile)) {\n console.log(`Error: Config file '${configFile}' not found`);\n process.exit(1);\n }\n\n if (!fs.existsSync(outputFolder)) {\n fs.mkdirSync(outputFolder, { recursive: true });\n }\n\n console.log(`Loading configuration from ${configFile}...`);\n const config = loadConfig(configFile);\n\n console.log(`Loading gotchis from ${inputJson}...`);\n let gotchis = loadGotchis(inputJson);\n\n if (specificIds) {\n gotchis = gotchis.filter((g) => specificIds!.includes(g.id));\n console.log(`Filtering to ${gotchis.length} specific gotchis`);\n }\n\n if (startIndex > 0) {\n gotchis = gotchis.slice(startIndex);\n console.log(`Starting from index ${startIndex}`);\n }\n\n if (limit) {\n gotchis = gotchis.slice(0, limit);\n console.log(`Limiting to ${gotchis.length} gotchis`);\n }\n\n const batchSize = args.includes(\"--batch\")\n ? parseInt(args[args.indexOf(\"--batch\") + 1]) || 10\n : 10;\n\n console.log(\n `Processing ${gotchis.length} gotchis in batches of ${batchSize}...`\n );\n console.log(\"-\".repeat(50));\n\n let successCount = 0;\n let failCount = 0;\n const failedGotchis: Array<{\n id: number;\n attributes: GotchiAttribute[];\n error: string;\n details?: unknown;\n }> = [];\n const allMissingLayers: Array<{\n gotchiId: number;\n missingLayer: string;\n attributes: GotchiAttribute[];\n }> = [];\n\n const idToProjectiles: Record<number, string[]> = {};\n const uniqueProjectileFiles = new Set<string>();\n\n for (let i = 0; i < gotchis.length; i += batchSize) {\n const batch = gotchis.slice(i, Math.min(i + batchSize, gotchis.length));\n const batchNum = Math.floor(i / batchSize) + 1;\n const totalBatches = Math.ceil(gotchis.length / batchSize);\n\n console.log(\n `\\nProcessing batch ${batchNum}/${totalBatches} (${batch.length} gotchis)...`\n );\n\n const batchResults = await Promise.all(\n batch.map(async (gotchi, index) => {\n try {\n const result = await generateSpritesheet(\n gotchi,\n config,\n basePath,\n outputFolder,\n verbose\n );\n\n if (\n result.details?.missingImages &&\n result.details.missingImages.length > 0\n ) {\n result.details.missingImages.forEach((missing) => {\n allMissingLayers.push({\n gotchiId: gotchi.id,\n missingLayer: missing,\n attributes: gotchi.attributes,\n });\n });\n }\n\n if (!result.success) {\n console.log(` ✗ Failed gotchi ${gotchi.id}: ${result.error}`);\n return {\n success: false as const,\n gotchi,\n error: result.error ?? \"Unknown error\",\n details: result.details,\n };\n }\n\n if (verbose && result.details) {\n console.log(\n ` ✓ Completed gotchi ${\n gotchi.id\n } - Layers: ${result.details.layersUsed?.join(\", \")}`\n );\n } else {\n console.log(\n ` ✓ Completed gotchi ${gotchi.id} (${i + index + 1}/${\n gotchis.length\n })`\n );\n }\n return { success: true as const, gotchi, details: result.details };\n } catch (error) {\n const message =\n error instanceof Error ? error.message : String(error);\n console.log(` ✗ Error processing gotchi ${gotchi.id}: ${message}`);\n return {\n success: false as const,\n gotchi,\n error: `Unexpected error: ${message}`,\n };\n }\n })\n );\n\n batchResults.forEach((result) => {\n if (result.success) {\n successCount++;\n const proj =\n result.details && Array.isArray(result.details.projectiles)\n ? result.details.projectiles\n : [];\n if (proj && proj.length > 0) {\n const rels = proj.map((abs: string) => {\n const base = path.parse(abs).base;\n uniqueProjectileFiles.add(base);\n return `projectiles/${base}`;\n });\n idToProjectiles[result.gotchi.id] = rels;\n }\n } else {\n failCount++;\n failedGotchis.push({\n id: result.gotchi.id,\n attributes: result.gotchi.attributes,\n error: result.error,\n details: result.details || {},\n });\n }\n });\n\n console.log(\n `Batch ${batchNum} complete: ${\n batchResults.filter((r) => r.success).length\n } succeeded, ${batchResults.filter((r) => !r.success).length} failed`\n );\n }\n\n console.log(\"\\n\" + \"=\".repeat(50));\n console.log(\"Processing complete!\");\n console.log(`Successfully generated: ${successCount} spritesheets`);\n console.log(`Failed: ${failCount}`);\n console.log(`Output saved to: ${outputFolder}/`);\n\n if (failedGotchis.length > 0) {\n const failedLogPath = \"failed_gotchis.json\";\n fs.writeFileSync(failedLogPath, JSON.stringify(failedGotchis, null, 2));\n console.log(`\\nFailed gotchis logged to: ${failedLogPath}`);\n console.log(\"Failed IDs:\", failedGotchis.map((g) => g.id).join(\", \"));\n }\n\n if (allMissingLayers.length > 0) {\n const missingByItem: Record<\n string,\n { layer: string; count: number; gotchiIds: number[] }\n > = {};\n allMissingLayers.forEach((item) => {\n if (!missingByItem[item.missingLayer]) {\n missingByItem[item.missingLayer] = {\n layer: item.missingLayer,\n count: 0,\n gotchiIds: [],\n };\n }\n missingByItem[item.missingLayer].count++;\n missingByItem[item.missingLayer].gotchiIds.push(item.gotchiId);\n });\n\n const missingLayersSummary = Object.values(missingByItem).sort(\n (a, b) => b.count - a.count\n );\n\n const missingLayersLog = {\n totalMissing: allMissingLayers.length,\n uniqueMissingLayers: missingLayersSummary.length,\n summary: missingLayersSummary,\n detailed: allMissingLayers,\n };\n\n const missingLogPath = \"missing_layers.json\";\n fs.writeFileSync(missingLogPath, JSON.stringify(missingLayersLog, null, 2));\n console.log(`\\nMissing layers logged to: ${missingLogPath}`);\n console.log(`Total missing layer instances: ${allMissingLayers.length}`);\n console.log(`Unique missing layers: ${missingLayersSummary.length}`);\n\n console.log(\"\\nTop missing layers:\");\n missingLayersSummary.slice(0, 5).forEach((item) => {\n console.log(` - ${item.layer} (${item.count} gotchis)`);\n });\n }\n\n try {\n // Ensure unique projectile assets are available under website/projectiles\n const websiteRoot = path.dirname(outputFolder); // website/\n const projectilesOutDir = path.join(websiteRoot, \"projectiles\");\n if (!fs.existsSync(projectilesOutDir))\n fs.mkdirSync(projectilesOutDir, { recursive: true });\n uniqueProjectileFiles.forEach((fileName) => {\n // Source under Trait Files/Sprites/projectiles\n const srcPath = path.join(\n \"Trait Files\",\n \"Sprites\",\n \"projectiles\",\n fileName\n );\n if (fs.existsSync(srcPath)) {\n const destPath = path.join(projectilesOutDir, fileName);\n try {\n fs.copyFileSync(srcPath, destPath);\n } catch {}\n }\n });\n\n const outputFiles = fs.readdirSync(outputFolder);\n const spriteList = outputFiles\n .filter((fileName) => fileName.toLowerCase().endsWith(\".png\"))\n .map((fileName) => path.parse(fileName).name)\n .filter((baseName) => /^\\d+$/.test(baseName))\n .map((baseName) => {\n const id = parseInt(baseName, 10);\n return {\n id,\n path: `spritesheets/${baseName}.png`,\n projectiles: idToProjectiles[id] || [],\n };\n })\n .sort((a, b) => a.id - b.id);\n\n const listPath = path.join(outputFolder, \"list.json\");\n fs.writeFileSync(listPath, JSON.stringify(spriteList, null, 2));\n console.log(`\\nSprite list written to: ${listPath}`);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n console.log(`\\nWarning: Failed to write sprite list: ${message}`);\n }\n}\n\n// Execute only when run directly via tsx/node\nif (import.meta.url === `file://${process.argv[1]}`) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n main().catch((error) => {\n console.error(\"Error:\", error);\n process.exit(1);\n });\n}\n\nexport { generateSpritesheet };\n","import path from \"path\";\nimport { fileURLToPath } from \"url\";\nexport { generateSpritesheet } from \"./generate_spritesheets.js\";\nexport type {\n Gotchi,\n GotchiAttribute,\n Config,\n ConfigProperty,\n ConditionKV,\n ConditionSet,\n GenerationResult,\n GenerationDetails,\n} from \"./types.js\";\nexport function getPackageBasePath(): string {\n const distDirectoryPath = path.dirname(fileURLToPath(import.meta.url));\n return path.resolve(distDirectoryPath, \"..\");\n}\n"]}
|
package/package.json
CHANGED
|
File without changes
|
|
File without changes
|
/package/Trait Files/Sprites/meleebody/Wearable (Head)/{Gentelmen Hat.png → Gentleman Hat.png}
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/Trait Files/Sprites/meleegunbody/Wearable (Head)/{Gentelmen Hat.png → Gentleman Hat.png}
RENAMED
|
File without changes
|
/package/Trait Files/Sprites/projectiles/{Legendary Wizard Stuff.png → Legendary Wizard Staff.png}
RENAMED
|
File without changes
|
/package/Trait Files/Sprites/punchbody/Wearable (Head)/{Gentelmen Hat.png → Gentleman Hat.png}
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/Trait Files/Sprites/punchgunbody/Wearable (Head)/{Gentelmen Hat.png → Gentleman Hat.png}
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/Trait Files/Sprites/wandbody/Wearable (Head)/{Gentelmen Hat.png → Gentleman Hat.png}
RENAMED
|
File without changes
|