/[enigma]/enigma/src/stones_simple.cc
ViewVC logotype

Diff of /enigma/src/stones_simple.cc

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.12 by reallysoft, Fri Jun 20 08:51:55 2003 UTC revision 1.13 by reallysoft, Fri Jun 20 15:49:40 2003 UTC
# Line 1526  namespace Line 1526  namespace
1526    
1527  }  }
1528    
1529  //----------------------------------------  // ---------------------------------
1530  // YinYang stone 1  //      YinYangStone (baseclass)
1531  //----------------------------------------  // ---------------------------------
1532  namespace  namespace
1533  {  {
1534      class YinYangStone1 : public Stone {      class YinYangStone : public Stone {
         CLONEOBJ(YinYangStone1);  
1535      public:      public:
1536          YinYangStone1() : Stone("st-yinyang1"), state(NOCOLOR) {}          YinYangStone(const char *kind) : Stone(kind), state(NOCOLOR) {}
1537    
1538        protected:
1539    
1540            void turn_white() {
1541                assert(state == NOCOLOR);
1542                state = WHITE;
1543                init_model();
1544                play_sound("st-magic");
1545            }
1546            void turn_black() {
1547                assert(state == NOCOLOR);
1548                state = BLACK;
1549                init_model();
1550                play_sound("st-magic");
1551            }
1552    
1553            bool is_uncolored() const { return state == NOCOLOR; }
1554    
1555      private:      private:
1556          enum State { NOCOLOR, WHITE, BLACK } state;          enum State { NOCOLOR, WHITE, BLACK } state;
1557    
1558          void init_model() {          void init_model() {
1559              switch (state) {              switch (state) {
1560              case NOCOLOR: set_model("st-yinyang1"); break;                  case NOCOLOR: set_model(get_kind()); break;
1561              case WHITE: set_model("st-white1"); break;                  case WHITE: set_model("st-white1"); break;
1562              case BLACK: set_model("st-black1"); break;                  case BLACK: set_model("st-black1"); break;
1563              }              }
1564          }          }
1565    
1566          void actor_hit(const StoneContact &sc)          StoneResponse collision_response(const StoneContact &sc)
         {  
             if (state==NOCOLOR) {  
                 if (sc.actor->get_attrib("blackball")) {  
                     state = WHITE;  
                     init_model();  
                     play_sound("st-magic");  
                 }  
                 else if (sc.actor->get_attrib("whiteball")) {  
                     state = BLACK;  
                     init_model();  
                     play_sound("st-magic");  
                 }  
             }  
         }  
   
         StoneResponse collision_response(const StoneContact &sc)  
1567          {          {
1568              if ((state==BLACK && sc.actor->get_attrib("blackball")) ||              if ((state==BLACK && sc.actor->get_attrib("blackball")) ||
1569                  (state==WHITE && sc.actor->get_attrib("whiteball")))                  (state==WHITE && sc.actor->get_attrib("whiteball")))
1570                  return STONE_PASS;                  return STONE_PASS;
1571              return STONE_REBOUND;              return STONE_REBOUND;
1572          }          }
1573      };      };
1574  }  }
1575    
1576  //----------------------------------------  //----------------------------------------
1577  // YinYang stone 2  // YinYang stone 1
1578  //----------------------------------------  //----------------------------------------
1579  namespace  namespace
1580  {  {
1581      class YinYangStone2 : public Stone {      class YinYangStone1 : public YinYangStone {
1582          CLONEOBJ(YinYangStone2);          CLONEOBJ(YinYangStone1);
1583      public:      public:
1584          YinYangStone2() : Stone("st-yinyang2"), state(NOCOLOR) {}          YinYangStone1() : YinYangStone("st-yinyang1") {}
     private:  
         enum State { NOCOLOR, WHITE, BLACK } state;  
1585    
1586          void init_model() {      private:
1587              switch (state) {          void actor_hit(const StoneContact &sc) {
1588              case NOCOLOR: set_model("st-yinyang2"); break;              if (is_uncolored()) {
1589              case WHITE: set_model("st-white1"); break;                  if      (sc.actor->get_attrib("blackball")) turn_white();
1590              case BLACK: set_model("st-black1"); break;                  else if (sc.actor->get_attrib("whiteball")) turn_black();
1591              }              }
1592          }          }
1593        };
1594    }
1595    
1596          void actor_hit(const StoneContact &sc)  //----------------------------------------
1597          {  // YinYang stone 2
1598              if (state==NOCOLOR) {  //----------------------------------------
1599                  if (sc.actor->get_attrib("blackball")) {  namespace
1600                      state = BLACK;  {
1601                      init_model();      class YinYangStone2 : public YinYangStone {
1602                      play_sound("st-magic");          CLONEOBJ(YinYangStone2);
1603                  }      public:
1604                  else if (sc.actor->get_attrib("whiteball")) {          YinYangStone2() : YinYangStone("st-yinyang2") {}
1605                      state = WHITE;      private:
1606                      init_model();          void actor_hit(const StoneContact &sc) {
1607                      play_sound("st-magic");              if (is_uncolored()) {
1608                  }                  if      (sc.actor->get_attrib("blackball")) turn_black();
1609              }                  else if (sc.actor->get_attrib("whiteball")) turn_white();
1610                }
1611          }          }
   
         StoneResponse collision_response(const StoneContact &sc)  
         {  
             if ((state==BLACK && sc.actor->get_attrib("blackball")) ||  
                 (state==WHITE && sc.actor->get_attrib("whiteball")))  
                 return STONE_PASS;  
             return STONE_REBOUND;  
         }  
1612      };      };
1613  }  }
1614    
# Line 1645  namespace Line 1639  namespace
1639          void animcb() {          void animcb() {
1640              assert(state == BREAK);              assert(state == BREAK);
1641              GridPos p = get_pos();              GridPos p = get_pos();
 //             SendMessage(GetStone(move(p, NORTH)), "bombstone");  
 //             SendMessage(GetStone(move(p, SOUTH)), "bombstone");  
 //             SendMessage(GetStone(move(p, EAST)), "bombstone");  
 //             SendMessage(GetStone(move(p, WEST)), "bombstone");  
1642              SendExplosionEffect(p, BOMBSTONE);              SendExplosionEffect(p, BOMBSTONE);
1643              KillStone(p);              KillStone(p);
1644              SetItem(p, MakeItem("it-explosion1"));              SetItem(p, MakeItem("it-explosion1"));
# Line 1797  namespace Line 1787  namespace
1787              }              }
1788          }          }
1789    
1790           bool on_laserhit(Direction) {          void explode() {
1791               GridPos p = get_pos();              GridPos p = get_pos();
1792               KillStone(p);              KillStone(p);
1793               SetItem(p, MakeItem("it-explosion1"));              SetItem(p, MakeItem("it-explosion1"));
1794               return false;      // block laser          }
1795           }  
1796            bool on_laserhit(Direction) {
1797                explode();
1798                return false;       // block laser
1799            }
1800    
1801            void message(const string &msg, const Value &) {
1802                if (msg == "expl") {
1803                    explode();
1804                }
1805            }
1806      };      };
1807  }  }
1808    

Legend:
Removed from v.1.12  
changed lines
  Added in v.1.13

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26