This is NethackView.m in view mode; [Download] [Up]
/* NethackView.m
*/
#import "NethackView.h"
#import "next.h"
#import "objsymdef.h"
/* color conversion table: */
float colortbl[16][3] = { {0,0,0}, {0.7,0,0}, {0,0.7,0}, {0.25,0.33,0.55}, {0,0,0.7}, {0.7,0,0.7},
{0,0.7,0.7}, {0.5,0.5,0.5}, {0,0,0}, {1,0.5,0}, {0,1,0}, {1,1,0}, {0,0,1},
{1,0,1}, {0,1,1}, {1,1,1} };
/* symbol conversion table: */
char Symtbl[180] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 104, 96, 0, 109, 97, 91, 0, 99, 98, 108, 111, 0, 0, 110, 106, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93, 92, 0, 107, 0, 105, 88, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 103, 90, 95, 0, 101, 102, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 0, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
BOOL WinDraw = NO;
@implementation NethackView
- initFrame:(const NXRect *)theFrame
{
char imgPath[180];
id NHImages;
printf("initFrame ...\n");
[super initFrame:theFrame];
myFont = nil;
ShowSymsImage = nil;
MonSymsImage = nil;
ObjSymsImage = nil;
[[NXBundle mainBundle] getPath:imgPath forResource:"NHImages" ofType:"bundle"];
NHImages = [[NXBundle alloc] initForDirectory:imgPath];
// Loading symbol images:
[NHImages getPath:imgPath forResource:"DefSyms" ofType:"tiff"];
ShowSymsImage = [[NXImage allocFromZone:[self zone]] initFromFile: imgPath];
if (!ShowSymsImage) {
NXRunAlertPanel(NULL,"Couldn't open def images.", NULL, NULL, NULL);
[NXApp terminate:self];
}
[NHImages getPath:imgPath forResource:"MonSyms" ofType:"tiff"];
MonSymsImage = [[NXImage allocFromZone:[self zone]] initFromFile: imgPath];
if (!MonSymsImage) {
NXRunAlertPanel(NULL,"Couldn't open mon images.", NULL, NULL, NULL);
[NXApp terminate:self];
}
[NHImages getPath:imgPath forResource:"ObjSyms" ofType:"tiff"];
ObjSymsImage = [[NXImage allocFromZone:[self zone]] initFromFile: imgPath];
if (!ObjSymsImage) {
NXRunAlertPanel(NULL,"Couldn't open obj images.", NULL, NULL, NULL);
[NXApp terminate:self];
}
return self;
}
- drawSelf:(const NXRect *)re:(int)co
{
return self;
}
- (BOOL)acceptsFirstResponder
{
return YES;
}
- (BOOL)acceptsFirstMouse
{
return YES;
}
- hitKey:(char)ch
{
mutex_lock(NHlock);
if (charbuf == 0) {
charbuf = ch;
mutex_unlock(NHlock);
} else {
mutex_unlock(NHlock);
/* printf("Missed key!\n"); */
return self;
}
condition_signal(start_c);
return self;
}
- keyDown:(NXEvent *)te
{
mutex_lock(NHlock);
if (charbuf == 0) {
charbuf = te->data.key.charCode;
mutex_unlock(NHlock);
} else {
mutex_unlock(NHlock);
/* printf("Missed key!\n"); */
return self;
}
condition_signal(start_c);
return self;
}
- printChar:(char)c x:(int)x y:(int)y /* This is the main function for printing simple chars*/
{
static char ch[2];
float rx,ry;
ch[0] = c;
ch[1] = 0;
[self lockFocus];
CLEARBG
[myFont set];
PSsetgray(NX_WHITE);
if(y >= 2 && y <= (HHEIGHT-2)) {
rx = SYMWIDTH * x;
ry = (HHEIGHT-y)*SYMWIDTH;
} else {
rx = X_PS(x);
ry = Y_PS(y);
}
PSmoveto(rx, ry);
if ( c >= ' ' && c < '~' )
PSshow(ch);
[self unlockFocus];
return self;
}
- printGraphics:(char)c x:(int)x y:(int)y color:(char)col /* This is the main function for printing graphical symbols */
{
static char ch[2];
static NXRect myRect = { {10.0, 10.0}, {0.0, 0.0}};
static NXPoint myPoint;
static unsigned char tch;
ch[0] = c;
ch[1] = 0;
myPoint.x = x * SYMWIDTH;
myPoint.y = (HHEIGHT-y) * SYMWIDTH;
myRect.size.width = 10.0;
myRect.size.height = 10.0;
[self lockFocus];
tch = (unsigned char)c;
if (tch != 0 && tch > SYMOFFS && tch <= SYMOFFS + MAXPCHARS) {
tch-=SYMOFFS;
myRect.origin.x = ((tch-1) % SYMROW) * SYMWIDTH;
myRect.origin.y = (MAXSYMROWS - ((tch-1) / SYMROW)-1) * SYMWIDTH;
[ShowSymsImage composite:NX_COPY fromRect:&myRect toPoint:&myPoint];
[self unlockFocus];
return self;
}
c = Symtbl[(int)c]; /* else do symbol tabel conversion */
if (c != 0 && c <= MAXMCHARS) {
c-= MAXPCHARS;
PSsetrgbcolor(colortbl[(int)col][0], colortbl[(int)col][1],colortbl[(int)col][2]);
PSrectfill(myPoint.x, myPoint.y, SYMWIDTH, SYMWIDTH);
myRect.origin.x = ((c-1) % SYMROW) * SYMWIDTH;
myRect.origin.y = (MAXMROWS - ((c-1) / SYMROW)-1) * SYMWIDTH;
[MonSymsImage composite:NX_SOVER fromRect:&myRect toPoint:&myPoint];
[self unlockFocus];
return self;
}
if (c != 0 && c <= MAXOBCHARS) {
c-= MAXMCHARS;
PSsetrgbcolor(colortbl[(int)col][0], colortbl[(int)col][1],colortbl[(int)col][2]);
PSrectfill(myPoint.x, myPoint.y, SYMWIDTH, SYMWIDTH);
myRect.origin.x = ((c-1) % SYMROW) * SYMWIDTH;
myRect.origin.y = (MAXOROWS - ((c-1) / SYMROW)-1) * SYMWIDTH;
[ObjSymsImage composite:NX_SOVER fromRect:&myRect toPoint:&myPoint];
[self unlockFocus];
return self;
}
/* else print char */
PSsetgray(NX_BLACK);
PSrectfill(x*SYMWIDTH,(HHEIGHT-y)*SYMWIDTH, SYMWIDTH, SYMWIDTH);
[myFont set];
PSsetrgbcolor(colortbl[(int)col][0], colortbl[(int)col][1],colortbl[(int)col][2]);
PSmoveto(myPoint.x, myPoint.y);
if ( c >= ' ' && c < '~' )
PSshow(ch);
[self unlockFocus];
return self;
}
- setCursorX:(int)x y:(int)y
{
[self lockFocus];
if (PosBackup) {
[PosBackup drawIn:&PosRect];
[PosBackup free];
PosBackup = nil;
}
NXSetRect(&PosRect, x*SYMWIDTH, (HHEIGHT-y)*SYMWIDTH, SYMWIDTH, SYMWIDTH);
PosBackup = [[NXBitmapImageRep alloc] initData:NULL fromRect:&PosRect];
PSsetgray(1.0);
PSsetalpha(0.5);
PScompositerect(x*SYMWIDTH,(HHEIGHT-y)*SYMWIDTH, SYMWIDTH, SYMWIDTH, NX_SOVER);
[self unlockFocus];
return self;
}
- setCursorOff
{
[self lockFocus];
if (PosBackup) {
[PosBackup drawIn:&PosRect];
[PosBackup free];
PosBackup = nil;
}
[self unlockFocus];
return self;
}
- setWin:(BOOL)state
{
WinDraw = state;
return self;
}
- soundOut: (char *)sndname
{
char sndPath[180];
id NHSounds;
id theSound;
// Look if we are allowed to play sound ...
if (strcmp(NXGetDefaultValue([NXApp appName], "UseSound"), "NO") == 0)
return self;
theSound = nil;
[[NXBundle mainBundle] getPath:sndPath forResource:"NHSounds" ofType:"bundle"];
NHSounds = [[NXBundle alloc] initForDirectory:sndPath];
// Get path for soundfile:
[NHSounds getPath:sndPath forResource:sndname ofType:"snd"];
[Sound addName:sndname fromSoundfile:sndPath];
theSound = [Sound findSoundFor:sndname];
if (theSound)
[theSound play];
return self;
}
- printString:(char *)s x:(int)x y:(int)y
{
int i;
static char buf[180];
float rx,ry;
[self lockFocus];
[myFont set];
if (y == 1) {
CLEARBGL(strlen(s));
}
PSsetgray(NX_WHITE);
if (!WinDraw)
PSmoveto(X_PS(x), Y_PS(y));
else {
rx = SYMWIDTH * x;
ry = (HHEIGHT-y)*SYMWIDTH;
PSmoveto(rx, ry);
}
i = -1;
while (s[++i] != 0)
if (!( s[i] >= ' ' && s[i] < '~' ))
buf[i] = ' ';
else
buf[i] = s[i];
buf[i] = 0;
PSshow(buf);
[self unlockFocus];
return self;
}
- bell
{
NXBeep();
return self;
}
- cls
{
[self lockFocus];
PSsetgray(NX_BLACK);
PSmoveto(0,0);
PSrectfill(bounds.origin.x,bounds.origin.y,bounds.size.width,bounds.size.height);
PSsetgray(NX_WHITE);
[self unlockFocus];
return self;
}
- cLineToEndWithX:(int)x y:(int)y
{
float rx,ry;
[self lockFocus];
PSsetgray(NX_BLACK);
if(y >= 2 && y <= (HHEIGHT-2)) {
rx = SYMWIDTH * x;
ry = (HHEIGHT-y)*SYMWIDTH;
} else {
rx = X_PS(x);
ry = (HHEIGHT-y)*FONTSIZE-2;
}
PSrectfill(rx,ry,bounds.size.width,FONTSIZE);
[self unlockFocus];
return self;
}
- setHFont:theFont
{
myFont = theFont;
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.