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