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 |
|
|
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")); |
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 |
|
|