/
major_spell_tweaks.tpa
executable file
·915 lines (820 loc) · 39.9 KB
/
major_spell_tweaks.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
// -----------------------------
// SPELL TWEAKS: ILLUSIONARY CLONES
// -----------------------------
// This component uses code by Subtledoctor and is used with permission of the original author.
DEFINE_ACTION_FUNCTION illusion_clone_tweaks BEGIN
//updated illusionary clone spells___________________________________________________
//
//...add statchecks
//
APPEND ~splprot.2da~ ~D5_109_BIT=n%TAB%109%TAB%-1%TAB%8~ UNLESS ~D5_109_BIT=n~
COPY_EXISTING ~splprot.2da~ ~override~
COUNT_2DA_COLS cols
READ_2DA_ENTRIES_NOW rows cols
FOR (row = 1; row < rows; ++row) BEGIN
READ_2DA_ENTRY_FORMER rows row 0 ~stat~
PATCH_IF (~%stat%~ STRING_EQUAL_CASE ~D5_109_BIT=n~) BEGIN
SET 109_bit_equal = %row%
END
END
BUT_ONLY
/*
LAF d5_resolve_state STR_VAR new_state_id = ~D5_MISLEAD~ RET new_state_ind END
OUTER_SET mislead_clone_state = %new_state_ind%
LAF d5_resolve_state STR_VAR new_state_id = ~D5_L_SIMULACRUM~ RET new_state_ind END
OUTER_SET lesser_simulacrum_state = %new_state_ind%
//LAF d5_resolve_state STR_VAR new_state_id = ~D5_SIMULACRUM~ RET new_state_ind END
//OUTER_SET simulacrum_state = %new_state_ind%
*/
ACTION_IF FILE_EXISTS_IN_GAME ~spwi804.spl~ BEGIN
//...apply penalties to simulacra
//
COPY ~%MOD_FOLDER%/data/spell_tweaks/simulacr.spl~ ~override~
LPF ADD_SPELL_EFFECT INT_VAR opcode = 337 target = 1 parameter1 = ~-1~ parameter2 = 237 END
LPF ADD_SPELL_EFFECT INT_VAR opcode = 144 target = 1 parameter2 = 9 timing = 1 END // no item use
LPF ADD_SPELL_EFFECT INT_VAR opcode = 144 target = 1 parameter2 = 11 timing = 1 END // no item use
LPF ADD_SPELL_EFFECT INT_VAR opcode = 144 target = 1 parameter2 = 12 timing = 1 END // no item use
LPF ADD_SPELL_EFFECT INT_VAR opcode = 206 target = 1 parameter1 = (0 - 1) timing = 1 STR_VAR resource = ~d5si804~ END
LPF ADD_SPELL_EFFECT INT_VAR opcode = 206 target = 1 parameter1 = (0 - 1) timing = 1 STR_VAR resource = ~d5si8049~ END
LPF ADD_SPELL_EFFECT INT_VAR target = 1 opcode = 326 parameter1 = (2 << 8) parameter2 = %109_bit_equal% timing = 1 STR_VAR resource = ~d5simul6~ END
// LPF ADD_SPELL_EFFECT INT_VAR opcode = 326 target = 1 parameter1 = %mislead_clone_state% parameter2 = 110 timing = 1 STR_VAR resource = ~d5simul6~ END // and make d5simul6 318 immune if stat = 3
LPF ADD_SPELL_EFFECT INT_VAR target = 1 opcode = 326 parameter1 = (4 << 8) parameter2 = %109_bit_equal% timing = 1 STR_VAR resource = ~d5simul7~ END
// LPF ADD_SPELL_EFFECT INT_VAR opcode = 326 target = 1 parameter1 = %lesser_simulacrum_state% parameter2 = 110 timing = 1 STR_VAR resource = ~d5simul7~ END // and make d5simul7 318 immune if stat = 3
// LPF ADD_SPELL_EFFECT INT_VAR target = 1 opcode = 326 parameter1 = (1 << 8) parameter2 = %109_bit_equal% timing = 1 STR_VAR resource = ~d5simul8~ END
// LPF ADD_SPELL_EFFECT INT_VAR opcode = 326 target = 1 parameter1 = %simulacrum_state% parameter2 = 110 timing = 1 STR_VAR resource = ~d5simul8~ END
LPF ADD_SPELL_EFFECT INT_VAR opcode = 146 target = 1 parameter2 = 1 timing = 1 STR_VAR resource = ~d5simul8~ END
LPF ADD_SPELL_EFFECT INT_VAR target = 2 opcode = 326 parameter1 = (8 << 8) parameter2 = %109_bit_equal% timing = 1 STR_VAR resource = ~d5simul9~ END
// LPF ADD_SPELL_EFFECT INT_VAR opcode = 326 target = 1 parameter1 = %projected_simulacrum_state% parameter2 = 110 timing = 1 STR_VAR resource = ~d5simul8~ END
// LPF ADD_SPELL_EFFECT INT_VAR opcode = 72 target = 2 parameter1 = 4 parameter2 = 0 timing = 1 END
// LPF ADD_SPELL_EFFECT INT_VAR opcode = 241 target = 2 parameter1 = 0 parameter2 = 1002 duration = 1 END
//...custom simulacrum summon
//
COPY ~%MOD_FOLDER%/data/spell_tweaks/d5si804.spl~ ~override~
SAY NAME1 ~ ~
SAY UNIDENTIFIED_DESC ~ ~
LPF ALTER_EFFECT INT_VAR silent = 1 power = 0 /*resist_dispel = 1*/ END
//...5th level: shadow clone
//
/*
COPY_EXISTING ~spwi607.spl~ ~override~
READ_LONG 0x08 mislead_name
READ_LONG 0x50 mislead_desc
BUT_ONLY
*/
COPY ~%MOD_FOLDER%/data/spell_tweaks/spwi607.spl~ ~override/spwi505.spl~
SAY NAME1 @6279
SAY UNIDENTIFIED_DESC @6280
/*
WRITE_LONG 0x08 %mislead_name%
WRITE_LONG 0x50 %mislead_desc%
*/
WRITE_LONG 0x34 5
WRITE_ASCII 0x3a ~spwi505c~ #8
LPF ALTER_SPELL_HEADER INT_VAR speed = 5 STR_VAR icon = ~spwi505b~ END
COPY ~%MOD_FOLDER%/data/spell_tweaks/d5si505a.spl~ ~override~
COPY ~%MOD_FOLDER%/data/spell_tweaks/d5si505a.eff~ ~override~
COPY ~%MOD_FOLDER%/data/spell_tweaks/d5si505b.spl~ ~override~
COPY ~%MOD_FOLDER%/data/spell_tweaks/mislead.spl~ ~override~
LPF ADD_SPELL_EFFECT INT_VAR opcode = 53 target = 1 parameter1 = 25605 parameter2 = 2 timing = 1 END
LPF ADD_SPELL_EFFECT INT_VAR opcode = 72 target = 2 parameter1 = 7 parameter2 = 5 timing = 1 END
//...6th level: mislead (imp. invisibility not super invisibility, and clone has 50% hp)
//
COPY_EXISTING ~spwi804.spl~ ~override/spwi607.spl~
SAY NAME1 @6271
SAY UNIDENTIFIED_DESC @6272
WRITE_LONG 0x34 6
LPF DELETE_EFFECT END
LPF ADD_SPELL_EFFECT INT_VAR target = 1 opcode = 233 parameter1 = (2 << 8) parameter2 = (109 + (0x10000 * 1)) timing = 9 END
// LPF ADD_SPELL_EFFECT INT_VAR opcode = 328 target = 1 parameter1 = 0 parameter2 = %mislead_clone_state% timing = 9 special = 1 END
LPF ADD_SPELL_EFFECT INT_VAR opcode = 146 target = 1 parameter2 = 1 timing = 1 duration = 0 STR_VAR resource = ~d5si804~ END
LPF ADD_SPELL_EFFECT INT_VAR opcode = 321 target = 1 timing = 4 duration = 2 STR_VAR resource = ~spwi607~ END
WRITE_ASCII 0x3a ~spwi607c~ #8
LPF ALTER_SPELL_HEADER INT_VAR speed = 5 STR_VAR icon = ~spwi607b~ END
ACTION_IF FILE_EXISTS_IN_GAME ~scrl7k.itm~ BEGIN
COPY_EXISTING ~scrl7k.itm~ ~override~
SAY NAME2 @6271
SAY IDENTIFIED_DESC @6272
WRITE_ASCII 0x3a ~spwi703a~ #8
LPF ALTER_ITEM_HEADER STR_VAR icon = ~spwi703a~ END
END
//...7th level: lesser simulacrum
COPY_EXISTING ~spwi804.spl~ ~override/spwi703.spl~
SAY NAME1 @6273
SAY UNIDENTIFIED_DESC @6274
WRITE_LONG 0x34 7
LPF DELETE_EFFECT END
LPF ADD_SPELL_EFFECT INT_VAR target = 1 opcode = 233 parameter1 = (4 << 8) parameter2 = (109 + (0x10000 * 1)) timing = 9 END
// LPF ADD_SPELL_EFFECT INT_VAR opcode = 328 target = 1 parameter1 = 0 parameter2 = %lesser_simulacrum_state% timing = 9 special = 1 END
LPF ADD_SPELL_EFFECT INT_VAR opcode = 146 target = 1 parameter2 = 1 timing = 1 duration = 0 STR_VAR resource = ~d5si804~ END
LPF ADD_SPELL_EFFECT INT_VAR opcode = 146 target = 1 parameter2 = 1 timing = 1 STR_VAR resource = ~spwi206~ END
LPF ADD_SPELL_EFFECT INT_VAR opcode = 321 target = 1 timing = 4 duration = 2 STR_VAR resource = ~spwi703~ END
WRITE_ASCII 0x3a ~spwi703c~ #8
LPF ALTER_SPELL_HEADER INT_VAR speed = 2 STR_VAR icon = ~spwi703b~ END
ACTION_IF FILE_EXISTS_IN_GAME ~scrl8f.itm~ BEGIN
COPY_EXISTING ~scrl8f.itm~ ~override~
SAY NAME2 @6273
SAY IDENTIFIED_DESC @6274
WRITE_ASCII 0x3a ~spwi607a~ #8
LPF ALTER_ITEM_HEADER STR_VAR icon = ~spwi607a~ END
END
//...9th level: projected simulacrum
//
COPY_EXISTING ~d5si804.spl~ ~override/d5si8049.spl~
LPF ALTER_SPELL_HEADER INT_VAR target = 1 END
LPF ALTER_EFFECT INT_VAR silent = 1 target = 2 power = 0 /*resist_dispel = 1*/ END
LPF DELETE_EFFECT INT_VAR match_opcode = 233 END
LPF DELETE_EFFECT INT_VAR match_opcode = 206 END
LPF ADD_SPELL_EFFECT INT_VAR opcode = 321 target = 2 timing = 4 duration = 2 /*resist_dispel = 1*/ STR_VAR resource = ~d5si8049~ END
LPF ADD_SPELL_EFFECT INT_VAR insert_point = 0 target = 2 opcode = 233 parameter1 = (8 << 8) parameter2 = (109 + (0x10000 * 1)) timing = 9 /*resist_dispel = 1*/ END
COPY_EXISTING ~spwi804.spl~ ~override/d5si9il.spl~
SAY NAME1 @6277
SAY UNIDENTIFIED_DESC @6278
WRITE_LONG 0x34 9
WRITE_ASCII 0x3a ~d5projic~ #8
LPF ALTER_SPELL_HEADER INT_VAR speed = 5 target = 1 range = 40 STR_VAR icon = ~d5projib~ END
LPF DELETE_EFFECT END
LPF ADD_SPELL_EFFECT INT_VAR opcode = 146 target = 2 parameter2 = 1 timing = 1 duration = 0 STR_VAR resource = ~d5si8049~ resist_dispel = 1 END
COPY ~%MOD_FOLDER%/data/spell_tweaks/d5projic.bam~ ~override~
COPY ~%MOD_FOLDER%/data/spell_tweaks/d5projib.bam~ ~override~
/*
ADD_SPELL ~override/d5si9il.spl~ 2 9 D5_WIZARD_CLONE_OTHER
LAF RES_NUM_OF_SPELL_NAME
STR_VAR spell_name = ~D5_WIZARD_CLONE_OTHER~
RET spell_res
END
COPY_EXISTING ~%spell_res%.spl~ ~override~
LPF ALTER_EFFECT INT_VAR silent = 1 match_opcode = 321 STR_VAR match_resource = ~d5si9il~ resource = EVAL ~%spell_res%~ END
ACTION_IF (FILE_EXISTS_IN_GAME ~hidespl.2da~) AND (GAME_IS ~iwdee~) BEGIN
APPEND ~hidespl.2da~ ~%spell_res% 1 0~
END
ACTION_IF (FILE_EXISTS_IN_GAME ~hidespl.2da~) AND !(GAME_IS ~iwdee~) BEGIN
APPEND ~hidespl.2da~ ~%spell_res% 1 0 0~
END
ACTION_IF (FILE_EXISTS_IN_GAME ~clabma08.2da~) BEGIN // illusionist kit table
APPEND ~clabma08.2da~ ~PROJ_CLONE **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** GA_%spell_res% **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ~
END
*/
ACTION_IF (FILE_EXISTS_IN_GAME ~clabma08.2da~) BEGIN // illusionist kit table
APPEND ~clabma08.2da~ ~PROJ_CLONE **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** GA_D5SI9IL **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ~
END
COPY ~%MOD_FOLDER%/lib/d5_base.spl~ ~override/d5simul9.spl~
LPF ADD_SPELL_EFFECT INT_VAR opcode = 72 target = 2 parameter1 = 4 parameter2 = 0 timing = 1 END
LPF ADD_SPELL_EFFECT INT_VAR opcode = 241 target = 2 parameter1 = 0 parameter2 = 1002 duration = 1 END
//...8th level: simulacrum
//
COPY_EXISTING ~spwi804.spl~ ~override~
SAY NAME1 @6275
SAY UNIDENTIFIED_DESC @6276
LPF DELETE_EFFECT END
// LPF ADD_SPELL_EFFECT INT_VAR target = 1 opcode = 233 parameter1 = (1 << 8) parameter2 = (109 + (0x10000 * 1)) timing = 9 END
// LPF ADD_SPELL_EFFECT INT_VAR opcode = 328 target = 1 parameter1 = 0 parameter2 = %simulacrum_state% timing = 9 special = 1 END
LPF ADD_SPELL_EFFECT INT_VAR opcode = 146 target = 1 parameter2 = 1 timing = 1 duration = 0 STR_VAR resource = ~d5si804~ END
LPF ADD_SPELL_EFFECT INT_VAR opcode = 146 target = 1 parameter2 = 1 timing = 1 STR_VAR resource = ~spwi405~ END
LPF ADD_SPELL_EFFECT INT_VAR opcode = 321 target = 1 timing = 4 duration = 2 STR_VAR resource = ~spwi804~ END
LPF ALTER_SPELL_HEADER INT_VAR speed = 5 END
ACTION_IF FILE_EXISTS_IN_GAME ~scrl8z.itm~ BEGIN
COPY_EXISTING ~scrl8z.itm~ ~override~
SAY NAME2 @6275
SAY IDENTIFIED_DESC @6276
END
//...apply penalties to simulacra, part 2
//
OUTER_SET spell_ind = 0
COPY_EXISTING_REGEXP GLOB ~^.+\.spl$~ ~override~
READ_SHORT 0x1c spell_type
PATCH_IF (spell_type < 3) BEGIN
READ_LONG 0x34 spell_level
PATCH_IF (spell_level > 1) AND (spell_level < 5) BEGIN
SET spell_ind = (%spell_ind% + 1)
TEXT_SPRINT $d5_no_lowspells(~%spell_ind%~) ~%SOURCE_RES%~
END
PATCH_IF (spell_level > 4) AND (spell_level < 8) BEGIN
SET spell_ind = (%spell_ind% + 1)
TEXT_SPRINT $d5_no_midspells(~%spell_ind%~) ~%SOURCE_RES%~
END
PATCH_IF (spell_level > 8) BEGIN
SET spell_ind = (%spell_ind% + 1)
TEXT_SPRINT $d5_no_highspells(~%spell_ind%~) ~%SOURCE_RES%~
END
END
BUT_ONLY
COPY ~%MOD_FOLDER%/data/core/d5_base.spl~ ~override/d5simul6.spl~
LPF ADD_SPELL_EFFECT INT_VAR opcode = 278 target = 1 parameter1 = (0 - 7) parameter2 = 0 timing = 9 END // -7 thac0
LPF ADD_SPELL_EFFECT INT_VAR opcode = 191 target = 1 parameter1 = (0 - 7) parameter2 = 0 timing = 9 END // -7 arcane caster level
LPF ADD_SPELL_EFFECT INT_VAR opcode = 18 target = 1 parameter1 = 40 parameter2 = 2 timing = 9 END // -60% hp
LPF ADD_SPELL_EFFECT INT_VAR opcode = 145 target = 1 parameter2 = 1 timing = 1 END // no divine spellcasting
PHP_EACH d5_no_lowspells AS ind => spell BEGIN
LPF ADD_SPELL_EFFECT INT_VAR opcode = 172 target = 1 timing = 9 STR_VAR resource = EVAL ~%spell%~ END // remove level 2-4 spells
END
PHP_EACH d5_no_midspells AS ind => spell BEGIN
LPF ADD_SPELL_EFFECT INT_VAR opcode = 172 target = 1 timing = 9 STR_VAR resource = EVAL ~%spell%~ END // remove level 5-7 spells
END
PHP_EACH d5_no_highspells AS ind => spell BEGIN
LPF ADD_SPELL_EFFECT INT_VAR opcode = 172 target = 1 timing = 9 STR_VAR resource = EVAL ~%spell%~ END // remove level 8+ spells
END
COPY ~%MOD_FOLDER%/data/core/d5_base.spl~ ~override/d5simul7.spl~
LPF ADD_SPELL_EFFECT INT_VAR opcode = 278 target = 1 parameter1 = (0 - 5) parameter2 = 0 timing = 9 END // -5 thac0
LPF ADD_SPELL_EFFECT INT_VAR opcode = 191 target = 1 parameter1 = (0 - 5) parameter2 = 0 timing = 9 END // -5 arcane caster level
LPF ADD_SPELL_EFFECT INT_VAR opcode = 18 target = 1 parameter1 = 60 parameter2 = 2 timing = 9 END // -40% hp
LPF ADD_SPELL_EFFECT INT_VAR opcode = 145 target = 1 parameter2 = 1 timing = 1 END // no divine spellcasting
PHP_EACH d5_no_midspells AS ind => spell BEGIN
LPF ADD_SPELL_EFFECT INT_VAR opcode = 172 target = 1 timing = 9 STR_VAR resource = EVAL ~%spell%~ END // remove level 5-7 spells
END
PHP_EACH d5_no_highspells AS ind => spell BEGIN
LPF ADD_SPELL_EFFECT INT_VAR opcode = 172 target = 1 timing = 9 STR_VAR resource = EVAL ~%spell%~ END // remove level 8+ spells
END
COPY ~%MOD_FOLDER%/data/core/d5_base.spl~ ~override/d5simul8.spl~
LPF ADD_SPELL_EFFECT INT_VAR opcode = 278 target = 1 parameter1 = (0 - 3) parameter2 = 0 timing = 9 END // -3 thac0
LPF ADD_SPELL_EFFECT INT_VAR opcode = 191 target = 1 parameter1 = (0 - 3) parameter2 = 0 timing = 9 END // -3 arcane caster level
LPF ADD_SPELL_EFFECT INT_VAR opcode = 18 target = 1 parameter1 = 75 parameter2 = 2 timing = 9 END // -25% hp
LPF ADD_SPELL_EFFECT INT_VAR opcode = 172 target = 1 timing = 9 STR_VAR resource = ~spwi505~ END
LPF ADD_SPELL_EFFECT INT_VAR opcode = 172 target = 1 timing = 9 STR_VAR resource = ~spwi607~ END
LPF ADD_SPELL_EFFECT INT_VAR opcode = 172 target = 1 timing = 9 STR_VAR resource = ~spwi703~ END
PHP_EACH d5_no_highspells AS ind => spell BEGIN
LPF ADD_SPELL_EFFECT INT_VAR opcode = 172 target = 1 timing = 9 STR_VAR resource = EVAL ~%spell%~ END // remove level 8+ spells
END
// LPF ADD_SPELL_EFFECT INT_VAR insert_point = 0 opcode = 318 target = 1 parameter1 = (3 << 24) parameter2 = %clone_stat% timing = 9 STR_VAR resource = ~d5simul8~ END
// LPF ADD_SPELL_EFFECT INT_VAR insert_point = 0 opcode = 318 target = 1 parameter1 = %mislead_clone_state% parameter2 = 110 timing = 9 STR_VAR resource = ~d5simul8~ END
// LPF ADD_SPELL_EFFECT INT_VAR insert_point = 0 opcode = 318 target = 1 parameter1 = %lesser_simulacrum_state% parameter2 = 110 timing = 9 STR_VAR resource = ~d5simul8~ END
LPF ADD_SPELL_EFFECT INT_VAR insert_point = 0 opcode = 318 target = 1 parameter1 = (2 << 8) parameter2 = %109_bit_equal% timing = 0 duration = 1 STR_VAR resource = ~d5simul8~ END
LPF ADD_SPELL_EFFECT INT_VAR insert_point = 0 opcode = 318 target = 1 parameter1 = (4 << 8) parameter2 = %109_bit_equal% timing = 0 duration = 1 STR_VAR resource = ~d5simul8~ END
END
CLEAR_ARRAYS
END // end define function
//____________________________________________________________________________________
////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
// -----------------------------
// SPELL TWEAKS: INVISIBILITY REVISIONS
// -----------------------------
// This component uses code by Subtledoctor and is used with permission of the original author.
// ***** change the way insanctibility works
// ...make a single subspell, and a single 232 .EFF
// ...cast the subspell from all invis spells on a 1-second delay
// ...make a single secondary spell cast by 232, with 172 effects for all spells in the system
DEFINE_ACTION_FUNCTION invisibility_tweaks BEGIN
//change to invisibility/detect invisible___________________________________________
//
INCLUDE ~%MOD_FOLDER%/lib/d5_insanctibility.tpa~
ACTION_IF NOT FILE_EXISTS_IN_GAME ~d5__insanctibility.d5~ BEGIN
LAM D5_INSANCTIBILITY
END
ACTION_IF !(FILE_EXISTS_IN_GAME ~dvsrv4here.mrk~) BEGIN // no need to patch 203 if SR installed
COPY_EXISTING ~spwi203.spl~ ~override~
LPF CLONE_EFFECT INT_VAR silent = 1 match_opcode = 116 opcode = 193 target = 1 STR_VAR resource = ~~ END
// PATCH_FOR_EACH second IN ~6~ ~12~ ~18~ ~24~ ~30~ BEGIN // do this more often
PATCH_FOR_EACH second IN ~2~ ~4~ ~6~ ~8~ ~10~ ~12~ ~14~ ~16~ ~18~ ~20~ ~22~ ~24~ ~26~ ~28~ ~30~ BEGIN
LPF CLONE_EFFECT INT_VAR silent = 1 multi_match = 1 match_opcode = 116 opcode = 136 timing = 4 duration = %second% END
END
LPF ALTER_EFFECT INT_VAR silent = 1 match_opcode = 116 opcode = 136 duration = 1 END
ACTION_FOR_EACH invisisword IN ~sw1h32.itm~ ~sw1h34.itm~ BEGIN
ACTION_IF FILE_EXISTS_IN_GAME ~%invisisword%.itm~ BEGIN
COPY_EXISTING ~%invisisword%.itm~ ~override~
LPF CLONE_EFFECT INT_VAR silent = 1 match_opcode = 116 opcode = 193 target = 1 STR_VAR resource = ~~ END
LPF ALTER_EFFECT INT_VAR silent = 1 match_opcode = 116 opcode = 136 duration = 1 END
BUT_ONLY
END
END
END
ACTION_IF (FILE_EXISTS_IN_GAME ~dvsrv4here.mrk~) BEGIN // no need to patch 203 if SR installed
COPY_EXISTING ~spwi203.spl~ ~override~
LPF ALTER_EFFECT INT_VAR silent = 1 match_opcode = 174 match_duration = 30 duration = 60 END
LPF ALTER_EFFECT INT_VAR silent = 1 match_opcode = 193 match_duration = 30 duration = 60 END
PATCH_FOR_EACH dur IN ~6~ ~12~ ~18~ ~24~ ~30~ BEGIN
LPF CLONE_EFFECT INT_VAR silent = 1 multi_match = 1 match_opcode = 146 match_duration = %dur% duration = (%dur% - 3) STR_VAR match_resource = ~spwi203d~ END
END
PATCH_FOR_EACH new_dur IN ~33~ ~36~ ~39~ ~42~ ~45~ ~48~ ~51~ ~54~ ~57~ ~60~ BEGIN
LPF ADD_SPELL_EFFECT INT_VAR target = 2 opcode = 146 parameter1 = 1 parameter2 = 1 timing = 4 duration = %new_dur% STR_VAR resource = ~spwi203d~ END
END
READ_STRREF 0x54 ~description~
PATCH_IF (~%description%~ STRING_CONTAINS_REGEXP ~5 rounds~) = 0 BEGIN
INNER_PATCH_SAVE new_desc ~%description%~ BEGIN
// REPLACE_TEXTUALLY ~5 rounds~ ~10 rounds~
SPRINT old_duration @150003
SPRINT new_duration @150004
REPLACE_TEXTUALLY ~%old_duration%~ ~%new_duration%~
END
SAY_EVALUATED 0x54 ~%new_desc%~
END
IF_EXISTS BUT_ONLY
END
/*
COPY_EXISTING ~spwi224.spl~ ~override~
LPF ALTER_EFFECT INT_VAR silent = 1 match_opcode = 116 opcode = 136 duration = 1 END
*/
//__________________________________________________________________________________
//change Dispel Illusion to Invisibility Purge______________________________________
//
COPY_EXISTING ~sppr309.spl~ ~override~
READ_LONG 0x08 spell_name
READ_LONG 0x50 spell_desc
PATCH_FOR_EACH second IN ~6~ ~12~ ~18~ ~24~ ~30~ BEGIN // do this more often
LPF CLONE_EFFECT INT_VAR match_opcode = 146 match_duration = %second% duration = (%second% - 2) STR_VAR match_resource = ~sppr309d~ END
LPF CLONE_EFFECT INT_VAR match_opcode = 146 match_duration = %second% duration = (%second% - 4) STR_VAR match_resource = ~sppr309d~ END
END
LPF ADD_SPELL_EFFECT INT_VAR opcode = 101 target = 2 power = 3 parameter2 = 20 timing = 0 duration = 30 END
IF_EXISTS
COPY_EXISTING ~sppr309.spl~ ~override/spwi322.spl~
WRITE_SHORT 0x1c 1
WRITE_SHORT 0x22 16
WRITE_BYTE 0x25 3
WRITE_BYTE 0x27 5
WRITE_LONG 0x34 3
WRITE_BYTE 0x1e (THIS BOR 0b10000000)
IF_EXISTS
COPY_EXISTING ~scrl6k.itm~ ~override~
WRITE_LONG 0x0c %spell_name%
WRITE_LONG 0x54 %spell_desc%
WRITE_ASCII 0x3a ~sppr309a~ #8
IF_EXISTS BUT_ONLY
//__________________________________________________________________________________
//faerie fire/glitterdust counter RI/MI/Blur________________________________________
//
ACTION_IF FILE_EXISTS_IN_GAME ~dvsrv4here.mrk~ BEGIN // Spell Revisions
COPY_EXISTING ~sppr114.spl~ ~override~
LPF ALTER_EFFECT INT_VAR silent = 1 match_opcode = 47 opcode = 221 parameter1 = 3 parameter2 = 3 timing = 1 savingthrow = 1 END
IF_EXISTS BUT_ONLY
END
ACTION_IF (FILE_CONTAINS_EVALUATED (~SPELL.IDS~ ~[ %TAB%]CLERIC_FAERIE_FIRE$~)) BEGIN // SoD
LAF RES_NUM_OF_SPELL_NAME STR_VAR spell_name = ~CLERIC_FAERIE_FIRE~ RET spell_res END
COPY_EXISTING ~%spell_res%.spl~ ~override~
LPF ADD_SPELL_EFFECT INT_VAR opcode = 221 target = 2 parameter1 = 3 parameter2 = 3 timing = 1 savingthrow = 1 END
IF_EXISTS BUT_ONLY
END
COPY_EXISTING ~spwi224.spl~ ~override~
LPF CLONE_EFFECT INT_VAR silent = 1 multi_match = 1 match_opcode = 116 opcode = 221 parameter1 = 3 parameter2 = 3 timing = 1 duration = 0 END
IF_EXISTS BUT_ONLY
//__________________________________________________________________________________
//oracle dispels illusionary creatures_______________________________________________
//
ACTION_IF !FILE_EXISTS_IN_GAME ~dvsrv4here.mrk~ BEGIN // not needed for Spell Revisions
COPY_EXISTING ~spwi515.spl~ ~override~
LPF ADD_SPELL_EFFECT INT_VAR target = 2 opcode = 177 parameter1 = 7 parameter2 = 7 timing = 1 STR_VAR resource = ~destself~ END
IF_EXISTS BUT_ONLY
END
//__________________________________________________________________________________
//true sight = illusionary creature immunity________________________________________
//
// plus a huge luck penalty aura to illusionary creatures
// plus deafness
// and/or caster level penalty?
COPY_EXISTING ~sppr505.spl~ ~override~
LPF CLONE_EFFECT INT_VAR silent = 1 multi_match = 1 match_opcode = 193 opcode = 100 parameter2 = 7 parameter1 = 7 END
IF_EXISTS BUT_ONLY
COPY_EXISTING ~spwi609.spl~ ~override~
LPF CLONE_EFFECT INT_VAR silent = 1 multi_match = 1 match_opcode = 193 opcode = 100 parameter2 = 7 parameter1 = 7 END
IF_EXISTS BUT_ONLY
COPY_EXISTING ~spcl232.spl~ ~override~
LPF CLONE_EFFECT INT_VAR silent = 1 multi_match = 1 match_opcode = 193 opcode = 100 parameter2 = 7 parameter1 = 7 END
IF_EXISTS BUT_ONLY
COPY_EXISTING ~spcl732.spl~ ~override~
LPF CLONE_EFFECT INT_VAR silent = 1 multi_match = 1 match_opcode = 193 opcode = 100 parameter2 = 7 parameter1 = 7 END
IF_EXISTS BUT_ONLY
COPY_EXISTING ~sppr505d.spl~ ~override~
LPF ADD_SPELL_EFFECT INT_VAR opcode = 177 target = 2 parameter1 = 7 parameter2 = 7 timing = 0 duration = 7 STR_VAR resource = ~d5tsill1~ END
LPF ADD_SPELL_EFFECT INT_VAR opcode = 177 target = 2 parameter1 = 7 parameter2 = 7 timing = 0 duration = 7 STR_VAR resource = ~d5tsill2~ END
IF_EXISTS BUT_ONLY
COPY_EXISTING ~spwi609d.spl~ ~override~
LPF ADD_SPELL_EFFECT INT_VAR opcode = 177 target = 2 parameter1 = 7 parameter2 = 7 timing = 0 duration = 7 STR_VAR resource = ~d5tsill1~ END
LPF ADD_SPELL_EFFECT INT_VAR opcode = 177 target = 2 parameter1 = 7 parameter2 = 7 timing = 0 duration = 7 STR_VAR resource = ~d5tsill2~ END
IF_EXISTS BUT_ONLY
COPY_EXISTING ~spcl232d.spl~ ~override~
LPF ADD_SPELL_EFFECT INT_VAR opcode = 177 target = 2 parameter1 = 7 parameter2 = 7 timing = 0 duration = 7 STR_VAR resource = ~d5tsill1~ END
LPF ADD_SPELL_EFFECT INT_VAR opcode = 177 target = 2 parameter1 = 7 parameter2 = 7 timing = 0 duration = 7 STR_VAR resource = ~d5tsill2~ END
IF_EXISTS BUT_ONLY
COPY_EXISTING ~d5tsnewe.spl~ ~override~
LPF CLONE_EFFECT INT_VAR silent = 1 multi_match = 1 match_opcode = 193 opcode = 100 parameter2 = 7 parameter1 = 7 END
IF_EXISTS BUT_ONLY
COPY_EXISTING ~d5tsnewf.spl~ ~override~
WRITE_BYTE 0x27 0
IF_EXISTS BUT_ONLY
CREATE EFF ~d5tsill1~
WRITE_LONG 0x10 22
WRITE_LONG 0x14 2
WRITE_LONG 0x1c (0 - 5)
WRITE_LONG 0x20 0
WRITE_LONG 0x24 0
WRITE_LONG 0x28 7
WRITE_SHORT 0x2c 100
CREATE EFF ~d5tsill2~
WRITE_LONG 0x10 80
WRITE_LONG 0x14 2
WRITE_LONG 0x24 0
WRITE_LONG 0x28 7
WRITE_SHORT 0x2c 100
//__________________________________________________________________________________
//backstab immunity when detecting invisible_________________________________________
//
COPY_EXISTING_REGEXP GLOB ~^.+\.spl$~ ~override~
LPF CLONE_EFFECT INT_VAR silent = 1 multi_match = 1 match_opcode = 193 opcode = 292 parameter1 = 0 parameter2 = 1 END
//__________________________________________________________________________________
//handle nondetection spells/items__________________________________________________
//
COPY_EXISTING ~spwi310.spl~ ~override~
SAY NAME1 @6413
SAY UNIDENTIFIED_DESC @6414
WRITE_BYTE 0x27 2
LPF CLONE_EFFECT INT_VAR silent = 1 multi_match = 1 match_opcode = 69 opcode = 337 parameter1 = 20 parameter2 = 101 timing = 1 duration = 0 END
LPF CLONE_EFFECT INT_VAR silent = 1 multi_match = 1 match_opcode = 69 opcode = 205 parameter1 = 0 parameter2 = 5 END
LPF ADD_SPELL_EFFECT INT_VAR opcode = 321 target = 1 insert_point = 0 STR_VAR resource = ~spwi310~ END
IF_EXISTS BUT_ONLY
COPY_EXISTING ~clck06.itm~ ~override~
LPF ADD_ITEM_EQEFFECT INT_VAR opcode = 205 target = 1 parameter2 = 5 timing = 2 END
LPF DELETE_EFFECT INT_VAR match_opcode = 69 END
IF_EXISTS BUT_ONLY
ACTION_IF (MOD_IS_INSTALLED ~item_rev.tp2~ ~0~) BEGIN
COPY_EXISTING ~helm29.itm~ ~override~
~helm39.itm~ ~override~
LPF ADD_ITEM_EQEFFECT INT_VAR opcode = 205 target = 1 parameter2 = 5 timing = 2 END
LPF DELETE_EFFECT INT_VAR match_opcode = 69 END
IF_EXISTS BUT_ONLY
END
// ***** do for all nondetection items
//handle IR potions of sight________________________________________________________
//
COPY_EXISTING ~potn30.spl~ ~override~
LPF CLONE_EFFECT INT_VAR match_opcode = 63 opcode = 193 parameter1 = 0 parameter2 = 1 END
IF_EXISTS BUT_ONLY
COPY_EXISTING ~potn30d.spl~ ~override~
LPF ADD_SPELL_EFFECT INT_VAR opcode = 136 target = 1 timing = 1 END
LPF DELETE_EFFECT INT_VAR match_opcode = 116 END
LPF DELETE_EFFECT INT_VAR match_opcode = 160 END
IF_EXISTS BUT_ONLY
//make sure invis. purge etc. expose sanctuary______________________________________
//
COPY_EXISTING ~sppr309d.spl~ ~override~
LPF CLONE_EFFECT INT_VAR match_opcode = 116 opcode = 160 END
IF_EXISTS BUT_ONLY
//break sanctuary appropriately_____________________________________________________
//
COPY_EXISTING ~spell.ids~ ~override~
COUNT_2DA_ROWS 2 rows
FOR (row = 1; row < rows; ++row) BEGIN
READ_2DA_ENTRY row 1 2 ids_name
INNER_ACTION BEGIN
LAF RES_NUM_OF_SPELL_NAME STR_VAR spell_name = EVAL ~%ids_name%~ RET spell_res END
COPY_EXISTING ~%spell_res%.spl~ ~override~
WRITE_BYTE 0x19 (THIS BOR 2)
IF_EXISTS BUT_ONLY
END
END
BUT_ONLY
ACTION_FOR_EACH ids_label IN
~CLERIC_BLESS~
~CLERIC_CURE_LIGHT_WOUNDS~
~CLERIC_DETECT_EVIL~
~CLERIC_PROTECT_FROM_EVIL~
~CLERIC_REMOVE_FEAR~
~CLERIC_ARMOR_OF_FAITH~
~CLERIC_SPIRIT_WARD~
~CLERIC_PROTECT_FROM_GOOD~
~CLERIC_AID~
~CLERIC_FIND_TRAPS~
~CLERIC_GOOD_BERRIES~
~CLERIC_GOODBERRY~
~CLERIC_KNOW_ALIGNMENT~
~CLERIC_RESIST_FIRE~
~CLERIC_SLOW_POISON~
~CLERIC_RESIST_FIRE_AND_COLD~
~CLERIC_CURE_MODERATE_WOUNDS~
~CLERIC_PROTECTION_FROM_FIRE~
~CLERIC_REMOVE_CURSE~
~CLERIC_REMOVE_PARALYSIS~
~CLERIC_INVISIBILITY_PURGE~
~CLERIC_CURE_MEDIUM_WOUNDS~
~CLERIC_CURE_DISEASE~
~CLERIC_ZONE_OF_SWEET_AIR~
~CLERIC_EXALTATION~
~CLERIC_FAVOR_OF_ILMATER~
~CLERIC_SPIRITUAL_CLARITY~
~CLERIC_CURE_SERIOUS_WOUNDS~
~CLERIC_FREE_ACTION~
~CLERIC_NEUTRALIZE_POISON~
~CLERIC_DEFENSIVE_HARMONY~
~CLERIC_PROTECTION_FROM_EVIL_10_FOOT~
~CLERIC_DEATH_WARD~
~CLERIC_NEGATIVE_PLANE_PROTECTION~
~CLERIC_FAR_SIGHT~
~CLERIC_LESSER_RESTORATION~
~CLERIC_UNFAILING_ENDURANCE~
~CLERIC_CURE_CRITICAL_WOUNDS~
~CLERIC_RAISE_DEAD~
~CLERIC_TRUE_SIGHT~
~CLERIC_IRONSKIN~
~CLERIC_CHAOTIC_COMMANDS~
~CLERIC_MAGIC_RESISTANCE~
~CLERIC_MASS_CURE~
~CLERIC_REPULSE_UNDEAD~
~CLERIC_PIXIE_DUST~
~CLERIC_SHIELD_OF_LATHANDER~
~CLERIC_UNDEAD_WARD~
~CLERIC_RECALL_SPIRIT~
~CLERIC_HEAL~
~CLERIC_WONDROUS_RECALL~
~CLERIC_PHYSICAL_MIRROR~
~CLERIC_ENTROPY_SHIELD~
~CLERIC_SHIELD_OF_THE_ARCHONS~
~CLERIC_REGENERATE~
~CLERIC_RESURRECTION~
~CLERIC_RESTORATION~
~CLERIC_MASS_RAISE_DEAD~
~CLERIC_IMPERVIOUS_SANCTITY_OF_MIND~
~CLERIC_GREATER_SHIELD_OF_LATHANDER~
~CLERIC_MIST_OF_ELDATH~
~WIZARD_ARMOR~
~WIZARD_FRIENDS~
~WIZARD_IDENTIFY~
~WIZARD_INFRAVISION~
~WIZARD_PROTECTION_FROM_EVIL~
~WIZARD_SHIELD~
~WIZARD_REFLECT_IMAGE~
~WIZARD_EXPEDITIOUS_RETREAT~
~WIZARD_BLUR~
~WIZARD_DETECT_EVIL~
~WIZARD_DETECT_INVISIBILITY~
~WIZARD_INVISIBILITY~
~WIZARD_KNOW_ALIGNMENT~
~WIZARD_LUCK~
~WIZARD_RESIST_FEAR~
~WIZARD_MIRROR_IMAGE~
~WIZARD_VOCALIZE~
~WIZARD_CHAOS_SHIELD~
~WIZARD_CATS_GRACE~
~WIZARD_PROTECTION_FROM_PETRIFICATION~
~WIZARD_CLAIRVOYANCE~
~WIZARD_INVISIBILITY_10_FOOT~
~WIZARD_NON_DETECTION~
~WIZARD_PROTECTION_FROM_NORMAL_MISSILES~
~WIZARD_GHOST_ARMOR~
~WIZARD_PROTECTION_FROM_FIRE~
~WIZARD_PROTECTION_FROM_COLD~
~WIZARD_DETECT_ILLUSION~
~WIZARD_IMPROVED_INVISIBILITY~
~WIZARD_MINOR_GLOBE_OF_INVULNERABILITY~
~WIZARD_STONE_SKIN~
~WIZARD_REMOVE_CURSE~
~WIZARD_SPIRIT_ARMOR~
~WIZARD_FAR_SIGHT~
~WIZARD_EYE~
~WIZARD_EMOTION_HOPE~
~WIZARD_EMOTION_COURAGE~
~WIZARD_SHADOW_DOOR~
~WIZARD_SPELL_IMMUNITY~
~WIZARD_PROTECTION_FROM_NORMAL_WEAPONS~
~WIZARD_PROTECTION_FROM_ELECTRICITY~
~WIZARD_ORACLE~
~WIZARD_PROTECTION_FROM_ACID~
~WIZARD_SPELL_SHIELD~
~WIZARD_MINOR_SPELL_TURNING~
~WIZARD_GLOBE_OF_INVULNERABILITY~
~WIZARD_PROTECTION_FROM_MAGIC_ENERGY~
~WIZARD_TRUE_SIGHT~
~WIZARD_PROTECTION_FROM_MAGIC_WEAPONS~
~WIZARD_IMPROVED_HASTE~
~WIZARD_SPELL_DEFLECTION~
~WIZARD_STONE_TO_FLESH~
~WIZARD_TROLLISH_FORTITUDE~
~WIZARD_SPELL_TURNING~
~WIZARD_PROTECTION_FROM_THE_ELEMENTS~
~WIZARD_MANTLE~
~WIZARD_MASS_INVISIBILITY~
~WIZARD_IMPROVED_CHAOS_SHIELD~
~WIZARD_MIND_BLANK~
~WIZARD_PROTECTION_FROM_ENERGY~
~WIZARD_IMPROVED_MANTLE~
~WIZARD_IRON_BODY~
~WIZARD_SPELL_TRAP~
~WIZARD_ABSOLUTE_IMMUNITY~
~WIZARD_FREEDOM~
BEGIN
// ACTION_IF (FILE_CONTAINS_EVALUATED (~SPELL.IDS~ ~[ %TAB%]%ids_label%$~)) BEGIN
ACTION_IF FILE_CONTAINS_EVALUATED (~SPELL.IDS~ ~[ %TAB%]%ids_label%[ %TAB%%WNL%%LNL%%MNL%$]~) BEGIN
LAF RES_NUM_OF_SPELL_NAME STR_VAR spell_name = EVAL ~%ids_label%~ RET spell_res END
COPY_EXISTING ~%spell_res%.spl~ override
WRITE_BYTE 0x19 (THIS BAND 253)
IF_EXISTS BUT_ONLY
END
END
CLEAR_ARRAYS
END // end define function
//__________________________________________________________________________________
// vampires/level drain_____________________________________________________________
//
DEFINE_ACTION_FUNCTION tweak_level_drain BEGIN
// level drain allows save
COPY_EXISTING_REGEXP GLOB ~^.+\.itm$~ ~override~
PATCH_IF (SOURCE_SIZE > 0x71) BEGIN
LPF ALTER_EFFECT INT_VAR silent = 1 match_opcode = 216 match_savingthrow = 0 savingthrow = 4 END
END
BUT_ONLY
END // end define function
//__________________________________________________________________________________
DEFINE_ACTION_FUNCTION temp_level_drain BEGIN
// sleep off level drain
COPY_EXISTING_REGEXP GLOB ~^.+\.itm$~ ~override~
PATCH_IF (SOURCE_SIZE > 0x71) BEGIN
LPF ALTER_EFFECT INT_VAR silent = 1 match_opcode = 216 match_timing = 1 timing = 0 duration = 600 END
LPF ALTER_EFFECT INT_VAR silent = 1 match_opcode = 216 match_timing = 9 timing = 0 duration = 600 END
END
BUT_ONLY
END // end define function
//__________________________________________________________________________________
// spells pierce MR_________________________________________________________________
//
DEFINE_ACTION_FUNCTION tweak_magic_resistance BEGIN
<<<<<<<< d5/d5mrspls.2da
2DA V1.0
#
SPL LVL TYPE
>>>>>>>>
COPY ~d5/d5mrspls.2da~ ~weidu_external/%MOD_FOLDER%/d5mrspls.2da~
OUTER_SET spl_ind = 1
COPY_EXISTING_REGEXP GLOB ~^.+\.spl$~ ~override~
// PATCH_IF !(~%SOURCE_RES%~ STRING_EQUAL_CASE ~#rdremov~) BEGIN
SET this_spl = 0
READ_SHORT 0x1c spell_type
READ_LONG 0x34 spell_level
PATCH_IF (~%SOURCE_RES%~ STRING_MATCHES_REGEXP ~^[Ss][Pp][Pp][Rr][1-7][0-4][0-9]$~ = 0) OR (~%SOURCE_RES%~ STRING_MATCHES_REGEXP ~^[Ss][Pp][Pp][Rr][1-7]50$~ = 0) BEGIN
GET_OFFSET_ARRAY ab_array SPL_V10_HEADERS
PHP_EACH ab_array AS int => ab_off BEGIN
PATCH_IF (this_spl = 0) BEGIN
READ_BYTE (ab_off + 0x0c) ab_target
PATCH_IF (ab_target = 1) OR (ab_target = 4) BEGIN
GET_OFFSET_ARRAY2 fx_array ab_off SPL_V10_HEAD_EFFECTS
PHP_EACH fx_array AS int => fx_off BEGIN
READ_BYTE (fx_off + 0x02) fx_target
READ_BYTE (fx_off + 0x0d) fx_resist
PATCH_IF (fx_target = 2) AND (fx_resist = 1) BEGIN
SET this_spl = 1
END
END
END
END
END
END
PATCH_IF (~%SOURCE_RES%~ STRING_MATCHES_REGEXP ~^[Ss][Pp][Ww][Ii][1-9][0-4][0-9]$~ = 0) OR (~%SOURCE_RES%~ STRING_MATCHES_REGEXP ~^[Ss][Pp][Ww][Ii][1-9]50$~ = 0) BEGIN
GET_OFFSET_ARRAY ab_array SPL_V10_HEADERS
PHP_EACH ab_array AS int => ab_off BEGIN
PATCH_IF (this_spl = 0) BEGIN
READ_BYTE (ab_off + 0x0c) ab_target
PATCH_IF (ab_target = 1) OR (ab_target = 4) BEGIN
GET_OFFSET_ARRAY2 fx_array ab_off SPL_V10_HEAD_EFFECTS
PHP_EACH fx_array AS int => fx_off BEGIN
READ_BYTE (fx_off + 0x02) fx_target
READ_BYTE (fx_off + 0x0d) fx_resist
PATCH_IF (fx_target = 2) AND (fx_resist = 1) BEGIN
SET this_spl = 1
END
END
END
END
END
END
PATCH_IF (this_spl = 1) BEGIN
SET spl_ind = (%spl_ind% + 1)
// SPRINT $castable_spls(~%spl_ind%~)~%SOURCE_RES%~
INNER_ACTION BEGIN
APPEND_OUTER ~weidu_external/%MOD_FOLDER%/d5mrspls.2da~ ~%spl_ind% %SOURCE_RES% %spell_level% %spell_type%~ UNLESS ~%SOURCE_RES%~
END
END
// END
BUT_ONLY
COPY_EXISTING_REGEXP GLOB ~^.+\.itm$~ ~override~
READ_BYTE 0x2f current ELSE 0
READ_BYTE 0x2b current2 ELSE 0
READ_LONG 0x64 headoffset ELSE 0
READ_SHORT 0x68 headcount ELSE 0
READ_LONG 0x6a effectsoffset ELSE 0
haslearn = 0
hascast = 0
FOR (headcyc = 0; headcyc < headcount ; headcyc = headcyc + 1) BEGIN
thishead = 0
READ_SHORT (headoffset + (headcyc * 0x38) + 0x1e) effcount ELSE 0
READ_SHORT (headoffset + (headcyc * 0x38) + 0x20) effectsindex ELSE 0
FOR (effcyc = 0; effcyc < effcount; effcyc = effcyc + 1) BEGIN
READ_SHORT (effectsoffset + (effectsindex + effcyc)* 0x30) opcode ELSE 0
PATCH_IF (opcode = 0x93) AND (thishead = 0) BEGIN
READ_ASCII (effectsoffset + 0x14 + (effectsindex + effcyc)* 0x30) resref_learn ELSE 0
INNER_PATCH_FILE ~%resref_learn%.spl~ BEGIN
READ_SHORT 0x1c type
END
PATCH_IF (type = 1) BEGIN // arcane spell scroll
thishead = 1
haslearn = 1
END
END
PATCH_IF ((opcode = 0x92) OR (opcode = 0x94)) AND (thishead = 0) BEGIN
READ_ASCII (effectsoffset + 0x14 + (effectsindex + effcyc)* 0x30) resref_cast ELSE 0
INNER_PATCH_FILE ~%resref_cast%.spl~ BEGIN
READ_SHORT 0x1c type
END
PATCH_IF (type = 1) BEGIN // arcane spell scroll
thishead = 1
hascast = 1
END
END
END
END
PATCH_IF (haslearn = 1) AND (hascast = 1) AND (~%resref_cast%~ STRING_EQUAL_CASE ~%resref_learn%~) BEGIN
PATCH_IF (FILE_EXISTS_IN_GAME ~%resref_learn%.spl~) BEGIN
SPRINT $scroll_spells(~%resref_learn%~) ~1~ // ~%scroll_spell_ind%~
// SET ++scroll_spell_ind
END
END
BUT_ONLY
ACTION_PHP_EACH scroll_spells AS spl => ind BEGIN
ACTION_IF (FILE_EXISTS_IN_GAME ~%spl%.spl~) BEGIN
COPY_EXISTING ~%spl%.spl~ ~override~
SET this_spl = 0
READ_SHORT 0x1c spell_type
READ_LONG 0x34 spell_level
PATCH_IF (spell_level > 1) BEGIN
GET_OFFSET_ARRAY ab_array SPL_V10_HEADERS
PHP_EACH ab_array AS int => ab_off BEGIN
PATCH_IF (this_spl = 0) BEGIN
READ_BYTE (ab_off + 0x0c) ab_target
PATCH_IF (ab_target = 1) OR (ab_target = 4) BEGIN
GET_OFFSET_ARRAY2 fx_array ab_off SPL_V10_HEAD_EFFECTS
PHP_EACH fx_array AS int => fx_off BEGIN
READ_BYTE (fx_off + 0x02) fx_target
READ_BYTE (fx_off + 0x0d) fx_resist
PATCH_IF (fx_target = 2) AND (fx_resist = 1) BEGIN
SET this_spl = 1
END
END
END
END
END
END
PATCH_IF (this_spl = 1) BEGIN
// SET spl_ind = (%spl_ind% + 1)
// SPRINT $castable_spls(~%spl_ind%~)~%SOURCE_RES%~
INNER_ACTION BEGIN
APPEND_OUTER ~weidu_external/%MOD_FOLDER%/d5mrspls.2da~ ~%spl_ind% %SOURCE_RES% %spell_level% %spell_type%~ UNLESS ~%SOURCE_RES%~
END
END
BUT_ONLY
END
END
ACTION_FOR_EACH num IN ~2~ ~3~ ~4~ ~5~ ~6~ ~7~ ~8~ ~9~ BEGIN
ACTION_IF (FILE_EXISTS_IN_GAME ~mewi%num%.txt~) BEGIN
COPY_EXISTING ~mewi%num%.txt~ ~override~
COUNT_2DA_ROWS 1 rows
FOR (row = 0; row < rows; ++row) BEGIN
READ_2DA_ENTRY row 0 1 me_spl
PATCH_IF (FILE_EXISTS_IN_GAME ~%me_spl%.spl~) BEGIN
INNER_ACTION BEGIN
COPY_EXISTING ~%me_spl%.spl~ ~override~
SET this_spl = 0
READ_SHORT 0x1c spell_type
READ_LONG 0x34 spell_level
GET_OFFSET_ARRAY ab_array SPL_V10_HEADERS
PHP_EACH ab_array AS int => ab_off BEGIN
PATCH_IF (this_spl = 0) BEGIN
READ_BYTE (ab_off + 0x0c) ab_target
PATCH_IF (ab_target = 1) OR (ab_target = 4) BEGIN
GET_OFFSET_ARRAY2 fx_array ab_off SPL_V10_HEAD_EFFECTS
PHP_EACH fx_array AS int => fx_off BEGIN
READ_BYTE (fx_off + 0x02) fx_target
READ_BYTE (fx_off + 0x0d) fx_resist
PATCH_IF (fx_target = 2) AND (fx_resist = 1) BEGIN
SET this_spl = 1
END
END
END
END
END
PATCH_IF (this_spl = 1) BEGIN
// SET spl_ind = (%spl_ind% + 1)
// SPRINT $castable_spls(~%spl_ind%~)~%SOURCE_RES%~
INNER_ACTION BEGIN
APPEND_OUTER ~weidu_external/%MOD_FOLDER%/d5mrspls.2da~ ~%spl_ind% %SOURCE_RES% %spell_level% %spell_type%~ UNLESS ~%SOURCE_RES%~
END
END
BUT_ONLY
END
END
END
BUT_ONLY
END
END
COPY ~weidu_external/%MOD_FOLDER%/d5mrspls.2da~ ~override~
COUNT_2DA_ROWS 4 rows
FOR (row = 0; row < rows; ++row) BEGIN
READ_2DA_ENTRY row 1 4 mr_spl
READ_2DA_ENTRY row 2 4 mr_lvl
PATCH_IF (FILE_EXISTS_IN_GAME ~%mr_spl%.spl~) AND (IS_AN_INT %mr_lvl%) BEGIN
PATCH_IF (%mr_lvl% > 1) BEGIN
SET mr_mult = (%mr_lvl% - 1)
SET mr_reduct = (mr_mult * 5)
// PATCH_PRINT ~%mr_spl% IS BEING PATCHED~
INNER_ACTION BEGIN
COPY_EXISTING ~%mr_spl%.spl~ ~override~
LPF ADD_SPELL_EFFECT INT_VAR insert_point = 0 opcode = 166 target = 2 parameter1 = (0 - %mr_reduct%) parameter2 = 0 timing = 0 duration = 0 END
BUT_ONLY
END
END
END
END
END // end function
//__________________________________________________________________________________