"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;yMath.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.loms=bake(["...W...","..KWK..",".KOOOK.","KKOOOKK","..KOK..","..KOK..","...K..."],{K:"#26160d",W:"#fff4d9",O:"#ff8a2e"}); // 巡飞弹:白尖橙体+翼横杆(与msl2/cmsl/amsl区分) 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"}); // 星云绽放的小星星 /* ---- 新增武器与治疗精灵 ---- */ SPR.beegrenade=bake(["..KK..",".KYYK.","KYBBYK","KYYBYK",".KBBK.","..KK.."],{K:"#33240a",Y:"#ffd23d",B:"#5a4a1a"}); // 蜜蜂手雷:黄黑条纹球 SPR.bee=bake([".K.","KYK","KKK",".K."],{K:"#1a1a1a",Y:"#ffd23d"}); // 追踪蜜蜂 SPR.chloro=bake(["...K...","..KLK..",".KLW LK".replace(" ",""),"..KLK..","...K..."],{K:"#0d2a0d",L:"#5cff9d",W:"#eafff0"}); // 叶绿弹:翠绿叶形 SPR.healcross=bake(["..G..",".GGG.","GGGGG",".GGG.","..G.."],{G:"#5cff9d"}); // 治疗绿十字 /* 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") };