DIRECTORY Commander, Imager, ImagerBackdoor, ImagerPixelMap, MazeWarPlayer, MazeWarPlayerInsides, ViewerBlast, ViewerClasses, ViewerOps; MazeWarPlayerImpl3: CEDAR MONITOR IMPORTS Imager, ImagerBackdoor, ImagerPixelMap, MazeWarPlayerInsides, ViewerBlast, ViewerOps EXPORTS MazeWarPlayerInsides = BEGIN OPEN MazeWarPlayerInsides; wb: Number = w+2; PaintMaze: PUBLIC ENTRY PROC [self: Viewer, context: Imager.Context, whatChanged: REF, clear: BOOL] RETURNS [quit: BOOL _ FALSE] --ViewerClasses.PaintProc-- = BEGIN ENABLE UNWIND => {}; --not strictly right, but it helps debugging Decisions: PROC = BEGIN crow, ccol, d, me, di: INTEGER; mes: Square; row _ p.row; col _ p.col; angle _ p.angle; peek _ p.peek; [prow, pcol, pdrow, pdcol, pangle] _ Peek[peek, row, col, angle]; IF fromScratch _ whatChanged = NIL THEN NULL ELSE IF notMe _ whatChanged # p THEN BEGIN q _ NARROW[whatChanged]; shot _ q.shot; wasShown _ q.sdistance > 0; q.shot _ FALSE; row _ q.row; col _ q.col; angle _ q.angle; [prow, pcol, pdrow, pdcol, pangle] _ Peek[p.speek, p.srow, p.scol, p.sangle]; oDistance _ q.sdistance; oAngle _ (q.sangle + 4 - pangle) MOD 4; IF nowShown _ (q.sdistance _ Visible[p.mv, prow, pcol, pdrow, pdcol, row, col]) > 0 THEN BEGIN q.srow _ row; q.scol _ col; q.sangle _ angle; nowShown _ TRUE; END; IF wasShown = nowShown THEN NULL ELSE IF wasShown THEN shownPlayers _ Filter[shownPlayers, q] ELSE shownPlayers _ CONS[q, shownPlayers]; RETURN; END ELSE BEGIN oRow _ p.srow; oCol _ p.scol; oAngle _ p.sangle; END; IF shot _ p.shot THEN p.shot _ FALSE; FOR sp: PlayerList _ shownPlayers, sp.rest WHILE sp # NIL DO sp.first.sdistance _ -1; ENDLOOP; shownPlayers _ NIL; crow _ prow; ccol _ pcol; mes _ p.mv.squares[me _ Index[p.mv, prow, pcol]]; d _ 0; di _ Direction[p.mv, pdrow, pdcol]; WHILE mes.open DO nu: INTEGER _ me + di; IF d>0 AND mes.occupants # NIL THEN BEGIN FOR pl: PlayerList _ mes.occupants, pl.rest WHILE pl # NIL DO pa: Angle _ pl.first.angle; pl.first.srow _ crow; pl.first.scol _ ccol; pl.first.sangle _ pa; pl.first.sdistance _ d; shownPlayers _ CONS[pl.first, shownPlayers]; ENDLOOP; END; d _ d + 1; mes _ p.mv.squares[me _ nu]; crow _ crow + pdrow; ccol _ ccol + pdcol; ENDLOOP; p.srow _ row; p.scol _ col; p.sangle _ angle; p.speek _ peek; END; p: Player _ NARROW[self.data]; q: Player _ NIL; fromScratch, notMe, wasShown, nowShown, shot: BOOLEAN; oRow, oCol, oDistance, oAngle: INTEGER; row, col, peek, prow, pcol, pdrow, pdcol: INTEGER; angle, pangle: Angle; CallUnderMonitor1[Decisions]; context.TranslateT[[p.mv.topX, p.mv.topY]]; IF fromScratch THEN BEGIN DrawTopview[context, p.mv]; DrawPlayerTop[context, row, col, angle]; END ELSE IF notMe THEN BEGIN context.TranslateT[[p.mv.inX, p.mv.inY]]; context.SetColor[ImagerBackdoor.invert]; IF wasShown THEN DrawHallPlayer[context, q, oDistance, oAngle, shot, FALSE]; IF nowShown THEN DrawHallPlayer[context, q, q.sdistance, (angle + 4 - pangle) MOD 4, shot, TRUE]; RETURN; END ELSE BEGIN IF clear THEN ERROR; context.SetColor[ImagerBackdoor.invert]; DrawPlayerTop[context, oRow, oCol, oAngle]; DrawPlayerTop[context, p.srow, p.scol, p.sangle]; END; context.TranslateT[[p.mv.inX, p.mv.inY]]; IF shot THEN BEGIN left, top, topCompl: INTEGER; [left, top] _ ViewerOps.UserToScreenCoords[ self, p.mv.inX + p.mv.topX - wb, p.mv.inY + p.mv.topY + wb]; topCompl _ screenBitmap.sSize-top; blastContext.SetColor[Imager.white]; blastContext.MaskRectangle[[-wb, -wb, 2*wb, 2*wb]]; blastContext.SetColor[Imager.black]; ViewerBlast.MaskPixelMap[context: blastContext, pm: screenBitmap.Clip[ [sMin: topCompl, fMin: left, sSize: 2*wb, fSize: 2*wb]], deviceOrgF: left+wb, deviceOrgS: topCompl+wb]; ViewerBlast.Blast[pm: blastBitmap, lowerLeft: [left, top-2*wb], speedChooser: ViewerBlast.RandomSpeed, initial: TRUE, backwards: FALSE]; DrawHall[blastContext, p.mv, prow, pcol, pdrow, pdcol, pangle]; ViewerBlast.Blast[pm: blastBitmap, lowerLeft: [left, top-2*wb], speedChooser: ViewerBlast.RandomSpeed, initial: TRUE, backwards: TRUE]; END ELSE BEGIN DrawHall[context, p.mv, prow, pcol, pdrow, pdcol, pangle]; END; END; screenBitmap: Bitmap _ ViewerBlast.ScreenPixelMap[]; blastBitmap: Bitmap _ ImagerPixelMap.Create[0, [0, 0, 2*wb, 2*wb]]; blastContext: Context _ ViewerBlast.PixelMapContext[blastBitmap]; DrawHallPlayer: PROC [context: Context, q: Player, d: INTEGER, angle: Angle, shot, backwards: BOOLEAN] = BEGIN b: Bitmap _ q.pics.pics[d][angle]; IF shot THEN BEGIN lowerLeft: ViewerBlast.IntPt; [lowerLeft.x, lowerLeft.y] _ ViewerOps.UserToScreenCoords[ q.mv.maze, q.mv.inX + q.mv.topX - b.fSize/2, q.mv.inY + q.mv.topY + b.sSize/2 - b.sSize]; ViewerBlast.Blast[pm: b, lowerLeft: lowerLeft, speedChooser: ViewerBlast.RandomSpeed, backwards: backwards]; END ELSE ViewerBlast.DrawBitmap[context: context, bitmap: b, fOrigin: b.fSize/2, sOrigin: b.sSize/2]; END; DrawTopview: PROC [context: Context, mv: MazeView] = BEGIN FOR row: INTEGER IN [0 .. mv.rows) DO FOR col: INTEGER IN [0 .. mv.cols) DO x: INTEGER _ col*tvd; y: INTEGER _ -row*tvd; index: INTEGER _ Index[mv, row, col]; IF NOT mv.squares[index].open THEN context.MaskBox[[x, y-tvd, x+tvd, y]]; ENDLOOP; ENDLOOP; END; DrawPlayerTop: PROC [context: Context, row, col: INTEGER, angle: Angle] = BEGIN ViewerBlast.DrawBitmap[context: context, bitmap: topviews[angle], fOrigin: -col*tvd, sOrigin: -row*tvd]; END; Setup: PROC = BEGIN blastContext.TranslateT[[wb, wb]]; END; Setup[]; END. œ[Cedar]Top>MazeWar.df=>MazeWarPlayerImpl3.Mesa Last Edited by: Spreitzer, June 18, 1985 1:55:34 pm PDT INVARIANT No paints are going on. Κ%– "cedar" style˜JšœΟmœ(™;J™7J˜IcodešΟk œ˜ˆK˜šΠbxœžœž˜!KšžœU˜\Kšžœ˜šž ™ K™——K˜Kšžœžœ˜ K˜K˜K˜šΟn œžœžœžœ6žœ žœžœžœžœΟcœ˜žKšžœžœžœ‘,˜Gš  œžœ˜Kšž˜Kšœžœ˜K˜ K˜ K˜ K˜K˜K˜AKšžœžœžœž˜,šžœžœž˜$Kšž˜Kšœžœ˜Kšœ˜Kšœ˜Kšœ žœ˜K˜ K˜ K˜K˜MKšœ˜Kšœ!žœ˜'šžœRž˜XKšž˜K˜ K˜ K˜Kšœ žœ˜Kšžœ˜—Kšžœžœž˜ Kšžœžœ žœ'˜žœ žœ˜aKšžœ˜Kšž˜—šžœž˜ Kšžœžœžœ˜K˜(Kšœ/˜/K˜1Kšžœ˜—K˜)šžœž˜ Kšž˜Kšœžœ˜šœ+˜+K˜Kšœ˜Kšœ˜—Kšœ"˜"K˜$Kšœ3˜3K˜$šœ/˜/šœ˜Kšœ8˜8—Kšœ.˜.—Kšœpžœ žœ˜ˆKšœ?˜?Kšœpžœ žœ˜‡Kšž˜—šžœž˜ Kšœ:˜:Kšžœ˜—Kšžœ˜—K˜Kšœ4˜4KšœC˜CKšœA˜AK˜š œžœ"žœ!žœ˜hKšž˜Kšœ"˜"šžœž˜ Kšž˜K˜šœ:˜:Kšœ ˜ Kšœ!˜!Kšœ,˜,—Kšœl˜lKšž˜—Kšžœ]˜aKšžœ˜—K˜š  œžœ#˜4Kšž˜šžœžœžœž˜%šžœžœžœž˜%Kšœžœ ˜Kšœžœ ˜Kšœžœ˜%Kšžœžœžœ'˜IKšžœ˜—Kšžœ˜—Kšžœ˜—K˜š  œžœžœ˜IKšž˜Kšœh˜hKšžœ˜—K˜š œžœ˜ Kšž˜K˜"Kšžœ˜—K˜K˜K˜Kšžœ˜K˜—…—"γ