-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathtest-all.bat
More file actions
2732 lines (2601 loc) · 127 KB
/
Copy pathtest-all.bat
File metadata and controls
2732 lines (2601 loc) · 127 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
@echo off
setlocal
cd /d "%~dp0"
REM Defaults — override any of these by passing --ds1=PATH, --tool=PATH,
REM --run=PATH, or --refs=PATH on the command line. Examples:
REM test-all.bat --ds1="C:\Program Files (x86)\Steam\steamapps\common\Dungeon Siege 1"
REM test-all.bat --ds1=D:\GOG\DS --refs=my_refs
REM Pass --help (or -h, /?) to print the parameter list.
set "DS1=D:\GOG Games\Dungeon Siege"
set "TOOL=src\SiegeFX.Tools\bin\Release\net11.0\siegefx.exe"
set "RUN=src\SiegeFX.Runtime\bin\Release\net11.0-windows10.0.22621.0\SiegeFX.dll"
set "REFS=_ds1refs"
:parseargs
if "%~1"=="" goto doneargs
set "ARG=%~1"
if /i "%ARG%"=="--help" goto usage
if /i "%ARG%"=="-h" goto usage
if /i "%ARG%"=="/?" goto usage
if /i "%ARG:~0,6%"=="--ds1=" goto setds1
if /i "%ARG:~0,7%"=="--tool=" goto settool
if /i "%ARG:~0,6%"=="--run=" goto setrun
if /i "%ARG:~0,7%"=="--refs=" goto setrefs
echo unknown argument: %~1
echo run "test-all.bat --help" for the parameter list
exit /b 1
:setds1
set "DS1=%ARG:~6%"
shift
goto parseargs
:settool
set "TOOL=%ARG:~7%"
shift
goto parseargs
:setrun
set "RUN=%ARG:~6%"
shift
goto parseargs
:setrefs
set "REFS=%ARG:~7%"
shift
goto parseargs
:usage
echo Usage: test-all.bat [--ds1=PATH] [--tool=PATH] [--run=PATH] [--refs=PATH]
echo.
echo --ds1=PATH Dungeon Siege install root (default: %DS1%)
echo --tool=PATH siegefx.exe path (default: %TOOL%)
echo --run=PATH SiegeFX.dll path (default: %RUN%)
echo --refs=PATH local reference assets dir (default: %REFS%)
echo.
echo Quote paths that contain spaces, e.g.:
echo test-all.bat --ds1="C:\Program Files (x86)\Steam\steamapps\common\Dungeon Siege 1"
exit /b 0
:doneargs
if not exist "%TOOL%" goto NEEDBUILD
if not exist "%RUN%" goto NEEDBUILD
:MENU
cls
echo ============================================================
echo SiegeFX v0.8.0 phase-by-phase smoke test
echo ============================================================
echo DS1 install : %DS1%
echo.
echo 1. Phase 1 - Tank listing (Logic.dsres)
echo 2. Phase 2 - RAW texture decode (goblin.raw to PNG)
echo 3. Phase 4 - Static mesh viewer (boot.asp)
echo 4. Phase 5 - GAS parser (stitch_ds_r2.gas dump)
echo 5. Phase 6 - Single region viewer (fh_r1)
echo 6. Phase 6 - World streaming (walk between regions)
echo 7. Phase 7 - Skeletal animation (goblin walk clip)
echo 8. Phase 9a - Skrit-driven animation (basic_walk)
echo 9. Phase 8d - Skrit tick harness (CLI, no viewer)
echo 10. Phase 10a - Template store (goblin grunt archetype resolution)
echo 11. Phase 10b - Region actor instance loader (fh_r1)
echo 12. Phase 10c+d - Spawn 181 actors, tick + broadcast (fh_r1)
echo 13. Phase 10e - Play region (walk into fh_r1, 181 actors idling)
echo 14. Phase 11a - Walkable-surface nav (fh_r1 stats + world-wide fuzz)
echo 15. Phase 11b - A* pathfinding (fh_r1 hand path + world-wide fuzz)
echo 16. Phase 11c - Nav follower (walk fh_r1 corridor tick-by-tick)
echo 17. Phase 11d - Actors wander fh_r1 (181 followers on nav mesh)
echo 18. Phase 12a - Template stats (goblin grunt + all 3W_goblin_* prefix)
echo 19. Phase 12b - Combat sim (1000 duels: grunt vs grunt, guard vs grunt)
echo 20. Phase 12c - Debug attack in fh_r1 (press F to hit nearest goblin)
echo 21. Phase 12d - Loot table (grunt + krug scout, 10000-roll distribution)
echo 22. Phase 13a-e - Farmboy PC + chase cam + LMB move + RMB attack + fair-fight stats (fh_r1)
echo 23. Phase 14a-d - Pickup + equipment + weapon render (fh_r1)
echo 24. Phase 15a - Text overlay (DS1 copperplate font, fh_r1)
echo 25. Phase 15b - HP/MP HUD bars (live values, fh_r1)
echo 26. Phase 15c - Grid inventory panel (press I to toggle, fh_r1)
echo 27. Phase 15d - Pause menu (Esc to open; Resume / Quit, fh_r1)
echo 28. Phase 16a - Formulas dump (formulas.gas -^> typed values)
echo 29. Phase 16b - HP/MP regen (~0.25/0.333 per sec at 10/10/10, fh_r1)
echo 30. Phase 16c - NPC aggro: walk into a krug, watch HP drop + regen (fh_r1)
echo 31. Phase 16d - XP + level: kill goblins, watch Lv/XP line on HUD (fh_r1)
echo 32. Phase 17a - Spells: dump catalog + show spell_zap by magic level
echo 33. Phase 17a - Spells: cast spell_zap with Q (mana 1, dmg 4-7 at L1, fh_r1)
echo 34. Phase 17b - Spell visuals: cyan bolt + face-snap on Q-cast (fh_r1)
echo 35. Phase 17c - Heal spell + W slot: spell_healing_wind self-cast (fh_r1)
echo 36. Phase 18a - Audio: cast SFX (Q = zap_cast.wav, W = healing_wind_cast.wav, fh_r1)
echo 37. Phase 18b - Audio: melee swing/hit/miss + monster death + level-up SFX (fh_r1)
echo 38. Phase 18c - Audio: 3D positional pan + falloff (walk away from a kill, listen, fh_r1)
echo 39. Phase 19a - Save: SaveFile JSON round-trip self-test (no window)
echo 40. Phase 19c - Save/Load: F5 quicksave + F9 quickload (kill stuff, F5, kill more, F9, fh_r1)
echo 41. Phase 20a - Dialogue parser self-test + RMB-talk to Edgaar in fh_r1
echo 42. Phase 20b - Quest log overlay (Accept Edgaar quest, press L, fh_r1)
echo 43. Phase 20c - Kill objectives + goal markers (kill 5 krug for Edgaar, fh_r1)
echo 44. Phase 25c - Authored store screen (Stonebridge shopkeepers, buy/sell, bt_r1)
echo 45. Phase 21a-1 - Neighbor terrain preload (fh_r1 + first-ring neighbors visible)
echo 46. Phase 21a-2 - Cross-boundary nav + actors + dialogue (walk into neighbor regions)
echo 47. Phase 21a-3 - Rolling preload (no more invisible wall, walk arbitrarily far)
echo 48. Phase 21b-1 - --diag mode (startup timings + per-second frame histogram)
echo 49. Phase 21c-1 - NPC textures + static props (trees/barrels/fences/crops/candles in fh_r1)
echo 50. Phase 21c-5 - Headless prop-texture audit across all 81 regions (CLI, no window)
echo 51. Phase 21d-1 - Balance curves audit (XP/HP/MP/regen L1..L50, all skills, CLI)
echo 52. Phase 21d-2a-i - ASP subset fuzz (parse all .asp in Objects.dsres, validate subsets)
echo 53. Phase 21d-2a-ii - Per-subset texture render (visually verify farmboy clothing in fh_r1)
echo 54. Phase 21d-2a-iii prep - Actor-coverage audit across all 81 regions (CLI, no window)
echo 55. Phase 21d-2a-iv - BTRI cornerStart fix (visually verify farmboy webbing gone in fh_r1)
echo 56. Phase 21d-2a-v - Farmboy texture diag (magenta fallback + tex-resolve log)
echo 57. Phase 21d-2a-v - Subset-tint diag (each ASP subset = solid color: red/grn/blu/yel/mag)
echo 58. Phase 21d-2a-v - Plain play after uFlipV fix (face/hair detail should render)
echo 59. Phase 21d-2a-vi - Dagger grip (90 deg X prerotation; piercing forward grip vs stab)
echo 60. Phase 21d-2a-vii - Layered equipment (boots + chest texture override on farmboy)
echo 61. Phase 21d-2a-viii-a - Hero variant audit + env-var pick (pos_a3 + skin_07 + pants_015)
echo 62. Phase 21d-2a-viii-b - Character creator UI panel (SIEGEFX_CREATOR=1; Begin to spawn)
echo 63. Phase 21d-2a-viii-c - Hero name + variant persistence through quicksave (F5/F9)
echo 64. Phase 21d-2a-ix - Audio coverage audit (Sound.dsres histogram + gap report)
echo 65. Phase 21d-2a-xi - Mood + region ambient bed audit (CLI; play-region for in-game loop)
echo 66. Phase 21d-2a-xii - SED registry audit (Sound.dsres pitch jitter + cap inventory)
echo 67. Phase 9-SC-10 - Shield render verify (fh_r1 + SIEGEFX_DEBUG_DROP=shield)
echo 68. Phase 9-SC-16 B-1+B-2 - Pcontent tier + wildcards + rarity (#club/2-3, #armor/-rare/..., #*/-unique/...)
echo 69. Phase 10-SC-1 - Trigger matrix parser (fh_r1 special.gas + verb coverage)
echo 70. Phase 10-SC-2 - Full chore dictionary into Actor.Clips (fh_r1 chore coverage)
echo 71. Phase 10-SC-3 - PRS v0x202 + v0x302 loader (Objects.dsres prs fuzz, all 1962 files)
echo 72. Phase 11-SC-7 - Land water seam stitching (fh_r1 nav + amphibious path 30,30 to water)
echo 73. Phase 12-SC-3 - Mob loot frequency vs DS1 retail (krug_grunt/krug_scout/gremal)
echo 74. Phase 12-SC-4/5 - Death pose + weapon-class attack chore (VISUAL, fh_r1)
echo 75. Phase 12-SC-6 - PRS TRCR resync (Objects.dsres prs fuzz, expect 1855 v3 OK + 131 tracers)
echo 76. Phase 17-SC-A1 - SpellExpr ** power op (spells survey + show fireball/iceshard)
echo 77. Phase 17-SC-A2/A3 - SpellExpr placeholders + ternary (spells eval / show freeze)
echo 78. Phase 17-SC-B - Per-element spell projectile/impact VFX (spells elements)
echo 79. Phase 17-SC-C - Player chore_magic plays during moving casts
echo 80. Phase 17-SC-D - SfxScriptStore inventory (1074 effect_script* across 14 gas files)
echo 81. Phase 17-SC-E - Billboard particle backend (in-window F11 fire+smoke+sparks, F10 lightning)
echo 82. Phase 17-SC-F-1 - sfx_script compiler IR (parser dump for fireball_emitter)
echo 83. Phase 17-SC-F-2 - sfx_script VM receipt (TallySink: smoke_emitter + fire_emitter, 60 ticks)
echo 84. Phase 17-SC-G - Region emitters wired (in-window fh_r1, smoke columns over chimneys)
echo 85. Phase 17-SC-H - Spell cast sfx_script binding (spells dump w/ cast_sfx column + coverage)
echo 86. Phase 17-SC-I - Water UV scroll + waterwheel rotation (in-window fh_r1)
echo 87. Phase 17-SC-J - Per-instance scale_multiplier (breakable farmhouse door + foliage variation)
echo 88. Phase 21-SC-SPELL-VFX-AUDIT - Visual-coverage audit across every offensive spell (Logic.dsres)
echo 89. Phase 21-SC-SPELL-VFX-AUDIT - Visual verify fireball + iceshard (SIEGEFX_DEBUG_SPELLS launch)
echo 90. Phase 21-SC-SCROLL - Full scroll-UI test (16-spell roster + ground pile + glitter)
echo 91. Phase 21-SC-SPELL-VISUAL - Primitive sweep (10 spells, one per slice A-H + sphere)
echo 92. Phase 21-SC-BARREL - Breakable barrels (cursor + spell + frags + loot, fh_r1)
echo 93. Phase 23-SC-OPTIONS - Options Menu (F10 in-game; 4 tabs Video/Audio/Input/Game)
echo 94. Phase 24-MAINMENU - Boot to main menu (no args; splash to logo drop to 7 buttons)
echo 95. SC-TSD-ANIM - Water frame-cycle + waterfall layer-2 modulate2x (fh_r1)
echo 96. SC-QUEST-OBJ-A - Talk-to-NPC quest objective (SIEGEFX_DEBUG_QUEST=quest_seek_gyorn, talk to Edgaar)
echo 97. SC-QUEST-OBJ-F - Full 24-quest Ehb catalog + chain (SIEGEFX_DEBUG_QUEST=quest_seek_gyorn, watch chain follow-up activate)
echo 98. SC-QUEST-OBJ-C - Pickup quest objective (SIEGEFX_DEBUG_QUEST=quest_grab_fireshot, basement spell_fireshot)
echo 99. SC-QUEST-OBJ-D - Deliver quest objective (SIEGEFX_DEBUG_QUEST=quest_merik_staff, hold staff + talk Merik)
echo 100. SC-HUD-DATABAR - Bottom-row HUD buttons (pause/HP-pot/MP-pot/labels/map/journal/menu) — click each in fh_r1
echo 101. SC-HUD-OVERHEAD-BARS - Floating HP/MP bars above every combatant (PC always on; enemies on hit/aggro)
echo 102. SC-FADE-NODES-LNODE - Spawn at fh_r1 farmhouse basement stairs (SIEGEFX_DEBUG_SPAWN=70,-4,-65); walk down + test dungeon reveal + click-pick
echo 103. Phase 26 - PARTY RECRUIT - Recruit Gyorn at Stonebridge (bt_r1): RMB him, click Accept; he follows + fights
echo 104. SC-WEATHER - Mood weather audit (CLI, self-verifying) + fh_r1 storm eyes-test (rain/fog/lightning/thunder + rain loops)
echo 105. SC-ELEVATOR - Ride the farmhouse grate lift (hc_r1): lever call, 5s descent with rider carry, fades, nav rebuild
echo 106. ALPHA-1 CAMPAIGN AUDIT - Completability sweep: unhandled components + undispatched trigger verbs across all 81 regions (CLI, self-verifying)
echo 107. CRYPT STAIRS REPRO - Spawn AT the cr_r1 stairs (path2crypts root, SIEGEFX_DEBUG_SPAWN); fade-flap / reveal / freeze repro; F7 = fade diag
echo 108. ALPHA-2: TOWN + DIALOGUE - Stonebridge (bt_r1): retail dialogue chrome w/ Gyorn+Adwana, vendors, recruit, save/load soak (F5/F9)
echo 109. ALPHA-2: CRATES + SHRINE - path2crypts: trapped crates spring, chests open+loot, life shrine heals, world gold credits
echo 110. ALPHA-2: DWARVEN GATE - path2sd: stuck use-toggle gate shows authored text on click; opens only via its quest message
echo 111. ALPHA-2: STAR DEVICE - gd_a_r1: locked usable reports Locked. without key_glb_star; crypt doors chain msg_scid_opening
echo 112. NAV VERTICAL-REBIND REPRO - sd_r1 mine ledge (headless): horseshoe walk must reach at Y=17, never teleport to the Y=44 mountain top
echo 113. ENEMY ROAM-SIM - headless 90s wander soak over the path2sd..sd_r2 set; expect 0 FROZEN and no field-report piles
echo 114. SC-MP-EOS P3 NET ROUND-TRIP - headless host^<-^>client: join+snapshot+state-delta+input-authority+chat+malformed-frame safety (loopback)
echo 115. FRONTEND CHROME SHOTS - offscreen PNG receipts of the MainMenu + SinglePlayer chrome (goldens\frontend-shots; compare vs retail)
echo 116. ENDGAME: GOM ARENA - spawn in gom2 with dev console (tilde: god/kill) + debug spells; kill Gom then Super Gom = quest complete + VICTORY card
echo 117. ENEMY CHASE-SIM AUDIT - headless directed-movement audit (walker-vs-A* divergence, incl. generator children); new-game region set + optional all-region sweep
echo.
echo B. Rebuild (dotnet build -c Release)
echo Q. Quit
echo.
set /p CHOICE=Choose:
if /i "%CHOICE%"=="1" goto T1
if /i "%CHOICE%"=="2" goto T2
if /i "%CHOICE%"=="3" goto T3
if /i "%CHOICE%"=="4" goto T4
if /i "%CHOICE%"=="5" goto T5
if /i "%CHOICE%"=="6" goto T6
if /i "%CHOICE%"=="7" goto T7
if /i "%CHOICE%"=="8" goto T8
if /i "%CHOICE%"=="9" goto T9
if /i "%CHOICE%"=="10" goto T10
if /i "%CHOICE%"=="11" goto T11
if /i "%CHOICE%"=="12" goto T12
if /i "%CHOICE%"=="13" goto T13
if /i "%CHOICE%"=="14" goto T14
if /i "%CHOICE%"=="15" goto T15
if /i "%CHOICE%"=="16" goto T16
if /i "%CHOICE%"=="17" goto T17
if /i "%CHOICE%"=="18" goto T18
if /i "%CHOICE%"=="19" goto T19
if /i "%CHOICE%"=="20" goto T20
if /i "%CHOICE%"=="21" goto T21
if /i "%CHOICE%"=="22" goto T22
if /i "%CHOICE%"=="23" goto T23
if /i "%CHOICE%"=="24" goto T24
if /i "%CHOICE%"=="25" goto T25
if /i "%CHOICE%"=="26" goto T26
if /i "%CHOICE%"=="27" goto T27
if /i "%CHOICE%"=="28" goto T28
if /i "%CHOICE%"=="29" goto T29
if /i "%CHOICE%"=="30" goto T30
if /i "%CHOICE%"=="31" goto T31
if /i "%CHOICE%"=="32" goto T32
if /i "%CHOICE%"=="33" goto T33
if /i "%CHOICE%"=="34" goto T34
if /i "%CHOICE%"=="35" goto T35
if /i "%CHOICE%"=="36" goto T36
if /i "%CHOICE%"=="37" goto T37
if /i "%CHOICE%"=="38" goto T38
if /i "%CHOICE%"=="39" goto T39
if /i "%CHOICE%"=="40" goto T40
if /i "%CHOICE%"=="41" goto T41
if /i "%CHOICE%"=="42" goto T42
if /i "%CHOICE%"=="43" goto T43
if /i "%CHOICE%"=="44" goto T44
if /i "%CHOICE%"=="45" goto T45
if /i "%CHOICE%"=="46" goto T46
if /i "%CHOICE%"=="47" goto T47
if /i "%CHOICE%"=="48" goto T48
if /i "%CHOICE%"=="49" goto T49
if /i "%CHOICE%"=="50" goto T50
if /i "%CHOICE%"=="51" goto T51
if /i "%CHOICE%"=="52" goto T52
if /i "%CHOICE%"=="53" goto T53
if /i "%CHOICE%"=="54" goto T54
if /i "%CHOICE%"=="55" goto T55
if /i "%CHOICE%"=="56" goto T56
if /i "%CHOICE%"=="57" goto T57
if /i "%CHOICE%"=="58" goto T58
if /i "%CHOICE%"=="59" goto T59
if /i "%CHOICE%"=="60" goto T60
if /i "%CHOICE%"=="61" goto T61
if /i "%CHOICE%"=="62" goto T62
if /i "%CHOICE%"=="63" goto T63
if /i "%CHOICE%"=="64" goto T64
if /i "%CHOICE%"=="65" goto T65
if /i "%CHOICE%"=="66" goto T66
if /i "%CHOICE%"=="67" goto T67
if /i "%CHOICE%"=="68" goto T68
if /i "%CHOICE%"=="69" goto T69
if /i "%CHOICE%"=="70" goto T70
if /i "%CHOICE%"=="71" goto T71
if /i "%CHOICE%"=="72" goto T72
if /i "%CHOICE%"=="73" goto T73
if /i "%CHOICE%"=="74" goto T74
if /i "%CHOICE%"=="75" goto T75
if /i "%CHOICE%"=="76" goto T76
if /i "%CHOICE%"=="77" goto T77
if /i "%CHOICE%"=="78" goto T78
if /i "%CHOICE%"=="79" goto T79
if /i "%CHOICE%"=="80" goto T80
if /i "%CHOICE%"=="81" goto T81
if /i "%CHOICE%"=="82" goto T82
if /i "%CHOICE%"=="83" goto T83
if /i "%CHOICE%"=="84" goto T84
if /i "%CHOICE%"=="85" goto T85
if /i "%CHOICE%"=="86" goto T86
if /i "%CHOICE%"=="87" goto T87
if /i "%CHOICE%"=="88" goto T88
if /i "%CHOICE%"=="89" goto T89
if /i "%CHOICE%"=="90" goto T90
if /i "%CHOICE%"=="91" goto T91
if /i "%CHOICE%"=="92" goto T92
if /i "%CHOICE%"=="93" goto T93
if /i "%CHOICE%"=="94" goto T94
if /i "%CHOICE%"=="95" goto T95
if /i "%CHOICE%"=="96" goto T96
if /i "%CHOICE%"=="97" goto T97
if /i "%CHOICE%"=="98" goto T98
if /i "%CHOICE%"=="99" goto T99
if /i "%CHOICE%"=="100" goto T100
if /i "%CHOICE%"=="101" goto T101
if /i "%CHOICE%"=="102" goto T102
if /i "%CHOICE%"=="103" goto T103
if /i "%CHOICE%"=="104" goto T104
if /i "%CHOICE%"=="105" goto T105
if /i "%CHOICE%"=="106" goto T106
if /i "%CHOICE%"=="107" goto T107
if /i "%CHOICE%"=="108" goto T108
if /i "%CHOICE%"=="109" goto T109
if /i "%CHOICE%"=="110" goto T110
if /i "%CHOICE%"=="111" goto T111
if /i "%CHOICE%"=="112" goto T112
if /i "%CHOICE%"=="113" goto T113
if /i "%CHOICE%"=="114" goto T114
if /i "%CHOICE%"=="115" goto T115
if /i "%CHOICE%"=="116" goto T116
if /i "%CHOICE%"=="117" goto T117
if /i "%CHOICE%"=="B" goto BUILD
if /i "%CHOICE%"=="Q" goto END
goto MENU
:T1
echo.
echo --- Phase 1: first 40 entries of Logic.dsres ---
"%TOOL%" tank list "%DS1%\Resources\Logic.dsres" | more
pause
goto MENU
:T2
echo.
echo --- Phase 2: decoding goblin.raw to goblin.png ---
"%TOOL%" raw decode "%REFS%\goblin.raw" "%REFS%\goblin.png"
if exist "%REFS%\goblin.png" start "" "%REFS%\goblin.png"
pause
goto MENU
:T3
echo.
echo --- Phase 4: boot.asp in viewer (RMB+WASD to fly, Esc to quit) ---
dotnet "%RUN%" "%REFS%\boot.asp"
goto MENU
:T4
echo.
echo --- Phase 5: dump stitch_ds_r2.gas parse tree ---
"%TOOL%" gas dump "%REFS%\stitch_ds_r2.gas" | more
pause
goto MENU
:T5
echo.
echo --- Phase 6: load fh_r1 (Farmhouse region 1) ---
dotnet "%RUN%" --region "%DS1%\Maps\World.dsmap" "%DS1%\Resources\Terrain.dsres" /world/maps/map_world/regions/fh_r1
goto MENU
:T6
echo.
echo --- Phase 6: world streaming starting at fh_r1 ---
dotnet "%RUN%" --world "%DS1%\Maps\World.dsmap" "%DS1%\Resources\Terrain.dsres"
goto MENU
:T7
echo.
echo --- Phase 7: goblin walk animation ---
dotnet "%RUN%" --anim "%REFS%\goblin.asp" "%REFS%\goblin_walk.prs" "%REFS%\goblin.raw"
goto MENU
:T8
echo.
echo --- Phase 9a: skrit-driven goblin animation (basic_walk.skrit) ---
dotnet "%RUN%" --skrit-anim "%REFS%\goblin.asp" "%REFS%\skrit\basic_walk.skrit" "%REFS%\goblin_walk.prs" --texture "%REFS%\goblin.raw"
goto MENU
:T9
echo.
echo --- Phase 8d: tick basic_walk.skrit for 40 logic frames ---
"%TOOL%" skrit tick "%REFS%\skrit\basic_walk.skrit" --ticks=40 --subanims=1 --event=OnStartChore$
pause
goto MENU
:T10
echo.
echo --- Phase 10a: template store - resolve 3W_goblin_grunt archetype ---
echo [expect: chain 3W_goblin_grunt -^> 3W_base_goblin -^> actor_evil -^> actor,
echo aspect.model inherited, 5 chore entries]
echo.
"%TOOL%" templates show "%DS1%\Resources\Logic.dsres" 3W_goblin_grunt
echo.
echo --- now listing all 3W_goblin_* templates ---
"%TOOL%" templates list "%DS1%\Resources\Logic.dsres" --prefix=3W_goblin
pause
goto MENU
:T11
echo.
echo --- Phase 10b: actor instances in fh_r1 (Farmhouse region 1) ---
echo [expect: ~181 actors, templates include krug_scout/phrak/gremal/chicken]
echo.
"%TOOL%" region actors "%DS1%\Maps\World.dsmap" /world/maps/map_world/regions/fh_r1
pause
goto MENU
:T12
echo.
echo --- Phase 10c+d: spawn 181 actors in fh_r1, broadcast OnStartChore$ via bus ---
echo [expect: spawned 181/181, all in LoopForever$, bus posted 1 / delivered 181]
echo.
"%TOOL%" region spawn "%DS1%\Maps\World.dsmap" "%DS1%\Resources\Logic.dsres" "%DS1%\Resources\Objects.dsres" /world/maps/map_world/regions/fh_r1 --broadcast=OnStartChore$
pause
goto MENU
:T13
echo.
echo --- Phase 10e: fh_r1 with terrain + 181 actors, skrit-driven ---
echo [RMB+WASD to fly, Esc to quit]
echo.
dotnet "%RUN%" --play-region "%DS1%\Maps\World.dsmap" "%DS1%\Resources\Terrain.dsres" "%DS1%\Resources\Logic.dsres" "%DS1%\Resources\Objects.dsres" /world/maps/map_world/regions/fh_r1
goto MENU
:T14
echo.
echo --- Phase 11a: fh_r1 walkable-surface nav stats ---
echo [expect: ~1700 snodes placed, ~2400 floor groupings, ~27k floor faces]
echo.
"%TOOL%" region nav "%DS1%\Maps\World.dsmap" "%DS1%\Resources\Terrain.dsres" /world/maps/map_world/regions/fh_r1
echo.
echo --- Phase 11a: world-wide nav fuzz (81 regions, ~7400 unique SNOs) ---
echo [expect: 0 region failures, floor ~160k, water ~20k, ignored ~430k]
echo.
"%TOOL%" region nav-fuzz "%DS1%\Maps\World.dsmap" "%DS1%\Resources\Terrain.dsres"
pause
goto MENU
:T15
echo.
echo --- Phase 11b: hand-picked path in fh_r1 (10,0,10 to 30,0,30) ---
echo [expect: ~30-40 tris, ~35-unit centroid length]
echo.
"%TOOL%" region path "%DS1%\Maps\World.dsmap" "%DS1%\Resources\Terrain.dsres" /world/maps/map_world/regions/fh_r1 "10,0,10" "30,0,30"
echo.
echo --- Phase 11b: world-wide A* fuzz (81 regions, 20 samples each) ---
echo [expect: biggest-component A* = 100%%; random-pair ~40%% reflects topology]
echo.
"%TOOL%" region path-fuzz "%DS1%\Maps\World.dsmap" "%DS1%\Resources\Terrain.dsres"
pause
goto MENU
:T16
echo.
echo --- Phase 11c: nav follower walks fh_r1 corridor (10,0,10 to 30,0,30 at 6 u/s) ---
echo [expect: reaches goal in ~100 ticks (20 Hz), ~32 units walked vs ~28 straight-line]
echo.
"%TOOL%" region follow "%DS1%\Maps\World.dsmap" "%DS1%\Resources\Terrain.dsres" /world/maps/map_world/regions/fh_r1 "10,0,10" "30,0,30"
pause
goto MENU
:T17
echo.
echo --- Phase 11d: fh_r1 with 181 wandering actors on nav mesh ---
echo [expect: nav mesh ~27k tri / 0 non-manifold; 181 followers wandering]
echo [RMB+WASD to fly, Esc to quit — watch actors pathing around obstacles]
echo.
dotnet "%RUN%" --play-region "%DS1%\Maps\World.dsmap" "%DS1%\Resources\Terrain.dsres" "%DS1%\Resources\Logic.dsres" "%DS1%\Resources\Objects.dsres" /world/maps/map_world/regions/fh_r1
goto MENU
:T18
echo.
echo --- Phase 12a: combat stats for 3W_goblin_grunt ---
echo [expect: life 1162, damage 142-204, defense 554, walk 2.51, combatant=yes]
echo.
"%TOOL%" templates stats "%DS1%\Resources\Logic.dsres" 3W_goblin_grunt
echo.
echo --- Phase 12a: all 3W_goblin_* variants (3 combatants, 5 inert parts) ---
echo.
"%TOOL%" templates stats "%DS1%\Resources\Logic.dsres" --prefix=3W_goblin
pause
goto MENU
:T19
echo.
echo --- Phase 12b: grunt vs grunt, 1000 duels, seed=42 ---
echo [expect: 1000/1000 kills, mean hits ~10, mean damage ~112]
echo.
"%TOOL%" templates combat "%DS1%\Resources\Logic.dsres" 3W_goblin_grunt 3W_goblin_grunt --duels=1000 --seed=42
echo.
echo --- Phase 12b: guard vs grunt, 1000 duels, seed=42 ---
echo [expect: 1000/1000 kills, mean hits ~4, mean damage ~284]
echo.
"%TOOL%" templates combat "%DS1%\Resources\Logic.dsres" 3W_goblin_guard 3W_goblin_grunt --duels=1000 --seed=42
pause
goto MENU
:T20
echo.
echo --- Phase 12c: debug attack in fh_r1 ---
echo [walk up to a goblin, press F — expect "debug-attack: hit ... for ~N (M/1163)"]
echo [after ~5-6 hits the actor freezes in place with *** DEAD *** log]
echo [RMB+WASD to fly, F to attack nearest combatant in front, Esc to quit]
echo.
dotnet "%RUN%" --play-region "%DS1%\Maps\World.dsmap" "%DS1%\Resources\Terrain.dsres" "%DS1%\Resources\Logic.dsres" "%DS1%\Resources\Objects.dsres" /world/maps/map_world/regions/fh_r1
goto MENU
:T21
echo.
echo --- Phase 12d: loot table for 3W_goblin_grunt (structure + 10000-roll distribution) ---
echo [expect: 100%% equipped hm_g_c_1h1m_low, ~6%% common drops, ~0.1%% rare/unique]
echo.
"%TOOL%" templates loot "%DS1%\Resources\Logic.dsres" 3W_goblin_grunt --rolls=10000 --seed=42
echo.
echo --- Phase 12d: loot table for krug_scout (common fh_r1 spawn, 1000 rolls) ---
echo [expect: 100%% equipped dg_g_c_1h_fun, ~12%% drop one of melee/potion/mana]
echo.
"%TOOL%" templates loot "%DS1%\Resources\Logic.dsres" krug_scout --rolls=1000 --seed=42
pause
goto MENU
:T22
echo.
echo --- Phase 13a-e: Farmboy PC + chase cam + LMB move + RMB attack + fair-fight stats (fh_r1) ---
echo [expect: one Farmboy (male human) spawns at the NPC centroid]
echo [LMB on terrain to move; RMB-tap on a goblin to attack]
echo [RMB-drag still orbits the yaw — tap vs drag split by pixel drift]
echo [C toggles chase/fly cam; F still fires the camera-forward debug attack]
echo [13e: NPCs move at template walk_velocity; Farmboy hits with 1-3 dmg (multi-hit kills)]
echo.
dotnet "%RUN%" --play-region "%DS1%\Maps\World.dsmap" "%DS1%\Resources\Terrain.dsres" "%DS1%\Resources\Logic.dsres" "%DS1%\Resources\Objects.dsres" /world/maps/map_world/regions/fh_r1
goto MENU
:T23
echo.
echo --- Phase 14a-d: Pickup + equipment + weapon render (fh_r1) ---
echo [Farmboy spawns visibly wielding dg_g_d_1h_fun (fun dagger, 2-4 dmg)]
echo [kill a goblin, walk onto the beige pile cube to auto-pickup]
echo [upgraded weapons auto-equip and swap the rendered model on the hand]
echo [console logs equipment, pickup, equipped, and weapon-load events]
echo.
dotnet "%RUN%" --play-region "%DS1%\Maps\World.dsmap" "%DS1%\Resources\Terrain.dsres" "%DS1%\Resources\Logic.dsres" "%DS1%\Resources\Objects.dsres" /world/maps/map_world/regions/fh_r1
set EXITCODE=%ERRORLEVEL%
echo.
echo === SiegeFX exited with code %EXITCODE% ===
for %%F in ("%~dp0src\SiegeFX.Runtime\bin\Release\net11.0-windows10.0.22621.0\siegefx_crash.log") do if exist "%%~F" (
echo --- crash log ---
type "%%~F"
echo ------------------
)
pause
goto MENU
:T24
echo.
echo --- Phase 15a: Text overlay (DS1 copperplate-light, fh_r1) ---
echo [expect: white "SiegeFX" tag in the top-left corner of the window]
echo [a second line shows the Farmboy's live x/y/z as he moves]
echo [text uses DS1's b_gui_fnt_12p_copperplate-light font from Objects.dsres]
echo [console prints "hud font: ..." once the atlas decodes]
echo.
dotnet "%RUN%" --play-region "%DS1%\Maps\World.dsmap" "%DS1%\Resources\Terrain.dsres" "%DS1%\Resources\Logic.dsres" "%DS1%\Resources\Objects.dsres" /world/maps/map_world/regions/fh_r1
set EXITCODE=%ERRORLEVEL%
echo.
echo === SiegeFX exited with code %EXITCODE% ===
for %%F in ("%~dp0src\SiegeFX.Runtime\bin\Release\net11.0-windows10.0.22621.0\siegefx_crash.log") do if exist "%%~F" (
echo --- crash log ---
type "%%~F"
echo ------------------
)
pause
goto MENU
:T25
echo.
echo --- Phase 15b: HP/MP HUD bars (fh_r1) ---
echo [expect: red HP bar under the SiegeFX/coords text in the top-left]
echo [bar is 200px wide, captioned "HP 50/50" (Farmboy starts full)]
echo [no MP bar — Farmboy template has max_mana=0 so it stays hidden]
echo [walk into a krug and let it hit you to see the HP bar drain]
echo.
dotnet "%RUN%" --play-region "%DS1%\Maps\World.dsmap" "%DS1%\Resources\Terrain.dsres" "%DS1%\Resources\Logic.dsres" "%DS1%\Resources\Objects.dsres" /world/maps/map_world/regions/fh_r1
set EXITCODE=%ERRORLEVEL%
echo.
echo === SiegeFX exited with code %EXITCODE% ===
for %%F in ("%~dp0src\SiegeFX.Runtime\bin\Release\net11.0-windows10.0.22621.0\siegefx_crash.log") do if exist "%%~F" (
echo --- crash log ---
type "%%~F"
echo ------------------
)
pause
goto MENU
:T26
echo.
echo --- Phase 15c + SC-9/10/13/14: Grid inventory + shield-on-bone (fh_r1) ---
echo [press I to toggle a centered 8x5 inventory grid]
echo [icons land per-template (b_gui_ig_*); multi-cell weapons span 1x2 / 1x3]
echo [LMB-drag an item to a new cell to relocate it (saved across opens)]
echo [LMB-drag out of the panel to drop the item back into the world]
echo [each drop fires the template's [aspect][voice][put_down] * cue]
echo [SC-10: kill a shield-bearing enemy + pick up the shield -> renders on shield_grip]
echo [press I again or Esc to dismiss the panel]
echo.
dotnet "%RUN%" --play-region "%DS1%\Maps\World.dsmap" "%DS1%\Resources\Terrain.dsres" "%DS1%\Resources\Logic.dsres" "%DS1%\Resources\Objects.dsres" /world/maps/map_world/regions/fh_r1
set EXITCODE=%ERRORLEVEL%
echo.
echo === SiegeFX exited with code %EXITCODE% ===
for %%F in ("%~dp0src\SiegeFX.Runtime\bin\Release\net11.0-windows10.0.22621.0\siegefx_crash.log") do if exist "%%~F" (
echo --- crash log ---
type "%%~F"
echo ------------------
)
pause
goto MENU
:T27
echo.
echo --- Phase 15d: Pause menu (fh_r1) ---
echo [press Esc to open a centered "Paused" panel with two buttons]
echo [hover a button to highlight; LMB clicks while paused don't retarget]
echo [Resume closes the menu; Quit closes the window]
echo [Esc again from the menu also resumes]
echo.
dotnet "%RUN%" --play-region "%DS1%\Maps\World.dsmap" "%DS1%\Resources\Terrain.dsres" "%DS1%\Resources\Logic.dsres" "%DS1%\Resources\Objects.dsres" /world/maps/map_world/regions/fh_r1
set EXITCODE=%ERRORLEVEL%
echo.
echo === SiegeFX exited with code %EXITCODE% ===
for %%F in ("%~dp0src\SiegeFX.Runtime\bin\Release\net11.0-windows10.0.22621.0\siegefx_crash.log") do if exist "%%~F" (
echo --- crash log ---
type "%%~F"
echo ------------------
)
pause
goto MENU
:T28
echo.
echo --- Phase 16a: Formulas dump (Logic.dsres -^> formulas.gas) ---
echo [expect: 10/10/10 -^> MaxLife=49.0 MaxMana=30.0]
echo [expect: gains rows sum to 1.00; XP table ~151 entries]
echo [expect: lr 1/4 -^> 0.250 HP/sec at str=10; mr 1/3 -^> 0.333 MP/sec at int=10]
echo.
"%TOOL%" formulas dump "%DS1%\Resources\Logic.dsres"
pause
goto MENU
:T29
echo.
echo --- Phase 16b: HP/MP regen (fh_r1) ---
echo [press H to take 5 HP + 5 MP off the player (offline regen check)]
echo [then sit still and watch the bars climb back up]
echo [at 10/10/10 a fresh hero recovers ~0.25 HP/sec and ~0.333 MP/sec]
echo [full HP from 0 takes ~3 min; full MP from 0 takes ~90 sec]
echo [also tests the shutdown-crash fix on Esc-^>Quit and window X]
echo.
dotnet "%RUN%" --play-region "%DS1%\Maps\World.dsmap" "%DS1%\Resources\Terrain.dsres" "%DS1%\Resources\Logic.dsres" "%DS1%\Resources\Objects.dsres" /world/maps/map_world/regions/fh_r1
set EXITCODE=%ERRORLEVEL%
echo.
echo === SiegeFX exited with code %EXITCODE% ===
for %%F in ("%~dp0src\SiegeFX.Runtime\bin\Release\net11.0-windows10.0.22621.0\siegefx_crash.log") do if exist "%%~F" (
echo --- crash log ---
type "%%~F"
echo ------------------
)
pause
goto MENU
:T31
echo.
echo --- Phase 16d: XP + level (fh_r1) ---
echo [HUD shows "Lv 1 XP 0/N" under the HP/MP bars on spawn]
echo [click goblins to attack; XP ticks up by damage dealt + kill bonus]
echo [level 2 fires around ~150-200 xp; console prints "*** LEVEL UP! ***"]
echo [on level-up: STR/DEX/INT auto-grow by Melee proportional gains (0.64/0.27/0.09)]
echo [HP bar max grows on level-up; current HP unchanged (DS1 doesn't auto-heal)]
echo.
dotnet "%RUN%" --play-region "%DS1%\Maps\World.dsmap" "%DS1%\Resources\Terrain.dsres" "%DS1%\Resources\Logic.dsres" "%DS1%\Resources\Objects.dsres" /world/maps/map_world/regions/fh_r1
set EXITCODE=%ERRORLEVEL%
echo.
echo === SiegeFX exited with code %EXITCODE% ===
for %%F in ("%~dp0src\SiegeFX.Runtime\bin\Release\net11.0-windows10.0.22621.0\siegefx_crash.log") do if exist "%%~F" (
echo --- crash log ---
type "%%~F"
echo ------------------
)
pause
goto MENU
:T32
echo.
echo --- Phase 17a: Spells dump + spell_zap evaluated ---
"%TOOL%" spells dump "%DS1%\Resources\Logic.dsres"
echo.
"%TOOL%" spells show "%DS1%\Resources\Logic.dsres" spell_zap
pause
goto MENU
:T33
echo.
echo --- Phase 17a: Cast spell_zap (fh_r1) ---
echo [HUD shows "spellbook: primary <- spell_zap" in the launch log]
echo [aim cursor at a krug, press Q to cast: mana drops by 1, target takes 4-7 dmg]
echo [outside 8u range: "out of range" floats up; no mana: "no mana" floats up]
echo [cooldown is 0.15s so spam-Q just rate-limits to ~6 casts/sec]
echo [kills via spell credit XP under SkillKind.CombatMagic]
echo.
dotnet "%RUN%" --play-region "%DS1%\Maps\World.dsmap" "%DS1%\Resources\Terrain.dsres" "%DS1%\Resources\Logic.dsres" "%DS1%\Resources\Objects.dsres" /world/maps/map_world/regions/fh_r1
set EXITCODE=%ERRORLEVEL%
echo.
echo === SiegeFX exited with code %EXITCODE% ===
for %%F in ("%~dp0src\SiegeFX.Runtime\bin\Release\net11.0-windows10.0.22621.0\siegefx_crash.log") do if exist "%%~F" (
echo --- crash log ---
type "%%~F"
echo ------------------
)
pause
goto MENU
:T34
echo.
echo --- Phase 17b: Spell visuals (fh_r1) ---
echo [press Q on a krug; a cyan bolt streaks from your chest to the target]
echo [bolt lasts ~0.3s with a 5-dot fading trail]
echo [PC snaps to face the target on cast (no more shooting out of his back)]
echo [damage popup + mana drain are unchanged from 17a]
echo.
dotnet "%RUN%" --play-region "%DS1%\Maps\World.dsmap" "%DS1%\Resources\Terrain.dsres" "%DS1%\Resources\Logic.dsres" "%DS1%\Resources\Objects.dsres" /world/maps/map_world/regions/fh_r1
set EXITCODE=%ERRORLEVEL%
echo.
echo === SiegeFX exited with code %EXITCODE% ===
for %%F in ("%~dp0src\SiegeFX.Runtime\bin\Release\net11.0-windows10.0.22621.0\siegefx_crash.log") do if exist "%%~F" (
echo --- crash log ---
type "%%~F"
echo ------------------
)
pause
goto MENU
:T35
echo.
echo --- Phase 17c: Heal spell + W slot (fh_r1) ---
echo [Q casts spell_zap (offensive instant-hit, primary slot)]
echo [W casts spell_healing_wind (self-target heal, secondary slot)]
echo [W is silent at full HP ("at full health"); take damage from a krug first]
echo [L1 heal: ~3.77 HP for 10.3 mana (so a fresh hero gets ~3 casts)]
echo [3-second cooldown on the heal slot, independent from the Q cooldown]
echo.
dotnet "%RUN%" --play-region "%DS1%\Maps\World.dsmap" "%DS1%\Resources\Terrain.dsres" "%DS1%\Resources\Logic.dsres" "%DS1%\Resources\Objects.dsres" /world/maps/map_world/regions/fh_r1
set EXITCODE=%ERRORLEVEL%
echo.
echo === SiegeFX exited with code %EXITCODE% ===
for %%F in ("%~dp0src\SiegeFX.Runtime\bin\Release\net11.0-windows10.0.22621.0\siegefx_crash.log") do if exist "%%~F" (
echo --- crash log ---
type "%%~F"
echo ------------------
)
pause
goto MENU
:T38
echo.
echo --- Phase 18c: 3D positional audio (fh_r1) ---
echo [Hit a krug to your LEFT: hit/miss sound pans left in headphones]
echo [Walk ~30 units away from a fight: hits and screams fade out (max=40 units)]
echo [Cast SFX (Q/W) stay player-locked since they're "your" sounds]
echo [Console logs: 'audio: ... InverseDistanceClamped attenuation']
echo.
dotnet "%RUN%" --play-region "%DS1%\Maps\World.dsmap" "%DS1%\Resources\Terrain.dsres" "%DS1%\Resources\Logic.dsres" "%DS1%\Resources\Objects.dsres" /world/maps/map_world/regions/fh_r1
set EXITCODE=%ERRORLEVEL%
echo.
echo === SiegeFX exited with code %EXITCODE% ===
for %%F in ("%~dp0src\SiegeFX.Runtime\bin\Release\net11.0-windows10.0.22621.0\siegefx_crash.log") do if exist "%%~F" (
echo --- crash log ---
type "%%~F"
echo ------------------
)
pause
goto MENU
:T37
echo.
echo --- Phase 18b: Combat SFX (fh_r1) ---
echo [RMB on a krug: swing variant + hit (or miss if dealt=0)]
echo [Kill it: matching die_*.wav fires (krug_scout / krug_dog / goblin / gremal)]
echo [Cross an XP threshold: level_up_melee.wav punctuates the LEVEL UP toast]
echo [Console should show: audio: 'swing_01..04', 'hit_flesh_1..5', 'die_*', 'level_up' loaded]
echo.
dotnet "%RUN%" --play-region "%DS1%\Maps\World.dsmap" "%DS1%\Resources\Terrain.dsres" "%DS1%\Resources\Logic.dsres" "%DS1%\Resources\Objects.dsres" /world/maps/map_world/regions/fh_r1
set EXITCODE=%ERRORLEVEL%
echo.
echo === SiegeFX exited with code %EXITCODE% ===
for %%F in ("%~dp0src\SiegeFX.Runtime\bin\Release\net11.0-windows10.0.22621.0\siegefx_crash.log") do if exist "%%~F" (
echo --- crash log ---
type "%%~F"
echo ------------------
)
pause
goto MENU
:T36
echo.
echo --- Phase 18a: Audio engine + cast SFX (fh_r1) ---
echo [Q (zap) plays /sound/effects/s_e_spell_zap_cast.wav from Sound.dsres]
echo [W (heal) plays /sound/effects/s_e_spell_healing_wind_cast.wav]
echo [Console should show: audio: OpenAL Soft up (16 voices)]
echo [And: audio: 'spell_zap_cast' / 'spell_healing_wind_cast' loaded]
echo [SFX-disabled fallback: any OpenAL failure leaves the rest of the game playable]
echo.
dotnet "%RUN%" --play-region "%DS1%\Maps\World.dsmap" "%DS1%\Resources\Terrain.dsres" "%DS1%\Resources\Logic.dsres" "%DS1%\Resources\Objects.dsres" /world/maps/map_world/regions/fh_r1
set EXITCODE=%ERRORLEVEL%
echo.
echo === SiegeFX exited with code %EXITCODE% ===
for %%F in ("%~dp0src\SiegeFX.Runtime\bin\Release\net11.0-windows10.0.22621.0\siegefx_crash.log") do if exist "%%~F" (
echo --- crash log ---
type "%%~F"
echo ------------------
)
pause
goto MENU
:T39
echo.
echo --- Phase 19a: SaveFile JSON round-trip (no window) ---
echo [expect: "[selftest-save] OK - 3 actor(s), player + camera, schema v1 round-tripped at <path>"]
echo [exits 0 on success, 1 with field-by-field diffs on failure]
echo.
dotnet "%RUN%" --selftest-save
set EXITCODE=%ERRORLEVEL%
echo.
echo === SiegeFX exited with code %EXITCODE% ===
pause
goto MENU
:T40
echo.
echo --- Phase 19c: F5 quicksave + F9 quickload (fh_r1) ---
echo [Pre-save: kill 1-2 krug or take HP damage to make state interesting]
echo [Press F5: console logs "save: wrote N actor(s) + M pile(s) -^> ...quicksave.save"]
echo [Continue: kill more stuff, pick up loot, walk around, level up]
echo [Press F9: scene snaps back to F5 state — dead krug revive (if alive at save)]
echo [or stay dead (if dead at save); HP/MP/XP/Level revert; piles return]
echo [Save lives at: %%LOCALAPPDATA%%\SiegeFX\Saves\quicksave.save]
echo [Region check: a save from a different region path is refused on F9]
echo.
dotnet "%RUN%" --play-region "%DS1%\Maps\World.dsmap" "%DS1%\Resources\Terrain.dsres" "%DS1%\Resources\Logic.dsres" "%DS1%\Resources\Objects.dsres" /world/maps/map_world/regions/fh_r1
set EXITCODE=%ERRORLEVEL%
echo.
echo === SiegeFX exited with code %EXITCODE% ===
for %%F in ("%~dp0src\SiegeFX.Runtime\bin\Release\net11.0-windows10.0.22621.0\siegefx_crash.log") do if exist "%%~F" (
echo --- crash log ---
type "%%~F"
echo ------------------
)
pause
goto MENU
:T41
echo.
echo --- Phase 20a: dialogue parser self-test (no window) ---
echo [expect: "[selftest-dialogue] OK - edgaar branching tree (3 nodes...) parsed correctly"]
echo [exits 0 on success, 1 with field diffs on failure]
echo.
dotnet "%RUN%" --selftest-dialogue
set EXITCODE=%ERRORLEVEL%
echo.
echo === selftest exited with code %EXITCODE% ===
echo.
echo --- Phase 20a: visual walkthrough (fh_r1) ---
echo [Walk to Edgaar (the farmer) and right-click him: dialogue panel opens.]
echo [Node 1 has a "More" button: click to advance.]
echo [Node 2 is the quest fork with "Accept" / "Decline":]
echo [ Accept -^> console logs "talk: quest_edgaar_basement activated"]
echo [ Decline -^> jumps to the polite-tail node, then "Continue" closes.]
echo [Esc while open closes the panel without firing the quest.]
echo.
dotnet "%RUN%" --play-region "%DS1%\Maps\World.dsmap" "%DS1%\Resources\Terrain.dsres" "%DS1%\Resources\Logic.dsres" "%DS1%\Resources\Objects.dsres" /world/maps/map_world/regions/fh_r1
set EXITCODE=%ERRORLEVEL%
echo.
echo === SiegeFX exited with code %EXITCODE% ===
for %%F in ("%~dp0src\SiegeFX.Runtime\bin\Release\net11.0-windows10.0.22621.0\siegefx_crash.log") do if exist "%%~F" (
echo --- crash log ---
type "%%~F"
echo ------------------
)
pause
goto MENU
:T30
echo.
echo --- Phase 16c: NPC aggro (fh_r1) ---
echo [walk into a krug pen and stop within ~8u; the krug should chase]
echo [once they're adjacent (~1.8u) they swing every 1.5s and chip ~4-8 HP]
echo [step away past ~14u to disengage; HP regen kicks back in]
echo [chickens should still wander uninterested - they have no [attack] block]
echo.
dotnet "%RUN%" --play-region "%DS1%\Maps\World.dsmap" "%DS1%\Resources\Terrain.dsres" "%DS1%\Resources\Logic.dsres" "%DS1%\Resources\Objects.dsres" /world/maps/map_world/regions/fh_r1
set EXITCODE=%ERRORLEVEL%
echo.
echo === SiegeFX exited with code %EXITCODE% ===
for %%F in ("%~dp0src\SiegeFX.Runtime\bin\Release\net11.0-windows10.0.22621.0\siegefx_crash.log") do if exist "%%~F" (
echo --- crash log ---
type "%%~F"
echo ------------------
)
pause
goto MENU
:T42
echo.
echo --- Phase 20b: Quest log overlay (fh_r1) ---
echo [RMB Edgaar, click "More", click "Accept" — console logs activation]
echo [Press L: quest log opens, "Edgaar Basement" listed under ACTIVE]
echo [Re-pitch: RMB Edgaar, Accept again — log says "re-pitched (already in journal)"]
echo [F5 quicksave + F9 quickload: quest survives the round-trip]
echo.
dotnet "%RUN%" --play-region "%DS1%\Maps\World.dsmap" "%DS1%\Resources\Terrain.dsres" "%DS1%\Resources\Logic.dsres" "%DS1%\Resources\Objects.dsres" /world/maps/map_world/regions/fh_r1
set EXITCODE=%ERRORLEVEL%
echo.
echo === SiegeFX exited with code %EXITCODE% ===
for %%F in ("%~dp0src\SiegeFX.Runtime\bin\Release\net11.0-windows10.0.22621.0\siegefx_crash.log") do if exist "%%~F" (
echo --- crash log ---
type "%%~F"
echo ------------------
)
pause
goto MENU
:T43
echo.
echo --- Phase 20c: Kill objectives + goal markers (fh_r1) ---
echo [Accept Edgaar's basement quest — krug-kill objective: 0/5]
echo [Quest log (L) shows "(0/5)" beside the objective line]
echo [Yellow chevron paints above the nearest live krug; clamps to screen edge if behind]
echo [Each krug kill increments progress + a "+gold" floats off the corpse]
echo [On the 5th kill the entry flips to COMPLETED and the marker disappears]
echo.
dotnet "%RUN%" --play-region "%DS1%\Maps\World.dsmap" "%DS1%\Resources\Terrain.dsres" "%DS1%\Resources\Logic.dsres" "%DS1%\Resources\Objects.dsres" /world/maps/map_world/regions/fh_r1
set EXITCODE=%ERRORLEVEL%
echo.
echo === SiegeFX exited with code %EXITCODE% ===
for %%F in ("%~dp0src\SiegeFX.Runtime\bin\Release\net11.0-windows10.0.22621.0\siegefx_crash.log") do if exist "%%~F" (
echo --- crash log ---
type "%%~F"
echo ------------------
)
pause
goto MENU
:T44
echo.
echo --- Phase 25c: Authored store screen (Stonebridge, bt_r1) ---
echo [RMB a shopkeeper: Adwana (spells), Jonn (smith), or Gyorn - store screen opens]
echo [Right-docked authored chrome: cpbox frame, portrait box, name plate, 8x10 shelf grid]
echo [Six tabs ARMOR/WEAPONS/SHIELDS + SPELLS/POTIONS/MISC - active tab shifts down 5px]
echo [Adwana SPELLS tab: starter-band scrolls (zap/flash/fireshot tier, 20-150g range)]
echo [Hover a shelf item - name + price readout; unaffordable reads red]
echo [LMB a shelf item = buy (gold debits); your inventory co-opens - LMB your item = sell]
echo [Previous/Next page when a tab overflows the 8x10 grid; Close button exits]
echo [Insufficient gold: console logs "trade: cannot afford ..." and rejects]
echo.
dotnet "%RUN%" --play-region "%DS1%\Maps\World.dsmap" "%DS1%\Resources\Terrain.dsres" "%DS1%\Resources\Logic.dsres" "%DS1%\Resources\Objects.dsres" /world/maps/map_world/regions/bt_r1
set EXITCODE=%ERRORLEVEL%
echo.
echo === SiegeFX exited with code %EXITCODE% ===
for %%F in ("%~dp0src\SiegeFX.Runtime\bin\Release\net11.0-windows10.0.22621.0\siegefx_crash.log") do if exist "%%~F" (
echo --- crash log ---
type "%%~F"
echo ------------------
)
pause
goto MENU
:T45
echo.
echo --- Phase 21a-1: Neighbor terrain preload (fh_r1) ---
echo [Launch log shows "neighbor preload: N/M region(s) (X instance(s) ...)"]
echo [Expect M (declared) ~= 2-4 for fh_r1; N (placed) should equal M]
echo [unresolved + dangling stitch counts should be 0 for shipped fh_r1]
echo [In-game: fly to the south/east edge of fh_r1 — neighbor terrain is visible]
echo [WITHOUT this load, the world would just end at the region boundary]
echo [Actors / nav / dialogue still operate only inside fh_r1 — that's 21a-2]
echo.
dotnet "%RUN%" --play-region "%DS1%\Maps\World.dsmap" "%DS1%\Resources\Terrain.dsres" "%DS1%\Resources\Logic.dsres" "%DS1%\Resources\Objects.dsres" /world/maps/map_world/regions/fh_r1
set EXITCODE=%ERRORLEVEL%
echo.
echo === SiegeFX exited with code %EXITCODE% ===
for %%F in ("%~dp0src\SiegeFX.Runtime\bin\Release\net11.0-windows10.0.22621.0\siegefx_crash.log") do if exist "%%~F" (
echo --- crash log ---
type "%%~F"
echo ------------------
)
pause
goto MENU
:T46
echo.
echo --- Phase 21a-2: Cross-boundary nav + actors + dialogue (fh_r1 + neighbors) ---
echo [Builds on 21a-1: neighbor regions are now first-class for gameplay too]
echo [Launch log: "neighbor preload..." THEN actor + nav line includes neighbors]
echo [In-game: walk south/east past the old fh_r1 boundary — no more invisible wall]
echo [Nav mesh now spans player region + first-ring neighbors as one graph]
echo [Neighbor actors (krug/goblins beyond the boundary) are alive and aggro you]
echo [RMB an NPC living in a neighbor region — their dialogue tree opens normally]
echo [If you fly past the *outer* edge of the preloaded ring you'll still hit a wall]
echo [That's expected — eviction + rolling preload is 21a-3]
echo.
dotnet "%RUN%" --play-region "%DS1%\Maps\World.dsmap" "%DS1%\Resources\Terrain.dsres" "%DS1%\Resources\Logic.dsres" "%DS1%\Resources\Objects.dsres" /world/maps/map_world/regions/fh_r1
set EXITCODE=%ERRORLEVEL%
echo.