home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / games / volume18 / xboing / part10 / stage.c
C/C++ Source or Header  |  1993-09-13  |  14KB  |  476 lines

  1. #include "include/copyright.h"
  2.  
  3. /*
  4.  *  Include file dependencies:
  5.  */
  6.  
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <stddef.h>
  10. #include <X11/Xlib.h>
  11. #include <X11/Xutil.h>
  12. #include <X11/Xos.h>
  13. #include <xpm.h>
  14.  
  15. #include "bitmaps/mainbackground.xpm"
  16. #include "bitmaps/background.xpm"
  17. #include "bitmaps/background2.xpm"
  18. #include "bitmaps/background3.xpm"
  19. #include "bitmaps/background4.xpm"
  20. #include "bitmaps/background5.xpm"
  21. #include "bitmaps/background6.xpm"
  22. #include "bitmaps/background7.xpm"
  23. #include "bitmaps/background8.xpm"
  24. #include "bitmaps/background9.xpm"
  25. #include "bitmaps/background10.xpm"
  26. #include "bitmaps/background11.xpm"
  27. #include "bitmaps/icon.xpm"
  28.  
  29. #include "include/error.h"
  30. #include "include/blocks.h"
  31. #include "include/sfx.h"
  32. #include "include/ball.h"
  33. #include "include/paddle.h"
  34. #include "include/version.h"
  35. #include "include/init.h"
  36.  
  37. #include "include/stage.h"
  38.  
  39. /*
  40.  *  Internal macro definitions:
  41.  */
  42.  
  43. #define LEFT_OFFSET        10
  44. #define RIGHT_OFFSET    10
  45. #define TOP_OFFSET      10
  46. #define MIDDLE_OFFSET   10
  47.  
  48. /*
  49.  *  Internal type declarations:
  50.  */
  51.  
  52. #if NeedFunctionPrototypes
  53. static Window SetWMIcon(Display *display);
  54. #else
  55. static Window SetWMIcon();
  56. #endif
  57.  
  58. /*
  59.  *  Internal variable declarations:
  60.  */
  61.  
  62. Window iconWindow;
  63. Window mainWindow;
  64. Window scoreWindow;
  65. Window levelWindow;
  66. Window playWindow;
  67. Window bufferWindow;
  68. Window messWindow;
  69. Window specialWindow;
  70. Window timeWindow;
  71. Pixmap    mainBackPixmap, iconPixmap;
  72. Pixmap  back1Pixmap, back2Pixmap, back3Pixmap, back4Pixmap, back5Pixmap;
  73. Pixmap  back6Pixmap, back7Pixmap, back8Pixmap, back9Pixmap, back10Pixmap;
  74. Pixmap  back11Pixmap;
  75.  
  76. #if NeedFunctionPrototypes
  77. void InitialiseMainBackPixmap(Display *display, Window window, 
  78.     Colormap colormap)
  79. #else
  80. void InitialiseMainBackPixmap(display, window, colormap)
  81.     Display *display;
  82.     Window window;
  83.     Colormap colormap;
  84. #endif
  85. {
  86.     XpmAttributes   attributes;
  87.     int            XpmErrorStatus;
  88.  
  89.     attributes.valuemask = XpmColormap;
  90.     attributes.colormap = colormap;
  91.  
  92.     /* Create the playfield background pixmaps */
  93.  
  94.     XpmErrorStatus = XpmCreatePixmapFromData(display, window, 
  95.         mainbackground_xpm, &mainBackPixmap, NULL, &attributes);
  96.     HandleXPMError(display, XpmErrorStatus, "InitialiseMainBackPixmap()");
  97.  
  98.     XpmErrorStatus = XpmCreatePixmapFromData(display, window, background_xpm,
  99.         &back1Pixmap, NULL, &attributes);
  100.     HandleXPMError(display, XpmErrorStatus, "InitialiseMainBackPixmap()");
  101.  
  102.     XpmErrorStatus = XpmCreatePixmapFromData(display, window, background2_xpm,
  103.         &back2Pixmap, NULL, &attributes);
  104.     HandleXPMError(display, XpmErrorStatus, "InitialiseMainBackPixmap()");
  105.  
  106.     XpmErrorStatus = XpmCreatePixmapFromData(display, window, background3_xpm,
  107.         &back3Pixmap, NULL, &attributes);
  108.     HandleXPMError(display, XpmErrorStatus, "InitialiseMainBackPixmap()");
  109.  
  110.     XpmErrorStatus = XpmCreatePixmapFromData(display, window, background4_xpm,
  111.         &back4Pixmap, NULL, &attributes);
  112.     HandleXPMError(display, XpmErrorStatus, "InitialiseMainBackPixmap()");
  113.  
  114.     XpmErrorStatus = XpmCreatePixmapFromData(display, window, background5_xpm,
  115.         &back5Pixmap, NULL, &attributes);
  116.     HandleXPMError(display, XpmErrorStatus, "InitialiseMainBackPixmap()");
  117.  
  118.     XpmErrorStatus = XpmCreatePixmapFromData(display, window, background6_xpm,
  119.         &back6Pixmap, NULL, &attributes);
  120.     HandleXPMError(display, XpmErrorStatus, "InitialiseMainBackPixmap()");
  121.  
  122.     XpmErrorStatus = XpmCreatePixmapFromData(display, window, background7_xpm,
  123.         &back7Pixmap, NULL, &attributes);
  124.     HandleXPMError(display, XpmErrorStatus, "InitialiseMainBackPixmap()");
  125.  
  126.     XpmErrorStatus = XpmCreatePixmapFromData(display, window, background8_xpm,
  127.         &back8Pixmap, NULL, &attributes);
  128.     HandleXPMError(display, XpmErrorStatus, "InitialiseMainBackPixmap()");
  129.  
  130.     XpmErrorStatus = XpmCreatePixmapFromData(display, window, background9_xpm,
  131.         &back9Pixmap, NULL, &attributes);
  132.     HandleXPMError(display, XpmErrorStatus, "InitialiseMainBackPixmap()");
  133.  
  134.     XpmErrorStatus = XpmCreatePixmapFromData(display, window, background10_xpm,
  135.         &back10Pixmap, NULL, &attributes);
  136.     HandleXPMError(display, XpmErrorStatus, "InitialiseMainBackPixmap()");
  137.  
  138.     XpmErrorStatus = XpmCreatePixmapFromData(display, window, background11_xpm,
  139.         &back11Pixmap, NULL, &attributes);
  140.     HandleXPMError(display, XpmErrorStatus, "InitialiseMainBackPixmap()");
  141.  
  142.     /* Free the xpm pixmap attributes */
  143.     XpmFreeAttributes(&attributes);
  144. }
  145.  
  146. #if NeedFunctionPrototypes
  147. void ClearMainWindow(Display *display, Window window)
  148. #else
  149. void ClearMainWindow(display, window)
  150.     Display *display;
  151.     Window window;
  152. #endif
  153. {
  154.     /* Make sure that it is drawn */
  155.     XClearWindow(display, mainWindow);
  156. }
  157.  
  158. #if NeedFunctionPrototypes
  159. void CreateAllWindows(Display *display, Colormap colormap,
  160.     char **argv, int argc)
  161. #else
  162. void CreateAllWindows(display, colormap, argv, argc)
  163.     Display *display;
  164.     Colormap colormap;
  165.     char **argv;
  166.     int argc;
  167. #endif
  168. {
  169.     char             title[80];
  170.     int             offsetX, offsetY, scoreWidth;
  171.     XWMHints         wmhints;
  172.     XClassHint         classhints;
  173.     XSizeHints         sizehints;
  174.     XTextProperty     windowName, iconName;
  175.     XSetWindowAttributes winattr;
  176.     unsigned long     valuemask;
  177.  
  178.     char *window_Name     = "- XBoing -";
  179.     char *icon_Name     = "XBoing";
  180.  
  181.     offsetX = MAIN_WIDTH / 2;
  182.     offsetY = MAIN_HEIGHT / 2;
  183.     scoreWidth = 224;
  184.  
  185.     /* Create the main window */
  186.     mainWindow = XCreateSimpleWindow(display,
  187.         RootWindow(display, DefaultScreen(display)), 0, 0,
  188.         PLAY_WIDTH + MAIN_WIDTH + 10, PLAY_HEIGHT + MAIN_HEIGHT + 10, 2, 
  189.         red, black);
  190.  
  191.     /* Create the score window */
  192.     scoreWindow = XCreateSimpleWindow(display, mainWindow, 
  193.         offsetX, 10, scoreWidth, 42, 0, white, black);
  194.  
  195.     /* Create the level window */
  196.     levelWindow = XCreateSimpleWindow(display, mainWindow, 
  197.         scoreWidth + offsetX + 25, 5, 
  198.             PLAY_WIDTH + offsetX - 20 - scoreWidth, 52, 0, white, black);
  199.  
  200.     /* Create the playing area window */
  201.     playWindow = XCreateSimpleWindow(display, mainWindow, 
  202.         offsetX, 60, PLAY_WIDTH, PLAY_HEIGHT, 5, red, black);
  203.  
  204.     /* Create the buffer playing area window NON VISIBLE */
  205.     bufferWindow = XCreateSimpleWindow(display, mainWindow, 
  206.         offsetX, 60, PLAY_WIDTH, PLAY_HEIGHT, 5, red, black);
  207.  
  208.     /* Create the message area window */
  209.     messWindow = XCreateSimpleWindow(display, mainWindow, 
  210.         offsetX, 65 + PLAY_HEIGHT + 10, PLAY_WIDTH / 2, MESS_HEIGHT, 4, 
  211.         white, black);
  212.  
  213.     /* Create the special bonus area window */
  214.     specialWindow = XCreateSimpleWindow(display, mainWindow, 
  215.         offsetX + PLAY_WIDTH / 2 + 10, 65 + PLAY_HEIGHT + 10, 
  216.         180, MESS_HEIGHT + 5, 0, white, black);
  217.  
  218.     /* Create the timer area window */
  219.     timeWindow = XCreateSimpleWindow(display, mainWindow, 
  220.         offsetX + PLAY_WIDTH / 2 + 10 + 180 + 5, 
  221.         65 + PLAY_HEIGHT + 10, PLAY_WIDTH / 8, MESS_HEIGHT + 5, 
  222.         0, white, black);
  223.  
  224.     /* Set window manager properties */
  225.     sprintf(title, "XBoing V%d.%d", VERSION, REVNUM + buildNum);
  226.  
  227.     if (XStringListToTextProperty(&window_Name, 1, &windowName) == 0)
  228.         ShutDown(display, 1, "Cannot create window name resource.");
  229.  
  230.     if (XStringListToTextProperty(&icon_Name, 1, &iconName) == 0) 
  231.         ShutDown(display, 1, "Cannot create icon name resource.");
  232.  
  233.     iconWindow = SetWMIcon(display);
  234.  
  235.     /* Various window manager settings */
  236.     wmhints.initial_state     = NormalState;
  237.     wmhints.input             = True;
  238.     wmhints.icon_pixmap     = iconPixmap;
  239.     wmhints.icon_window     = iconWindow;
  240.     wmhints.flags = StateHint | InputHint | IconPixmapHint | IconWindowHint;
  241.  
  242.     /* Set the class for XBoing */
  243.     classhints.res_name        = "XBoing";
  244.     classhints.res_class     = "XBoing";
  245.  
  246.     /* Setup the max and minimum size that the window will be */
  247.     sizehints.flags         = PPosition | PSize | PMinSize | PMaxSize;
  248.     sizehints.min_width     = PLAY_WIDTH + MAIN_WIDTH + 10;
  249.     sizehints.min_height    = PLAY_HEIGHT + MAIN_HEIGHT + 10;
  250.     sizehints.max_width     = PLAY_WIDTH + MAIN_WIDTH + 10;
  251.     sizehints.max_height    = PLAY_HEIGHT + MAIN_HEIGHT + 10;
  252.  
  253.     /* Now set the window manager properties */
  254.     XSetWMProperties(display, mainWindow, &windowName, &iconName,
  255.         argv, argc, &sizehints, &wmhints, &classhints);
  256.  
  257.     /* Set the current icon as the window's background pixmap */
  258.     XSetWindowBackgroundPixmap(display, iconWindow, iconPixmap);
  259.     XClearWindow(display, iconWindow);
  260.  
  261.     valuemask = CWColormap;
  262.     winattr.colormap = colormap;
  263.  
  264.     /* Check if the server allows backing store */
  265.     if (DoesBackingStore(XDefaultScreenOfDisplay(display)) == Always)
  266.     {
  267.         /* Ok we want backing store as it is very useful */
  268.         valuemask |= CWBackingStore;
  269.         winattr.backing_store = Always;
  270.     }
  271.  
  272.     XChangeWindowAttributes(display, mainWindow,     valuemask, &winattr);
  273.     XChangeWindowAttributes(display, playWindow,     valuemask, &winattr);
  274.     XChangeWindowAttributes(display, bufferWindow,     valuemask, &winattr);
  275.     XChangeWindowAttributes(display, levelWindow,     valuemask, &winattr);
  276.     XChangeWindowAttributes(display, scoreWindow,     valuemask, &winattr);
  277.     XChangeWindowAttributes(display, messWindow,     valuemask, &winattr);
  278.     XChangeWindowAttributes(display, specialWindow, valuemask, &winattr);
  279.     XChangeWindowAttributes(display, timeWindow,     valuemask, &winattr);
  280. }
  281.  
  282. #if NeedFunctionPrototypes
  283. void SetBackgrounds(Display *display, Colormap colormap)
  284. #else
  285. void SetBackgrounds(display, colormap)
  286.     Display *display;
  287.     Colormap colormap;
  288. #endif
  289. {
  290.     InitialiseMainBackPixmap(display, mainWindow, colormap);
  291.  
  292.     ClearMainWindow(display, mainWindow);
  293.     XSetWindowBackgroundPixmap(display, levelWindow, ParentRelative);
  294.     XClearWindow(display, levelWindow);
  295.     XSetWindowBackgroundPixmap(display, scoreWindow, ParentRelative);
  296.     XClearWindow(display, scoreWindow);
  297.     XSetWindowBackgroundPixmap(display, specialWindow, ParentRelative);
  298.     XClearWindow(display, specialWindow);
  299.     XSetWindowBackgroundPixmap(display, timeWindow, ParentRelative);
  300.     XClearWindow(display, timeWindow);
  301. }
  302.  
  303. #if NeedFunctionPrototypes
  304. void MapAllWindows(Display *display)
  305. #else
  306. void MapAllWindows(display)
  307.     Display *display;
  308. #endif
  309. {
  310.     /* Actually make everything visible */
  311.       XMapWindow(display, specialWindow);
  312.       XMapWindow(display, timeWindow);
  313.       XMapWindow(display, messWindow);
  314.     XMapWindow(display, playWindow);
  315.     XMapWindow(display, levelWindow);
  316.     XMapWindow(display, scoreWindow);
  317.     XMapWindow(display, mainWindow);
  318.     XFlush(display);
  319. }
  320.  
  321. #if NeedFunctionPrototypes
  322. void RedrawPlayWindow(Display *display, Window window)
  323. #else
  324. void RedrawPlayWindow(display, window)
  325.     Display *display;
  326.     Window window;
  327. #endif
  328. {
  329.     /* Redraw the main playfield */
  330.     XClearWindow(display, playWindow);
  331.     RedrawAllBlocks(display, window);
  332.     RedrawPaddle(display, window);
  333.     RedrawBall(display, window);
  334. }
  335.  
  336. #if NeedFunctionPrototypes
  337. void FreeBackgroundPixmaps(Display *display)
  338. #else
  339. void FreeBackgroundPixmaps(display)
  340.     Display *display;
  341. #endif
  342. {
  343.     /* Free all the backgound pixmaps */
  344.     if (back1Pixmap)    XFreePixmap(display, back1Pixmap); 
  345.     if (back2Pixmap)    XFreePixmap(display, back2Pixmap);
  346.     if (back3Pixmap)    XFreePixmap(display, back3Pixmap); 
  347.     if (back4Pixmap)    XFreePixmap(display, back4Pixmap);
  348.     if (back5Pixmap)    XFreePixmap(display, back5Pixmap); 
  349.     if (back6Pixmap)    XFreePixmap(display, back6Pixmap); 
  350.     if (back7Pixmap)    XFreePixmap(display, back7Pixmap); 
  351.     if (back8Pixmap)    XFreePixmap(display, back8Pixmap); 
  352.     if (back9Pixmap)    XFreePixmap(display, back9Pixmap); 
  353.     if (back10Pixmap)    XFreePixmap(display, back10Pixmap); 
  354.     if (back11Pixmap)    XFreePixmap(display, back11Pixmap); 
  355.  
  356.     /* Free the icon and main background pixmaps */
  357.     if (iconPixmap)        XFreePixmap(display, iconPixmap);
  358.     if (mainBackPixmap)    XFreePixmap(display, mainBackPixmap); 
  359. }
  360.  
  361. #if NeedFunctionPrototypes
  362. static Window SetWMIcon(Display *display)
  363. #else
  364. static Window SetWMIcon(display)
  365.     Display *display;
  366. #endif
  367. {
  368.     XpmAttributes   attributes;
  369.     Window               win, root;
  370.     Colormap        iconcolormap;
  371.     int                XpmErrorStatus;
  372.                             
  373.     /* Suss out the root window */
  374.     root = RootWindow(display, DefaultScreen(display));
  375.  
  376.     if (!(win = XCreateSimpleWindow(display, root,
  377.         0, 0, 50, 50, 0, CopyFromParent, CopyFromParent)))
  378.     {
  379.         /* Well, what a bummer. Just use default icon then. */
  380.         ErrorMessage("Cannot create icon pixmap.");
  381.         return ((Window) NULL);
  382.     }
  383.  
  384.     /* Create a new colourmap for the icon window */
  385.     iconcolormap = XDefaultColormap(display, XDefaultScreen(display));
  386.  
  387.     /* Create all xpm pixmap blocks from the files */
  388.     attributes.colormap = iconcolormap;
  389.     attributes.valuemask = XpmColormap;
  390.     XpmErrorStatus = XpmCreatePixmapFromData(display, win, 
  391.         icon_xpm, &iconPixmap, NULL, &attributes);
  392.     HandleXPMError(display, XpmErrorStatus, "InitialiseWMIcon()");
  393.  
  394.     /* Make the new window have the new colourmap */
  395.     XSetWindowColormap(display, win, iconcolormap);
  396.  
  397.     /* Free the background pixmap attributes */
  398.     XpmFreeAttributes(&attributes);
  399.  
  400.     return win;
  401. }
  402.  
  403. #if NeedFunctionPrototypes
  404. void DrawStageBackground(Display *display, Window window, int stageType)
  405. #else
  406. void DrawStageBackground(display, window, stageType)
  407.     Display *display;
  408.     Window window;
  409.     int stageType;
  410. #endif
  411. {
  412.     switch (stageType)
  413.     {
  414.         case BACKGROUND_BLACK:
  415.             XSetWindowBackground(display, window, black);
  416.             break;
  417.  
  418.         case BACKGROUND_WHITE:
  419.             XSetWindowBackground(display, window, white);
  420.             break;
  421.  
  422.         case BACKGROUND_0:
  423.             XSetWindowBackgroundPixmap(display, window, mainBackPixmap);
  424.             break;
  425.  
  426.         case BACKGROUND_1:
  427.             XSetWindowBackgroundPixmap(display, window, back1Pixmap);
  428.             break;
  429.  
  430.         case BACKGROUND_2:
  431.             XSetWindowBackgroundPixmap(display, window, back2Pixmap);
  432.             break;
  433.  
  434.         case BACKGROUND_3:
  435.             XSetWindowBackgroundPixmap(display, window, back3Pixmap);
  436.             break;
  437.                                                                                         case BACKGROUND_4:
  438.             XSetWindowBackgroundPixmap(display, window, back4Pixmap);
  439.             break;
  440.  
  441.         case BACKGROUND_5:
  442.             XSetWindowBackgroundPixmap(display, window, back5Pixmap);
  443.             break;
  444.  
  445.         case BACKGROUND_6:
  446.             XSetWindowBackgroundPixmap(display, window, back6Pixmap);
  447.             break;
  448.  
  449.         case BACKGROUND_7:
  450.             XSetWindowBackgroundPixmap(display, window, back7Pixmap);
  451.             break;
  452.  
  453.         case BACKGROUND_8:
  454.             XSetWindowBackgroundPixmap(display, window, back8Pixmap);
  455.             break;
  456.  
  457.         case BACKGROUND_9:
  458.             XSetWindowBackgroundPixmap(display, window, back9Pixmap);
  459.             break;
  460.  
  461.         case BACKGROUND_10:
  462.             XSetWindowBackgroundPixmap(display, window, back10Pixmap);
  463.             break;
  464.  
  465.         case BACKGROUND_11:
  466.             XSetWindowBackgroundPixmap(display, window, back11Pixmap);
  467.             break;
  468.  
  469.         default:
  470.             XSetWindowBackgroundPixmap(display, window, back1Pixmap);
  471.     }
  472.  
  473.     /* Flush the new background */
  474.     XClearWindow(display, window);
  475. }
  476.