forked from aquadrizzt/TomeAndBlood
/
setup_specialists.tpa
executable file
·2994 lines (2827 loc) · 119 KB
/
setup_specialists.tpa
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
// -----------------------------
// REVISED SPECIALISTS
// -----------------------------
DEFINE_ACTION_FUNCTION revised_specialists BEGIN
// This component uses code by Subtledoctor; all such code is used with permission of the original author.
// SR spells
ACTION_IF (FILE_EXISTS_IN_GAME ~dvsrv4here.mrk~) BEGIN
ACTION_IF (FILE_CONTAINS_EVALUATED (~SPELL.IDS~ ~[ %TAB%]WIZARD_MONSTER_SUMMONING_LEVEL_1[ %TAB%%LNL%%MNL%%WNL%]~)) BEGIN
LAF RES_NUM_OF_SPELL_NAME STR_VAR spell_name = ~WIZARD_MONSTER_SUMMONING_LEVEL_1~ RET spell_res END
OUTER_SPRINT sr_ms1 ~%spell_res%~
END
ACTION_IF (FILE_CONTAINS_EVALUATED (~SPELL.IDS~ ~[ %TAB%]WIZARD_MONSTER_SUMMONING_LEVEL_2[ %TAB%%LNL%%MNL%%WNL%]~)) BEGIN
LAF RES_NUM_OF_SPELL_NAME STR_VAR spell_name = ~WIZARD_MONSTER_SUMMONING_LEVEL_2~ RET spell_res END
OUTER_SPRINT sr_ms2 ~%spell_res%~
END
ACTION_IF (FILE_CONTAINS_EVALUATED (~SPELL.IDS~ ~[ %TAB%]WIZARD_MONSTER_SUMMONING_LEVEL_3[ %TAB%%LNL%%MNL%%WNL%]~)) BEGIN
LAF RES_NUM_OF_SPELL_NAME STR_VAR spell_name = ~WIZARD_MONSTER_SUMMONING_LEVEL_3~ RET spell_res END
OUTER_SPRINT sr_ms3 ~%spell_res%~
END
ACTION_IF (FILE_CONTAINS_EVALUATED (~SPELL.IDS~ ~[ %TAB%]WIZARD_MONSTER_SUMMONING_LEVEL_4[ %TAB%%LNL%%MNL%%WNL%]~)) BEGIN
LAF RES_NUM_OF_SPELL_NAME STR_VAR spell_name = ~WIZARD_MONSTER_SUMMONING_LEVEL_4~ RET spell_res END
OUTER_SPRINT sr_ms4 ~%spell_res%~
END
ACTION_IF (FILE_CONTAINS_EVALUATED (~SPELL.IDS~ ~[ %TAB%]WIZARD_MONSTER_SUMMONING_LEVEL_5[ %TAB%%LNL%%MNL%%WNL%]~)) BEGIN
LAF RES_NUM_OF_SPELL_NAME STR_VAR spell_name = ~WIZARD_MONSTER_SUMMONING_LEVEL_5~ RET spell_res END
OUTER_SPRINT sr_ms5 ~%spell_res%~
END
ACTION_IF (FILE_CONTAINS_EVALUATED (~SPELL.IDS~ ~[ %TAB%]WIZARD_MONSTER_SUMMONING_LEVEL_6[ %TAB%%LNL%%MNL%%WNL%]~)) BEGIN
LAF RES_NUM_OF_SPELL_NAME STR_VAR spell_name = ~WIZARD_MONSTER_SUMMONING_LEVEL_6~ RET spell_res END
OUTER_SPRINT sr_ms6 ~%spell_res%~
END
ACTION_IF (FILE_CONTAINS_EVALUATED (~SPELL.IDS~ ~[ %TAB%]WIZARD_MONSTER_SUMMONING_LEVEL_7[ %TAB%%LNL%%MNL%%WNL%]~)) BEGIN
LAF RES_NUM_OF_SPELL_NAME STR_VAR spell_name = ~WIZARD_MONSTER_SUMMONING_LEVEL_7~ RET spell_res END
OUTER_SPRINT sr_ms7 ~%spell_res%~
END
ACTION_IF (FILE_CONTAINS_EVALUATED (~SPELL.IDS~ ~[ %TAB%]WIZARD_MONSTER_SUMMONING_LEVEL_8[ %TAB%%LNL%%MNL%%WNL%]~)) BEGIN
LAF RES_NUM_OF_SPELL_NAME STR_VAR spell_name = ~WIZARD_MONSTER_SUMMONING_LEVEL_8~ RET spell_res END
OUTER_SPRINT sr_ms8 ~%spell_res%~
END
ACTION_IF (FILE_CONTAINS_EVALUATED (~SPELL.IDS~ ~[ %TAB%]WIZARD_MONSTER_SUMMONING_LEVEL_9[ %TAB%%LNL%%MNL%%WNL%]~)) BEGIN
LAF RES_NUM_OF_SPELL_NAME STR_VAR spell_name = ~WIZARD_MONSTER_SUMMONING_LEVEL_9~ RET spell_res END
OUTER_SPRINT sr_ms9 ~%spell_res%~
END
END
// spontaneous casting icons
COPY ~TomeAndBlood/data/specialists/d5spnt1.bam~ ~override~
~TomeAndBlood/data/specialists/d5spnt2.bam~ ~override~
~TomeAndBlood/data/specialists/d5spnt3.bam~ ~override~
~TomeAndBlood/data/specialists/d5spnt4.bam~ ~override~
~TomeAndBlood/data/specialists/d5spnt5.bam~ ~override~
~TomeAndBlood/data/specialists/d5spnt6.bam~ ~override~
~TomeAndBlood/data/specialists/d5spnt7.bam~ ~override~
~TomeAndBlood/data/specialists/d5spnt8.bam~ ~override~
~TomeAndBlood/data/specialists/d5spnt9.bam~ ~override~
COPY ~TomeAndBlood/data/specialists/d5spont.spl~ ~override~
SAY NAME1 @6005
SAY UNIDENTIFIED_DESC @6005
COPY ~TomeAndBlood/data/specialists/d5spntx.spl~ ~override~
SAY NAME1 @6006
SAY UNIDENTIFIED_DESC @6006
COPY ~TomeAndBlood/data/specialists/d5spnt.bam~ ~override~
COPY ~TomeAndBlood/data/specialists/d5spnt0.bam~ ~override~
ACTION_FOR_EACH school IN ~1~ ~2~ ~3~ ~4~ ~5~ ~6~ ~7~ ~8~ BEGIN
ACTION_FOR_EACH level IN ~1~ ~2~ ~3~ ~4~ ~5~ ~6~ ~7~ ~8~ ~9~ BEGIN
COPY ~TomeAndBlood/data/specialists/spntlist.2da~ ~override/d5spnt%school%%level%.2da~
COPY ~TomeAndBlood/data/specialists/d5spont.eff~ ~override/d5spnt%school%%level%.eff~
WRITE_EVALUATED_ASCII 0x30 ~d5spnt%school%%level%~ #8
END
END
/*
Note:
Abjuration = 1
Conjuration = 2
Divination = 3
Enchantment = 4
Illusion = 5
Invocation = 6
Necromancy = 7
Transmutation = 8
*/
OUTER_SET count = 0
//OUTER_SPRINT $wizard_spells("%count%") "%spell%"
COPY_EXISTING_REGEXP GLOB ~^SPWI[1-9][0-5][0-9].spl$~ ~override~
READ_SHORT 0x1c type
PATCH_IF type = 1 BEGIN
// PATCH_IF NOT FILE_CONTAINS_EVALUATED (~hidespl.2da~ ~%SOURCE_RES%~) BEGIN
INNER_PATCH_SAVE res_num ~%SOURCE_RES%~ BEGIN
REPLACE_TEXTUALLY ~^[Ss][Pp][Ww][Ii]~ ~2~
END
PATCH_IF FILE_CONTAINS_EVALUATED (~spell.ids~ ~%res_num%~) BEGIN
PATCH_PRINT "%SOURCE_RES%"
SPRINT $wizard_spells("%count%") "%SOURCE_RES%"
++count
END
// END
END
BUT_ONLY
CREATE EFF ~d5spont~
WRITE_LONG 0x10 171
WRITE_LONG 0x14 1
WRITE_LONG 0x24 9
WRITE_SHORT 0x2c 100
WRITE_ASCII 0x30 ~d5spont~ #8
ACTION_PHP_EACH wizard_spells AS ind => wizard_spell BEGIN
OUTER_INNER_PATCH_SAVE spont_res ~%wizard_spell%~ BEGIN
REPLACE_TEXTUALLY ~^[Ss][Pp][Ww][Ii]~ ~d5wy~
END
ACTION_IF FILE_EXISTS_IN_GAME ~%wizard_spell%.spl~ BEGIN
COPY_EXISTING ~%wizard_spell%.spl~ ~override/%spont_res%.spl~
READ_SHORT 0x1c spell_type
READ_LONG 0x34 spell_level
READ_BYTE 0x25 spell_school
PATCH_IF (spell_type = 1) BEGIN
READ_LONG 0x64 abil_offset
READ_SHORT 0x68 abil_number
READ_BYTE (%abil_offset% + 0x0c) abil_target
READ_SHORT (%abil_offset% + 0x0e) abil_range
READ_LONG 0x6a eff_offset
READ_SHORT 0x70 num_globals
WHILE (%abil_number% > 0) BEGIN
SET abil_number = (%abil_number% - 1)
WRITE_SHORT (%abil_offset% + 0x26 + (0x28 * %abil_number%)) 1
END
READ_BYTE (%eff_offset% + (%num_globals% * 0x30) + 0x02) eff_target
LPF DELETE_EFFECT END
PATCH_IF (%abil_target% = 4) BEGIN
LPF ADD_SPELL_EFFECT INT_VAR opcode = 148 target = 1 power = 0 parameter1 = 0 parameter2 = 1 timing = 1 STR_VAR resource = EVAL ~%wizard_spell%~ END
PATCH_IF (%abil_range% < 35) BEGIN
PATCH_IF (%abil_range% > 4) BEGIN
LPF ALTER_SPELL_HEADER INT_VAR range = (%abil_range% - 3) END
END
PATCH_IF (%abil_range% < 5) BEGIN
LPF ALTER_SPELL_HEADER INT_VAR target = 5 END
END
END
END
PATCH_IF NOT (%abil_target% = 4) BEGIN
LPF ADD_SPELL_EFFECT INT_VAR opcode = 146 target = 2 power = 0 parameter1 = 0 parameter2 = 1 timing = 1 STR_VAR resource = EVAL ~%wizard_spell%~ END
END
END
INNER_ACTION BEGIN
ACTION_IF FILE_EXISTS_IN_GAME ~d5spnt%spell_school%%spell_level%.2da~ BEGIN
APPEND ~d5spnt%spell_school%%spell_level%.2da~ ~%wizard_spell% %spont_res% 3 ~
END
END
BUT_ONLY
COPY_EXISTING ~%wizard_spell%.spl~ ~override~
READ_SHORT 0x1c spell_type
READ_LONG 0x34 spell_level
SET spont_level = spell_level
READ_BYTE 0x25 spell_school
READ_SHORT 0x68 abil_number
PATCH_IF (spell_level > 1) BEGIN
LPF ADD_SPELL_HEADER INT_VAR required_level = 51 location = 2 target = 7 speed = 0 projectile = 1 STR_VAR icon = EVAL ~d5spnt%spell_level%~ END
LPF ADD_SPELL_EFFECT INT_VAR header = (%abil_number% + 1) opcode = 321 target = 1 parameter2 = 0 timing = 9 STR_VAR resource = ~d5spont~ END
LPF ADD_SPELL_EFFECT INT_VAR header = (%abil_number% + 1) opcode = 144 target = 1 parameter2 = 2 timing = 0 duration = 5 END
LPF ADD_SPELL_EFFECT INT_VAR header = (%abil_number% + 1) opcode = 144 target = 1 parameter2 = 3 timing = 0 duration = 5 END
LPF ADD_SPELL_EFFECT INT_VAR header = (%abil_number% + 1) opcode = 144 target = 1 parameter2 = 4 timing = 0 duration = 5 END
LPF ADD_SPELL_EFFECT INT_VAR header = (%abil_number% + 1) opcode = 144 target = 1 parameter2 = 5 timing = 0 duration = 5 END
LPF ADD_SPELL_CFEFFECT INT_VAR opcode = 177 target = 1 parameter2 = 9 parameter1 = 64 timing = 9 STR_VAR resource = ~d5spont~ END
LPF ADD_SPELL_CFEFFECT INT_VAR opcode = 177 target = 1 parameter2 = 9 parameter1 = 128 timing = 9 STR_VAR resource = ~d5spont~ END
LPF ADD_SPELL_CFEFFECT INT_VAR opcode = 177 target = 1 parameter2 = 9 parameter1 = 256 timing = 9 STR_VAR resource = ~d5spont~ END
LPF ADD_SPELL_CFEFFECT INT_VAR opcode = 177 target = 1 parameter2 = 9 parameter1 = 512 timing = 9 STR_VAR resource = ~d5spont~ END
LPF ADD_SPELL_CFEFFECT INT_VAR opcode = 177 target = 1 parameter2 = 9 parameter1 = 1024 timing = 9 STR_VAR resource = ~d5spont~ END
LPF ADD_SPELL_CFEFFECT INT_VAR opcode = 177 target = 1 parameter2 = 9 parameter1 = 2048 timing = 9 STR_VAR resource = ~d5spont~ END
LPF ADD_SPELL_CFEFFECT INT_VAR opcode = 177 target = 1 parameter2 = 9 parameter1 = 4096 timing = 9 STR_VAR resource = ~d5spont~ END
LPF ADD_SPELL_CFEFFECT INT_VAR opcode = 177 target = 1 parameter2 = 9 parameter1 = 8192 timing = 9 STR_VAR resource = ~d5spont~ END
LPF ADD_SPELL_CFEFFECT INT_VAR opcode = 172 target = 1 timing = 1 STR_VAR resource = ~d5spntx~ END
LPF ADD_SPELL_CFEFFECT INT_VAR opcode = 172 target = 1 timing = 1 STR_VAR resource = ~d5spont~ END
PATCH_FOR_EACH specialist IN ~64~ ~128~ ~256~ ~512~ ~1024~ ~2048~ ~4096~ ~8192~ BEGIN
PATCH_IF specialist = 64 BEGIN
SET spec_school = 1
END
PATCH_IF specialist = 128 BEGIN
SET spec_school = 2
END
PATCH_IF specialist = 256 BEGIN
SET spec_school = 3
END
PATCH_IF specialist = 512 BEGIN
SET spec_school = 4
END
PATCH_IF specialist = 1024 BEGIN
SET spec_school = 5
END
PATCH_IF specialist = 2048 BEGIN
SET spec_school = 6
END
PATCH_IF specialist = 4096 BEGIN
SET spec_school = 7
END
PATCH_IF specialist = 8192 BEGIN
SET spec_school = 8
END
LPF ADD_SPELL_EFFECT INT_VAR header = (%abil_number% + 1) opcode = 177 parameter2 = 9 parameter1 = %specialist% target = 1 timing = 1 STR_VAR resource = EVAL ~d5spnt%spec_school%%spont_level%~ END
END
END
BUT_ONLY
END
END
ACTION_IF NOT FILE_EXISTS_IN_GAME ~dvsrv4here.mrk~ BEGIN // version without Spell Revisions
INCLUDE ~TomeAndBlood/data/core/spell_list_base.tpa~
END
ACTION_IF FILE_EXISTS_IN_GAME ~dvsrv4here.mrk~ BEGIN // version for Spell Revisions
INCLUDE ~TomeAndBlood/data/core/spell_list_sr.tpa~
END
//Hiding NRD
ACTION_IF (FILE_EXISTS_IN_GAME ~hidespl.2da~) AND (GAME_IS ~iwdee~) BEGIN
APPEND ~hidespl.2da~ ~SPWI124 1 0~
END
ACTION_IF (FILE_EXISTS_IN_GAME ~hidespl.2da~) AND !(GAME_IS ~iwdee~) BEGIN
APPEND ~hidespl.2da~ ~SPWI124 1 0 0~
END
//New Descriptions
COPY_EXISTING - ~kitlist.2da~ ~override~
// COUNT_2DA_COLS num_cols
READ_2DA_ENTRIES_NOW ~r2en_kitlist~ 9
FOR (row = 1; row < r2en_kitlist; row += 1) BEGIN
READ_2DA_ENTRY_FORMER ~r2en_kitlist~ row 1 kitname
PATCH_IF (~%kitname%~ STRING_EQUAL_CASE ~ABJURER~) BEGIN
READ_2DA_ENTRY_FORMER ~r2en_kitlist~ row 4 str_abjurer
END
PATCH_IF (~%kitname%~ STRING_EQUAL_CASE ~CONJURER~) BEGIN
READ_2DA_ENTRY_FORMER ~r2en_kitlist~ row 4 str_conjurer
END
PATCH_IF (~%kitname%~ STRING_EQUAL_CASE ~DIVINER~) BEGIN
READ_2DA_ENTRY_FORMER ~r2en_kitlist~ row 4 str_diviner
END
PATCH_IF (~%kitname%~ STRING_EQUAL_CASE ~ENCHANTER~) BEGIN
READ_2DA_ENTRY_FORMER ~r2en_kitlist~ row 4 str_enchanter
END
PATCH_IF (~%kitname%~ STRING_EQUAL_CASE ~ILLUSIONIST~) BEGIN
READ_2DA_ENTRY_FORMER ~r2en_kitlist~ row 4 str_illusionist
END
PATCH_IF (~%kitname%~ STRING_EQUAL_CASE ~INVOKER~) BEGIN
READ_2DA_ENTRY_FORMER ~r2en_kitlist~ row 4 str_invoker
END
PATCH_IF (~%kitname%~ STRING_EQUAL_CASE ~NECROMANCER~) BEGIN
READ_2DA_ENTRY_FORMER ~r2en_kitlist~ row 4 str_necromancer
END
PATCH_IF (~%kitname%~ STRING_EQUAL_CASE ~TRANSMUTER~) BEGIN
READ_2DA_ENTRY_FORMER ~r2en_kitlist~ row 4 str_transmuter
END
END
STRING_SET_EVALUATE ~%str_abjurer%~ @101
STRING_SET_EVALUATE ~%str_conjurer%~ @102
STRING_SET_EVALUATE ~%str_diviner%~ @103
STRING_SET_EVALUATE ~%str_enchanter%~ @104
STRING_SET_EVALUATE ~%str_illusionist%~ @105
STRING_SET_EVALUATE ~%str_invoker%~ @106
STRING_SET_EVALUATE ~%str_necromancer%~ @107
STRING_SET_EVALUATE ~%str_transmuter%~ @108
//New CLAB Files
COPY_EXISTING ~CLABMA02.2da~ ~override~ //abjurer
APPEND_FILE ~TomeAndBlood/data/specialists/CLABMA02_add.txt~
COPY_EXISTING ~CLABMA03.2da~ ~override~ //necromancer
APPEND_FILE ~TomeAndBlood/data/specialists/CLABMA03_add.txt~
COPY_EXISTING ~CLABMA04.2da~ ~override~ //transmuter
APPEND_FILE ~TomeAndBlood/data/specialists/CLABMA04_add.txt~
COPY_EXISTING ~CLABMA05.2da~ ~override~ //diviner
APPEND_FILE ~TomeAndBlood/data/specialists/CLABMA05_add.txt~
COPY_EXISTING ~CLABMA06.2da~ ~override~ //conjurer
APPEND_FILE ~TomeAndBlood/data/specialists/CLABMA06_add.txt~
COPY_EXISTING ~CLABMA07.2da~ ~override~ //invoker
APPEND_FILE ~TomeAndBlood/data/specialists/CLABMA07_add.txt~
COPY_EXISTING ~CLABMA08.2da~ ~override~ //illusionist
APPEND_FILE ~TomeAndBlood/data/specialists/CLABMA08_add.txt~
COPY_EXISTING ~CLABMA09.2da~ ~override~ //enchanter
APPEND_FILE ~TomeAndBlood/data/specialists/CLABMA09_add.txt~
/*
.
.
.
.
.
//Update Necromancer Alignments
COPY_EXISTING ~alignmnt.2da~ ~override~
REPLACE_TEXTUALLY ~^NECROMANCER[ %TAB%]+.+~ ~NECROMANCER 0 0 1 0 0 1 0 0 1~
PRETTY_PRINT_2DA
BUT_ONLY
.
.
.
.
.
*/
COPY_EXISTING ~qdscrlmap.2da~ ~override~
COUNT_2DA_COLS cols
READ_2DA_ENTRIES_NOW ~r2en_schools~ cols
FOR (row = 1; row < r2en_schools; row += 1) BEGIN
READ_2DA_ENTRY_FORMER ~r2en_schools~ row 0 the_spell
READ_2DA_ENTRY_FORMER ~r2en_schools~ row 1 the_scroll
READ_2DA_ENTRY_FORMER ~r2en_schools~ row 2 the_school
TEXT_SPRINT $d5_scroll_spell_school(~%the_scroll%~ ~%the_spell%~) ~%the_school%~
END
BUT_ONLY
/* don't void opp schools, that has its own component now
//Updating Spells and Scrolls
ACTION_PHP_EACH d5_scroll_spell_school AS scroll => school BEGIN
ACTION_IF (FILE_EXISTS_IN_GAME ~%scroll_1%.spl~) BEGIN
COPY_EXISTING ~%scroll_1%.spl~ ~override~
WRITE_LONG 0x1e ("0x00000000") //blocked to: none
// ACTION_IF (~%school%~ STRING_EQUAL_CASE ~necromancy~) BEGIN
// APPEND ~HIDESPL.2da~ ~%scroll_1% 1 0 0~ //add necromancy to hidespl
// END
ACTION_IF (FILE_EXISTS_IN_GAME ~%scroll%.itm~) BEGIN
COPY_EXISTING ~%scroll%.itm~ ~override~
WRITE_BYTE 0x2d ("0x00") //blocked to: none
WRITE_BYTE 0x2f ("0x00") //blocked to: none
END
END
END
*/
//Automatic School Spells
COPY ~TomeAndBlood/data/specialists/QDMG+SCH.SPL~ ~override/QDMG+ABJ.SPL~ //making the new abjuration spell
~TomeAndBlood/data/specialists/QDMG+SCH.SPL~ ~override/QDMG+ALT.SPL~ //making the new alteration spell
~TomeAndBlood/data/specialists/QDMG+SCH.SPL~ ~override/QDMG+CON.SPL~ //making the new conjuration spell
~TomeAndBlood/data/specialists/QDMG+SCH.SPL~ ~override/QDMG+EVO.SPL~ //making the new evocation spell
~TomeAndBlood/data/specialists/QDMG+SCH.SPL~ ~override/QDMG+ENC.SPL~ //making the new encahntment spell
~TomeAndBlood/data/specialists/QDMG+SCH.SPL~ ~override/QDMG+ILL.SPL~ //making the new illusion spell
~TomeAndBlood/data/specialists/QDMG+SCH.SPL~ ~override/QDMG+NEC.SPL~ //making the new necromancy spell
~TomeAndBlood/data/specialists/QDMG+SCH.SPL~ ~override/QDMG+DIV.SPL~ //making the new divination spell
ACTION_PHP_EACH d5_scroll_spell_school AS scroll => school BEGIN
ACTION_IF (FILE_EXISTS_IN_GAME ~%scroll_1%.spl~) BEGIN
ACTION_IF (~%scroll_1%~ STRING_EQUAL_CASE ~SPWI123~ OR //Find Familiar
/*
~%scroll_1%~ STRING_EQUAL_CASE ~SPWI117~ OR //Chill Touch
~%scroll_1%~ STRING_EQUAL_CASE ~SPWI218~ OR //Ghoul Touch
~%scroll_1%~ STRING_EQUAL_CASE ~SPWI314~ OR //Vampiric Touch
*/
~%scroll_1%~ STRING_EQUAL_CASE ~SPWI124~ OR //NRD
~%scroll_1%~ STRING_EQUAL_CASE ~SPWI222~ OR //Chaos Shield
~%scroll_1%~ STRING_EQUAL_CASE ~SPWI723~ OR //Improved Chaos Shield
~%scroll_1%~ STRING_EQUAL_CASE ~SPWI406~ OR //Minor Globe of Invulnerability
~%scroll_1%~ STRING_EQUAL_CASE ~SPWI522~ OR //Minor Spell Turning
~%scroll_1%~ STRING_EQUAL_CASE ~SPWI602~ OR //Globe of Invulnerability
~%scroll_1%~ STRING_EQUAL_CASE ~SPWI618~ OR //Spell Deflection
~%scroll_1%~ STRING_EQUAL_CASE ~SPWI701~ OR //Spell Turning
~%scroll_1%~ STRING_EQUAL_CASE ~SPWI902~ OR //Spell Trap
(FILE_EXISTS_IN_GAME ~dvsrv4here.mrk~ AND // Spell Revisions
(~%scroll_1%~ STRING_EQUAL_CASE ~%sr_ms1%~ OR //SR: MS 1
~%scroll_1%~ STRING_EQUAL_CASE ~%sr_ms2%~ OR //SR: MS 2
~%scroll_1%~ STRING_EQUAL_CASE ~%sr_ms3%~ OR //SR: MS 3
~%scroll_1%~ STRING_EQUAL_CASE ~%sr_ms4%~ OR //SR: MS 4
~%scroll_1%~ STRING_EQUAL_CASE ~%sr_ms5%~ OR //SR: MS 5
~%scroll_1%~ STRING_EQUAL_CASE ~%sr_ms6%~ OR //SR: MS 6
~%scroll_1%~ STRING_EQUAL_CASE ~%sr_ms7%~ OR //SR: MS 7
~%scroll_1%~ STRING_EQUAL_CASE ~%sr_ms8%~ OR //SR: MS 8
~%scroll_1%~ STRING_EQUAL_CASE ~%sr_ms9%~)
) OR
((NOT FILE_EXISTS_IN_GAME ~dvsrv4here.mrk~) AND //No Spell Revisions
(~%scroll_1%~ STRING_EQUAL_CASE ~SPWI309~ OR //Monster Summoning I
~%scroll_1%~ STRING_EQUAL_CASE ~SPWI407~ OR //Monster Summoning II
~%scroll_1%~ STRING_EQUAL_CASE ~SPWI504~) //Monster Summoning III
)
OR //Spell Trap
(GAME_IS ~bgee~ AND // Dancing Lights in BGEE
(~%scroll_1%~ STRING_EQUAL_CASE ~SPWI126~))
) BEGIN //exclusion list here
//do nothing
END
ELSE BEGIN
COPY_EXISTING ~%scroll_1%.spl~ ~override~
READ_BYTE 0x25 school
ACTION_IF (school = 1) BEGIN //abjuration
COPY_EXISTING ~QDMG+ABJ.SPL~ ~override~
LPF ADD_SPELL_EFFECT INT_VAR opcode=171 target=1 timing=9 STR_VAR resource= EVAL ~%scroll_1%~ END
END
ACTION_IF (school = 8) BEGIN //alteration
COPY_EXISTING ~QDMG+ALT.SPL~ ~override~
LPF ADD_SPELL_EFFECT INT_VAR opcode=171 target=1 timing=9 STR_VAR resource= EVAL ~%scroll_1%~ END
END
ACTION_IF (school = 2) BEGIN //conjuration
COPY_EXISTING ~QDMG+CON.SPL~ ~override~
LPF ADD_SPELL_EFFECT INT_VAR opcode=171 target=1 timing=9 STR_VAR resource= EVAL ~%scroll_1%~ END
END
ACTION_IF (school = 3) BEGIN //divination
COPY_EXISTING ~QDMG+DIV.SPL~ ~override~
LPF ADD_SPELL_EFFECT INT_VAR opcode=171 target=1 timing=9 STR_VAR resource= EVAL ~%scroll_1%~ END
END
ACTION_IF (school = 4) BEGIN //enchantment
COPY_EXISTING ~QDMG+ENC.SPL~ ~override~
LPF ADD_SPELL_EFFECT INT_VAR opcode=171 target=1 timing=9 STR_VAR resource= EVAL ~%scroll_1%~ END
END
ACTION_IF (school = 6) BEGIN //evocation
COPY_EXISTING ~QDMG+EVO.SPL~ ~override~
LPF ADD_SPELL_EFFECT INT_VAR opcode=171 target=1 timing=9 STR_VAR resource= EVAL ~%scroll_1%~ END
END
ACTION_IF (school = 5) BEGIN //illusion
COPY_EXISTING ~QDMG+ILL.SPL~ ~override~
LPF ADD_SPELL_EFFECT INT_VAR opcode=171 target=1 timing=9 STR_VAR resource= EVAL ~%scroll_1%~ END
END
ACTION_IF (school = 7) BEGIN //necromancy
COPY_EXISTING ~QDMG+NEC.SPL~ ~override~
LPF ADD_SPELL_EFFECT INT_VAR opcode=171 target=1 timing=9 STR_VAR resource= EVAL ~%scroll_1%~ END
END
END
END
END
ACTION_IF (FILE_EXISTS_IN_GAME ~d5si9il.spl~) BEGIN
COPY_EXISTING ~QDMG+ILL.SPL~ ~override~
LPF ADD_SPELL_EFFECT INT_VAR opcode = 171 target = 1 timing = 9 STR_VAR resource = ~d5si9il~ END
END
//Base Abilities and CLAB Updates
COPY ~TomeAndBlood/data/specialists/D5_TRAN1.SPL~ ~override~ //transmuter poly/petrify immunity
~TomeAndBlood/data/specialists/D5_DIVI1.SPL~ ~override~ //diviner backstab immunity
~TomeAndBlood/data/specialists/D5_ENC1.SPL~ ~override~ //enchanter charm/sleep immu
~TomeAndBlood/data/specialists/D5_ENC2.SPL~ ~override~ //enchanter aura
~TomeAndBlood/data/specialists/D5_ENC2.EFF~ ~override~ //enchanter aura effect
~TomeAndBlood/data/specialists/D5_ENC2A.SPL~ ~override~ //enchanter aura spl
//Abjurer Spell Prot EEs
ACTION_IF GAME_IS ~bgee bg2ee iwdee eet~ THEN BEGIN
//Spell Shield for Abjurers
COPY ~TomeAndBlood/data/specialists/d5_abju.eff~ ~override~
COPY_EXISTING ~spwi522.spl~ ~override~
~spwi618.spl~ ~override~
~spwi701.spl~ ~override~
~spwi902.spl~ ~override~
~spwi406.spl~ ~override~
~spwi602.spl~ ~override~
LPF ADD_SPELL_EFFECT INT_VAR opcode=177 target=1 parameter1=64 parameter2=9 resist_dispel=0 timing=9 power=0 STR_VAR resource = ~d5_abju~ END
//Add new abilities to Bonus Spells
COPY_EXISTING ~QDMG+ABJ.SPL~ ~override~
LPF ADD_SPELL_EFFECT INT_VAR opcode=171 target=1 timing=9 STR_VAR resource= ~spwi406~ END
LPF ADD_SPELL_EFFECT INT_VAR opcode=171 target=1 timing=9 STR_VAR resource= ~spwi522~ END
LPF ADD_SPELL_EFFECT INT_VAR opcode=171 target=1 timing=9 STR_VAR resource= ~spwi602~ END
LPF ADD_SPELL_EFFECT INT_VAR opcode=171 target=1 timing=9 STR_VAR resource= ~spwi618~ END
LPF ADD_SPELL_EFFECT INT_VAR opcode=171 target=1 timing=9 STR_VAR resource= ~spwi701~ END
LPF ADD_SPELL_EFFECT INT_VAR opcode=171 target=1 timing=9 STR_VAR resource= ~spwi902~ END
END
ELSE BEGIN
//ToB Abjurer updates
ACTION_IF ENGINE_IS ~tob~ THEN BEGIN
ACTION_IF NOT FILE_EXISTS_IN_GAME ~dvsrv4here.mrk~ THEN BEGIN
COPY_EXISTING ~spwi406.spl~ ~override/d5_abju1.spl~
SAY NAME1 @6201
LPF ADD_SPELL_EFFECT INT_VAR opcode=146 target=1 resist_dispel=0 timing=0 power=0 STR_VAR resource=~spwi519~ END
COPY_EXISTING ~spwi522.spl~ ~override/d5_abju2.spl~
SAY NAME1 @6202
LPF ADD_SPELL_EFFECT INT_VAR opcode=146 target=1 resist_dispel=0 timing=0 power=0 STR_VAR resource=~spwi519~ END
COPY_EXISTING ~spwi602.spl~ ~override/d5_abju3.spl~
SAY NAME1 @6203
LPF ADD_SPELL_EFFECT INT_VAR opcode=146 target=1 resist_dispel=0 timing=0 power=0 STR_VAR resource=~spwi519~ END
COPY_EXISTING ~spwi618.spl~ ~override/d5_abju4.spl~
SAY NAME1 @6204
LPF ADD_SPELL_EFFECT INT_VAR opcode=146 target=1 resist_dispel=0 timing=0 power=0 STR_VAR resource=~spwi519~ END
COPY_EXISTING ~spwi701.spl~ ~override/d5_abju5.spl~
SAY NAME1 @6205
LPF ADD_SPELL_EFFECT INT_VAR opcode=146 target=1 resist_dispel=0 timing=0 power=0 STR_VAR resource=~spwi519~ END
COPY_EXISTING ~spwi902.spl~ ~override/d5_abju6.spl~
SAY NAME1 @6206
LPF ADD_SPELL_EFFECT INT_VAR opcode=146 target=1 resist_dispel=0 timing=0 power=0 STR_VAR resource=~spwi519~ END
END
ACTION_IF FILE_EXISTS_IN_GAME ~dvsrv4here.mrk~ THEN BEGIN
COPY_EXISTING ~spwi406.spl~ ~override/d5_abju1.spl~
SAY NAME1 @6211
LPF ADD_SPELL_EFFECT INT_VAR opcode=146 target=1 resist_dispel=0 timing=0 power=0 STR_VAR resource=~spwi519~ END
COPY_EXISTING ~spwi522.spl~ ~override/d5_abju2.spl~
SAY NAME1 @6212
LPF ADD_SPELL_EFFECT INT_VAR opcode=146 target=1 resist_dispel=0 timing=0 power=0 STR_VAR resource=~spwi519~ END
COPY_EXISTING ~spwi602.spl~ ~override/d5_abju3.spl~
SAY NAME1 @6213
LPF ADD_SPELL_EFFECT INT_VAR opcode=146 target=1 resist_dispel=0 timing=0 power=0 STR_VAR resource=~spwi519~ END
COPY_EXISTING ~spwi618.spl~ ~override/d5_abju4.spl~
SAY NAME1 @6214
LPF ADD_SPELL_EFFECT INT_VAR opcode=146 target=1 resist_dispel=0 timing=0 power=0 STR_VAR resource=~spwi519~ END
COPY_EXISTING ~spwi701.spl~ ~override/d5_abju5.spl~
SAY NAME1 @6215
LPF ADD_SPELL_EFFECT INT_VAR opcode=146 target=1 resist_dispel=0 timing=0 power=0 STR_VAR resource=~spwi519~ END
COPY_EXISTING ~spwi902.spl~ ~override/d5_abju6.spl~
SAY NAME1 @6216
LPF ADD_SPELL_EFFECT INT_VAR opcode=146 target=1 resist_dispel=0 timing=0 power=0 STR_VAR resource=~spwi519~ END
END
ACTION_IF FILE_EXISTS_IN_GAME ~spwi406.spl~ THEN BEGIN
COPY_EXISTING ~spwi406.spl~ ~override~
WRITE_LONG 0x1e ("0x00000040") //blocked: abjurers
BUT_ONLY
END
ACTION_IF FILE_EXISTS_IN_GAME ~spwi522.spl~ THEN BEGIN
COPY_EXISTING ~spwi522.spl~ ~override~
WRITE_LONG 0x1e ("0x00000040") //blocked: abjurers
BUT_ONLY
END
ACTION_IF FILE_EXISTS_IN_GAME ~spwi602.spl~ THEN BEGIN
COPY_EXISTING ~spwi602.spl~ ~override~
WRITE_LONG 0x1e ("0x00000040") //blocked: abjurers
BUT_ONLY
END
ACTION_IF FILE_EXISTS_IN_GAME ~spwi618.spl~ THEN BEGIN
COPY_EXISTING ~spwi618.spl~ ~override~
WRITE_LONG 0x1e ("0x00000040") //blocked: abjurers
BUT_ONLY
END
ACTION_IF FILE_EXISTS_IN_GAME ~spwi701.spl~ THEN BEGIN
COPY_EXISTING ~spwi701.spl~ ~override~
WRITE_LONG 0x1e ("0x00000040") //blocked: abjurers
BUT_ONLY
END
ACTION_IF FILE_EXISTS_IN_GAME ~spwi902.spl~ THEN BEGIN
COPY_EXISTING ~spwi902.spl~ ~override~
WRITE_LONG 0x1e ("0x00000040") //blocked: abjurers
BUT_ONLY
END
//Add new abilities to Bonus Spells
COPY_EXISTING ~QDMG+ABJ.SPL~ ~override~
LPF ADD_SPELL_EFFECT INT_VAR opcode=171 target=1 timing=9 STR_VAR resource= ~D5_ABJU1~ END
LPF ADD_SPELL_EFFECT INT_VAR opcode=171 target=1 timing=9 STR_VAR resource= ~D5_ABJU2~ END
LPF ADD_SPELL_EFFECT INT_VAR opcode=171 target=1 timing=9 STR_VAR resource= ~D5_ABJU3~ END
LPF ADD_SPELL_EFFECT INT_VAR opcode=171 target=1 timing=9 STR_VAR resource= ~D5_ABJU4~ END
LPF ADD_SPELL_EFFECT INT_VAR opcode=171 target=1 timing=9 STR_VAR resource= ~D5_ABJU5~ END
LPF ADD_SPELL_EFFECT INT_VAR opcode=171 target=1 timing=9 STR_VAR resource= ~D5_ABJU6~ END
END
END
//Conjurer with SR
ACTION_IF FILE_EXISTS_IN_GAME ~dvsrv4here.mrk~ THEN BEGIN //SR
//Reducing Monster Summoning Spells by 1 level
COPY_EXISTING ~%sr_ms2%.spl~ ~override/d5_conj1.spl~
WRITE_LONG 0x34 1
IF_EXISTS
COPY_EXISTING ~%sr_ms3%.spl~ ~override/d5_conj2.spl~
WRITE_LONG 0x34 2
IF_EXISTS
COPY_EXISTING ~%sr_ms4%.spl~ ~override/d5_conj3.spl~
WRITE_LONG 0x34 3
IF_EXISTS
COPY_EXISTING ~%sr_ms5%.spl~ ~override/d5_conj4.spl~
WRITE_LONG 0x34 4
IF_EXISTS
COPY_EXISTING ~%sr_ms6%.spl~ ~override/d5_conj5.spl~
WRITE_LONG 0x34 5
IF_EXISTS
COPY_EXISTING ~%sr_ms7%.spl~ ~override/d5_conj6.spl~
WRITE_LONG 0x34 6
IF_EXISTS
COPY_EXISTING ~%sr_ms8%.spl~ ~override/d5_conj7.spl~
WRITE_LONG 0x34 7
IF_EXISTS
//Add new abilities to Bonus Spells
COPY_EXISTING ~QDMG+CON.SPL~ ~override~
LPF ADD_SPELL_EFFECT INT_VAR opcode=171 target=1 timing=9 STR_VAR resource= ~D5_CONJ1~ END
LPF ADD_SPELL_EFFECT INT_VAR opcode=171 target=1 timing=9 STR_VAR resource= ~D5_CONJ2~ END
LPF ADD_SPELL_EFFECT INT_VAR opcode=171 target=1 timing=9 STR_VAR resource= ~D5_CONJ3~ END
LPF ADD_SPELL_EFFECT INT_VAR opcode=171 target=1 timing=9 STR_VAR resource= ~D5_CONJ4~ END
LPF ADD_SPELL_EFFECT INT_VAR opcode=171 target=1 timing=9 STR_VAR resource= ~D5_CONJ5~ END
LPF ADD_SPELL_EFFECT INT_VAR opcode=171 target=1 timing=9 STR_VAR resource= ~D5_CONJ6~ END
LPF ADD_SPELL_EFFECT INT_VAR opcode=171 target=1 timing=9 STR_VAR resource= ~D5_CONJ7~ END
//Updating description
ACTION_GET_STRREF str_conjurer conjurer
OUTER_SPRINT old @110
OUTER_SPRINT new @112
OUTER_PATCH_SAVE conjurer ~%conjurer%~ BEGIN
REPLACE_TEXTUALLY ~%old%~ ~%new%~
END
STRING_SET_EVALUATE str_conjurer ~%conjurer%~
END
ELSE BEGIN //No SR
//Making Monster Summoning I, II, III innates
COPY_EXISTING ~spwi309.spl~ ~override/d5_conv1.spl~
LPM spell_to_innate
COPY_EXISTING ~spwi407.spl~ ~override/d5_conv2.spl~
LPM spell_to_innate
COPY_EXISTING ~spwi504.spl~ ~override/d5_conv3.spl~
LPM spell_to_innate
APPEND ~CLABMA06.2da~ ~MON_SUMM **** GA_D5_CONV1 **** GA_D5_CONV1 **** GA_D5_CONV2 **** GA_D5_CONV2 **** GA_D5_CONV3~
//Description Updates
ACTION_GET_STRREF str_conjurer conjurer
OUTER_SPRINT old @110
OUTER_SPRINT new @111
OUTER_PATCH_SAVE conjurer ~%conjurer%~ BEGIN
REPLACE_TEXTUALLY ~%old%~ ~%new%~
END
STRING_SET_EVALUATE str_conjurer ~%conjurer%~
//adding skipped abilities to the bonus spells
COPY_EXISTING ~QDMG+CON.SPL~ ~override~
LPF ADD_SPELL_EFFECT INT_VAR opcode=171 target=1 timing=9 STR_VAR resource= ~SPWI309~ END
LPF ADD_SPELL_EFFECT INT_VAR opcode=171 target=1 timing=9 STR_VAR resource= ~SPWI407~ END
LPF ADD_SPELL_EFFECT INT_VAR opcode=171 target=1 timing=9 STR_VAR resource= ~SPWI504~ END
END
//Invoker EE
ACTION_IF (GAME_IS ~iwdee~ OR FILE_EXISTS_IN_GAME ~enginest.2da~) THEN BEGIN //iwdee 1.4+, Engine v2.0+
//+20% Damage Bonus
COPY ~TomeAndBlood/data/specialists/d5_pyroe.spl~ ~override/d5_invo1.spl~
APPEND ~CLABMA07.2da~ ~DMGBONUS AP_D5_INVO1~
//Description Update
ACTION_GET_STRREF str_invoker invoker
OUTER_SPRINT old @113
OUTER_SPRINT new @114
OUTER_PATCH_SAVE invoker ~%invoker%~ BEGIN
REPLACE_TEXTUALLY ~%old%~ ~%new%~
END
STRING_SET_EVALUATE str_invoker ~%invoker%~
END
//Illusioninst non-EE
ACTION_IF ENGINE_IS ~tob~ THEN BEGIN //shadow step if not EEs
COPY ~TomeAndBlood/data/specialists/spsd02.spl~ ~override~
SAY NAME1 @6049
SAY UNIDENTIFIED_DESC @6050
COPY ~TomeAndBlood/data/specialists/spsd02b.bam~ ~override~
COPY ~TomeAndBlood/data/specialists/spsd02c.bam~ ~override~
END
//Ilusionist SR
/*
ACTION_IF FILE_EXISTS_IN_GAME ~dvsrv4here.mrk~ THEN BEGIN
COPY ~TomeAndBlood/data/specialists/d5_illus.spl~ ~override/d5_illu1.spl~
END
ELSE BEGIN
COPY ~TomeAndBlood/data/specialists/d5_illuv.spl~ ~override/d5_illu1.spl~
END
*/
COPY ~TomeAndBlood/data/specialists/d5_illus.spl~ ~override/d5_illu1.spl~
// SAY NAME1 @
// SAY UNIDENTIFIED_DESC @
//Necromancer "Rebuke Undead" ability
COPY ~TomeAndBlood/data/specialists/d5nctua.spl~ ~override~
SAY NAME1 @125
COPY ~TomeAndBlood/data/specialists/d5nctub.eff~ ~override~
COPY ~TomeAndBlood/data/specialists/d5nctub.spl~ ~override~
COPY ~TomeAndBlood/data/specialists/d5nctuc.spl~ ~override~
COPY ~TomeAndBlood/data/specialists/d5nctuc.eff~ ~override~
COPY ~TomeAndBlood/data/specialists/d5nctux.spl~ ~override~
SAY NAME1 @126
COPY ~TomeAndBlood/data/specialists/d5nctu.bam~ ~override~
COPY ~TomeAndBlood/data/specialists/d5nctux.bam~ ~override~
//Necromancer Undead Touch" abilities
COPY ~TomeAndBlood/data/specialists/d5nect1.spl~ ~override~
SAY NAME1 @6251
SAY IDENTIFIED_DESC @6252
COPY ~TomeAndBlood/data/specialists/d5nect2.spl~ ~override~
SAY NAME1 @6253
SAY IDENTIFIED_DESC @6254
COPY ~TomeAndBlood/data/specialists/d5nect3.spl~ ~override~
SAY NAME1 @6255
SAY IDENTIFIED_DESC @6256
COPY ~TomeAndBlood/data/specialists/d5nnct1.spl~ ~override~
SAY NAME1 @6257
SAY IDENTIFIED_DESC @6257
COPY ~TomeAndBlood/data/specialists/d5nnct2.spl~ ~override~
SAY NAME1 @6258
SAY IDENTIFIED_DESC @6258
COPY ~TomeAndBlood/data/specialists/d5nnct3.spl~ ~override~
SAY NAME1 @6259
SAY IDENTIFIED_DESC @6259
COPY ~TomeAndBlood/data/specialists/d5nect1.itm~ ~override~
SAY NAME1 @6251
SAY NAME2 @6251
SAY IDENTIFIED_DESC @6251
COPY ~TomeAndBlood/data/specialists/d5nect2.itm~ ~override~
SAY NAME1 @6253
SAY NAME2 @6253
SAY IDENTIFIED_DESC @6253
COPY ~TomeAndBlood/data/specialists/d5nect3.itm~ ~override~
SAY NAME1 @6255
SAY NAME2 @6255
SAY IDENTIFIED_DESC @6255
COPY ~TomeAndBlood/data/specialists/d5_nect3.bam~ ~override~
/*
APPEND ~hidespl.2da~ ~SPWI117 1 0 0~ //add chill touch to hidespl
APPEND ~hidespl.2da~ ~SPWI218 1 0 0~ //add ghoul touch to hidespl
APPEND ~hidespl.2da~ ~SPWI314 1 0 0~ //add vampiric touch to hidespl
// "_____ Touch" scrolls
ACTION_IF FILE_EXISTS_IN_GAME ~scrl82.itm~ BEGIN
COPY_EXISTING ~scrl82.itm~ ~override~
WRITE_BYTE 0x1e (THIS BOR 0b01000000)
WRITE_BYTE 0x29 (THIS BOR 0b10000000)
WRITE_BYTE 0x2d (THIS BOR 0b01101111)
WRITE_BYTE 0x2f (THIS BOR 0b11000000)
LPF ALTER_EFFECT INT_VAR silent = 1 match_opcode = 147 /*opcode = 171*/ STR_VAR resource = ~d5nect1~ END
BUT_ONLY
END
ACTION_IF FILE_EXISTS_IN_GAME ~scrl1c.itm~ BEGIN
COPY_EXISTING ~scrl1c.itm~ ~override~
WRITE_BYTE 0x1e (THIS BOR 0b01000000)
WRITE_BYTE 0x29 (THIS BOR 0b10000000)
WRITE_BYTE 0x2d (THIS BOR 0b01101111)
WRITE_BYTE 0x2f (THIS BOR 0b11000000)
LPF ALTER_EFFECT INT_VAR silent = 1 match_opcode = 147 /*opcode = 171*/ STR_VAR resource = ~d5nect2~ END
BUT_ONLY
END
ACTION_IF FILE_EXISTS_IN_GAME ~scrl1q.itm~ BEGIN
COPY_EXISTING ~scrl1q.itm~ ~override~
WRITE_BYTE 0x1e (THIS BOR 0b01000000)
WRITE_BYTE 0x29 (THIS BOR 0b10000000)
WRITE_BYTE 0x2d (THIS BOR 0b01101111)
WRITE_BYTE 0x2f (THIS BOR 0b11000000)
LPF ALTER_EFFECT INT_VAR silent = 1 match_opcode = 147 /*opcode = 171*/ STR_VAR resource = ~d5nect3~ END
BUT_ONLY
END
// get '_____ Touch' abilities from scrolls
COPY_EXISTING ~clabma03.2da~ ~override~
REPLACE_TEXTUALLY ~GA_D5NECT1~ ~**** ~
REPLACE_TEXTUALLY ~GA_D5NECT2~ ~**** ~
REPLACE_TEXTUALLY ~GA_D5NECT3~ ~**** ~
BUT_ONLY
*/
END // end define function
//____________________________________________________________________________________
/*
.
.
.
.
.
//Necromancer Character Creation Spells
COPY_EXISTING ~spwi110.spl~ ~override/QDNEC#1.spl~
ADD_SPELL ~override/QDNEC#1.spl~ 2 1 TNB_NECRO_CC_I
SAY NAME1 @116
SAY UNIDENTIFIED_DESC @115
WRITE_BYTE 0x25 7
WRITE_LONG 0x1e ("0x00006fc0") //blocked to: all except necromancers (and wildmages)
ADD_SPELL ~override/QDNEC#1.spl~ 2 2 TNB_NECRO_CC_II
SAY NAME1 @117
SAY UNIDENTIFIED_DESC @115
WRITE_LONG 0x34 2
WRITE_BYTE 0x25 7
WRITE_LONG 0x1e ("0x00006fc0") //blocked to: all except necromancers
ADD_SPELL ~override/QDNEC#1.spl~ 2 3 TNB_NECRO_CC_III
SAY NAME1 @118
SAY UNIDENTIFIED_DESC @115
WRITE_LONG 0x34 3
WRITE_BYTE 0x25 7
WRITE_LONG 0x1e ("0x00006fc0") //blocked to: all except necromancers
ADD_SPELL ~override/QDNEC#1.spl~ 2 4 TNB_NECRO_CC_IV
SAY NAME1 @119
SAY UNIDENTIFIED_DESC @115
WRITE_LONG 0x34 4
WRITE_BYTE 0x25 7
WRITE_LONG 0x1e ("0x00006fc0") //blocked to: all except necromancers
ADD_SPELL ~override/QDNEC#1.spl~ 2 5 TNB_NECRO_CC_V
SAY NAME1 @120
SAY UNIDENTIFIED_DESC @115
WRITE_LONG 0x34 5
WRITE_BYTE 0x25 7
WRITE_LONG 0x1e ("0x00006fc0") //blocked to: all except necromancers (and wildmages)
ADD_SPELL ~override/QDNEC#1.spl~ 2 6 TNB_NECRO_CC_VI
SAY NAME1 @121
SAY UNIDENTIFIED_DESC @115
WRITE_LONG 0x34 6
WRITE_BYTE 0x25 7
WRITE_LONG 0x1e ("0x00006fc0") //blocked to: all except necromancers
ADD_SPELL ~override/QDNEC#1.spl~ 2 7 TNB_NECRO_CC_VII
SAY NAME1 @122
SAY UNIDENTIFIED_DESC @115
WRITE_LONG 0x34 7
WRITE_BYTE 0x25 7
WRITE_LONG 0x1e ("0x00006fc0") //blocked to: all except necromancers
ADD_SPELL ~override/QDNEC#1.spl~ 2 8 TNB_NECRO_CC_VIII
SAY NAME1 @123
SAY UNIDENTIFIED_DESC @115
WRITE_LONG 0x34 8
WRITE_BYTE 0x25 7
WRITE_LONG 0x1e ("0x00006fc0") //blocked to: all except necromancers
ADD_SPELL ~override/QDNEC#1.spl~ 2 9 TNB_NECRO_CC_IX
SAY NAME1 @124
SAY UNIDENTIFIED_DESC @115
WRITE_LONG 0x34 9
WRITE_BYTE 0x25 7
WRITE_LONG 0x1e ("0x00006fc0") //blocked to: all except necromancers (and wildmages)
//Remove Char Creation spells from Necro/Wild Mage
//Create new spell to remove those 9 spells
COPY ~TomeAndBlood/data/specialists/QDNEC#.spl~ ~override~
ACTION_FOR_EACH necspl IN ~TNB_NECRO_CC_I~ ~TNB_NECRO_CC_II~ ~TNB_NECRO_CC_III~ ~TNB_NECRO_CC_IV~ ~TNB_NECRO_CC_V~ ~TNB_NECRO_CC_VI~ ~TNB_NECRO_CC_VII~ ~TNB_NECRO_CC_VIII~ ~TNB_NECRO_CC_IX~ BEGIN
LAF RES_NUM_OF_SPELL_NAME
STR_VAR spell_name = EVAL ~%necspl%~
RET spell_res
END
COPY_EXISTING ~QDNEC#.spl~ ~override~
LPF ADD_SPELL_EFFECT INT_VAR opcode=172 target=1 timing=9 STR_VAR resource= EVAL ~%spell_res%~ END
END
//also fixes wild mage, not destructively
APPEND ~CLABMA01.2da~ ~SPEC_FIX AP_QDNEC#~
.
.
.
.
.
*/
//____________________________________________________________________________________
//____________________________________________________________________________________
DEFINE_ACTION_FUNCTION multiclass_specialists_complex BEGIN
// This component uses code by Subtledoctor; all such code is used with permission of the original author.
/*
ACTION_FOR_EACH race IN ~D~ ~E~ ~G~ ~H~ ~HE~ ~HL~ ~HO~ BEGIN
ACTION_IF !(FILE_EXISTS ~override/K_M_%race%.2da~) BEGIN
COPY_EXISTING ~K_M_%race%.2da~ ~override~
END
END
*/
OUTER_SPRINT fighter_lower_prefix @95001
OUTER_SPRINT cleric_lower_prefix @95002
OUTER_SPRINT thief_lower_prefix @95003
OUTER_SPRINT fighter_mixed_prefix @95006
OUTER_SPRINT cleric_mixed_prefix @95007
OUTER_SPRINT thief_mixed_prefix @95008
COPY_EXISTING ~weapprof.2da~ ~override~
COUNT_2DA_COLS weapprof_cols
READ_2DA_ENTRIES_NOW r2en_weapprof weapprof_cols
READ_2DA_ENTRY_FORMER ~r2en_weapprof~ 8 12 fm_bastardsword
READ_2DA_ENTRY_FORMER ~r2en_weapprof~ 9 12 fm_longsword
READ_2DA_ENTRY_FORMER ~r2en_weapprof~ 10 12 fm_shortsword
READ_2DA_ENTRY_FORMER ~r2en_weapprof~ 11 12 fm_axe
READ_2DA_ENTRY_FORMER ~r2en_weapprof~ 12 12 fm_2handsword
READ_2DA_ENTRY_FORMER ~r2en_weapprof~ 13 12 fm_katana
READ_2DA_ENTRY_FORMER ~r2en_weapprof~ 14 12 fm_scimitar
READ_2DA_ENTRY_FORMER ~r2en_weapprof~ 15 12 fm_dagger
READ_2DA_ENTRY_FORMER ~r2en_weapprof~ 16 12 fm_hammer
READ_2DA_ENTRY_FORMER ~r2en_weapprof~ 17 12 fm_club
READ_2DA_ENTRY_FORMER ~r2en_weapprof~ 18 12 fm_spear
READ_2DA_ENTRY_FORMER ~r2en_weapprof~ 19 12 fm_halberd
READ_2DA_ENTRY_FORMER ~r2en_weapprof~ 20 12 fm_flail
READ_2DA_ENTRY_FORMER ~r2en_weapprof~ 21 12 fm_mace
READ_2DA_ENTRY_FORMER ~r2en_weapprof~ 22 12 fm_staff
READ_2DA_ENTRY_FORMER ~r2en_weapprof~ 23 12 fm_xbow
READ_2DA_ENTRY_FORMER ~r2en_weapprof~ 24 12 fm_longbow
READ_2DA_ENTRY_FORMER ~r2en_weapprof~ 25 12 fm_shortbow
READ_2DA_ENTRY_FORMER ~r2en_weapprof~ 26 12 fm_dart
READ_2DA_ENTRY_FORMER ~r2en_weapprof~ 27 12 fm_sling
READ_2DA_ENTRY_FORMER ~r2en_weapprof~ 28 12 fm_2handed
READ_2DA_ENTRY_FORMER ~r2en_weapprof~ 29 12 fm_swordandshield
READ_2DA_ENTRY_FORMER ~r2en_weapprof~ 30 12 fm_singleweapon
READ_2DA_ENTRY_FORMER ~r2en_weapprof~ 31 12 fm_2weapon
READ_2DA_ENTRY_FORMER ~r2en_weapprof~ 8 17 cm_bastardsword
READ_2DA_ENTRY_FORMER ~r2en_weapprof~ 9 17 cm_longsword
READ_2DA_ENTRY_FORMER ~r2en_weapprof~ 10 17 cm_shortsword
READ_2DA_ENTRY_FORMER ~r2en_weapprof~ 11 17 cm_axe
READ_2DA_ENTRY_FORMER ~r2en_weapprof~ 12 17 cm_2handsword
READ_2DA_ENTRY_FORMER ~r2en_weapprof~ 13 17 cm_katana
READ_2DA_ENTRY_FORMER ~r2en_weapprof~ 14 17 cm_scimitar
READ_2DA_ENTRY_FORMER ~r2en_weapprof~ 15 17 cm_dagger
READ_2DA_ENTRY_FORMER ~r2en_weapprof~ 16 17 cm_hammer
READ_2DA_ENTRY_FORMER ~r2en_weapprof~ 17 17 cm_club
READ_2DA_ENTRY_FORMER ~r2en_weapprof~ 18 17 cm_spear
READ_2DA_ENTRY_FORMER ~r2en_weapprof~ 19 17 cm_halberd
READ_2DA_ENTRY_FORMER ~r2en_weapprof~ 20 17 cm_flail
READ_2DA_ENTRY_FORMER ~r2en_weapprof~ 21 17 cm_mace
READ_2DA_ENTRY_FORMER ~r2en_weapprof~ 22 17 cm_staff
READ_2DA_ENTRY_FORMER ~r2en_weapprof~ 23 17 cm_xbow
READ_2DA_ENTRY_FORMER ~r2en_weapprof~ 24 17 cm_longbow
READ_2DA_ENTRY_FORMER ~r2en_weapprof~ 25 17 cm_shortbow
READ_2DA_ENTRY_FORMER ~r2en_weapprof~ 26 17 cm_dart
READ_2DA_ENTRY_FORMER ~r2en_weapprof~ 27 17 cm_sling
READ_2DA_ENTRY_FORMER ~r2en_weapprof~ 28 17 cm_2handed
READ_2DA_ENTRY_FORMER ~r2en_weapprof~ 29 17 cm_swordandshield
READ_2DA_ENTRY_FORMER ~r2en_weapprof~ 30 17 cm_singleweapon
READ_2DA_ENTRY_FORMER ~r2en_weapprof~ 31 17 cm_2weapon
READ_2DA_ENTRY_FORMER ~r2en_weapprof~ 8 16 mt_bastardsword
READ_2DA_ENTRY_FORMER ~r2en_weapprof~ 9 16 mt_longsword
READ_2DA_ENTRY_FORMER ~r2en_weapprof~ 10 16 mt_shortsword
READ_2DA_ENTRY_FORMER ~r2en_weapprof~ 11 16 mt_axe
READ_2DA_ENTRY_FORMER ~r2en_weapprof~ 12 16 mt_2handsword
READ_2DA_ENTRY_FORMER ~r2en_weapprof~ 13 16 mt_katana
READ_2DA_ENTRY_FORMER ~r2en_weapprof~ 14 16 mt_scimitar
READ_2DA_ENTRY_FORMER ~r2en_weapprof~ 15 16 mt_dagger
READ_2DA_ENTRY_FORMER ~r2en_weapprof~ 16 16 mt_hammer
READ_2DA_ENTRY_FORMER ~r2en_weapprof~ 17 16 mt_club
READ_2DA_ENTRY_FORMER ~r2en_weapprof~ 18 16 mt_spear
READ_2DA_ENTRY_FORMER ~r2en_weapprof~ 19 16 mt_halberd
READ_2DA_ENTRY_FORMER ~r2en_weapprof~ 20 16 mt_flail
READ_2DA_ENTRY_FORMER ~r2en_weapprof~ 21 16 mt_mace
READ_2DA_ENTRY_FORMER ~r2en_weapprof~ 22 16 mt_staff
READ_2DA_ENTRY_FORMER ~r2en_weapprof~ 23 16 mt_xbow
READ_2DA_ENTRY_FORMER ~r2en_weapprof~ 24 16 mt_longbow
READ_2DA_ENTRY_FORMER ~r2en_weapprof~ 25 16 mt_shortbow
READ_2DA_ENTRY_FORMER ~r2en_weapprof~ 26 16 mt_dart
READ_2DA_ENTRY_FORMER ~r2en_weapprof~ 27 16 mt_sling
READ_2DA_ENTRY_FORMER ~r2en_weapprof~ 28 16 mt_2handed
READ_2DA_ENTRY_FORMER ~r2en_weapprof~ 29 16 mt_swordandshield
READ_2DA_ENTRY_FORMER ~r2en_weapprof~ 30 16 mt_singleweapon
READ_2DA_ENTRY_FORMER ~r2en_weapprof~ 31 16 mt_2weapon
BUT_ONLY
OUTER_SPRINT fm_weapprof ~0 0 0 0 0 0 0 0 %fm_bastardsword% %fm_longsword% %fm_shortsword% %fm_axe% %fm_2handsword% %fm_katana% %fm_scimitar% %fm_dagger% %fm_hammer% %fm_club% %fm_spear% %fm_halberd% %fm_flail% %fm_mace% %fm_staff% %fm_xbow% %fm_longbow% %fm_shortbow% %fm_dart% %fm_sling% %fm_2handed% %fm_swordandshield% %fm_singleweapon% %fm_2weapon% 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0~
OUTER_SPRINT cm_weapprof ~0 0 0 0 0 0 0 0 %cm_bastardsword% %cm_longsword% %cm_shortsword% %cm_axe% %cm_2handsword% %cm_katana% %cm_scimitar% %cm_dagger% %cm_hammer% %cm_club% %cm_spear% %cm_halberd% %cm_flail% %cm_mace% %cm_staff% %cm_xbow% %cm_longbow% %cm_shortbow% %cm_dart% %cm_sling% %cm_2handed% %cm_swordandshield% %cm_singleweapon% %cm_2weapon% 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0~
OUTER_SPRINT mt_weapprof ~0 0 0 0 0 0 0 0 %mt_bastardsword% %mt_longsword% %mt_shortsword% %mt_axe% %mt_2handsword% %mt_katana% %mt_scimitar% %mt_dagger% %mt_hammer% %mt_club% %mt_spear% %mt_halberd% %mt_flail% %mt_mace% %mt_staff% %mt_xbow% %mt_longbow% %mt_shortbow% %mt_dart% %mt_sling% %mt_2handed% %mt_swordandshield% %mt_singleweapon% %mt_2weapon% 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0~
//____________________________________________________________________________________
// ABJURER
/*
LAF GET_KIT_EX STR_VAR kit_name = ~ABJURER~
RET alignmnt
luabbr
abclasrq
clsrcreq
stweap
bdstweap
unusable
kittable
END
*/
COPY_EXISTING ~kitlist.2da~ ~override~
COUNT_2DA_COLS kitlist_cols
READ_2DA_ENTRIES_NOW r2en_kitlist kitlist_cols
FOR (row = 1; row < r2en_kitlist; ++row) BEGIN
READ_2DA_ENTRY_FORMER r2en_kitlist row 1 kit_name
PATCH_IF (~%kit_name%~ STRING_EQUAL_CASE ~ABJURER~) BEGIN
READ_2DA_ENTRY_FORMER r2en_kitlist row 2 lower
READ_2DA_ENTRY_FORMER r2en_kitlist row 3 mixed
READ_2DA_ENTRY_FORMER r2en_kitlist row 4 help
READ_2DA_ENTRY_FORMER r2en_kitlist row 7 usable
END
END
BUT_ONLY
ACTION_GET_STRREF %lower% abjurer_lower_string
OUTER_SPRINT fm_lower_string ~%fighter_lower_prefix%/%abjurer_lower_string%~
OUTER_SPRINT cm_lower_string ~%cleric_lower_prefix%/%abjurer_lower_string%~
OUTER_SPRINT mt_lower_string ~%thief_lower_prefix%/%abjurer_lower_string%~
OUTER_SET new_fm_lower = RESOLVE_STR_REF (~%fm_lower_string%~)
OUTER_SET new_cm_lower = RESOLVE_STR_REF (~%cm_lower_string%~)
OUTER_SET new_mt_lower = RESOLVE_STR_REF (~%mt_lower_string%~)
ACTION_GET_STRREF %mixed% abjurer_mixed_string