1438 |
CLONEOBJ(Blocker); |
CLONEOBJ(Blocker); |
1439 |
public: |
public: |
1440 |
Blocker(bool shrinked_recently) |
Blocker(bool shrinked_recently) |
1441 |
: Item("it-blocker") |
: Item("it-blocker"), |
1442 |
, state(shrinked_recently ? SHRINKED : IDLE) |
state(shrinked_recently ? SHRINKED : IDLE) |
1443 |
{} |
{} |
1444 |
|
|
1445 |
private: |
private: |
1477 |
Item::on_removal(); |
Item::on_removal(); |
1478 |
} |
} |
1479 |
|
|
1480 |
|
void message(const string &msg, const Value &) { |
1481 |
|
if (msg == "signal") { |
1482 |
|
grow(); |
1483 |
|
} |
1484 |
|
} |
1485 |
|
|
1486 |
|
|
1487 |
void stone_change(Stone *st) { |
void stone_change(Stone *st) { |
1488 |
if (st) { |
if (st) { |
1489 |
if (0 == strcmp(st->get_kind(), "st-bolder")) { // bolder arrived |
if (0 == strcmp(st->get_kind(), "st-bolder")) { // bolder arrived |
1490 |
// log("bolder arrived"); |
// log("bolder arrived"); |
1491 |
switch (state) { |
switch (state) { |
1492 |
case IDLE: |
case IDLE: |
1493 |
change_state(COVERED); |
change_state(COVERED); |
1494 |
break; |
break; |
1495 |
case SHRINKED: |
case SHRINKED: |
1496 |
change_state(BOLDERED); |
change_state(BOLDERED); |
1497 |
break; |
break; |
1498 |
case COVERED: |
case COVERED: |
1499 |
case BOLDERED: |
case BOLDERED: |
1500 |
// two BolderStones running directly next to each other |
// two BolderStones running directly next to each other |
1501 |
// let second pass as well (correct?) |
// let second pass as well (correct?) |
1502 |
break; |
break; |
1503 |
} |
} |
1504 |
} |
} |
1505 |
else { // other stone arrived |
else { // other stone arrived |
1509 |
else { // stone disappeared |
else { // stone disappeared |
1510 |
// log("stone disappeared"); |
// log("stone disappeared"); |
1511 |
switch (state) { |
switch (state) { |
1512 |
case BOLDERED: |
case BOLDERED: |
1513 |
change_state(IDLE); |
change_state(IDLE); |
1514 |
break; |
break; |
1515 |
case COVERED: |
case COVERED: |
1516 |
Stone *st = world::MakeStone("st-blocker-growing"); |
grow(); |
1517 |
world::SetStone(get_pos(), st); |
break; |
|
world::KillItem(get_pos()); |
|
|
break; |
|
1518 |
} |
} |
1519 |
} |
} |
1520 |
} |
} |
1521 |
|
|
1522 |
|
void grow() { |
1523 |
|
Stone *st = world::MakeStone("st-blocker-growing"); |
1524 |
|
world::SetStone(get_pos(), st); |
1525 |
|
world::KillItem(get_pos()); |
1526 |
|
} |
1527 |
|
|
1528 |
void alarm() { |
void alarm() { |
1529 |
// log("got alarm"); |
// log("got alarm"); |
1530 |
if (state == SHRINKED) { // BolderStone did not arrive in time |
if (state == SHRINKED) { // BolderStone did not arrive in time |