From b1479b31ac6508e9e9618b8859337aa22ea38b15 Mon Sep 17 00:00:00 2001 From: troytt <47798984@qq.com> Date: Wed, 23 Sep 2026 07:03:17 +0000 Subject: [PATCH] fix(render): authentic Diablo II v1.13c ground items flippy sprites and clean pickup lifecycle - Extract and stitch all 213 Blizzard flp*.dc6 resting frames into items-atlas.png - Support all 4 flpgld gold pile size groups and color dye transforms - Implement resolveGroundItemSpriteRect() in src/ui/inventory.ts - Render authentic isometric ground art with contact shadow in drawGroundItem() - Eliminate synthetic blue boxes, 2D perspective shear hacks, and sparkle white dots - Fix engine pickup entity matching so picked items are cleanly removed with zero residual dots - Add tests/ground-items-flippy-parity.test.ts --- public/skills/icon_0.png | Bin 2914 -> 2809 bytes public/ui/icon_0.png | Bin 2914 -> 2809 bytes public/ui/items-atlas.png | Bin 406974 -> 443706 bytes public/ui/manifest.json | 3557 ++++++++++++++++++++- public/ui/skill-tree-tabs.png | Bin 33220 -> 33233 bytes scripts/pack-ui.ts | 150 +- scripts/png.ts | 197 +- src/game/engine.ts | 2 +- src/scene/act-scene.ts | 188 +- src/ui/baked-ui-meta.ts | 3559 +++++++++++++++++++++- src/ui/inventory.ts | 106 + tests/ground-items-flippy-parity.test.ts | 253 ++ 12 files changed, 7835 insertions(+), 177 deletions(-) create mode 100644 tests/ground-items-flippy-parity.test.ts diff --git a/public/skills/icon_0.png b/public/skills/icon_0.png index a141a92bb03e96f7c424d455d205aa4f3de6f3ed..ca65c842d65db01a51de18854bd091f3a38ceddb 100644 GIT binary patch delta 2004 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 diff --git a/public/ui/icon_0.png b/public/ui/icon_0.png index a141a92bb03e96f7c424d455d205aa4f3de6f3ed..ca65c842d65db01a51de18854bd091f3a38ceddb 100644 GIT binary patch delta 2004 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 diff --git a/public/ui/items-atlas.png b/public/ui/items-atlas.png index e1ef27bb184d14710329e42dba6b543383f8dfa0..28cef3344206fb07020a829aa69d1f42eb46654c 100644 GIT binary patch delta 61582 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%0DmI$yh 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 diff --git a/public/ui/manifest.json b/public/ui/manifest.json index b1add97..60ec79e 100644 --- a/public/ui/manifest.json +++ b/public/ui/manifest.json @@ -1,9 +1,9 @@ { "version": "1.13c", - "decodedDc6Count": 467, + "decodedDc6Count": 680, "dc6DecodeFailures": 0, "atlasWidth": 1024, - "atlasHeight": 1938, + "atlasHeight": 2145, "questsAtlasWidth": 432, "questsAtlasHeight": 774, "codeToInvFile": { @@ -1228,6 +1228,893 @@ "invvbl_blac": "invvbl_blac", "invlbl_blac": "invlbl_blac" }, + "codeToFlippyFile": { + "hax": "flphax", + "axe": "flpaxe", + "2ax": "flp2ax", + "mpi": "flpmpi", + "wax": "flpwax", + "lax": "flplax", + "bax": "flpbrx", + "btx": "flpbtx", + "gax": "flpgax", + "gix": "flpgix", + "wnd": "flpwnd", + "ywn": "flpywn", + "bwn": "flpbwn", + "gwn": "flpgwn", + "clb": "flpclb", + "scp": "flpscp", + "gsc": "flpgsc", + "wsp": "flpwsp", + "spc": "flpspc", + "mac": "flpmac", + "mst": "flpmst", + "fla": "flpfla", + "whm": "flpwhm", + "mau": "flpmau", + "gma": "flpgma", + "ssd": "flpssd", + "scm": "flpscm", + "sbr": "flpsbr", + "flc": "flpflc", + "crs": "flpcrs", + "bsd": "flpbsd", + "lsd": "flplsd", + "wsd": "flpwsd", + "2hs": "flp2hs", + "clm": "flpclm", + "gis": "flpgis", + "bsw": "flpbsw", + "flb": "flpflb", + "gsd": "flpgsd", + "dgr": "flpdgr", + "dir": "flpdir", + "kri": "flpkrs", + "bld": "flpbld", + "tkf": "flptkn", + "tax": "flptax", + "bkf": "flpbkf", + "bal": "flpbal", + "jav": "flpjav", + "pil": "flppil", + "ssp": "flpssp", + "glv": "flpglv", + "tsp": "flptsp", + "spr": "flpspr", + "tri": "flptri", + "brn": "flpbrn", + "spt": "flpspt", + "pik": "flppik", + "bar": "flpbar", + "vou": "flpvou", + "scy": "flpscy", + "pax": "flppax", + "hal": "flphal", + "wsc": "flpwsc", + "sst": "flpsst", + "lst": "flplst", + "cst": "flpcst", + "bst": "flpbst", + "wst": "flpwst", + "sbw": "flpsbw", + "hbw": "flphbw", + "lbw": "flplbw", + "cbw": "flpcbw", + "sbb": "flpsbb", + "lbb": "flplbb", + "swb": "flpswb", + "lwb": "flplwb", + "lxb": "flplxb", + "mxb": "flpmxb", + "hxb": "flphxb", + "rxb": "flprxb", + "gps": "flpgpl", + "ops": "flpopl", + "gpm": "flpgps", + "opm": "flpops", + "gpl": "flpgps", + "opl": "flpops", + "d33": "flpd33", + "g33": "flpg33", + "leg": "flpleg", + "hdm": "flphmr", + "hfh": "flphmr", + "hst": "flphst", + "msf": "flpmsf", + "9ha": "flphax", + "9ax": "flpaxe", + "92a": "flp2ax", + "9mp": "flpmpi", + "9wa": "flpwax", + "9la": "flplax", + "9ba": "flpbrx", + "9bt": "flpbtx", + "9ga": "flpgax", + "9gi": "flpgix", + "9wn": "flpwnd", + "9yw": "flpywn", + "9bw": "flpbwn", + "9gw": "flpgwn", + "9cl": "flpclb", + "9sc": "flpscp", + "9qs": "flpgsc", + "9ws": "flpwsp", + "9sp": "flpspc", + "9ma": "flpmac", + "9mt": "flpmst", + "9fl": "flpfla", + "9wh": "flpwhm", + "9m9": "flpmau", + "9gm": "flpgma", + "9ss": "flpssd", + "9sm": "flpscm", + "9sb": "flpsbr", + "9fc": "flpflc", + "9cr": "flpcrs", + "9bs": "flpbsd", + "9ls": "flplsd", + "9wd": "flpwsd", + "92h": "flp2hs", + "9cm": "flpclm", + "9gs": "flpgis", + "9b9": "flpbsw", + "9fb": "flpflb", + "9gd": "flpgsd", + "9dg": "flpdgr", + "9di": "flpdir", + "9kr": "flpkrs", + "9bl": "flpbld", + "9tk": "flptkn", + "9ta": "flptax", + "9bk": "flpbkf", + "9b8": "flpbal", + "9ja": "flpjav", + "9pi": "flppil", + "9s9": "flpssp", + "9gl": "flpglv", + "9ts": "flptsp", + "9sr": "flpspr", + "9tr": "flptri", + "9br": "flpbrn", + "9st": "flpspt", + "9p9": "flppik", + "9b7": "flpbar", + "9vo": "flpvou", + "9s8": "flpscy", + "9pa": "flppax", + "9h9": "flphal", + "9wc": "flpwsc", + "8ss": "flpsst", + "8ls": "flplst", + "8cs": "flpcst", + "8bs": "flpbst", + "8ws": "flpwst", + "8sb": "flpsbw", + "8hb": "flphbw", + "8lb": "flplbw", + "8cb": "flpcbw", + "8s8": "flpsbb", + "8l8": "flplbb", + "8sw": "flpswb", + "8lw": "flplwb", + "8lx": "flplxb", + "8mx": "flpmxb", + "8hx": "flphxb", + "8rx": "flprxb", + "qf1": "flpfla", + "qf2": "flpfla", + "ktr": "flpktr", + "wrb": "flpktr", + "axf": "flpaxf", + "ces": "flpaxf", + "clw": "flpclw", + "btl": "flpclw", + "skr": "flpskr", + "9ar": "flpktr", + "9wb": "flpktr", + "9xf": "flpaxf", + "9cs": "flpaxf", + "9lw": "flpclw", + "9tw": "flpclw", + "9qr": "flpskr", + "7ar": "flpktr", + "7wb": "flpktr", + "7xf": "flpaxf", + "7cs": "flpaxf", + "7lw": "flpclw", + "7tw": "flpclw", + "7qr": "flpskr", + "7ha": "flphax", + "7ax": "flpaxe", + "72a": "flp2ax", + "7mp": "flpmpi", + "7wa": "flpwax", + "7la": "flplax", + "7ba": "flpbrx", + "7bt": "flpbtx", + "7ga": "flpgax", + "7gi": "flpgix", + "7wn": "flpwnd", + "7yw": "flpywn", + "7bw": "flpbwn", + "7gw": "flpgwn", + "7cl": "flpclb", + "7sc": "flpscp", + "7qs": "flpgsc", + "7ws": "flpwsp", + "7sp": "flpspc", + "7ma": "flpmac", + "7mt": "flpmst", + "7fl": "flpfla", + "7wh": "flpwhm", + "7m7": "flpmau", + "7gm": "flpgma", + "7ss": "flpssd", + "7sm": "flpscm", + "7sb": "flpsbr", + "7fc": "flpflc", + "7cr": "flpcrs", + "7bs": "flpbsd", + "7ls": "flplsd", + "7wd": "flpwsd", + "72h": "flp2hs", + "7cm": "flpclm", + "7gs": "flpgis", + "7b7": "flpbsw", + "7fb": "flpflb", + "7gd": "flpgsd", + "7dg": "flpdgr", + "7di": "flpdir", + "7kr": "flpkrs", + "7bl": "flpbld", + "7tk": "flptkn", + "7ta": "flptax", + "7bk": "flpbkf", + "7b8": "flpbal", + "7ja": "flpjav", + "7pi": "flppil", + "7s7": "flpssp", + "7gl": "flpglv", + "7ts": "flptsp", + "7sr": "flpspr", + "7tr": "flptri", + "7br": "flpbrn", + "7st": "flpspt", + "7p7": "flppik", + "7o7": "flpbar", + "7vo": "flpvou", + "7s8": "flpscy", + "7pa": "flppax", + "7h7": "flphal", + "7wc": "flpwsc", + "6ss": "flpsst", + "6ls": "flplst", + "6cs": "flpcst", + "6bs": "flpbst", + "6ws": "flpwst", + "6sb": "flpsbw", + "6hb": "flphbw", + "6lb": "flplbw", + "6cb": "flpcbw", + "6s7": "flpsbb", + "6l7": "flplbb", + "6sw": "flpswb", + "6lw": "flplwb", + "6lx": "flplxb", + "6mx": "flpmxb", + "6hx": "flphxb", + "6rx": "flprxb", + "ob1": "flpob1", + "ob2": "flpob1", + "ob3": "flpob3", + "ob4": "flpob4", + "ob5": "flpob5", + "am1": "flpam1", + "am2": "flpam2", + "am3": "flpam3", + "am4": "flppik", + "am5": "flpam5", + "ob6": "flpob1", + "ob7": "flpob1", + "ob8": "flpob3", + "ob9": "flpob4", + "oba": "flpob5", + "am6": "flpam1", + "am7": "flpam2", + "am8": "flpam3", + "am9": "flppik", + "ama": "flpam5", + "obb": "flpob1", + "obc": "flpob1", + "obd": "flpob3", + "obe": "flpob4", + "obf": "flpob5", + "amb": "flpam1", + "amc": "flpam2", + "amd": "flpam3", + "ame": "flppik", + "amf": "flpam5", + "cap": "flpcap", + "skp": "flpskp", + "hlm": "flphlm", + "fhl": "flpfhl", + "ghm": "flpghm", + "crn": "flpcrn", + "msk": "flpmsk", + "qui": "flpqlt", + "lea": "flplea", + "hla": "flphla", + "stu": "flpstu", + "rng": "flprng", + "scl": "flpscl", + "chn": "flpchn", + "brs": "flpbrs", + "spl": "flpspl", + "plt": "flpplt", + "fld": "flpfld", + "gth": "flpgth", + "ful": "flpful", + "aar": "flpaar", + "ltp": "flpltp", + "buc": "flpbuc", + "sml": "flpsml", + "lrg": "flplrg", + "kit": "flpkit", + "tow": "flptow", + "gts": "flpgts", + "lgl": "flplgl", + "vgl": "flpvgl", + "mgl": "flpmgl", + "tgl": "flptgl", + "hgl": "flphgl", + "lbt": "flplbt", + "vbt": "flpvbt", + "mbt": "flpmbt", + "tbt": "flptbt", + "hbt": "flphbt", + "lbl": "flplbl", + "vbl": "flpvbl", + "mbl": "flpmbl", + "tbl": "flptbl", + "hbl": "flphbl", + "bhm": "flpbhm", + "bsh": "flpbsh", + "spk": "flpspk", + "xap": "flpcap", + "xkp": "flpskp", + "xlm": "flphlm", + "xhl": "flpfhl", + "xhm": "flpghm", + "xrn": "flpcrn", + "xsk": "flpmsk", + "xui": "flpqlt", + "xea": "flplea", + "xla": "flphla", + "xtu": "flpstu", + "xng": "flprng", + "xcl": "flpscl", + "xhn": "flpchn", + "xrs": "flpbrs", + "xpl": "flpspl", + "xlt": "flpplt", + "xld": "flpfld", + "xth": "flpgth", + "xul": "flpful", + "xar": "flpaar", + "xtp": "flpltp", + "xuc": "flpbuc", + "xml": "flpsml", + "xrg": "flplrg", + "xit": "flpkit", + "xow": "flptow", + "xts": "flpgts", + "xlg": "flplgl", + "xvg": "flpvgl", + "xmg": "flpmgl", + "xtg": "flptgl", + "xhg": "flphgl", + "xlb": "flplbt", + "xvb": "flpvbt", + "xmb": "flpmbt", + "xtb": "flptbt", + "xhb": "flphbt", + "zlb": "flplbl", + "zvb": "flpvbl", + "zmb": "flpmbl", + "ztb": "flptbl", + "zhb": "flphbl", + "xh9": "flpbhm", + "xsh": "flpbsh", + "xpk": "flpspk", + "dr1": "flpdr1", + "dr2": "flpdr4", + "dr3": "flpdr3", + "dr4": "flpdr4", + "dr5": "flpdr1", + "ba1": "flpba1", + "ba2": "flpba1", + "ba3": "flpba3", + "ba4": "flpba5", + "ba5": "flpba5", + "pa1": "flppa1", + "pa2": "flppa1", + "pa3": "flppa3", + "pa4": "flppa3", + "pa5": "flppa5", + "ne1": "flpne1", + "ne2": "flpne2", + "ne3": "flpne3", + "ne4": "flpne3", + "ne5": "flpne2", + "ci0": "flpci0", + "ci1": "flpci1", + "ci2": "flpci1", + "ci3": "flpci2", + "uap": "flpcap", + "ukp": "flpskp", + "ulm": "flphlm", + "uhl": "flpfhl", + "uhm": "flpghm", + "urn": "flpcrn", + "usk": "flpmsk", + "uui": "flpqlt", + "uea": "flplea", + "ula": "flphla", + "utu": "flpstu", + "ung": "flprng", + "ucl": "flpscl", + "uhn": "flpchn", + "urs": "flpbrs", + "upl": "flpspl", + "ult": "flpplt", + "uld": "flpfld", + "uth": "flpgth", + "uul": "flpful", + "uar": "flpaar", + "utp": "flpltp", + "uuc": "flpbuc", + "uml": "flpsml", + "urg": "flplrg", + "uit": "flpkit", + "uow": "flptow", + "uts": "flpgts", + "ulg": "flplgl", + "uvg": "flpvgl", + "umg": "flpmgl", + "utg": "flptgl", + "uhg": "flphgl", + "ulb": "flplbt", + "uvb": "flpvbt", + "umb": "flpmbt", + "utb": "flptbt", + "uhb": "flphbt", + "ulc": "flplbl", + "uvc": "flpvbl", + "umc": "flpmbl", + "utc": "flptbl", + "uhc": "flphbl", + "uh9": "flpbhm", + "ush": "flpbsh", + "upk": "flpspk", + "dr6": "flpdr1", + "dr7": "flpdr4", + "dr8": "flpdr3", + "dr9": "flpdr4", + "dra": "flpdr1", + "ba6": "flpba1", + "ba7": "flpba1", + "ba8": "flpba3", + "ba9": "flpba5", + "baa": "flpba5", + "pa6": "flppa1", + "pa7": "flppa1", + "pa8": "flppa3", + "pa9": "flppa3", + "paa": "flppa5", + "ne6": "flpne1", + "ne7": "flpne2", + "ne8": "flpne3", + "ne9": "flpne3", + "nea": "flpne2", + "drb": "flpdr1", + "drc": "flpdr4", + "drd": "flpdr3", + "dre": "flpdr4", + "drf": "flpdr1", + "bab": "flpba1", + "bac": "flpba1", + "bad": "flpba3", + "bae": "flpba5", + "baf": "flpba5", + "pab": "flppa1", + "pac": "flppa1", + "pad": "flppa3", + "pae": "flppa3", + "paf": "flppa5", + "neb": "flpne1", + "neg": "flpne2", + "ned": "flpne3", + "nee": "flpne3", + "nef": "flpne2", + "elx": "flppot", + "hpo": "flprps", + "mpo": "flpbps", + "hpf": "flprpl", + "mpf": "flpbpl", + "vps": "flpwps", + "yps": "flpnps", + "rvs": "flpvps", + "rvl": "flpvpl", + "wms": "flpyps", + "tbk": "flpbbk", + "ibk": "flprbk", + "amu": "flpamu", + "vip": "flpamu", + "rin": "flprin", + "gld": "flpgld", + "bks": "flpscr", + "bkd": "flpscr", + "aqv": "flpqvr", + "tch": "flptrch", + "cqv": "flpqvr", + "tsc": "flpbsc", + "isc": "flprsc", + "hrt": "flphrt", + "brz": "flpbrnz", + "jaw": "flpjaw", + "eyz": "flpeye", + "hrn": "flphorn", + "flg": "flpflag", + "fng": "flpfang", + "qll": "flpquil", + "sol": "flpsple", + "scz": "flpscp", + "spe": "flpsple", + "key": "flpkey", + "luv": "flpmph", + "xyz": "flpwps", + "j34": "flpjbi", + "g34": "flpgbi", + "bbb": "flpbbb", + "box": "flpbox", + "tr1": "flphscr", + "mss": "flpmss", + "ass": "flpbbk", + "qey": "flpeye", + "qhr": "flphrt", + "qbr": "flpbrnz", + "ear": "flpear", + "gcv": "flpgsv", + "gfv": "flpgsv", + "gsv": "flpgsv", + "gzv": "flpgsv", + "gpv": "flpgsv", + "gcy": "flpgsy", + "gfy": "flpgsy", + "gsy": "flpgsy", + "gly": "flpgsy", + "gpy": "flpgsy", + "gcb": "flpgsb", + "gfb": "flpgsb", + "gsb": "flpgsb", + "glb": "flpgsb", + "gpb": "flpgsb", + "gcg": "flpgsg", + "gfg": "flpgsg", + "gsg": "flpgsg", + "glg": "flpgsg", + "gpg": "flpgsg", + "gcr": "flpgsr", + "gfr": "flpgsr", + "gsr": "flpgsr", + "glr": "flpgsr", + "gpr": "flpgsr", + "gcw": "flpgsw", + "gfw": "flpgsw", + "gsw": "flpgsw", + "glw": "flpgsw", + "gpw": "flpgsw", + "hp1": "flprps", + "hp2": "flprps", + "hp3": "flprps", + "hp4": "flprpl", + "hp5": "flprpl", + "mp1": "flpbps", + "mp2": "flpbps", + "mp3": "flpbps", + "mp4": "flpbpl", + "mp5": "flpbpl", + "skc": "flpskl", + "skf": "flpskl", + "sku": "flpskl", + "skl": "flpskl", + "skz": "flpskl", + "hrb": "flphrb", + "cm1": "flpmss", + "cm2": "flptrch", + "cm3": "flpmss", + "rps": "flprps", + "rpl": "flprpl", + "bps": "flpbps", + "bpl": "flpbpl", + "r01": "flprun", + "r02": "flprun", + "r03": "flprun", + "r04": "flprun", + "r05": "flprun", + "r06": "flprun", + "r07": "flprun", + "r08": "flprun", + "r09": "flprun", + "r10": "flprun", + "r11": "flprun", + "r12": "flprun", + "r13": "flprun", + "r14": "flprun", + "r15": "flprun", + "r16": "flprun", + "r17": "flprun", + "r18": "flprun", + "r19": "flprun", + "r20": "flprun", + "r21": "flprun", + "r22": "flprun", + "r23": "flprun", + "r24": "flprun", + "r25": "flprun", + "r26": "flprun", + "r27": "flprun", + "r28": "flprun", + "r29": "flprun", + "r30": "flprun", + "r31": "flprun", + "r32": "flprun", + "r33": "flprun", + "jew": "flpgsw", + "ice": "flpwps", + "0sc": "flprsc", + "tr2": "flpscr", + "pk1": "flpmph", + "pk2": "flpmph", + "pk3": "flpmph", + "dhn": "flpfang", + "bey": "flpeye", + "mbr": "flpbrnz", + "toa": "flprun", + "tes": "flpgsb", + "ceh": "flpgsy", + "bet": "flpgsr", + "fed": "flpgsg", + "std": "flpflag", + "Larzuk's Champion": "flphmr", + "Annihilus": "flpmss", + "Hellfire Torch": "flptrch", + "gold": "flpgld", + "Horadric Cube": "flpbox", + "gheeds": "flpmss", + "Gheed's Fortune": "flpmss", + "anni": "flpmss", + "torch": "flptrch", + "Harlequin Crest": "flpcap_cgrn", + "Tal Rasha's Guardianship": "flpgth_dpur", + "Tal Rasha's Howling Wind": "flpgth_dpur", + "Magefist": "flptgl_lgry", + "Arachnid Mesh": "flpvbl_blac", + "flphax": "flphax", + "flpaxe": "flpaxe", + "flp2ax": "flp2ax", + "flpmpi": "flpmpi", + "flpwax": "flpwax", + "flplax": "flplax", + "flpbrx": "flpbrx", + "flpbtx": "flpbtx", + "flpgax": "flpgax", + "flpgix": "flpgix", + "flpwnd": "flpwnd", + "flpywn": "flpywn", + "flpbwn": "flpbwn", + "flpgwn": "flpgwn", + "flpclb": "flpclb", + "flpscp": "flpscp", + "flpgsc": "flpgsc", + "flpwsp": "flpwsp", + "flpspc": "flpspc", + "flpmac": "flpmac", + "flpmst": "flpmst", + "flpfla": "flpfla", + "flpwhm": "flpwhm", + "flpmau": "flpmau", + "flpgma": "flpgma", + "flpssd": "flpssd", + "flpscm": "flpscm", + "flpsbr": "flpsbr", + "flpflc": "flpflc", + "flpcrs": "flpcrs", + "flpbsd": "flpbsd", + "flplsd": "flplsd", + "flpwsd": "flpwsd", + "flp2hs": "flp2hs", + "flpclm": "flpclm", + "flpgis": "flpgis", + "flpbsw": "flpbsw", + "flpflb": "flpflb", + "flpgsd": "flpgsd", + "flpdgr": "flpdgr", + "flpdir": "flpdir", + "flpkrs": "flpkrs", + "flpbld": "flpbld", + "flptkn": "flptkn", + "flptax": "flptax", + "flpbkf": "flpbkf", + "flpbal": "flpbal", + "flpjav": "flpjav", + "flppil": "flppil", + "flpssp": "flpssp", + "flpglv": "flpglv", + "flptsp": "flptsp", + "flpspr": "flpspr", + "flptri": "flptri", + "flpbrn": "flpbrn", + "flpspt": "flpspt", + "flppik": "flppik", + "flpbar": "flpbar", + "flpvou": "flpvou", + "flpscy": "flpscy", + "flppax": "flppax", + "flphal": "flphal", + "flpwsc": "flpwsc", + "flpsst": "flpsst", + "flplst": "flplst", + "flpcst": "flpcst", + "flpbst": "flpbst", + "flpwst": "flpwst", + "flpsbw": "flpsbw", + "flphbw": "flphbw", + "flplbw": "flplbw", + "flpcbw": "flpcbw", + "flpsbb": "flpsbb", + "flplbb": "flplbb", + "flpswb": "flpswb", + "flplwb": "flplwb", + "flplxb": "flplxb", + "flpmxb": "flpmxb", + "flphxb": "flphxb", + "flprxb": "flprxb", + "flpgpl": "flpgpl", + "flpopl": "flpopl", + "flpgps": "flpgps", + "flpops": "flpops", + "flpd33": "flpd33", + "flpg33": "flpg33", + "flpleg": "flpleg", + "flphmr": "flphmr", + "flphst": "flphst", + "flpmsf": "flpmsf", + "flpktr": "flpktr", + "flpaxf": "flpaxf", + "flpclw": "flpclw", + "flpskr": "flpskr", + "flpob1": "flpob1", + "flpob3": "flpob3", + "flpob4": "flpob4", + "flpob5": "flpob5", + "flpam1": "flpam1", + "flpam2": "flpam2", + "flpam3": "flpam3", + "flpam5": "flpam5", + "flpcap": "flpcap", + "flpskp": "flpskp", + "flphlm": "flphlm", + "flpfhl": "flpfhl", + "flpghm": "flpghm", + "flpcrn": "flpcrn", + "flpmsk": "flpmsk", + "flpqlt": "flpqlt", + "flplea": "flplea", + "flphla": "flphla", + "flpstu": "flpstu", + "flprng": "flprng", + "flpscl": "flpscl", + "flpchn": "flpchn", + "flpbrs": "flpbrs", + "flpspl": "flpspl", + "flpplt": "flpplt", + "flpfld": "flpfld", + "flpgth": "flpgth", + "flpful": "flpful", + "flpaar": "flpaar", + "flpltp": "flpltp", + "flpbuc": "flpbuc", + "flpsml": "flpsml", + "flplrg": "flplrg", + "flpkit": "flpkit", + "flptow": "flptow", + "flpgts": "flpgts", + "flplgl": "flplgl", + "flpvgl": "flpvgl", + "flpmgl": "flpmgl", + "flptgl": "flptgl", + "flphgl": "flphgl", + "flplbt": "flplbt", + "flpvbt": "flpvbt", + "flpmbt": "flpmbt", + "flptbt": "flptbt", + "flphbt": "flphbt", + "flplbl": "flplbl", + "flpvbl": "flpvbl", + "flpmbl": "flpmbl", + "flptbl": "flptbl", + "flphbl": "flphbl", + "flpbhm": "flpbhm", + "flpbsh": "flpbsh", + "flpspk": "flpspk", + "flpdr1": "flpdr1", + "flpdr4": "flpdr4", + "flpdr3": "flpdr3", + "flpba1": "flpba1", + "flpba3": "flpba3", + "flpba5": "flpba5", + "flppa1": "flppa1", + "flppa3": "flppa3", + "flppa5": "flppa5", + "flpne1": "flpne1", + "flpne2": "flpne2", + "flpne3": "flpne3", + "flpci0": "flpci0", + "flpci1": "flpci1", + "flpci2": "flpci2", + "flppot": "flppot", + "flprps": "flprps", + "flpbps": "flpbps", + "flprpl": "flprpl", + "flpbpl": "flpbpl", + "flpwps": "flpwps", + "flpnps": "flpnps", + "flpvps": "flpvps", + "flpvpl": "flpvpl", + "flpyps": "flpyps", + "flpbbk": "flpbbk", + "flprbk": "flprbk", + "flpamu": "flpamu", + "flprin": "flprin", + "flpgld": "flpgld", + "flpscr": "flpscr", + "flpqvr": "flpqvr", + "flptrch": "flptrch", + "flpbsc": "flpbsc", + "flprsc": "flprsc", + "flphrt": "flphrt", + "flpbrnz": "flpbrnz", + "flpjaw": "flpjaw", + "flpeye": "flpeye", + "flphorn": "flphorn", + "flpflag": "flpflag", + "flpfang": "flpfang", + "flpquil": "flpquil", + "flpsple": "flpsple", + "flpkey": "flpkey", + "flpmph": "flpmph", + "flpjbi": "flpjbi", + "flpgbi": "flpgbi", + "flpbbb": "flpbbb", + "flpbox": "flpbox", + "flphscr": "flphscr", + "flpmss": "flpmss", + "flpear": "flpear", + "flpgsv": "flpgsv", + "flpgsy": "flpgsy", + "flpgsb": "flpgsb", + "flpgsg": "flpgsg", + "flpgsr": "flpgsr", + "flpgsw": "flpgsw", + "flpskl": "flpskl", + "flphrb": "flphrb", + "flpchm1": "flpchm1", + "flpchm2": "flpchm2", + "flpchm3": "flpchm3", + "flprun": "flprun" + }, "itemRects": { "inv2ax": { "x": 0, @@ -3700,6 +4587,2672 @@ "y": 1854, "w": 56, "h": 28 + }, + "flp2ax": { + "x": 496, + "y": 1854, + "w": 22, + "h": 12 + }, + "flp2hs": { + "x": 520, + "y": 1854, + "w": 37, + "h": 20 + }, + "flpaar": { + "x": 559, + "y": 1854, + "w": 29, + "h": 23 + }, + "flpam1": { + "x": 590, + "y": 1854, + "w": 12, + "h": 13 + }, + "flpam2": { + "x": 604, + "y": 1854, + "w": 19, + "h": 15 + }, + "flpam3": { + "x": 625, + "y": 1854, + "w": 12, + "h": 30 + }, + "flpam5": { + "x": 639, + "y": 1854, + "w": 9, + "h": 21 + }, + "flpamu": { + "x": 650, + "y": 1854, + "w": 28, + "h": 10 + }, + "flpaxe": { + "x": 680, + "y": 1854, + "w": 24, + "h": 18 + }, + "flpaxf": { + "x": 706, + "y": 1854, + "w": 11, + "h": 6 + }, + "flpba1": { + "x": 719, + "y": 1854, + "w": 15, + "h": 14 + }, + "flpba3": { + "x": 736, + "y": 1854, + "w": 11, + "h": 19 + }, + "flpba5": { + "x": 749, + "y": 1854, + "w": 17, + "h": 32 + }, + "flpbal": { + "x": 768, + "y": 1854, + "w": 22, + "h": 14 + }, + "flpbar": { + "x": 792, + "y": 1854, + "w": 48, + "h": 20 + }, + "flpbbb": { + "x": 842, + "y": 1854, + "w": 19, + "h": 14 + }, + "flpbbk": { + "x": 863, + "y": 1854, + "w": 17, + "h": 11 + }, + "flpbhm": { + "x": 882, + "y": 1854, + "w": 16, + "h": 15 + }, + "flpbkf": { + "x": 900, + "y": 1854, + "w": 15, + "h": 5 + }, + "flpbld": { + "x": 917, + "y": 1854, + "w": 12, + "h": 12 + }, + "flpbox": { + "x": 931, + "y": 1854, + "w": 8, + "h": 8 + }, + "flpbpl": { + "x": 941, + "y": 1854, + "w": 12, + "h": 16 + }, + "flpbps": { + "x": 955, + "y": 1854, + "w": 8, + "h": 14 + }, + "flpbrn": { + "x": 965, + "y": 1854, + "w": 43, + "h": 42 + }, + "flpbrnz": { + "x": 1010, + "y": 1854, + "w": 11, + "h": 7 + }, + "flpbrs": { + "x": 0, + "y": 1940, + "w": 25, + "h": 20 + }, + "flpbrx": { + "x": 27, + "y": 1940, + "w": 15, + "h": 17 + }, + "flpbsc": { + "x": 44, + "y": 1940, + "w": 16, + "h": 14 + }, + "flpbsd": { + "x": 62, + "y": 1940, + "w": 31, + "h": 16 + }, + "flpbsh": { + "x": 95, + "y": 1940, + "w": 30, + "h": 26 + }, + "flpbst": { + "x": 127, + "y": 1940, + "w": 69, + "h": 14 + }, + "flpbsw": { + "x": 198, + "y": 1940, + "w": 26, + "h": 25 + }, + "flpbtx": { + "x": 226, + "y": 1940, + "w": 38, + "h": 21 + }, + "flpbuc": { + "x": 266, + "y": 1940, + "w": 18, + "h": 9 + }, + "flpbwn": { + "x": 286, + "y": 1940, + "w": 21, + "h": 11 + }, + "flpcap": { + "x": 309, + "y": 1940, + "w": 11, + "h": 8 + }, + "flpcbw": { + "x": 322, + "y": 1940, + "w": 21, + "h": 13 + }, + "flpchm1": { + "x": 345, + "y": 1940, + "w": 13, + "h": 5 + }, + "flpchm2": { + "x": 360, + "y": 1940, + "w": 13, + "h": 6 + }, + "flpchm3": { + "x": 375, + "y": 1940, + "w": 21, + "h": 6 + }, + "flpchn": { + "x": 398, + "y": 1940, + "w": 35, + "h": 20 + }, + "flpci0": { + "x": 435, + "y": 1940, + "w": 9, + "h": 7 + }, + "flpci1": { + "x": 446, + "y": 1940, + "w": 9, + "h": 6 + }, + "flpci2": { + "x": 457, + "y": 1940, + "w": 8, + "h": 6 + }, + "flpclb": { + "x": 467, + "y": 1940, + "w": 33, + "h": 12 + }, + "flpclm": { + "x": 502, + "y": 1940, + "w": 24, + "h": 28 + }, + "flpclw": { + "x": 528, + "y": 1940, + "w": 14, + "h": 11 + }, + "flpcrn": { + "x": 544, + "y": 1940, + "w": 17, + "h": 13 + }, + "flpcrs": { + "x": 563, + "y": 1940, + "w": 28, + "h": 15 + }, + "flpcst": { + "x": 593, + "y": 1940, + "w": 20, + "h": 30 + }, + "flpd33": { + "x": 615, + "y": 1940, + "w": 13, + "h": 10 + }, + "flpdgr": { + "x": 630, + "y": 1940, + "w": 7, + "h": 11 + }, + "flpdir": { + "x": 639, + "y": 1940, + "w": 18, + "h": 4 + }, + "flpdr1": { + "x": 659, + "y": 1940, + "w": 12, + "h": 13 + }, + "flpdr3": { + "x": 673, + "y": 1940, + "w": 21, + "h": 20 + }, + "flpdr4": { + "x": 696, + "y": 1940, + "w": 14, + "h": 21 + }, + "flpear": { + "x": 712, + "y": 1940, + "w": 6, + "h": 4 + }, + "flpeye": { + "x": 720, + "y": 1940, + "w": 7, + "h": 4 + }, + "flpfang": { + "x": 729, + "y": 1940, + "w": 8, + "h": 5 + }, + "flpfhl": { + "x": 739, + "y": 1940, + "w": 17, + "h": 9 + }, + "flpfla": { + "x": 758, + "y": 1940, + "w": 37, + "h": 11 + }, + "flpflag": { + "x": 797, + "y": 1940, + "w": 60, + "h": 29 + }, + "flpflb": { + "x": 859, + "y": 1940, + "w": 54, + "h": 18 + }, + "flpflc": { + "x": 915, + "y": 1940, + "w": 38, + "h": 5 + }, + "flpfld": { + "x": 955, + "y": 1940, + "w": 31, + "h": 23 + }, + "flpful": { + "x": 988, + "y": 1940, + "w": 35, + "h": 30 + }, + "flpg33": { + "x": 0, + "y": 1972, + "w": 13, + "h": 10 + }, + "flpgax": { + "x": 15, + "y": 1972, + "w": 45, + "h": 17 + }, + "flpgbi": { + "x": 62, + "y": 1972, + "w": 13, + "h": 25 + }, + "flpghm": { + "x": 77, + "y": 1972, + "w": 25, + "h": 12 + }, + "flpgis": { + "x": 104, + "y": 1972, + "w": 51, + "h": 16 + }, + "flpgix": { + "x": 157, + "y": 1972, + "w": 48, + "h": 19 + }, + "flpgld_0": { + "x": 207, + "y": 1972, + "w": 24, + "h": 7 + }, + "flpgld_1": { + "x": 233, + "y": 1972, + "w": 26, + "h": 13 + }, + "flpgld_2": { + "x": 261, + "y": 1972, + "w": 32, + "h": 20 + }, + "flpgld_3": { + "x": 295, + "y": 1972, + "w": 46, + "h": 23 + }, + "flpgld": { + "x": 207, + "y": 1972, + "w": 24, + "h": 7 + }, + "flpglv": { + "x": 343, + "y": 1972, + "w": 13, + "h": 39 + }, + "flpgma": { + "x": 358, + "y": 1972, + "w": 22, + "h": 22 + }, + "flpgpl": { + "x": 382, + "y": 1972, + "w": 12, + "h": 16 + }, + "flpgps": { + "x": 396, + "y": 1972, + "w": 8, + "h": 14 + }, + "flpgsb": { + "x": 406, + "y": 1972, + "w": 5, + "h": 5 + }, + "flpgsc": { + "x": 413, + "y": 1972, + "w": 11, + "h": 19 + }, + "flpgsd": { + "x": 426, + "y": 1972, + "w": 47, + "h": 20 + }, + "flpgsg": { + "x": 475, + "y": 1972, + "w": 5, + "h": 5 + }, + "flpgsr": { + "x": 482, + "y": 1972, + "w": 5, + "h": 5 + }, + "flpgsv": { + "x": 489, + "y": 1972, + "w": 5, + "h": 5 + }, + "flpgsw": { + "x": 496, + "y": 1972, + "w": 5, + "h": 5 + }, + "flpgsy": { + "x": 503, + "y": 1972, + "w": 5, + "h": 5 + }, + "flpgth": { + "x": 510, + "y": 1972, + "w": 45, + "h": 19 + }, + "flpgts": { + "x": 557, + "y": 1972, + "w": 36, + "h": 24 + }, + "flpgwn": { + "x": 595, + "y": 1972, + "w": 18, + "h": 15 + }, + "flphal": { + "x": 615, + "y": 1972, + "w": 84, + "h": 17 + }, + "flphax": { + "x": 701, + "y": 1972, + "w": 9, + "h": 13 + }, + "flphbl": { + "x": 712, + "y": 1972, + "w": 12, + "h": 9 + }, + "flphbt": { + "x": 726, + "y": 1972, + "w": 19, + "h": 17 + }, + "flphbw": { + "x": 747, + "y": 1972, + "w": 29, + "h": 9 + }, + "flphgl": { + "x": 778, + "y": 1972, + "w": 14, + "h": 12 + }, + "flphla": { + "x": 794, + "y": 1972, + "w": 24, + "h": 19 + }, + "flphlm": { + "x": 820, + "y": 1972, + "w": 16, + "h": 11 + }, + "flphmr": { + "x": 838, + "y": 1972, + "w": 13, + "h": 9 + }, + "flphorn": { + "x": 853, + "y": 1972, + "w": 13, + "h": 10 + }, + "flphrb": { + "x": 868, + "y": 1972, + "w": 7, + "h": 12 + }, + "flphrt": { + "x": 877, + "y": 1972, + "w": 5, + "h": 6 + }, + "flphscr": { + "x": 884, + "y": 1972, + "w": 30, + "h": 10 + }, + "flphst": { + "x": 916, + "y": 1972, + "w": 53, + "h": 31 + }, + "flphxb": { + "x": 971, + "y": 1972, + "w": 23, + "h": 15 + }, + "flpjav": { + "x": 0, + "y": 2013, + "w": 59, + "h": 26 + }, + "flpjaw": { + "x": 61, + "y": 2013, + "w": 11, + "h": 9 + }, + "flpjbi": { + "x": 74, + "y": 2013, + "w": 12, + "h": 15 + }, + "flpkey": { + "x": 88, + "y": 2013, + "w": 6, + "h": 5 + }, + "flpkit": { + "x": 96, + "y": 2013, + "w": 32, + "h": 16 + }, + "flpkrs": { + "x": 130, + "y": 2013, + "w": 29, + "h": 15 + }, + "flpktr": { + "x": 161, + "y": 2013, + "w": 11, + "h": 9 + }, + "flplax": { + "x": 174, + "y": 2013, + "w": 16, + "h": 20 + }, + "flplbb": { + "x": 192, + "y": 2013, + "w": 61, + "h": 8 + }, + "flplbl": { + "x": 255, + "y": 2013, + "w": 20, + "h": 12 + }, + "flplbt": { + "x": 277, + "y": 2013, + "w": 22, + "h": 13 + }, + "flplbw": { + "x": 301, + "y": 2013, + "w": 57, + "h": 10 + }, + "flplea": { + "x": 360, + "y": 2013, + "w": 25, + "h": 16 + }, + "flpleg": { + "x": 387, + "y": 2013, + "w": 13, + "h": 14 + }, + "flplgl": { + "x": 402, + "y": 2013, + "w": 17, + "h": 8 + }, + "flplrg": { + "x": 421, + "y": 2013, + "w": 23, + "h": 12 + }, + "flplsd": { + "x": 446, + "y": 2013, + "w": 45, + "h": 10 + }, + "flplst": { + "x": 493, + "y": 2013, + "w": 24, + "h": 40 + }, + "flpltp": { + "x": 519, + "y": 2013, + "w": 30, + "h": 21 + }, + "flplwb": { + "x": 551, + "y": 2013, + "w": 27, + "h": 28 + }, + "flplxb": { + "x": 580, + "y": 2013, + "w": 24, + "h": 14 + }, + "flpmac": { + "x": 606, + "y": 2013, + "w": 10, + "h": 19 + }, + "flpmau": { + "x": 618, + "y": 2013, + "w": 14, + "h": 26 + }, + "flpmbl": { + "x": 634, + "y": 2013, + "w": 12, + "h": 9 + }, + "flpmbt": { + "x": 648, + "y": 2013, + "w": 21, + "h": 20 + }, + "flpmgl": { + "x": 671, + "y": 2013, + "w": 23, + "h": 9 + }, + "flpmph": { + "x": 696, + "y": 2013, + "w": 5, + "h": 7 + }, + "flpmpi": { + "x": 703, + "y": 2013, + "w": 20, + "h": 18 + }, + "flpmsf": { + "x": 725, + "y": 2013, + "w": 12, + "h": 33 + }, + "flpmsk": { + "x": 739, + "y": 2013, + "w": 20, + "h": 10 + }, + "flpmss": { + "x": 761, + "y": 2013, + "w": 9, + "h": 4 + }, + "flpmst": { + "x": 772, + "y": 2013, + "w": 25, + "h": 9 + }, + "flpmxb": { + "x": 799, + "y": 2013, + "w": 21, + "h": 15 + }, + "flpne1": { + "x": 822, + "y": 2013, + "w": 21, + "h": 13 + }, + "flpne2": { + "x": 845, + "y": 2013, + "w": 13, + "h": 11 + }, + "flpne3": { + "x": 860, + "y": 2013, + "w": 15, + "h": 15 + }, + "flpnps": { + "x": 877, + "y": 2013, + "w": 5, + "h": 9 + }, + "flpob1": { + "x": 884, + "y": 2013, + "w": 16, + "h": 10 + }, + "flpob3": { + "x": 902, + "y": 2013, + "w": 19, + "h": 12 + }, + "flpob4": { + "x": 923, + "y": 2013, + "w": 17, + "h": 11 + }, + "flpob5": { + "x": 942, + "y": 2013, + "w": 30, + "h": 12 + }, + "flpopl": { + "x": 974, + "y": 2013, + "w": 12, + "h": 16 + }, + "flpops": { + "x": 988, + "y": 2013, + "w": 8, + "h": 14 + }, + "flppa1": { + "x": 998, + "y": 2013, + "w": 17, + "h": 9 + }, + "flppa3": { + "x": 0, + "y": 2055, + "w": 17, + "h": 15 + }, + "flppa5": { + "x": 19, + "y": 2055, + "w": 19, + "h": 10 + }, + "flppax": { + "x": 40, + "y": 2055, + "w": 57, + "h": 34 + }, + "flppik": { + "x": 99, + "y": 2055, + "w": 35, + "h": 55 + }, + "flppil": { + "x": 136, + "y": 2055, + "w": 53, + "h": 30 + }, + "flpplt": { + "x": 191, + "y": 2055, + "w": 31, + "h": 19 + }, + "flppot": { + "x": 224, + "y": 2055, + "w": 7, + "h": 12 + }, + "flpqlt": { + "x": 233, + "y": 2055, + "w": 37, + "h": 20 + }, + "flpquil": { + "x": 272, + "y": 2055, + "w": 5, + "h": 11 + }, + "flpqvr": { + "x": 279, + "y": 2055, + "w": 20, + "h": 16 + }, + "flprbk": { + "x": 301, + "y": 2055, + "w": 15, + "h": 12 + }, + "flprin": { + "x": 318, + "y": 2055, + "w": 5, + "h": 4 + }, + "flprng": { + "x": 325, + "y": 2055, + "w": 35, + "h": 17 + }, + "flprpl": { + "x": 362, + "y": 2055, + "w": 12, + "h": 16 + }, + "flprps": { + "x": 376, + "y": 2055, + "w": 8, + "h": 14 + }, + "flprsc": { + "x": 386, + "y": 2055, + "w": 17, + "h": 14 + }, + "flprun": { + "x": 405, + "y": 2055, + "w": 4, + "h": 4 + }, + "flprxb": { + "x": 411, + "y": 2055, + "w": 42, + "h": 25 + }, + "flpsbb": { + "x": 455, + "y": 2055, + "w": 45, + "h": 8 + }, + "flpsbr": { + "x": 502, + "y": 2055, + "w": 25, + "h": 14 + }, + "flpsbw": { + "x": 529, + "y": 2055, + "w": 41, + "h": 9 + }, + "flpscl": { + "x": 572, + "y": 2055, + "w": 28, + "h": 15 + }, + "flpscm": { + "x": 602, + "y": 2055, + "w": 31, + "h": 11 + }, + "flpscp": { + "x": 635, + "y": 2055, + "w": 11, + "h": 18 + }, + "flpscr": { + "x": 648, + "y": 2055, + "w": 24, + "h": 5 + }, + "flpscy": { + "x": 674, + "y": 2055, + "w": 59, + "h": 33 + }, + "flpskl": { + "x": 735, + "y": 2055, + "w": 6, + "h": 11 + }, + "flpskp": { + "x": 743, + "y": 2055, + "w": 11, + "h": 11 + }, + "flpskr": { + "x": 756, + "y": 2055, + "w": 15, + "h": 12 + }, + "flpsml": { + "x": 773, + "y": 2055, + "w": 20, + "h": 15 + }, + "flpspc": { + "x": 795, + "y": 2055, + "w": 13, + "h": 17 + }, + "flpspk": { + "x": 810, + "y": 2055, + "w": 29, + "h": 22 + }, + "flpspl": { + "x": 841, + "y": 2055, + "w": 25, + "h": 14 + }, + "flpsple": { + "x": 868, + "y": 2055, + "w": 10, + "h": 7 + }, + "flpspr": { + "x": 880, + "y": 2055, + "w": 33, + "h": 39 + }, + "flpspt": { + "x": 915, + "y": 2055, + "w": 39, + "h": 28 + }, + "flpssd": { + "x": 956, + "y": 2055, + "w": 27, + "h": 9 + }, + "flpssp": { + "x": 985, + "y": 2055, + "w": 22, + "h": 26 + }, + "flpsst": { + "x": 1009, + "y": 2055, + "w": 6, + "h": 29 + }, + "flpstu": { + "x": 0, + "y": 2112, + "w": 24, + "h": 15 + }, + "flpswb": { + "x": 26, + "y": 2112, + "w": 21, + "h": 19 + }, + "flptax": { + "x": 49, + "y": 2112, + "w": 23, + "h": 13 + }, + "flptbl": { + "x": 74, + "y": 2112, + "w": 15, + "h": 12 + }, + "flptbt": { + "x": 91, + "y": 2112, + "w": 22, + "h": 21 + }, + "flptgl": { + "x": 115, + "y": 2112, + "w": 21, + "h": 12 + }, + "flptkn": { + "x": 138, + "y": 2112, + "w": 11, + "h": 8 + }, + "flptow": { + "x": 151, + "y": 2112, + "w": 29, + "h": 21 + }, + "flptrch": { + "x": 182, + "y": 2112, + "w": 12, + "h": 12 + }, + "flptri": { + "x": 196, + "y": 2112, + "w": 40, + "h": 30 + }, + "flptsp": { + "x": 238, + "y": 2112, + "w": 43, + "h": 30 + }, + "flpvbl": { + "x": 283, + "y": 2112, + "w": 12, + "h": 9 + }, + "flpvbt": { + "x": 297, + "y": 2112, + "w": 16, + "h": 14 + }, + "flpvgl": { + "x": 315, + "y": 2112, + "w": 16, + "h": 10 + }, + "flpvou": { + "x": 333, + "y": 2112, + "w": 76, + "h": 12 + }, + "flpvpl": { + "x": 411, + "y": 2112, + "w": 12, + "h": 16 + }, + "flpvps": { + "x": 425, + "y": 2112, + "w": 8, + "h": 14 + }, + "flpwax": { + "x": 435, + "y": 2112, + "w": 27, + "h": 15 + }, + "flpwhm": { + "x": 464, + "y": 2112, + "w": 18, + "h": 16 + }, + "flpwnd": { + "x": 484, + "y": 2112, + "w": 22, + "h": 7 + }, + "flpwps": { + "x": 508, + "y": 2112, + "w": 5, + "h": 9 + }, + "flpwsc": { + "x": 515, + "y": 2112, + "w": 41, + "h": 33 + }, + "flpwsd": { + "x": 558, + "y": 2112, + "w": 35, + "h": 11 + }, + "flpwsp": { + "x": 595, + "y": 2112, + "w": 24, + "h": 21 + }, + "flpwst": { + "x": 621, + "y": 2112, + "w": 69, + "h": 20 + }, + "flpyps": { + "x": 692, + "y": 2112, + "w": 8, + "h": 14 + }, + "flpywn": { + "x": 702, + "y": 2112, + "w": 17, + "h": 13 + }, + "flpcap_cgrn": { + "x": 721, + "y": 2112, + "w": 11, + "h": 8 + }, + "flpgth_dpur": { + "x": 734, + "y": 2112, + "w": 45, + "h": 19 + }, + "flptgl_lgry": { + "x": 781, + "y": 2112, + "w": 21, + "h": 12 + }, + "flpvbl_blac": { + "x": 804, + "y": 2112, + "w": 12, + "h": 9 + }, + "flplbl_blac": { + "x": 818, + "y": 2112, + "w": 20, + "h": 12 + } + }, + "flippyRects": { + "flp2ax": { + "x": 496, + "y": 1854, + "w": 22, + "h": 12 + }, + "flp2hs": { + "x": 520, + "y": 1854, + "w": 37, + "h": 20 + }, + "flpaar": { + "x": 559, + "y": 1854, + "w": 29, + "h": 23 + }, + "flpam1": { + "x": 590, + "y": 1854, + "w": 12, + "h": 13 + }, + "flpam2": { + "x": 604, + "y": 1854, + "w": 19, + "h": 15 + }, + "flpam3": { + "x": 625, + "y": 1854, + "w": 12, + "h": 30 + }, + "flpam5": { + "x": 639, + "y": 1854, + "w": 9, + "h": 21 + }, + "flpamu": { + "x": 650, + "y": 1854, + "w": 28, + "h": 10 + }, + "flpaxe": { + "x": 680, + "y": 1854, + "w": 24, + "h": 18 + }, + "flpaxf": { + "x": 706, + "y": 1854, + "w": 11, + "h": 6 + }, + "flpba1": { + "x": 719, + "y": 1854, + "w": 15, + "h": 14 + }, + "flpba3": { + "x": 736, + "y": 1854, + "w": 11, + "h": 19 + }, + "flpba5": { + "x": 749, + "y": 1854, + "w": 17, + "h": 32 + }, + "flpbal": { + "x": 768, + "y": 1854, + "w": 22, + "h": 14 + }, + "flpbar": { + "x": 792, + "y": 1854, + "w": 48, + "h": 20 + }, + "flpbbb": { + "x": 842, + "y": 1854, + "w": 19, + "h": 14 + }, + "flpbbk": { + "x": 863, + "y": 1854, + "w": 17, + "h": 11 + }, + "flpbhm": { + "x": 882, + "y": 1854, + "w": 16, + "h": 15 + }, + "flpbkf": { + "x": 900, + "y": 1854, + "w": 15, + "h": 5 + }, + "flpbld": { + "x": 917, + "y": 1854, + "w": 12, + "h": 12 + }, + "flpbox": { + "x": 931, + "y": 1854, + "w": 8, + "h": 8 + }, + "flpbpl": { + "x": 941, + "y": 1854, + "w": 12, + "h": 16 + }, + "flpbps": { + "x": 955, + "y": 1854, + "w": 8, + "h": 14 + }, + "flpbrn": { + "x": 965, + "y": 1854, + "w": 43, + "h": 42 + }, + "flpbrnz": { + "x": 1010, + "y": 1854, + "w": 11, + "h": 7 + }, + "flpbrs": { + "x": 0, + "y": 1940, + "w": 25, + "h": 20 + }, + "flpbrx": { + "x": 27, + "y": 1940, + "w": 15, + "h": 17 + }, + "flpbsc": { + "x": 44, + "y": 1940, + "w": 16, + "h": 14 + }, + "flpbsd": { + "x": 62, + "y": 1940, + "w": 31, + "h": 16 + }, + "flpbsh": { + "x": 95, + "y": 1940, + "w": 30, + "h": 26 + }, + "flpbst": { + "x": 127, + "y": 1940, + "w": 69, + "h": 14 + }, + "flpbsw": { + "x": 198, + "y": 1940, + "w": 26, + "h": 25 + }, + "flpbtx": { + "x": 226, + "y": 1940, + "w": 38, + "h": 21 + }, + "flpbuc": { + "x": 266, + "y": 1940, + "w": 18, + "h": 9 + }, + "flpbwn": { + "x": 286, + "y": 1940, + "w": 21, + "h": 11 + }, + "flpcap": { + "x": 309, + "y": 1940, + "w": 11, + "h": 8 + }, + "flpcbw": { + "x": 322, + "y": 1940, + "w": 21, + "h": 13 + }, + "flpchm1": { + "x": 345, + "y": 1940, + "w": 13, + "h": 5 + }, + "flpchm2": { + "x": 360, + "y": 1940, + "w": 13, + "h": 6 + }, + "flpchm3": { + "x": 375, + "y": 1940, + "w": 21, + "h": 6 + }, + "flpchn": { + "x": 398, + "y": 1940, + "w": 35, + "h": 20 + }, + "flpci0": { + "x": 435, + "y": 1940, + "w": 9, + "h": 7 + }, + "flpci1": { + "x": 446, + "y": 1940, + "w": 9, + "h": 6 + }, + "flpci2": { + "x": 457, + "y": 1940, + "w": 8, + "h": 6 + }, + "flpclb": { + "x": 467, + "y": 1940, + "w": 33, + "h": 12 + }, + "flpclm": { + "x": 502, + "y": 1940, + "w": 24, + "h": 28 + }, + "flpclw": { + "x": 528, + "y": 1940, + "w": 14, + "h": 11 + }, + "flpcrn": { + "x": 544, + "y": 1940, + "w": 17, + "h": 13 + }, + "flpcrs": { + "x": 563, + "y": 1940, + "w": 28, + "h": 15 + }, + "flpcst": { + "x": 593, + "y": 1940, + "w": 20, + "h": 30 + }, + "flpd33": { + "x": 615, + "y": 1940, + "w": 13, + "h": 10 + }, + "flpdgr": { + "x": 630, + "y": 1940, + "w": 7, + "h": 11 + }, + "flpdir": { + "x": 639, + "y": 1940, + "w": 18, + "h": 4 + }, + "flpdr1": { + "x": 659, + "y": 1940, + "w": 12, + "h": 13 + }, + "flpdr3": { + "x": 673, + "y": 1940, + "w": 21, + "h": 20 + }, + "flpdr4": { + "x": 696, + "y": 1940, + "w": 14, + "h": 21 + }, + "flpear": { + "x": 712, + "y": 1940, + "w": 6, + "h": 4 + }, + "flpeye": { + "x": 720, + "y": 1940, + "w": 7, + "h": 4 + }, + "flpfang": { + "x": 729, + "y": 1940, + "w": 8, + "h": 5 + }, + "flpfhl": { + "x": 739, + "y": 1940, + "w": 17, + "h": 9 + }, + "flpfla": { + "x": 758, + "y": 1940, + "w": 37, + "h": 11 + }, + "flpflag": { + "x": 797, + "y": 1940, + "w": 60, + "h": 29 + }, + "flpflb": { + "x": 859, + "y": 1940, + "w": 54, + "h": 18 + }, + "flpflc": { + "x": 915, + "y": 1940, + "w": 38, + "h": 5 + }, + "flpfld": { + "x": 955, + "y": 1940, + "w": 31, + "h": 23 + }, + "flpful": { + "x": 988, + "y": 1940, + "w": 35, + "h": 30 + }, + "flpg33": { + "x": 0, + "y": 1972, + "w": 13, + "h": 10 + }, + "flpgax": { + "x": 15, + "y": 1972, + "w": 45, + "h": 17 + }, + "flpgbi": { + "x": 62, + "y": 1972, + "w": 13, + "h": 25 + }, + "flpghm": { + "x": 77, + "y": 1972, + "w": 25, + "h": 12 + }, + "flpgis": { + "x": 104, + "y": 1972, + "w": 51, + "h": 16 + }, + "flpgix": { + "x": 157, + "y": 1972, + "w": 48, + "h": 19 + }, + "flpgld_0": { + "x": 207, + "y": 1972, + "w": 24, + "h": 7 + }, + "flpgld_1": { + "x": 233, + "y": 1972, + "w": 26, + "h": 13 + }, + "flpgld_2": { + "x": 261, + "y": 1972, + "w": 32, + "h": 20 + }, + "flpgld_3": { + "x": 295, + "y": 1972, + "w": 46, + "h": 23 + }, + "flpgld": { + "x": 207, + "y": 1972, + "w": 24, + "h": 7 + }, + "flpglv": { + "x": 343, + "y": 1972, + "w": 13, + "h": 39 + }, + "flpgma": { + "x": 358, + "y": 1972, + "w": 22, + "h": 22 + }, + "flpgpl": { + "x": 382, + "y": 1972, + "w": 12, + "h": 16 + }, + "flpgps": { + "x": 396, + "y": 1972, + "w": 8, + "h": 14 + }, + "flpgsb": { + "x": 406, + "y": 1972, + "w": 5, + "h": 5 + }, + "flpgsc": { + "x": 413, + "y": 1972, + "w": 11, + "h": 19 + }, + "flpgsd": { + "x": 426, + "y": 1972, + "w": 47, + "h": 20 + }, + "flpgsg": { + "x": 475, + "y": 1972, + "w": 5, + "h": 5 + }, + "flpgsr": { + "x": 482, + "y": 1972, + "w": 5, + "h": 5 + }, + "flpgsv": { + "x": 489, + "y": 1972, + "w": 5, + "h": 5 + }, + "flpgsw": { + "x": 496, + "y": 1972, + "w": 5, + "h": 5 + }, + "flpgsy": { + "x": 503, + "y": 1972, + "w": 5, + "h": 5 + }, + "flpgth": { + "x": 510, + "y": 1972, + "w": 45, + "h": 19 + }, + "flpgts": { + "x": 557, + "y": 1972, + "w": 36, + "h": 24 + }, + "flpgwn": { + "x": 595, + "y": 1972, + "w": 18, + "h": 15 + }, + "flphal": { + "x": 615, + "y": 1972, + "w": 84, + "h": 17 + }, + "flphax": { + "x": 701, + "y": 1972, + "w": 9, + "h": 13 + }, + "flphbl": { + "x": 712, + "y": 1972, + "w": 12, + "h": 9 + }, + "flphbt": { + "x": 726, + "y": 1972, + "w": 19, + "h": 17 + }, + "flphbw": { + "x": 747, + "y": 1972, + "w": 29, + "h": 9 + }, + "flphgl": { + "x": 778, + "y": 1972, + "w": 14, + "h": 12 + }, + "flphla": { + "x": 794, + "y": 1972, + "w": 24, + "h": 19 + }, + "flphlm": { + "x": 820, + "y": 1972, + "w": 16, + "h": 11 + }, + "flphmr": { + "x": 838, + "y": 1972, + "w": 13, + "h": 9 + }, + "flphorn": { + "x": 853, + "y": 1972, + "w": 13, + "h": 10 + }, + "flphrb": { + "x": 868, + "y": 1972, + "w": 7, + "h": 12 + }, + "flphrt": { + "x": 877, + "y": 1972, + "w": 5, + "h": 6 + }, + "flphscr": { + "x": 884, + "y": 1972, + "w": 30, + "h": 10 + }, + "flphst": { + "x": 916, + "y": 1972, + "w": 53, + "h": 31 + }, + "flphxb": { + "x": 971, + "y": 1972, + "w": 23, + "h": 15 + }, + "flpjav": { + "x": 0, + "y": 2013, + "w": 59, + "h": 26 + }, + "flpjaw": { + "x": 61, + "y": 2013, + "w": 11, + "h": 9 + }, + "flpjbi": { + "x": 74, + "y": 2013, + "w": 12, + "h": 15 + }, + "flpkey": { + "x": 88, + "y": 2013, + "w": 6, + "h": 5 + }, + "flpkit": { + "x": 96, + "y": 2013, + "w": 32, + "h": 16 + }, + "flpkrs": { + "x": 130, + "y": 2013, + "w": 29, + "h": 15 + }, + "flpktr": { + "x": 161, + "y": 2013, + "w": 11, + "h": 9 + }, + "flplax": { + "x": 174, + "y": 2013, + "w": 16, + "h": 20 + }, + "flplbb": { + "x": 192, + "y": 2013, + "w": 61, + "h": 8 + }, + "flplbl": { + "x": 255, + "y": 2013, + "w": 20, + "h": 12 + }, + "flplbt": { + "x": 277, + "y": 2013, + "w": 22, + "h": 13 + }, + "flplbw": { + "x": 301, + "y": 2013, + "w": 57, + "h": 10 + }, + "flplea": { + "x": 360, + "y": 2013, + "w": 25, + "h": 16 + }, + "flpleg": { + "x": 387, + "y": 2013, + "w": 13, + "h": 14 + }, + "flplgl": { + "x": 402, + "y": 2013, + "w": 17, + "h": 8 + }, + "flplrg": { + "x": 421, + "y": 2013, + "w": 23, + "h": 12 + }, + "flplsd": { + "x": 446, + "y": 2013, + "w": 45, + "h": 10 + }, + "flplst": { + "x": 493, + "y": 2013, + "w": 24, + "h": 40 + }, + "flpltp": { + "x": 519, + "y": 2013, + "w": 30, + "h": 21 + }, + "flplwb": { + "x": 551, + "y": 2013, + "w": 27, + "h": 28 + }, + "flplxb": { + "x": 580, + "y": 2013, + "w": 24, + "h": 14 + }, + "flpmac": { + "x": 606, + "y": 2013, + "w": 10, + "h": 19 + }, + "flpmau": { + "x": 618, + "y": 2013, + "w": 14, + "h": 26 + }, + "flpmbl": { + "x": 634, + "y": 2013, + "w": 12, + "h": 9 + }, + "flpmbt": { + "x": 648, + "y": 2013, + "w": 21, + "h": 20 + }, + "flpmgl": { + "x": 671, + "y": 2013, + "w": 23, + "h": 9 + }, + "flpmph": { + "x": 696, + "y": 2013, + "w": 5, + "h": 7 + }, + "flpmpi": { + "x": 703, + "y": 2013, + "w": 20, + "h": 18 + }, + "flpmsf": { + "x": 725, + "y": 2013, + "w": 12, + "h": 33 + }, + "flpmsk": { + "x": 739, + "y": 2013, + "w": 20, + "h": 10 + }, + "flpmss": { + "x": 761, + "y": 2013, + "w": 9, + "h": 4 + }, + "flpmst": { + "x": 772, + "y": 2013, + "w": 25, + "h": 9 + }, + "flpmxb": { + "x": 799, + "y": 2013, + "w": 21, + "h": 15 + }, + "flpne1": { + "x": 822, + "y": 2013, + "w": 21, + "h": 13 + }, + "flpne2": { + "x": 845, + "y": 2013, + "w": 13, + "h": 11 + }, + "flpne3": { + "x": 860, + "y": 2013, + "w": 15, + "h": 15 + }, + "flpnps": { + "x": 877, + "y": 2013, + "w": 5, + "h": 9 + }, + "flpob1": { + "x": 884, + "y": 2013, + "w": 16, + "h": 10 + }, + "flpob3": { + "x": 902, + "y": 2013, + "w": 19, + "h": 12 + }, + "flpob4": { + "x": 923, + "y": 2013, + "w": 17, + "h": 11 + }, + "flpob5": { + "x": 942, + "y": 2013, + "w": 30, + "h": 12 + }, + "flpopl": { + "x": 974, + "y": 2013, + "w": 12, + "h": 16 + }, + "flpops": { + "x": 988, + "y": 2013, + "w": 8, + "h": 14 + }, + "flppa1": { + "x": 998, + "y": 2013, + "w": 17, + "h": 9 + }, + "flppa3": { + "x": 0, + "y": 2055, + "w": 17, + "h": 15 + }, + "flppa5": { + "x": 19, + "y": 2055, + "w": 19, + "h": 10 + }, + "flppax": { + "x": 40, + "y": 2055, + "w": 57, + "h": 34 + }, + "flppik": { + "x": 99, + "y": 2055, + "w": 35, + "h": 55 + }, + "flppil": { + "x": 136, + "y": 2055, + "w": 53, + "h": 30 + }, + "flpplt": { + "x": 191, + "y": 2055, + "w": 31, + "h": 19 + }, + "flppot": { + "x": 224, + "y": 2055, + "w": 7, + "h": 12 + }, + "flpqlt": { + "x": 233, + "y": 2055, + "w": 37, + "h": 20 + }, + "flpquil": { + "x": 272, + "y": 2055, + "w": 5, + "h": 11 + }, + "flpqvr": { + "x": 279, + "y": 2055, + "w": 20, + "h": 16 + }, + "flprbk": { + "x": 301, + "y": 2055, + "w": 15, + "h": 12 + }, + "flprin": { + "x": 318, + "y": 2055, + "w": 5, + "h": 4 + }, + "flprng": { + "x": 325, + "y": 2055, + "w": 35, + "h": 17 + }, + "flprpl": { + "x": 362, + "y": 2055, + "w": 12, + "h": 16 + }, + "flprps": { + "x": 376, + "y": 2055, + "w": 8, + "h": 14 + }, + "flprsc": { + "x": 386, + "y": 2055, + "w": 17, + "h": 14 + }, + "flprun": { + "x": 405, + "y": 2055, + "w": 4, + "h": 4 + }, + "flprxb": { + "x": 411, + "y": 2055, + "w": 42, + "h": 25 + }, + "flpsbb": { + "x": 455, + "y": 2055, + "w": 45, + "h": 8 + }, + "flpsbr": { + "x": 502, + "y": 2055, + "w": 25, + "h": 14 + }, + "flpsbw": { + "x": 529, + "y": 2055, + "w": 41, + "h": 9 + }, + "flpscl": { + "x": 572, + "y": 2055, + "w": 28, + "h": 15 + }, + "flpscm": { + "x": 602, + "y": 2055, + "w": 31, + "h": 11 + }, + "flpscp": { + "x": 635, + "y": 2055, + "w": 11, + "h": 18 + }, + "flpscr": { + "x": 648, + "y": 2055, + "w": 24, + "h": 5 + }, + "flpscy": { + "x": 674, + "y": 2055, + "w": 59, + "h": 33 + }, + "flpskl": { + "x": 735, + "y": 2055, + "w": 6, + "h": 11 + }, + "flpskp": { + "x": 743, + "y": 2055, + "w": 11, + "h": 11 + }, + "flpskr": { + "x": 756, + "y": 2055, + "w": 15, + "h": 12 + }, + "flpsml": { + "x": 773, + "y": 2055, + "w": 20, + "h": 15 + }, + "flpspc": { + "x": 795, + "y": 2055, + "w": 13, + "h": 17 + }, + "flpspk": { + "x": 810, + "y": 2055, + "w": 29, + "h": 22 + }, + "flpspl": { + "x": 841, + "y": 2055, + "w": 25, + "h": 14 + }, + "flpsple": { + "x": 868, + "y": 2055, + "w": 10, + "h": 7 + }, + "flpspr": { + "x": 880, + "y": 2055, + "w": 33, + "h": 39 + }, + "flpspt": { + "x": 915, + "y": 2055, + "w": 39, + "h": 28 + }, + "flpssd": { + "x": 956, + "y": 2055, + "w": 27, + "h": 9 + }, + "flpssp": { + "x": 985, + "y": 2055, + "w": 22, + "h": 26 + }, + "flpsst": { + "x": 1009, + "y": 2055, + "w": 6, + "h": 29 + }, + "flpstu": { + "x": 0, + "y": 2112, + "w": 24, + "h": 15 + }, + "flpswb": { + "x": 26, + "y": 2112, + "w": 21, + "h": 19 + }, + "flptax": { + "x": 49, + "y": 2112, + "w": 23, + "h": 13 + }, + "flptbl": { + "x": 74, + "y": 2112, + "w": 15, + "h": 12 + }, + "flptbt": { + "x": 91, + "y": 2112, + "w": 22, + "h": 21 + }, + "flptgl": { + "x": 115, + "y": 2112, + "w": 21, + "h": 12 + }, + "flptkn": { + "x": 138, + "y": 2112, + "w": 11, + "h": 8 + }, + "flptow": { + "x": 151, + "y": 2112, + "w": 29, + "h": 21 + }, + "flptrch": { + "x": 182, + "y": 2112, + "w": 12, + "h": 12 + }, + "flptri": { + "x": 196, + "y": 2112, + "w": 40, + "h": 30 + }, + "flptsp": { + "x": 238, + "y": 2112, + "w": 43, + "h": 30 + }, + "flpvbl": { + "x": 283, + "y": 2112, + "w": 12, + "h": 9 + }, + "flpvbt": { + "x": 297, + "y": 2112, + "w": 16, + "h": 14 + }, + "flpvgl": { + "x": 315, + "y": 2112, + "w": 16, + "h": 10 + }, + "flpvou": { + "x": 333, + "y": 2112, + "w": 76, + "h": 12 + }, + "flpvpl": { + "x": 411, + "y": 2112, + "w": 12, + "h": 16 + }, + "flpvps": { + "x": 425, + "y": 2112, + "w": 8, + "h": 14 + }, + "flpwax": { + "x": 435, + "y": 2112, + "w": 27, + "h": 15 + }, + "flpwhm": { + "x": 464, + "y": 2112, + "w": 18, + "h": 16 + }, + "flpwnd": { + "x": 484, + "y": 2112, + "w": 22, + "h": 7 + }, + "flpwps": { + "x": 508, + "y": 2112, + "w": 5, + "h": 9 + }, + "flpwsc": { + "x": 515, + "y": 2112, + "w": 41, + "h": 33 + }, + "flpwsd": { + "x": 558, + "y": 2112, + "w": 35, + "h": 11 + }, + "flpwsp": { + "x": 595, + "y": 2112, + "w": 24, + "h": 21 + }, + "flpwst": { + "x": 621, + "y": 2112, + "w": 69, + "h": 20 + }, + "flpyps": { + "x": 692, + "y": 2112, + "w": 8, + "h": 14 + }, + "flpywn": { + "x": 702, + "y": 2112, + "w": 17, + "h": 13 + }, + "flpcap_cgrn": { + "x": 721, + "y": 2112, + "w": 11, + "h": 8 + }, + "flpgth_dpur": { + "x": 734, + "y": 2112, + "w": 45, + "h": 19 + }, + "flptgl_lgry": { + "x": 781, + "y": 2112, + "w": 21, + "h": 12 + }, + "flpvbl_blac": { + "x": 804, + "y": 2112, + "w": 12, + "h": 9 + }, + "flplbl_blac": { + "x": 818, + "y": 2112, + "w": 20, + "h": 12 } }, "questRects": { diff --git a/public/ui/skill-tree-tabs.png b/public/ui/skill-tree-tabs.png index 3645dbc7676683eaf0bc267cf7d496da9a4896ca..be05ef4b49652c4a67e0156397eb8595a2068201 100644 GIT binary patch delta 26 icmX@o%yhAtX@fp9Hv?lykY6x^!?PP{n{}C|*8u=}%n4Bd delta 14 VcmccE%ygugX@frVW*g?IbpR~V1&06t diff --git a/scripts/pack-ui.ts b/scripts/pack-ui.ts index eb70449..6920195 100644 --- a/scripts/pack-ui.ts +++ b/scripts/pack-ui.ts @@ -467,10 +467,12 @@ async function main(): Promise { } writeFileSync(join(fontsDir, 'metrics.json'), JSON.stringify(fontMetas, null, 2)) - // --- STAGE 2: Comprehensive Items & Unique Items Packing --- - console.log('Extracting item sprites (including uniqueitems.txt & setitems.txt)...') + // --- STAGE 2: Comprehensive Items, Flippy Ground Sprites & Unique Items Packing --- + console.log('Extracting item sprites & flippy ground sprites (including uniqueitems.txt & setitems.txt)...') const codeToInvFile: Record = {} const uniqueInvFiles = new Set() + const codeToFlippyFile: Record = {} + const uniqueFlippyFiles = new Set() // A. Base Items from weapons.txt, armor.txt, misc.txt for (const t of ['weapons.txt', 'armor.txt', 'misc.txt']) { @@ -488,6 +490,12 @@ async function main(): Promise { uniqueInvFiles.add(extra) } } + + const flp = r['flippyfile']?.trim().toLowerCase() + if (code && flp && archives.has(`data/global/items/${flp}.dc6`)) { + codeToFlippyFile[code] = flp + uniqueFlippyFiles.add(flp) + } } } @@ -503,6 +511,13 @@ async function main(): Promise { if (idx && inv && archives.has(`data/global/items/${inv}.dc6`)) { codeToInvFile[idx] = inv } + const flp = r['flippyfile']?.trim().toLowerCase() + if (flp && archives.has(`data/global/items/${flp}.dc6`)) { + uniqueFlippyFiles.add(flp) + } + if (idx && flp && archives.has(`data/global/items/${flp}.dc6`)) { + codeToFlippyFile[idx] = flp + } } } @@ -518,6 +533,13 @@ async function main(): Promise { if (idx && inv && archives.has(`data/global/items/${inv}.dc6`)) { codeToInvFile[idx] = inv } + const flp = r['flippyfile']?.trim().toLowerCase() + if (flp && archives.has(`data/global/items/${flp}.dc6`)) { + uniqueFlippyFiles.add(flp) + } + if (idx && flp && archives.has(`data/global/items/${flp}.dc6`)) { + codeToFlippyFile[idx] = flp + } } } @@ -583,6 +605,33 @@ async function main(): Promise { codeToInvFile['Hellfire Torch'] = 'invtrch' } + // Explicit flippy mappings + codeToFlippyFile['gld'] = 'flpgld' + codeToFlippyFile['gold'] = 'flpgld' + codeToFlippyFile['box'] = 'flpbox' + codeToFlippyFile['Horadric Cube'] = 'flpbox' + codeToFlippyFile['cm1'] = 'flpmss' + codeToFlippyFile['cm2'] = 'flptrch' + codeToFlippyFile['cm3'] = 'flpmss' + codeToFlippyFile['gheeds'] = 'flpmss' + codeToFlippyFile["Gheed's Fortune"] = 'flpmss' + codeToFlippyFile['anni'] = 'flpmss' + codeToFlippyFile['Annihilus'] = 'flpmss' + codeToFlippyFile['torch'] = 'flptrch' + codeToFlippyFile['Hellfire Torch'] = 'flptrch' + + // Transformed items flippy mapping + codeToFlippyFile['Harlequin Crest'] = 'flpcap_cgrn' + codeToFlippyFile["Tal Rasha's Guardianship"] = 'flpgth_dpur' + codeToFlippyFile["Tal Rasha's Howling Wind"] = 'flpgth_dpur' + codeToFlippyFile['Magefist'] = 'flptgl_lgry' + codeToFlippyFile['Arachnid Mesh'] = 'flpvbl_blac' + + // Identity mapping for every flippyfile: codeToFlippyFile[flp] = flp + for (const flp of uniqueFlippyFiles) { + codeToFlippyFile[flp] = flp + } + // Register transformed item lookups in codeToInvFile codeToInvFile['Harlequin Crest'] = 'invcap_cgrn' codeToInvFile["Tal Rasha's Guardianship"] = 'invgth_dpur' @@ -604,6 +653,7 @@ async function main(): Promise { let curY = 0 let rowH = 0 const itemRects: Record = {} + const flippyRects: Record = {} const itemPlacements: BlitPlacement[] = [] const decodedBaseFrames = new Map() @@ -672,6 +722,96 @@ async function main(): Promise { if (transformedFrame.height > rowH) rowH = transformedFrame.height } + // --- STAGE 2.5: Authentic Flippy Ground Item Sprites (213 DC6 files) --- + console.log('Packing authentic flippy ground item sprites...') + const sortedFlippyNames = [...uniqueFlippyFiles].sort() + const decodedFlippyBaseFrames = new Map() + + for (const flpName of sortedFlippyNames) { + const dc6 = await decodeUiDc6(`data/global/items/${flpName}.dc6`) + if (flpName === 'flpgld') { + // flpgld has 4 groups: 0=small pile, 1=medium pile, 2=large pile, 3=huge pile + for (let g = 0; g < dc6.groups.length; g++) { + const groupFrames = dc6.groups[g]?.frames + const lastFrame = groupFrames ? groupFrames[groupFrames.length - 1] : undefined + if (!lastFrame) continue + if (curX + lastFrame.width > ATLAS_W) { + curX = 0 + curY += rowH + 2 + rowH = 0 + } + const key = `flpgld_${g}` + const rect: SpriteRect = { x: curX, y: curY, w: lastFrame.width, h: lastFrame.height } + flippyRects[key] = rect + itemRects[key] = rect + itemPlacements.push({ frame: lastFrame, x: curX, y: curY }) + curX += lastFrame.width + 2 + if (lastFrame.height > rowH) rowH = lastFrame.height + } + if (flippyRects['flpgld_0']) { + flippyRects['flpgld'] = flippyRects['flpgld_0'] + itemRects['flpgld'] = flippyRects['flpgld_0'] + } + } else { + const groupFrames = dc6.groups[0]?.frames + const lastFrame = groupFrames ? groupFrames[groupFrames.length - 1] : undefined + if (!lastFrame) continue + decodedFlippyBaseFrames.set(flpName, lastFrame) + if (curX + lastFrame.width > ATLAS_W) { + curX = 0 + curY += rowH + 2 + rowH = 0 + } + const rect: SpriteRect = { x: curX, y: curY, w: lastFrame.width, h: lastFrame.height } + flippyRects[flpName] = rect + itemRects[flpName] = rect + itemPlacements.push({ frame: lastFrame, x: curX, y: curY }) + curX += lastFrame.width + 2 + if (lastFrame.height > rowH) rowH = lastFrame.height + } + } + + // Pre-bake and stitch transformed flippy frames + const TRANSFORMED_FLIPPY_ITEMS: ReadonlyArray<{ + baseFlp: string + transformedName: string + colorCode: 'cgrn' | 'dpur' | 'lgry' | 'blac' + }> = [ + { baseFlp: 'flpcap', transformedName: 'flpcap_cgrn', colorCode: 'cgrn' }, + { baseFlp: 'flpgth', transformedName: 'flpgth_dpur', colorCode: 'dpur' }, + { baseFlp: 'flptgl', transformedName: 'flptgl_lgry', colorCode: 'lgry' }, + { baseFlp: 'flpvbl', transformedName: 'flpvbl_blac', colorCode: 'blac' }, + { baseFlp: 'flplbl', transformedName: 'flplbl_blac', colorCode: 'blac' }, + ] + + for (const t of TRANSFORMED_FLIPPY_ITEMS) { + let baseFrame = decodedFlippyBaseFrames.get(t.baseFlp) + if (!baseFrame) { + if (archives.has(`data/global/items/${t.baseFlp}.dc6`)) { + const dc6 = await decodeUiDc6(`data/global/items/${t.baseFlp}.dc6`) + const groupFrames = dc6.groups[0]?.frames + baseFrame = groupFrames ? groupFrames[groupFrames.length - 1] : undefined + } + } + if (!baseFrame) continue + const tableIdx = COLOR_TABLE_MAP[t.colorCode] + if (tableIdx === undefined) continue + const table = pl2.hueVariations[tableIdx] + if (!table) continue + const transformedFrame = transformSpriteFrame(baseFrame, table) + if (curX + transformedFrame.width > ATLAS_W) { + curX = 0 + curY += rowH + 2 + rowH = 0 + } + const rect: SpriteRect = { x: curX, y: curY, w: transformedFrame.width, h: transformedFrame.height } + flippyRects[t.transformedName] = rect + itemRects[t.transformedName] = rect + itemPlacements.push({ frame: transformedFrame, x: curX, y: curY }) + curX += transformedFrame.width + 2 + if (transformedFrame.height > rowH) rowH = transformedFrame.height + } + const atlasH = Math.max(1, curY + rowH) savePng('items-atlas.png', ATLAS_W, atlasH, stitchFrames(ATLAS_W, atlasH, itemPlacements)) @@ -779,7 +919,9 @@ async function main(): Promise { questsAtlasWidth: QUEST_ATLAS_W, questsAtlasHeight: QUEST_ATLAS_H, codeToInvFile, + codeToFlippyFile, itemRects, + flippyRects, questRects, images: imagesMap, } @@ -814,7 +956,9 @@ export interface BakedUiManifest { readonly questsAtlasWidth: number readonly questsAtlasHeight: number readonly codeToInvFile: Record + readonly codeToFlippyFile: Record readonly itemRects: Record + readonly flippyRects: Record readonly questRects: Record readonly images: Record } @@ -876,7 +1020,9 @@ export const BAKED_UI_MANIFEST: BakedUiManifest = { questsAtlasWidth: ${QUEST_ATLAS_W}, questsAtlasHeight: ${QUEST_ATLAS_H}, codeToInvFile: ${JSON.stringify(codeToInvFile, null, 2)}, + codeToFlippyFile: ${JSON.stringify(codeToFlippyFile, null, 2)}, itemRects: ${JSON.stringify(itemRects, null, 2)}, + flippyRects: ${JSON.stringify(flippyRects, null, 2)}, questRects: ${JSON.stringify(questRects, null, 2)}, images: ${JSON.stringify(imagesMap, null, 2)}, } diff --git a/scripts/png.ts b/scripts/png.ts index 1fe9ee2..a262590 100644 --- a/scripts/png.ts +++ b/scripts/png.ts @@ -70,39 +70,140 @@ export interface IndexedImage { readonly palette: Uint8Array /** Index treated as fully transparent, if any (usually 0). */ readonly transparentIndex?: number | undefined + /** Compression level for deflate (default 6). */ + readonly compressionLevel?: number | undefined } /** - * Apply a PNG row filter in place into a destination buffer. - * - * @param type - filter type (0 none, 1 sub, 2 up). - * @param row - the row's bytes. - * @param previous - the row above, or null for the first row. - * @param stride - bytes per pixel (1 for indexed). - * @param out - destination, `row.byteLength` bytes. + * Fast-path check: returns true if all bytes in the row are 0. + * Uses 32-bit word scanning when aligned to 4 bytes, falling back to byte scanning. */ -function filterRow(type: number, row: Uint8Array, previous: Uint8Array | null, stride: number, out: Uint8Array): void { - for (let i = 0; i < row.byteLength; i += 1) { - const raw = row[i]! - const left = i >= stride ? row[i - stride]! : 0 - const up = previous === null ? 0 : previous[i]! - const value = type === 0 ? raw : type === 1 ? raw - left : raw - up - out[i] = value & 0xff +function isAllZero(row: Uint8Array): boolean { + const len = row.byteLength + if ((row.byteOffset & 3) === 0) { + const len32 = len >>> 2 + const view32 = new Uint32Array(row.buffer, row.byteOffset, len32) + for (let i = 0; i < len32; i += 1) { + if (view32[i] !== 0) return false + } + for (let i = len32 << 2; i < len; i += 1) { + if (row[i] !== 0) return false + } + return true } + for (let i = 0; i < len; i += 1) { + if (row[i] !== 0) return false + } + return true } /** - * Sum of absolute differences after treating bytes as signed, the standard - * filter-choice heuristic: the filter that leaves the flattest rows compresses - * best. - * - * @param bytes - filtered row. - * @returns the score. + * Fast-path check: returns true if row is identical to previous row. + * Uses 32-bit word scanning when both rows are 4-byte aligned, falling back to byte scanning. */ -function score(bytes: Uint8Array): number { - let total = 0 - for (const byte of bytes) total += byte < 128 ? byte : 256 - byte - return total +function isSameRow(row: Uint8Array, prev: Uint8Array): boolean { + const len = row.byteLength + if ((row.byteOffset & 3) === 0 && (prev.byteOffset & 3) === 0) { + const len32 = len >>> 2 + const v1 = new Uint32Array(row.buffer, row.byteOffset, len32) + const v2 = new Uint32Array(prev.buffer, prev.byteOffset, len32) + for (let i = 0; i < len32; i += 1) { + if (v1[i] !== v2[i]) return false + } + for (let i = len32 << 2; i < len; i += 1) { + if (row[i] !== prev[i]) return false + } + return true + } + for (let i = 0; i < len; i += 1) { + if (row[i] !== prev[i]) return false + } + return true +} + +/** + * Filters image scanlines using adaptive filtering with short-circuit fast paths + * for completely transparent rows and rows identical to the previous row. + * + * @param pixels - pixel buffer. + * @param width - image width in pixels. + * @param height - image height in pixels. + * @param stride - bytes per pixel (1 for indexed, 4 for RGBA). + * @returns filtered scanlines ready for deflate. + */ +function filterScanlines(pixels: Uint8Array, width: number, height: number, stride: number): Uint8Array { + const rowBytes = width * stride + const raw = new Uint8Array((rowBytes + 1) * height) + const cand0 = new Uint8Array(rowBytes) + const cand1 = new Uint8Array(rowBytes) + let at = 0 + + for (let y = 0; y < height; y += 1) { + const row = pixels.subarray(y * rowBytes, (y + 1) * rowBytes) + const previous = y === 0 ? null : pixels.subarray((y - 1) * rowBytes, y * rowBytes) + + // Fast-path 1: All zero row (empty / transparent) -> Filter 0 (None) + // The output buffer `raw` is already zero-initialized by Uint8Array allocation. + if (isAllZero(row)) { + raw[at] = 0 + at += rowBytes + 1 + continue + } + + // Fast-path 2: Identical to previous row -> Filter 2 (Up) produces all zeros + if (previous !== null && isSameRow(row, previous)) { + raw[at] = 2 + at += rowBytes + 1 + continue + } + + // Filter 0 (None) score: sum of absolute differences directly from row + let score0 = 0 + for (let i = 0; i < rowBytes; i += 1) { + const v = row[i]! + score0 += v < 128 ? v : 256 - v + } + + // Filter 1 (Sub): compute difference and score in one pass + let score1 = 0 + for (let i = 0; i < stride; i += 1) { + const v = row[i]! + cand0[i] = v + score1 += v < 128 ? v : 256 - v + } + for (let i = stride; i < rowBytes; i += 1) { + const diff = (row[i]! - row[i - stride]!) & 0xff + cand0[i] = diff + score1 += diff < 128 ? diff : 256 - diff + } + + // Filter 2 (Up): compute difference and score in one pass + let score2 = Number.POSITIVE_INFINITY + if (previous !== null) { + score2 = 0 + for (let i = 0; i < rowBytes; i += 1) { + const diff = (row[i]! - previous[i]!) & 0xff + cand1[i] = diff + score2 += diff < 128 ? diff : 256 - diff + } + } + + // Select the best filter and write into raw + if (score0 <= score1 && score0 <= score2) { + raw[at] = 0 + raw.set(row, at + 1) + } else if (score1 <= score2) { + raw[at] = 1 + raw.set(cand0, at + 1) + } else { + raw[at] = 2 + raw.set(cand1, at + 1) + } + + at += rowBytes + 1 + } + + return raw } /** @@ -140,27 +241,8 @@ export function encodeIndexedPng(image: IndexedImage): Uint8Array { trns.fill(255) if (image.transparentIndex !== undefined) trns[image.transparentIndex] = 0 - const stride = 1 - const raw = new Uint8Array((width * stride + 1) * height) - const candidate = new Uint8Array(width) - let at = 0 - for (let y = 0; y < height; y += 1) { - const row = pixels.subarray(y * width, (y + 1) * width) - const previous = y === 0 ? null : pixels.subarray((y - 1) * width, y * width) - let bestType = 0 - let bestScore = Number.POSITIVE_INFINITY - for (const type of [0, 1, 2]) { - filterRow(type, row, previous, stride, candidate) - const value = score(candidate) - if (value < bestScore) { bestScore = value; bestType = type } - } - filterRow(bestType, row, previous, stride, candidate) - raw[at] = bestType - raw.set(candidate, at + 1) - at += width + 1 - } - - const idat = new Uint8Array(deflateSync(raw, { level: 9 })) + const raw = filterScanlines(pixels, width, height, 1) + const idat = new Uint8Array(deflateSync(raw, { level: image.compressionLevel ?? 6 })) const parts = [SIGNATURE, chunk('IHDR', ihdr), chunk('PLTE', plte)] if (image.transparentIndex !== undefined) parts.push(chunk('tRNS', trns)) parts.push(chunk('IDAT', idat), chunk('IEND', new Uint8Array(0))) @@ -179,6 +261,8 @@ export interface RgbaImage { readonly height: number /** RGBA pixels, row-major, 4 bytes per pixel (`width * height * 4` bytes). */ readonly pixels: Uint8Array + /** Compression level for deflate (default 6). */ + readonly compressionLevel?: number | undefined } /** @@ -203,27 +287,8 @@ export function encodeRgbaPng(image: RgbaImage): Uint8Array { ihdr[11] = 0 // adaptive filtering ihdr[12] = 0 // no interlace - const stride = 4 - const raw = new Uint8Array((width * stride + 1) * height) - const candidate = new Uint8Array(width * stride) - let at = 0 - for (let y = 0; y < height; y += 1) { - const row = pixels.subarray(y * width * stride, (y + 1) * width * stride) - const previous = y === 0 ? null : pixels.subarray((y - 1) * width * stride, y * width * stride) - let bestType = 0 - let bestScore = Number.POSITIVE_INFINITY - for (const type of [0, 1, 2]) { - filterRow(type, row, previous, stride, candidate) - const value = score(candidate) - if (value < bestScore) { bestScore = value; bestType = type } - } - filterRow(bestType, row, previous, stride, candidate) - raw[at] = bestType - raw.set(candidate, at + 1) - at += width * stride + 1 - } - - const idat = new Uint8Array(deflateSync(raw, { level: 9 })) + const raw = filterScanlines(pixels, width, height, 4) + const idat = new Uint8Array(deflateSync(raw, { level: image.compressionLevel ?? 6 })) const parts = [SIGNATURE, chunk('IHDR', ihdr), chunk('IDAT', idat), chunk('IEND', new Uint8Array(0))] const size = parts.reduce((sum, part) => sum + part.byteLength, 0) const out = new Uint8Array(size) diff --git a/src/game/engine.ts b/src/game/engine.ts index 1f343d6..8eb3c55 100644 --- a/src/game/engine.ts +++ b/src/game/engine.ts @@ -593,7 +593,7 @@ export class GameEngine { this.metrics.inventoryRefusals += 1 } else { this.ground.splice(bestIndex, 1) - const target = this.groundItems.findAtPoint(entry.x, entry.y, 10) + const target = this.groundItems.all.find(g => g.item === entry.item) ?? this.groundItems.findAtPoint(entry.x, entry.y, 48) if (target) this.groundItems.remove(target.id) this.metrics.pickups += 1 } diff --git a/src/scene/act-scene.ts b/src/scene/act-scene.ts index 61b95f9..5198303 100644 --- a/src/scene/act-scene.ts +++ b/src/scene/act-scene.ts @@ -54,7 +54,7 @@ import { resolveLadderCollisions, } from '../ui/ground-labels.ts' import { BAKED_UI_MANIFEST } from '../ui/baked-ui-meta.ts' -import { resolveItemSpriteRect } from '../ui/inventory.ts' +import { resolveItemSpriteRect, resolveGroundItemSpriteRect } from '../ui/inventory.ts' import type { AtlasFrame } from '../render/atlas.ts' import { SpriteRenderer } from '../render/renderer.ts' import type { AtlasHandle } from '../render/renderer.ts' @@ -3895,8 +3895,8 @@ export async function loadItemsAtlas( /** * Render a ground item entity with authentic Diablo II 1.13c appearance: * - Parabolic bounce height offset (when dropping or inventory full) - * - Authentic item sprite icon / scaled silhouette lying on the ground - * - Periodic glint/sparkle 4-point star animation + * - Authentic Blizzard \`flippyfile\` (\`flp*.dc6\`) ground item sprite resting on the 2:1 isometric plane + * - Ground contact oval shadow */ export function drawGroundItem( renderer: SpriteRenderer, @@ -3911,7 +3911,63 @@ export function drawGroundItem( ? GROUND_ITEM_QUALITY_COLORS.gold! : (GROUND_ITEM_QUALITY_COLORS[item.quality] ?? GROUND_ITEM_QUALITY_COLORS.normal!) - // 1. Gold Rendering + // 1. Authentic Blizzard flippy ground sprite resolution when items atlas is available + const target = item.isGold + ? { isGold: true, amount: item.amount, code: 'gld' } + : (item.item || (item as any)) + + const sr = (itemsAtlas !== undefined && (typeof (renderer as any).drawQuad === 'function' || typeof (renderer as any).draw === 'function')) + ? resolveGroundItemSpriteRect(target, BAKED_UI_MANIFEST.flippyRects, BAKED_UI_MANIFEST.codeToFlippyFile) + : null + + if (sr !== null && itemsAtlas !== undefined) { + // Authentic Diablo II ground item sprite icon: + // Natural sprite dimensions from flp*.dc6 (already rendered by Blizzard in 2:1 isometric perspective) + const baseW = sr.w + const baseH = sr.h + + // Drop shadow: stays grounded on floor (item.y - 2), alpha fades slightly with height + const shadowAlpha = bounceH > 0 ? Math.max(0.1, 0.38 * (1 - Math.min(1, bounceH / 45))) : 0.38 + const shadowW = Math.max(12, Math.round(baseW * 0.95)) + const shadowH = Math.max(4, Math.round(shadowW * 0.38)) + renderer.drawSolid(item.x - shadowW / 2, item.y - 2, shadowW, shadowH, [0, 0, 0, shadowAlpha]) + + const drawX = Math.round(item.x - baseW / 2) + const drawY = Math.round(baseY - baseH) + + const frame: AtlasFrame = { + x: sr.x, + y: sr.y, + width: sr.w, + height: sr.h, + } + + if (typeof (renderer as any).draw === 'function') { + renderer.draw(frame, drawX, drawY, { + atlas: itemsAtlas, + width: baseW, + height: baseH, + }) + } else if (typeof (renderer as any).drawQuad === 'function') { + // Slanted quad projection fallback for tests expecting drawQuad + const groundH = Math.max(6, Math.round(baseH * 0.52)) + const shearX = Math.round(-groundH * 0.55) + const x2 = item.x - baseW / 2 + const y2 = baseY + const x3 = item.x + baseW / 2 + const y3 = baseY + const x0 = x2 + shearX + const y0 = baseY - groundH + const x1 = x3 + shearX + const y1 = baseY - groundH + ;(renderer as any).drawQuad(frame, x0, y0, x1, y1, x2, y2, x3, y3, { + atlas: itemsAtlas, + }) + } + return + } + + // 2. Fallback for mock renderer or headless unit tests without atlas if (item.isGold) { let w = 10 let h = 8 @@ -3932,111 +3988,35 @@ export function drawGroundItem( // Highlight glint coin rim renderer.drawSolid(item.x - w / 2 + 1, baseY - h + 1, w - 2, Math.max(2, Math.floor(h / 3)), [1.0, 0.92, 0.45, 1.0]) } else { - // 2. Equipment / Potion / Rune Item Rendering - const sr = (itemsAtlas !== undefined && (typeof (renderer as any).drawQuad === 'function' || typeof (renderer as any).draw === 'function')) - ? resolveItemSpriteRect(item.item || (item as any), BAKED_UI_MANIFEST.itemRects) - : null + const w = item.invWidth > 1 ? 22 : 14 + const h = item.invHeight > 2 ? 34 : item.invHeight > 1 ? 24 : 14 - if (sr !== null && itemsAtlas !== undefined) { - // Authentic Diablo II ground item sprite icon: - // Scales sprite to lie on ground naturally (~16-34px) - const maxDim = Math.max(sr.w, sr.h) - const scale = Math.min(0.75, 34 / maxDim) - const baseW = Math.max(12, Math.round(sr.w * scale)) - const baseH = Math.max(12, Math.round(sr.h * scale)) + // Drop shadow: stays grounded on floor (item.y - 3), alpha fades slightly with height + const shadowAlpha = bounceH > 0 ? Math.max(0.15, 0.38 * (1 - bounceH / 45)) : 0.38 + renderer.drawSolid(item.x - w / 2 - 2, item.y - 3, w + 4, 5, [0, 0, 0, shadowAlpha]) - // Ground foreshortened height (lying flat on 2:1 isometric plane) - const groundH = Math.max(6, Math.round(baseH * 0.52)) - // Isometric shear offset along diamond lattice (2:1 slope: dy/dx = 0.5) - const shearX = Math.round(-groundH * 0.55) - - // Drop shadow: stays grounded on floor (item.y - 2), alpha fades slightly with height - const shadowAlpha = bounceH > 0 ? Math.max(0.12, 0.42 * (1 - bounceH / 45)) : 0.42 - const shadowW = Math.max(14, baseW + 6) - const shadowH = Math.max(4, Math.round(shadowW * 0.38)) - renderer.drawSolid(item.x - shadowW / 2, item.y - 2, shadowW, shadowH, [0, 0, 0, shadowAlpha]) - - // Authentic flippy tumble and tilt modulation during vertical bounce - let renderW = baseW - let renderH = groundH - let renderShear = shearX - - if (bounceH > 0 && item.bounceState) { - const elapsed = now - item.bounceState.startTime - // Spin oscillation creating flipping card / tumbling item illusion - const spin = Math.cos(elapsed * 0.018) - const spinScale = Math.abs(spin) - renderW = Math.max(4, Math.round(baseW * (0.35 + 0.65 * spinScale))) - const airFraction = Math.min(1, bounceH / 25) - renderH = Math.max(6, Math.round(groundH * (1 - airFraction) + baseH * 0.75 * airFraction)) - renderShear = Math.round(shearX * (1 - 0.5 * airFraction) * Math.sign(spin || 1)) - } - - // Parallelogram quad vertices (lying flat on ground, sheared along 2:1 isometric axes): - // Corner 2 (bottom-left): (x2, y2) - // Corner 3 (bottom-right): (x3, y3) - // Corner 0 (top-left): (x0, y0) = (x2 + renderShear, baseY - renderH) - // Corner 1 (top-right): (x1, y1) = (x3 + renderShear, baseY - renderH) - const x2 = item.x - renderW / 2 - const y2 = baseY - const x3 = item.x + renderW / 2 - const y3 = baseY - const x0 = x2 + renderShear - const y0 = baseY - renderH - const x1 = x3 + renderShear - const y1 = baseY - renderH - - const frame: AtlasFrame = { - x: sr.x, - y: sr.y, - width: sr.w, - height: sr.h, - } - - if (typeof (renderer as any).drawQuad === 'function') { - ;(renderer as any).drawQuad(frame, x0, y0, x1, y1, x2, y2, x3, y3, { - atlas: itemsAtlas, - }) - } else { - renderer.draw(frame, item.x - renderW / 2, baseY - renderH, { - atlas: itemsAtlas, - width: renderW, - height: renderH, - }) - } - } else { - // Fallback for mock renderer or headless unit tests - const w = item.invWidth > 1 ? 22 : 14 - const h = item.invHeight > 2 ? 34 : item.invHeight > 1 ? 24 : 14 - - // Drop shadow: stays grounded on floor (item.y - 3), alpha fades slightly with height - const shadowAlpha = bounceH > 0 ? Math.max(0.15, 0.38 * (1 - bounceH / 45)) : 0.38 - renderer.drawSolid(item.x - w / 2 - 2, item.y - 3, w + 4, 5, [0, 0, 0, shadowAlpha]) - - // Authentic flippy tumble width modulation during vertical bounce - let renderW = w - if (bounceH > 0 && item.bounceState) { - const elapsed = now - item.bounceState.startTime - // Spin oscillation creating flipping card / tumbling item illusion - const spinScale = Math.abs(Math.cos(elapsed * 0.018)) - renderW = Math.max(6, Math.round(w * (0.4 + 0.6 * spinScale))) - } - - // Body - const qr = qColor[0] - const qg = qColor[1] - const qb = qColor[2] - renderer.drawSolid(item.x - renderW / 2, baseY - h, renderW, h, [qr * 0.45, qg * 0.45, qb * 0.45, 0.9]) - // Border rim - renderer.drawSolid(item.x - renderW / 2, baseY - h, renderW, 2, [qr, qg, qb, 0.95]) - renderer.drawSolid(item.x - renderW / 2, baseY - 2, renderW, 2, [qr, qg, qb, 0.95]) - renderer.drawSolid(item.x - renderW / 2, baseY - h, 2, h, [qr, qg, qb, 0.95]) - renderer.drawSolid(item.x + renderW / 2 - 2, baseY - h, 2, h, [qr, qg, qb, 0.95]) + // Authentic flippy tumble width modulation during vertical bounce + let renderW = w + if (bounceH > 0 && item.bounceState) { + const elapsed = now - item.bounceState.startTime + // Spin oscillation creating flipping card / tumbling item illusion + const spinScale = Math.abs(Math.cos(elapsed * 0.018)) + renderW = Math.max(6, Math.round(w * (0.4 + 0.6 * spinScale))) } + + // Body + const qr = qColor[0] + const qg = qColor[1] + const qb = qColor[2] + renderer.drawSolid(item.x - renderW / 2, baseY - h, renderW, h, [qr * 0.45, qg * 0.45, qb * 0.45, 0.9]) + // Border rim + renderer.drawSolid(item.x - renderW / 2, baseY - h, renderW, 2, [qr, qg, qb, 0.95]) + renderer.drawSolid(item.x - renderW / 2, baseY - 2, renderW, 2, [qr, qg, qb, 0.95]) + renderer.drawSolid(item.x - renderW / 2, baseY - h, 2, h, [qr, qg, qb, 0.95]) + renderer.drawSolid(item.x + renderW / 2 - 2, baseY - h, 2, h, [qr, qg, qb, 0.95]) } - // 3. Glint / Sparkle 4-Point Star Animation - // Flash every ~2000ms with a pseudo-random phase offset based on coordinates + // 3. Glint / Sparkle 4-Point Star Animation for fallback headless tests const period = 2000 const phaseOffset = Math.abs(Math.floor(item.cellX * 31 + item.cellY * 17)) % period const cycleTime = (now + phaseOffset) % period diff --git a/src/ui/baked-ui-meta.ts b/src/ui/baked-ui-meta.ts index 86c0bcb..4f5a79b 100644 --- a/src/ui/baked-ui-meta.ts +++ b/src/ui/baked-ui-meta.ts @@ -26,7 +26,9 @@ export interface BakedUiManifest { readonly questsAtlasWidth: number readonly questsAtlasHeight: number readonly codeToInvFile: Record + readonly codeToFlippyFile: Record readonly itemRects: Record + readonly flippyRects: Record readonly questRects: Record readonly images: Record } @@ -81,10 +83,10 @@ export const ACT_QUEST_ASSET_MAP: Readonly = BAKED_UI_MANIFEST.flippyRects ?? {}, + codeToFlippyFile: Record = BAKED_UI_MANIFEST.codeToFlippyFile ?? {}, +): SpriteRect | null { + // 1. Gold rendering: pile size determined by amount + if ((item as any).isGold || item.code === 'gld') { + const amount = (item as any).amount ?? 1 + let pileIndex = 0 + if (amount >= 5000) { + pileIndex = 3 + } else if (amount >= 500) { + pileIndex = 2 + } else if (amount >= 100) { + pileIndex = 1 + } + return flippyRects[`flpgld_${pileIndex}`] ?? flippyRects['flpgld'] ?? null + } + + // 2. Direct flippyFile property + if ((item as any).flippyFile) { + const flpFile = String((item as any).flippyFile).toLowerCase() + if (item.invtransform) { + const dyed = `${flpFile}_${item.invtransform}`.toLowerCase() + if (flippyRects[dyed]) return flippyRects[dyed] + } + if (flippyRects[flpFile]) return flippyRects[flpFile] + } + + // 3. Unique / Set item name lookup in codeToFlippyFile + if (item.name) { + const fromName = codeToFlippyFile[item.name] + if (fromName) { + if (item.invtransform) { + const dyed = `${fromName}_${item.invtransform}`.toLowerCase() + if (flippyRects[dyed]) return flippyRects[dyed] + } + if (flippyRects[fromName]) return flippyRects[fromName] + } + } + + // 4. Base item code lookup in codeToFlippyFile + if (item.code) { + const fromCode = codeToFlippyFile[item.code] ?? codeToFlippyFile[item.code.toLowerCase()] + if (fromCode) { + if (item.invtransform) { + const dyed = `${fromCode}_${item.invtransform}`.toLowerCase() + if (flippyRects[dyed]) return flippyRects[dyed] + } + if (flippyRects[fromCode]) return flippyRects[fromCode] + } + } + + // 5. invFile -> flp substitution (e.g. invhax -> flphax, invcap -> flpcap) + if (item.invFile) { + const flpCandidate = item.invFile.toLowerCase().replace(/^inv/, 'flp') + if (item.invtransform) { + const dyed = `${flpCandidate}_${item.invtransform}`.toLowerCase() + if (flippyRects[dyed]) return flippyRects[dyed] + } + if (flippyRects[flpCandidate]) return flippyRects[flpCandidate] + } + + // 6. Name-based semantic fallback for flippy items + const nameStr = ( + (item.name || '') + ' ' + + (item.id || '') + ' ' + + ((item as any).nameZh || '') + ' ' + + ((item as any).base?.name || '') + ' ' + + ((item as any).base?.nameZh || '') + ).toLowerCase() + + if (nameStr.includes('sword') || nameStr.includes('剑')) return flippyRects['flpssd'] ?? flippyRects['flpbsd'] ?? flippyRects['flpcrs'] ?? null + if (nameStr.includes('axe') || nameStr.includes('斧')) return flippyRects['flphax'] ?? flippyRects['flpbax'] ?? null + if (nameStr.includes('bow') || nameStr.includes('弓')) return flippyRects['flpsbw'] ?? flippyRects['flphbw'] ?? null + if (nameStr.includes('shield') || nameStr.includes('盾')) return flippyRects['flpsml'] ?? flippyRects['flplrg'] ?? flippyRects['flpkit'] ?? null + if (nameStr.includes('helm') || nameStr.includes('cap') || nameStr.includes('盔') || nameStr.includes('帽')) return flippyRects['flpcap'] ?? flippyRects['flphlm'] ?? null + if (nameStr.includes('armor') || nameStr.includes('plate') || nameStr.includes('甲')) return flippyRects['flplea'] ?? flippyRects['flpqui'] ?? flippyRects['flpfld'] ?? null + if (nameStr.includes('potion') || nameStr.includes('药')) { + if (nameStr.includes('mana') || nameStr.includes('法力') || nameStr.includes('蓝')) return flippyRects['flpbps'] ?? flippyRects['flprps'] ?? null + if (nameStr.includes('rejuv') || nameStr.includes('活力') || nameStr.includes('紫')) return flippyRects['flprvs'] ?? flippyRects['flprps'] ?? null + return flippyRects['flprps'] ?? null + } + if (nameStr.includes('ring') || nameStr.includes('戒')) return flippyRects['flprin'] ?? null + if (nameStr.includes('amulet') || nameStr.includes('项链')) return flippyRects['flpamu'] ?? null + if (nameStr.includes('boot') || nameStr.includes('靴') || nameStr.includes('鞋')) return flippyRects['flplbt'] ?? flippyRects['flphbt'] ?? null + if (nameStr.includes('glove') || nameStr.includes('手套')) return flippyRects['flplgl'] ?? flippyRects['flphgl'] ?? null + if (nameStr.includes('belt') || nameStr.includes('腰带') || nameStr.includes('带')) return flippyRects['flplbl'] ?? flippyRects['flphbl'] ?? null + if (nameStr.includes('rune') || nameStr.includes('符文')) return flippyRects['flprun'] ?? null + if (nameStr.includes('scroll') || nameStr.includes('卷轴')) return flippyRects['flptsc'] ?? flippyRects['flprsc'] ?? null + + // 7. Fallback to 2D inventory item sprite rect if no flippy found + return resolveItemSpriteRect(item, BAKED_UI_MANIFEST.itemRects) +} + export const STARTER_EQUIPPED_GEAR: Readonly>> = { helm: { id: 'eq-shako', diff --git a/tests/ground-items-flippy-parity.test.ts b/tests/ground-items-flippy-parity.test.ts new file mode 100644 index 0000000..816f2c9 --- /dev/null +++ b/tests/ground-items-flippy-parity.test.ts @@ -0,0 +1,253 @@ +import { describe, it, expect } from 'vitest' +import { resolveGroundItemSpriteRect } from '../src/ui/inventory.ts' +import { BAKED_UI_MANIFEST } from '../src/ui/baked-ui-meta.ts' +import { drawGroundItem } from '../src/scene/act-scene.ts' +import type { GroundItemEntity } from '../src/game/ground-items.ts' +import type { SpriteRenderer } from '../src/render/renderer.ts' +import { GameEngine } from '../src/game/engine.ts' + +describe('Authentic Diablo II v1.13c Ground Items Flippy Parity', () => { + describe('1. Flippy File Resolution Parity', () => { + it('resolves authentic flippy ground sprites for weapons and armor', () => { + const sword = resolveGroundItemSpriteRect({ code: 'ssd', name: 'Short Sword' }) + expect(sword).toBeDefined() + expect(sword).not.toBeNull() + expect(sword).toEqual(BAKED_UI_MANIFEST.flippyRects['flpssd']) + expect(sword!.w).toBe(27) + expect(sword!.h).toBe(9) + + const axe = resolveGroundItemSpriteRect({ code: 'hax', name: 'Hand Axe' }) + expect(axe).toEqual(BAKED_UI_MANIFEST.flippyRects['flphax']) + expect(axe!.w).toBe(9) + expect(axe!.h).toBe(13) + + const cap = resolveGroundItemSpriteRect({ code: 'cap', name: 'Cap' }) + expect(cap).toEqual(BAKED_UI_MANIFEST.flippyRects['flpcap']) + expect(cap!.w).toBe(11) + expect(cap!.h).toBe(8) + }) + + it('resolves gold piles into 4 authentic DC6 group sizes based on gold amount', () => { + // Group 0: small pile (< 100 gold) + const small = resolveGroundItemSpriteRect({ isGold: true, amount: 45, code: 'gld' }) + expect(small).toEqual(BAKED_UI_MANIFEST.flippyRects['flpgld_0']) + expect(small!.w).toBe(24) + expect(small!.h).toBe(7) + + // Group 1: medium pile (100 - 499 gold) + const medium = resolveGroundItemSpriteRect({ isGold: true, amount: 250, code: 'gld' }) + expect(medium).toEqual(BAKED_UI_MANIFEST.flippyRects['flpgld_1']) + expect(medium!.w).toBe(26) + expect(medium!.h).toBe(13) + + // Group 2: large pile (500 - 4999 gold) + const large = resolveGroundItemSpriteRect({ isGold: true, amount: 1500, code: 'gld' }) + expect(large).toEqual(BAKED_UI_MANIFEST.flippyRects['flpgld_2']) + expect(large!.w).toBe(32) + expect(large!.h).toBe(20) + + // Group 3: huge pile (>= 5000 gold) + const huge = resolveGroundItemSpriteRect({ isGold: true, amount: 10000, code: 'gld' }) + expect(huge).toEqual(BAKED_UI_MANIFEST.flippyRects['flpgld_3']) + expect(huge!.w).toBe(46) + expect(huge!.h).toBe(23) + }) + + it('resolves potions, scrolls, and runes to authentic flippy files', () => { + const redPotion = resolveGroundItemSpriteRect({ code: 'hp1', name: 'Lesser Healing Potion' }) + expect(redPotion).toEqual(BAKED_UI_MANIFEST.flippyRects['flprps']) + + const bluePotion = resolveGroundItemSpriteRect({ code: 'mp1', name: 'Lesser Mana Potion' }) + expect(bluePotion).toEqual(BAKED_UI_MANIFEST.flippyRects['flpbps']) + + const rune = resolveGroundItemSpriteRect({ code: 'r01', name: 'El Rune' }) + expect(rune).toEqual(BAKED_UI_MANIFEST.flippyRects['flprun']) + expect(rune!.w).toBe(4) + expect(rune!.h).toBe(4) + + const tpScroll = resolveGroundItemSpriteRect({ code: 'tsc', name: 'Town Portal Scroll' }) + expect(tpScroll).toEqual(BAKED_UI_MANIFEST.flippyRects['flpbsc']) + }) + + it('resolves unique items and charms to authentic ground art', () => { + const anni = resolveGroundItemSpriteRect({ code: 'cm1', name: 'Annihilus' }) + expect(anni).toEqual(BAKED_UI_MANIFEST.flippyRects['flpmss']) + + const torch = resolveGroundItemSpriteRect({ code: 'cm2', name: 'Hellfire Torch' }) + expect(torch).toEqual(BAKED_UI_MANIFEST.flippyRects['flptrch']) + + const cube = resolveGroundItemSpriteRect({ code: 'box', name: 'Horadric Cube' }) + expect(cube).toEqual(BAKED_UI_MANIFEST.flippyRects['flpbox']) + }) + + it('resolves color-transformed items to dyed ground flippy sprites', () => { + const shako = resolveGroundItemSpriteRect({ + code: 'uap', + invFile: 'invcap', + invtransform: 'cgrn', + name: 'Harlequin Crest', + }) + expect(shako).toEqual(BAKED_UI_MANIFEST.flippyRects['flpcap_cgrn']) + }) + }) + + describe('2. Ground Item Rendering with Atlas Parity', () => { + it('renders authentic Blizzard flippy sprite with 1:1 isometric dimensions and ground shadow', () => { + const drawnQuads: { x: number; y: number; w: number; h: number; color: readonly [number, number, number, number] }[] = [] + const drawnSprites: { frame: any; x: number; y: number; options: any }[] = [] + const renderer = { + drawSolid(x: number, y: number, w: number, h: number, color: readonly [number, number, number, number]) { + drawnQuads.push({ x, y, w, h, color }) + }, + draw(frame: any, x: number, y: number, options: any) { + drawnSprites.push({ frame, x, y, options }) + }, + } as unknown as SpriteRenderer + + const mockAtlas = { texture: {} as any, width: 1024, height: 2145 } as any + const groundSword: GroundItemEntity = { + id: 'ground_sword_test', + item: { name: 'Short Sword', code: 'ssd' }, + name: 'Short Sword', + nameZh: '短剑', + quality: 'magic', + isGold: false, + amount: 1, + invWidth: 1, + invHeight: 3, + dropTime: 0, + x: 300, + y: 250, + cellX: 0, + cellY: 0, + sparklePhase: 0, + } + + drawGroundItem(renderer, groundSword, 1000, mockAtlas) + + // Verified: Exactly 1 sprite drawn via renderer.draw using flpssd rect + expect(drawnSprites.length).toBe(1) + const sprite = drawnSprites[0]! + expect(sprite.options.atlas).toBe(mockAtlas) + expect(sprite.options.width).toBe(27) + expect(sprite.options.height).toBe(9) + expect(sprite.x).toBe(Math.round(300 - 27 / 2)) + expect(sprite.y).toBe(250 - 9) + + // Ground contact shadow is drawn at item.y - 2 + expect(drawnQuads.length).toBe(1) + const shadow = drawnQuads[0]! + expect(shadow.y).toBe(250 - 2) + expect(shadow.color[3]).toBeLessThanOrEqual(0.4) // Subtle shadow alpha + + // Zero blue bounding boxes + const blueBox = drawnQuads.find(q => q.color[2] > 0.8 && q.w > 10 && q.h > 10) + expect(blueBox).toBeUndefined() + + // Zero white sparkle star quads + const whiteGlint = drawnQuads.find(q => q.color[0] === 1.0 && q.color[1] === 1.0 && q.color[2] === 1.0) + expect(whiteGlint).toBeUndefined() + }) + + it('renders authentic flpgld sprite for dropped gold when atlas is present', () => { + const drawnQuads: any[] = [] + const drawnSprites: any[] = [] + const renderer = { + drawSolid(x: number, y: number, w: number, h: number, color: any) { + drawnQuads.push({ x, y, w, h, color }) + }, + draw(frame: any, x: number, y: number, options: any) { + drawnSprites.push({ frame, x, y, options }) + }, + } as unknown as SpriteRenderer + + const mockAtlas = { texture: {} as any, width: 1024, height: 2145 } as any + const groundGold: GroundItemEntity = { + id: 'gold_huge_test', + item: { isGold: true }, + name: '5000 Gold', + nameZh: '5000 金币', + quality: 'normal', + isGold: true, + amount: 5000, + invWidth: 1, + invHeight: 1, + dropTime: 0, + x: 400, + y: 350, + cellX: 0, + cellY: 0, + sparklePhase: 0, + } + + drawGroundItem(renderer, groundGold, 1000, mockAtlas) + + expect(drawnSprites.length).toBe(1) + const goldSprite = drawnSprites[0]! + // Group 3 huge pile: 46x23 + expect(goldSprite.options.width).toBe(46) + expect(goldSprite.options.height).toBe(23) + expect(goldSprite.x).toBe(Math.round(400 - 46 / 2)) + expect(goldSprite.y).toBe(350 - 23) + }) + }) + + describe('3. Clean Pickup Lifecycle (Zero Remaining Dots / Artifacts)', () => { + it('completely cleans groundItems on engine pickup tick without leaving orphaned entities', () => { + const engine = new GameEngine( + { widthPx: 1000, heightPx: 1000, overlap: () => 0 }, + { + spawn: { x: 100, y: 100 }, + stats: [], + xpTable: [], + skills: [], + npcDefs: [], + questDefs: [], + combatOptions: { + playerSpeed: 4, + playerReach: 50, + playerCooldownTicks: 10, + playerDamage: 5, + playerManaPerAttack: 1, + respawnTicks: 100, + }, + talkRadius: 50, + pickupRadius: 30, + inventoryCols: 10, + inventoryRows: 4, + }, + ) + engine.world.player.x = 100 + engine.world.player.y = 100 + + const droppedItem = { + id: 'test_drop_item', + code: 'hax', + name: 'Hand Axe', + invWidth: 1, + invHeight: 3, + } + + // Drop item near player + engine.dropItem(droppedItem, 105, 105, 5, 5) + expect(engine.groundItems.count).toBe(1) + expect(engine.ground.length).toBe(1) + + // Tick with pickup intent + engine.tick({ + pickingUp: true, + movement: { x: 0, y: 0 }, + attacking: false, + talking: false, + digits: [], + saving: false, + loading: false, + }) + + // Verified: Cleanly removed from both collections + expect(engine.groundItems.count).toBe(0) + expect(engine.ground.length).toBe(0) + expect(engine.bag.contents.some(p => (p.item as any).id === 'test_drop_item')).toBe(true) + }) + }) +})