/** * Melee effect handler: Cause an earthquake around the player. */ static void melee_effect_handler_SHATTER(melee_effect_handler_context_t *context) { /* Obvious */ context->obvious = TRUE; /* Hack -- Reduce damage based on the player armor class */ context->damage = adjust_dam_armor(context->damage, context->ac); /* Take damage */ take_hit(context->p, context->damage, context->ddesc); /* Player is dead */ if (context->p->is_dead) return; /* Radius 8 earthquake centered at the monster */ if (context->damage > 23) { int px_old = context->p->px; int py_old = context->p->py; effect_simple(EF_EARTHQUAKE, "0", 0, 8, 0, NULL); /* Stop the blows if the player is pushed away */ if ((px_old != context->p->px) || (py_old != context->p->py)) context->do_break = TRUE; } }
/** * Melee effect handler: Hurt the player with no side effects. */ static void melee_effect_handler_HURT(melee_effect_handler_context_t *context) { /* Obvious */ context->obvious = TRUE; /* Hack -- Player armor reduces total damage */ context->damage = adjust_dam_armor(context->damage, context->ac); /* Take damage */ take_hit(context->p, context->damage, context->ddesc); }
/** * Do damage as the result of a melee attack that has an elemental aspect. * * \param context is information for the current attack. * \param type is the GF_ constant for the element. * \param pure_element should be TRUE if no side effects (mostly a hack * for poison). */ static void melee_effect_elemental(melee_effect_handler_context_t *context, int type, bool pure_element) { int physical_dam, elemental_dam; if (pure_element) { /* Obvious */ context->obvious = TRUE; } switch (type) { case GF_ACID: msg("You are covered in acid!"); break; case GF_ELEC: msg("You are struck by electricity!"); break; case GF_FIRE: msg("You are enveloped in flames!"); break; case GF_COLD: msg("You are covered with frost!"); break; } /* Give the player a small bonus to ac for elemental attacks */ physical_dam = adjust_dam_armor(context->damage, context->ac + 50); /* Some attacks do no physical damage */ if (!monster_blow_method_physical(context->method)) physical_dam = 0; elemental_dam = adjust_dam(player, type, context->damage, RANDOMISE, 0); /* Take the larger of physical or elemental damage */ context->damage = (physical_dam > elemental_dam) ? physical_dam : elemental_dam; if (context->damage > 0) take_hit(context->p, context->damage, context->ddesc); if (elemental_dam > 0) inven_damage(context->p, type, MIN(elemental_dam * 5, 300)); if (pure_element) { /* Learn about the player */ update_smart_learn(context->m_ptr, context->p, 0, 0, type); } }