… | |
… | |
302 | new_draw_info (NDI_UNIQUE, 0, op, "Something blocks your magic."); |
302 | new_draw_info (NDI_UNIQUE, 0, op, "Something blocks your magic."); |
303 | return 0; |
303 | return 0; |
304 | } |
304 | } |
305 | if (mflags & P_IS_ALIVE) |
305 | if (mflags & P_IS_ALIVE) |
306 | { |
306 | { |
307 | for (tmp = get_map_ob (m, x, y); tmp != NULL; tmp = tmp->above) |
307 | for (tmp = GET_MAP_OB (m, x, y); tmp != NULL; tmp = tmp->above) |
308 | if (QUERY_FLAG (tmp, FLAG_ALIVE) && (tmp->type == PLAYER || QUERY_FLAG (tmp, FLAG_MONSTER))) |
308 | if (QUERY_FLAG (tmp, FLAG_ALIVE) && (tmp->type == PLAYER || QUERY_FLAG (tmp, FLAG_MONSTER))) |
309 | { |
309 | { |
310 | new_draw_info (NDI_UNIQUE, 0, op, "You detect something."); |
310 | new_draw_info (NDI_UNIQUE, 0, op, "You detect something."); |
311 | if (tmp->head != NULL) |
311 | if (tmp->head != NULL) |
312 | tmp = tmp->head; |
312 | tmp = tmp->head; |
… | |
… | |
440 | |
440 | |
441 | if (mflags & P_OUT_OF_MAP) |
441 | if (mflags & P_OUT_OF_MAP) |
442 | continue; |
442 | continue; |
443 | |
443 | |
444 | // earth to dust tears down everything that can be teared down |
444 | // earth to dust tears down everything that can be teared down |
445 | for (tmp = get_map_ob (m, sx, sy); tmp != NULL; tmp = next) |
445 | for (tmp = GET_MAP_OB (m, sx, sy); tmp != NULL; tmp = next) |
446 | { |
446 | { |
447 | next = tmp->above; |
447 | next = tmp->above; |
448 | if (QUERY_FLAG (tmp, FLAG_TEAR_DOWN)) |
448 | if (QUERY_FLAG (tmp, FLAG_TEAR_DOWN)) |
449 | hit_player (tmp, 9998, op, AT_PHYSICAL, 0); |
449 | hit_player (tmp, 9998, op, AT_PHYSICAL, 0); |
450 | } |
450 | } |
… | |
… | |
1698 | continue; |
1698 | continue; |
1699 | |
1699 | |
1700 | small_nuggets = 0; |
1700 | small_nuggets = 0; |
1701 | large_nuggets = 0; |
1701 | large_nuggets = 0; |
1702 | |
1702 | |
1703 | for (tmp = get_map_ob (mp, nx, ny); tmp != NULL; tmp = next) |
1703 | for (tmp = GET_MAP_OB (mp, nx, ny); tmp != NULL; tmp = next) |
1704 | { |
1704 | { |
1705 | next = tmp->above; |
1705 | next = tmp->above; |
1706 | if (tmp->weight > 0 && !QUERY_FLAG (tmp, FLAG_NO_PICK) && |
1706 | if (tmp->weight > 0 && !QUERY_FLAG (tmp, FLAG_NO_PICK) && |
1707 | !QUERY_FLAG (tmp, FLAG_ALIVE) && !QUERY_FLAG (tmp, FLAG_IS_CAULDRON)) |
1707 | !QUERY_FLAG (tmp, FLAG_ALIVE) && !QUERY_FLAG (tmp, FLAG_IS_CAULDRON)) |
1708 | { |
1708 | { |
… | |
… | |
1761 | for (tmp = op->inv; tmp; tmp = tmp->below) |
1761 | for (tmp = op->inv; tmp; tmp = tmp->below) |
1762 | if (QUERY_FLAG (tmp, FLAG_APPLIED) && |
1762 | if (QUERY_FLAG (tmp, FLAG_APPLIED) && |
1763 | ((QUERY_FLAG (tmp, FLAG_CURSED) && QUERY_FLAG (spell, FLAG_CURSED)) || |
1763 | ((QUERY_FLAG (tmp, FLAG_CURSED) && QUERY_FLAG (spell, FLAG_CURSED)) || |
1764 | (QUERY_FLAG (tmp, FLAG_DAMNED) && QUERY_FLAG (spell, FLAG_DAMNED)))) |
1764 | (QUERY_FLAG (tmp, FLAG_DAMNED) && QUERY_FLAG (spell, FLAG_DAMNED)))) |
1765 | { |
1765 | { |
1766 | |
|
|
1767 | was_one++; |
1766 | was_one++; |
1768 | if (tmp->level <= caster_level (caster, spell)) |
1767 | if (tmp->level <= caster_level (caster, spell)) |
1769 | { |
1768 | { |
1770 | success++; |
1769 | success++; |
1771 | if (QUERY_FLAG (spell, FLAG_DAMNED)) |
1770 | if (QUERY_FLAG (spell, FLAG_DAMNED)) |
… | |
… | |
1791 | new_draw_info (NDI_UNIQUE, 0, op, "You failed to remove the curse."); |
1790 | new_draw_info (NDI_UNIQUE, 0, op, "You failed to remove the curse."); |
1792 | else |
1791 | else |
1793 | new_draw_info (NDI_UNIQUE, 0, op, "You are not using any cursed items."); |
1792 | new_draw_info (NDI_UNIQUE, 0, op, "You are not using any cursed items."); |
1794 | } |
1793 | } |
1795 | } |
1794 | } |
|
|
1795 | |
1796 | return success; |
1796 | return success; |
1797 | } |
1797 | } |
1798 | |
1798 | |
1799 | /* Identifies objects in the players inventory/on the ground */ |
1799 | /* Identifies objects in the players inventory/on the ground */ |
1800 | |
1800 | |
… | |
… | |
1807 | num_ident = spell->stats.dam + SP_level_dam_adjust (caster, spell); |
1807 | num_ident = spell->stats.dam + SP_level_dam_adjust (caster, spell); |
1808 | |
1808 | |
1809 | if (num_ident < 1) |
1809 | if (num_ident < 1) |
1810 | num_ident = 1; |
1810 | num_ident = 1; |
1811 | |
1811 | |
1812 | |
|
|
1813 | for (tmp = op->inv; tmp; tmp = tmp->below) |
1812 | for (tmp = op->inv; tmp; tmp = tmp->below) |
1814 | { |
1813 | { |
1815 | if (!QUERY_FLAG (tmp, FLAG_IDENTIFIED) && !tmp->invisible && need_identify (tmp)) |
1814 | if (!QUERY_FLAG (tmp, FLAG_IDENTIFIED) && !tmp->invisible && need_identify (tmp)) |
1816 | { |
1815 | { |
1817 | identify (tmp); |
1816 | identify (tmp); |
|
|
1817 | |
1818 | if (op->type == PLAYER) |
1818 | if (op->type == PLAYER) |
1819 | { |
1819 | { |
1820 | new_draw_info_format (NDI_UNIQUE, 0, op, "You have %s.", long_desc (tmp, op)); |
1820 | new_draw_info_format (NDI_UNIQUE, 0, op, "You have %s.", long_desc (tmp, op)); |
|
|
1821 | |
1821 | if (tmp->msg) |
1822 | if (tmp->msg) |
1822 | { |
1823 | { |
1823 | new_draw_info (NDI_UNIQUE, 0, op, "The item has a story:"); |
1824 | new_draw_info (NDI_UNIQUE, 0, op, "The item has a story:"); |
1824 | new_draw_info (NDI_UNIQUE, 0, op, tmp->msg); |
1825 | new_draw_info (NDI_UNIQUE, 0, op, tmp->msg); |
1825 | } |
1826 | } |
1826 | } |
1827 | } |
|
|
1828 | |
1827 | num_ident--; |
1829 | num_ident--; |
1828 | success = 1; |
1830 | success = 1; |
1829 | if (!num_ident) |
1831 | if (!num_ident) |
1830 | break; |
1832 | break; |
1831 | } |
1833 | } |
1832 | } |
1834 | } |
|
|
1835 | |
1833 | /* If all the power of the spell has been used up, don't go and identify |
1836 | /* If all the power of the spell has been used up, don't go and identify |
1834 | * stuff on the floor. Only identify stuff on the floor if the spell |
1837 | * stuff on the floor. Only identify stuff on the floor if the spell |
1835 | * was not fully used. |
1838 | * was not fully used. |
1836 | */ |
1839 | */ |
1837 | if (num_ident) |
1840 | if (num_ident) |
1838 | { |
1841 | { |
1839 | for (tmp = get_map_ob (op->map, op->x, op->y); tmp != NULL; tmp = tmp->above) |
1842 | for (tmp = GET_MAP_OB (op->map, op->x, op->y); tmp != NULL; tmp = tmp->above) |
1840 | if (!QUERY_FLAG (tmp, FLAG_IDENTIFIED) && !tmp->invisible && need_identify (tmp)) |
1843 | if (!QUERY_FLAG (tmp, FLAG_IDENTIFIED) && !tmp->invisible && need_identify (tmp)) |
1841 | { |
1844 | { |
1842 | |
|
|
1843 | identify (tmp); |
1845 | identify (tmp); |
|
|
1846 | |
1844 | if (op->type == PLAYER) |
1847 | if (op->type == PLAYER) |
1845 | { |
1848 | { |
1846 | new_draw_info_format (NDI_UNIQUE, 0, op, "On the ground is %s.", long_desc (tmp, op)); |
1849 | new_draw_info_format (NDI_UNIQUE, 0, op, "On the ground is %s.", long_desc (tmp, op)); |
|
|
1850 | |
1847 | if (tmp->msg) |
1851 | if (tmp->msg) |
1848 | { |
1852 | { |
1849 | new_draw_info (NDI_UNIQUE, 0, op, "The item has a story:"); |
1853 | new_draw_info (NDI_UNIQUE, 0, op, "The item has a story:"); |
1850 | new_draw_info (NDI_UNIQUE, 0, op, tmp->msg); |
1854 | new_draw_info (NDI_UNIQUE, 0, op, tmp->msg); |
1851 | } |
1855 | } |
|
|
1856 | |
1852 | esrv_send_item (op, tmp); |
1857 | esrv_send_item (op, tmp); |
1853 | } |
1858 | } |
|
|
1859 | |
1854 | num_ident--; |
1860 | num_ident--; |
1855 | success = 1; |
1861 | success = 1; |
1856 | if (!num_ident) |
1862 | if (!num_ident) |
1857 | break; |
1863 | break; |
1858 | } |
1864 | } |
1859 | } |
1865 | } |
|
|
1866 | |
1860 | if (!success) |
1867 | if (!success) |
1861 | new_draw_info (NDI_UNIQUE, 0, op, "You can't reach anything unidentified."); |
1868 | new_draw_info (NDI_UNIQUE, 0, op, "You can't reach anything unidentified."); |
1862 | else |
1869 | else |
1863 | { |
|
|
1864 | spell_effect (spell, op->x, op->y, op->map, op); |
1870 | spell_effect (spell, op->x, op->y, op->map, op); |
1865 | } |
1871 | |
1866 | return success; |
1872 | return success; |
1867 | } |
1873 | } |
1868 | |
|
|
1869 | |
1874 | |
1870 | int |
1875 | int |
1871 | cast_detection (object *op, object *caster, object *spell, object *skill) |
1876 | cast_detection (object *op, object *caster, object *spell, object *skill) |
1872 | { |
1877 | { |
1873 | object *tmp, *last, *god, *detect; |
1878 | object *tmp, *last, *god, *detect; |
… | |
… | |
1886 | skill = caster; |
1891 | skill = caster; |
1887 | |
1892 | |
1888 | for (x = op->x - range; x <= op->x + range; x++) |
1893 | for (x = op->x - range; x <= op->x + range; x++) |
1889 | for (y = op->y - range; y <= op->y + range; y++) |
1894 | for (y = op->y - range; y <= op->y + range; y++) |
1890 | { |
1895 | { |
1891 | |
|
|
1892 | m = op->map; |
1896 | m = op->map; |
1893 | mflags = get_map_flags (m, &m, x, y, &nx, &ny); |
1897 | mflags = get_map_flags (m, &m, x, y, &nx, &ny); |
1894 | if (mflags & P_OUT_OF_MAP) |
1898 | if (mflags & P_OUT_OF_MAP) |
1895 | continue; |
1899 | continue; |
1896 | |
1900 | |
… | |
… | |
1898 | * floor. But this is not true for show invisible. |
1902 | * floor. But this is not true for show invisible. |
1899 | * Basically, we just go and find the top object and work |
1903 | * Basically, we just go and find the top object and work |
1900 | * down - that is easier than working up. |
1904 | * down - that is easier than working up. |
1901 | */ |
1905 | */ |
1902 | |
1906 | |
1903 | for (last = NULL, tmp = get_map_ob (m, nx, ny); tmp; tmp = tmp->above) |
1907 | for (last = NULL, tmp = GET_MAP_OB (m, nx, ny); tmp; tmp = tmp->above) |
1904 | last = tmp; |
1908 | last = tmp; |
|
|
1909 | |
1905 | /* Shouldn't happen, but if there are no objects on a space, this |
1910 | /* Shouldn't happen, but if there are no objects on a space, this |
1906 | * would happen. |
1911 | * would happen. |
1907 | */ |
1912 | */ |
1908 | if (!last) |
1913 | if (!last) |
1909 | continue; |
1914 | continue; |
… | |
… | |
1911 | done_one = 0; |
1916 | done_one = 0; |
1912 | floor = 0; |
1917 | floor = 0; |
1913 | detect = NULL; |
1918 | detect = NULL; |
1914 | for (tmp = last; tmp; tmp = tmp->below) |
1919 | for (tmp = last; tmp; tmp = tmp->below) |
1915 | { |
1920 | { |
1916 | |
|
|
1917 | /* show invisible */ |
1921 | /* show invisible */ |
1918 | if (QUERY_FLAG (spell, FLAG_MAKE_INVIS) && |
1922 | if (QUERY_FLAG (spell, FLAG_MAKE_INVIS) && |
1919 | /* Might there be other objects that we can make visibile? */ |
1923 | /* Might there be other objects that we can make visible? */ |
1920 | (tmp->invisible && (QUERY_FLAG (tmp, FLAG_MONSTER) || |
1924 | (tmp->invisible && (QUERY_FLAG (tmp, FLAG_MONSTER) || |
1921 | (tmp->type == PLAYER && !QUERY_FLAG (tmp, FLAG_WIZ)) || |
1925 | (tmp->type == PLAYER && !QUERY_FLAG (tmp, FLAG_WIZ)) || |
1922 | tmp->type == CF_HANDLE || |
1926 | tmp->type == CF_HANDLE || |
1923 | tmp->type == TRAPDOOR || tmp->type == EXIT || tmp->type == HOLE || |
1927 | tmp->type == TRAPDOOR || tmp->type == EXIT || tmp->type == HOLE || |
1924 | tmp->type == BUTTON || tmp->type == TELEPORTER || |
1928 | tmp->type == BUTTON || tmp->type == TELEPORTER || |
… | |
… | |
1931 | { |
1935 | { |
1932 | tmp->invisible = 0; |
1936 | tmp->invisible = 0; |
1933 | done_one = 1; |
1937 | done_one = 1; |
1934 | } |
1938 | } |
1935 | } |
1939 | } |
|
|
1940 | |
1936 | if (QUERY_FLAG (tmp, FLAG_IS_FLOOR)) |
1941 | if (QUERY_FLAG (tmp, FLAG_IS_FLOOR)) |
1937 | floor = 1; |
1942 | floor = 1; |
1938 | |
1943 | |
1939 | /* All detections below this point don't descend beneath the floor, |
1944 | /* All detections below this point don't descend beneath the floor, |
1940 | * so just continue on. We could be clever and look at the type of |
1945 | * so just continue on. We could be clever and look at the type of |
… | |
… | |
2110 | |
2115 | |
2111 | mflags = get_map_flags (m, &m, x, y, &x, &y); |
2116 | mflags = get_map_flags (m, &m, x, y, &x, &y); |
2112 | |
2117 | |
2113 | if (!(mflags & P_OUT_OF_MAP) && mflags & P_IS_ALIVE) |
2118 | if (!(mflags & P_OUT_OF_MAP) && mflags & P_IS_ALIVE) |
2114 | { |
2119 | { |
2115 | for (plyr = get_map_ob (m, x, y); plyr != NULL; plyr = plyr->above) |
2120 | for (plyr = GET_MAP_OB (m, x, y); plyr != NULL; plyr = plyr->above) |
2116 | if (plyr != op && QUERY_FLAG (plyr, FLAG_ALIVE)) |
2121 | if (plyr != op && QUERY_FLAG (plyr, FLAG_ALIVE)) |
2117 | break; |
2122 | break; |
2118 | } |
2123 | } |
2119 | |
2124 | |
2120 | |
2125 | |
2121 | /* If we did not find a player in the specified direction, transfer |
2126 | /* If we did not find a player in the specified direction, transfer |
2122 | * to anyone on top of us. This is used for the rune of transference mostly. |
2127 | * to anyone on top of us. This is used for the rune of transference mostly. |
2123 | */ |
2128 | */ |
2124 | if (plyr == NULL) |
2129 | if (plyr == NULL) |
2125 | for (plyr = get_map_ob (op->map, op->x, op->y); plyr != NULL; plyr = plyr->above) |
2130 | for (plyr = GET_MAP_OB (op->map, op->x, op->y); plyr != NULL; plyr = plyr->above) |
2126 | if (plyr != op && QUERY_FLAG (plyr, FLAG_ALIVE)) |
2131 | if (plyr != op && QUERY_FLAG (plyr, FLAG_ALIVE)) |
2127 | break; |
2132 | break; |
2128 | |
2133 | |
2129 | if (!plyr) |
2134 | if (!plyr) |
2130 | { |
2135 | { |
… | |
… | |
2185 | m = op->map; |
2190 | m = op->map; |
2186 | mflags = get_map_flags (m, &m, sx, sy, &sx, &sy); |
2191 | mflags = get_map_flags (m, &m, sx, sy, &sx, &sy); |
2187 | if (mflags & P_OUT_OF_MAP) |
2192 | if (mflags & P_OUT_OF_MAP) |
2188 | return; |
2193 | return; |
2189 | |
2194 | |
2190 | for (tmp = get_map_ob (m, sx, sy); tmp != NULL; tmp = next) |
2195 | for (tmp = GET_MAP_OB (m, sx, sy); tmp != NULL; tmp = next) |
2191 | { |
2196 | { |
2192 | next = tmp->above; |
2197 | next = tmp->above; |
2193 | |
2198 | |
2194 | /* Need to look at the head object - otherwise, if tmp |
2199 | /* Need to look at the head object - otherwise, if tmp |
2195 | * points to a monster, we don't have all the necessary |
2200 | * points to a monster, we don't have all the necessary |
… | |
… | |
2642 | void |
2647 | void |
2643 | move_peacemaker (object *op) |
2648 | move_peacemaker (object *op) |
2644 | { |
2649 | { |
2645 | object *tmp; |
2650 | object *tmp; |
2646 | |
2651 | |
2647 | for (tmp = get_map_ob (op->map, op->x, op->y); tmp != NULL; tmp = tmp->above) |
2652 | for (tmp = GET_MAP_OB (op->map, op->x, op->y); tmp != NULL; tmp = tmp->above) |
2648 | { |
2653 | { |
2649 | int atk_lev, def_lev; |
2654 | int atk_lev, def_lev; |
2650 | object *victim = tmp; |
2655 | object *victim = tmp; |
2651 | |
2656 | |
2652 | if (tmp->head) |
2657 | if (tmp->head) |