… | |
… | |
372 | if (!check_wakeup (op, enemy, &rv)) |
372 | if (!check_wakeup (op, enemy, &rv)) |
373 | return 0; |
373 | return 0; |
374 | } |
374 | } |
375 | |
375 | |
376 | /* check if monster pops out of hidden spot */ |
376 | /* check if monster pops out of hidden spot */ |
377 | if (op->hide) |
377 | if (op->flag [FLAG_HIDDEN]) |
378 | do_hidden_move (op); |
378 | do_hidden_move (op); |
379 | |
379 | |
380 | if (op->pick_up) |
380 | if (op->pick_up) |
381 | monster_check_pickup (op); |
381 | monster_check_pickup (op); |
382 | |
382 | |
… | |
… | |
386 | /* If we don't have an enemy, do special movement or the like */ |
386 | /* If we don't have an enemy, do special movement or the like */ |
387 | if (!enemy) |
387 | if (!enemy) |
388 | { |
388 | { |
389 | if (QUERY_FLAG (op, FLAG_ONLY_ATTACK)) |
389 | if (QUERY_FLAG (op, FLAG_ONLY_ATTACK)) |
390 | { |
390 | { |
391 | op->destroy (); |
391 | op->drop_and_destroy (); |
392 | return 1; |
392 | return 1; |
393 | } |
393 | } |
394 | |
394 | |
395 | /* Probably really a bug for a creature to have both |
395 | /* Probably really a bug for a creature to have both |
396 | * stand still and a movement type set. |
396 | * stand still and a movement type set. |
… | |
… | |
650 | if (QUERY_FLAG (part, FLAG_FREED)) /* Might be freed by ghost-attack or hit-back */ |
650 | if (QUERY_FLAG (part, FLAG_FREED)) /* Might be freed by ghost-attack or hit-back */ |
651 | return 1; |
651 | return 1; |
652 | |
652 | |
653 | if (QUERY_FLAG (op, FLAG_ONLY_ATTACK)) |
653 | if (QUERY_FLAG (op, FLAG_ONLY_ATTACK)) |
654 | { |
654 | { |
655 | op->remove (); |
|
|
656 | op->destroy (); |
655 | op->drop_and_destroy (); |
657 | return 1; |
656 | return 1; |
658 | } |
657 | } |
|
|
658 | |
659 | return 0; |
659 | return 0; |
660 | } |
660 | } |
661 | |
661 | |
662 | int |
662 | int |
663 | can_hit (object *ob1, object *ob2, rv_vector * rv) |
663 | can_hit (object *ob1, object *ob2, rv_vector * rv) |
… | |
… | |
1705 | |
1705 | |
1706 | /* use this for invis also */ |
1706 | /* use this for invis also */ |
1707 | hide_discovery = op->stats.Int / 5; |
1707 | hide_discovery = op->stats.Int / 5; |
1708 | |
1708 | |
1709 | /* Determine Detection radii */ |
1709 | /* Determine Detection radii */ |
1710 | if (!enemy->hide) /* to detect non-hidden (eg dark/invis enemy) */ |
1710 | if (!enemy->flag [FLAG_HIDDEN]) /* to detect non-hidden (eg dark/invis enemy) */ |
1711 | radius = max (MIN_MON_RADIUS, op->stats.Wis / 5 + 1); |
1711 | radius = max (MIN_MON_RADIUS, op->stats.Wis / 5 + 1); |
1712 | else |
1712 | else |
1713 | { /* a level/INT/Dex adjustment for hiding */ |
1713 | { /* a level/INT/Dex adjustment for hiding */ |
1714 | int bonus = op->level / 2 + op->stats.Int / 5; |
1714 | int bonus = op->level / 2 + op->stats.Int / 5; |
1715 | |
1715 | |
… | |
… | |
1775 | /* ah, we are within range, detected? take cases */ |
1775 | /* ah, we are within range, detected? take cases */ |
1776 | if (!enemy->invisible) /* enemy in dark squares... are seen! */ |
1776 | if (!enemy->invisible) /* enemy in dark squares... are seen! */ |
1777 | return 1; |
1777 | return 1; |
1778 | |
1778 | |
1779 | /* hidden or low-quality invisible */ |
1779 | /* hidden or low-quality invisible */ |
1780 | if (enemy->hide && rv->distance <= 1 && rndm (100) <= hide_discovery) |
1780 | if (enemy->flag [FLAG_HIDDEN] && rv->distance <= 1 && rndm (100) <= hide_discovery) |
1781 | { |
1781 | { |
1782 | make_visible (enemy); |
1782 | make_visible (enemy); |
1783 | |
1783 | |
1784 | /* inform players of new status */ |
1784 | /* inform players of new status */ |
1785 | if (enemy->type == PLAYER && player_can_view (enemy, op)) |
1785 | if (enemy->type == PLAYER && player_can_view (enemy, op)) |
… | |
… | |
1875 | * However,if you carry any source of light, then the hidden |
1875 | * However,if you carry any source of light, then the hidden |
1876 | * creature is seeable (and stupid) */ |
1876 | * creature is seeable (and stupid) */ |
1877 | |
1877 | |
1878 | if (has_carried_lights (enemy)) |
1878 | if (has_carried_lights (enemy)) |
1879 | { |
1879 | { |
1880 | if (enemy->hide) |
1880 | if (enemy->flag [FLAG_HIDDEN]) |
1881 | { |
1881 | { |
1882 | make_visible (enemy); |
1882 | make_visible (enemy); |
1883 | new_draw_info (NDI_UNIQUE, 0, enemy, "Your light reveals your hiding spot!"); |
1883 | new_draw_info (NDI_UNIQUE, 0, enemy, "Your light reveals your hiding spot!"); |
1884 | } |
1884 | } |
1885 | |
1885 | |
1886 | return 1; |
1886 | return 1; |
1887 | } |
1887 | } |
1888 | else if (enemy->hide) |
1888 | else if (enemy->flag [FLAG_HIDDEN]) |
1889 | return 0; |
1889 | return 0; |
1890 | |
1890 | |
1891 | /* Invisible enemy. Break apart the check for invis undead/invis looker |
1891 | /* Invisible enemy. Break apart the check for invis undead/invis looker |
1892 | * into more simple checks - the QUERY_FLAG doesn't return 1/0 values, |
1892 | * into more simple checks - the QUERY_FLAG doesn't return 1/0 values, |
1893 | * and making it a conditional makes the code pretty ugly. |
1893 | * and making it a conditional makes the code pretty ugly. |