jens@0
|
1 |
/* This code is based on Apple's "GeekGameBoard" sample code, version 1.0.
|
jens@0
|
2 |
http://developer.apple.com/samplecode/GeekGameBoard/
|
jens@0
|
3 |
Copyright © 2007 Apple Inc. Copyright © 2008 Jens Alfke. All Rights Reserved.
|
jens@0
|
4 |
|
jens@0
|
5 |
Redistribution and use in source and binary forms, with or without modification, are permitted
|
jens@0
|
6 |
provided that the following conditions are met:
|
jens@0
|
7 |
|
jens@0
|
8 |
* Redistributions of source code must retain the above copyright notice, this list of conditions
|
jens@0
|
9 |
and the following disclaimer.
|
jens@0
|
10 |
* Redistributions in binary form must reproduce the above copyright notice, this list of
|
jens@0
|
11 |
conditions and the following disclaimer in the documentation and/or other materials provided
|
jens@0
|
12 |
with the distribution.
|
jens@0
|
13 |
|
jens@0
|
14 |
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
|
jens@0
|
15 |
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
jens@0
|
16 |
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRI-
|
jens@0
|
17 |
BUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
jens@0
|
18 |
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
jens@0
|
19 |
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
jens@0
|
20 |
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
jens@0
|
21 |
THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
jens@0
|
22 |
*/
|
jens@1
|
23 |
@class GGBLayer, Bit, Player;
|
jens@0
|
24 |
@protocol BitHolder;
|
jens@0
|
25 |
|
jens@0
|
26 |
|
jens@0
|
27 |
/** Abstract superclass. Keeps track of the rules and turns of a game. */
|
jens@0
|
28 |
@interface Game : NSObject
|
jens@0
|
29 |
{
|
jens@1
|
30 |
GGBLayer *_board;
|
jens@0
|
31 |
NSArray *_players;
|
jens@0
|
32 |
Player *_currentPlayer, *_winner;
|
jens@0
|
33 |
}
|
jens@0
|
34 |
|
jens@0
|
35 |
/** Returns the human-readable name of this game.
|
jens@0
|
36 |
(By default it just returns the class name with the "Game" suffix removed.) */
|
jens@0
|
37 |
+ (NSString*) displayName;
|
jens@0
|
38 |
|
jens@4
|
39 |
+ (BOOL) landscapeOriented;
|
jens@4
|
40 |
|
jens@0
|
41 |
@property (readonly, copy) NSArray *players;
|
jens@0
|
42 |
@property (readonly) Player *currentPlayer, *winner;
|
jens@0
|
43 |
|
jens@0
|
44 |
|
jens@0
|
45 |
// Methods for subclasses to implement:
|
jens@0
|
46 |
|
jens@0
|
47 |
/** Designated initializer. After calling the superclass implementation,
|
jens@0
|
48 |
it should add the necessary Grids, Pieces, Cards, Decks etc. to the board. */
|
jens@1
|
49 |
- (id) initWithBoard: (GGBLayer*)board;
|
jens@0
|
50 |
|
jens@0
|
51 |
/** Should return YES if it is legal for the given bit to be moved from its current holder.
|
jens@0
|
52 |
Default implementation always returns YES. */
|
jens@0
|
53 |
- (BOOL) canBit: (Bit*)bit moveFrom: (id<BitHolder>)src;
|
jens@0
|
54 |
|
jens@0
|
55 |
/** Should return YES if it is legal for the given Bit to move from src to dst.
|
jens@0
|
56 |
Default implementation always returns YES. */
|
jens@0
|
57 |
- (BOOL) canBit: (Bit*)bit moveFrom: (id<BitHolder>)src to: (id<BitHolder>)dst;
|
jens@0
|
58 |
|
jens@0
|
59 |
/** Should handle any side effects of a Bit's movement, such as captures or scoring.
|
jens@0
|
60 |
Does not need to do the actual movement! That's already happened.
|
jens@0
|
61 |
It should end by calling -endTurn, if the player's turn is over.
|
jens@0
|
62 |
Default implementation just calls -endTurn. */
|
jens@0
|
63 |
- (void) bit: (Bit*)bit movedFrom: (id<BitHolder>)src to: (id<BitHolder>)dst;
|
jens@0
|
64 |
|
jens@3
|
65 |
/** Called on mouse-down/touch of an *empty* BitHolder. Should return a Bit if
|
jens@3
|
66 |
it's OK to place a new Bit there; else nil. */
|
jens@3
|
67 |
- (Bit*) bitToPlaceInHolder: (id<BitHolder>)holder;
|
jens@3
|
68 |
|
jens@0
|
69 |
/** Called instead of the above if a Bit is simply clicked, not dragged.
|
jens@0
|
70 |
Should return NO if the click is illegal (i.e. clicking an empty draw pile in a card game.)
|
jens@0
|
71 |
Default implementation always returns YES. */
|
jens@0
|
72 |
- (BOOL) clickedBit: (Bit*)bit;
|
jens@0
|
73 |
|
jens@0
|
74 |
/** Should return the winning player, if the current position is a win, else nil.
|
jens@0
|
75 |
Default implementation returns nil. */
|
jens@0
|
76 |
- (Player*) checkForWinner;
|
jens@0
|
77 |
|
jens@0
|
78 |
|
jens@0
|
79 |
// Protected methods for subclasses to call:
|
jens@0
|
80 |
|
jens@0
|
81 |
/** Sets the number of players in the game. Subclass initializers should call this. */
|
jens@0
|
82 |
- (void) setNumberOfPlayers: (unsigned)n;
|
jens@0
|
83 |
|
jens@0
|
84 |
/** Advance to the next player, when a turn is over. */
|
jens@0
|
85 |
- (void) nextPlayer;
|
jens@0
|
86 |
|
jens@0
|
87 |
/** Checks for a winner and advances to the next player. */
|
jens@0
|
88 |
- (void) endTurn;
|
jens@0
|
89 |
|
jens@0
|
90 |
@end
|
jens@0
|
91 |
|
jens@0
|
92 |
|
jens@0
|
93 |
|
jens@0
|
94 |
/** A mostly-passive object used to represent a player. */
|
jens@0
|
95 |
@interface Player : NSObject
|
jens@0
|
96 |
{
|
jens@0
|
97 |
Game *_game;
|
jens@0
|
98 |
NSString *_name;
|
jens@0
|
99 |
}
|
jens@0
|
100 |
|
jens@0
|
101 |
- (id) initWithGame: (Game*)game;
|
jens@0
|
102 |
|
jens@0
|
103 |
@property (readonly) Game *game;
|
jens@0
|
104 |
@property (copy) NSString *name;
|
jens@0
|
105 |
@property (readonly) int index;
|
jens@0
|
106 |
@property (readonly, getter=isCurrent) BOOL current;
|
jens@0
|
107 |
@property (readonly, getter=isFriendly) BOOL friendly;
|
jens@0
|
108 |
@property (readonly, getter=isUnfriendly) BOOL unfriendly;
|
jens@0
|
109 |
@property (readonly) Player *nextPlayer, *previousPlayer;
|
jens@0
|
110 |
|
jens@0
|
111 |
@end
|
jens@0
|
112 |
|
jens@0
|
113 |
|
jens@0
|
114 |
|
jens@0
|
115 |
@interface CALayer (Game)
|
jens@0
|
116 |
|
jens@0
|
117 |
/** Called on any CALayer in the game's layer tree, will return the current Game object. */
|
jens@0
|
118 |
@property (readonly) Game *game;
|
jens@0
|
119 |
|
jens@0
|
120 |
@end
|