starraid/js/sprites.js

197 lines
17 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"use strict";
/* ================= 像素精灵工坊 ================= */
function bake(rows,pal,scale){
const w=Math.max(...rows.map(r=>r.length)),h=rows.length,s=scale||1;
const c=document.createElement("canvas");c.width=w*s;c.height=h*s;
const g=c.getContext("2d");
for(let y=0;y<h;y++){const row=rows[y];
for(let x=0;x<row.length;x++){const ch=row[x];
if(ch==="."||ch===" ")continue;const col=pal[ch];if(!col)continue;
g.fillStyle=col;g.fillRect(x*s,y*s,s,s);}}
return c;
}
const SPR={};
/* ---- 5 架战机(各有独立造型) ---- */
SPR.ship0=bake([
"......K......",".....KWK.....",".....KWK.....",".....KCK.....",
"....KWWWK....","....KRCRK....","...KWRRRWK...","..KWKRDRKWK..",
"..KWRRRRRWK..",".KWKRRRRRKWK.",".KRRKWWWKRRK.","KKRDKWKWKDRKK",
"KD..KWKWK..DK","K...KOKOK...K","....KOKOK...."],
{K:"#14142b",W:"#f2f0e6",C:"#43e8ff",R:"#e0393e",D:"#8f1d2c",O:"#ff9a3d"});
SPR.ship1=bake([
".......K.......","......KPK......",".....KPPPK.....",".....KPCPK.....",
"....KPCCCPK....","...KPPCPPCPK...","..KPPCPPPPCPK..",".KPCKPPPPPKCPK.",
"KPPKPPPPPPPKPPK","KPKPPKPPPPKPPKK","KK.PPKPPPKPP.KK","K..KPKKPKKPK..K",
"...KO..K..OK...","....O.....O...."],
{K:"#12102a",P:"#7b4fd0",C:"#43e8ff",O:"#41e6ff"});
SPR.ship2=bake([
"...KK.....KK...","..KBBK...KBBK..","..KBBK...KBBK..",".KBBBK...KBBBK.",
".KBWBBK.KBBWBK.","KBBBBBK.KBBBBBK","KBCBBBK.KBBBCBK","KBBBBBK.KBBBBBK",
".KBBBKBBBKBBBK.","..KBBBBBBBBBK..","..KBOBBBBBOBK..","...KBBBXBBBK...",
"...KOXXKXXOK...","....KOOOOOK....",".....KK.KK....."],
{K:"#101a12",B:"#3f8f5f",W:"#d8f0e0",C:"#ffd23d",X:"#ff9a3d",O:"#ff9a3d"});
SPR.ship3=bake([
"......K......",".....KVK.....","....KVVVK....","....KVWVK....",
"....KVCVK....","...KVVWCVK...","..KVVKVWKVVK..",".KVKKVVVVVKVK.",
"KVK.KVWCVK.VK","KV..KVVVVVK..VK","K..KVKWKVK..K","...KOKWKWKOK...",
"....KOKKKOK....",".....KOKOK.....","......KO......."],
{K:"#241a08",V:"#e8c25a",W:"#fff6e0",C:"#ff6b9d",O:"#ffb84d"});
SPR.ship4=bake([
".......K.......","......KAK......",".....KAAAK.....",".....KACAK.....",
"....KAACAAK....","...KAACCCAAK...","..KAACAAACAAK..",".KAAKAAAAAKAAK.",
"KAAKAAAAAAAKAAK","KAKAAKAAAKAAKAK","KAAK.KAAAK.KAAK","KA..KAKAKAK..AK",
"K..KOAKAKAOK..K","...KO..K..OK...",".....O...O....."],
{K:"#0d0d14",A:"#3a3f5c",C:"#ff3355",O:"#ff5566"});
/* ---- 敌机(面朝下) ---- */
const EPAL={
scout:{K:"#0d1a1a",T:"#2fa8a0",W:"#c8fff4",D:"#14655f"},
weaver:{K:"#1a0d1a",M:"#c44fd0",W:"#ffd6f4",D:"#6e2a78"},
gunship:{K:"#141410",S:"#8c9a5b",W:"#eef0d0",X:"#ff9a3d",D:"#4a5428"},
kami:{K:"#1a0d0d",R:"#e0393e",Q:"#ffd23d",W:"#ffe9c8"},
mine:{K:"#101418",G:"#7a8a96",W:"#e8f0f8",R:"#ff5566"},
split:{K:"#160d1a",P:"#b05ce8",W:"#f0d6ff",D:"#5c2a80"},
sniper:{K:"#0d141a",S:"#4f7ab0",C:"#43e8ff",W:"#d0ecff"},
rock:{K:"#141210",G:"#7a7268",D:"#4a443c"}
};
SPR.scout=bake(["...KKKK...","..KTTTTK..",".KTTKKTTK.",".KTKTTKTK.","KTTTTTTTTK","KWKTTTTKWK",".K.KTTK.K.","...KDDK...","....KK...."],EPAL.scout);
SPR.weaver=bake(["....KKKK....","..KKMMMMKK..",".KMMKMMKMMK.","KMMKMMMMKMMK","KMKMMMMMMKMK","KMMMMKKMMMMK",".KMMKMMKMMK.","..KM.MM.MK..","...KMMMMK...","....KKKK...."],EPAL.weaver);
SPR.gunship=bake(["......KKKK......",".....KSSSSK.....","....KSSSSSSK....","...KSSKSSKSSK...","..KSSSSSSSSSSK..",".KSKSSSSSSSSKSK.",".KSSKSKSSKSKSSK.","KSSSSSSSSSSSSSSK","KSKSSKSSSSKSSKSK","KSSSKSKSSKSKSSSK",".KSKSSKSSKSSKSK.","..KK.KSXXSK.KK..",".....KSXXSK.....","......KKKK......"],EPAL.gunship);
SPR.kami=bake(["....KK....","...KRRK...","..KRRRRK..","..KRQQRK..",".KRRQQRRK.",".KRQQQQRK.","KRRQQQQRRK","K.RQQQQR.K","..KRRRRK..","...KKKK..."],EPAL.kami);
SPR.mine=bake(["...K..K...","....KK....","..KGGGGK..",".KGGGGGGK.","KKGKGGKGKK","KGGGGGGGGK",".KGGGGGGK.","..KGGGGK..","....KK....","...K..K..."],EPAL.mine);
SPR.split=bake(["....KKKK....","..KKPPPPKK..",".KPPKPPKPPK.","KPPPPPPPPPPK","KPKPPKKPPKPK","KPPPKPPKPPPK",".KPPPPPPPPK.","..KPKPPKPK..","...KPPPPK...","....KKKK...."],EPAL.split);
SPR.mini=bake([".KKKK.","KPPPPK","PKPPKP","KPPPPK",".KPPK.","..KK.."],EPAL.split);
SPR.sniper=bake([".....KK.....","....KSSK....","...KSSSSK...","..KSKSSKSK..","..KSSCCSSK..",".KSSSCCSSSK.","KSKSSCCSSKSK","KSSSKSSKSSSK",".KSK.KK.KSK.","..K..KK..K..","..K.K..K.K..",".....KK....."],EPAL.sniper);
SPR.rock=bake(["....KKKK....","..KKGGGGKK..",".KGGDGGGGGK.","KGGGGDGGGGGK","KGDGGGGGGDGK","KGGGGDDGGGGK","KGGDGGGGGGGK",".KGGGGGGDGK.","..KKGGGGKK..","....KKKK...."],EPAL.rock);
/* ---- 泰伦虫族(母舰召唤物) ---- */
SPR.gaunt=bake(["....KKKKK..","...KSSSSSK.","..KSSSSSSSK","..KSFFGGFSK",".KWSFFFFSWK",".K.KFFFFFK.","..KFFTFFFK.","...KFFFFFK.","....KFFFK..",".....KTK...","......K...."],{K:"#14101c",S:"#5a6a32",F:"#b87a6a",W:"#e8dcc0",G:"#a8ff5c",T:"#e8dcc0"}); // 刀虫:近战扑击
SPR.boomer=bake(["..KKK..",".KGGGK.","KGLLLGK","KGLCLGK","KGLLLGK",".KGGGK.","..KKK..","...K..."],{K:"#0d1a0d",G:"#4a6a3a",L:"#a8ff5c",C:"#e8ffd0"}); // 爆虫:冲锋自爆
SPR.sporeT=bake(["...KKK...","..KGGGK..",".KGLGLGK.","KGGLLLGGK","KGLGGGLGK","KGGGCGGGK",".KGGGGGK.","..K.G.K..","...K.K..."],{K:"#0d1a0d",G:"#4a6a3a",L:"#a8ff5c",C:"#e8ffd0"}); // 孢子囊:慢飘,死亡酸环
SPR.ripper=bake([".KKKK.","KFFFFK","KFGFFK","KFFFFK",".KWWK.","..KK.."],{K:"#14101c",F:"#b87a6a",G:"#a8ff5c",W:"#e8dcc0"}); // 撕裂虫:微小快速
SPR.spitter=bake(["...KKK...","..KSSSK..",".KSSSSSK.",".KSFGFSK.","KSSFFFSSK","K.SLLLS.K",".K.SLS.K.","..K.S.K..","...KKK..."],{K:"#14101c",S:"#5a6a32",F:"#b87a6a",G:"#a8ff5c",L:"#7dff8a"}); // 吐酸虫:远程散弹
SPR.spinegun=bake(["....K....","...KWK...","..KWWWK..","..KSSSK..",".KSSSSSK.",".KSFGFSK.","KSSFFFSSK",".KSKSKSK.","..KWWWK..","...KKK..."],{K:"#14101c",S:"#5a6a32",F:"#b87a6a",G:"#a8ff5c",W:"#e8dcc0"}); // 棘枪虫:骨钉直线
SPR.spikeB=bake([".W.","WKW","WKW","WKW","WKW","WKW",".W."],{K:"#3a2f26",W:"#e8dcc0"}); // 骨钉弹
/* 精英变体:保留明暗的金化调色 */
function goldify(pal){
const o={};
for(const k in pal){
if(k==="K"){o[k]="#2a1f00";continue;}
const c=pal[k],r=parseInt(c.slice(1,3),16),g=parseInt(c.slice(3,5),16),b=parseInt(c.slice(5,7),16);
const l=Math.min(1,0.3+(0.3*r+0.6*g+0.1*b)/255*0.85);
const mix=(a,h)=>Math.round(a+(h-a)*l);
o[k]=`rgb(${mix(94,255)},${mix(64,232)},${mix(10,150)})`;
}
return o;
}
SPR.e_scout=bake(["...KKKK...","..KTTTTK..",".KTTKKTTK.",".KTKTTKTK.","KTTTTTTTTK","KWKTTTTKWK",".K.KTTK.K.","...KDDK...","....KK...."],goldify(EPAL.scout));
SPR.e_weaver=bake(["....KKKK....","..KKMMMMKK..",".KMMKMMKMMK.","KMMKMMMMKMMK","KMKMMMMMMKMK","KMMMMKKMMMMK",".KMMKMMKMMK.","..KM.MM.MK..","...KMMMMK...","....KKKK...."],goldify(EPAL.weaver));
SPR.e_gunship=bake(["......KKKK......",".....KSSSSK.....","....KSSSSSSK....","...KSSKSSKSSK...","..KSSSSSSSSSSK..",".KSKSSSSSSSSKSK.",".KSSKSKSSKSKSSK.","KSSSSSSSSSSSSSSK","KSKSSKSSSSKSSKSK","KSSSKSKSSKSKSSSK",".KSKSSKSSKSSKSK.","..KK.KSXXSK.KK..",".....KSXXSK.....","......KKKK......"],goldify(EPAL.gunship));
SPR.e_kami=bake(["....KK....","...KRRK...","..KRRRRK..","..KRQQRK..",".KRRQQRRK.",".KRQQQQRK.","KRRQQQQRRK","K.RQQQQR.K","..KRRRRK..","...KKKK..."],goldify(EPAL.kami));
SPR.e_split=bake(["....KKKK....","..KKPPPPKK..",".KPPKPPKPPK.","KPPPPPPPPPPK","KPKPPKKPPKPK","KPPPKPPKPPPK",".KPPPPPPPPK.","..KPKPPKPK..","...KPPPPK...","....KKKK...."],goldify(EPAL.split));
SPR.e_sniper=bake([".....KK.....","....KSSK....","...KSSSSK...","..KSKSSKSK..","..KSSCCSSK..",".KSSSCCSSSK.","KSKSSCCSSKSK","KSSSKSSKSSSK",".KSK.KK.KSK.","..K..KK..K..","..K.K..K.K..",".....KK....."],goldify(EPAL.sniper));
SPR.e_mine=bake(["...K..K...","....KK....","..KGGGGK..",".KGGGGGGK.","KKGKGGKGKK","KGGGGGGGGK",".KGGGGGGK.","..KGGGGK..","....KK....","...K..K..."],goldify(EPAL.mine));
SPR.e_splitter=bake(["....KKKK....","..KKPPPPKK..",".KPPKPPKPPK.","KPPPPPPPPPPK","KPKPPKKPPKPK","KPPPKPPKPPPK",".KPPPPPPPPK.","..KPKPPKPK..","...KPPPPK...","....KKKK...."],goldify(EPAL.split));
/* ---- 弹幕 / 道具 ---- */
SPR.msl=bake(["..K..",".KWK.","KWWWK","KWKWK",".KKK."],{K:"#14142b",W:"#c8d8ff"});
SPR.blade=bake(["...K...","..KCK..",".KCCCK.","KCCXCCK",".KCCCK.","..KCK..","...K..."],{K:"#0d2a1a",C:"#5cff9d",X:"#eafff0"});
/* 9×9 圆弹H=半透明圆形光晕 C=彩色外壳 W=白芯 */
function orb(c1,c2){
const halo=c2.length===7?c2+"40":c2;
return bake([
"...HHH...",
".HHCCCHH.",
".HCCWCCH.",
"HCCCCCCCH",
"HCWWWWWCH",
"HCCCCCCCH",
".HCCWCCH.",
".HHCCCHH.",
"...HHH..."],{H:halo,W:"#ffffff",C:c2});
}
const BHALO={orbR:"#ff5566",orbP:"#b05ce8",orbG:"#5cff9d",orbO:"#ff9a3d",dartB:"#3a8cd8",flowr:"#ff8fc8",dartS:"#5ec4ff",dartP:"#b98cff",shardB:"#5cff9d",spikeB:"#e8dcc0"};
SPR.dartB=bake(["KCCCK",".CCC.",".CWC.","..C.."],{K:"#0d2433",C:"#3a8cd8",W:"#cfeaff"}); // 蓝色锥形敌弹Boss弹幕
SPR.flowr=bake([
"....P....",".P..P..P.","..PPPPP..",".PPWWWPP.","PPPWWWPPP",
".PPWWWPP.","..PPPPP..",".P..P..P.","....P...."],
{P:"#ff8fc8",W:"#ffffff"}); // 太空原种:花弹(圆形八刺,会逐渐变大)
SPR.dartS=bake(["CC","CC","CC","CC","CC","CC","CC","CC","CC","CC","WW","WW"],
{W:"#f2fbff",C:"#5ec4ff"}); // 夺权者X蓝白细长钉2×12白尖朝运动方向
SPR.dartP=bake(["KPPPK",".PPP.",".PWP.","..P.."],{K:"#2a1040",P:"#b98cff",W:"#ead9ff"}); // 暗黑魔碟:紫锥弹
SPR.shardB=bake([".K.","KSK","KSK","KWK",".K."],{K:"#1a2436",S:"#46587a",W:"#5cff9d"}); // 黑石要塞:黑石碎片(绿芯,按飞行方向偏转)
SPR.orbR=orb("#ffe9e9","#ff5566");SPR.orbP=orb("#f4e9ff","#b05ce8");
SPR.orbG=orb("#e9ffe9","#5cff9d");SPR.orbO=orb("#fff4d9","#ff9a3d");
SPR.plasma=orb("#e9f8ff","#43b8ff");
SPR.gem=bake(["..KK..",".KCCK.","KCWWCK","KCCCCK",".KCCK.","..KK.."],{K:"#0d2a33",C:"#43e8ff",W:"#eaffff"});
SPR.coin=bake([".KKKK.","KYWWYK","KWYYWK","KYWYYK","KYYYYK",".KKKK."],{K:"#33240a",Y:"#ffcf5c",W:"#fff4d9"});
SPR.heart=bake([".KK.KK.","KRRKRRK","KRRRRRK",".KRRRK.","..KRK..","...K..."],{K:"#330d14",R:"#ff5566"});
SPR.bombp=bake(["...K...","..KOK..",".KKKKK.","KBBBBBK","KBBWBBK","KBBBBBK",".KKKKK."],{K:"#14142b",B:"#4a5a8c",W:"#dfe8ff",O:"#ff9a3d"});
SPR.odc=bake(["..KK..",".KOOK.","KOWWOK","KOWOOK",".KOOK.","..KK.."],{K:"#33240a",O:"#ff9a3d",W:"#fff4d9"});
/* ---- 新武器弹体 / 僚机精灵 ---- */
SPR.cres=bake(["..KKK...",".KCCCK..","KCCK....","KCK.....","KCK.....","KCCK....",".KCCCK..","..KKK..."],{K:"#0d2a1a",C:"#5cff9d"});
SPR.fiss=bake(["..KK..",".KGGK.","KGWWGK","KGGGGK",".KGGK.","..KK.."],{K:"#0d2a0d",G:"#5cff9d",W:"#eafff0"});
SPR.frost=bake(["..K..",".KCK.","KCWCK","KCCCK",".KCK.","..K.."],{K:"#0d2433",C:"#7fd8ff",W:"#ffffff"});
SPR.sat=bake(["..KKK..",".KCCCK.","KCCWCCK","KCW WC K".replace(" ",""),"KCCWCCK",".KCCCK.","..KKK.."],{K:"#0d2433",C:"#43e8ff",W:"#ffffff"});
SPR.bot=bake(["..K..",".KGK.","KGWGK",".KGK.","..K.."],{K:"#0d2a0d",G:"#5cff9d",W:"#eafff0"});
SPR.ndl=bake([".K.","KCK","KWK","KCK","KCK","KCK",".K."],{K:"#142a0d",C:"#9dff5c",W:"#f0ffe0"});
SPR.bub=bake(["...KKK...",".KKBBBK K".replace(" ",""),"KBBBWBBBK","KBWWWWBBK","KBWWBWBBK","KBBBBBBBK",".KKBBBK K".replace(" ",""),"...KKK..."],{K:"#0d2433",B:"#3a8cd8",W:"#cfeaff"});
SPR.met=bake(["..KK..",".KOOK.","KOOOOK","KOWOOK",".KOOK.","..KK..","...K..."],{K:"#331d0a",O:"#ff9a3d",W:"#ffd23d"});
SPR.boomer=bake(["K...K","KPKPK",".PPP.","..K.."],{K:"#1a0d26",P:"#c86bff"}); // 亮紫回旋镖,清晰可辨
SPR.sing=bake(["..KKK..",".KPPPK.","KPXXXP K".replace(" ",""),"KPXXXP K".replace(" ",""),"KPPPPPK",".KPPPK.","..KKK.."],{K:"#140d1a",P:"#7b2fd0",X:"#0d0514"});
SPR.waveb=bake(["....K....","..K.C.K..","K.C.C.C.K","..K.C.K..","....K...."],{K:"#0d1a33",C:"#43b8ff"});
SPR.holyo=bake(["..KKK..",".KYWYK.","KYW W YK".replace(/ /g,""),"KYW W YK".replace(/ /g,""),".KYWYK.","..KKK.."],{K:"#33240a",Y:"#ffcf5c",W:"#fff4d9"});
SPR.thnd=bake(["..KK",".KWK","KWK.","KWK.",".KWK",".KK.","..K."],{K:"#33240a",W:"#ffe95c"});
SPR.grv=bake(["..KKK..",".K...K.","K..P..K","K.PXP.K" ,"K..P..K",".K...K.","..KKK.."],{K:"#1a0d2a",P:"#b05ce8",X:"#2a0d3a"});
/* ---- 辨识度重设计:新弹体精灵 ---- */
SPR.trcr=bake([".K.","KYK","KYK","KWK","KYK","KYK",".K."],{K:"#33240a",Y:"#ffcf5c",W:"#fff4d9"}); // 火神金色曳光弹
SPR.pelt=bake(["KOOK","OWWO","OWWO","KOOK"],{K:"#331d0a",O:"#ff9a3d",W:"#fff4d9"}); // 霰弹炽热弹丸
SPR.shard=bake(["K..C..","KCCKC.","KCWCKK","KCCCK.","K..C.."],{K:"#0d2433",C:"#7fd8ff",W:"#ffffff"}); // 冰晶霰屑
SPR.icelance=bake(["...K...","..KCK..","..KCK..",".KCWK.",".KCCK.",".KCCK.","..KCK..","..KCK..","...K..."],{K:"#0d2433",C:"#7fd8ff",W:"#ffffff"}); // 贯穿冰枪
SPR.msl2=bake(["..K..",".KYK.","KYGYK","KYGYK",".KGK.","K.K.K"],{K:"#2a240d",Y:"#ffe95c",G:"#8ca86a"}); // 蜂巢小导弹
SPR.amsl=bake(["...K...","..KRK..",".KRRRK.","KRWRKRK",".KRRRK.",".KRRRK.","K.KRK.K"],{K:"#241a08",R:"#e0763e",W:"#fff4d9"}); // 空爆重型导弹
SPR.cmsl=bake(["...KK...","..KRRK..",".KRRRRK.","KRWRRWRK",".KRRRRK.",".KRRRRK.","..KRRK..",".K.KK.K."],{K:"#1a0d0d",R:"#e0393e",W:"#ffd23d"}); // 斩首巡航导弹
SPR.broad=bake([".KKK.","KBBBK","KBWBK","KBBBK",".KKK."],{K:"#241a08",B:"#c8923e",W:"#fff4d9"}); // 侧舷炮弹
SPR.flare=bake(["..KK..",".KWWK.","KWWWWK","KWWWWK",".KWWK.","..KK.."],{K:"#33240a",W:"#ffd23d"}); // 热诱弹
SPR.sticky=bake([".KKKK.","KGKKGK","KGRRGK","KGRRGK","KGKKGK",".KKKK."],{K:"#142a0d",G:"#5cff9d",R:"#ff5566"}); // 粘着炸弹
/* ---- 新武器弹体精灵(差异化造型) ---- */
SPR.shuri=bake(["...K...","..KCK..",".KCCK..","KCCWCCK","..KCCK.","..KCK..","...K..."],{K:"#0d2433",C:"#41e6ff",W:"#ffffff"}); // 电弧手里剑:青白四芒星
SPR.voltb=bake([".K.","KGK","GWG","KGK","KGK",".K."],{K:"#142a0d",G:"#b8ff3d",W:"#ffffff"}); // 电能弹:荧光绿+白电纹
SPR.dawnsh=bake(["...K...","..KRK..",".KRRRK.","KRWRKRK",".KRRRK.",".KRRRK.","K.KRK.K"],{K:"#241a08",R:"#e0393e",W:"#fff4d9"}); // 黎明重炮弹:炽红重壳
SPR.protb=bake([".K.","KCK","KWK","KCK","KCK","KCK",".K."],{K:"#140a0a",C:"#ff4a1f",W:"#ffc64a"}); // 协议速射弹:黑红橙
SPR.protoh=orb(null,"#ff5a2e"); // 协议重炮弹:黑壳橙芯大能量球
SPR.neb=orb(null,"#8a5cff"); // 星云奥秘:紫蓝奥术球
SPR.star4=bake(["..K..","..K..","KKBKK","..K..","..K.."],{K:"#e0b3ff",B:"#ffffff"}); // 星云绽放的小星星
/* 12 种僚机 */
SPR.dGun=bake(["...K...","..KWK..",".KWWWK.","KWKWKWK","..KWK.."],{K:"#14142b",W:"#c8d8ff"});
SPR.dGun2=bake(["K..K..K","KKK.KKK",".KWKWK.","..KWK..","...K..."],{K:"#14142b",W:"#9fd8ff"});
SPR.dSnip=bake(["..K..",".KWK.",".KCK.",".KWK.","KWKWK"],{K:"#0d2433",W:"#c8d8ff",C:"#43e8ff"});
SPR.dBeam=bake([".KKKKK.","KCCCCCK","KCW K WCK".replace(/ /g,""),"KCCCCCK",".KKKKK."],{K:"#2a0d1a",C:"#ff6b9d",W:"#fff"});
SPR.dBomb=bake(["..KKK..",".KO O K.".replace(/ /g,""),"KOOOOOK","KOOOWOK",".KKKKK."],{K:"#241a08",O:"#ff9a3d",W:"#fff4d9"});
SPR.dFrost=bake(["...K...","..KCK..",".KCCK.","KCCWCK.",".KCCK.","..KCK..","...K..."],{K:"#0d2433",C:"#7fd8ff",W:"#fff"});
SPR.dTesla=bake(["..KK...",".KWWK..","KWK....",".KWK...","..KWK..","...KK.."],{K:"#33240a",W:"#ffe95c"});
SPR.dRam=bake(["...K...","..KRK..",".KRRRK.","KRRRRRK",".KRRRK.","..KRK..","...K..."],{K:"#1a0d0d",R:"#e0393e"});
SPR.dHeal=bake(["..KKK..",".KGGGK.","KGWGWGK","KGGGGGK",".KGGGK.","..KKK.."],{K:"#0d2a1a",G:"#3f8f5f",W:"#eafff0"});
SPR.dShield=bake([".KKKKK.","KCCBCCK","KCBKBCK","KCCBCCK",".KKKKK."],{K:"#0d2433",C:"#43e8ff",B:"#1a5a8c"});
SPR.dMsl=bake(["..KKK..",".KWWWK.","KWKWKWK",".KWWWK.","..KKK.."],{K:"#14142b",W:"#ffb84d"});
SPR.dBlade=bake(["K..K..K",".K.K.K.","..KKK..",".K.K.K.","K..K..K"],{K:"#0d2a1a",W:"#5cff9d"});
SPR.dSweep=bake(["K.K.K.K","KWKWKWK",".KWWWK.","..KWK..","...K..."],{K:"#1a1206",W:"#ffb03d"}); // 扫射僚机:横排多炮管
SPR.swep=bake([".W.","WCW","WCW",".K."],{K:"#331d0a",W:"#ffd23d",C:"#ff9a3d"}); // 扫射弹:金黄弹丸
/* ---- 升级卡片图标8×8 单色) ---- */
function icon(rows,color){return bake(rows,{X:color});}
const ICONS={
gun:icon(["X..X..X.","X..X..X.","XX.XX.XX","XX.XX.XX",".X.X.X..",".X.X.X..","........","........"],"#7fd8ff"),
spread:icon(["X..X..X.","X..X..X.",".X.X.X..",".X.X.X..","..XXX...","..XXX...","...X....","...X...."],"#ffb84d"),
beam:icon(["...XX...","...XX...","...XX...","...XX...","...XX...","...XX...","...XX...","...XX..."],"#43e8ff"),
pulse:icon(["..X..X..",".X..X..X","X..X..X.",".X..X..X","..X..X..",".X..X..X","X..X..X.",".X..X..X"],"#5cff9d"),
rail:icon(["...XX...","..XXXX..",".XXXXXX.","...XX...","...XX...","...XX...","...XX...","...XX..."],"#b98cff"),
laser:icon(["...X....","...X....","..XXX...",".XXXXX.","..XXX...","...X....","...X....","...X...."],"#ff6b9d"),
chain:icon(["....XX..","...XX...","..XX....","..XXXX..","...XX...","..XX....",".XX.....","XX......"],"#ffe95c"),
fire:icon(["..X.X...",".X.X.X..","X.X.X.X.","..X.X...",".X.X.X..","X.X.X.X.","........","........"],"#ff9a3d"),
crit:icon(["X..XX..X",".X.XX.X.","..XXXX..","XXXXXXXX","XXXXXXXX","..XXXX..",".X.XX.X.","X..XX..X"],"#ff5566"),
ghost:icon(["..XXXX..",".XXXXXX.","XX.XX.XX","XXXXXXXX","XXXXXXXX","X.XXXX.X","..X..X..","........"],"#c8d8ff"),
shield:icon([".XXXXXX.","XXXXXXXX","XXXXXXXX","XXXXXXXX",".XXXXXX.","..XXXX..","...XX...","........"],"#43e8ff"),
nano:icon(["...XX...","...XX...","...XX...","XXXXXXXX","XXXXXXXX","...XX...","...XX...","...XX..."],"#5cff9d"),
eng:icon(["XXXX....","..XXXX..","XXXX....","..XXXXXX","XXXX....","..XXXX..","XXXX....","........"],"#9fd8ff"),
mag:icon([".XX..XX.",".XX..XX.",".XX..XX.",".XX..XX.",".XXXXXX.","..XXXX..","........","........"],"#b98cff"),
drone:icon(["...XX...","..XXXX..",".XX.XXX.","XXXXXXXX","XXXXXXXX",".XX.XX..","..XXXX..","...XX..."],"#ffcf5c"),
flame:icon(["...X....","..XX....",".XX.X...",".XXXX...","XXXXXX..","X.XXX.X.",".XXXX...","..XX...."],"#ff9a3d")
};