All pastes #591518 Raw Edit

Mine

public text v1 · immutable
#591518 ·published 2007-06-27 08:01 UTC
rendered paste body
- (void)decode
{
	// Take string
	const char *parseString = [chunk UTF8String];
	int len = [chunk length];
	
	// Create an array for the $ separated commands
	NSMutableArray *commands = [[NSMutableArray alloc] init];
	int i = 0;
	int previous = 0;
	NSRange range;
	while (i < len-1)
	{
		while (parseString[i] != '$')
			i++;
		range.location = previous;
		range.length = i - previous;
		[commands addObject: [chunk substringWithRange:range]];
		i++;
		previous = i;
	}

	NSMutableArray *parsedCommands = [[NSMutableArray alloc] init];
	
	// Now we have an array of strings, each containing a string of each command
	int numCommands = [commands count];
	for (i = previous = 0; i < numCommands; i++)
	{
		NSMutableArray *command = [[NSMutableArray alloc] init];
		// Take a command string
		NSString *currentCommand = [commands objectAtIndex:i];
		parseString = [currentCommand UTF8String];
		int j = 0;
		previous = 0;
		// Loop through, converting the numbers between semicolons to NSNumbers in a mutable array
		while (j < [currentCommand length])
		{	
			while (parseString[j] != ';' && j < [currentCommand length])
				j++;
			range.location = previous;
			range.length = j - previous;
			[command addObject:[NSNumber numberWithInt:[[currentCommand substringWithRange:range] intValue]]];
			j++;
			previous = j;
		}
		// Add the completed array to the overall parsed commands array
		[parsedCommands addObject:command];
	}
	
	// Now that the commands are fully decoded, act on them

	for (i = 0; i < [parsedCommands count]; i++)
	{	
		int shape;	// What kind of shape it is, if any
		
		// Take a command
		NSMutableArray *currentCommand = [parsedCommands objectAtIndex:i];
		int gridOffset;
		if ([[currentCommand objectAtIndex:0] intValue] == 1)
			gridOffset = 2;
		else
			gridOffset = 1;
		if ([currentCommand count] > 1)
			grid = [[gridTabControllers objectAtIndex:[[currentCommand objectAtIndex:[currentCommand count]-gridOffset] intValue]] gridView];
		int orientation;
		switch ([[currentCommand objectAtIndex:0] intValue])
		{
			case 0: // Maxi-clear
				while ([[tabView tabViewItems] count] > 0)
				{	
					[tabView removeTabViewItem:[[tabView tabViewItems] objectAtIndex:0]];
					[gridTabControllers removeObjectAtIndex:0];
				}
				[self addTab];
				grid = [[gridTabControllers objectAtIndex:0] gridView];
				break;
			case 1:	// Circle
				shape = ItemCircle;
				NSLog(@"Circle!");
				break;
			case 2: // Clear token
				1;
				GridItem *modified = [grid gridItemAtX:[[currentCommand objectAtIndex:2] intValue] 
												   atY:19-[[currentCommand objectAtIndex:1] intValue]];
				[modified setShape:ItemNone];
				/*if ([modified covered] == 1)
				{
					GridItem *bigToken = [grid gridItemAtX:[modified coveredX] atY:19-[modified coveredY]];
					[bigToken setShape:ItemNone];
					int j, k;
					for (j = 0; j < [bigToken size]; j++)
					{
						for (k = 0; k < [bigToken size]; k++)
						{
							[[grid gridItemAtX:j+[bigToken x] atY:[bigToken y]-k] setCovered:0];
						}
					}
				}*/
				break;
			case 3: // Square
				shape = ItemSquare;
				break;
			case 5: // Line
				if ([[currentCommand objectAtIndex:1] intValue] == 0)
					orientation = ItemHorizontal;
				else
					orientation = ItemVertical;
				GridItem *line = [grid gridItemAtX:[[currentCommand objectAtIndex:3] intValue]
											   atY:(orientation==ItemHorizontal?20:19)-[[currentCommand objectAtIndex:2] intValue]
								   withOrientation:orientation];
				[line setShape:orientation];
				[line setColorWithRed:[[currentCommand objectAtIndex:4] intValue]
							withGreen:[[currentCommand objectAtIndex:5] intValue]
							 withBlue:[[currentCommand objectAtIndex:6] intValue]];
				break;
			case 6: // Clear line
				if ([[currentCommand objectAtIndex:1] intValue] == 0)
					orientation = ItemHorizontal;
				else
					orientation = ItemVertical;
				GridItem *lineToClear = [grid gridItemAtX:[[currentCommand objectAtIndex:3] intValue]
													  atY:(orientation==ItemHorizontal?20:19)-[[currentCommand objectAtIndex:2] intValue]
										  withOrientation:orientation];
				[lineToClear setShape:ItemNone];
				break;
			case 7: // Background/foreground colour settings and grid clear
				[grid setBackgroundColorWithRed:[[currentCommand objectAtIndex:1] intValue]
									  withGreen:[[currentCommand objectAtIndex:2] intValue]
									   withBlue:[[currentCommand objectAtIndex:3] intValue]];
				[grid setForegroundColorWithRed:[[currentCommand objectAtIndex:4] intValue]
									  withGreen:[[currentCommand objectAtIndex:5] intValue]
									   withBlue:[[currentCommand objectAtIndex:6] intValue]];
				// It is also expected that the grid is cleared by this command
				[grid clearGrid];
				break;
			case 9:	// Triangle
				shape = ItemTriangle;
				break;
			case 11:	// Cross
				shape = ItemCross;
				break;
			case 15:	// New tab
				[self addTab];
				[tabView selectLastTabViewItem:self];
				break;
			case 16:	// Remove tab
				[self removeTab:[[currentCommand objectAtIndex:1] intValue]];
			default:	// Anything that we don't understand
				break;
		}
		// If it's a shape
		if ([[currentCommand objectAtIndex:0] intValue] == 1 ||
			[[currentCommand objectAtIndex:0] intValue] == 3 ||
			[[currentCommand objectAtIndex:0] intValue] == 9 ||
			[[currentCommand objectAtIndex:0] intValue] == 11)
		{
			// Set all the settings for the gridItem
			GridItem *modified = [grid gridItemAtX:[[currentCommand objectAtIndex:2] intValue] 
											   atY:19-[[currentCommand objectAtIndex:1] intValue]];
			[modified setShape:shape];
			[modified setX:[[currentCommand objectAtIndex:2] intValue]];
			[modified setY:19-[[currentCommand objectAtIndex:1] intValue]];
			[modified setColorWithRed:[[currentCommand objectAtIndex:3] intValue]
							withGreen:[[currentCommand objectAtIndex:4] intValue]
							 withBlue:[[currentCommand objectAtIndex:5] intValue]];
			/*if ([[currentCommand objectAtIndex:0] intValue] == 1) {
				[modified setSize:[[currentCommand objectAtIndex:7] intValue]];
				NSLog(@"Made it here: %d", [modified y]);
				int j, k;
				for (j = 0; j < [modified size]; j++)
				{
					for (k = 0; k < [modified size]; k++)
					{
						if (!(j == 0 && k == 0)) {
							[[grid gridItemAtX:j+[modified x] atY:[modified y]-k] setShape:ItemNone];
							[[grid gridItemAtX:j+[modified x] atY:[modified y]-k] setCovered:1];
							[[grid gridItemAtX:j+[modified x] atY:[modified y]-k] setCoveredX:[modified x] Y:[modified y]];
						}
					}
				}
			}*/
			//NSLog(@"made it here too");
				
		}
		// Something's been changed, so ensure the GridView is redrawn
		[grid setNeedsDisplay:YES];		
	}

}