This is NPipeCell.m in view mode; [Download] [Up]
/*----------------------------------------------------------------------*/ /* (C) Copyright 1994 Stefanos Kiakas */ /* All rights reserved. */ /*----------------------------------------------------------------------*/ #import <appkit/appkit.h> #import "NCommon.h" #import "NPipeCell.h" #import "VerticalPipe.h" #import "HorizontalPipe.h" #import "UpperRightQuarterCircle.h" #import "UpperLeftQuarterCircle.h" #import "LowerLeftQuarterCircle.h" #import "LowerRightQuarterCircle.h" #import "UnassignedSquare.h" #import "Source.h" #import "IntersectingPipe.h" #import "Obstacle.h" @implementation NPipeCell /*----------------------------------------------------------------------*/ /* Purpose : Initalize the cell to be used for drawing into and */ /* let it take the role of an unassigned piece. */ /* */ /* Parameters : none */ /* */ /* Return value : none */ /*----------------------------------------------------------------------*/ - init { [super initIconCell:""]; role = PIPE_UNASSIGNED; return self; } /*----------------------------------------------------------------------*/ /* Purpose : To indicate if the pipe assigned ta the cell can be */ /* replaced by another pipe. */ /* */ /* Parameters : none */ /* */ /* Return value: TRUE -> pipe can be replaced. */ /* FALSE -> pipe should not be replaced. */ /*----------------------------------------------------------------------*/ - (int) isPipeReplaceable { if( flowLevelA == 0 && flowLevelB == 0 && role != PIPE_SOURCE && role != PIPE_OBSTACLE ) return TRUE; return FALSE; } /*----------------------------------------------------------------------*/ /* Purpose : */ /* Parameters : */ /* Return value : */ /*----------------------------------------------------------------------*/ - (Direction_t) exitDirection { return( entry2exit( role, flowEntryDirection) ); } /*----------------------------------------------------------------------*/ /* Purpose : */ /* Parameters : */ /* Return value : */ /*----------------------------------------------------------------------*/ - setFlowEntryDirection: (Direction_t ) entry { if( PIPE_VERTICAL_BIDIRECTIONAL <= role && role <= PIPE_INTERSECTION ) score = BIDIRECTIONAL_PIECE_POINTS; else if( PIPE_VERTICAL_ONEWAY_UP <= role && role <= PIPE_HORIZONTAL_ONEWAY_RIGHT ) score = BIDIRECTIONAL_PIECE_POINTS; if( flowLevelA > 0 || flowLevelB > 0 ) bonus = INTERSECTION_BONUS_POINTS; flowEntryDirection = entry; return self; } /*----------------------------------------------------------------------*/ /* Purpose : */ /* Parameters : */ /* Return value : */ /*----------------------------------------------------------------------*/ - assignPipe: (NPipe_t) pipe { flowLevelA = 0; flowLevelB = 0; role = (int) pipe; return self; } /*----------------------------------------------------------------------*/ /* Purpose : */ /* Parameters : */ /* Return value : */ /*----------------------------------------------------------------------*/ - (int) isFlowPossible { if( entry2exit( role, flowEntryDirection) == INVALID_DIR ) return FALSE; else return TRUE; } /*----------------------------------------------------------------------*/ /* Purpose : */ /* Parameters : */ /* Return value : */ /*----------------------------------------------------------------------*/ - continueFlow { if( role != PIPE_INTERSECTION ) flowLevelA++; else { if( flowEntryDirection == WEST || flowEntryDirection == EAST ) flowLevelA++; else flowLevelB++; } return self; } /*----------------------------------------------------------------------*/ /* Purpose : */ /* Parameters : */ /* Return value : */ /*----------------------------------------------------------------------*/ - (int) isOverFlow { static levels[] = { 0, 0, 80, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10 }; int cFlow = 0; if( role != PIPE_INTERSECTION || flowEntryDirection == WEST || flowEntryDirection == EAST ) cFlow = flowLevelA; else cFlow = flowLevelB; if( cFlow > levels[(int)role] ) return TRUE; else return FALSE; } /*----------------------------------------------------------------------*/ /* Purpose : */ /* Parameters : */ /* Return value : */ /*----------------------------------------------------------------------*/ - (int) getScorePoints { int rScore = 0; rScore = score; score = 0; return(rScore); } /*----------------------------------------------------------------------*/ /* Purpose : */ /* Parameters : */ /* Return value : */ /*----------------------------------------------------------------------*/ - (int) getBonusPoints { int rBonus = 0; rBonus = bonus; bonus = 0; return(rBonus); } /*----------------------------------------------------------------------*/ /* Purpose : */ /* Parameters : */ /* Return value : */ /*----------------------------------------------------------------------*/ - drawInside:(const NXRect *)cellFrame inView:aView; { int isNorthward; int isEastward; int isClockWise; int rotation; switch( role ) { case PIPE_OBSTACLE: Obstacle( NX_X(cellFrame), NX_Y(cellFrame) ); break; case PIPE_UNASSIGNED: UnassignedSquare( NX_X(cellFrame), NX_Y(cellFrame) ); break; case PIPE_SOURCE: Source( flowLevelA, NX_X(cellFrame), NX_Y(cellFrame) ); break; case PIPE_VERTICAL_BIDIRECTIONAL: isNorthward = ( flowEntryDirection == SOUTH ? TRUE : FALSE ); VerticalPipe( isNorthward, flowLevelA, INVALID_DIR, NX_X(cellFrame), NX_Y(cellFrame) ); break; case PIPE_HORIZONTAL_BIDIRECTIONAL: isEastward = ( flowEntryDirection == WEST ? TRUE : FALSE ); HorizontalPipe( isEastward, flowLevelA, INVALID_DIR, NX_X(cellFrame), NX_Y(cellFrame) ); break; case PIPE_UPPER_LEFT: case PIPE_UPPER_RIGHT: case PIPE_LOWER_LEFT: case PIPE_LOWER_RIGHT: rotation = (int) direction2rotation( role, flowEntryDirection ); if( flowLevelA > 0 ) { if( rotation == INVALID_ROT ) { fprintf(stderr,"Role %d, flow direction %d.\n", role, flowEntryDirection ); fprintf(stderr,"Invalid direction of rotation. [ %s, %d ]\n", __FILE__, __LINE__ ); exit( 1 ); } isClockWise = ( rotation == CLOCKWISE ? TRUE : FALSE ); } else isClockWise = FALSE; if( role == PIPE_UPPER_LEFT ) UpperLeftQuarterCircle( isClockWise, flowLevelA, NX_X(cellFrame), NX_Y(cellFrame) ); if( role == PIPE_UPPER_RIGHT ) UpperRightQuarterCircle( isClockWise, flowLevelA, NX_X(cellFrame), NX_Y(cellFrame) ); if( role == PIPE_LOWER_LEFT ) LowerLeftQuarterCircle( isClockWise, flowLevelA, NX_X(cellFrame), NX_Y(cellFrame) ); if( role == PIPE_LOWER_RIGHT ) LowerRightQuarterCircle( isClockWise, flowLevelA, NX_X(cellFrame), NX_Y(cellFrame) ); break; case PIPE_INTERSECTION: isEastward = ( flowEntryDirection == WEST ? TRUE : FALSE ); isNorthward = ( flowEntryDirection == SOUTH ? TRUE : FALSE ); IntersectingPipe( isEastward,flowLevelA, isNorthward, flowLevelB, NX_X(cellFrame), NX_Y(cellFrame)); break; case PIPE_VERTICAL_ONEWAY_UP: VerticalPipe( TRUE, flowLevelA, NORTH, NX_X(cellFrame), NX_Y(cellFrame) ); break; case PIPE_VERTICAL_ONEWAY_DOWN: VerticalPipe( FALSE, flowLevelA, SOUTH, NX_X(cellFrame), NX_Y(cellFrame) ); break; case PIPE_HORIZONTAL_ONEWAY_LEFT: HorizontalPipe( FALSE, flowLevelA, WEST, NX_X(cellFrame), NX_Y(cellFrame) ); break; case PIPE_HORIZONTAL_ONEWAY_RIGHT: HorizontalPipe( TRUE, flowLevelA, EAST, NX_X(cellFrame), NX_Y(cellFrame) ); break; default: break; } return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.