/* This handles drawing the pictures (gels) in the game Trippin. */ #include #include #include #include #include #include #include #include "trip.h" #define TMPIZE (long) RASSIZE(200, 50) import void ShoveMenus(); import ubyte board[8][8]; import piece oo, bb; import struct Menu manyou; struct GfxBase *GfxBase; struct NewWindow boardwin = { 81, 12, 16 * SQIZE + 4 + MARGINWID, 8 * SQIZE + 12, -1, -1, MOUSEBUTTONS | MOUSEMOVE | MENUPICK | CLOSEWINDOW, REPORTMOUSE | WINDOWDRAG | WINDOWDEPTH | WINDOWCLOSE | SMART_REFRESH | ACTIVATE, null, null, (ubyte *) "Tripppin by Paul Kienitz", null, null, 0, 0, 0, 0, WBENCHSCREEN }; struct Window *win; /* image data created by GetImage program from fish 345 */ private UWORD ecks[23] = { 0, 0, 0, 0x60c0, 0, 0x71c0, 0, 0x3b80, 0, 0x1f00, 0, 0x0e00, 0, 0x1f00, 0, 0x3b80, 0, 0x71c0, 0, 0x60c0, 0, 0, 0 }; WORD rawimage[IMHITE << 2] = { 0x0000,0x0000, 0x00fc,0x0000, 0x017e,0x0000, 0x00bc,0x0000, 0x0058,0x0000, 0x0038,0x0000, 0x0078,0x0000, 0x00bc,0x0000, 0x057f,0xc000, 0x2bff,0xf000, 0x15ff,0xf000, 0x02b5,0x0000, 0x0000,0x0000, 0x00fc,0x0000, 0x03eb,0x0000, 0x07f5,0x8000, 0x03fb,0x0000, 0x01fe,0x0000, 0x00f4,0x0000, 0x01f6,0x0000, 0x0ffb,0xc000, 0x7ffe,0xb800, 0xffff,0x6c00, 0xffff,0xfc00, 0x7fff,0xf800, 0x07ff,0x8000 }; struct Image olabel = { 0, 0, IMWID, IMHITE, 2, null /* will be oonwhite */, 3, 0, null }, blabel = { 0, 0, IMWID, IMHITE, 2, null /* bonwhite */, 3, 0, null }; /* these are used in the menu and margin stuff, not on the board */ struct SimpleSprite ox = { &ecks[0], 1, 0, 0, -1 }, bx = { &ecks[1], 1, 0, 1, -1 }; extern struct Bob obob, bbob; /* declared in full below */ struct VSprite ovs = { null, null, null, null, 0, 0, /* system fields */ SAVEBACK | OVERLAY, /* is a Bob */ 0, 0, IMHITE, 2, 2, /* y, x, height, width (in words), planes */ 0, 0, null, /* memask, hitmask, image = oimd */ null, null, null, /* borderline, collmask = shadow, colormap */ &obob, 3, 0 /* parent Bob, planepick, planeonoff */ }, bvs = { null, null, null, null, 0, 0, /* system fields */ SAVEBACK | OVERLAY, /* is a Bob */ 0, 0, IMHITE, 2, 2, /* y, x, height, width (in words), planes */ 0, 0, null, /* memask, hitmask, image = bimd */ null, null, null, /* borderline, collmask = shadow, colormap */ &bbob, 3, 0 /* parent Bob, planepick, planeonoff */ }; struct VSprite dummy1 = { 0 }, dummy2 = { 0 }; WORD nextline[8], *(lastcolor[8]); /* lastcolor is array of pointers */ struct GelsInfo ginfo = { 0xFC, 0, null, null, &nextline[0], &lastcolor[0], null, 0, 0, 0, 0, null, null }; struct /* J.R. " */ Bob /* " Dobbs */ obob = { 0, null, null, null, null, /* flags, save, shadow, before, after */ &ovs, null, null /* vsprite, animcomp, dbufpacket */ }, bbob = { 0, null, null, null, null, /* flags, save, shadow, before, after */ &bvs, null, null /* vsprite, animcomp, dbufpacket */ }; /* pointers into chip ram: */ WORD *oimd, *bimd, *osav, *bsav, *shadow, *oonwhite, *bonwhite, *osprat, *bsprat, *nuth; short sqite, thite; bool lace; struct RastPort *r; struct ViewPort *vp; struct TmpRas wtr; PLANEPTR trp; long imize = 0; #define TFree(m, s) if (m) FreeMem(m, (long) s) void DumpPrettyPictures() { if (!imize) return; TFree(bsprat, 48); TFree(osprat, 48); TFree(nuth, 24); TFree(bonwhite, imize); TFree(oonwhite, imize); TFree(shadow, imize >> 1); TFree(bimd, imize); TFree(oimd, imize); TFree(bsav, imize << 1); TFree(osav, imize << 1); if (win) { ClearMenuStrip(win); CloseWindow(win); } TFree(trp, TMPIZE); if (~ox.num) FreeSprite((long) ox.num); if (~bx.num) FreeSprite((long) bx.num); } void MakePrettyPictures() { struct Preferences p; short i; long *o, *b, *rr = (long *) rawimage; ulong rgb; struct Screen *wbench = OpenWorkBench(); if (!wbench) Die("Workbench inaccessible!\n"); thite = wbench->Font->ta_YSize; /* that's a FAIR GUESS of the height of the font our window will use */ if (thite < 8 || thite > 40) thite = 8; GetPrefs(&p, (long) sizeof(p)); /* why put LaceWB down at the end!? */ lace = p.LaceWB == LACEWB; sqite = SQIZE << lace; boardwin.Height = thite + 4 + (sqite << 3) + lace; /* room for title bar */ boardwin.TopEdge -= thite - 8; /* constant bottom edge */ if (boardwin.TopEdge < 0) boardwin.TopEdge = 0; if (!(win = OpenWindow(&boardwin))) Die("Can't open window!\n"); ShoveMenus(); SetMenuStrip(win, &manyou); if (!(trp = AllocCP(TMPIZE))) Die("Can't allocate TmpRas for window!\n"); InitTmpRas(&wtr, trp, TMPIZE); r = win->RPort; r->TmpRas = &wtr; vp = &win->WScreen->ViewPort; imize = RASSIZE(IMWID, IMHITE) << (1 + lace); /* probably should have used AllocEntry, but it just sorta grew ... */ if (!(oimd = AllocCP(imize)) || !(bimd = AllocCP(imize)) || !(osav = AllocCP(imize << 1)) || /* 16 color WB! */ !(bsav = AllocCP(imize << 1)) || !(shadow = AllocCP(imize >> 1)) || !(oonwhite = AllocCP(imize)) || !(bonwhite = AllocCP(imize)) || !(osprat = AllocCP(48)) || !(bsprat = AllocCP(48)) || !(nuth = AllocCPZ(24))) Die("Can't allocate chip ram for image data!\n"); o = (long *) (ovs.ImageData = oimd); b = (long *) (bvs.ImageData = bimd); obob.SaveBuffer = osav; bbob.SaveBuffer = bsav; obob.ImageShadow = ovs.CollMask = bbob.ImageShadow = bvs.CollMask = shadow; ovs.BorderLine = bvs.BorderLine = nuth + 8; oo.face = &obob; bb.face = &bbob; if (lace) ovs.Height = bvs.Height = IMHITE << 1; for (i = 0; i < IMHITE; i++) { register short i1 = i << lace, i2 = (i + IMHITE) << lace; register long m, dw; m = dw = o[i1] = rr[i]; if (lace) o[i1 + 1] = dw; /* double each line for lace */ m &= (dw = o[i2] = rr[i + IMHITE]); /* bits on in m are orange */ if (lace) o[i2 + 1] = dw; dw = b[i1] = rr[i] ^ m; /* ^ m turns orange pixels blue */ if (lace) b[i1 + 1] = dw; dw = b[i2] = rr[i + IMHITE] ^ m; if (lace) b[i2 + 1] = dw; } InitMasks(&ovs); /* fill in shadow */ for (i = 0; i < (IMHITE << lace); i++) { register short i2 = i + (IMHITE << lace); register long m, w; m = w = o[i]; m |= ((long *) oonwhite)[i2] = o[i2]; ((long *) oonwhite)[i] = w | ~m; /* turn blue background white */ ((long *) bonwhite)[i2] = b[i2]; ((long *) bonwhite)[i] = b[i] | ~m; } olabel.ImageData = (ushort *) oonwhite; blabel.ImageData = (ushort *) bonwhite; olabel.Height = blabel.Height = IMHITE << lace; ginfo.sprRsrvd &= ~GfxBase->SpriteReserved; r->GelsInfo = &ginfo; InitGels(&dummy1, &dummy2, &ginfo); for (i = 0; i < 11; i++) { ((long *) osprat)[i] = ((long *) (&ecks[0]))[i]; ((long *) bsprat)[i] = ((long *) (&ecks[1]))[i]; } for (i = 2; i <= 6; i += 2) { if (~GetSprite(&ox, (long) i) && ~GetSprite(&bx, (long) i + 1)) { i = (i << 1) + 17; rgb = GetRGB4(vp->ColorMap, 0L); /* "blue" */ SetRGB4(vp, (long) i, rgb >> 8, (rgb >> 4) & 15, rgb & 15); rgb = GetRGB4(vp->ColorMap, 3L); /* "orange" */ SetRGB4(vp, i + 1L, rgb >> 8, (rgb >> 4) & 15, rgb & 15); return; } if (~ox.num) FreeSprite((long) ox.num); if (~bx.num) FreeSprite((long) bx.num); ox.num = bx.num = -1; } Die("Can't find a free pair of sprites!\n"); } void Win2Square(x, y, xp, yp) short x, y, *xp, *yp; { *xp = (x + (SQIZE << 1) - 2) / (SQIZE << 1) - 1; *yp = (y + sqite - 2 - thite - lace) / sqite - 1; } void DropBob(who) piece *who; { register struct Bob *b = who->face; b->BobVSprite->X = who->x * (SQIZE << 1) + 13; b->BobVSprite->Y = who->y * sqite + 2 + thite + (5 << lace); /* SortGList(r); */ DrawGList(r, vp); /* paint it in center of square */ b->Flags |= SAVEBOB; RemIBob(b, r, vp); /* dump it on the background */ } void LiftBob(who) piece *who; { who->face->Flags &= ~SAVEBOB; AddBob(who->face, r); /* SortGList(r); */ } void DragBob(who, x, y) piece *who; short x, y; { who->face->BobVSprite->X = x - 10; who->face->BobVSprite->Y = y - (((IMHITE >> 2) + 3) << lace); /* SortGList(r); */ DrawGList(r, vp); /* must already be LiftBobbed */ }