ftp.nice.ch/pub/next/tools/screen/backspace/Fly.NIHS.bs.tar.gz#/FlyView.BackModule/FlyLogic.m

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

#import "FlyLogic.h"
#import "FlyCommon.h"

@implementation FlyLogic

- setBoundsRect:(NXRect *)r
{
	NXSetRect(&bounds, r->origin.x, r->origin.y, r->size.width, r->size.height);
	return self;
}

- getNewHeading:(Fly *)fly
{
	long	rand;
	long	head;
	rand = random() % 100;

	head = [fly heading];

	if (rand < [fly noTurn]) {
		return self;
	} else if (rand < [fly leftTurn]) {
		if (head == kMinDir) {
			[fly setHeading:kMaxDir];
		} else {
			[fly setHeading:--head];
		} 		
	} else {
		if (head == kMaxDir) {
			[fly setHeading:kMinDir];
		} else {
			[fly setHeading:++head];
		}
	}
	return self;
}

- getStateAndTurn:(Fly *)fly
{
	float	speed		= 0;
	long	noTurn		= 0;
	long	leftTurn	= 0;
	long	statePeriod = 0;
	
	speed = [fly speed];
	
	if (speed <= 2) {
		noTurn = 95;
		leftTurn = 97;
		statePeriod = 100;
	} else if (speed <= 4) {
		noTurn = 86;
		leftTurn = 93;
		statePeriod = 75;
	} else if (speed <= 10) {
		noTurn = 80;
		leftTurn = 90;
		statePeriod = 50;
	} else if (speed <= 20) {
		noTurn = 70;
		leftTurn = 85;
		statePeriod = 37;
	} else if (speed <= 30) {
		noTurn = 60;
		leftTurn = 80;
		statePeriod = 25;
	}

	[fly setPeriod:statePeriod];
	[fly setNoTurn:noTurn andLeftTurn:leftTurn];

	return self;
}

- adjustPosition:(Fly *)fly
{
	NXPoint	*pos;
	long	heading;

	pos = [fly position];
	heading = [fly heading];

	switch(heading) {
		case kEast:
		case kNorthEast:
		case kSouthEast:
			pos->x += [fly speed];
			break;

		case kWest:
		case kNorthWest:
		case kSouthWest:
			pos->x -= [fly speed];
			break;

		default:
			break;
	}

	if (pos->x > bounds.size.width) {
		pos->x = bounds.origin.x - (kFlyCellWidth - 1); 
	} else if (pos->x < bounds.origin.x - (kFlyCellWidth - 1)) {
		pos->x = bounds.size.width;
	}

	switch(heading) {
		case kNorth:
		case kNorthEast:
		case kNorthWest:
			pos->y += [fly speed];
			break;

		case kSouth:
		case kSouthEast:
		case kSouthWest:
			pos->y -= [fly speed];
			break;

		default:
			break;
	}

	if (pos->y > bounds.size.height) {
		pos->y = bounds.origin.y - (kFlyCellHeight - 1);
	} else if (pos->y < bounds.origin.y - (kFlyCellHeight - 1)) {
		pos->y = bounds.size.height;
	}

	return self;
}

- randomPosition:(Fly *)fly
{
	NXPoint	p;

	p.x = random() % (long)bounds.size.width;
	p.y = random() % (long)bounds.size.height;
	[fly setPosition:p];

	return self;
}

@end

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