Bonjour à tout le monde. Alors voilà, j'ai le projet de faire un jeu basé sur Duke Nukem 3D et je bloque au niveau du CON Scripting.
Les forums que j'ai pu trouver "en anglais" sont un peu fermés et même après inscription, je ne peux poster donc, frustration.
Je me suis permi d'écrire à l'un des concepteur du mod, via le site moddb.com, "Jblade35", qui m'a bien répondu (cool). Il est malheureusement overbooké et n'a donné que deux ou trois conseils qui m'ont permis d'avancer... mais pas assez et m'a averti que l'ia dans le con scripting était ce qu'il y avait de plus compliqué snif...
Voici donc l'objet de mon post : je cherche à reproduire un effet vu dans un mod (AMC TC2) qui gère un "allié" (un sorcier) Lorsqu'on appuie une fois sur la barre d'espace il nous suit, et lorsqu'on réitère l'action il reste sur place pour "garder le fort" !
Le but est d'extraire les portions de script afin de les transférer dans mon projet, sans pour autant "tout" prendre... sous la forme d'un seul fichier CON (copain.con ) Je suis sûr qu'il ne manque pas grand'chose en plus...
Ce mod contient 14 fichiers CON, soit des dizaines de milliers de lignes et je n'exagère pas. Après des heures et des heures de copier coller de var, gamevar, define, et autres variables machin truc (je suis graphiste avant d'être "codeur amateur", je précise), ça ne fonctionne qu'à... 90% : Le sorcier me suit bel et bien lorsque je lui demande (ça marche...) et il reste sur place pour défendre les lieux (ça marche moins bien). En fait il voit les ennemis, il se téléporte parmi eux et lève les bras pour attaquer... mais n'attaque pas : aucun sprite n'est lancé et donc il ne touche personne. Seule utilité pour le moment, il est à côté du joueur et peut servir de bouclier humain ... bref...
Ce ne doit pas être un problème d'image sprite car j'ai copié remplacé déplacé les fichiers de textures sans que rien ne soit lancé. Jeme disait que si le sprite ne partait pas il n'y avait pas collision avec les ennemis et donc, pas de résultat... mais c'est pas ça.
J'ai du loupé des bouts de scripts mais lesquels... de plus, je n'ai aucune erreurs d'afficher, aucune variable de non déclarée... le jeu se lance normalement...
Donc, au secours, je deviens dingue mdr.
Quelqu'un saurait-il comment faire pour finir de résoudre ce souci, ou à défaut, créer un allié tout neuf dans DN3D?
Pour info :
- Le mod peut être trouvé ici : http://www.moddb.com/games/the-amc-tc (il est vraiment génial)
- Le fichier contenant le sorcier est le fichier TILESART038
- Le fichier contenant le sprite "target friend" est le fichier TILESART034. Sans lui le sorcier ne bougera pas vraiment les bras en présence des ennemis x) (info donnée par Jblade35 sur le site moddb.com.)
- et voici le contenu de mon fichier "copain.con" qui contient ce que j'ai pu isoler jusqu'à présent :
note : pour tester ça, il faut :
1. référencer ce fichier CON dans le fichier "GAME.CON" avec "include copain.con"
2. mettre le fichier GAME.CON ainsi que le fichier TILESART038 dans le fichier "duke3d.grp" + le fichier TILESART035
3. lancer mapster32.exe et créer une map
4. placer des ennemis un peu partout
5. placer le sprite hm... 9771 (le sorcier)
6. lancer la partie et le solliciter
Il y a aussi des sons, mais c'est secondaire... enfin voilà...
Merci d'avance aux personnes que ça intéressera et à celles qui pourront faire avancer le truc
Dans tous les cas, bonne journée à tout le monde !
A tester, c'est plus simple en fait x) :
J'ai zippé tout ça et mon fichier contient :
- une map test "testcopain.map" avec qq ennemis et le sorcier à solliciter (touche action)
- les bruits et les voix du sorcier
- mon fichier COPAIN.CON où j'ai rassemblé les portions de scripts, triées dans les 14 fichiers CON du mod original
- un fichier GAME.CON où j'ai référencé COPAIN.CON
- deux fichiers de textures (TILES035.ART qui contient le sprite dont j'avais oublié de parler (9072) ainsi que TILES038.ART qui contient le sorcier)
A télécharger là : copain.7z
Pour tester -> Mettre tout ça dans le dossier du jeu duke nukem puis au choix :
1. lancez Mapster32 puis la map
2. lancez le jeu eduke32 puis New Game / User Map / testcopain.map
Voilà... En espérant que ça se résolve un jour x)
On est vendredi alors bon we à tout le monde
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 // ALLY VARIABLES gamevar myowner 0 2 gamevar ALLY_VOICE 0 2 // Countdown timer till ally replies gamevar CEASE_FIRE 0 2 gamevar FOLLOW_PLAYER 0 2 gamevar INTERNALCOUNT 0 2 gamevar INTERNALCOUNT_2 0 2 gamevar INTERNALCOUNT_3 0 2 gamevar digx 0 1 gamevar digy 0 1 gamevar digz 0 1 gamevar TEMP 0 2 gamevar TEMP2 0 2 gamevar TEMP3 0 2 gamevar TEMP4 0 2 gamevar TEMP5 0 2 gamevar TEMP6 0 2 gamevar TEMP7 0 2 gamevar TEMP8 0 2 gamevar targetlock 0 2 gamevar target -1 2 gamevar mysin 0 2 // The sine of the angle of the actor using hitscan gamevar mycos 0 2 gamevar hitsprite 0 2 gamevar hitwall 0 2 gamevar hitwall2 0 2 gamevar hitsector 0 2 // The sector that gets hit by the hitscan gamevar hitx 0 2 gamevar hity 0 2 gamevar hitz 0 2 gamevar mx 0 2 gamevar my 0 2 gamevar mz 0 2 gamevar y 0 2 gamevar x 0 2 gamevar z 0 2 gamevar xvel 0 2 gamevar xydist 0 2 gamevar xydist2 0 2 gamevar zdist 0 2 gamevar allies_present 0 0 gamevar both_present 0 0 define SHOOTME 9072 define SHOOTME2 9073 define SHOOTME3 9071 define SKULLEXPLOSION 6241 define J_NO_DAM_1 2231 define J_NO_DAM_2 2232 define SPARM_PROTECT 1041 define SPELL1 6151 define SPELL2 6197 define SPELL4 6217 define SPELL8 6248 define SORCERER 9772 define PRIEST_BLAST 9805 define KNEE 2521 define KICK_2 5330 define SILVERAMMOSHOT 7918 define HOLYHANDG 5044 define LAVA_HIT 821 define SPELL7 6276 define SPELL9 6465 define STYGIAN_ROCK 9111 define BONE_SHARD 9116 define REDM_BLAST 7057 define MPLASMA 7054 define GREENLASERSHOT 9400 define BLUELASERSHOT 12900 define REDLASERSHOT 6632 define GOLD_SPELL1 13495 define GOLDEN_SHOT_LOW 13488 define GOLDEN_SHOT_HIGH 13489 define PROTECT_DING 2157 gamevar PROTECTED_DING NO 0 // Will play a distinctive noise if the enemy you're hitting is resistant to that attack gamevar ANGVAR 0 2 gamevar mysector -1 2 gamevar CHAR -1 1 // SKILL LEVELS gamevar SKILL_LEVEL 0 1 gamevar SKILLCHANCE 0 0 // used for determining skill based stuff defineprojectile GOLD_SPELL1 PROJ_WORKSLIKE 32778 defineprojectile GOLD_SPELL1 PROJ_VEL 600 defineprojectile GOLD_SPELL1 PROJ_EXTRA 5 defineprojectile GOLD_SPELL1 PROJ_HITRADIUS 8 defineprojectile GOLD_SPELL1 PROJ_CLIPDIST 20 defineprojectile GOLD_SPELL1 PROJ_DROP 0 define DEMON_THROWFIRE 803 define DEMON_FIREXPL 804 define DEMON_TELEPORT 805 define PRIEST_CAST01 1155 define PRIEST_CAST02 1156 define PRIEST_APPEAR 1257 define PRIEST_PAIN 1255 define PRIEST_DEATH 1256 define SORC_SPAWN 2041 define SORC_FOLLOW1 2042 define SORC_FOLLOW2 2043 define SORC_GUARD1 2044 define SORC_GUARD2 2045 define SORC_ATTACK1 2046 define SORC_ATTACK2 2047 define SORC_ATTACK3 2048 define SORC_ATTACK4 2049 definesound DEMON_THROWFIRE DTHROW.voc 64 -64 200 0 0 definesound DEMON_FIREXPL DFEXPL.voc 64 -64 200 0 0 definesound DEMON_TELEPORT DTELE.voc 0 0 200 16 0 definesound PRIEST_CAST01 PCAST01.voc 0 0 128 0 0 definesound PRIEST_CAST02 PCAST02.voc 0 0 128 0 0 definesound PRIEST_APPEAR BISHAPP.voc 0 0 128 0 0 definesound PRIEST_PAIN BSHPN1.wav 0 0 128 0 0 definesound PRIEST_DEATH BISHDTH1.wav 0 0 200 0 0 definesound SORC_SPAWN SORC_S1.wav -64 64 128 0 0 definesound SORC_FOLLOW1 SORC_F1.wav -64 64 128 0 0 definesound SORC_FOLLOW2 SORC_F2.wav -64 64 128 0 0 definesound SORC_GUARD1 SORC_G1.wav -64 64 128 0 0 definesound SORC_GUARD2 SORC_G2.wav -64 64 128 0 0 definesound SORC_ATTACK1 SORC_T1.wav -64 64 128 0 0 definesound SORC_ATTACK2 SORC_T2.wav -64 64 128 0 0 definesound SORC_ATTACK3 SORC_T3.wav -64 64 128 0 0 definesound SORC_ATTACK4 SORC_T4.wav -64 64 128 0 0 // Knockback effect define ENEMYKNOCKBACK -10 gamevar QUICKK 13 1 gamevar GOT_KNIFE 0 1 gamevar KNIFE_ATTACK 26 1 gamevar MELEE_GRAPHIC 0 1 gamevar ROUNDHOUSE_KICK 26 1 gamevar SLIDE_KICK 26 1 gamevar SPIN_KICK 26 1 gamevar TWIRL_KICK 26 1 gamevar FLYING_KICK 26 1 action ZERO 0 action ONE 1 action TWO 2 //-------------------------------------------------------------------------------- STATES -------------- useractor notenemy SHOOTME // Target for allies to shoot at cstat 32768 sizeat 32 32 getactor[myowner].statnum TEMP6 ifvare TEMP6 1024 killit getactor[myowner].extra TEMP6 ifvarl TEMP6 1 killit getactor[myowner].picnum TEMP7 getactor[myowner].x TEMP getactor[myowner].y TEMP2 getactor[myowner].z TEMP3 setsprite THISACTOR TEMP TEMP2 TEMP3 ifaction 0 { ifmultiplayer ifvare COOP 1 { ifcansee ifp pfacing ifpdistl 8000 ifrnd 32 { qgetsysstr 356 STR_PLAYERNAME qstrcat 356 643 userquote 356 } } action ZERO } enda useractor notenemy SHOOTME3 // Targets for everybody to shoot at cstat 32768 sizeat 32 32 getactor[myowner].statnum TEMP6 ifvare TEMP6 1024 killit getactor[myowner].extra TEMP6 ifvarl TEMP6 1 killit getactor[myowner].x TEMP getactor[myowner].y TEMP2 getactor[myowner].z TEMP3 setsprite THISACTOR TEMP TEMP2 TEMP3 enda useractor notenemy SHOOTME2 // Target for enemies to shoot at cstat 32768 sizeat 32 32 getactor[myowner].statnum TEMP6 ifvare TEMP6 1024 killit getactor[myowner].extra TEMP6 ifvarl TEMP6 1 killit getactor[myowner].x TEMP getactor[myowner].y TEMP2 getactor[myowner].z TEMP3 setsprite THISACTOR TEMP TEMP2 TEMP3 enda state ENEMYKNOCKBACKS getactor[THISACTOR].htextra xvel ifvarg xvel 0 { mulvar xvel ENEMYKNOCKBACK ifwasweapon KNEE { ifvarl ROUNDHOUSE_KICK 27 break mulvar xvel 2 ifstrength 30 setactor[THISACTOR].htactorstayput -1 } ifwasweapon KICK_2 { mulvar xvel 2 ifstrength 30 setactor[THISACTOR].htactorstayput -1 } ifwasweapon 4960 nullop else ifwasweapon 4963 nullop else setactor[THISACTOR].xvel xvel } ends state rf getactor[THISACTOR].cstat TEMP4 ifvare TEMP4 259 cstat 2 else ifvare TEMP4 771 cstat 514 else { ifrnd 128 cstat 4 else cstat 0 } ends state random_wall_jibs ifrnd 96 shoot BLOODSPLAT1 ifrnd 96 shoot BLOODSPLAT2 ifrnd 96 shoot BLOODSPLAT3 ifrnd 96 shoot BLOODSPLAT4 ifrnd 96 shoot BLOODSPLAT1 ends state calczdist ifvare target -1 break getactor[THISACTOR].z z getactor[target].z mz setvarvar zdist mz subvarvar zdist z // zdist now holds how far up or down you would have to go from THISACTOR's position to get to target's position getactor[target].picnum TEMP ifvarl zdist -8192 subvar zdist 4096 // aim for the head when shooting up into windows ends state visibilitycheck // ALSO CHECKS FOR TRANSPARENT WALLS ifvarn THISACTOR -1 ifvarn target -1 ldist xydist THISACTOR target state calczdist getactor[THISACTOR].x x getactor[THISACTOR].y y getactor[THISACTOR].z z subvar z 8192 getactor[THISACTOR].sectnum mysector getactor[THISACTOR].ang ANGVAR cos mycos ANGVAR sin mysin ANGVAR shiftvarl zdist 14 ifvare xydist 0 setvar xydist 1 divvarvar zdist xydist hitscan x y z mysector mycos mysin zdist hitsector hitwall hitsprite hitx hity hitz 4294901808 getplayer[THISACTOR].i TEMP8 ifvarvare hitsprite target { setvar targetlock 26 } else setvar targetlock 26 addvar z 4096 hitscan x y z mysector mycos mysin zdist hitsector hitwall hitsprite hitx hity hitz 4294901808 ifvarvarn hitsprite target { ifvarn targetlock 0 break setvar target -1 } ends state checksight getactor[THISACTOR].z z subvar z 8192 setactor[THISACTOR].z z getactor[target].z mz subvar mz 8192 setactor[target].z mz canseespr THISACTOR target TEMP2 addvar z 8192 setactor[THISACTOR].z z addvar mz 8192 setactor[target].z mz ifvare TEMP2 0 { setvar target -1 break } ends state validatetarget ifvarn target -1 { state checksight ifvarn target -1 { getactor[target].x mx getactor[target].y my } getactor[THISACTOR].x x getactor[THISACTOR].y y subvarvar mx x subvarvar my y getangle ANGVAR mx my setactor[THISACTOR].ang ANGVAR state visibilitycheck } else break ends state checksight getactor[THISACTOR].z z subvar z 8192 setactor[THISACTOR].z z getactor[target].z mz subvar mz 8192 setactor[target].z mz canseespr THISACTOR target TEMP2 addvar z 8192 setactor[THISACTOR].z z addvar mz 8192 setactor[target].z mz ifvare TEMP2 0 { setvar target -1 break } ends state botfindtarget ifvare both_present 1 { setvar target -1 findnearspritez SHOOTME3 2048 16384 target ifvarn target -1 state validatetarget ifvarn target -1 break findnearspritez SHOOTME3 4096 32768 target ifvarn target -1 state validatetarget ifvarn target -1 break findnearspritez SHOOTME3 8192 65536 target ifvarn target -1 state validatetarget ifvarn target -1 break findnearspritez SHOOTME3 12288 98304 target ifvarn target -1 state validatetarget ifvarn target -1 break findnearspritez SHOOTME3 18432 147456 target ifvarn target -1 state validatetarget findnearspritez SHOOTME3 32768 262144 target ifvarn target -1 state validatetarget } setvar target -1 findnearspritez SHOOTME 2048 16384 target ifvarn target -1 state validatetarget ifvarn target -1 break findnearspritez SHOOTME 4096 32768 target ifvarn target -1 state validatetarget ifvarn target -1 break findnearspritez SHOOTME 8192 65536 target ifvarn target -1 state validatetarget ifvarn target -1 break findnearspritez SHOOTME 12288 98304 target ifvarn target -1 state validatetarget ifvarn target -1 break findnearspritez SHOOTME 18432 147456 target ifvarn target -1 state validatetarget findnearspritez SHOOTME 32768 262144 target ifvarn target -1 state validatetarget ends state frozen_code spritepal 1 move 0 cstat 257 ifp pfacing //ifpdistl FROZENQUICKKICKDIST ifvare MELEE_WEAPON_LOADOUT[CHAR] 0 pkick ifhitweapon { ifwasweapon FREEZEBLAST break lotsofglass 20 addkills 1 killit } ends state character_protected_sounds getactor[THISACTOR].htowner TEMP4 getactor[TEMP4].picnum TEMP5 ifvare TEMP5 1405 { ifrnd 32 { ifvare CHAR 0 { ifrnd 128 globalsound J_NO_DAM_1 else globalsound J_NO_DAM_2 } } } ends state SUPERNATURAL_DAMAGE_MODIFIER // Modifier for supernatural targets getactor[THISACTOR].htextra TEMP6 ifvarg TEMP6 0 { getactor[THISACTOR].htpicnum TEMP3 switch TEMP3 case SILVERAMMOSHOT // Silver bullets case 12203 // Silver knife case 12232 // Silver bolt case 6875 // Silver bayonett case HOLYHANDG case 3622 // 'charmed' dynamite stick mulvar TEMP6 2 // double the damage sound LAVA_HIT // burning noise setactor[THISACTOR].htextra TEMP6 break case 11741 // Dragonslayer is part supernatural case 6198 // Tesla ammo case PRIEST_BLAST // Magic does normal damage case SPELL1 // Magic does normal damage case SPELL2 // Electricity does normal damage case SPELL4 // Magic does normal damage case SPELL7 // Magic does normal damage case SPELL8 // Magic does normal damage case SPELL9 // Magic does normal damage case STYGIAN_ROCK case BONE_SHARD case 7159 // Magic does normal damage case 7163 // Magic does normal damage case REDM_BLAST // Magic does normal damage case 5372 // plasma does normal damage case 5374 // plasma does normal damage case MPLASMA // plasma does normal damage case 6816 // charmed nails do normal damage case GREENLASERSHOT // Green laser does normal damage case BLUELASERSHOT // blue laser does normal damage case REDLASERSHOT // red laser ifvarg SKILL_LEVEL 2 { divvar TEMP6 2 // half the damage if on expert setactor[THISACTOR].htextra TEMP6 ifvare PROTECTED_DING YES sound PROTECT_DING } break case GOLD_SPELL1 // Gold spells does normal damage case GOLDEN_SHOT_LOW case GOLDEN_SHOT_HIGH case 14605 // Gold dagger break default ifvarg SKILL_LEVEL 2 { spawn 13952 setvar TEMP6 -1 } // remove all damage if on expert or professional else { divvar TEMP6 2 ifrnd 64 spawn 13952 } // else half the damage ifvare PROTECTED_DING YES sound PROTECT_DING state character_protected_sounds setactor[THISACTOR].htextra TEMP6 setactor[THISACTOR].xvel 0 sound SPARM_PROTECT break endswitch } ends state ignore_ally_damage ifvare CEASE_FIRE 1 setvar target -1 getactor[THISACTOR].htextra TEMP ifvarg TEMP -1 { getactor[THISACTOR].htowner TEMP2 getactor[TEMP2].picnum TEMP3 ifvare TEMP3 9771 setactor[THISACTOR].htextra -1 ifvare TEMP3 APLAYER { ifactor APLAYER { ifmultiplayer ifvare COOP 1 setactor[THISACTOR].htextra -1 } else ifmultiplayer { ifvare COOP 1 setactor[THISACTOR].htextra -1 } else setactor[THISACTOR].htextra -1 } ifvare TEMP3 6328 setactor[THISACTOR].htextra -1 } ends //------------------------------------------------------------------------------------------------------ // ****************************************************************************** // FRIENDLY SUMMONED SORCERER // ****************************************************************************** action AFSORCERER_FROZEN 6 1 5 1 10 action AFSORCERERFLOAT 1 1 5 1 10 action AFSORCERERCAST 11 3 5 1 20 action AFSORCERERPAIN 6 1 5 1 10 action AFSORCERERDIE 26 8 1 1 15 move MFSORCERERFLOAT 210 move MSORCERERFLOAT 64 0 move MSORCERERFLOATUP 64 -64 move MSORCERERFLOATDOWN 64 64 move MSORCERERSTOP 0 move STOP 0 gamevar WEP3_BLOODY 0 1 ai AIFSORCERERSTOP AFSORCERERFLOAT STOP faceplayer seekplayer ai AIFSORCERERFLOAT AFSORCERERFLOAT MFSORCERERFLOAT faceplayer seekplayer ai AIFSORCERERFLOATUP AFSORCERERFLOAT MSORCERERFLOATUP seekplayer getv ai AIFSORCERERFLOATDOWN AFSORCERERFLOAT MSORCERERFLOATDOWN seekplayer getv ai AIFSORCERERSHOOT AFSORCERERCAST MSORCERERSTOP ai AIFSORCERERPAIN AFSORCERERPAIN MSORCERERSTOP faceplayer ai AIFSORCERERTELEPORT AFSORCERERPAIN MSORCERERSTOP faceplayer ai AIFSORCERERTELEPORT_ENEMY AFSORCERERPAIN MSORCERERSTOP faceplayer ai AIFSORCERERDYING AFSORCERERDIE MSORCERERSTOP faceplayer useractor notenemy 9771 ifaction 0 { spritepal 24 spawn SHOOTME2 strength 250 sizeat 40 40 action AFSORCERERFLOAT ai AIFSORCERERFLOAT ifspawnedby APLAYER { spawn 13950 globalsound DEMON_TELEPORT soundonce SORC_SPAWN setvar FOLLOW_PLAYER 1 setvar INTERNALCOUNT_3 960 } else setvar INTERNALCOUNT_3 -1 cstat 257 } ifvarg INTERNALCOUNT_2 0 subvar INTERNALCOUNT_2 1 ifvarn INTERNALCOUNT_3 -1 { ifvarg INTERNALCOUNT_3 0 subvar INTERNALCOUNT_3 1 else ifvare INTERNALCOUNT_3 0 { //globalsound UNMADE spawn SKULLEXPLOSION killit } } ifvarg targetlock 0 subvar targetlock 1 state SUPERNATURAL_DAMAGE_MODIFIER state ignore_ally_damage ifaction AFSORCERER_FROZEN state frozen_code else ifai AIFSORCERERDYING { cstat 0 spriteflags 39 setactor[THISACTOR].shade -64 ifactioncount 7 fall ifactioncount 8 killit } else ifai AIFSORCERERPAIN { move MSORCERERSTOP ifactioncount 3 ai AIFSORCERERFLOAT } else ifhitweapon { soundonce PRIEST_PAIN spawn BLOOD guts JIBS6 1 state random_wall_jibs ifwasweapon RPG { setactor[THISACTOR].xvel 5 } ifdead { ifwasweapon 7159 { spritepal 1 strength 1 sound SOMETHINGFROZE action AFSORCERER_FROZEN } else ifwasweapon 6875 { setvar WEP3_BLOODY 21 } // else ifwasweapon FREEZEBLAST { spritepal 1 strength 1 sound SOMETHINGFROZE action AFSORCERER_FROZEN } else { sound PRIEST_DEATH ai AIFSORCERERDYING state rf } } else ifrnd 16 ai AIFSORCERERPAIN } else ifai AIFSORCERERSHOOT { spriteflags 39 setactor[THISACTOR].shade -64 ifactioncount 3 { ldist TEMP THISACTOR target getactor[THISACTOR].z TEMP2 subvar TEMP2 8192 // Offset the Z. Assumes the center of the actor is the same as the player getactor[target].z TEMP3 subvar TEMP3 8592 // Offset the Z. assumes the center of the actor is the same as the player subvarvar TEMP3 TEMP2 shiftvarl TEMP3 8 ifvarn TEMP3 0 ifvarn TEMP 0 divvarvar TEMP3 TEMP ezshoot TEMP3 PRIEST_BLAST setthisprojectile[RETURN].extra 140 ai AIFSORCERERFLOAT resetactioncount } } else ifai AIFSORCERERSTOP { ifpdistl 1024 ifp pfacing ifhitspace ifvare INTERNALCOUNT_2 0 { ifvare FOLLOW_PLAYER 0 { ifrnd 128 soundonce SORC_FOLLOW1 else soundonce SORC_FOLLOW2 setvar FOLLOW_PLAYER 1 } else ifvare FOLLOW_PLAYER 1 { ifrnd 128 soundonce SORC_GUARD1 else soundonce SORC_GUARD2 setvar FOLLOW_PLAYER 0 } setvar INTERNALCOUNT_2 26 } ifpdistg 1568 ifvare FOLLOW_PLAYER 1 ai AIFSORCERERFLOAT } else ifai AIFSORCERERFLOAT { ifvare FOLLOW_PLAYER 0 ai AIFSORCERERSTOP sizeto 40 40 spriteflags 35 ifpdistg 8098 ifvare target -1 ifrnd 16 { getplayer[THISACTOR].posx TEMP getplayer[THISACTOR].posy TEMP2 setvarvar TEMP3 TEMP addvar TEMP3 1024 randvar TEMP4 2048 rotatepoint TEMP TEMP2 TEMP3 TEMP2 TEMP4 TEMP5 TEMP6 updatesector TEMP5 TEMP6 TEMP7 ifvarn TEMP7 -1 { setvar INTERNALCOUNT 0 ai AIFSORCERERTELEPORT resetcount } } else ifrnd 128 { ifp phigher ai AIFSORCERERFLOATUP else { getactor[THISACTOR].z z getplayer[THISACTOR].posz TEMP ifvarvarg TEMP z ai AIFSORCERERFLOATDOWN } } else ifpdistl 1568 ai AIFSORCERERSTOP } else ifai AIFSORCERERTELEPORT { addvar INTERNALCOUNT 1 spawn FRAMEEFFECT1 ifvare INTERNALCOUNT 4 { cstat 2 soundonce PRIEST_CAST02 sizeto 2 40 } ifvare INTERNALCOUNT 26 { cstat 32768 getplayer[THISACTOR].posx TEMP getplayer[THISACTOR].posy TEMP2 setvarvar TEMP3 TEMP addvar TEMP3 1024 randvar TEMP4 2048 rotatepoint TEMP TEMP2 TEMP3 TEMP2 TEMP4 TEMP5 TEMP6 updatesector TEMP5 TEMP6 TEMP7 ifvarn TEMP7 -1 { spawn 8433 setactor[THISACTOR].x TEMP5 setactor[THISACTOR].y TEMP6 getplayer[THISACTOR].posz TEMP8 subvar TEMP8 1754 setactor[THISACTOR].z TEMP8 } else { cstat 257 sizeat 40 40 ai AIFSORCERERFLOAT } } ifvare INTERNALCOUNT 27 { soundonce PRIEST_APPEAR cstat 2 sizeto 40 40 spawn 8433 } ifvare INTERNALCOUNT 40 { cstat 257 sizeat 40 40 ai AIFSORCERERFLOAT } } else ifai AIFSORCERERTELEPORT_ENEMY { addvar INTERNALCOUNT 1 spawn FRAMEEFFECT1 ifvare INTERNALCOUNT 4 { cstat 2 soundonce PRIEST_CAST02 sizeto 2 40 } ifvare INTERNALCOUNT 26 { cstat 32768 getactor[target].x TEMP getactor[target].y TEMP2 setvarvar TEMP3 TEMP addvar TEMP3 1024 randvar TEMP4 2048 rotatepoint TEMP TEMP2 TEMP3 TEMP2 TEMP4 TEMP5 TEMP6 updatesector TEMP5 TEMP6 TEMP7 ifvarn TEMP7 -1 { spawn 8433 setactor[THISACTOR].x TEMP5 setactor[THISACTOR].y TEMP6 getactor[target].z TEMP8 subvar TEMP8 1754 setactor[THISACTOR].z TEMP8 } else { cstat 257 sizeat 40 40 ai AIFSORCERERFLOAT } } ifvare INTERNALCOUNT 27 { soundonce PRIEST_APPEAR cstat 2 sizeto 40 40 spawn 8433 } ifvare INTERNALCOUNT 40 { cstat 257 sizeat 40 40 ai AIFSORCERERFLOAT } } else ifai AIFSORCERERFLOATUP { ifrnd 16 ai AIFSORCERERFLOAT } else ifai AIFSORCERERFLOATDOWN { ifrnd 16 ai AIFSORCERERFLOAT } ifcount 13 { ifdead break state botfindtarget ifai AIFSORCERERTELEPORT_ENEMY break ifai AIFSORCERERTELEPORT break ifai AIFSORCERERSHOOT break ifvarn target -1 { ldist xydist THISACTOR target ifrnd 64 ifvarg xydist 2048 // 192 512 { getactor[target].x TEMP getactor[target].y TEMP2 setvarvar TEMP3 TEMP addvar TEMP3 1024 randvar TEMP4 2048 rotatepoint TEMP TEMP2 TEMP3 TEMP2 TEMP4 TEMP5 TEMP6 updatesector TEMP5 TEMP6 TEMP7 ifvarn TEMP7 -1 { setvar INTERNALCOUNT 0 ai AIFSORCERERTELEPORT_ENEMY resetcount } } else { ifrnd 16 soundonce SORC_ATTACK1 else ifrnd 16 soundonce SORC_ATTACK2 else ifrnd 16 soundonce SORC_ATTACK3 else ifrnd 16 soundonce SORC_ATTACK4 soundonce PRIEST_CAST01 ai AIFSORCERERSHOOT } } resetcount } state ENEMYKNOCKBACKS enda
Partager