jens@0: /* This code is based on Apple's "GeekGameBoard" sample code, version 1.0. jens@0: http://developer.apple.com/samplecode/GeekGameBoard/ jens@0: Copyright © 2007 Apple Inc. Copyright © 2008 Jens Alfke. All Rights Reserved. jens@0: jens@0: Redistribution and use in source and binary forms, with or without modification, are permitted jens@0: provided that the following conditions are met: jens@0: jens@0: * Redistributions of source code must retain the above copyright notice, this list of conditions jens@0: and the following disclaimer. jens@0: * Redistributions in binary form must reproduce the above copyright notice, this list of jens@0: conditions and the following disclaimer in the documentation and/or other materials provided jens@0: with the distribution. jens@0: jens@0: THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR jens@0: IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND jens@0: FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRI- jens@0: BUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES jens@0: (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR jens@0: PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN jens@0: CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF jens@0: THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. jens@0: */ jens@0: #import "PlayingCard.h" jens@1: #import "GGBTextLayer.h" jens@0: #import "QuartzUtils.h" jens@0: jens@0: jens@0: @implementation PlayingCard jens@0: jens@0: jens@0: + (NSRange) serialNumberRange; jens@0: { jens@0: return NSMakeRange(1,52); jens@0: } jens@0: jens@0: jens@1: - (GGBLayer*) createFront jens@0: { jens@1: GGBLayer *front = [super createFront]; jens@0: NSString *name = [NSString stringWithFormat: @"%@%@", jens@0: self.rankString, self.suitString]; jens@0: jens@0: CGColorRef suitColor = self.suitColor; jens@4: float scale = [Card cardSize].height/150; jens@4: float cornerFontSize = MAX(18*scale, 14); jens@4: float centerFontSize = 80*scale; jens@4: jens@8: #if TARGET_OS_IPHONE jens@4: UIFont *cornerFont = [UIFont boldSystemFontOfSize: cornerFontSize]; jens@4: #else jens@4: NSFont *cornerFont = [NSFont boldSystemFontOfSize: cornerFontSize]; jens@4: #endif jens@1: GGBTextLayer *label; jens@1: label = [GGBTextLayer textLayerInSuperlayer: front jens@1: withText: name jens@4: font: cornerFont jens@4: alignment: kCALayerMaxXMargin | kCALayerBottomMargin]; jens@0: label.foregroundColor = suitColor; jens@1: label = [GGBTextLayer textLayerInSuperlayer: front jens@1: withText: name jens@4: font: cornerFont jens@4: alignment: kCALayerMaxXMargin | kCALayerTopMargin]; jens@0: label.foregroundColor = suitColor; jens@0: label.anchorPoint = CGPointMake(1,1); jens@0: [label setValue: [NSNumber numberWithFloat: M_PI] forKeyPath: @"transform.rotation"]; jens@0: jens@1: label = [GGBTextLayer textLayerInSuperlayer: front jens@1: withText: self.faceSymbol jens@4: fontSize: centerFontSize jens@1: alignment: kCALayerWidthSizable | kCALayerHeightSizable]; jens@0: label.foregroundColor = suitColor; jens@4: jens@0: return front; jens@0: } jens@0: jens@0: jens@0: - (CardRank) rank {return (self.serialNumber-1)%13 + 1;} jens@0: - (CardSuit) suit {return (self.serialNumber-1)/13;} jens@0: jens@0: - (CardColor) color jens@0: { jens@0: CardSuit suit = self.suit; jens@0: return suit==kSuitDiamonds || suit==kSuitHearts ?kColorRed :kColorBlack; jens@0: } jens@0: jens@0: jens@0: - (NSString*) suitString jens@0: { jens@0: return [@"\u2663\u2666\u2665\u2660" substringWithRange: NSMakeRange(self.suit,1)]; jens@0: } jens@0: jens@0: - (NSString*) rankString jens@0: { jens@0: CardRank rank = self.rank; jens@0: if( rank == 10 ) jens@0: return @"10"; jens@0: else jens@0: return [@"A234567890JQK" substringWithRange: NSMakeRange(rank-1,1)]; jens@0: } jens@0: jens@0: - (CGColorRef) suitColor jens@0: { jens@0: static CGColorRef kSuitColor[4]; jens@0: if( ! kSuitColor[0] ) { jens@0: kSuitColor[0] = kSuitColor[3] = kBlackColor; jens@1: kSuitColor[1] = kSuitColor[2] = CreateRGB(1, 0, 0, 1); jens@0: } jens@0: return kSuitColor[self.suit]; jens@0: } jens@0: jens@0: jens@0: - (NSString*) faceSymbol jens@0: { jens@0: int rank = self.rank; jens@0: if( rank < kRankJack ) jens@0: return self.suitString; jens@0: else jens@0: return [@"\u265E\u265B\u265A" substringWithRange: NSMakeRange(rank-kRankJack,1)]; // actually chess symbols jens@0: } jens@0: jens@0: jens@0: - (NSString*) description jens@0: { jens@0: return [NSString stringWithFormat: @"%@[%@%@]",self.class,self.rankString,self.suitString]; jens@0: } jens@0: jens@0: jens@0: @end