home *** CD-ROM | disk | FTP | other *** search
/ Desktop Works 1995 - 1996 / desktopworks1995-1996.iso / scrnsave / mw_fish / applfish.mod < prev    next >
Text File  |  1996-01-01  |  7KB  |  195 lines

  1. (*# check(stack=>off,
  2.           index=>off,
  3.           range=>off,
  4.           overflow=>off,
  5.           nil_ptr=>off) *)
  6.  
  7. IMPLEMENTATION MODULE ApplFish;
  8.  
  9. IMPORT Windows,WMain;
  10. FROM Storage IMPORT ALLOCATE, DEALLOCATE;
  11. FROM Lib     IMPORT RANDOM;
  12.  
  13. CONST
  14. (* String table constants *)
  15.   IDSNAME  =   100;
  16.   IDSABOUT =   200;
  17.   IDSTITLE =   300;
  18.   IDSMESSAGE = 400;
  19.   IDSCAPTION = 500;
  20.   IDSDEFSPEC = 501;
  21.   IDSDEFEXT  = 502;
  22.  
  23.   IDM_DESTROY    =     301;
  24.  
  25.   SPECIAL_CHANGE =     0401H;
  26.   INIT_INSTANCES =     0402H;
  27.  
  28.   FORWARDS     =       2;
  29.   BACKWARDS    =       1;
  30.   TURNING      =       0;
  31.  
  32.  
  33. PROCEDURE ReOutputOtherInstances(ThisFish : WMain.Fish ;
  34.                                  hMemoryDC,hdc : Windows.HDC);
  35. VAR TempInst : WMain.InstancePtr;
  36.     hOldbmap : Windows.HBITMAP;
  37. BEGIN
  38.      TempInst := ThisFish.Other;
  39.      WHILE TempInst # NIL DO
  40.          hOldbmap := Windows.SelectObject(hMemoryDC, ThisFish.bmap[TempInst^.direction,TempInst^.bmapno]);
  41.          IF Windows.BitBlt(hdc,TempInst^.xpos,TempInst^.ypos,ThisFish.xextent,ThisFish.yextent,hMemoryDC,0,0,Windows.SRCPAINT) # 0 THEN END;
  42.          TempInst := TempInst^.NextInstance
  43.      END
  44. END ReOutputOtherInstances;
  45.  
  46. PROCEDURE DeleteFishInstances;
  47. VAR i : INTEGER;
  48.     TempInst : WMain.InstancePtr;
  49. BEGIN
  50.     FOR i := 1 TO WMain.FishMax DO
  51.         WHILE WMain.FishHead[i].Other # NIL DO
  52.               TempInst := WMain.FishHead[i].Other;
  53.               WMain.FishHead[i].Other := WMain.FishHead[i].Other^.NextInstance;
  54.               DISPOSE(TempInst)
  55.         END
  56.     END
  57. END DeleteFishInstances;
  58.  
  59.  
  60. PROCEDURE AnimateOtherInstances(hdc,hMemoryDC   : Windows.HDC;
  61.                                 ThisFish        : WMain.Fish);
  62. VAR TempInst : WMain.InstancePtr;
  63.     hOldbmap : Windows.HBITMAP;
  64. BEGIN
  65.      TempInst := ThisFish.Other;
  66.      WHILE TempInst # NIL DO
  67.         IF ((TempInst^.speedx < 0) AND (TempInst^.pspeedx >= 0)) OR
  68.            ((TempInst^.speedx > 0) AND (TempInst^.pspeedx <= 0)) THEN
  69.            hOldbmap := Windows.SelectObject(hMemoryDC,ThisFish.turnbmap);
  70.            IF Windows.BitBlt(hdc,TempInst^.xpos,TempInst^.ypos,ThisFish.xextent,ThisFish.yextent,hMemoryDC,0,0,Windows.SRCCOPY) = 0 THEN
  71.            END;
  72.         END;
  73.         IF TempInst^.speedx > 0 THEN
  74.            IF Windows.BitBlt(hdc,TempInst^.xpos,TempInst^.ypos,TempInst^.speedx,ThisFish.yextent,hMemoryDC,0,0,Windows.BLACKNESS) # 0 THEN END;
  75.         END;
  76.         IF TempInst^.speedx < 0 THEN
  77.            IF Windows.BitBlt(hdc,TempInst^.xpos+ThisFish.xextent+INTEGER(TempInst^.speedx),TempInst^.ypos,-TempInst^.speedx,ThisFish.yextent,hMemoryDC,0,0,Windows.BLACKNESS) # 0 THEN END;
  78.         END;
  79.           TempInst^.pspeedx := TempInst^.speedx;
  80.           TempInst^.pspeedy := TempInst^.speedy;
  81.         IF TempInst^.xpos < WMain.RealXYRect.left-ThisFish.xextent THEN TempInst^.xpos := WMain.RealXYRect.right END;
  82.         IF TempInst^.xpos > WMain.RealXYRect.right THEN TempInst^.xpos := WMain.RealXYRect.left-ThisFish.xextent END;
  83.         TempInst^.xpos := TempInst^.xpos + INTEGER(TempInst^.speedx);
  84.         TempInst^.ypos := TempInst^.ypos + INTEGER(TempInst^.speedy);
  85.         IF TempInst^.ypos > WMain.RealXYRect.bottom THEN TempInst^.ypos := WMain.RealXYRect.top-ThisFish.yextent END;
  86.         IF TempInst^.ypos < WMain.RealXYRect.top-ThisFish.yextent THEN TempInst^.ypos := WMain.RealXYRect.bottom END;
  87.         IF TempInst^.bmapno = 4 THEN
  88.            TempInst^.bmapno := 1
  89.         ELSE
  90.            INC(TempInst^.bmapno)
  91.         END;
  92.         hOldbmap := Windows.SelectObject(hMemoryDC, ThisFish.bmap[TempInst^.direction,TempInst^.bmapno]);
  93.         IF Windows.BitBlt(hdc,TempInst^.xpos,TempInst^.ypos,ThisFish.xextent,ThisFish.yextent,hMemoryDC,0,0,Windows.SRCCOPY) # 0 THEN END;
  94.  
  95.         TempInst := TempInst^.NextInstance;
  96.      END;
  97.  
  98. END AnimateOtherInstances;
  99.  
  100. PROCEDURE RandomizeInstances(ThisFish : WMain.Fish);
  101. VAR TempInst : WMain.InstancePtr;
  102.     randomy  : CARDINAL;
  103.   PROCEDURE Increase( VAR X : INTEGER);
  104.   BEGIN
  105.       IF X < 0 THEN DEC(X) END;
  106.       IF X > 0 THEN INC(X) END;
  107.   END Increase;
  108.  
  109. BEGIN
  110.      TempInst := ThisFish.Other;
  111.      WHILE TempInst # NIL DO
  112.          randomy := RANDOM(5);
  113.          TempInst^.pspeedx := TempInst^.speedx;
  114.          TempInst^.pspeedy := TempInst^.speedy;
  115.          CASE randomy OF
  116.               | 0 :  TempInst^.speedy := -1;Increase(TempInst^.speedx);
  117.               | 1 :  TempInst^.speedy := 1;TempInst^.speedx := 0;
  118.               | 2 :  TempInst^.speedx := ThisFish.basespeed;TempInst^.direction:=FORWARDS;TempInst^.speedy := 0;
  119.               | 3 :  TempInst^.speedx := -ThisFish.basespeed;TempInst^.direction:=BACKWARDS;TempInst^.speedy := 0;
  120.          END;
  121.          TempInst := TempInst^.NextInstance
  122.      END
  123.  
  124. END RandomizeInstances;
  125.  
  126. PROCEDURE ReInitInstances(hWnd : Windows.HWND ;
  127.                           hdc  : Windows.HDC ;
  128.                           NInstances, FishHere : CARDINAL);
  129. VAR
  130.   TempInst,NextInst : WMain.InstancePtr;
  131.   i                 : INTEGER;
  132.   Rect              : Windows.RECT;
  133.   Xorg,Yorg         : INTEGER;
  134.   Origin            : LONGCARD;
  135.  
  136. BEGIN
  137.     WMain.StopAllTimers(hWnd);
  138.     TempInst := WMain.FishHead[FishHere].Other;
  139.     WHILE TempInst # NIL DO
  140.       NextInst := TempInst^.NextInstance;
  141.       DISPOSE(TempInst);
  142.       TempInst := NextInst
  143.     END;
  144.     TempInst := NIL;
  145.     WMain.FishHead[FishHere].Instances := NInstances -1;
  146.     Origin := Windows.GetWindowOrg(hdc);
  147.     Xorg := INTEGER(Windows.LOWORD(Origin));
  148.     Yorg := INTEGER(Windows.HIWORD(Origin));
  149.     Windows.GetClientRect(hWnd,Rect);
  150.     NextInst := NIL;
  151.     WHILE NInstances > 1 DO
  152.           NEW(TempInst);
  153.           NInstances := NInstances - 1;
  154.           TempInst^.bmapno := 1;
  155.           TempInst^.direction := WMain.FishHead[FishHere].direction;
  156.           TempInst^.xpos := RANDOM(Rect.right) + CARDINAL(Xorg);
  157.           TempInst^.ypos := RANDOM(Rect.bottom) + CARDINAL(Yorg);
  158.           TempInst^.speedx := WMain.FishHead[FishHere].speedx;
  159.           TempInst^.speedy := WMain.FishHead[FishHere].speedy;
  160.           TempInst^.NextInstance := NextInst;
  161.           NextInst := TempInst
  162.     END;
  163.     WMain.FishHead[FishHere].Other := NextInst;
  164.     WMain.StartAllTimers(hWnd);
  165. END ReInitInstances;
  166.  
  167. PROCEDURE ResourcesLow(hWnd : Windows.HWND) : BOOLEAN;
  168. BEGIN
  169.     WMain.StopAllTimers(hWnd);
  170.     IF Windows.MessageBox(hWnd,"Application Termination Advised. Terminate ?","System Resources Low",
  171.        Windows.MB_ICONSTOP + Windows.MB_YESNO) = Windows.IDYES THEN
  172.  
  173.        WMain.QuickDeleteRgns(hWnd);
  174.  
  175.        IF Windows.SetTimer(hWnd,IDM_DESTROY,500,Windows.FARPROC(0)) = 0 THEN END;
  176.  
  177.        RETURN(TRUE);
  178.  
  179.     END;
  180.     RETURN (FALSE)
  181.  
  182. END ResourcesLow;
  183.  
  184. PROCEDURE TimersLow(hWnd : Windows.HWND);
  185. BEGIN
  186.     WMain.StopAllTimers(hWnd);
  187.     IF Windows.MessageBox(hWnd,"Application Termination Advised. Terminate ?","Too Many Timers Running",
  188.        Windows.MB_ICONSTOP + Windows.MB_YESNO) = Windows.IDYES THEN
  189.  
  190.        IF Windows.SendMessage(hWnd,Windows.WM_CLOSE,0,0) = 0 THEN END
  191.     END;
  192. END TimersLow;
  193.  
  194. END ApplFish.
  195.