This is CardsTracker.m in view mode; [Download] [Up]
/* Generated by Interface Builder */ #import "CardsTracker.h" #import "GameCoordinator.h" #import <assert.h> #import <libc.h> #import <strings.h> @implementation CardsTracker - cardPlayed:aCard { TextFieldCell *tCell = [ cardsPlayedMatrix findCellWithTag:[ aCard tag ]]; char *dataField = alloca( strlen([ tCell stringValue ]) + 8 ); sprintf( dataField, "(%d) %s", ([ self numPlayed:[ aCard tag ]] + 1 ), strstr([ tCell stringValue ], "of" )); [ tCell setStringValue:dataField ]; return self; } - newHand { int i; for( i = 0; cardDeck[ i ].cardClassName; ++i ) { char *fieldData = alloca( 13 + strlen( cardDeck[ i ].cardClassName ) + 8 ); sprintf( fieldData, "(0) of (%d), %s", cardDeck[ i ].numCards, cardDeck[ i ].cardClassName ); [[ cardsPlayedMatrix findCellWithTag:cardDeck[ i ].cardType ] setStringValue:fieldData ]; } return self; } - ( int )numPlayed:( int )aCardTag { TextFieldCell *tCell = [ cardsPlayedMatrix findCellWithTag:aCardTag ]; int numPlayed; assert( tCell ); sscanf([ tCell stringValue ], "(%d)", &numPlayed ); return numPlayed; } - ( int )numInDeck:( int )aCardTag { int i; for( i = 0; cardDeck[ i ].cardClassName; ++i ) if( aCardTag == cardDeck[ i ].cardType ) return cardDeck[ i ].numCards; assert( 0 /* unable to find card in deck */ ); } - ( BOOL )allPlayed:( int )aCardTag { return [ self numPlayed:aCardTag ] == [ self numInDeck:aCardTag ]; } - ( BOOL )allSafetiesPlayed { return [ self numSafetiesPlayed ] == NUMBER_OF_SAFETY_CARDS_IN_DECK ; } - ( int )numSafetiesPlayed { int cardTypes[] = { C_RIGHT_OF_WAY_SAFETY, C_PUNCTURE_PROOF_SAFETY, C_DRIVING_ACE_SAFETY, C_EXTRA_TANK_SAFETY }, i, cnt; for( i = 0, cnt = 0; i < ( sizeof( cardTypes ) / sizeof( int )); ++i ) if([ self allPlayed:cardTypes[ i ]]) ++cnt; return cnt; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.