Cube  Diff

Differences From Artifact [d5d4aa755b]:

To Artifact [48ff54c543]:


1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16








+







// weapon.cpp: all shooting and effects code

#include "cube.h"

#import "Command.h"
#import "DynamicEntity.h"
#import "Monster.h"
#import "OFString+Cube.h"
#import "Player.h"
#import "Projectile.h"

static const int MONSTERDAMAGEFACTOR = 4;
#define SGRAYS 20
static const float SGSPREAD = 2;
static OFVector3D sg[SGRAYS];

30
31
32
33
34
35
36


37
38
39
40
41
42
43
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46







+
+








void
selectgun(int a, int b, int c)
{
	if (a < -1 || b < -1 || c < -1 || a >= NUMGUNS || b >= NUMGUNS ||
	    c >= NUMGUNS)
		return;

	Player *player1 = Player.player1;
	int s = player1.gunSelect;
	if (a >= 0 && s != a && player1.ammo[a])
		s = a;
	else if (b >= 0 && s != b && player1.ammo[b])
		s = b;
	else if (c >= 0 && s != c && player1.ammo[c])
		s = c;
108
109
110
111
112
113
114

115
116


117
118
119
120
121
122
123
124
125
126
111
112
113
114
115
116
117
118


119
120
121
122

123
124
125
126
127
128
129







+
-
-
+
+


-








OFString *
playerincrosshair()
{
	if (demoplayback)
		return NULL;

	OFVector3D o = Player.player1.origin;
	for (id player in players) {
		if (player == [OFNull null])
	for (Player *player in players) {
		if (![Player isKindOfClass:Player.class])
			continue;

		OFVector3D o = player1.origin;
		if (intersect(player, o, worldpos))
			return [player name];
	}

	return nil;
}

158
159
160
161
162
163
164
165
166


167
168
169
170



171
172
173
174
175
176
177
161
162
163
164
165
166
167


168
169
170
171


172
173
174
175
176
177
178
179
180
181







-
-
+
+


-
-
+
+
+







	}
}

static void
hit(int target, int damage, __kindof DynamicEntity *d, DynamicEntity *at)
{
	OFVector3D o = d.origin;
	if (d == player1)
		selfdamage(damage, at == player1 ? -1 : -2, at);
	if (d == Player.player1)
		selfdamage(damage, (at == Player.player1) ? -1 : -2, at);
	else if ([d isKindOfClass:Monster.class])
		[d incurDamage:damage fromEntity:at];
	else {
		addmsg(1, 4, SV_DAMAGE, target, damage, d.lifeSequence);
	else if ([d isKindOfClass:Player.class]) {
		addmsg(1, 4, SV_DAMAGE, target, damage,
		    ((Player *)d).lifeSequence);
		playsound(S_PAIN1 + rnd(5), &o);
	}
	particle_splash(3, damage, 1000, o);
	demodamage(damage, o);
}

const float RL_RADIUS = 5;
215
216
217
218
219
220
221
222

223
224
225
226
227
228
229
219
220
221
222
223
224
225

226
227
228
229
230
231
232
233







-
+







		playsound(S_RLHIT, &v);
		newsphere(v, RL_RADIUS, 0);
		dodynlight(vold, v, 0, 0, p.owner);

		if (!p.local)
			return;

		radialeffect(player1, v, -1, qdam, p.owner);
		radialeffect(Player.player1, v, -1, qdam, p.owner);

		[players enumerateObjectsUsingBlock:^(
		    id player, size_t i, bool *stop) {
			if (i == notthisplayer)
				return;

			if (player == [OFNull null])
275
276
277
278
279
280
281
282
283


284
285
286
287
288
289
290
279
280
281
282
283
284
285


286
287
288
289
290
291
292
293
294







-
-
+
+







		v = OFMultiplyVector3D(v, time / dtime);
		v = OFAddVectors3D(v, po);
		if (p.local) {
			for (id player in players)
				if (player != [OFNull null])
					projdamage(player, p, v, i, -1, qdam);

			if (p.owner != player1)
				projdamage(player1, p, v, -1, -1, qdam);
			if (p.owner != Player.player1)
				projdamage(Player.player1, p, v, -1, -1, qdam);

			for (Monster *monster in Monster.monsters)
				if (!vreject(monster.origin, v, 10.0f) &&
				    monster != p.owner)
					projdamage(monster, p, v, -1, i, qdam);
		}
		if (p.inuse) {
306
307
308
309
310
311
312
313

314
315
316
317
318
319
320
310
311
312
313
314
315
316

317
318
319
320
321
322
323
324







-
+







}

// create visual effect from a shot
void
shootv(int gun, OFVector3D from, OFVector3D to, DynamicEntity *d, bool local)
{
	OFVector3D loc = d.origin;
	playsound(guns[gun].sound, d == player1 ? NULL : &loc);
	playsound(guns[gun].sound, (d == Player.player1) ? NULL : &loc);
	int pspeed = 25;
	switch (gun) {
	case GUN_FIST:
		break;

	case GUN_SG: {
		for (int i = 0; i < SGRAYS; i++)
434
435
436
437
438
439
440
441

442
438
439
440
441
442
443
444

445
446







-
+

	}];

	for (Monster *monster in Monster.monsters)
		if (monster != d)
			raydamage(monster, from, to, d, -2);

	if ([d isKindOfClass:Monster.class])
		raydamage(player1, from, to, d, -1);
		raydamage(Player.player1, from, to, d, -1);
}