- (void)redraw
{
	//NSLog(@"Begin Redraw");
	
	int i,j;
	unsigned char b1,b2;
	unsigned char b3 = 0;
	unsigned char flags;
	
	objx = 0;
	objy = 0;
	
	for (i=0; i<[self numberOfRows]; i++) {
		for (j=0; j<[self numberOfColumns]; j++) {
			[[self cellAtRow:i column:j] setImage:[tiles objectAtIndex:0]];
		}
	}
	
	// Ceiling and Floor //
	
	flags = areaData[cw][ca][2];
	[self drawCF:0 code:flags];				// Incorporate the function into this one...
	//NSLog(@"Initial CF %X",flags);
	
	// Should be load behind map here //
	
	// Layers - Bushes and Grass //
	
	flags = areaData[cw][ca][1];
	if (((flags & 0x04) >> 2) == 1) {
		for (i=0; i<0x40; i++) {
			[[self cellAtRow:0x09 column:i] setImage:[tiles objectAtIndex:0x83]];
		}
	}
	
	if (((flags & 0x08) >> 3) == 1) {
	for (i=0; i<0x40; i++) {
			[[self cellAtRow:0x0A column:i] setImage:[tiles objectAtIndex:0x84]];
		}
	}
	
	// Area Data //
	
	objx = 0;
	objy = 0;
	
	for (i=4; i<(areaData[cw][ca][0]); i+=2) {
		
		b1 = areaData[cw][ca][i];
		b2 = areaData[cw][ca][i+1]; //NSLog(@"b1b2 : %X %X",b1,b2);
		
		if ((b1 >> 4) == 0x0E) {		// Skip
			objx = (b1 & 0x0F) * 0x10;
			//NSLog(@"Skip"); NSLog(@"----");
			continue;
		}
		
		objx += b1 & 0x0F;
		objy = b1 >> 4;
		length = b2 & 0x0F;
		type = b2 >> 4;
		
		if (objy == 0xD) {  // New Default CF
			[self drawCF:objx code:b2];
			//NSLog(@"New Ceiling : %X",(length > 7 ? (length-6) : 1 ));
			//NSLog(@"New Floor   : %X",(length > 7 ? 2 : (length+2) ));
			//NSLog(@"----");
			continue;
		}
		
		if (objy == 0xE) {
			
		}
		
		if (objy < 0xD) {
			
			if (type == 0) {
				switch (length) {
					case 0x0: NSLog(@"Gravestone"); [self setSingle:0xC5]; break;
					case 0x1: NSLog(@"Cross"); [self setSingle:0xC6]; break;
					case 0x2: NSLog(@"Slanted Cross"); [self setSingle:0xC7]; break;
					case 0x3: NSLog(@"Tree Stump"); [self setVerticalTwo:0x5B]; break;
					case 0x4: NSLog(@"Dolmen"); [self setOther:4]; break;
					case 0x5: NSLog(@"Locked Door"); break;	// Locked Door Object
					case 0x6: NSLog(@"Zelda"); [self setHorizontalTwo:0x4E]; break;
					case 0x7: NSLog(@"Zelda"); [self setHorizontalTwo:0x4E]; break;
					case 0x8: NSLog(@"Hole"); [self setOther:8]; break;
					case 0x9: NSLog(@"Long Cloud"); [self setHorizontalTwo:12]; break;
					case 0xA: NSLog(@"Short Cloud"); [self setHorizontalTwo:13]; break;
				}
			}
			
			if (objSet == 0) {
				switch (type) {
					case 0x1: NSLog(@"Crash"); break;
					case 0x2: NSLog(@"Forest Leaves 2 High"); [self setHorizontalDouble:0x04]; break;
					case 0x3: NSLog(@"Forest Leaves 2 High"); [self setHorizontalDouble:0x06]; break;
					case 0x4: NSLog(@"Curtains"); [self setHorizontalDouble:0x08]; break;
					case 0x5: NSLog(@"Forest Leaves 1 High"); [self setHorizontalSingle:0x0A]; break;
					case 0x6: NSLog(@"Breakable Blocks"); [self setHorizontalSingle:0x0C]; break;
					case 0x7: NSLog(@"Horizontal Pit 1 High"); [self setHorizontalSingle:0x0E]; break;
					case 0x8: NSLog(@"Single Weed"); [self setHorizontalSingle:0x10]; break;
					case 0x9: NSLog(@"Double Weed"); [self setHorizontalSingle:0x12]; break;
					case 0xA: NSLog(@"Carpet"); [self setHorizontalSingle:0x14]; break;
					case 0xB: NSLog(@"Bricks"); [self setHorizontalSingle:0x16]; break;
					case 0xC: NSLog(@"Volcano Brackground"); [self setHorizontalSingle:0x18]; break;
					case 0xD: NSLog(@"Breakable Blocks"); [self setHorizontalSingle:0x1A]; break;
					case 0xE: NSLog(@"Tree Trunk"); [self setVerticalSingle:0x1C]; break;
					case 0xF: NSLog(@"Column"); [self setVerticalSingle:0x1E]; break;
				}
			}
			
			if (objSet == 1) {
				switch (type) {
					case 0x1: NSLog(@"Crash"); break;
					case 0x2: NSLog(@"Rock Floor 2 High"); [self setHorizontalDouble:0x84]; break;
					case 0x3: NSLog(@"Rock Ceiling 2 High"); [self setHorizontalDouble:0x86]; break;
					case 0x4: NSLog(@"Bridge"); [self setHorizontalDouble:0x88]; break;
					case 0x5: NSLog(@"Rock Floor 1 High"); [self setHorizontalSingle:0x8A]; break;
					case 0x6: NSLog(@"Breakable Blocks"); [self setHorizontalSingle:0x8C]; break;
					case 0x7: NSLog(@"Breaking Bridge"); [self setHorizontalSingle:0x8E]; break;
					case 0x8: NSLog(@"Single Weed"); [self setHorizontalSingle:0x90]; break;
					case 0x9: NSLog(@"Double Weed"); [self setHorizontalSingle:0x92]; break;
					case 0xA: NSLog(@"Horizontal Pit"); [self setHorizontalSingle:0x94]; break;
					case 0xB: NSLog(@"Bricks"); [self setHorizontalSingle:0x96]; break;
					case 0xC: NSLog(@"Volcano Background"); [self setVerticalSingle:0x98]; break;
					case 0xD: NSLog(@"Breakable Blocks"); [self setVerticalSingle:0x9A]; break;
					case 0xE: NSLog(@"Rock Floor"); [self setVerticalSingle:0x9C]; break;
					case 0xF: NSLog(@"Vertical Dolmen"); [self setVerticalSingle:0x9E]; break;
				}
			}
		}
		
		if (objy == 0xF) {
			switch (type) {
				case 0x0: NSLog(@"Crash"); break;
				case 0x1: NSLog(@"Crash"); break;
				case 0x2: NSLog(@"Lava"); break;
				case 0x3: NSLog(@"Cactus"); objy = 9; length = 2; [self setVerticalUp:0x46]; break;
				case 0x4: NSLog(@"Cactus with Arm"); objy = 9; length = 1; [self setVerticalUp:0x48]; break;
				case 0x5: NSLog(@"Elevator"); break;
			}
		}
		
		if ((objy < 13) & (b2 == 0xF)) {
			b3 = areaData[cw][ca][i+2];
			NSLog(@"Collectable Object (%02X)",b3);		// Switch collectable objects here...
			[self setItem:b3];
			i++;
		}
		
		//NSLog(@"----");
	}
	
	/*
	for (i=0; i<0x40; i++) {
		[[self cellAtRow:0 column:i] setImage:[tiles objectAtIndex:i]];
		[[self cellAtRow:1 column:i] setImage:[tiles objectAtIndex:i+0x40]];
		[[self cellAtRow:2 column:i] setImage:[tiles objectAtIndex:i+0x80]];
		[[self cellAtRow:3 column:i] setImage:[tiles objectAtIndex:i+0xC0]];
	}
	*/
	
	[self setNeedsDisplay:YES];
	NSLog(@"----");
}