rpms/npush/F-9 npush-0.6-level-svn.patch, NONE, 1.1 npush.desktop, NONE, 1.1 npush.png, NONE, 1.1 npush.spec, NONE, 1.1 sources, 1.1, 1.2

Stefan Posdzich (cheekyboinc) fedora-extras-commits at redhat.com
Wed Jul 9 19:02:00 UTC 2008


Author: cheekyboinc

Update of /cvs/pkgs/rpms/npush/F-9
In directory cvs-int.fedora.redhat.com:/tmp/cvs-serv27324

Modified Files:
	sources 
Added Files:
	npush-0.6-level-svn.patch npush.desktop npush.png npush.spec 
Log Message:
Initial commit


npush-0.6-level-svn.patch:

--- NEW FILE npush-0.6-level-svn.patch ---
--- npush.cpp	2008-05-26 00:18:20.000000000 +0200
+++ npush.cpp.patch	2008-07-07 16:36:35.000000000 +0200
@@ -28,682 +28,804 @@
 #include <stack>
 #include <string>
 #include <vector>
+#include <algorithm>
+#include <map>
 //-----------------------------------------------------------------------------
-typedef enum { kUp, kDown, kLeft, kRight, kButton, kSwitchPlayer, kQuitGame,
-    kUndo, kUnknown } KeyType;
+//kUnknown must be at start so it's value is 0.
+typedef enum { kUnknown, kUp, kDown, kLeft, kRight, kButton, kSwitchPlayer, kQuitGame,
+               kUndo
+             } KeyType;
 typedef enum { paMoved, paLevelComplete, paNone } PlayerAction;
 typedef enum { fMenu, fGame } Font;
 //-----------------------------------------------------------------------------
-void Box(int x0, int y0, int x1, int y1, bool clear)
-{
-    attrset(A_BOLD);
-    if (clear)
-    {
-        for (int y=y0; y<y1; y++)
-        {
-            move(y, x0);
-            for (int x=x0; x<x1; x++)
-                addch(' ');
+void
+Box (int x0, int y0, int x1, int y1, bool clear) {
+    attrset (A_BOLD);
+    if (clear) {
+        for (int y = y0; y < y1; y++) {
+            move (y, x0);
+            for (int x = x0; x < x1; x++)
+                addch (' ');
         }
     }
 
-    for (int x=x0; x<x1; x++)
-    {
-        mvaddch(y0, x, ACS_HLINE);
-        mvaddch(y1, x, ACS_HLINE);
+    for (int x = x0; x < x1; x++) {
+        mvaddch (y0, x, ACS_HLINE);
+        mvaddch (y1, x, ACS_HLINE);
     }
 
-    for (int y=y0; y<y1; y++)
-    {
-        mvaddch(y, x0, ACS_VLINE);
-        mvaddch(y, x1, ACS_VLINE);
+    for (int y = y0; y < y1; y++) {
+        mvaddch (y, x0, ACS_VLINE);
+        mvaddch (y, x1, ACS_VLINE);
     }
 
-    mvaddch(y0, x0, ACS_ULCORNER);
-    mvaddch(y0, x1, ACS_URCORNER);
-    mvaddch(y1, x0, ACS_LLCORNER);
-    mvaddch(y1, x1, ACS_LRCORNER);
+    mvaddch (y0, x0, ACS_ULCORNER);
+    mvaddch (y0, x1, ACS_URCORNER);
+    mvaddch (y1, x0, ACS_LLCORNER);
+    mvaddch (y1, x1, ACS_LRCORNER);
 }
+
 //-----------------------------------------------------------------------------
-bool Message(const char *text, bool wait = true)
-{
+bool
+Message (const char *text, bool wait = true) {
     int len = 0;
     while (text[len])
         len++;
 
     int maxx, maxy;
-    getmaxyx(stdscr, maxy, maxx);
+    getmaxyx (stdscr, maxy, maxx);
 
     int x0 = (maxx - len - 2) / 2;
     int y0 = (maxy - 5) / 2;
 
-    Box(x0, y0, x0 + len + 3, y0 + 5, true);
-    attrset(A_BOLD);
-    mvprintw(y0+1, x0+2, (char *)text);
+    Box (x0, y0, x0 + len + 3, y0 + 5, true);
+    attrset (A_BOLD);
+    mvprintw (y0 + 1, x0 + 2, (char *) text);
 
     if (!wait)
         return false;
 
-    attrset(A_REVERSE);
-    mvprintw(y0+3, x0 + len/2, " OK");
-    attrset(A_NORMAL);
-    while (true)
-    {
-        int ch = getch();
-        if (ch == KEY_F(12))
+    attrset (A_REVERSE);
+    mvprintw (y0 + 3, x0 + len / 2, " OK");
+    attrset (A_NORMAL);
+    while (true) {
+        int ch = getch ();
+        if (ch == KEY_F (12))
             return false;
         if (ch == KEY_ENTER || ch == '\n')
             return true;
     }
 }
+
+int
+Prompt (const char *text) {
+    int len = 0;
+    while (text[len])
+        len++;
+
+    int maxx, maxy;
+    getmaxyx (stdscr, maxy, maxx);
+
+    int x0 = (maxx - len - 2) / 2;
+    int y0 = (maxy - 5) / 2;
+
+    Box (x0, y0, x0 + len + 3, y0 + 5, true);
+    attrset (A_BOLD);
+    mvprintw (y0 + 1, x0 + 2, (char *) text);
+    attrset (A_NORMAL);
+    int ch = getch ();
+    return ch;
+}
+
+class Config {
+private:
+    std::map < int, KeyType > charBind;
+public:
+    Config ();
+    void bind (KeyType t, int toBind);
+    KeyType lookup (int boundChar);
+    void clear ();
+    void eraseKey (KeyType erase);
+};
+
+Config::Config () {
+    charBind[KEY_UP] = kUp;
+    charBind[KEY_DOWN] = kDown;
+    charBind[KEY_LEFT] = kLeft;
+    charBind[KEY_RIGHT] = kRight;
+    charBind['\t'] = kSwitchPlayer;
+    charBind['q'] = kQuitGame;
+    charBind['u'] = kUndo;
+    charBind[KEY_ENTER] = kButton;
+    charBind['\n'] = kButton;
+}
+
+void
+Config::bind (KeyType t, int toBind) {
+    charBind[toBind] = t;
+}
+
+KeyType
+Config::lookup (int boundChar) {
+    return charBind[boundChar];
+}
+
+void
+Config::clear () {
+    charBind.clear ();
+}
+
+void
+Config::eraseKey (KeyType erase) {
+    for (std::map < int, KeyType >::iterator it = charBind.begin ();
+            it != charBind.end (); it++) {
+        if ((*it).second == erase) {
+            charBind.erase (it);
+            return;
+        }
+    }
+}
+
 //-----------------------------------------------------------------------------
-class Screen
-{
+class Screen {
 private:
 public:
-    virtual ~Screen();
-    bool init();
-    void printText(int x, int y, const std::string& text, Font f = fGame);
-    void render();
-    void clear();
-    KeyType getChar();
+    virtual ~ Screen ();
+    bool init ();
+    void printText (int x, int y, const std::string & text, Font f = fGame);
+    void render ();
+    void clear ();
+    Config config;
+    KeyType getChar ();
 };
 //-----------------------------------------------------------------------------
-void Screen::clear()
-{
-    erase();
+void
+Screen::clear () {
+    erase ();
 }
+
 //-----------------------------------------------------------------------------
-KeyType Screen::getChar()
-{
-    int ch = getch();
-    switch (ch)
-    {
-        case KEY_DOWN:  return kDown;
-        case KEY_UP:    return kUp;
-        case KEY_LEFT:  return kLeft;
-        case KEY_RIGHT: return kRight;
-        case '\t':      return kSwitchPlayer;
-        case 'q':       return kQuitGame;
-        case 'u':       return kUndo;
-        case KEY_ENTER:
-        case '\n':
-            return kButton;
-    }
-    return kUnknown;
+KeyType
+Screen::getChar () {
+    int ch = getch ();
+
+    return config.lookup (ch);
 }
+
 //-----------------------------------------------------------------------------
-bool Screen::init()
-{
+bool
+Screen::init () {
     // currently we have ncurses implementation, but it can be easily changed
     // just by creating instance of another class in main()
 
-    if (!initscr())  // init curses
+    if (!initscr ())        // init curses
         return false;
-    start_color();
-    cbreak();
-    keypad(stdscr, TRUE);
-    noecho();
-
-    init_pair(1, COLOR_YELLOW, COLOR_BLACK);
-    init_pair(2, COLOR_GREEN, COLOR_BLACK);
-    init_pair(3, COLOR_BLUE, COLOR_BLACK);
-    init_pair(4, COLOR_RED, COLOR_BLACK);
+    start_color ();
+    cbreak ();
+    keypad (stdscr, TRUE);
+    noecho ();
+
+    init_pair (1, COLOR_YELLOW, COLOR_BLACK);
+    init_pair (2, COLOR_GREEN, COLOR_BLACK);
+    init_pair (3, COLOR_BLUE, COLOR_BLACK);
+    init_pair (4, COLOR_RED, COLOR_BLACK);
     return true;
 }
+
 //-----------------------------------------------------------------------------
-Screen::~Screen()
-{
-    endwin();
+Screen::~Screen () {
+    endwin ();
 }
+
 //-----------------------------------------------------------------------------
-void Screen::printText(int x, int y, const std::string& text, Font f)
-{
-    if (f == fMenu) // weight and such
-    {
-        attrset(A_NORMAL);
+void
+Screen::printText (int x, int y, const std::string & text, Font f) {
+    if (f == fMenu) {   // weight and such
+        attrset (A_NORMAL);
     }
 
-    if (f == fGame) // color and such
-    {
-        attrset(A_BOLD);
+    if (f == fGame) {   // color and such
+        attrset (A_BOLD);
     }
 
-    mvprintw(y, x, "%s", text.c_str());
+    mvprintw (y, x, "%s", text.c_str ());
 }
+
 //-----------------------------------------------------------------------------
-void Screen::render()
-{
-    mvprintw(1, 1, "-=[ nPush ]=-   -=[ nPush ]=-                 http://npush.sourceforge.net/");
-    move(1, 15);
-    refresh();
+void
+Screen::render () {
+    mvprintw (1, 1,
+              "-=[ nPush ]=-   -=[ nPush ]=-                 http://npush.sourceforge.net/");
+    move (1, 15);
+    refresh ();
 }
+
 //-----------------------------------------------------------------------------
-class Menu
-{
+class Menu {
 private:
+    typedef std::vector < std::string > ItemList;
+    Screen & screenM;
+    ItemList itemsM;
     std::string titleM;
     bool showBigLogoM;
-    typedef std::vector<std::string> ItemList;
-    Screen &screenM;
-    ItemList itemsM;
     int currentItemM;
 
-    void drawBigLogo();
+    void drawBigLogo ();
 
 public:
-    Menu(Screen& s, const std::string& title, bool showBigLogo = false);
-    void add(const std::string& item);
-    std::string getItemText(int index);
-    int count();
-    int show();
+    Menu (Screen & s, const std::string & title, bool showBigLogo = false);
+    void add (const std::string & item);
+    std::string getItemText (int index);
+    int count ();
+    int show ();
 };
 //-----------------------------------------------------------------------------
-class ControlsConfigurator
-{
+class ControlsConfigurator {
 private:
-    Screen& screenM;
+    Screen & screenM;
 public:
-    ControlsConfigurator(Screen& scr);
+    ControlsConfigurator (Screen & scr);
 };
 //-----------------------------------------------------------------------------
-ControlsConfigurator::ControlsConfigurator(Screen& scr)
-    :screenM(scr)
-{
+ControlsConfigurator::ControlsConfigurator (Screen & scr):screenM (scr) {
     // show menu with current controls and allow changing
     // TODO: needs config() class
-    clear();
+    clear ();
 
-    int y = 3;
-    int x = 3;
-    mvprintw(y++, x, "Configure controls");
-    mvprintw(y++, x, "");
-    mvprintw(y++, x, "This option is not yet implemented. In the meantime use:");
-    mvprintw(y++, x, "");
-    mvprintw(y++, x, "arrow keys - movement");
-    mvprintw(y++, x, "       tab - switch player");
-    mvprintw(y++, x, "         u - undo last move (unlimited)");
-    mvprintw(y++, x, "         q - quit game");
+    /*int y = 3;
+       int x = 3;
+       mvprintw(y++, x, "Configure controls");
+       mvprintw(y++, x, "");
+       mvprintw(y++, x, "This option is not yet implemented. In the meantime use:");
+       mvprintw(y++, x, "");
+       mvprintw(y++, x, "arrow keys - movement");
+       mvprintw(y++, x, "       tab - switch player");
+       mvprintw(y++, x, "         u - undo last move (unlimited)");
+       mvprintw(y++, x, "         q - quit game");
+     */
+    Menu
+    m (scr, "Configuring Controls", false);
+    m.add ("Move Left");
+    m.add ("Move Right");
+    m.add ("Move Up");
+    m.add ("Move Down");
+    m.add ("Switch Player");
+    m.add ("Undo Last Move");
+    m.add ("Quit Game");
+    m.add ("Return to Main Menu");
+    scr.render ();
+    while (true) {
+        int
+        result = m.show ();
+        int
+        ch;
+        switch (result) {
+        case 0:
+            ch = Prompt ("Press a key for Left");
+            scr.config.eraseKey (kLeft);
+            scr.config.bind (kLeft, ch);
+            break;
+        case 1:
+            ch = Prompt ("Press a key for Right");
+            scr.config.eraseKey (kRight);
+            scr.config.bind (kRight, ch);
+            break;
+        case 2:
+            ch = Prompt ("Press a key for Up");
+            scr.config.eraseKey (kUp);
+            scr.config.bind (kUp, ch);
+            break;
+        case 3:
+            ch = Prompt ("Press a key for Down");
+            scr.config.eraseKey (kDown);
+            scr.config.bind (kDown, ch);
+            break;
+        case 4:
+            ch = Prompt ("Press a key for switching the player");
+            scr.config.eraseKey (kSwitchPlayer);
+            scr.config.bind (kSwitchPlayer, ch);
+            break;
+        case 5:
+            ch = Prompt ("Press a key for undoing moves");
+            scr.config.eraseKey (kUndo);
+            scr.config.bind (kUndo, ch);
+            break;
+        case 6:
+            ch = Prompt ("Press a key for quiting the game");
+            scr.config.eraseKey (kQuitGame);
+            scr.config.bind (kQuitGame, ch);
+            break;
+        case 7:
+            return;
+        }
+    }
 
-    scr.render();
-    getch();
 }
+
 //-----------------------------------------------------------------------------
-class LevelSelector
-{
+class
+            LevelSelector {
 private:
-    Screen& screenM;
+    Screen &
+    screenM;
 public:
-    LevelSelector(Screen& scr);
-    void start();
+    LevelSelector (Screen & scr);
+    void
+    start ();
 };
 //-----------------------------------------------------------------------------
-Menu::Menu(Screen& s, const std::string& title, bool showBigLogo)
-    :screenM(s), currentItemM(0), titleM(title), showBigLogoM(showBigLogo)
+Menu::Menu (Screen & s, const std::string & title, bool showBigLogo):
+        screenM (s),
+        titleM (title),
+        showBigLogoM (showBigLogo),
+        currentItemM (0)
 {
 }
+
 //-----------------------------------------------------------------------------
-void Menu::add(const std::string& item)
-{
-    itemsM.push_back(item);
+void
+Menu::add (const std::string & item) {
+    itemsM.push_back (item);
 }
+
 //-----------------------------------------------------------------------------
-std::string Menu::getItemText(int index)
-{
+std::string Menu::getItemText (int index) {
     return itemsM[index];
 }
+
 //-----------------------------------------------------------------------------
-int Menu::count()
-{
-    return itemsM.size();
+int
+Menu::count () {
+    return itemsM.size ();
 }
+
 //-----------------------------------------------------------------------------
-void Menu::drawBigLogo()
-{
+void
+Menu::drawBigLogo () {
     std::string msg[] = {
-    "                                        .ÜÜÛÛÛÛÛÛÛÛÛ²Ü/            ",
-    "                      ..             ÚÖÜÛÛÛÛÛÛÛÛ²ßß²ÛÛÛ²Ò:         ",
-    "                  .ÖÜÛÛÛÒÚ         ¿ÜÛÛÛÛÛÛÛÛÛÛÛ²·.  ¼ßÛÛÛp        ",
-    "                 .²ÛÛÛÛÛÛÛ.      _ÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ²¿ù  ÀßÛÛp       ",
-    "                 )ÛÛÛÛÛÛÛ¥      jÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ²²²²²ÜßÛÜ      ",
-    "                  Ô²ÛÛ²¼       jÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ²Û²,    ",
-    "                 _ÜÛÛÛ·ÜÜÜÜÜÜÜÖ²ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ².   ",
-    "                ª²ÛÛÛÛÛÛÛ²Û²ÛÛ²ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÝ   ",
-    "               ª²ÛÛ¼ÄÄÄ      ÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ   ",
-    "              jÛÛÛý          ÞÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ   ",
-    "             jÛÛ²ý           ûÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ©  ",
-    "            ÉÛÛÛÜ/           -²ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ[  ",
-    "          j²ÛÛ²ÛÛÛÜÖù         ÞÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ'  ",
-    "        ª²ÛÛ²¼ù ¼²ÛÛ²Öú       -²ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛý   ",
-    "      .ÜÛÛÛ¼ù     ¼ÛÛÛÝ        -ßÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛý    ",
-    "     j²ÛÛß'        ÞÛÛÝ         úÔ²ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ²ý     ",
-    "  ¿Ü²ÛÛ²¼          ²ÛÛ'            ÔßÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ²ß`      ",
-    "ÉÛÛÛÛÛß`          ÞÛÛÛ²p            ùÛ¼²ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ²¥         ",
-    "ÔßÛÛÛ²ý           ß²²ßßý                Àß²ÛÛÛÛÛÛÛÛÛ۲߼`          ",
-    "                                            -ÁÍÁ¼ß¼¼               "
+        "                                        .00OOOOOOOOO'0o            ",
+        "                      ..             000OOOOOOOO'88'OOO'0:         ",
+        "                  .00OOO00         o0OOOOOOOOOOO':.  %8OOOp        ",
+        "                 .'OOOOOOO.      _0OOOOOOOOOOOOOOO'Lu  A8OOp       ",
+        "                 )OOOOOOOY      jOOOOOOOOOOOOOOOOOOO'''''08O0      ",
+        "                  0'OO'%       jOOOOOOOOOOOOOOOOOOOOOOOOOOO'O',    ",
+        "                 _0OOO:00000000'OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO'.   ",
+        "                /'OOOOOOO'O'OO'OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO7   ",
+        "               /'OO%AAA      0OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo  ",
+        "              jOOOy          pOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo  ",
+        "             jOO'y           uOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo  ",
+        "            EOOO0/           -'OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO[  ",
+        "          j'OO'OOO00u         pOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO'  ",
+        "        /'OO'%u %'OO'0u       -'OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOy   ",
+        "      .0OOO%u     %OOO7        -8OOOOOOOOOOOOOOOOOOOOOOOOOOOOOy    ",
+        "     j'OO8'        pOO7         u0'OOOOOOOOOOOOOOOOOOOOOOOOO'y     ",
+        "  o0'OO'%          'OO'            08OOOOOOOOOOOOOOOOOOOOO'8'      ",
+        "EOOOOO8`          pOOO'p            uO%'OOOOOOOOOOOOOOOO'Y         ",
+        "08OOO'y           8''88y                A8'OOOOOOOOOO'8%`          ",
+        "                                            -UAA%8%%               "
     };
-    color_set(1, 0);
-    for (int i=0; i<sizeof(msg)/sizeof(std::string); ++i)
-        mvprintw(i+3, 13, "%s", msg[i].c_str());
+    color_set (1, 0);
+    for (unsigned i = 0; i < sizeof (msg) / sizeof (std::string); ++i)
+        mvprintw (i + 3, 13, "%s", msg[i].c_str ());
 }
+
 //-----------------------------------------------------------------------------
-int Menu::show()
-{
-    while (true)
-    {
+int
+Menu::show () {
+    while (true) {
         // render
-        screenM.clear();
+        screenM.clear ();
         if (showBigLogoM)
-            drawBigLogo();
-        screenM.printText(5, 3, titleM, fGame);
+            drawBigLogo ();
+        screenM.printText (5, 3, titleM, fGame);
 
         int y = 5;
-        for (ItemList::iterator it = itemsM.begin(); it != itemsM.end(); ++it)
-            screenM.printText(5, y++, (*it), fMenu);
-        screenM.printText(3, 5+currentItemM, "*", fMenu); // mark selected item
-        move(5+currentItemM, 3);
-        screenM.render();
+        for (ItemList::iterator it = itemsM.begin (); it != itemsM.end (); ++it)
+            screenM.printText (5, y++, (*it), fMenu);
+        screenM.printText (3, 5 + currentItemM, "*", fMenu);    // mark selected item
+        move (5 + currentItemM, 3);
+        screenM.render ();
 
         // process keys
-        KeyType k = screenM.getChar();
-        if (k == kUp)
-        {
+        KeyType k = screenM.getChar ();
+        if (k == kUp) {
             currentItemM--;
             if (currentItemM < 0)
-                currentItemM = itemsM.size() - 1;
-        }
-        else if (k == kDown)
-        {
+                currentItemM = itemsM.size () - 1;
+        } else if (k == kDown) {
             currentItemM++;
-            if (currentItemM >= itemsM.size())
+            if (currentItemM >= (int)itemsM.size ())
                 currentItemM = 0;
-        }
-        else if (k == kButton)
-        {
+        } else if (k == kButton) {
             return currentItemM;
         }
     }
     return -1;
 }
+
 //-----------------------------------------------------------------------------
-class Game
-{
+class Game {
 private:
     bool levelCompleteM;
-    Screen& screenM;
+    Screen & screenM;
 public:
-    Game(Screen& s, const std::string& levelName);
-    bool levelComplete();
+    Game (Screen & s, const std::string & levelName);
+    bool levelComplete ();
 };
 //-----------------------------------------------------------------------------
-bool Game::levelComplete()
-{
+bool
+Game::levelComplete () {
     return levelCompleteM;
 }
+
 //-----------------------------------------------------------------------------
 class Level;
-class Player
-{
+class Player {
 private:
     int xM;
     int yM;
 public:
-    Player(int x, int y);
-    void render();
-    PlayerAction handleInput(KeyType key, Level& level);
+    Player (int x, int y);
+    void render ();
+    PlayerAction handleInput (KeyType key, Level & level);
 };
 //-----------------------------------------------------------------------------
-class Level
-{
+class Level {
 private:
     int goldNeededM;
-    std::vector<std::string> mapM;
+    std::vector < std::string > mapM;
 public:
-    Level(const std::string& name, std::vector<Player>& players);
-    void render();
-    void moveField(int x, int y, int dx, int dy);
-    void setField(int x, int y, char f);
-    char getField(int x, int y);
-    int goldNeeded();
-    void addGold(int count);
+    Level (const std::string & name, std::vector < Player > &players);
+    void render ();
+    void moveField (int x, int y, int dx, int dy);
+    void setField (int x, int y, char f);
+    char getField (int x, int y);
+    int goldNeeded ();
+    void addGold (int count);
 };
 //-----------------------------------------------------------------------------
-Player::Player(int x, int y)
-    :xM(x), yM(y)
-{
+Player::Player (int x, int y):
+        xM (x),
+        yM (y) {
 }
+
 //-----------------------------------------------------------------------------
-void Player::render()
-{
-    attrset(A_BOLD);
-    color_set(3, 0);
-    mvprintw(yM+3, xM+3, "@");
-    attrset(A_NORMAL);
+void
+Player::render () {
+    attrset (A_BOLD);
+    color_set (3, 0);
+    mvprintw (yM + 3, xM + 3, "@");
+    attrset (A_NORMAL);
 }
+
 //-----------------------------------------------------------------------------
-PlayerAction Player::handleInput(KeyType key, Level& level)
-{
+PlayerAction
+Player::handleInput (KeyType key, Level & level) {
     int dx = 0, dy = 0;
-    switch (key)
-    {
-        case kUp:       dy = -1; break;
-        case kDown:     dy =  1; break;
-        case kLeft:     dx = -1; break;
-        case kRight:    dx =  1; break;
-        default:
-            return paNone;
-    }
-    switch (level.getField(xM + dx, yM + dy))
-    {
-        case '$':   level.addGold(-1);
-        case ' ':
-            level.moveField(xM, yM, dx, dy);
+    switch (key) {
+    case kUp:
+        dy = -1;
+        break;
+    case kDown:
+        dy = 1;
+        break;
+    case kLeft:
+        dx = -1;
+        break;
+    case kRight:
+        dx = 1;
+        break;
+    default:
+        return paNone;
+    }
+    switch (level.getField (xM + dx, yM + dy)) {
+    case '$':
+        level.addGold (-1);
+    case ' ':
+        level.moveField (xM, yM, dx, dy);
+        xM += dx;
+        yM += dy;
+        return paMoved;
+    case 'O':
+        // look beyond if we can push it
+        if (level.getField (xM + 2 * dx, yM + 2 * dy) == ' ') {
+            level.moveField (xM + dx, yM + dy, dx, dy); // move rock
+            level.moveField (xM, yM, dx, dy);   // move player
             xM += dx;
             yM += dy;
             return paMoved;
-        case 'O':
-            // look beyond if we can push it
-            if (level.getField(xM + 2*dx, yM + 2*dy) == ' ')
-            {
-                level.moveField(xM+dx, yM+dy, dx, dy);  // move rock
-                level.moveField(xM, yM, dx, dy);        // move player
-                xM += dx;
-                yM += dy;
-                return paMoved;
-            }
-            return paNone;
-        case 'h':
-            {
-                char c = level.getField(xM + 2*dx, yM + 2*dy);
-                if (c == 'O' || c == 'h')
-                {
-                    level.setField(xM+2*dx, yM+2*dy, ' ');  // explode
-                    level.moveField(xM, yM, dx, dy);        // move player
-                    xM += dx;
-                    yM += dy;
-                    return paMoved;
-                }
-                if (c == ' ')
-                {
-                    level.moveField(xM+dx, yM+dy, dx, dy);  // move dynamite
-                    level.moveField(xM, yM, dx, dy);        // move player
-                    xM += dx;
-                    yM += dy;
-                    return paMoved;
-                }
-                return paNone;
-            }
-        case 'x':
-            if (level.goldNeeded() < 1)
-                return paLevelComplete;
-            return paNone;
+        }
+        return paNone;
+    case 'h': {
+        char c = level.getField (xM + 2 * dx, yM + 2 * dy);
+        if (c == 'O' || c == 'h') {
+            level.setField (xM + 2 * dx, yM + 2 * dy, ' '); // explode
+            level.moveField (xM, yM, dx, dy);   // move player
+            xM += dx;
+            yM += dy;
+            return paMoved;
+        }
+        if (c == ' ') {
+            level.moveField (xM + dx, yM + dy, dx, dy); // move dynamite
+            level.moveField (xM, yM, dx, dy);   // move player
+            xM += dx;
+            yM += dy;
+            return paMoved;
+        }
+        return paNone;
+    }
+    case 'x':
+        if (level.goldNeeded () < 1)
+            return paLevelComplete;
+        return paNone;
     }
     return paNone;
 }
+
 //-----------------------------------------------------------------------------
-void Level::setField(int x, int y, char f)
-{
+void
+Level::setField (int x, int y, char f) {
     mapM[y][x] = f;
 }
+
 //-----------------------------------------------------------------------------
-char Level::getField(int x, int y)
-{
+char
+Level::getField (int x, int y) {
     return mapM[y][x];
 }
+
 //-----------------------------------------------------------------------------
-void Level::moveField(int x, int y, int dx, int dy)
-{
-    char field = getField(x, y);
-    setField(x, y, ' ');
-    setField(x+dx, y+dy, field);
+void
+Level::moveField (int x, int y, int dx, int dy) {
+    char field = getField (x, y);
+    setField (x, y, ' ');
+    setField (x + dx, y + dy, field);
 }
+
 //-----------------------------------------------------------------------------
-int Level::goldNeeded()
-{
+int
+Level::goldNeeded () {
     return goldNeededM;
 }
+
 //-----------------------------------------------------------------------------
-void Level::addGold(int count)
-{
+void
+Level::addGold (int count) {
     goldNeededM += count;
     if (goldNeededM < 0)
         goldNeededM = 0;
 }
+
 //-----------------------------------------------------------------------------
-Level::Level(const std::string& name, std::vector<Player>& players)
-{
+Level::Level (const std::string & name, std::vector < Player > &players) {
     // load level from file, for each player found, create instance of Player
-    players.clear();
-    mapM.clear();
+    players.clear ();
+    mapM.clear ();
     goldNeededM = 0;
-    FILE *fp = fopen(name.c_str(), "rb");
-    if (!fp)
-    {
-        Message("Cannot open level file!");
+    std::string fileName = "/usr/share/npush/" + name;
+    FILE *fp = fopen (fileName.c_str (), "rb");
+    if (!fp) {
+        Message ("Cannot open level file!");
         return;
     }
     int y = 0;
     char buffer[80];
-    while (!feof(fp))
-    {
-        if (!fgets(buffer, 80, fp))
+    while (!feof (fp)) {
+        if (!fgets (buffer, 80, fp))
             break;
-        for (int x = 0; x < 80 && buffer[x] != '\n' && buffer[x] != '\0'; x++)
-        {
+        for (int x = 0; x < 80 && buffer[x] != '\n' && buffer[x] != '\0'; x++) {
             if (buffer[x] == ',')   // comments, ignore rest of the line
                 break;
-            if (buffer[x] == '@')
-            {
-                Player p(x, y);
-                players.push_back(p);
+            if (buffer[x] == '@') {
+                Player p (x, y);
+                players.push_back (p);
             }
             if (buffer[x] == '$')
                 goldNeededM++;
         }
-        mapM.push_back(buffer);
+        mapM.push_back (buffer);
         y++;
     }
 }
+
 //-----------------------------------------------------------------------------
-void Level::render()
-{
-    clear();
+void
+Level::render () {
+    clear ();
     int xpos = 3;
     int ypos = 3;
-    for (std::vector<std::string>::iterator it = mapM.begin();
-        it != mapM.end(); ++it, ypos++)
-    {
+    for (std::vector < std::string >::iterator it = mapM.begin ();
+            it != mapM.end (); ++it, ypos++) {
         // if (black&white)
         //mvprintw(ypos++, xpos, "%s", (*it).c_str());
 
-        move(ypos, xpos);
+        move (ypos, xpos);
         bool comment = false;
         bool bold = false;
-        for (int i=0; i<(*it).length(); i++)
-        {
+        for (unsigned i = 0; i < (*it).length (); i++) {
             char c = (*it)[i];
-            attrset(A_NORMAL);
-            if (!comment)
-            {
-                switch (c)
-                {
-                    case ',':
-                        c = ' ';
-                        comment = true;
-                        break;
-                    case ';':
-                        c = ' ';
-                        comment = bold = true;
-                        break;
-                    case '#':   color_set(1, 0);    break;
-                    case 'x':   color_set(2, 0);    break;
-                    case '@':   color_set(3, 0);    break;
-                    case 'h':   color_set(4, 0);    break;
-                    case '$':
-                        attrset(A_BOLD);
-                        color_set(1, 0);
-                        break;
+            attrset (A_NORMAL);
+            if (!comment) {
+                switch (c) {
+                case ',':
+                    c = ' ';
+                    comment = true;
+                    break;
+                case ';':
+                    c = ' ';
+                    comment = bold = true;
+                    break;
+                case '#':
+                    color_set (1, 0);
+                    break;
+                case 'x':
+                    color_set (2, 0);
+                    break;
+                case '@':
+                    color_set (3, 0);
+                    break;
+                case 'h':
+                    color_set (4, 0);
+                    break;
+                case '$':
+                    attrset (A_BOLD);
+                    color_set (1, 0);
+                    break;
                 };
-            }
-            else if (bold)  // bold comment
-                attrset(A_BOLD);
-            printw("%c", c);
+            } else if (bold)    // bold comment
+                attrset (A_BOLD);
+            printw ("%c", c);
         }
     }
 }
+
 //-----------------------------------------------------------------------------
-class GameState
-{
+class GameState {
 public:
     Level level;
-    std::vector<Player> players;
-    GameState(const Level& l, const std::vector<Player>& p)
-        :level(l), players(p)
-    {
+    std::vector < Player > players;
+    GameState (const Level & l, const std::vector < Player > &p):level (l),
+            players (p) {
     }
 };
 //-----------------------------------------------------------------------------
-Game::Game(Screen& s, const std::string& levelName)
-    :screenM(s), levelCompleteM(false)
+Game::Game (Screen & s, const std::string & levelName):
+        levelCompleteM (false),
+        screenM (s)
 {
-    std::vector<Player> players;    // there can be multiple on the screen
+    std::vector < Player > players; // there can be multiple on the screen
     // load levelName
-    Level level(levelName, players);
-    if (players.size() == 0)
-    {
-        Message("Bad level, no players found!");
+    Level level (levelName, players);
+    if (players.size () == 0) {
+        Message ("Bad level, no players found!");
         return;
     }
 
-    std::stack<GameState> undo;
-    undo.push(GameState(level, players));
+    std::stack < GameState > undo;
+    undo.push (GameState (level, players));
 
-    std::vector<Player>::iterator currentPlayer = players.begin();
-    while (true)
-    {
-        level.render();
-        (*currentPlayer).render();
-        s.render();
+    std::vector < Player >::iterator currentPlayer = players.begin ();
+    while (true) {
+        level.render ();
+        (*currentPlayer).render ();
+        s.render ();
 
         // handle key press
-        KeyType key = s.getChar();
-        switch (key)
-        {
+        KeyType key = s.getChar ();
+        switch (key) {
             // handle game-wide keys (like player switching)
-            case kSwitchPlayer:
-                if (++currentPlayer == players.end())
-                    currentPlayer = players.begin();
-                break;
+        case kSwitchPlayer:
+            if (++currentPlayer == players.end ())
+                currentPlayer = players.begin ();
+            break;
 
-            case kQuitGame:
-                return;
+        case kQuitGame:
+            return;
 
-            case kUndo:
-                if (undo.size() > 1)
-                {
-                    undo.pop(); // remove current state
-                    level = undo.top().level;
-                    players = undo.top().players;
-                }
-                break;
-            default:    // handle player movement keys
-                PlayerAction pa = (*currentPlayer).handleInput(key, level);
-                if (pa == paLevelComplete)
-                {
-                    levelCompleteM = true;
-                    Message("Well done. Level completed.");
-                    return;
-                }
-                if (pa == paMoved)
-                {
-                    // store undo buffer
-                    undo.push(GameState(level, players));
-                }
+        case kUndo:
+            if (undo.size () > 1) {
+                undo.pop ();    // remove current state
+                level = undo.top ().level;
+                players = undo.top ().players;
+            }
+            break;
+        default:        // handle player movement keys
+            PlayerAction pa = (*currentPlayer).handleInput (key, level);
+            if (pa == paLevelComplete) {
+                levelCompleteM = true;
+                Message ("Well done. Level completed.");
+                return;
+            }
+            if (pa == paMoved) {
+                // store undo buffer
+                undo.push (GameState (level, players));
+            }
         };
     }
 }
+
 //-----------------------------------------------------------------------------
-LevelSelector::LevelSelector(Screen& s)
-    :screenM(s)
-{
-    Menu m(s, "Select a level");
+LevelSelector::LevelSelector (Screen & s):screenM (s) {
+    Menu
+    m (s, "Select a level");
     // TODO: load all levels from 'levels' directory and sort them alphabetical
     /*
-    m.add("Level 1 - Gold and Exit");
-    m.add("Level 2 - Rocks");
-    m.add("Level 3 - Dynamite");
-    m.add("Level 4 - The Show Starts");
-    */
-    std::set<std::string> files;
-    DIR *dir = opendir(".");
-    if (!dir)
-    {
-        Message("Cannot read levels from directory");
+       m.add("Level 1 - Gold and Exit");
+       m.add("Level 2 - Rocks");
+       m.add("Level 3 - Dynamite");
+       m.add("Level 4 - The Show Starts");
+     */
+    std::set < std::string > files;
+    DIR *
+    dir = opendir ("/usr/share/npush/");
+    if (!dir) {
+        Message ("Cannot read levels from directory");
         return;
     }
-    while (true)
-    {
-        struct dirent *de = readdir(dir);
+    while (true) {
+        struct dirent *
+                    de = readdir (dir);
         if (!de)
             break;
-        std::string filename(de->d_name);
-        if (filename.find("Level") == 0)    // starts with
-            files.insert(filename);
-    }
-    closedir(dir);
-    for (std::set<std::string>::iterator it = files.begin(); it != files.end();
-        ++it)
-    {
-        m.add(*it);
+        std::string filename (de->d_name);
+        if (filename.find ("Level") == 0)   // starts with
+            files.insert (filename);
+    }
+    closedir (dir);
+    for (std::set < std::string >::iterator it = files.begin ();
+            it != files.end (); ++it) {
+        m.add (*it);
     }
 
-    m.add("Back to main menu");
-    int result = m.show();
-    if (result == -1 || result >= m.count() - 1)
+    m.add ("Back to main menu");
+    int
+    result = m.show ();
+    if (result == -1 || result >= m.count () - 1)
         return;
 
-    while (true)
-    {
-        Game g(s, m.getItemText(result));
-        if (g.levelComplete())   // level completed
-        {
+    while (true) {
+        Game
+        g (s, m.getItemText (result));
+        if (g.levelComplete ()) {   // level completed
             result++;
-            if (result < (m.count() - 1))
+            if (result < (m.count () - 1))
                 continue;
-            Message("No more levels");
+            Message ("No more levels");
             return;
-        }
-        else // exited
+        } else          // exited
             return;
     }
 }
+
 //-----------------------------------------------------------------------------
-int main()
-{
-    Screen s;
-    if (!s.init())
+int
+main () {
+    Screen
+    s;
+    if (!s.init ())
         return 1;
 
-    Menu m(s, "Welcome to nPush", true);
-    m.add("Start a new game");
-    m.add("Configure controls");
-    m.add("Quit");
-
-    while (true)
-    {
-        int result = m.show();
-        if (result == 0)
-        {
-            LevelSelector ls(s);
+    Menu
+    m (s, "Welcome to nPush", true);
+    m.add ("Start a new game");
+    m.add ("Configure controls");
+    m.add ("Quit");
+
+    while (true) {
+        int
+        result = m.show ();
+        if (result == 0) {
+            LevelSelector
+            ls (s);
             continue;
-        }
-        else if (result == 1)
-        {
-            ControlsConfigurator cc(s);
+        } else if (result == 1) {
+            ControlsConfigurator
+            cc (s);
             continue;
         }
         break;
     }
     return 0;
 }
+
 //-----------------------------------------------------------------------------


--- NEW FILE npush.desktop ---
[Desktop Entry] 
Encoding=UTF-8
Name=nPush
Comment=A logic game similar to Sokoba
Exec=npush
Icon=npush
Terminal=true
Type=Application
Categories=Game;

--- NEW FILE npush.spec ---
Name:		npush
Version:	0.6
Release:	1%{?dist}
Summary:	A logic game similar to Sokoba

Group:		Amusements/Games
License:	GPLv2+
URL:		http://npush.sourceforge.net/
Source:		http://downloads.sourceforge.net/%{name}/%{name}-%{version}.tgz
# self made icon and .desktop file
Source1:	%{name}.desktop
Source2:	%{name}.png
# patch npush.cpp to svn version to fix an issue with level selector
Patch:		npush-0.6-level-svn.patch
BuildRoot:	%{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)

BuildRequires:	ncurses-devel desktop-file-utils

%description
nPush is a logic game similar to Sokoban and Boulder Dash. 
You need to collect all the gold on the level and reach the exit. 
To make it hard there are some rocks that stand in your way,
and you also have some dynamite to blast them away. 
Main difference from Sokoban, KSokoban and similar games is that you 
can have multiple player-controlled characters you can move on the screen.

nPush is a terminal based application and uses nCurses library for 
user interface.


%prep
%setup -q
%patch -p0

%build

make %{?_smp_mflags}


%install
rm -rf $RPM_BUILD_ROOT

mkdir -p  %{buildroot}%{_bindir}
install -p -m 755 npush %{buildroot}%{_bindir}/npush

mkdir -p %{buildroot}%{_datadir}/npush
cp -ra Level*  %{buildroot}%{_datadir}/npush

# desktop file stuff
desktop-file-install --vendor="fedora"			\
	--dir=$RPM_BUILD_ROOT%{_datadir}/applications	\
	%{SOURCE1}
# icon
mkdir -p $RPM_BUILD_ROOT%{_datadir}/icons/hicolor/32x32/apps

install -p -m 0644 %{SOURCE2}				\
	$RPM_BUILD_ROOT%{_datadir}/icons/hicolor/32x32/apps/%{name}.png


%clean
rm -rf $RPM_BUILD_ROOT


%post
touch --no-create %{_datadir}/icons/hicolor
if [ -x %{_bindir}/gtk-update-icon-cache ] ; then
%{_bindir}/gtk-update-icon-cache --quiet %{_datadir}/icons/hicolor || :
fi


%postun
touch --no-create %{_datadir}/icons/hicolor
if [ -x %{_bindir}/gtk-update-icon-cache ] ; then
%{_bindir}/gtk-update-icon-cache --quiet %{_datadir}/icons/hicolor || :
fi


%files
%defattr(-,root,root,-)
%doc readme.txt
%{_bindir}/%{name}
%{_datadir}/%{name}
%{_datadir}/applications/fedora-%{name}.desktop
%{_datadir}/icons/hicolor/*/apps/%{name}.png

%changelog
* Mon Jul 07 2008 Stefan Posdzich <cheekyboinc at foresightlinux.org> - 0.6-1
- Initial SPEC file


Index: sources
===================================================================
RCS file: /cvs/pkgs/rpms/npush/F-9/sources,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- sources	9 Jul 2008 16:59:33 -0000	1.1
+++ sources	9 Jul 2008 19:01:16 -0000	1.2
@@ -0,0 +1 @@
+6670aac74dd7db005462c11c5688db52  npush-0.6.tgz




More information about the scm-commits mailing list