This is HextrisControl.m in view mode; [Download] [Up]
/* * NeXThextris Copyright 1994 Mark Gritter, mgritter@gac.edu * * hextris Copyright 1990 David Markley, dm3e@+andrew.cmu.edu, dam@cs.cmu.edu * * Permission to use, copy, modify, and distribute, this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation, and that the name of the copyright holders be used in * advertising or publicity pertaining to distribution of the software with * specific, written prior permission, and that no fee is charged for further * distribution of this software, or any modifications thereof. The copyright * holder make no representations about the suitability of this software for * any purpose. It is provided "as is" without express or implied warranty. * * THE COPYRIGHT HOLDER DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, * DATA, PROFITS, QPA OR GPA, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* This file contains the code for the control object, which calls the other hextris functions and manages I/O. */ #import "HextrisControl.h" #import "HextrisView.h" #import <appkit/TextField.h> #import "TextView.h" #import <dpsclient/dpsclient.h> #import <appkit/Application.h> #import <appkit/Button.h> #include <libc.h> #include <stdio.h> #include <strings.h> #include <sys/types.h> #include <sys/dir.h> #include <sys/time.h> #include <pwd.h> #include "hextris.h" extern id display, controller; DPSTimedEntry teFall; void TimedTick(DPSTimedEntry teNumber, double now, void *vmain) { DPSRemoveTimedEntry(teNumber); [controller tick]; } void start_quickdrop(void) { [controller setQuickDrop:YES]; } void stop_quickdrop(void) { [controller setQuickDrop:NO]; } @implementation HextrisControl - appDidInit:sender { struct passwd *pwent; struct timeval tp; struct timezone tzp; score = 0; rows = 0; game_over = 1; game_view = 1; quickdrop = NO; paused = NO; pwent = getpwuid(getuid()); if (pwent == (struct passwd *) NULL) { if ((log_name = (char *)getenv("USER")) == NULL) log_name = "anon"; } else log_name = pwent->pw_name; if ((name = (char *)getenv("XHEXNAME")) == NULL) name = log_name; printf("\nWelcome, %s...\n",name); read_high_scores(high_scores); gettimeofday(&tp, &tzp); srandom((int)(tp.tv_usec)); teFall = DPSAddTimedEntry(1.0, &TimedTick, NULL, NX_MODALRESPTHRESHOLD); display = hexView; controller = self; draw_borders(); [mainWindow makeFirstResponder:hexView]; [mainWindow makeKeyAndOrderFront:self]; [mainWindow setMiniwindowIcon:"onehex.tiff"]; new_game(grid, &npiece, &piece, &score, &rows); [hexView update]; return self; } - showScores { [scoreText setIntValue:score]; [rowText setIntValue:rows]; return self; } - showHighScores:sender { int i; char *buffer, *bufp; buffer = malloc((MAXHIGHSCORES + 1) * 100); bufp = buffer; [highScoreWindow makeKeyAndOrderFront:self]; sprintf(bufp, "# Name UID Score Rows\n"); bufp += strlen(bufp); for (i = 0; i < MAXHIGHSCORES; i++) { sprintf(bufp, "%2d %20s %7s %7d %4d\n", i, high_scores[i].name, high_scores[i].userid, high_scores[i].score, high_scores[i].rows); bufp += strlen(bufp); } [highScores setText:buffer]; free(buffer); return self; } - showHelp { [helpWindow makeKeyAndOrderFront:self]; return self; } - showNextPiece:(piece_t *)nextpiece { int base, form, i; base = (nextpiece->column % 2) ? 0 : 8; form = nextpiece->type * 6 + nextpiece->rotation; [nextPieceView clear]; for (i = 0; i < 7; i += 2) [nextPieceView drawHexAt :nextpiece->row+shape[form][base+i] :nextpiece->column+shape[form][base+1+i] :1 :nextpiece->type]; return self; } - tick { int intvl; int oldscore; if (paused) return self; oldscore = score; if (quickdrop) { intvl = 5000; score += 10; } else intvl = 100000+(200000-((rows > 40) ? 20 : (rows/2))*10000); if (! game_over) if ((game_over = update_drop(grid,&npiece,&piece,&score,&rows))) { read_high_scores(high_scores); if (is_high_score(name, log_name, score, rows, high_scores)) write_high_scores(high_scores,log_name); read_high_scores(high_scores); [self showHighScores:self]; } if (score != oldscore) { [self showScores]; if (!quickdrop) intvl = 400000; } if (!game_over) teFall = DPSAddTimedEntry(intvl / 400000.0, &TimedTick, NULL, NX_MODALRESPTHRESHOLD); [hexView update]; return self; } - keyDown:(NXEvent *)theEvent { int oldscore = score; if (paused || quickdrop || game_over) return self; do_choice(theEvent->data.key.charCode,grid,&npiece,&piece,&score,&rows, &game_over, &game_view, high_scores); [hexView update]; if (score != oldscore) { [self showScores]; DPSRemoveTimedEntry(teFall); teFall = DPSAddTimedEntry(quickdrop ? 0.01 : 1.0, &TimedTick, NULL, NX_MODALRESPTHRESHOLD); } return self; } - pause:sender { if (paused) { [mainWindow makeKeyAndOrderFront:self]; paused = NO; [pauseButton setTitle:"Pause!"]; [pauseMenuItem setTitle:"Pause"]; teFall = DPSAddTimedEntry(1.0, &TimedTick, NULL, NX_MODALRESPTHRESHOLD); } else { paused = YES; [pauseButton setTitle:"Resume"]; [pauseMenuItem setTitle:"Resume"]; } return self; } - newGame:sender { game_over = 0; quickdrop = NO; new_game(grid, &npiece, &piece, &score, &rows); [hexView clear]; redraw_game(grid, &npiece, &piece, &score, &rows, 0, high_scores); teFall = DPSAddTimedEntry(1.0, &TimedTick, NULL, NX_MODALRESPTHRESHOLD); return self; } - windowDidMiniaturize:sender { [self pause:self]; return self; } - windowDidResignMain:sender { [self pause:self]; return self; } - windowDidBecomeMain:sender { [mainWindow makeFirstResponder:hexView]; return self; } - setQuickDrop:(BOOL)on { quickdrop = on; return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.