home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / games / volume15 / gtetris3 / part01 / tetris.c < prev    next >
C/C++ Source or Header  |  1993-01-27  |  12KB  |  398 lines

  1. /*
  2. # GENERIC X-WINDOW-BASED TETRIS
  3. #
  4. #    tetris.c
  5. #
  6. ###
  7. #
  8. #  Copyright (C) 1992, 1993     Qiang Alex Zhao, azhao@cs.arizona.edu
  9. #        Computer Science Dept, University of Arizona
  10. #
  11. #            All Rights Reserved
  12. #
  13. #  Permission to use, copy, modify, and distribute this software and
  14. #  its documentation for any purpose and without fee is hereby granted,
  15. #  provided that the above copyright notice appear in all copies and
  16. #  that both that copyright notice and this permission notice appear in
  17. #  supporting documentation, and that the name of the author not be
  18. #  used in advertising or publicity pertaining to distribution of the
  19. #  software without specific, written prior permission.
  20. #
  21. #  This program is distributed in the hope that it will be "playable",
  22. #  but WITHOUT ANY WARRANTY; without even the implied warranty of
  23. #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  24. #
  25. */
  26.  
  27. #include "tetris.h"
  28.  
  29. /*** variables ***/
  30.  
  31. char            myDisplayName[256];
  32. Display        *display;
  33. int             screen_num;
  34. Visual         *visual;
  35. Bool            useColor = True;
  36. Colormap        colormap;
  37. Window          mainWin, blockWin;
  38. Cursor          theCursor;
  39. XFontStruct    *bigFont, *tinyFont;
  40. unsigned long   fg, bg;
  41.  
  42. XSizeHints      sizehints = {
  43.     PMinSize | PMaxSize | PPosition | PSize | USSize,
  44.     0, 0,            /* x, y */
  45.     0, 0,            /* w, h */
  46.     0, 0,            /* min w, min h */
  47.     0, 0,            /* max w, max h */
  48.     0, 0,            /* inc, not set */
  49.     0, 0, 0, 0            /* aspect ratio, not set */
  50. };
  51. XSizeHints      iconsizehints = {
  52.     PPosition | PSize,
  53.     0, 0,            /* x, y */
  54.     48, 48,            /* w, h */
  55.     0, 0,            /* min w, min h */
  56.     0, 0,            /* max w, max h */
  57.     0, 0,            /* inc, not set */
  58.     0, 0, 0, 0            /* aspect ratio, not set */
  59. };
  60. XWMHints        wmhints = {
  61.     InputHint | StateHint | IconPixmapHint,
  62.     True,            /* input mode */
  63.     NormalState,        /* normal */
  64.     0,                /* icon pixmap */
  65.     0,                /* icon window */
  66.     0, 0,            /* icon position */
  67.     0                /* icon mask pixmap - not used */
  68. };
  69.  
  70. char            myHome[FILENAMELEN];
  71. int             level = 3, prefilled = 0, score = 0, rows = 0;
  72. Bool            showNext = False, beep = False;
  73. score_t         myscore;
  74.  
  75. static int      opTableEntries = 15;
  76. static XrmOptionDescRec opTable[] = {
  77.     {"-s", ".scoresOnly", XrmoptionIsArg, (caddr_t) NULL},
  78.     {"-l", "*startLevel", XrmoptionSepArg, (caddr_t) NULL},
  79.     {"-p", "*preFilledLines", XrmoptionSepArg, (caddr_t) NULL},
  80.     {"-showNext", "*showNext", XrmoptionNoArg, (caddr_t) "on"},
  81.     {"-beep", "*beep", XrmoptionNoArg, (caddr_t) "on"},
  82.     {"-display", ".display", XrmoptionSepArg, (caddr_t) NULL},
  83.     {"-geometry", "*geometry", XrmoptionSepArg, (caddr_t) NULL},
  84.     {"-iconGeometry", "*iconGeometry", XrmoptionSepArg, (caddr_t) NULL},
  85.     {"-background", "*background", XrmoptionSepArg, (caddr_t) NULL},
  86.     {"-bg", "*background", XrmoptionSepArg, (caddr_t) NULL},
  87.     {"-foreground", "*foreground", XrmoptionSepArg, (caddr_t) NULL},
  88.     {"-fg", "*foreground", XrmoptionSepArg, (caddr_t) NULL},
  89.     {"-bigFont", "*bigFont", XrmoptionSepArg, (caddr_t) NULL},
  90.     {"-tinyFont", "*tinyFont", XrmoptionSepArg, (caddr_t) NULL},
  91.     {"-xrm", NULL, XrmoptionResArg, (caddr_t) NULL}
  92. };
  93. static XrmDatabase cmmDB = (XrmDatabase) NULL, rDB = (XrmDatabase) NULL;
  94.  
  95. static void parseOpenDisp();
  96. static void Usage();
  97. static void getDefaults();
  98.  
  99. /* ------------------------------------------------------------------ */
  100.  
  101. void
  102. main(argc, argv)
  103.     int             argc;
  104.     char           *argv[];
  105. {
  106.     (void) fprintf(stderr,
  107.            "                 GENERIC TETRIS V2.0.1\n");
  108.     (void) fprintf(stderr,
  109.      "Copyright (C) 1992-93      Q. Alex Zhao, azhao@cs.arizona.edu\n");
  110.     (void) fprintf(stderr,
  111.          "       Computer Science Dept, University of Arizona\n\n");
  112.     (void) fprintf(stderr,
  113.            "GENERIC TETRIS comes with ABSOLUTELY NO WARRANTY.\n\n");
  114.  
  115.     parseOpenDisp(&argc, argv);
  116.     getDefaults();
  117.     inits(argc, argv);
  118.     playing();
  119.     /* never come to here */
  120. }
  121.  
  122. /* ------------------------------------------------------------------ */
  123.  
  124. static void
  125. parseOpenDisp(argc, argv)
  126.     int            *argc;
  127.     char           *argv[];
  128. {
  129.     struct passwd  *pw;
  130.     XrmValue        value;
  131.     char           *str_type[20];
  132.     XVisualInfo     vtmp, *vinfo;
  133.     int             n = 1;
  134.  
  135.     XrmInitialize();
  136.  
  137.     myDisplayName[0] = '\0';
  138.  
  139.     XrmParseCommand(&cmmDB, opTable, opTableEntries, argv[0], argc, argv);
  140.  
  141.     /* check for any arguments left */
  142.     if (*argc != 1) {
  143.     Usage(argv[0]);
  144.     }
  145.     /* only print out the scores? */
  146.     if (XrmGetResource(cmmDB, "tetris.scoresOnly", "Tetris.ScoresOnly",
  147.                str_type, &value) == True) {
  148.     showScores(0);
  149.     exit(0);
  150.     }
  151.     /* get display now */
  152.     if (XrmGetResource(cmmDB, "tetris.display", "Tetris.Display",
  153.                str_type, &value) == True)
  154.     (void) strncpy(myDisplayName, value.addr, (int) value.size);
  155.  
  156.     if (!(display = XOpenDisplay(myDisplayName))) {
  157.     (void) fprintf(stderr, "%s: Can't open display '%s'\n",
  158.                argv[0], XDisplayName(myDisplayName));
  159.     exit(1);
  160.     }
  161.     screen_num = DefaultScreen(display);
  162.     visual = DefaultVisual(display, screen_num);
  163.     colormap = DefaultColormap(display, screen_num);
  164.     vtmp.visualid = XVisualIDFromVisual(visual);
  165.     if ((vinfo = XGetVisualInfo(display, VisualIDMask, &vtmp, &n)) != NULL) {
  166.     if ((vinfo->class == GrayScale) || (vinfo->class == StaticGray)) {
  167.         useColor = False;
  168.     }
  169.     XFree((unsigned char *) vinfo);
  170.     } else {
  171.     useColor = False;
  172.     }
  173.  
  174.     /* setup user information */
  175.     (void) gethostname(myscore.myhost, NAMELEN);
  176.     setpwent();
  177.     pw = getpwuid(getuid());
  178.     endpwent();
  179.     if (pw == NULL) {        /* impossible? */
  180.     (void) sprintf(myscore.myname, "%d", getuid());
  181.     myHome[0] = '.';
  182.     myHome[1] = '/';
  183.     myHome[2] = '\0';
  184.     } else {
  185.     (void) strncpy(myscore.myname, pw->pw_name, NAMELEN);
  186.     (void) strncpy(myHome, pw->pw_dir, FILENAMELEN);
  187.     }
  188.     myscore.myname[NAMELEN - 1] = '\0';
  189.     myscore.myhost[NAMELEN - 1] = '\0';
  190.     myHome[FILENAMELEN - 1] = '\0';
  191. }
  192.  
  193. /* ------------------------------------------------------------------ */
  194.  
  195. static void
  196. Usage(argv0)
  197.     char           *argv0;
  198. {
  199.     (void) fprintf(stderr,
  200.     "Usage: %s [-s] [-l <starting level>] [-p <prefilled rows>]\n", argv0);
  201.     (void) fprintf(stderr,
  202.     "   [-display <display>] [-geometry <geometry>] [-iconGeometry\n");
  203.     (void) fprintf(stderr,
  204.     "   <icon geometry>] [-fg <foreground>] [-bg <background>]\n");
  205.     (void) fprintf(stderr,
  206.     "   [-bigFont <font>] [-tinyFont <font>] [-showNext] [-beep]\n");
  207.     (void) fprintf(stderr,
  208.     "   [-xrm <resource specifications>]\n");
  209.  
  210.     exit(1);
  211. }
  212.  
  213. /* ------------------------------------------------------------------ */
  214.  
  215. static void
  216. getDefaults()
  217. {
  218.     XrmDatabase     homeDB, serverDB, appDB;
  219.     char            filenamebuf[FILENAMELEN];
  220.     char           *filename = &filenamebuf[0];
  221.     char           *env;
  222.     char           *classname = "Tetris";
  223.     char            name[255], geoStr[20], icongeoStr[20];
  224.     XrmValue        value;
  225.     char           *str_type[20];
  226.     int             x, y;
  227.     unsigned int    w, h;
  228.     long            flags;
  229.  
  230.     (void) strcpy(name, "/usr/lib/X11/app-defaults/");
  231.     (void) strcat(name, classname);
  232.  
  233.     /* Get application defaults file, if any */
  234.     appDB = XrmGetFileDatabase(name);
  235.     (void) XrmMergeDatabases(appDB, &rDB);
  236.  
  237.     if (XResourceManagerString(display) != NULL) {
  238.     serverDB = XrmGetStringDatabase(XResourceManagerString(display));
  239.     } else {
  240.     (void) strcpy(filename, myHome);
  241.     (void) strcat(filename, "/.Xdefaults");
  242.     serverDB = XrmGetFileDatabase(filename);
  243.     }
  244.     XrmMergeDatabases(serverDB, &rDB);
  245.  
  246.     if ((env = getenv("XENVIRONMENT")) == NULL) {
  247.     int             len;
  248.  
  249.     env = &filenamebuf[0];
  250.     (void) strcpy(env, myHome);
  251.     len = strlen(env);
  252.     (void) gethostname(env + len, FILENAMELEN - len);
  253.     }
  254.     homeDB = XrmGetFileDatabase(env);
  255.     XrmMergeDatabases(homeDB, &rDB);
  256.  
  257.     XrmMergeDatabases(cmmDB, &rDB);
  258.  
  259.     /* starting levels */
  260.  
  261.     if (XrmGetResource(cmmDB, "tetris.startLevel", "Tetris.StartLevel",
  262.                str_type, &value) == True) {
  263.     if ((sscanf(value.addr, "%d", &level) <= 0) ||
  264.         (level < 0) || (level >= NUM_LEVELS)) {
  265.         (void) fprintf(stderr, "Tetris: Invalid level.\n");
  266.         exit(1);
  267.     }
  268.     }
  269.  
  270.     /* prefilled lines */
  271.  
  272.     if (XrmGetResource(cmmDB, "tetris.preFilledLines", "Tetris.PreFilledLines",
  273.                str_type, &value) == True) {
  274.     if ((sscanf(value.addr, "%d", &prefilled) <= 0) ||
  275.         (prefilled < 0) || (prefilled >= ROWS - THINGSIZE)) {
  276.         (void) fprintf(stderr, "Tetris: Invalid prefilled lines.\n");
  277.         exit(1);
  278.     }
  279.     }
  280.  
  281.     /* show next */
  282.  
  283.     if (XrmGetResource(cmmDB, "tetris.showNext", "Tetris.ShowNext",
  284.             str_type, &value) == True) {
  285.     showNext = True;
  286.     }
  287.  
  288.     /* beep */
  289.  
  290.     if (XrmGetResource(cmmDB, "tetris.beep", "Tetris.Beep",
  291.             str_type, &value) == True) {
  292.     beep = True;
  293.     }
  294.  
  295.     /*** get foreground/background colors ***/
  296.  
  297.     if (XrmGetResource(rDB, "tetris.foreground", "Tetris.Foreground",
  298.                str_type, &value) == True) {
  299.     (void) strncpy(name, value.addr, (int) value.size);
  300.     fg = getColor(name);
  301.     } else
  302.     fg = BlackPixel(display, screen_num);
  303.  
  304.     if (XrmGetResource(rDB, "tetris.background", "Tetris.Background",
  305.                str_type, &value) == True) {
  306.     (void) strncpy(name, value.addr, (int) value.size);
  307.     bg = getColor(name);
  308.     } else
  309.     bg = WhitePixel(display, screen_num);
  310.  
  311.     if (bg == fg) {
  312.     bg = WhitePixel(display, screen_num);
  313.     fg = BlackPixel(display, screen_num);
  314.     }
  315.  
  316.     /*** get geometry info ***/
  317.  
  318.     if (XrmGetResource(rDB, "tetris.geometry", "Tetris.Geometry",
  319.                str_type, &value) == True) {
  320.     (void) strncpy(geoStr, value.addr, (int) value.size);
  321.     } else {
  322.     geoStr[0] = '\0';
  323.     }
  324.  
  325.     flags = XParseGeometry(geoStr, &x, &y, &w, &h);
  326.     if ((WidthValue | HeightValue) & flags)
  327.     Usage("tetris");
  328.  
  329.     if (XValue & flags) {
  330.     if (XNegative & flags)
  331.         x = DisplayWidth(display, screen_num) + x - sizehints.width;
  332.     sizehints.x = x;
  333.     }
  334.     if (YValue & flags) {
  335.     if (YNegative & flags)
  336.         y = DisplayHeight(display, screen_num) + y - sizehints.height;
  337.     sizehints.y = y;
  338.     }
  339.  
  340.     /*** get icon geometry info ***/
  341.  
  342.     if (XrmGetResource(rDB, "tetris.iconGeometry", "Tetris.IconGeometry",
  343.                str_type, &value) == True) {
  344.     (void) strncpy(icongeoStr, value.addr, (int) value.size);
  345.     } else {
  346.     icongeoStr[0] = '\0';
  347.     }
  348.  
  349.     flags = XParseGeometry(icongeoStr, &x, &y, &w, &h);
  350.     if ((WidthValue | HeightValue) & flags)
  351.     Usage("tetris");
  352.  
  353.     if (XValue & flags) {
  354.     if (XNegative & flags)
  355.         x = DisplayWidth(display, screen_num) + x - iconsizehints.width;
  356.     wmhints.flags |= IconPositionHint;
  357.     wmhints.icon_x = x;
  358.     iconsizehints.x = x;
  359.     }
  360.     if (YValue & flags) {
  361.     if (YNegative & flags)
  362.         y = DisplayHeight(display, screen_num) + y - iconsizehints.height;
  363.     wmhints.flags |= IconPositionHint;
  364.     wmhints.icon_y = y;
  365.     iconsizehints.y = y;
  366.     }
  367.  
  368.     /*** get fonts ***/
  369.  
  370.     if (XrmGetResource(rDB, "tetris.bigFont", "tetris.BigFont",
  371.                str_type, &value) == True) {
  372.     (void) strncpy(name, value.addr, (int) value.size);
  373.     } else {
  374.     (void) strcpy(name, BIGFONT);
  375.     }
  376.     if ((bigFont = XLoadQueryFont(display, name)) == NULL) {
  377.     (void) fprintf(stderr, "Tetris: can't open font '%s'.\n", name);
  378.     exit(1);
  379.     }
  380.     if (XrmGetResource(rDB, "tetris.tinyFont", "tetris.TinyFont",
  381.                str_type, &value) == True) {
  382.     (void) strncpy(name, value.addr, (int) value.size);
  383.     } else {
  384.     (void) strcpy(name, TINYFONT);
  385.     }
  386.     if ((tinyFont = XLoadQueryFont(display, name)) == NULL) {
  387.     (void) fprintf(stderr, "Tetris: can't open font '%s'.\n", name);
  388.     exit(1);
  389.     }
  390.  
  391.     /*
  392.      * clean up
  393.      */
  394.     XrmDestroyDatabase(rDB);
  395. }
  396.  
  397. /* ------------------------------------------------------------------ */
  398.