1 /* KJL 16:20:30 30/09/98 - Paintball.c */
2 #include "3dc.h"
3 #include "module.h"
4 #include "inline.h"
5 #include "kshape.h"
6
7 #include "paintball.h"
8 #include "showcmds.h"
9 #define DECAL_Z_OFFSET 5
10
11 PAINTBALLMODE PaintBallMode;
12
13 extern int NormalFrameTime;
14
TogglePaintBallMode(void)15 extern void TogglePaintBallMode(void)
16 {
17 PaintBallMode.IsOn = ~PaintBallMode.IsOn;
18
19 if (PaintBallMode.IsOn)
20 {
21 extern DECAL_DESC DecalDescription[];
22
23 PaintBallMode.CurrentDecalID = FIRST_PAINTBALL_DECAL;
24 PaintBallMode.CurrentDecalSubclass = 0;
25 PaintBallMode.CurrentDecalSize = DecalDescription[FIRST_PAINTBALL_DECAL].MinSize;
26 PaintBallMode.CurrentDecalRotation = 0;
27 PaintBallMode.DecalIsInverted = 0;
28 }
29 }
30
31 DECAL CurrentDecal;
32
PaintBallMode_DrawCurrentDecalAtTarget(void)33 extern void PaintBallMode_DrawCurrentDecalAtTarget(void)
34 {
35 extern DECAL_DESC DecalDescription[];
36 DECAL_DESC *decalDescPtr = &DecalDescription[PaintBallMode.CurrentDecalID];
37 extern void MakeMatrixFromDirection(VECTORCH *directionPtr, MATRIXCH *matrixPtr);
38 extern MODULE *playerPherModule;
39
40 MATRIXCH orientation;
41 int sin = MUL_FIXED(PaintBallMode.CurrentDecalSize,GetSin(PaintBallMode.CurrentDecalRotation));
42 int cos = MUL_FIXED(PaintBallMode.CurrentDecalSize,GetCos(PaintBallMode.CurrentDecalRotation));
43 int z = DECAL_Z_OFFSET;
44 if (!PaintBallMode.TargetDispPtr) return;
45
46 if (! (PaintBallMode.TargetDispPtr->ObMyModule&&(!PaintBallMode.TargetDispPtr->ObMorphCtrl)) )
47 {
48 return;
49 }
50
51 CurrentDecal.DecalID = PaintBallMode.CurrentDecalID;
52
53 if(PaintBallMode.DecalIsInverted)
54 {
55 PaintBallMode.TargetNormal.vx = -PaintBallMode.TargetNormal.vx;
56 PaintBallMode.TargetNormal.vy = -PaintBallMode.TargetNormal.vy;
57 PaintBallMode.TargetNormal.vz = -PaintBallMode.TargetNormal.vz;
58 z = -z;
59 }
60
61 MakeMatrixFromDirection(&PaintBallMode.TargetNormal,&orientation);
62
63 CurrentDecal.Vertices[0].vx = (-cos) - (-sin);
64 CurrentDecal.Vertices[0].vy = (-sin) + (-cos);
65 CurrentDecal.Vertices[0].vz = z;
66 RotateVector(&(CurrentDecal.Vertices[0]),&orientation);
67 CurrentDecal.Vertices[0].vx += PaintBallMode.TargetPosition.vx;
68 CurrentDecal.Vertices[0].vy += PaintBallMode.TargetPosition.vy;
69 CurrentDecal.Vertices[0].vz += PaintBallMode.TargetPosition.vz;
70
71
72 CurrentDecal.Vertices[1].vx = (cos) - (-sin);
73 CurrentDecal.Vertices[1].vy = (sin) + (-cos);
74 CurrentDecal.Vertices[1].vz = z;
75 RotateVector(&(CurrentDecal.Vertices[1]),&orientation);
76 CurrentDecal.Vertices[1].vx += PaintBallMode.TargetPosition.vx;
77 CurrentDecal.Vertices[1].vy += PaintBallMode.TargetPosition.vy;
78 CurrentDecal.Vertices[1].vz += PaintBallMode.TargetPosition.vz;
79
80 CurrentDecal.Vertices[2].vx = (cos) - (sin);
81 CurrentDecal.Vertices[2].vy = (sin) + (cos);
82 CurrentDecal.Vertices[2].vz = z;
83 RotateVector(&(CurrentDecal.Vertices[2]),&orientation);
84 CurrentDecal.Vertices[2].vx += PaintBallMode.TargetPosition.vx;
85 CurrentDecal.Vertices[2].vy += PaintBallMode.TargetPosition.vy;
86 CurrentDecal.Vertices[2].vz += PaintBallMode.TargetPosition.vz;
87
88 CurrentDecal.Vertices[3].vx = (-cos) - (sin);
89 CurrentDecal.Vertices[3].vy = (-sin) + (cos);
90 CurrentDecal.Vertices[3].vz = z;
91 RotateVector(&(CurrentDecal.Vertices[3]),&orientation);
92 CurrentDecal.Vertices[3].vx += PaintBallMode.TargetPosition.vx;
93 CurrentDecal.Vertices[3].vy += PaintBallMode.TargetPosition.vy;
94 CurrentDecal.Vertices[3].vz += PaintBallMode.TargetPosition.vz;
95
96 CurrentDecal.ModuleIndex = playerPherModule->m_index;
97
98 CurrentDecal.UOffset = PaintBallMode.CurrentDecalSubclass*decalDescPtr->UOffsetForSubclass;
99 RenderDecal(&CurrentDecal);
100
101 {
102 PrintDebuggingText("PAINTBALL MODE ACTIVE\n");
103 PrintDebuggingText("TOTAL PRE-DECALS: %d OUT OF 1024\n",NumFixedDecals);
104 }
105
106 }
107
PaintBallMode_ChangeSelectedDecalID(int delta)108 extern void PaintBallMode_ChangeSelectedDecalID(int delta)
109 {
110 extern DECAL_DESC DecalDescription[];
111
112 PaintBallMode.CurrentDecalID += delta;
113
114 if (PaintBallMode.CurrentDecalID>LAST_PAINTBALL_DECAL)
115 {
116 PaintBallMode.CurrentDecalID=FIRST_PAINTBALL_DECAL;
117 }
118 else if (PaintBallMode.CurrentDecalID<FIRST_PAINTBALL_DECAL)
119 {
120 PaintBallMode.CurrentDecalID=LAST_PAINTBALL_DECAL;
121 }
122
123 PaintBallMode.CurrentDecalSubclass = 0;
124 PaintBallMode.CurrentDecalSize = DecalDescription[PaintBallMode.CurrentDecalID].MaxSize;
125
126 }
127
PaintBallMode_ChangeSize(int delta)128 extern void PaintBallMode_ChangeSize(int delta)
129 {
130 extern DECAL_DESC DecalDescription[];
131 DECAL_DESC *decalDescPtr = &DecalDescription[PaintBallMode.CurrentDecalID];
132
133 if (delta>0)
134 {
135 PaintBallMode.CurrentDecalSize+=NormalFrameTime>>6;
136 if (PaintBallMode.CurrentDecalSize>decalDescPtr->MaxSize*2)
137 PaintBallMode.CurrentDecalSize=decalDescPtr->MaxSize*2;
138 }
139 else
140 {
141 PaintBallMode.CurrentDecalSize-=NormalFrameTime>>6;
142 if (PaintBallMode.CurrentDecalSize<decalDescPtr->MinSize)
143 PaintBallMode.CurrentDecalSize=decalDescPtr->MinSize;
144 }
145 }
146
PaintBallMode_Rotate(void)147 extern void PaintBallMode_Rotate(void)
148 {
149 PaintBallMode.CurrentDecalRotation += NormalFrameTime>>5;
150 PaintBallMode.CurrentDecalRotation &= 4095;
151 }
152
PaintBallMode_ChangeSubclass(int delta)153 extern void PaintBallMode_ChangeSubclass(int delta)
154 {
155 extern DECAL_DESC DecalDescription[];
156 DECAL_DESC *decalDescPtr = &DecalDescription[PaintBallMode.CurrentDecalID];
157
158 PaintBallMode.CurrentDecalSubclass += delta;
159
160 if (PaintBallMode.CurrentDecalSubclass>decalDescPtr->MaxSubclassNumber)
161 {
162 PaintBallMode.CurrentDecalSubclass=0;
163 }
164 else if (PaintBallMode.CurrentDecalSubclass<0)
165 {
166 PaintBallMode.CurrentDecalSubclass=decalDescPtr->MaxSubclassNumber;
167 }
168
169 }
170
171
PaintBallMode_AddDecal(void)172 extern void PaintBallMode_AddDecal(void)
173 {
174 FIXED_DECAL *newDecalPtr = AllocateFixedDecal();
175
176 if (!newDecalPtr) return;
177
178 newDecalPtr->DecalID = CurrentDecal.DecalID;
179 newDecalPtr->Vertices[0] = CurrentDecal.Vertices[0];
180 newDecalPtr->Vertices[1] = CurrentDecal.Vertices[1];
181 newDecalPtr->Vertices[2] = CurrentDecal.Vertices[2];
182 newDecalPtr->Vertices[3] = CurrentDecal.Vertices[3];
183 newDecalPtr->ModuleIndex = CurrentDecal.ModuleIndex;
184 newDecalPtr->UOffset = CurrentDecal.UOffset;
185 }
PaintBallMode_RemoveDecal(void)186 extern void PaintBallMode_RemoveDecal(void)
187 {
188 RemoveFixedDecal();
189 }
190
PaintBallMode_Randomise(void)191 extern void PaintBallMode_Randomise(void)
192 {
193 extern DECAL_DESC DecalDescription[];
194 DECAL_DESC *decalDescPtr = &DecalDescription[PaintBallMode.CurrentDecalID];
195
196 int randomScale = ONE_FIXED+4096 - (FastRandom()&8191);
197
198 PaintBallMode.CurrentDecalSize = MUL_FIXED(PaintBallMode.CurrentDecalSize,randomScale);
199
200 if (PaintBallMode.CurrentDecalSize>decalDescPtr->MaxSize)
201 {
202 PaintBallMode.CurrentDecalSize=decalDescPtr->MaxSize;
203 }
204 if (PaintBallMode.CurrentDecalSize<decalDescPtr->MinSize)
205 {
206 PaintBallMode.CurrentDecalSize=decalDescPtr->MinSize;
207 }
208
209 PaintBallMode.CurrentDecalRotation = FastRandom()&4095;
210
211 }
212