1684 |
}; |
}; |
1685 |
} |
} |
1686 |
|
|
1687 |
|
//---------------------------------------- |
1688 |
|
// Burning floors |
1689 |
|
// |
1690 |
|
// This items can burn. The fire spreads and destroys items and actors. |
1691 |
|
//---------------------------------------- |
1692 |
|
namespace |
1693 |
|
{ |
1694 |
|
class Burnable : public Item { |
1695 |
|
CLONEOBJ(Burnable); |
1696 |
|
public: |
1697 |
|
enum State { IDLE, IGNITE, BURNING, ASH }; |
1698 |
|
Burnable( bool burn=false): Item("it-burnable") { |
1699 |
|
state = burn ? IGNITE : IDLE; |
1700 |
|
} |
1701 |
|
private: |
1702 |
|
State state; |
1703 |
|
|
1704 |
|
void message(const string &msg, const Value &val) { |
1705 |
|
if ((msg == "trigger" || msg == "ignite")&& state==IDLE) { |
1706 |
|
state = IGNITE; |
1707 |
|
init_model(); |
1708 |
|
} |
1709 |
|
if (msg == "extinguish") { |
1710 |
|
state = ASH; |
1711 |
|
init_model(); |
1712 |
|
} |
1713 |
|
} |
1714 |
|
|
1715 |
|
void animcb() { |
1716 |
|
if (state == IGNITE || state == BURNING) { |
1717 |
|
GridPos p = get_pos(); |
1718 |
|
if( DoubleRand(0, 1) > 0.3) ignite (move(p, NORTH)); |
1719 |
|
if( DoubleRand(0, 1) > 0.3) ignite (move(p, EAST)); |
1720 |
|
if( DoubleRand(0, 1) > 0.3) ignite (move(p, SOUTH)); |
1721 |
|
if( DoubleRand(0, 1) > 0.3) ignite (move(p, WEST)); |
1722 |
|
} |
1723 |
|
if (state == IGNITE) { |
1724 |
|
state = BURNING; |
1725 |
|
init_model(); |
1726 |
|
} else if (state == BURNING) { |
1727 |
|
if( DoubleRand(0, 1) > 0.7) |
1728 |
|
state = ASH; |
1729 |
|
else |
1730 |
|
state = BURNING; |
1731 |
|
|
1732 |
|
init_model(); |
1733 |
|
} |
1734 |
|
} |
1735 |
|
void init_model() { |
1736 |
|
switch (state) { |
1737 |
|
case IDLE: set_model("invisible"); break; |
1738 |
|
case IGNITE: set_anim("it-burnable_ignite"); break; |
1739 |
|
case BURNING: set_anim("it-burnable_burning"); break; |
1740 |
|
case ASH: set_anim("it-burnable_ash"); break; |
1741 |
|
} |
1742 |
|
} |
1743 |
|
|
1744 |
|
bool actor_hit(Actor *a) { |
1745 |
|
if (state == IGNITE || state == BURNING) |
1746 |
|
SendMessage(a, "shatter"); |
1747 |
|
return false; |
1748 |
|
} |
1749 |
|
|
1750 |
|
void ignite( GridPos p) { |
1751 |
|
if (Item *it = GetItem(p)) { |
1752 |
|
string model = it->get_kind(); |
1753 |
|
if( model=="it-burnable" || model=="it-dynamite" |
1754 |
|
|| model=="it-blackbomb" || model=="it-whitebomb") |
1755 |
|
SendMessage (it, "ignite"); |
1756 |
|
else if (model != "it-extinguisher" && model != "it-hill" && model != "it-hollow" |
1757 |
|
&& model != "it-tinyhill" && model != "it-tinyhollow") { |
1758 |
|
SetItem( p, MakeItem("it-burnable-ignited")); |
1759 |
|
//SendMessage (it, "ignite"); |
1760 |
|
} |
1761 |
|
} |
1762 |
|
} |
1763 |
|
}; |
1764 |
|
} |
1765 |
|
|
1766 |
|
//---------------------------------------- |
1767 |
|
// Fire Extinguisher |
1768 |
|
// |
1769 |
|
// This items can extinguish burning floor. |
1770 |
|
//---------------------------------------- |
1771 |
|
namespace |
1772 |
|
{ |
1773 |
|
class Extinguisher : public Item { |
1774 |
|
CLONEOBJ(Extinguisher); |
1775 |
|
public: |
1776 |
|
Extinguisher( int initload=2): Item("it-extinguisher") { |
1777 |
|
load=initload; |
1778 |
|
} |
1779 |
|
private: |
1780 |
|
int load; |
1781 |
|
|
1782 |
|
ItemAction activate(Actor *a, GridPos p) { |
1783 |
|
fprintf(stderr, "Activate %d\n",load); |
1784 |
|
if( load > 0) { |
1785 |
|
load--; |
1786 |
|
KillItem(p); |
1787 |
|
extinguish (move(p, NORTH)); |
1788 |
|
extinguish (move(move(p, NORTH),NORTH)); |
1789 |
|
extinguish (move(move(p, NORTH),EAST)); |
1790 |
|
extinguish (move(p, SOUTH)); |
1791 |
|
extinguish (move(move(p, SOUTH),SOUTH)); |
1792 |
|
extinguish (move(move(p, SOUTH),WEST)); |
1793 |
|
extinguish (move(p, EAST)); |
1794 |
|
extinguish (move(move(p, EAST),EAST)); |
1795 |
|
extinguish (move(move(p, EAST),SOUTH)); |
1796 |
|
extinguish (move(p, WEST)); |
1797 |
|
extinguish (move(move(p, WEST),WEST)); |
1798 |
|
extinguish (move(move(p, WEST),NORTH)); |
1799 |
|
} |
1800 |
|
return ITEM_DROP; |
1801 |
|
} |
1802 |
|
|
1803 |
|
void extinguish( GridPos p) { |
1804 |
|
if (Item *it = GetItem(p)) { |
1805 |
|
SendMessage (it, "extinguish"); |
1806 |
|
} |
1807 |
|
} |
1808 |
|
|
1809 |
|
}; |
1810 |
|
} |
1811 |
|
|
1812 |
|
|
1813 |
//---------------------------------------- |
//---------------------------------------- |
1814 |
// Flags |
// Flags |
2219 |
Register(new Blocker(false)); |
Register(new Blocker(false)); |
2220 |
Register(new Brake); |
Register(new Brake); |
2221 |
Register(new Brush); |
Register(new Brush); |
2222 |
|
Register(new Burnable); |
2223 |
|
Register("it-burnable-ignited", new Burnable(true)); |
2224 |
Register(new Cherry); |
Register(new Cherry); |
2225 |
Register(new Coffee); |
Register(new Coffee); |
2226 |
Register(new Coin); |
Register(new Coin); |
2239 |
Register("it-explosion1", new Explosion(Explosion::WEAK)); |
Register("it-explosion1", new Explosion(Explosion::WEAK)); |
2240 |
Register("it-explosion2", new Explosion(Explosion::MEDIUM)); |
Register("it-explosion2", new Explosion(Explosion::MEDIUM)); |
2241 |
Register("it-explosion3", new Explosion(Explosion::STRONG)); |
Register("it-explosion3", new Explosion(Explosion::STRONG)); |
2242 |
|
Register(new Extinguisher); |
2243 |
|
Register("it-extinguisher-full", new Extinguisher(2)); |
2244 |
Register(new ExtraLife); |
Register(new ExtraLife); |
2245 |
Register(new EasyModeItem); |
Register(new EasyModeItem); |
2246 |
Register(new FlagBlack); |
Register(new FlagBlack); |