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