Minor fixes.
1 /* This code is based on Apple's "GeekGameBoard" sample code, version 1.0.
2 http://developer.apple.com/samplecode/GeekGameBoard/
3 Copyright © 2007 Apple Inc. Copyright © 2008 Jens Alfke. All Rights Reserved.
5 Redistribution and use in source and binary forms, with or without modification, are permitted
6 provided that the following conditions are met:
8 * Redistributions of source code must retain the above copyright notice, this list of conditions
9 and the following disclaimer.
10 * Redistributions in binary form must reproduce the above copyright notice, this list of
11 conditions and the following disclaimer in the documentation and/or other materials provided
12 with the distribution.
14 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
15 IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
16 FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRI-
17 BUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
18 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
19 PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
20 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
21 THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 /** Abstract superclass of regular geometric grids of GridCells that Bits can be placed on. */
28 @interface Grid : GGBLayer
30 unsigned _nRows, _nColumns;
33 CGColorRef _cellColor, _lineColor;
34 CGImageRef _backgroundImage;
35 BOOL _usesDiagonals, _allowsMoves, _allowsCaptures;
36 NSMutableArray *_cells; // Really a 2D array, in row-major order.
39 /** Initializes a new Grid with the given dimensions and cell size, and position in superview.
40 Note that a new Grid has no cells! Either call -addAllCells, or -addCellAtRow:column:. */
41 - (id) initWithRows: (unsigned)nRows columns: (unsigned)nColumns
42 spacing: (CGSize)spacing
43 position: (CGPoint)pos;
45 /** Initializes a new Grid with the given dimensions and frame in superview.
46 The cell size will be computed by dividing frame size by dimensions.
47 Note that a new Grid has no cells! Either call -addAllCells, or -addCellAtRow:column:. */
48 - (id) initWithRows: (unsigned)nRows columns: (unsigned)nColumns
51 @property Class cellClass; // What kind of GridCells to create
52 @property (readonly) unsigned rows, columns; // Dimensions of the grid
53 @property (readonly) CGSize spacing; // x,y spacing of GridCells
54 @property CGColorRef cellColor, lineColor; // Cell background color, line color (or nil)
55 @property CGImageRef backgroundImage; // Image drawn in background, behind lines and cells
56 @property BOOL usesDiagonals; // Affects GridCell.neighbors, for rect grids
57 @property BOOL allowsMoves, allowsCaptures; // Can pieces be moved, and can they land on others?
59 @property (readonly) NSArray *cells;
61 /** Returns the GridCell at the given coordinates, or nil if there is no cell there.
62 It's OK to call this with off-the-board coordinates; it will just return nil.*/
63 - (GridCell*) cellAtRow: (unsigned)row column: (unsigned)col;
65 /** Adds cells at all coordinates, creating a complete grid. */
68 /** Adds a GridCell at the given coordinates. */
69 - (GridCell*) addCellAtRow: (unsigned)row column: (unsigned)col;
71 /** Removes a particular cell, leaving a blank space. */
72 - (void) removeCellAtRow: (unsigned)row column: (unsigned)col;
74 - (GridCell*) cellWithName: (NSString*)identifier;
76 /** Returns all of the Players who have any Bits on the grid, with each Player's count being the
78 - (NSCountedSet*) countPiecesByPlayer;
81 /** Utility to get and set the entire state of the Grid. The stateString is made by concatenating
82 the name of the Bit of every GridCell in order, with "-" for empty cells.
83 The setter method calls the Game's optional -makePieceNamed: method to create the pieces. */
84 @property (copy) NSString *stateString;
86 /** Interprets the string as a series of cell names separated by "-", and tells the Game to move
87 the piece at the first cell to each cell in succession by calling its -animateMoveFrom:to:. */
88 - (BOOL) applyMoveString: (NSString*)move;
92 - (GridCell*) createCellAtRow: (unsigned)row column: (unsigned)col
93 suggestedFrame: (CGRect)frame;
98 /** Abstract superclass of a single cell in a grid. */
99 @interface GridCell : BitHolder
102 unsigned _row, _column;
105 - (id) initWithGrid: (Grid*)grid
106 row: (unsigned)row column: (unsigned)col
107 frame: (CGRect)frame;
109 @property (readonly) Grid* grid;
110 @property (readonly) unsigned row, column;
111 @property (readonly) NSArray* neighbors; // Dependent on grid.usesDiagonals
113 /** Returns YES if 'forward' is north (increasing row#) for the current player */
114 @property (readonly) BOOL fwdIsN;
116 /** Go-style group detection. Returns the set of contiguous GridCells that have pieces of the same
117 owner as this one, and optionally a count of the number of "liberties", or adjacent empty cells. */
118 - (NSSet*) getGroup: (int*)outLiberties;
121 - (void) drawInParentContext: (CGContextRef)ctx fill: (BOOL)fill;
126 /** A rectangular grid of squares. */
127 @interface RectGrid : Grid
129 CGColorRef _altCellColor;
132 /** If non-nil, alternate cells will be drawn with this background color, in a checkerboard pattern.
133 The precise rule is that cells whose row+column is odd use the altCellColor.*/
134 @property CGColorRef altCellColor;
140 /* A square in a RectGrid */
141 @interface Square : GridCell
143 @property (readonly) Square *nw, *n, *ne, *e, *se, *s, *sw, *w; // Absolute directions (n = increasing row#)
144 @property (readonly) Square *fl, *f, *fr, *r, *br, *b, *bl, *l; // Relative to player (upside-down for player 2)
146 /** Returns the absolute direction selector (see above) for the straight line from self to dst;
147 or NULL if there is no straight line, or if dst==self.
148 Diagonal lines are allowed only if the Grid's -usesDiagonals is YES. */
149 - (SEL) directionToCell: (GridCell*)dst;
151 /** Returns an array of all the cells in a straight line from self to dst;
152 or NULL if there is no straight line, or if dst==self.
153 If 'inclusive' is YES, the array will include self and dst, otherwise not.
154 Diagonal lines are allowed only if the Grid's -usesDiagonals is YES. */
155 - (NSArray*) lineToCell: (GridCell*)dst inclusive: (BOOL)inclusive;
160 /* Substitute this for Square in a RectGrid's cellClass to draw the lines through the centers
161 of the squares, so the pieces sit on the intersections, as in a Go board. */
162 @interface GoSquare : Square
167 /** Set to YES to put a dot at the intersection, as in the handicap points of a Go board. */
168 @property BOOL dotted;