Fixing bug #115351 (insane speed on linux 2.6)
authorAlfredo Tupone <tupone@gentoo.org>
Tue, 14 Mar 2006 19:22:42 +0000 (19:22 +0000)
committerAlfredo Tupone <tupone@gentoo.org>
Tue, 14 Mar 2006 19:22:42 +0000 (19:22 +0000)
Package-Manager: portage-2.1_pre5-r4

games-arcade/xboing/ChangeLog
games-arcade/xboing/Manifest
games-arcade/xboing/files/01_all_insaneSpeed.patch [new file with mode: 0644]
games-arcade/xboing/files/digest-xboing-2.4-r2 [new file with mode: 0644]
games-arcade/xboing/xboing-2.4-r2.ebuild [new file with mode: 0644]

index 0230867830cd2000b8374ac34faceff5f0912954..aba7faa2430e69149aca697918e22f9b9c2d6b56 100644 (file)
@@ -1,6 +1,12 @@
 # ChangeLog for games-arcade/xboing
 # Copyright 1999-2006 Gentoo Foundation; Distributed under the GPL v2
-# $Header: /var/cvsroot/gentoo-x86/games-arcade/xboing/ChangeLog,v 1.8 2006/01/29 00:00:27 joshuabaergen Exp $
+# $Header: /var/cvsroot/gentoo-x86/games-arcade/xboing/ChangeLog,v 1.9 2006/03/14 19:22:42 tupone Exp $
+
+*xboing-2.4-r2 (14 Mar 2006)
+
+  14 Mar 2006; <Tupone@gentoo.org> +files/01_all_insaneSpeed.patch,
+  +xboing-2.4-r2.ebuild:
+  Fixing Bug #115351 (insane speed on linux 2.6). Thanks to bakker Bart
 
   28 Jan 2006; Joshua Baergen <joshuabaergen@gentoo.org>
   xboing-2.4-r1.ebuild:
index 09d81ebcd9a0c9e205bad388929f64f17bce69b8..a46aeef431f0585c369e1aa84029c60125fb963e 100644 (file)
@@ -1,12 +1,21 @@
-MD5 8bb363e497cd705806a82ef015dfe626 ChangeLog 984
-RMD160 5d5f8d2b636b17813b751c427c622fa4d94bec21 ChangeLog 984
-SHA256 5c47848e6a293f5f1a29fb958643b82d2edf60b652cf5bdf2ae3871fa3448809 ChangeLog 984
+MD5 5893c0d3ee3f75f7289665e797d21e10 ChangeLog 1173
+RMD160 238d7003e728887425bed137707ce44eb6cc08cf ChangeLog 1173
+SHA256 cd1b2aa1d58ec5299d8c27816b2566f5bb12739fe2fea75086fe2fd56ed5ac88 ChangeLog 1173
+MD5 35113230bee9c55b340e5bb701938d77 files/01_all_insaneSpeed.patch 11554
+RMD160 863965cbcf364124ae206d7d8e2cdcf7e5dd75c9 files/01_all_insaneSpeed.patch 11554
+SHA256 c1061e87471290d862817474f560943a8794f062938af916c7d61f6ab1ba956f files/01_all_insaneSpeed.patch 11554
 MD5 1624963aea6e3f0dfabfb6d9a447c942 files/digest-xboing-2.4-r1 131
 RMD160 7d405b5057bd5b36c75df3ec1c67db11c5077457 files/digest-xboing-2.4-r1 131
 SHA256 d0b017284fb2b067f1745f8b39ef39090cba8f5c9d2f91b1fddc59b811752b08 files/digest-xboing-2.4-r1 131
+MD5 8ef4dccbe0be4466ce9e425c0240802b files/digest-xboing-2.4-r2 485
+RMD160 216bb007322dd5c87e66edf69fc345b0540613d0 files/digest-xboing-2.4-r2 485
+SHA256 1c2f047ddb7abc448cfc111e2782e77194eeec60b89e3ae97be25cc7ba301778 files/digest-xboing-2.4-r2 485
 MD5 f17b9b8fa07a38914fe1c03268f51678 metadata.xml 158
 RMD160 cbd9984bb6b426c8c9cee5022fe0a26261612fea metadata.xml 158
 SHA256 1423a4fdd4a79b1728a2056d9e300f7e1074253095d82726218d9e9b953888a3 metadata.xml 158
 MD5 ef87481a559ce7ab5a0572010b9ed54f xboing-2.4-r1.ebuild 1276
 RMD160 5dad9cb579011248b301840002b061c0537ca8f0 xboing-2.4-r1.ebuild 1276
 SHA256 c121656a230ea57b0df047f86329534a76632992ce401387dc16cb94b2634f9b xboing-2.4-r1.ebuild 1276
+MD5 ea0caa63b740692f82d6feb162af48ae xboing-2.4-r2.ebuild 1315
+RMD160 f02b1c092553f4dfc0fa8ef7da3cf38d4e50c2b7 xboing-2.4-r2.ebuild 1315
+SHA256 35d7c7b0a5ab1348b27f8f5950acb8e419e3d1f83e81909ac89cb59a1cb4f13d xboing-2.4-r2.ebuild 1315
diff --git a/games-arcade/xboing/files/01_all_insaneSpeed.patch b/games-arcade/xboing/files/01_all_insaneSpeed.patch
new file mode 100644 (file)
index 0000000..e5d28d8
--- /dev/null
@@ -0,0 +1,470 @@
+diff -u --recursive xboing/bonus.c xbpatch/bonus.c
+--- xboing/bonus.c     Fri Nov 22 01:28:46 1996
++++ xbpatch/bonus.c    Tue Jan 14 18:48:28 1997
+@@ -311,7 +311,7 @@
+       XFlush(display);
+       SetBonusWait(BONUS_SCORE, frame + 5);
+-      SetGameSpeed(SLOW_SPEED);
++      SetGameSpeed(MEDIUM_SPEED);
+       DEBUG("set bonus mode to BONUS_SCORE.")
+ }
+@@ -326,7 +326,7 @@
+ {
+       DEBUG("in function DoScore() in bonus.c")
+-      SetGameSpeed(SLOW_SPEED);
++      SetGameSpeed(MEDIUM_SPEED);
+       /* Nice message rewarding you for your efforts */
+       strcpy(string, "Congratulations on finishing this level.");
+@@ -336,7 +336,7 @@
+       ypos += (35 + GAP);
+       SetBonusWait(BONUS_BONUS, frame + LINE_DELAY);
+-      SetGameSpeed(SLOW_SPEED);
++      SetGameSpeed(MEDIUM_SPEED);
+       DEBUG("set bonus mode to BONUS_BONUS.")
+ }
+@@ -363,7 +363,7 @@
+               DrawShadowCentredText(display, window, textFont, 
+                       string, ypos, blue, TOTAL_WIDTH);
+-              SetGameSpeed(SLOW_SPEED);
++              SetGameSpeed(MEDIUM_SPEED);
+               /* Now skip to the next sequence */
+               SetBonusWait(BONUS_LEVEL, frame + LINE_DELAY);
+@@ -387,7 +387,7 @@
+                       DrawShadowCentredText(display, window, textFont, 
+                               string, ypos, blue, TOTAL_WIDTH);
+-                      SetGameSpeed(SLOW_SPEED);
++                      SetGameSpeed(MEDIUM_SPEED);
+                       /* Now skip to the next sequence */
+                       SetBonusWait(BONUS_LEVEL, frame + LINE_DELAY);
+@@ -411,7 +411,7 @@
+                       bonusScore += ComputeScore(SUPER_BONUS_SCORE);
+                       DisplayScore(display, scoreWindow, bonusScore);
+       
+-                      SetGameSpeed(SLOW_SPEED);
++                      SetGameSpeed(MEDIUM_SPEED);
+                       /* Now skip to the next sequence */
+                       SetBonusWait(BONUS_LEVEL, frame + LINE_DELAY);
+@@ -454,7 +454,7 @@
+               ypos += (int) (textFont->ascent + GAP * 1.5);
+               firstTime = True;
+-              SetGameSpeed(SLOW_SPEED);
++              SetGameSpeed(MEDIUM_SPEED);
+       }
+ }
+@@ -468,7 +468,7 @@
+ {
+       int secs, theLevel;
+-      SetGameSpeed(SLOW_SPEED);
++      SetGameSpeed(MEDIUM_SPEED);
+       /* Get the number of seconds left on the clock */
+       secs = GetLevelTimeBonus();
+@@ -533,7 +533,7 @@
+                       /* Play the sound for the super bonus */
+                       if (noSound == False) playSoundFile("Doh3", 80);
+                       
+-                      SetGameSpeed(SLOW_SPEED);
++                      SetGameSpeed(MEDIUM_SPEED);
+                       /* Get ready for the next sequence */
+                       SetBonusWait(BONUS_TIME, frame + LINE_DELAY);
+@@ -569,7 +569,7 @@
+               SetBonusWait(BONUS_TIME, frame + LINE_DELAY);
+               ypos += (textFont->ascent + GAP/2);
+               firstTime = True;
+-              SetGameSpeed(SLOW_SPEED);
++              SetGameSpeed(MEDIUM_SPEED);
+       }
+ }
+@@ -583,7 +583,7 @@
+ {
+       int secs = 0;
+-      SetGameSpeed(SLOW_SPEED);
++      SetGameSpeed(MEDIUM_SPEED);
+       /* Get the number of seconds left on the clock */
+       secs = GetLevelTimeBonus();
+@@ -627,7 +627,7 @@
+       int myrank = 0;
+       char str[5];
+-      SetGameSpeed(SLOW_SPEED);
++      SetGameSpeed(MEDIUM_SPEED);
+       /* Obtain current ranking for this score */
+       myrank = GetHighScoreRanking(score);
+@@ -680,7 +680,7 @@
+ {
+       DEBUG("DoEndText in bonus screen.")
+-      SetGameSpeed(SLOW_SPEED);
++      SetGameSpeed(MEDIUM_SPEED);
+       /* Finishing sentence - so you know what level to do */
+       sprintf(string, "Prepare for level %ld", level+1);
+diff -u --recursive xboing/main.c xbpatch/main.c
+--- xboing/main.c      Fri Nov 22 01:28:46 1996
++++ xbpatch/main.c     Tue Jan 14 18:32:30 1997
+@@ -156,7 +156,7 @@
+       /* Set an entire game speedup or slowdown speed */
+       temp = (speed / (long) userDelay);
+-      userDelay = delay;
++      userDelay = delay/2 + 3;
+       speed = (long) (temp * userDelay);
+       speedLevel = 10 - delay;
+ }
+diff -u --recursive xboing/misc.c xbpatch/misc.c
+--- xboing/misc.c      Fri Nov 22 01:28:46 1996
++++ xbpatch/misc.c     Tue Jan 14 18:54:45 1997
+@@ -89,8 +89,8 @@
+ #ifdef SYSV
+ #ifdef __clipper__
+     struct timeval tv;
+-    tv.tv_sec=((usec)/1000);
+-    tv.tv_usec=(((usec)%1000)*1000);
++    tv.tv_sec=((usec)/1000000);
++    tv.tv_usec=((usec)%1000000);
+     select(1,NULL,NULL,NULL,&tv);
+ #else
+     poll((struct poll *) 0, (size_t) 0, usec / 1000);   /* ms resolution */
+@@ -105,6 +105,68 @@
+ #endif
+ #if NeedFunctionPrototypes
++static        int     kudelay(unsigned long count)
++#else
++static        int     kudelay(count)
++unsigned long count;
++#endif
++{
++    unsigned int      bluff = 1;
++
++    while( count-- != 0 )     /* this can hardly be "optimised out" */
++      bluff = (bluff ^ ((bluff & 1) * 0x6110)) >> 1;
++
++    return( bluff );
++}
++
++#if NeedFunctionPrototypes
++static        void kusleep(unsigned long usec)
++#else
++static        void kusleep(usec)
++        unsigned long usec;
++#endif
++{
++    static float      kuliber_time = 0.0;
++    static float      kuliber_count = 0.0;
++    static unsigned long      kutimerswap = (1000000 / 15);
++    struct timeval    st, et;
++    long              gap;
++    unsigned long     count;
++
++    if( kuliber_time == 0.0 )
++    {
++      count = 0x1000;         /* calibrate delay loop */
++      gettimeofday(&st, NULL);
++
++      while( True )
++      {
++          kudelay( count );
++          count = (count << 1);
++          gettimeofday(&et, NULL);
++          gap = (((et.tv_sec - st.tv_sec) * 1000000) +
++                      (et.tv_usec - st.tv_usec) );
++
++          if( gap > 400*1000 )
++              break;
++      }
++
++      kuliber_time = (float)(gap/4);
++      kuliber_count = (float)(((count-1)&~0xFFF)>>2);
++    }
++
++    if( usec > kutimerswap )
++    {
++      kutimerswap = (1000000 / 30);
++      usleep( usec );         /* using usleep() for low resolution only */
++    }
++    else
++    {
++      kutimerswap = (1000000 / 15);
++      kudelay( (unsigned long)(kuliber_count*((float)usec/kuliber_time)) );
++    }
++}
++
++#if NeedFunctionPrototypes
+ void sleepSync(Display *display, unsigned long ms)
+ #else
+ void sleepSync(display, ms)
+@@ -112,27 +174,85 @@
+     unsigned long ms;
+ #endif
+ {
+-    struct timeval st, et;
+-    long SyncTime;
+-    static unsigned long accu;
++    static long               Expected_time = 0;
++    static long               Ref_sec = 0;
++    static long               Ref_usec = 0;
++    static long               Sleeping_time = 0;
++    static int                PLL_filter = 0;
++    struct timeval    st;
++    long              elapsed;
++    long              dodelay;
++    float             x;
+-    gettimeofday(&st, NULL);
+     XSync(display, False);
+-    gettimeofday(&et, NULL);
+-    SyncTime = (((et.tv_sec - st.tv_sec) * 1000) +
+-               ((et.tv_usec - st.tv_usec) / 1000) );
++    gettimeofday(&st, NULL);
++
++    if( Ref_sec == 0 )
++    {
++      Ref_sec = st.tv_sec;    /* take the initial reference point */
++      Ref_usec = st.tv_usec;
++      Sleeping_time = ms * 1000;
++    }
++
++    elapsed = (st.tv_sec - Ref_sec) * 1000000 + (st.tv_usec - Ref_usec);
++    dodelay = Sleeping_time;
++
++    if( PLL_filter > 0 && elapsed != 0 )      /* Phase lock loop */
++    {
++      dodelay = Expected_time + Sleeping_time - elapsed;
++
++      if( dodelay < 0 )
++      {
++          dodelay = 0; PLL_filter--;
++      }
++      else
++          if( dodelay > 2*Sleeping_time )
++          {
++              dodelay = 2*Sleeping_time; PLL_filter--;
++          }
++          else
++              PLL_filter = 3;
++
++      if( elapsed > 40*Sleeping_time && Expected_time > 40*Sleeping_time )
++      {
++          elapsed -= 20*Sleeping_time; /* Ref. point shouldn't be far away*/
++          Expected_time -= 20*Sleeping_time;
++          Ref_usec += 20*Sleeping_time;
++          Ref_sec += Ref_usec/1000000; Ref_usec %= 1000000;
++      }
++    }
+-/*    if ((ms) > ((1000 / 60) + SyncTime))
+-        usleep(ms - SyncTime);
+-*/
+-    if ((ms + accu) > ((1000 / 30) + SyncTime)) 
++    if( PLL_filter <= 0 && elapsed > 40000 )  /* Frequency lock loop */
+     {
+-        usleep(ms +accu - SyncTime);
+-        accu = 0;
++      /* feedback filter */
++      x = 0.5 + 0.5 * (float)Expected_time / (float)elapsed;
++
++      if( x < 0.966 ) /* Acceleration must be strongly limited */
++          x = 0.966;
++
++      if( x > 2.0 )
++          x = 2.0;
++
++      Sleeping_time = (long)((float)Sleeping_time * x);
++
++      if( Sleeping_time < 500 )
++          Sleeping_time = 500;
++
++      if( x > 0.99 && x < 1.01 && Sleeping_time > ms*500 )
++          PLL_filter = -1 - 4*PLL_filter; /* locked - it's time to try PLL */
++      else
++          PLL_filter = 0;
++
++      Ref_sec = st.tv_sec;
++      Ref_usec = st.tv_usec;
++      Expected_time = 0;
++      dodelay = Sleeping_time;
+     }
+-    else if (ms > SyncTime)
+-       accu += (ms - SyncTime);
++
++    kusleep( dodelay );
++
++    Expected_time += ms * 1000;
+ }
+ #if NeedFunctionPrototypes
+diff -u --recursive xboing/presents.c xbpatch/presents.c
+--- xboing/presents.c  Fri Nov 22 01:28:46 1996
++++ xbpatch/presents.c Tue Jan 14 18:35:40 1997
+@@ -287,7 +287,7 @@
+       }
+ #endif
+-      SetPresentWait(PRESENT_TEXT1, frame + 800);
++      SetPresentWait(PRESENT_TEXT1, frame + 200);
+ }
+ #if NeedFunctionPrototypes
+@@ -309,7 +309,7 @@
+       RenderShape(display, window, justin, justinM,
+               x, y, 285, 44, True);
+-      SetPresentWait(PRESENT_TEXT2, frame + 300);
++      SetPresentWait(PRESENT_TEXT2, frame + 100);
+ }
+ #if NeedFunctionPrototypes
+@@ -331,7 +331,7 @@
+       RenderShape(display, window, kibell, kibellM,
+               x, y, 260, 40, True);
+-      SetPresentWait(PRESENT_TEXT3, frame + 500);
++      SetPresentWait(PRESENT_TEXT3, frame + 200);
+ }
+ #if NeedFunctionPrototypes
+@@ -355,7 +355,7 @@
+       RenderShape(display, window, presents, presentsM,
+               x, y, 410, 44, True);
+-      SetPresentWait(PRESENT_TEXT_CLEAR, frame + 750);
++      SetPresentWait(PRESENT_TEXT_CLEAR, frame + 250);
+ }
+ #if NeedFunctionPrototypes
+@@ -375,7 +375,7 @@
+       FadeAwayArea(display, window, x, y, 410, 44);
+-      SetPresentWait(PRESENT_LETTERS, frame + 10);
++      SetPresentWait(PRESENT_LETTERS, frame + 5);
+ }
+ /* The distances for the gap inbetwen blocks */
+@@ -404,7 +404,7 @@
+               DrawLetter(display, window, i, x, y);
+               x += 10 + dists[i];
+-              SetPresentWait(PRESENT_LETTERS, frame + 300);
++              SetPresentWait(PRESENT_LETTERS, frame + 100);
+       }
+       else
+       {
+@@ -416,7 +416,7 @@
+               x += dists[3];
+               DrawLetter(display, window, 3, x, y);
+-              SetPresentWait(PRESENT_SHINE, frame + 200);
++              SetPresentWait(PRESENT_SHINE, frame + 100);
+       }
+       i++;
+@@ -463,7 +463,7 @@
+         if (in == 11)
+         {
+             XCopyArea(display, store, window, gc, 0, 0, 20, 20, x, y);
+-                      SetPresentWait(PRESENT_SPECIAL_TEXT1, frame + 500);
++                      SetPresentWait(PRESENT_SPECIAL_TEXT1, frame + 100);
+         }
+     }
+ }
+@@ -499,7 +499,7 @@
+               len = strlen(wisdom);
+               x = ((PLAY_WIDTH + MAIN_WIDTH) / 2) - 
+                       (XTextWidth(dataFont, wisdom, len) / 2);
+-              nextFrame = frame + 10;
++              nextFrame = frame + 5;
+               first = False;
+       }
+@@ -508,11 +508,11 @@
+               if (noSound == False) playSoundFile("key", 60);
+               DrawText(display, window, x, y, dataFont, red, wisdom, i);
+-              nextFrame = frame + 30;
++              nextFrame = frame + 15;
+               i++;
+               if (i > len)
+-                      SetPresentWait(PRESENT_SPECIAL_TEXT2, frame + 700);
++                      SetPresentWait(PRESENT_SPECIAL_TEXT2, frame + 150);
+       }
+ }
+@@ -542,7 +542,7 @@
+               len = strlen(wisdom2);
+               x = ((PLAY_WIDTH + MAIN_WIDTH) / 2) - 
+                       (XTextWidth(dataFont, wisdom2, len) / 2);
+-              nextFrame = frame + 10;
++              nextFrame = frame + 5;
+               first = False;
+       }
+@@ -551,11 +551,11 @@
+               if (noSound == False) playSoundFile("key", 60);
+               DrawText(display, window, x, y, dataFont, red, wisdom2, i);
+-              nextFrame = frame + 30;
++              nextFrame = frame + 15;
+               i++;
+               if (i > len)
+-                      SetPresentWait(PRESENT_SPECIAL_TEXT3, frame + 700);
++                      SetPresentWait(PRESENT_SPECIAL_TEXT3, frame + 150);
+       }
+ }
+@@ -584,7 +584,7 @@
+               len = strlen(wisdom3);
+               x = ((PLAY_WIDTH + MAIN_WIDTH) / 2) - 
+                       (XTextWidth(dataFont, wisdom3, len) / 2);
+-              nextFrame = frame + 10;
++              nextFrame = frame + 5;
+               first = False;
+       }
+@@ -593,11 +593,11 @@
+               if (noSound == False) playSoundFile("key", 60);
+               DrawText(display, window, x, y, dataFont, red, wisdom3, i);
+-              nextFrame = frame + 30;
++              nextFrame = frame + 15;
+               i++;
+               if (i > len)
+-                      SetPresentWait(PRESENT_CLEAR, frame + 800);
++                      SetPresentWait(PRESENT_CLEAR, frame + 200);
+       }
+ }
+@@ -642,7 +642,7 @@
+               yb -= 10;
+               if (yt > ((PLAY_HEIGHT + MAIN_HEIGHT) / 2))
+-                      SetPresentWait(PRESENT_FINISH, frame + 20);
++                      SetPresentWait(PRESENT_FINISH, frame + 10);
+               nextFrame = frame + 20;
+       }
+
diff --git a/games-arcade/xboing/files/digest-xboing-2.4-r2 b/games-arcade/xboing/files/digest-xboing-2.4-r2
new file mode 100644 (file)
index 0000000..a5551be
--- /dev/null
@@ -0,0 +1,6 @@
+MD5 b0567f3833c7c2152cce8526b06e07cf xboing-2.4-debian.patch.bz2 7740
+RMD160 90ab378da5bf13c2e8c880191d82faec6ec4c66d xboing-2.4-debian.patch.bz2 7740
+SHA256 14461b3684c8a651fb9cff864931f1e56600c373a16b8ea61a98f689173c893e xboing-2.4-debian.patch.bz2 7740
+MD5 d596d29e53cf0deceb18f3b646787709 xboing2.4.tar.gz 588811
+RMD160 3aa027dd7a7abe9b4119362a1c8b5fb968971567 xboing2.4.tar.gz 588811
+SHA256 67019cb8c8a4da0b1177dcc8bed063afe3b8f1853b18345dbc1deaca51d4a29a xboing2.4.tar.gz 588811
diff --git a/games-arcade/xboing/xboing-2.4-r2.ebuild b/games-arcade/xboing/xboing-2.4-r2.ebuild
new file mode 100644 (file)
index 0000000..a1cb8e5
--- /dev/null
@@ -0,0 +1,56 @@
+# Copyright 1999-2006 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: /var/cvsroot/gentoo-x86/games-arcade/xboing/xboing-2.4-r2.ebuild,v 1.1 2006/03/14 19:22:42 tupone Exp $
+
+inherit eutils games
+
+DESCRIPTION="blockout type game where you bounce a proton ball trying to destroy blocks"
+HOMEPAGE="http://www.techrescue.org/xboing/"
+SRC_URI="http://www.techrescue.org/xboing/${PN}${PV}.tar.gz
+       mirror://gentoo/xboing-${PV}-debian.patch.bz2"
+
+LICENSE="xboing"
+SLOT="0"
+KEYWORDS="~ppc ~sparc ~x86"
+IUSE=""
+
+RDEPEND="|| ( x11-libs/libXpm virtual/x11 )"
+DEPEND="${RDEPEND}
+       || ( ( app-text/rman
+                       x11-misc/gccmakedep
+                       x11-misc/imake )
+               virtual/x11 )"
+
+S=${WORKDIR}/${PN}
+
+src_unpack() {
+       unpack ${A}
+       cd "${S}"
+       epatch "${FILESDIR}"/01_all_insaneSpeed.patch \
+               "${WORKDIR}"/xboing-${PV}-debian.patch
+       sed -i '/^#include/s:xpm\.h:X11/xpm.h:' *.c
+}
+
+src_compile() {
+       xmkmf -a || die
+       sed -i \
+               -e "s:GENTOO_VER:${PF/${PN}-/}:" \
+               Imakefile
+       emake \
+               CXXOPTIONS="${CXXFLAGS}" \
+               CDEBUGFLAGS="${CFLAGS}" \
+               XBOING_DIR=${GAMES_DATADIR}/${PN} \
+               || die
+}
+
+src_install() {
+       make \
+               PREFIX=${D} \
+               XBOING_DIR=${GAMES_DATADIR}/${PN} \
+               install \
+               || die
+       newman xboing.man xboing.6
+       dodoc README docs/*.doc
+       prepgamesdirs
+       fperms 660 ${GAMES_STATEDIR}/xboing.score
+}