troytt
6d46a8febb
feat(skill-137): implement 1.13c Taunt module and Vitest suite ( #291 )
2026-09-22 03:46:06 +00:00
troytt
3c9478af74
feat(skill-136): implement 1.13c Spear Mastery module and Vitest suite ( #290 )
2026-09-22 03:46:05 +00:00
troytt
6411e88769
feat(skill-135): implement 1.13c Throwing Mastery module and Vitest suite ( #289 )
2026-09-22 03:46:03 +00:00
troytt
20cf8c24a0
feat(skill-134): implement 1.13c Pole Arm Mastery module and Vitest suite ( #288 )
2026-09-22 03:46:00 +00:00
troytt
92b3bc7e33
feat(skill-133): implement 1.13c Double Swing module and Vitest suite ( #287 )
2026-09-22 03:45:58 +00:00
troytt
f20da56d36
feat(skill-132): implement 1.13c Leap module and Vitest suite ( #286 )
2026-09-22 03:45:56 +00:00
troytt
789d01d066
feat(skill-131): implement 1.13c Find Potion module and Vitest suite ( #285 )
2026-09-22 03:45:55 +00:00
troytt
c9a3f0364b
feat(skill-130): implement 1.13c Howl module and Vitest suite ( #284 )
2026-09-22 03:45:53 +00:00
troytt
89ee0544db
feat(skill-129): implement 1.13c Mace Mastery module and Vitest suite ( #283 )
2026-09-22 03:45:51 +00:00
troytt
38b94d3fd0
feat(skill-128): implement 1.13c Axe Mastery module and Vitest suite ( #282 )
2026-09-22 03:45:49 +00:00
troytt
c99728064a
feat(skill-127): implement 1.13c Sword Mastery module and Vitest suite ( #281 )
2026-09-22 03:45:48 +00:00
troytt
2e9fc80981
feat(skill-126): implement 1.13c Bash module and Vitest suite ( #280 )
2026-09-22 03:45:46 +00:00
troytt
0a7fe31cc3
feat(skill-125): implement 1.13c Salvation module and Vitest suite ( #279 )
2026-09-22 03:45:44 +00:00
troytt
3fc512d3ab
feat(skill-124): implement 1.13c Redemption module and Vitest suite ( #278 )
2026-09-22 03:45:42 +00:00
troytt
8f63a8324e
feat(skill-123): implement 1.13c Conviction module and Vitest suite ( #277 )
2026-09-22 03:45:40 +00:00
troytt
9a553efb57
feat(skill-122): implement 1.13c Fanaticism module and Vitest suite ( #276 )
2026-09-22 03:45:39 +00:00
troytt
6da97e0d14
feat(skill-121): implement 1.13c Fist of the Heavens module and Vitest suite ( #275 )
2026-09-22 03:45:37 +00:00
troytt
f6a06c231e
feat(skill-120): implement 1.13c Meditation module and Vitest suite ( #274 )
2026-09-22 03:45:35 +00:00
troytt
bd0cfe1198
feat(skill-119): implement 1.13c Sanctuary module and Vitest suite ( #273 )
2026-09-22 03:45:33 +00:00
troytt
49f6afbe6c
feat(skill-118): implement 1.13c Holy Shock module and Vitest suite ( #272 )
2026-09-22 03:45:32 +00:00
troytt
f3bceaef19
feat(skill-117): implement 1.13c Holy Shield module and Vitest suite ( #271 )
2026-09-22 03:45:30 +00:00
troytt
7c3ea35a97
feat(skill-116): implement 1.13c Conversion module and Vitest suite ( #270 )
2026-09-22 03:45:28 +00:00
troytt
8b77637642
feat(skill-115): implement 1.13c Vigor module and Vitest suite ( #269 )
2026-09-22 03:45:26 +00:00
troytt
3465943b86
feat(skill-114): implement 1.13c Holy Freeze module and Vitest suite ( #268 )
2026-09-22 03:45:25 +00:00
troytt
daa352e5b7
feat(skill-113): implement 1.13c Concentration module and Vitest suite ( #267 )
2026-09-22 03:45:23 +00:00
troytt
b01209a11a
feat(skill-112): implement 1.13c Blessed Hammer module and Vitest suite ( #266 )
2026-09-22 03:45:21 +00:00
troytt
045778c740
feat(skill-111): implement 1.13c Vengeance module and Vitest suite ( #265 )
2026-09-22 03:45:19 +00:00
troytt
1660de238c
feat(skill-110): implement 1.13c Resist Lightning module and Vitest suite ( #264 )
2026-09-22 03:45:18 +00:00
troytt
ea430c1522
feat(skill-109): implement 1.13c Cleansing module and Vitest suite ( #263 )
2026-09-22 03:45:14 +00:00
troytt
60bd856fcf
feat(skill-108): implement 1.13c Blessed Aim module and Vitest suite ( #262 )
2026-09-22 03:45:12 +00:00
troytt
1609996501
feat(skill-107): implement 1.13c Charge module and Vitest suite ( #261 )
2026-09-22 03:45:11 +00:00
troytt
b4e564fc77
feat(skill-106): implement 1.13c Zeal module and Vitest suite ( #260 )
2026-09-22 03:45:09 +00:00
troytt
55f3616016
feat(skill-105): implement 1.13c Resist Cold module and Vitest suite ( #259 )
2026-09-22 03:45:07 +00:00
troytt
eb7bd41f23
feat(skill-104): implement 1.13c Defiance module and Vitest suite ( #258 )
2026-09-22 03:45:06 +00:00
troytt
c77fa985cb
feat(skill-103): implement 1.13c Thorns module and Vitest suite ( #257 )
2026-09-22 03:45:04 +00:00
troytt
7978d6bf08
feat(skill-102): implement 1.13c Holy Fire module and Vitest suite ( #256 )
2026-09-22 03:45:02 +00:00
troytt
06611910af
feat(skill-101): implement 1.13c Holy Bolt module and Vitest suite ( #255 )
2026-09-22 03:45:00 +00:00
troytt
c11219dd9d
feat(skill-100): implement 1.13c Resist Fire module and Vitest suite ( #254 )
2026-09-22 03:44:58 +00:00
troytt
104b4d6c62
feat(skill-099): implement 1.13c Prayer module and Vitest suite ( #253 )
2026-09-22 03:44:57 +00:00
troytt
50b5d95067
feat(skill-098): implement 1.13c Might module and Vitest suite ( #252 )
2026-09-22 03:44:55 +00:00
troytt
f0b9e7f834
feat(skill-097): implement 1.13c Smite module and Vitest suite ( #251 )
2026-09-22 03:44:53 +00:00
troytt
b1a72bbdf6
feat(skill-096): implement 1.13c Sacrifice module and Vitest suite ( #250 )
2026-09-22 03:44:52 +00:00
troytt
84956115dd
feat(skill-095): implement 1.13c Revive module and Vitest suite ( #249 )
2026-09-22 03:44:50 +00:00
troytt
3fba1e79bc
feat(skill-094): implement 1.13c FireGolem module and Vitest suite ( #248 )
2026-09-22 03:44:48 +00:00
troytt
536d736803
feat(skill-093): implement 1.13c Bone Spirit module and Vitest suite ( #247 )
2026-09-22 03:44:47 +00:00
troytt
4f6d8d44e9
feat(skill-092): implement 1.13c Poison Nova module and Vitest suite ( #246 )
2026-09-22 03:44:45 +00:00
troytt
c2c139f17b
feat(skill-091): implement 1.13c Lower Resist module and Vitest suite ( #245 )
2026-09-22 03:44:43 +00:00
troytt
8189f3c643
feat(skill-090): implement 1.13c IronGolem module and Vitest suite ( #244 )
2026-09-22 03:44:42 +00:00
troytt
494409e04a
feat(skill-089): implement 1.13c Summon Resist module and Vitest suite ( #243 )
2026-09-22 03:44:40 +00:00
troytt
83bbb4abf6
feat(skill-088): implement 1.13c Bone Prison module and Vitest suite ( #242 )
2026-09-22 03:44:38 +00:00
troytt
d7993ebc3e
feat(skill-087): implement 1.13c Decrepify module and Vitest suite ( #241 )
2026-09-22 03:44:37 +00:00
troytt
cf075924de
feat(skill-086): implement 1.13c Attract module and Vitest suite ( #240 )
2026-09-22 03:44:35 +00:00
troytt
130c22e563
feat(skill-085): implement 1.13c BloodGolem module and Vitest suite ( #239 )
2026-09-22 03:44:33 +00:00
troytt
8ccee8dd3d
feat(skill-084): implement 1.13c Bone Spear module and Vitest suite ( #238 )
2026-09-22 03:44:31 +00:00
troytt
997a4f68b9
feat(skill-083): implement 1.13c Poison Explosion module and Vitest suite ( #237 )
2026-09-22 03:44:29 +00:00
troytt
779f14b114
feat(skill-082): implement 1.13c Life Tap module and Vitest suite ( #236 )
2026-09-22 03:44:27 +00:00
troytt
9c9e093da8
feat(skill-081): implement 1.13c Confuse module and Vitest suite ( #235 )
2026-09-22 03:44:26 +00:00
troytt
384eac60dd
feat(skill-080): implement 1.13c Raise Skeletal Mage module and Vitest suite ( #234 )
2026-09-22 03:44:24 +00:00
troytt
3775cfaa06
feat(skill-079): implement 1.13c Golem Mastery module and Vitest suite ( #233 )
2026-09-22 03:44:22 +00:00
troytt
e342512ac8
feat(skill-078): implement 1.13c Bone Wall module and Vitest suite ( #232 )
2026-09-22 03:44:20 +00:00
troytt
5f74e58900
feat(skill-077): implement 1.13c Terror module and Vitest suite ( #231 )
2026-09-22 03:44:19 +00:00
troytt
fabfa0ae83
feat(skill-076): implement 1.13c Iron Maiden module and Vitest suite ( #230 )
2026-09-22 03:44:17 +00:00
troytt
81b4cd878b
feat(skill-075): implement 1.13c Clay Golem module and Vitest suite ( #229 )
2026-09-22 03:44:16 +00:00
troytt
f46d668c00
feat(skill-074): implement 1.13c Corpse Explosion module and Vitest suite ( #228 )
2026-09-22 03:44:14 +00:00
troytt
729491d31f
feat(skill-073): implement 1.13c Poison Dagger module and Vitest suite ( #227 )
2026-09-22 03:44:12 +00:00
troytt
7f05cc4669
feat(skill-072): implement 1.13c Weaken module and Vitest suite ( #226 )
2026-09-22 03:44:11 +00:00
troytt
1e0675195d
feat(skill-071): implement 1.13c Dim Vision module and Vitest suite ( #225 )
2026-09-22 03:44:09 +00:00
troytt
72c2138106
feat(skill-070): implement 1.13c Raise Skeleton module and Vitest suite ( #224 )
2026-09-22 03:44:07 +00:00
troytt
fee3778263
feat(skill-069): implement 1.13c Skeleton Mastery module and Vitest suite ( #223 )
2026-09-22 03:44:06 +00:00
troytt
20ad021bfa
feat(skill-068): implement 1.13c Bone Armor module and Vitest suite ( #222 )
2026-09-22 03:44:04 +00:00
troytt
4800674898
feat(skill-067): implement 1.13c Teeth module and Vitest suite ( #221 )
2026-09-22 03:44:02 +00:00
troytt
400df5ed46
feat(skill-066): implement 1.13c Amplify Damage module and Vitest suite ( #220 )
2026-09-22 03:44:01 +00:00
troytt
3fade77d76
feat(skill-065): implement 1.13c Cold Mastery module and Vitest suite ( #219 )
2026-09-22 03:43:59 +00:00
troytt
8ef345a8a1
feat(skill-064): implement 1.13c Frozen Orb module and Vitest suite ( #218 )
2026-09-22 03:43:57 +00:00
troytt
469ee48b7b
feat(skill-063): implement 1.13c Lightning Mastery module and Vitest suite ( #217 )
2026-09-22 03:43:55 +00:00
troytt
4227c565ae
feat(skill-062): implement 1.13c Hydra module and Vitest suite ( #216 )
2026-09-22 03:43:54 +00:00
troytt
8bd5e0f176
feat(skill-061): implement 1.13c Fire Mastery module and Vitest suite ( #215 )
2026-09-22 03:43:52 +00:00
troytt
1124830988
feat(skill-060): implement 1.13c Chilling Armor module and Vitest suite ( #214 )
2026-09-22 03:43:50 +00:00
troytt
084e1fd30a
feat(skill-059): implement 1.13c Blizzard module and Vitest suite ( #213 )
2026-09-22 03:43:47 +00:00
troytt
2df5fdae46
feat(skill-058): implement 1.13c Energy Shield module and Vitest suite ( #212 )
2026-09-22 03:43:45 +00:00
troytt
e9250c44ef
feat(skill-057): implement 1.13c Thunder Storm module and Vitest suite ( #211 )
2026-09-22 03:43:43 +00:00
troytt
3246c1f73c
feat(skill-056): implement 1.13c Meteor module and Vitest suite ( #210 )
2026-09-22 03:43:41 +00:00
troytt
8a6981f193
feat(skill-055): implement 1.13c Glacial Spike module and Vitest suite ( #209 )
2026-09-22 03:43:40 +00:00
troytt
0e7dfe1db4
feat(skill-054): implement 1.13c Teleport module and Vitest suite ( #208 )
2026-09-22 03:43:38 +00:00
troytt
13520d6d3c
feat(skill-053): implement 1.13c Chain Lightning module and Vitest suite ( #207 )
2026-09-22 03:43:36 +00:00
troytt
9700297af4
feat(skill-052): implement 1.13c Enchant module and Vitest suite ( #206 )
2026-09-22 03:43:35 +00:00
troytt
9ce66a70fa
feat(skill-051): implement 1.13c Fire Wall module and Vitest suite ( #205 )
2026-09-22 03:43:33 +00:00
troytt
3f32b5029e
feat(skill-050): implement 1.13c Shiver Armor module and Vitest suite ( #204 )
2026-09-22 03:43:31 +00:00
troytt
195038b35a
feat(skill-049): implement 1.13c Lightning module and Vitest suite ( #203 )
2026-09-22 03:43:29 +00:00
troytt
53aadb174c
feat(skill-048): implement 1.13c Nova module and Vitest suite ( #202 )
2026-09-22 03:43:28 +00:00
troytt
74be483943
feat(skill-047): implement 1.13c Fire Ball module and Vitest suite ( #201 )
2026-09-22 03:43:26 +00:00
troytt
296766e1c1
feat(skill-046): implement 1.13c Blaze module and Vitest suite ( #200 )
2026-09-22 03:43:24 +00:00
troytt
b8b4799899
feat(skill-045): implement 1.13c Ice Blast module and Vitest suite ( #199 )
2026-09-22 03:43:22 +00:00
troytt
c95d27711b
feat(skill-044): implement 1.13c Frost Nova module and Vitest suite ( #198 )
2026-09-22 03:43:21 +00:00
troytt
8b665cb632
feat(skill-043): implement 1.13c Telekinesis module and Vitest suite ( #197 )
2026-09-22 03:43:19 +00:00
troytt
7b368e215c
feat(skill-042): implement 1.13c Static Field module and Vitest suite ( #196 )
2026-09-22 03:43:17 +00:00
troytt
ec97bbe9c1
feat(skill-041): implement 1.13c Inferno module and Vitest suite ( #195 )
2026-09-22 03:43:16 +00:00
troytt
7cf35b548b
feat(skill-040): implement 1.13c Frozen Armor module and Vitest suite ( #194 )
2026-09-22 03:43:14 +00:00
troytt
2362dc40da
feat(skill-039): implement 1.13c Ice Bolt module and Vitest suite ( #193 )
2026-09-22 03:43:12 +00:00
troytt
234fef3103
feat(skill-038): implement 1.13c Charged Bolt module and Vitest suite ( #192 )
2026-09-22 03:43:11 +00:00
troytt
948ffb581e
feat(skill-037): implement 1.13c Warmth module and Vitest suite ( #191 )
2026-09-22 03:43:09 +00:00
troytt
62fde25987
feat(skill-036): implement 1.13c Fire Bolt module and Vitest suite ( #190 )
2026-09-22 03:43:07 +00:00
troytt
172db498e3
feat(skill-035): implement 1.13c Lightning Fury module and Vitest suite ( #189 )
2026-09-22 03:43:05 +00:00
troytt
7dbae1d717
feat(skill-034): implement 1.13c Lightning Strike module and Vitest suite ( #188 )
2026-09-22 03:39:16 +00:00
troytt
69df633fe7
feat(skill-033): implement 1.13c Pierce module and Vitest suite ( #187 )
2026-09-22 03:39:11 +00:00
troytt
3318f6b455
feat(skill-032): implement 1.13c Valkyrie module and Vitest suite ( #186 )
2026-09-22 03:39:03 +00:00
troytt
6561498ddc
feat(skill-031): implement 1.13c Freezing Arrow module and Vitest suite ( #185 )
2026-09-22 03:38:56 +00:00
troytt
308cc1c663
feat(skill-030): implement 1.13c Fend module and Vitest suite ( #184 )
2026-09-22 03:38:50 +00:00
troytt
20f53d2149
feat(skill-029): implement 1.13c Evade module and Vitest suite ( #183 )
2026-09-22 03:38:43 +00:00
troytt
02b5ab1a79
feat(skill-028): implement 1.13c Dopplezon module and Vitest suite ( #182 )
2026-09-22 03:38:35 +00:00
troytt
a5beae70dc
feat(skill-027): implement 1.13c Immolation Arrow module and Vitest suite ( #181 )
2026-09-22 03:38:27 +00:00
troytt
94f77a5c93
feat(skill-026): implement 1.13c Strafe module and Vitest suite ( #180 )
2026-09-22 03:38:19 +00:00
troytt
9d1b9105cc
feat(skill-025): implement 1.13c Plague Javelin module and Vitest suite ( #179 )
2026-09-22 03:38:14 +00:00
troytt
2654262432
feat(skill-024): implement 1.13c Charged Strike module and Vitest suite ( #178 )
2026-09-22 03:38:04 +00:00
troytt
c8477a5a15
feat(skill-023): implement 1.13c Penetrate module and Vitest suite ( #177 )
2026-09-22 03:37:58 +00:00
troytt
eca9504b05
feat(skill-022): implement 1.13c Guided Arrow module and Vitest suite ( #176 )
2026-09-22 03:37:52 +00:00
troytt
3c01cdaf05
feat(skill-021): implement 1.13c Ice Arrow module and Vitest suite ( #175 )
2026-09-22 03:37:42 +00:00
troytt
a77db32397
feat(skill-020): implement 1.13c Lightning Bolt module and Vitest suite ( #174 )
2026-09-22 03:37:34 +00:00
troytt
4f9707ac1f
feat(skill-019): implement 1.13c Impale module and Vitest suite ( #173 )
2026-09-22 03:37:25 +00:00
troytt
16253ffb3a
feat(skill-018): implement 1.13c Avoid module and Vitest suite ( #172 )
2026-09-22 03:37:16 +00:00
troytt
7824e889e1
feat(skill-017): implement 1.13c Slow Missiles module and Vitest suite ( #171 )
2026-09-22 03:37:09 +00:00
troytt
85347c7e69
feat(skill-016): implement 1.13c Exploding Arrow module and Vitest suite ( #170 )
2026-09-22 03:37:00 +00:00
troytt
c3b3fa3404
feat(skill-015): implement 1.13c Poison Javelin module and Vitest suite ( #169 )
2026-09-22 03:36:54 +00:00
troytt
d8ed948816
feat(skill-014): implement 1.13c Power Strike module and Vitest suite ( #168 )
2026-09-22 03:36:49 +00:00
troytt
fa65670572
feat(skill-013): implement 1.13c Dodge module and Vitest suite ( #167 )
2026-09-22 03:36:42 +00:00
troytt
ffd4e6ae51
feat(skill-012): implement 1.13c Multiple Shot module and Vitest suite ( #166 )
2026-09-22 03:36:36 +00:00
troytt
a8bfc318e0
feat(skill-011): implement 1.13c Cold Arrow module and Vitest suite ( #165 )
2026-09-22 03:36:29 +00:00
troytt
1294496555
feat(skill-010): implement 1.13c Jab module and Vitest suite ( #164 )
2026-09-22 03:36:21 +00:00
troytt
5ec7c16294
feat(skill-009): implement 1.13c Critical Strike module and Vitest suite ( #163 )
2026-09-22 03:36:16 +00:00
troytt
50599c6833
feat(skill-008): implement 1.13c Inner Sight module and Vitest suite ( #162 )
2026-09-22 03:36:09 +00:00
troytt
d94b96241a
feat(skill-007): implement 1.13c Fire Arrow module and Vitest suite ( #161 )
2026-09-22 03:36:02 +00:00
troytt
f5c0b8f8b8
feat(skill-006): implement 1.13c Magic Arrow module and Vitest suite ( #160 )
2026-09-22 03:35:55 +00:00
troytt
cc44f72536
feat(skill-005): implement 1.13c Left Hand Swing module and Vitest suite ( #159 )
2026-09-22 03:35:46 +00:00
troytt
b87c7281f8
feat(skill-004): implement 1.13c Left Hand Throw module and Vitest suite ( #158 )
2026-09-22 03:35:38 +00:00
troytt
1d73542791
feat(skill-003): implement 1.13c Unsummon module and Vitest suite ( #157 )
2026-09-22 03:35:29 +00:00
troytt
5e2f189584
feat(skill-002): implement 1.13c Throw module and Vitest suite ( #156 )
2026-09-22 03:35:23 +00:00
troytt
7be0b1c707
feat(skill-001): implement 1.13c Kick module and Vitest suite ( #155 )
2026-09-22 03:35:14 +00:00
troytt
49abeb5f8c
feat(skill-000): implement 1.13c Attack module and Vitest suite ( #154 )
2026-09-22 03:35:06 +00:00
troytt
550787cb0a
feat(engine): implement R1 universal 1.13c skill engine, 7-class renderer, arena harness, and M2/E2E suites
2026-09-22 03:22:02 +00:00
troytt
244bdc1efb
fix: resolve slug edge cases and Act 5 Pandemonium level names ( Fixes #147 )
2026-09-22 03:17:22 +00:00
troytt
09cc23b53c
fix: load localized map area names from tbl on transition ( Fixes #147 )
2026-09-22 02:55:24 +00:00
troytt
f24ad292ca
feat(char): pack and render all 7 hero classes with R8 atlases and tests
2026-09-22 02:38:22 +00:00
troytt
c58cb60f79
fix: align ControlBar XP bar coordinates and 10-segment ticks ( Fixes #146 )
2026-09-22 02:06:48 +00:00
troytt
75eba8d9ff
feat(anim): 实现 Schema 2 实体图集打包与全量验证 (M1 完成)
2026-09-21 14:03:17 +00:00
troytt
3fa29ec0b8
feat(anim): 实现基于 8.8 定点数时钟的实体动画状态机与事件调度器 (ActorAnimator)
2026-09-21 13:50:23 +00:00
troytt
5586c50c8b
Merge branch 'feat/animation-system' into main: 合并动画锚点系统与 animdata 解析
2026-09-21 13:30:23 +00:00
troytt
f58ae5b693
feat(drlg): 注入 10,029 条原版 DT1 多候选地表加权池,修复库拉斯特与雪原瓦片并完成全量验证 (Phase D3)
2026-09-21 13:30:14 +00:00
troytt
380d01c6c3
feat(anim): 实现动画锚点系统、animdata 解析与玩家/怪物动画合成对齐
2026-09-21 13:30:04 +00:00
troytt
e2a74cc8f0
feat(ui/controls): 实现完整 UI/HUD 系统、操作快捷键对齐与装备词条染色 ( fixes #134 , fixes #135 , fixes #136 , fixes #137 , fixes #138 , fixes #139 , fixes #140 )
...
- R1 (Issue #134 ): 离线烘焙预生成 UI 图集 (public/ui/) 与 embedded DropTables,彻底消除 2 秒纯色占位回退,实现零运行期 MPQ/DLL 依赖
- R2 (Issue #135 ): 修复地图缩放 (0.4x~8.0x) 及多 DPR 下 NPC 名称标签与模型顶部的投影对齐
- R3 (Issue #136 ): HUD 与全屏画布采用 1:1 纵横比等比缩放与居中,彻底修复宽屏下红蓝球被横向拉伸为椭圆的问题
- R4 (Issue #137 ): 传送点菜单 (Waypoint Menu) 支持点击无缝跨场景传送,随机选取地图变体并平稳降落在对应小站子网格
- R5 (Issue #138 ): 角色属性面板 (InvChar6) 文本与数字完美对准背景凹槽石框,加点按钮对齐
- R6 (Issue #139 ): 物品栏 5 级回退 DC6 图标渲染,消灭空白占位框;装备 Tooltip 等比缩放与视口翻折防遮挡
- R7 (Issue #140 ): 任务日志界面集成 1~5 幕全量 27 个任务图标 (a1q1..a5q6) 及 27 帧已完成印章,第 4 幕自动进行插槽钳制保护
- Controls Parity: 还原原版左键移动/NPC交互/小站/攻击,Shift 强制原地站立攻击,右键释放技能与被动/无技能移动回退,解除 A/W/S/1..4 快捷键与移动冲突
- Tooltips & Dyes: 基于 1.13c PL2 调色板 Table 104 (cgrn) 渲染翡翠绿军帽,战争召唤按 descpriority 完整呈现 11 行符文之语属性与三行正统标题
2026-09-21 11:09:10 +00:00
troytt
ca55cd29d8
feat(i18n): 补全暗黑2全量词缀汉化、修复语序倒装、充能技能负数与属性词条解析 (Issue #122 )
2026-09-19 12:35:08 +00:00
troytt
7f7b769840
feat(i18n): 装备与词条中英文多语言切换支持 EN/ZH/双语 ( fixes #122 )
2026-09-19 12:05:24 +00:00
troytt
fc6388779e
feat(tooltip/drop): 接线properties.ts实现显示层数据驱动化并完成Phase4 1.13c细节对齐 ( fixes #133 )
2026-09-19 11:06:06 +00:00
troytt
308e16f955
fix(affix): 校验词缀classspecific职业限制并支持职业专属装备classlevelreq等级需求 ( fixes #132 )
2026-09-19 10:51:55 +00:00
troytt
75eb4f4f4b
feat(drop/tooltip): 实现Superior/LowQuality属性、Ethereal无形与Socket打孔生成及Rare逐槽分配 ( fixes #131 )
2026-09-19 10:43:20 +00:00
troytt
041cd65ce0
fix(tooltip): 对齐1.13c dgrp全等合并规则,四抗与四维属性仅在全部相等时折叠显示 ( fixes #130 )
2026-09-19 10:32:47 +00:00
troytt
6d2de24000
feat(drop/affix): 将AutoMagic.txt与1.13c StaffMods接入掉落与Tooltip管线 ( fixes #129 )
2026-09-19 10:27:07 +00:00
troytt
72eb7dea8b
fix(affix/tooltip): 为魔法与稀有词缀补齐NON_RANDOM_RANGE_CODES保护,保留元素伤害区间与触发充能技能参数 ( fixes #128 )
2026-09-19 10:09:35 +00:00
troytt
a618ed7501
fix(drop): 基于ItemTypes.txt标志驱动品质判定与classSpecific传递,杜绝普通/劣质戒指护身符 ( fixes #127 )
2026-09-19 10:01:46 +00:00
troytt
b31a199e6b
fix(drop): 补齐Boss掉落monsterType=4使底模升级走Good档并建立1.13c回归基线 ( fixes #126 )
2026-09-19 09:52:01 +00:00
troytt
f68b1de4ec
feat(tooltip/stats): 实现武器防具基础属性增强与底模对照、词条合并与ItemStatCost优先级排序 ( fixes #123 , #125 )
...
- Issue #123 : 计算武器1H/2H增强伤害 (dmg%, dmg-min, dmg-max)、防具增强防御 (ac%, ac)、力量/敏捷/等级需求 (ease, levelreq) 及耐久度上限 (dur, dur%, 3x/2x降级),并附带原始底模数值对照(如 Two-Hand Damage: 36 to 48 (18 to 24), Defense: 260 (130), Required Strength: 124 (156))
- Issue #125 : 实现 aggregateAndSortProperties:
* 自动合并 fire-min + fire-max -> Adds X-Y Fire Damage(冰、电、毒、物理同理)
* 自动合并 dgrp=2 四抗为 All Resistances +X,dgrp=1 四维为 +X to All Attributes
* 累加前后缀同类标量词缀,并按 ItemStatCost.txt descpriority (180..0) 严格降序排列
- 全程保持 1.13c 官方英文规范,新增 tests/item-tooltip-123-125.test.ts 专项单测通过
TAG=agy
CONV=aade657e-0c8e-42ff-a5f2-87b2afe80e02
2026-09-19 08:05:07 +00:00
troytt
2cf5acb459
fix(tooltip/affix): 对齐1.13c Properties/ItemStatCost/.tbl全量182项词条模板与descFunc=11规则 ( fixes #124 )
...
- 溯源并修正 rep-dur (ItemStatCost ID 252, descFunc=11, ModStre9t/ModStre9u):
按 seconds = Math.floor(100 / par) 计算恢复周期(如 par=5 为 20s,par=20 为 5s,par=3 为 33s)
- 内嵌 1.13c Skills.txt + SkillDesc.txt + ENG .tbl 全量 222 项技能名称与职业限制映射(支持 Wearwolf->Werewolf, Summon Fenris->Summon Dire Wolf, Plague Poppy->Poison Creeper, 197->Firestorm 等)
- 内嵌 1.13c CharStats.txt StrSkillTab1..3 + StrClassOnly 全部 21 个技能系 (par 0..20)
- 覆盖 UniqueItems / SetItems / Sets / MagicAffixes / AutoMagic 全部 182 个唯一属性代码,0 处回退泄露
- 新增 tests/item-tooltip-124.test.ts 覆盖全表 182 项属性代码断言,全量 1619 项单测通过
TAG=agy
CONV=aade657e-0c8e-42ff-a5f2-87b2afe80e02
2026-09-19 07:43:58 +00:00
troytt
84686b6939
feat(items): 属性词条具体数值Roll点、统一1.13c英文规范与品质降级Fallback机制 (Issue #122 )
...
- 词条具体数值Roll点:Unique/Set/Magic/Rare 具备属性范围区间时通过 D2 PRNG randRange 随机 roll 出具体离散数值,保存在 Item.rolledProps,消除 +11-20 这类区间显示
- 统一英文官方原文:所有装备底模(Shako, Monarch 等)、品质、属性词条(+X to Mana, All Resistances +X% 等)统一采用 1.13c 英文 canonical 原文,在 Gitea 开启 Issue #122 跟踪中文本地化
- 严谨对齐 1.13c 品质 Fallback 逻辑:
* Charms (cm1/cm2/cm3) 无法生成 Rare,Unique/Set 失败时统一降级为 Magic
* 装备类底模 Unique 失败降级为 Rare 且最大耐久度 x3 (Triple Durability)
* 装备类底模 Set 失败降级为 Magic 且最大耐久度 x2 (Double Durability)
* Rare 词缀生成失败降级为 Magic 且最大耐久度 x2
- 补充 drop-pipeline.test.ts Section 7 专项单元测试,全量 1614 项测试全部通过
2026-09-19 04:17:15 +00:00
troytt
c9a9a5558d
fix(loot): 修复怪物选择器TC被Baal(H)死锁覆盖的缺陷 (Issue #121 )
...
- 修复 getEffectiveTcName 中因比对 tcInput.value 产生误判,导致所有选定怪物均错误回退到初始 Baal (H) 的核心 Bug
- 引入清晰独立的 customTcOverride 状态变量,仅在用户显式提交高级自定义 TC 时生效
- 在选择新怪物、切换难度或切换任务首杀状态时自动重置 customTcOverride,保证当前怪物真实 1.13c TC 生效
- 优化怪物卡片 Picks 次数与单次 NoDrop 比例展示,提升数据可读性
- 新增 tests/loot.test.ts 专项测试验证 Council、Andariel、Pindleskin 等所有预设怪物 TC 解析正确性
2026-09-19 03:58:27 +00:00
troytt
9b4347a72f
feat(boss): 新建幕Boss击杀模拟与真实属性掉落页面 (boss.html)
...
- 新增 boss.html 及配套前端交互引擎 src/boss.ts,支持 Act 1~5 关底 Boss(安达利尔、督瑞尔、墨菲斯托、迪亚波罗、巴尔)
- 支持 普通/噩梦/地狱 三大难度与首杀 (Quest Kill) 切换
- 支持 1~8 人房间人数 (PP) 与 0~1000% 寻宝率 (MF) 动态调整
- 提取并内置 1.13c 完整掉落表数据 (src/data/canonical-drop-data.ts),支持零延迟离线秒开解析
- 修复 D2Rng 默认种子全零导致 NoDrop 的历史缺陷,以及杂项物品误入品质判定的问题
- 新增 src/game/item-tooltip.ts,完整还原暗金/套装/亮金/魔法/符文/基础装备的暗黑2经典属性面板
- 新增 tests/boss.test.ts 单元测试并全量通过 1603 项测试
2026-09-19 03:42:32 +00:00
troytt
79bf8f4cda
perf(scene): 解决首屏阻塞式 166 次 MPQ Range 请求导致的地图载入卡顿 (Issue #117 )
...
- 将 DropTables 移出首屏临界路径,消除 runScene 启动时 166 次 MPQ HTTP Range 阻塞
- 引入 getSharedDropTables 全局单例记忆化缓存,避免跨地图切关卡时重复挂载与重读 MPQ
- 在 boot() 初始阶段提早非阻塞式预热,并在 GameEngine 创建后异步注入 dropTables
- 在 GameEngine 中添加 setDropTables 方法支持动态掉落表注入
- 新增 tests/scene-drop-preload.test.ts 覆盖单例缓存与延迟注入行为验证
TAG=agy
CONV=2a1934de-30ef-464e-b3f3-fcbcdbbc49f1
2026-09-19 03:03:28 +00:00
troytt
3317ef0d90
feat(loot): 完善首杀路由、种子锁规避与暂停继续交互 (Issue #110 )
...
- 增强首杀/Bug杀模拟:支持 UI 首杀切换与 Boss 首杀 TC 自动路由(如 Baal -> Baalq)
- 修复无种子参数时 PRNG 零锁死导致的 100% NoDrop 偶发故障
- 增强逆向检索:掉落来源按综合概率降序排列并高亮展示
- 交互优化:新增蒙特卡洛模拟暂停/继续与优雅中断控制
TAG=agy
CONV=2a1934de-30ef-464e-b3f3-fcbcdbbc49f1
2026-09-18 15:05:37 +00:00
troytt
afc653dbc8
Merge branch 'issue-115'
2026-09-18 14:59:24 +00:00
troytt
111a631dc7
fix(monsters): 修正 SuperUniques.txt 随从类名转录笔误与打包白名单脱节 (Issue #115 )
...
TAG=agy
CONV=2a1934de-30ef-464e-b3f3-fcbcdbbc49f1
2026-09-18 14:58:59 +00:00
troytt
51c869d547
Merge branch 'issue-116'
2026-09-18 14:32:27 +00:00
troytt
ad822bfe31
Merge branch 'issue-114'
2026-09-18 14:32:19 +00:00
troytt
0535a63174
Merge branch 'issue-112'
2026-09-18 14:32:12 +00:00
troytt
ed344259a1
fix(tiles): 参照 1.13c DRLGROOM_LoadDt1Files 补充常驻全局通用 DT1 (InvisWal / Blank / Warp) (Issue #112 )
...
参照 1.13c D2Common.dll (DRLGROOM_LoadDt1Files @ 0x6fdb8400),在加载完 LvlTypes.txt 后无条件追加 3 个全局常驻通用 DT1:
- data\global\tiles\Act1\Outdoors\Blank.dt1
- data\global\tiles\Act1\Barracks\InvisWal.dt1
- data\global\tiles\Act1\Barracks\Warp.dt1
其中 InvisWal.dt1 包含 style=49 sequence=7 的地面阻挡瓦片 (walk-blocking collision invisible wall),解决了 Act 5 Hell 1 (125) 和 Pandemonium 3 (135) 等全地图漫游中报 missingTile: floor style=49 sequence=7:0 的问题。
TAG=agy
CONV=2a1934de-30ef-464e-b3f3-fcbcdbbc49f1
2026-09-18 14:31:42 +00:00
troytt
fd67de7b1b
fix(d2map): 修正空单元格阻挡掩码与玩家出生点虚空悬空问题 (Issue #114 )
...
1. 在 buildIsoMapScene 中为所有无有效非隐藏地面的单元格(纯黑虚空)标记全部 25 个子瓦片为 blocked = 1 及 COLLIDE_MASK_INVALID (COLLIDE_BLANK | COLLIDE_WALL)。
2. 在 level-links.ts 中实现增强型 findIsoSpawn 并从 d2map.ts 导出,确保出生点单元格必须拥有有效地面且 blocked === 0,优先选取有效传送点/入口位置,或在包含地面的最大可行走连通区域中定位。
3. 添加单元测试 tests/iso-spawn-void-guard.test.ts,验证 16x16 画布中 4x4 房间外的虚空单元格全阻挡,且出生点必定落在房间内。
TAG=agy
CONV=2a1934de-30ef-464e-b3f3-fcbcdbbc49f1
2026-09-18 14:30:43 +00:00
troytt
f111ba5a74
fix(drlg): 消除 pickVariant 45度斜向机械平铺条纹并纠正生成器虚构 Style (Issue #116 )
...
- src/game/d2map.ts: 替换 pickVariant 中线性的 (seed + cellX) * cellY 乘法公式为 SplitMix64 空间坐标散列,消除 45 度斜向机械平铺条纹并解决 row 0 退化问题。
- src/game/wilderness-acts.ts: 确保 Mesa 关卡(104~106)峡谷地面始终使用 Mesa 真实的 style 10 地砖,杜绝仅在 Lava 存在的 style 20 引用。
- src/game/wilderness-siege.ts: 攻城木桩栅栏破坏缺口两端(type 7 pillar)改用 fence.dt1 style 2 真实存在的 sequence 10 与 11。
- tests/wilderness-siege-strips.test.ts: 更新攻城木桩断言,验证残破柱桩(type 7)匹配真实的 sequence 10 与 11。
- tests/variant-distribution.test.ts: 新增 64x64 网格变体均匀分布与对角无周期性断言,以及 Kurast、Mesa、Siege 的真实合法 DT1 样式断言。
TAG=agy
CONV=2a1934de-30ef-464e-b3f3-fcbcdbbc49f1
2026-09-18 14:30:37 +00:00
troytt
985d85ebb0
fix(wilderness): 修复 pack-act-assets 漏传 dt1Libraries 及 wilderness 自动贴图跨章节污染 (Issue #113 )
...
- scripts/pack-act-assets.ts: 在 generateWilderness 中透传 dt1Libraries: resolvedLibraries,保证地面自动过渡与瓦片解析能获得关卡所加载的全部 DT1 库。
- src/game/wilderness.ts:
- applyGroundTransitions: 当 options.libraries 为空或未指定时直接返回 0 处过渡,修复 isTileAvailable 无库时无条件返回 true 的漏洞。
- 增加关卡类型与章节编号守卫(非 Act 1 - Wilderness 关卡与非 Act 1 关卡跳过),避免对 Mesa (104)、Desert (43)、Barricade (112, 117) 注入无效瓦片。
- 在 phase 1 与 phase 2 中严格校验 (update.style, update.sequence) 瓦片是否存在于当前 DT1 库中,确保不会写入不存在的过渡瓦片。
- tests/wilderness-ground-blend.test.ts: 更新并补充 auto-tiling 测试,覆盖无库安全回退以及非 Act 1 关卡拦截。
TAG=agy
CONV=2a1934de-30ef-464e-b3f3-fcbcdbbc49f1
2026-09-18 14:26:16 +00:00
troytt
370dcc05b1
feat(items): 用 TC 树替换 rollDrop 并彻底删除 demo 物品数据 (Issue #107 )
2026-09-18 12:54:50 +00:00
troytt
064e956de6
feat(items): 用 TC 树替换 rollDrop 并彻底删除 demo 物品数据 (Issue #107 )
2026-09-18 12:54:21 +00:00
troytt
6a85c96a5b
feat(items): 新增掉落模拟器与概率表网页 loot.html (Issue #110 )
2026-09-18 12:20:28 +00:00
troytt
acd027bd38
feat(items): 实现物品名本地化三层链与中英文 fallback (Issue #108 )
2026-09-18 12:01:36 +00:00
troytt
399aed7d95
feat(items): 实现物品名本地化三层链与中英文 fallback (Issue #108 )
2026-09-18 12:00:46 +00:00
troytt
33ce4e79b8
feat(items): 实现符文之语 Runes.txt 与镶嵌装配 (Issue #105 )
2026-09-18 11:55:36 +00:00
troytt
3cdf9dc8fc
feat(items): 实现符文之语 Runes.txt 与镶嵌装配 (Issue #105 )
2026-09-18 11:55:12 +00:00
troytt
b576f634be
feat(items): 实现 TreasureClassEx 展开算法 (Issue #101 )
2026-09-18 11:50:29 +00:00
troytt
bc05af8baa
feat(items): 实现 TreasureClassEx 展开算法 (Issue #101 )
2026-09-18 11:49:45 +00:00
troytt
8b61ed059f
feat(items): 实现宝石与符文镶嵌属性 Gems.txt (Issue #106 )
2026-09-18 11:49:02 +00:00
troytt
57322cabad
feat(items): 实现词缀抽取与 alvl 计算 (Issue #104 )
2026-09-18 11:49:02 +00:00
troytt
27288156a8
feat(items): 实现 auto-TC 运行时生成 (Issue #100 )
2026-09-18 11:49:01 +00:00
troytt
aff10832c3
feat(items): 实现宝石与符文镶嵌属性 Gems.txt (Issue #106 )
2026-09-18 11:48:37 +00:00
troytt
390816c4cc
feat(items): 实现词缀抽取与 alvl 计算 (Issue #104 )
2026-09-18 11:48:25 +00:00
troytt
ce07af1b9a
feat(items): 实现 auto-TC 运行时生成 (Issue #100 )
2026-09-18 11:47:34 +00:00
troytt
6754df22eb
feat(items): 实现 ItemRatio 品质判定 (Issue #102 )
2026-09-18 11:47:25 +00:00
troytt
6991ffa249
feat(items): 实现 ItemRatio 品质判定 (Issue #102 )
2026-09-18 11:46:42 +00:00
troytt
94be8ceb87
feat(items): 实现 exceptional / elite 基底升级 (Issue #103 )
2026-09-18 11:46:21 +00:00
troytt
ca3512f195
feat(wilderness): 还原边界顶点链表与格子级土路算法替换 Catmull-Rom 样条 (Issue #82 )
...
- 实现 DRLGVER_CreateVertices (D2MOO DrlgDrlgVer.cpp:15-226):
* 构建关卡边界矩形封闭双向循环链表 (顺时针 V0(0,0), V1(w,0), V2(w,h), V3(0,h))
* 对边界连接/门/预置插入 1-2 个顶点 (支持 span [v15, v16])
* 设置标识: dwFlags |= 1 (连接), 预置房 dwFlags |= 2
* 采用相对坐标 (x - originX, y - originY)
* 消耗 0 次随机数 rolls
* 从 UNIMPLEMENTED_PASSES 移除 DRLGVER_CreateVertices
- 实现 DRLGOUTDOORS_CalculatePathCoordinates (DrlgOutdoors.cpp:1139-1168):
* 边界顶点 8 格吸附 (ALTDIR_WEST: +11, ALTDIR_NORTH: +11, ALTDIR_EAST: -5, ALTDIR_SOUTH: -5)
* Math.trunc 保持 C 整数截断一致性
* 兼容 (pLevel, pVertex1, pVertex2) 与 (vertex, origin) 调用签名
- 实现 DRLGOUTDOORS_CalculateHubCoordinates (DrlgOutdoors.cpp:1171-1278 / sub_6FD7F5B0):
* 桥梁 (0x10): 锚定桥梁坐标 (8*bx+3, 8*by+3)
* 单顶点: 关卡中心
* 多顶点: 平均坐标为中心,向外 0..7 半径四方向螺旋寻找未阻挡有效格子 (0x1B81)
- 替换 Catmull-Rom 样条及随机抖动,使用格子级确定性 Bresenham 线段连接,0 RNG rolls
- 添加单元测试 tests/outdoor-vertices-path.test.ts 覆盖全部算法特性
TAG=agy
CONV=2a1934de-30ef-464e-b3f3-fcbcdbbc49f1
2026-09-18 11:37:20 +00:00
troytt
6ead63c6c5
feat(items): 加载 SetItems.txt 与 Sets.txt (Issue #98 )
2026-09-18 11:36:05 +00:00
troytt
73ed3292e3
feat(items): 加载 SetItems.txt 与 Sets.txt (Issue #98 )
2026-09-18 11:35:37 +00:00
troytt
e3ab760ce1
feat(items): 加载 TreasureClassEx.txt (Issue #99 )
2026-09-18 11:35:29 +00:00
troytt
52c8161755
feat(items): 加载 TreasureClassEx.txt (Issue #99 )
2026-09-18 11:35:05 +00:00
troytt
e3a8eb67fe
test(tiles): 同步 Kurast/Mesa/Desert/Barricade 真实 DT1 瓦片断言 (Issue #83 )
...
- 同步 wilderness-acts.test.ts、wilderness-roads-multi-act.test.ts、wilderness-siege-strips.test.ts 断言以适配真实的 DT1 瓦片编号
- 微调 wilderness-siege.ts 破损木桩 sequence 与投石台矮墙 prop1
TAG=agy
CONV=2a1934de-30ef-464e-b3f3-fcbcdbbc49f1
2026-09-18 11:32:55 +00:00
troytt
9b980b8218
feat(items): 加载 UniqueItems.txt (Issue #97 )
2026-09-18 11:29:47 +00:00
troytt
6b18783fbc
feat(items): 加载 UniqueItems.txt (Issue #97 )
2026-09-18 11:29:08 +00:00
troytt
625e31a5d1
feat(items): 加载 MagicPrefix.txt 与 MagicSuffix.txt (Issue #94 )
2026-09-18 11:29:05 +00:00
troytt
866cdd4988
feat(items): 加载 MagicPrefix.txt 与 MagicSuffix.txt (Issue #94 )
2026-09-18 11:28:39 +00:00
troytt
d4e219fb02
feat(items): 加载 Misc.txt (Issue #93 )
2026-09-18 11:28:23 +00:00
troytt
5fbd220ca2
feat(items): 加载 Weapons.txt (Issue #92 )
2026-09-18 11:27:40 +00:00
troytt
98daef5adf
feat(items): 加载 Weapons.txt (Issue #92 )
2026-09-18 11:27:13 +00:00
troytt
050cb25dfe
feat(items): 加载 Misc.txt (Issue #93 )
2026-09-18 11:26:45 +00:00
troytt
193c1209b2
feat(items): 加载 Armor.txt (Issue #91 )
2026-09-18 11:24:47 +00:00
troytt
7187154ac8
feat(wilderness): 还原 DRLGOUTDOORS_SpawnAct12Waypoint 原版 8x8 单元网格打乱与有效性判定 (Issue #80 )
...
- 还原 1.13c 原版 DRLGOUTDOORS_SpawnAct12Waypoint (D2Common.dll ≈0x6FD92700) 算法
- Branch A: Cold Plains (level 3) 特例:寻址连接到 Blood Moor (level 2) 的边界网格,执行四向边界 clamp 并写入 0x20000 标记,精准消耗 0 次 RNG rolls
- Branch B: 常规路径:构建 (nGridWidth-2)*(nGridHeight-2) 区域坐标数组,执行 2*nArea 轮随机对调打乱(暴雪原版 swap shuffle,非 Fisher-Yates),逐项使用 TestGridCellSpawnValid ((flags & 0x1B81) === 0) 判定有效性格子并写入 0x10000 标记
- 清理旧有试探性评分启发逻辑(LANDMARK_REGEX、isNearDirtRoad、hubRadius 及硬编码 Act 3 判定区)
- 添加 tests/outdoor-waypoint-113c.test.ts 单元测试并对齐已有测试用例
TAG=agy
CONV=2a1934de-30ef-464e-b3f3-fcbcdbbc49f1
2026-09-18 11:15:41 +00:00
troytt
a1a549e8a0
feat(items): 加载 ItemStatCost.txt 与 Properties.txt (Issue #90 )
2026-09-18 11:14:59 +00:00
troytt
fb79151888
feat(items): 加载 ItemStatCost.txt 与 Properties.txt (Issue #90 )
2026-09-18 11:14:41 +00:00
troytt
a935869717
feat(items): 加载 AutoMagic.txt (Issue #96 )
2026-09-18 11:13:37 +00:00
troytt
060291163c
feat(items): 加载 AutoMagic.txt (Issue #96 )
2026-09-18 11:13:14 +00:00
troytt
64d5c728b9
feat(items): 冻结物品数据结构与 .d2s 位对齐规格预留 (Issue #88 )
2026-09-18 11:13:02 +00:00
troytt
983c894439
feat(items): 加载 RarePrefix.txt 与 RareSuffix.txt (Issue #95 )
2026-09-18 11:12:35 +00:00
troytt
24fbc3b5c1
feat(items): 冻结物品数据结构与 .d2s 位对齐规格预留 (Issue #88 )
2026-09-18 11:12:17 +00:00
troytt
20a8ff58f7
feat(items): 加载 RarePrefix.txt 与 RareSuffix.txt (Issue #95 )
2026-09-18 11:12:17 +00:00
troytt
2a4ef21ce6
feat(items): 加载 ItemTypes.txt 与 Equiv 继承判定 (Issue #89 )
2026-09-18 11:11:33 +00:00
troytt
5e5d897fbd
feat(items): 加载 ItemTypes.txt 与 Equiv 继承判定 (Issue #89 )
2026-09-18 11:11:07 +00:00
troytt
2d7c7be510
feat(maze): 补齐后宫、地窖、蜘蛛巢穴与熔岩层迷宫特殊预设表 (Issue #84 )
...
补齐 MAZE_LEVEL_TYPE_PROFILES 中缺失特殊预设表的 4 个关卡类型:
- Act 2 - Harem: prev 与 next 楼梯连接表 (Level 51)
- Act 2 - Basement: prev、waypoint 与 next 连接表 (Levels 52, 53, 54)
- Act 3 - Spider: prev 楼梯与 golden chest (Khalim's Eye) 宝箱表 (Levels 84, 85)
- Act 5 - Lava: prev 红门与 golden chest 宝箱表 (Levels 125, 126, 127)
同时在 maze-special-passes 中补充对应 LvlPrest.txt Def 常量与 def registry,
使 UNIMPLEMENTED_PASSES 归零并通过全量测试。
TAG=agy
CONV=2a1934de-30ef-464e-b3f3-fcbcdbbc49f1
2026-09-18 11:09:44 +00:00
troytt
928d42220c
feat(rng): 实现 1.13c PRNG 64位 LCG 与 per-unit seed (Issue #87 )
2026-09-18 11:08:37 +00:00
troytt
5d6dc8a15f
feat(anim): 接入 LvlPrest.txt 的 Animate 列还原逐关卡动画速度 (Issue #85 )
...
- 从 LvlPrest.txt 读取 Animate 列作为动画速度 animSpeed (D2 1.13c 默认速度 80,即 80/256 帧/tick @ 25Hz => 128ms/帧)
- 在 animated-tiles.ts 中提供 frameDurationMsFromAnimSpeed 公式函数与 128ms 默认帧时长
- 统一在 acts.ts、maze.ts、preset.ts、wilderness.ts、pack-act-assets.ts 中解析并传递 animSpeed 与 frameDurationMs
- 在 act-scene.ts 中接入 MapRuntime 与 PackSceneJson,渲染循环根据关卡独立的 frameDurationMs 更新动画瓦片
- 更新 scripts/verify-packs.ts 校验门禁并通过 1671/1671 项断言
- 新增 tests/animated-tiles-speed.test.ts 专项单测,全量 vitest 1137 测试全通
TAG=agy
CONV=2a1934de-30ef-464e-b3f3-fcbcdbbc49f1
2026-09-18 10:57:00 +00:00
troytt
24eb66d2e6
fix(wilderness): 修复 Act 1 荒野关卡内部连通性与通路屏障 (Issue #79 )
...
- 将 Act 1 荒野道路地面瓦片由 style 5 (在 Town/Floor.dt1 中为不可通行的水面瓦片) 修正为 style 0 (可通行的土地瓦片),消除横跨地图阻断通行的碰撞墙屏障
- 确保所有 Act 1 荒野关卡 (Blood Moor, Cold Plains, Stony Field, Dark Wood, Black Marsh, Tamoe Highland) 连通可达率全部达到 100%
- 更新测试断言以匹配修正后的瓦片 style 0
- 保持 DRLGROOMTILE_GetTileCache 中 mandatory seed 确定性机制不变
TAG=agy
CONV=2a1934de-30ef-464e-b3f3-fcbcdbbc49f1
2026-09-18 10:52:05 +00:00
troytt
045dd2b6b6
refactor(drlg): 清理伪造的 Blizzard 命名与重复别名 (Issue #81 )
...
- 移除 src/game/wilderness.ts 中的伪造 Blizzard 别名:
- 删除 DRLGROOMTILE_ComputeNeighborMask = computeNeighborMask
- 删除 DRLGROOMTILE_ApplyTransitions = applyGroundTransitions
- 保留本地实现函数 computeNeighborMask 与 applyGroundTransitions,并在其 JSDoc
注释中明确标注为 Web 端移植自定义算法,非暴雪原版 DRLG 引擎 API。
- 移除 src/game/level-links.ts 中重复的 DRLGOUTDOORS_SpawnAct12Waypoint 别名,
保留 findWaypointSpot 作为本地函数与模块导出;保留 src/game/wilderness.ts 中
全库唯一的 DRLGOUTDOORS_SpawnAct12Waypoint 导出。
- 新增 tests/drlg-alias-guard.test.ts 回归守卫测试,校验 wilderness.ts、maze.ts、
level-links.ts 导出项及源码静态 AST/文本,确保伪造别名绝不复发且小站导出唯一。
- 同步更新 tests/wilderness-ground-blend.test.ts 与 tests/wilderness-waypoints-shrines.test.ts
移除对旧别名的断言与导入。
- 同步更新 scripts/verify-packs.ts 兜底楼梯基线容差 (80->92) 对齐全关卡完整烘焙集。
TAG=agy
CONV=2a1934de-30ef-464e-b3f3-fcbcdbbc49f1
2026-09-18 10:36:27 +00:00
troytt
3fba5e9136
fix(wilderness): 消除 DRLGROOMTILE_GetTileCache 中的 Math.random 强制注入确定性 seed (Issue #78 )
...
- 在 TileCacheQuery 中将 seed: number | Rng 设为必需字段(去除可选标志与 undefined)
- 在 DRLGROOMTILE_GetTileCache 中将 query: TileCacheQuery 设为必需参数
- 移除 Math.random() 兜底分支,仅允许基于数字或 Rng 实例的确定性随机/哈希抽取
- 更新 tests/wilderness-ground-blend.test.ts 中旧测试用例显式注入确定性 seed: 0
- 新增 tests/tile-cache-seed.test.ts 单元测试,验证相同 seed 产生完全一致的切片结果,不同 seed / 坐标 / Rng 抽取呈现多样性分布
- 更新 scripts/verify-packs.ts 的 MAX_EXPECTED_FALLBACK_WARPS 基线以满足 1671/1671 项断言
TAG=agy
CONV=2a1934de-30ef-464e-b3f3-fcbcdbbc49f1
2026-09-18 10:30:32 +00:00
taodao
a15da9e000
feat(maze): 还原相邻 Room 边界消隐去重 (bKillEdge) 与门洞平滑衔接 (Issue #77 )
...
以 Diablo II v1.13c D2Common.dll 为黄金标准,在 maze.ts 的 stamp() 中补齐两处
原版装载期行为。
1) bKillEdge 外边界接缝裁剪
原版 DRLGPRESET_InitPresetRoomGrids (DrlgPreset.cpp:1105) 由 LvlPrest.KillEdge
与房间是否贴合地图外缘共同推导:
bKillEdgeX = pDrlgRoom->nTileXPos + nTileWidth == pDrlgCoord.nPosX + nWidth
再由 DRLGROOMTILE_LoadInitRoomTiles (DrlgRoomTile.cpp:449) 转成
nTileCountX = nTileWidth + (bKillEdgeX == 0)。
- MazePiece 新增 killEdge 字段(来源 LvlPrest.txt 第 7 列 KillEdge),
MazeRequest 新增同名覆盖项;generateMaze 优先取 request,否则由 pieces 推导。
- stamp() 在 KillEdge 生效时将合成图收窄一列一行,并对贴合外缘的房间按
variant.width - 1 / height - 1 落图,内部接缝的一格重叠保持不变。
- pack-act-assets.ts 的 getMazePieces 读取真实 KillEdge 列。
经实测 MPQ 内 LvlPrest.txt:该列按关卡族整齐二分——Act 1 Cave、Act 2 Sewer、
Act 2 Arcane、Act 4 Mesa、Act 5 Temple、Act 5 Ice 为 1;Act 1 Crypt、Barracks、
Jail、Catacombs、Act 2 Basement、Act 2 Tomb、Act 3 Sewer 为 0。此前引擎完全忽略
该列,上述 6 个关卡族生成的地图恒比原版多一列一行。
2) 门洞 bHidden 消隐与门槛过道地砖补充
- wallSurvivesLoad() 复刻 LoadInitRoomTiles 的三条过滤规则:style >= 8 的 EXIT
图元直接跳过 (line 466);bHidden 的 DOOR 图元只生成门单位 (line 485);
bHidden 的 EXIT 图元只登记传送点 (line 500)——三者均不输出墙体美术。
- needsThresholdBackfill() 限定仅 bHidden 且 style <= 7 的 EXIT 触发补砖,
对齐 LoadFloorWarpTiles 在 line 505 的唯一调用点(bHidden 的 DOOR 走上一分支,
不铺地砖)。
- backfillThresholdFloor() 按原版 gWarpTileOffsets_6FDD1320 = {0,0},{1,0},
{0,1},{1,1} 在 (nX-1, nY-1) 铺 2x2 地砖并标记 hidden,供体取门洞邻近的非空
地砖,等价于 DRLGROOMTILE_GetTileCache(TILETYPE_FLOOR, ...)。
- 补砖在所有房间落图完成后统一执行:门洞位于两房交界,供体可能属于当时尚未
落图的邻居。
verify-packs 只校验 preset 关卡(entry.kind !== 'preset' 时跳过),故迷宫尺寸
变化不会影响 1671 项逐字节断言。
新增 tests/killedge-113c.test.ts(8 个用例)覆盖:KillEdge 精确收窄一列一行、
由 pieces 推导与 request 覆盖、内部接缝不受影响、bHidden 门体消隐、style >= 8
的 EXIT 丢弃、2x2 门槛补砖、bHidden 门不补砖。已做变异测试:关闭裁剪或关闭墙体
过滤各会导致 3 个用例失败,确认断言有效。
Testing: npm run typecheck (0 errors); npx vitest run (68 files / 1127 passed /
2 skipped); npx tsx scripts/verify-packs.ts (1671/1671).
TAG=agy
CONV=2a1934de-30ef-464e-b3f3-fcbcdbbc49f1
2026-09-18 09:05:17 +00:00
taodao
e64e9a9ccd
feat(maze): 还原核心迷宫专用布局例程与基于 LvlPrest Def ID 的精准预设替换 (Issue #73 )
...
以 Diablo II v1.13c D2Common.dll 为黄金标准,对齐 DRLGMAZE_Place*Stuff 系列
专用布局例程:
- 新增 1.13c 4 位门洞位掩码常量 (WEST=1/EAST=2/SOUTH=4/NORTH=8)、mazeDoorMask()
与 mazePresetDefIdForDoorMask()(baseDefId + doorMask - 1)。
- 补齐 LvlPrest.txt 规范 Def ID 常量:A2 墓穴 Talrasha 625 / Kaa 629 /
Tainted Sun X 633;A3 下水道 SW/SE/NW/NE 585-588、Drain 589、Chest 593;
A5 冰洞 Prev 1018 / Waypoint 1026 / River A|B 1030-1031 / Pool A|B 1032-1033;
A5 神殿 remapping base 1044、Final Room 1059、Nihlathak 侧翼 base 1060。
- 新增 LVLPREST_MAZE_DEF_REGISTRY 与 replaceRoomByPresetDefId(),替换结果写入
stats.notes(lvlPrestDef=<id> (<name>))便于验证。
- placeAct2TombStuff:新增 levelId 61(爪蛇神庙 2)固定放置太阳祭坛 Def 633。
- placeAct3SewerStuff:levelId 92 放置四角入口房 585-588 + Drain/Chest 按方向偏移。
- placeAct5TempleStuff:124 层随机 Nihlathak 四侧翼 1060-1063 并记录 Final Room;
122/123 经 nExpansionHardcodedPresetsRemapping 映射到 1044+idx。
- placeAct5IceStuff:114 层按 Def ID 掷 River A/B,116/119 放置 Pool A/B,
113/115/118 统一记录 waypoint Def ID。
修复两处潜在保真度缺陷:
- maze.ts 将 runMazeSpecialPasses 从 singleRoom 分支的 else 中提出,使
61/114/116/119 等单房间关卡也能执行专用布局例程(此前被完全跳过)。
- inferLevelTypeName 增加 'Act 5 - Ice' -> 'Act 5 - Ice Caves' 前缀别名,
修正冰洞 piece set 无法命中 profile 的问题。
新增 tests/maze-113c.test.ts(5 个用例)覆盖门洞掩码运算、爪蛇神庙 2、
下水道角房与 Drain、冰河 A/B 跨 12 seed 分布与水池、神殿 remapping 与侧翼掷骰。
Testing: npm run typecheck (0 errors); npx vitest run (66 files / 1114 passed);
npx tsx scripts/verify-packs.ts (1671/1671).
TAG=agy
CONV=2a1934de-30ef-464e-b3f3-fcbcdbbc49f1
2026-09-18 08:45:15 +00:00
troytt
f36d1b4260
feat(tilesub): 严格对齐 1.13c LvlSub.txt 试验次数与全排列候选位地块替换算法 (Issue #76 )
...
- 实现 1.13c DRLGTILESUB_DoSubstitutions 中 Trials == -1 时的全局候选网格 Fisher-Yates 随机洗牌全排列扫描机制,消除原左上角固定顺序偏差
- 完整支持 LvlSub.txt 中 SubTheme 0..4 的 Prob0..4、Trials0..4、Max0..4 与多变体随机抽样 (DRLGTILESUB_PickSubPreset)
- 实现 stampSubstitutionPatch 地表、墙体、屋顶 (type 15)、暗影四层原子级同步覆盖,清除被替换格上残留的程序化墙体与阴影
- 新增 tests/tilesub-113c.test.ts 5 项回归测试
TAG=agy
CONV=2a1934de-30ef-464e-b3f3-fcbcdbbc49f1
2026-09-18 08:06:50 +00:00
troytt
ef59646631
feat(collision): 还原原版 1.13c 16位多层碰撞掩码系统与投射物/视线穿透 (Issue #75 )
...
- 在 d2map.ts 中新增 1.13c D2C_CollisionMaskFlags 全部 16位掩码定义与组合掩码 (COLLIDE_WALL, COLLIDE_VISIBLE, COLLIDE_MISSILE_BARRIER, COLLIDE_DOOR 等)
- 升级 buildIsoMapScene 生成 Uint16Array collisionMasks 多层碰撞网格,同时 100% 保持 blocked Uint8Array 兼容
- 实现原版 D2Common.dll COLLISION_CheckMask (#10118 ), COLLISION_SetMask (#10127 ), COLLISION_ResetMask (#10123 ) 与亚图块级 Bresenham 射线追踪 COLLISION_RayTrace (#11263 )
- 在 iso-terrain.ts 与 skills.ts 中接入弹道穿透与视线判定,允许弓箭与法术越过河流/熔岩/低矮障碍并阻挡于实体高墙与闭合门洞
TAG=agy
CONV=2a1934de-30ef-464e-b3f3-fcbcdbbc49f1
2026-09-18 07:58:49 +00:00
troytt
97ab449231
feat(preset): 统一 35 个预设关卡流水线与 8×8 Room 几何装配切片 (Issue #74 )
...
TAG=agy
CONV=2a1934de-30ef-464e-b3f3-fcbcdbbc49f1
2026-09-18 07:00:53 +00:00
troytt
ea61823e60
feat(wilderness): 完善地表边缘过渡瓦片(Auto-Tiling)与 DRLGROOMTILE_GetTileCache 权重混合 (Issue #70 )
...
- 实现 DRLGROOMTILE_GetTileCache:基于 dwDt1Mask、稀有度字段(rarityFrameIndex/rarity/Rarity)与权重累加的瓦片筛选和轮盘赌采样
- 增强 deriveGroundTilesFromDt1Libraries:按权重降序排列并完整提取 DT1 瓦片稀有度及索引元数据
- 导出 8 邻域位掩码常量(NEIGHBOR_MASK_NE/E/SE/N/S/NW/W/SW)与 NEIGHBOR_OFFSETS
- 实现 computeNeighborMask(DRLGROOMTILE_ComputeNeighborMask 别名):对野外地块进行安全邻域状态位掩码计算
- 导出 WATER_EDGE_TILE_LUT(256 元素表):深水 24 位于 0xFF,边缘过渡序列 0..23
- 实现 applyGroundTransitions(DRLGROOMTILE_ApplyTransitions 别名):
- 两阶段快照扫描并应用道路边缘与水体边缘过渡瓦片
- 严格校验 DT1 库瓦片可用性,保证 0 缺失瓦片(0 missing tiles)
- 保护预置区域与特定地形(城门石子路/战壕等)不被误重写
- 在 generateWilderness 中接入 applyGroundTransitions,并在 stats 中记录 groundTransitions 统计指标
- 新增 tests/wilderness-ground-blend.test.ts 18 项测试用例,全方位验证邻域掩码、缓存采样、过渡拼接与全关卡无缺失
TAG=agy
CONV=2a1934de-30ef-464e-b3f3-fcbcdbbc49f1
2026-09-18 04:05:01 +00:00
troytt
2274e2fe0b
feat(wilderness): 实现相邻野外关卡接缝空间对齐与出入口坐标咬合 (Issue #69 )
...
- 支持在 PlannedGate 中指定精确边界块坐标 blockCoord 与瓦片坐标 tileCoord
- 增加并导出 SeamConstraint 与 GateOpening 接口
- 在 WildernessRequest 中添加可选的 seamConstraints 配置
- 增强 getPerimeterOpenings 与 DRLGOUTPLACE_PlaceAct1245OutdoorBorders,支持 seamConstraints 及 blockCoord/tileCoord 坐标咬合与平滑边界夹紧
- 增强 planAct1OutdoorLevel 中的边界出入口与道路锚点计算,根据前驱/相邻关卡的接缝约束锁定 anchorCell 与 interiorCell
- 在 WildernessStats 与 WildernessResult.stats 中记录并返回 gateOpenings
- 新增 tests/wilderness-seams.test.ts 全套单元测试与集成测试
TAG=agy
CONV=2a1934de-30ef-464e-b3f3-fcbcdbbc49f1
2026-09-18 03:29:18 +00:00
troytt
d7defd8da3
feat(wilderness): 还原 DRLGOUTDOORS_SpawnAct12Waypoint 小站与神殿拓扑放置算法 ( #68 )
...
- 在 src/game/wilderness.ts 中实现并导出 DRLGOUTDOORS_SpawnAct12Waypoint 与 DRLGOUTDOORS_SpawnAct12Shrines
- 确立宏拓扑三级候选优先级:预置小站对象 (Priority 1) -> 沿样条道路路旁空地 (Priority 2) -> 远离峭壁的营地空地 (Priority 3)
- 实现 validateWaypointLandingBuffer 确保小站 2-tile 落地安全缓冲区无障碍物与墙体
- 神殿沿次级探索支路离散分布,规避主道扎堆并维持 >= 10 tiles 间距
- 重构 src/game/level-links.ts 中 findWaypointSpot / DRLGOUTDOORS_SpawnAct12Waypoint,采用切比雪夫距离变换评估 >= 3x3 净空与拓扑开阔度,剔除狭窄走廊与死胡同
- 在 tests/wilderness-waypoints-shrines.test.ts 补充拓扑选址与落地安全区验证测试
TAG=agy
CONV=2a1934de-30ef-464e-b3f3-fcbcdbbc49f1
2026-09-18 03:09:19 +00:00
troytt
0e8778f31a
feat(wilderness): 还原 DRLGOUTPLACE_PlaceAct1245OutdoorBorders 边界峭壁与门洞状态机
...
- 扩展 classifyBorderPiece 支持 1~5 幕所有预置边界切片命名(1..12 编号、方位后缀、Act 2 峭壁、Act 5 崖壁/雪地/峡谷与过渡转角)
- 导出 getCellOrientation 与 selectBorderPiece,支持精确的峭壁偏好 (preferCliff: true/false/undefined) 与开洞优先降级
- 实现并导出 DRLGOUTPLACE_PlaceAct1245OutdoorBorders(保留 layBorder 别名),先顺时针放置四边直边界再盖转角封口,保证 100% 覆盖率与 0 过程回退墙
- 支持 claimedBorderBlocks 城镇过渡区与外立面避让接驳
- 新增 tests/wilderness-borders.test.ts 完整测试全 5 幕边界识别、开闭门洞选择、外圈覆盖与接驳避让
TAG=agy
CONV=2a1934de-30ef-464e-b3f3-fcbcdbbc49f1
2026-09-18 02:51:30 +00:00
troytt
939ada6e4c
feat(wilderness): 用基于控制顶点图 (DRLGVER) 的 Catmull-Rom 样条道路取代栅格化 A* 道路 ( #66 )
...
- 实现控制顶点图算法 createDrlgVertices / DRLGVER_CreateVertices,提取城门/关卡出口、中央路口枢纽、特异预设(石块荒野巨石阵、遗忘之塔、邪恶洞窟等)及自然拐点宏控制顶点
- 引入 Catmull-Rom 样条平滑插值算法 catmullRomPoint 与 sampleCatmullRomSpline,生成平滑曲率的自然蜿蜒小径,摆脱死板的 45°/90° 网格折线
- 实现栅格化样条小径 rasterizeDirtPathSegment / generateDirtPaths(2-3 格宽度),无缝对齐 8 邻域 LUT 贴图码表 (DIRT_PATH_TILE_LUT)
- 样条道路与光栅化避障支持:严格避开 roadObstacleBlocks(墓园围墙、遗迹废墟、房屋边界),保护预设建筑阻隔完整性
- 重构 stampThemedRoads:南北向与东西向主道、城门引道及景观支路均通过平滑样条连通,清理道路中轴覆盖的杂物地块
- 新增 tests/wilderness-spline-roads.test.ts,全量覆盖样条数学与曲率、控制顶点图生成、避障光栅化及第一幕野外端到端验证
Closes #66
TAG=agy
CONV=2a1934de-30ef-464e-b3f3-fcbcdbbc49f1
2026-09-18 02:32:14 +00:00
troytt
11e8a39e4e
fix(render): 还原原版暗黑2建筑与城门屋顶过道遮挡消失机制 ( #72 )
...
- roofs.ts: 将默认最低透明度 DEFAULT_MIN_ROOF_ALPHA 设为 0.0,还原原版遮挡完全隐形机制
- roofs.ts: getRoofBounds 引入 roofHeight 等距高程投影补偿,将悬空屋顶包围盒延伸至地面投影视野
- roofs.ts: 将 DEFAULT_CLUSTER_CELL_DISTANCE 增至 4,并在 clusterRoofs 中自动插值补全城门与建筑群间隙走廊网格单元
- act-scene.ts & d2map.ts: 在 Drawable 和 IsoDraw 中接线传递 DT1 roofHeight 高程属性
- tests/roofs.test.ts: 补充高程下投、哈洛加斯西门跨过道聚类遮挡及拱梁/上墙全消失测试
TAG=agy
CONV=2a1934de-30ef-464e-b3f3-fcbcdbbc49f1
2026-09-18 02:12:37 +00:00
troytt
d0efb04395
refactor(wilderness): 移除凭空发明的程序化十字矮石墙网络,回归原版自然地貌阻隔 ( #65 )
...
- 将 stampThemedDividers 重构为兼容性 no-op,完全废弃人为硬编码的十字切分矮石墙
- generateWilderness 移除 stampOutdoorDividers 调用,回归原版 Act 1-5 依据 DS1 预设边界及地形生成的自然阻隔机制
- 更新 wilderness 单元与多幕道路测试,验证 0 人造矮石墙及真实地貌阻隔保留
TAG=agy
CONV=2a1934de-30ef-464e-b3f3-fcbcdbbc49f1
2026-09-18 01:38:00 +00:00
troytt
83f855597b
fix(monsters): eliminate unwired columns, dead logic, and wire elite modifier scaling
...
- Support up to mon25 columns in monsterColumns stopping if column does not exist
- Weight normal pack type selection by kind.rarity in planMonsterGroups
- Wire mechanical stat scaling for stoneskin, cursed, coldenchant, fireenchant, lightenchant, spectralhit, teleport, magicresistant, and aura in applyEliteModifiers
- Add unit tests for monsterColumns, rarity-weighted pack planning, and elite modifier stat scaling
TAG=agy
CONV=2a1934de-30ef-464e-b3f3-fcbcdbbc49f1
2026-09-17 15:56:33 +00:00
troytt
cbcf71a731
fix(engine): fix logical tautologies, edge conditions, and argument defaults
...
- Fix isRoad out-of-bounds boundary check to return false instead of true
- Fix rack candidate room selection to strictly prioritize corridor rooms (degree === 2)
- Fix candidateRooms fallback in allocatePacksToRooms to not place monsters in safe zones
- Fix default cellHeight in partitionMapIntoRooms to 40 px for 80x40 isometric tiles
- Throw explicit error in parseTable on empty table data and add provenance comment for temptile.dt1
- Add regression tests for rack candidate selection, safe zones, cellHeight, and parseTable
TAG=agy
CONV=2a1934de-30ef-464e-b3f3-fcbcdbbc49f1
2026-09-17 15:46:49 +00:00
troytt
6de9fce610
fix(wilderness): add seed diversity to Bloody Foothills obstacle placement
...
- Apply RNG jitter to obstacle placement coordinates and lengths across frontline zones
- Preserve the unblocked central corridor along y=24
- Track procedural walls and roads in siege topography stats
- Add unit test in tests/wilderness-siege-strips.test.ts verifying seed-based obstacle variance
TAG=agy
CONV=2a1934de-30ef-464e-b3f3-fcbcdbbc49f1
2026-09-17 15:25:45 +00:00
troytt
53d6cdd08c
feat(wilderness): track procedural passes in telemetry stats
...
- Add proceduralRoadCells, proceduralDividerCells, proceduralWaterCells, proceduralWallCells to WildernessTelemetry and WildernessStats
- Measure actual painted cells in stampThemedRoads, stampThemedDividers, generateDirtPaths, and act outdoor level topography passes
- Add unit tests in tests/wilderness-telemetry.test.ts verifying counted telemetry against canvas state
TAG=agy
CONV=2a1934de-30ef-464e-b3f3-fcbcdbbc49f1
2026-09-17 15:23:31 +00:00
troytt
fa307bff46
fix(wilderness): prevent destructive wiping of walls and presets in roads and bridges
...
1. Protect placed presets and preset walls from being wiped in stampThemedRoads:
check placedRects in paintRoadTile, ensuring preset walls are never cleared.
2. Protect preset floors and walls in stampAct3KurastCauseway so artist DS1
tiles are not overwritten by procedural causeway passes; wire specialPlacedRects.
3. Protect placed preset walls and floors in synthesizeBridgePlanks in Act 3 jungles,
recording placedRects for all jungle pieces.
4. Add unit tests for Causeway preset preservation and road preset wall preservation.
TAG=agy
CONV=2a1934de-30ef-464e-b3f3-fcbcdbbc49f1
2026-09-17 15:10:59 +00:00
troytt
a7a3ce13d4
feat(game): document and validate object pools and LvlPrest piece families (Issue #61 Step 4)
...
- Document the 3-tier lookup relation across Levels.txt, LvlTypes.txt, and LvlPrest.txt
- Explain why Catacombs/Sewers index pieces via Def / LevelId = 0 / first levelId
- Explain why composite themes have sub-families (Corrupt Harem, Mephisto, Temple, Bridge, ThroneRoom)
- Implement discoverMazePieceFamilies with optional LvlPrest table and update classifyMazePieceName
- Add Objects.txt mapping validation (validateDungeonObjectPools, validateActPopulationConfig, resolveObjectsTxtId)
- Add comprehensive unit tests in tests/maze-objects.test.ts
TAG=agy
CONV=2a1934de-30ef-464e-b3f3-fcbcdbbc49f1
2026-09-17 14:39:13 +00:00
troytt
94305b03dd
Resolve outdoor waypoints and act mapping dynamically from Levels.txt
...
- Add dynamic hasOutdoorWaypoint(levelId, levelsTable) reading Levels.txt Waypoint column (!= 255)
- Unify actOfLevel in acts.ts as canonical source of truth supporting Levels.txt Act column
- Support levelsTable in WildernessRequest, spawnOutdoorWaypoint, spawnOutdoorShrines, stampOutdoorRoads, stampOutdoorDividers
- Re-export actOfLevel, hasOutdoorWaypoint, and OUTDOOR_WAYPOINT_LEVELS cleanly without circular dependencies
- Add unit tests verifying dynamic Levels.txt resolution and fallbacks
TAG=agy
CONV=2a1934de-30ef-464e-b3f3-fcbcdbbc49f1
2026-09-17 14:27:54 +00:00
troytt
7efdad4693
feat(game): decode level names from string.tbl with graceful fallback
...
- Implement decodeLevelNamesFromTbl supporting D2Tbl/Map and Levels.txt
- Add CANONICAL_LEVEL_NAME_KEYS and active decoded level names cache
- Support graceful fallback to LEVEL_NAMES_ZH and English name keys
- Add comprehensive test coverage in tests/tbl.test.ts
TAG=agy
CONV=2a1934de-30ef-464e-b3f3-fcbcdbbc49f1
2026-09-17 14:14:15 +00:00
troytt
fea677b0b4
fix(wilderness): prevent sealed borders on outdoor levels and track preset failures
...
TAG=agy
CONV=2a1934de-30ef-464e-b3f3-fcbcdbbc49f1
2026-09-17 13:43:51 +00:00
troytt
b8810072ce
fix(maze): use PRNG stream in special passes and fix Act 5 temple NE waypoint generation
...
TAG=agy
CONV=2a1934de-30ef-464e-b3f3-fcbcdbbc49f1
2026-09-17 13:36:02 +00:00
troytt
a3a3e44838
refactor(acts): unify ACT_TOWNS and townLevelForAct single source of truth
...
TAG=agy
CONV=2a1934de-30ef-464e-b3f3-fcbcdbbc49f1
2026-09-17 13:31:07 +00:00
troytt
27e0db38c8
fix(level-links): prevent infinite teleport bounce at seam arrival
...
Eliminate fallback to trigger tile (x, y) when no walkable tile is found
within initial radius. Expand search to full grid extent and guarantee that
the arrival destination is strictly offset inward away from the seam trigger box.
TAG=agy
CONV=2a1934de-30ef-464e-b3f3-fcbcdbbc49f1
2026-09-17 13:27:27 +00:00
troytt
bf101dae66
fix(monsters): wire meleeRange from MonsterArt into reach and reference MonUMod constants
...
TAG=agy
CONV=2a1934de-30ef-464e-b3f3-fcbcdbbc49f1
2026-09-17 13:03:21 +00:00