ftp.nice.ch/pub/next/games/action/xox/xox.940213.s.tar.gz#/xoxsrc.940213/xoxsrc/Xoxeroids.bproj/RocketMatrix.m

This is RocketMatrix.m in view mode; [Download] [Up]

#import "RocketMatrix.h"
#import "ActorMgr.h"
#import "SoundMgr.h"
#import "Explosion.h"
#import "Xoxeroids.h"
#import "Rocket.h"

@interface DumbRocket:Rocket
{
	int maxHits;
}
@end

@implementation DumbRocket
- activate:sender :(int)tag
{
	NXSize tsize = {42,42};
	NXSize tsize2 = {21,21};
	Actor *dude = (Actor *)sender;

	employed = YES;

	[self reinitWithImage:"rocket1"
		frameSize:&tsize
		numFrames:24
		shape: RECTCIRC
		alliance: EVIL
		radius: 21
		buffered: YES
		x: dude->x
		y: dude->y
		theta: dude->theta
		vel: dude->vel
		interval: 50
		distToCorner: &tsize2];

	hits = 0;
	maxHits = randBetween(3,6);
	thrustState = maxHits;
	return self;
}

- positionChanged
{
	float t_theta;
	if (timeInMS > changeTime)
	{
		changeTime = timeInMS + interval;
		if (++thrustState & 1) image = r1;
		else image = r2;
	}

	t_theta = theta + (7.5 * PI / 180.0);
	if (t_theta >= 2.0*PI) t_theta -= 2.0*PI;
	frame = (t_theta/(15.0 * PI / 180.0));

	return self;
}

- performCollisionWith:(Actor *) dude
{
	id ret = self;
	if (++hits >= maxHits)
	{
		[soundMgr playSound: (EXP2SND) at:0.5];
		[actorMgr newActor:xx_explosion for:self tag:1];
		ret = [super performCollisionWith: dude];
	}
	else
	{
//		[soundMgr playSound: FUTILITYSND at:0.5];
	}

	return ret;
}
@end

@implementation RocketMatrix

- activate:sender :(int)tag
{
	MatrixData md;

	md.autofill = YES;
	md.whichClass = [DumbRocket class];
	md.alliance = EVIL;
	md.x = randBetween(xOffset,5*xOffset);
	md.y = randBetween(yOffset,5*yOffset);
	md.theta = randBetween(0,2*PI);
	md.vel = randBetween(7,12);
	md.rows = randBetween(4,6.9);
	md.columns = 4;
	md.xgap = randBetween(20,50);
	md.ygap = randBetween(20,50);
	md.actWidth = 42;
	md.actHeight = 42;
	md.interval = 200;
	md.modifyThetas = YES;

	[super activate:self :(int)&md];
	return self;
}

- positionChanged
{
	[self wrapAtDistance: (3*xOffset) :(3*yOffset)];
	while (theta < 0) theta += (2*PI);
	while (theta >= (2*PI)) theta -= (2*PI);
	return self;
}

- calcDxDy:(NXPoint *)dp
{
	if (timeInMS > changeTime)
	{
		changeTime = timeInMS + interval;
		theta += randBetween(-PI/10.0,PI/10.0);
		xv = vel * -sin(theta);
		yv = vel * cos(theta);
	}
	[super calcDxDy:dp];
	return self;
}

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.