/* Do not remove the headers from this file! see /USAGE for more info. */ #include <combat_modules.h> inherit __DIR__ "class_" STRINGIZE(BLOW_MODULE); varargs int hurt_us(int, string); varargs void attacked_by(object, int); string query_random_limb(); void handle_message(string, object, object); string damage_message(int); object array query_targets(); object query_weapon(); varargs void unwield(string); object array event_get_armors(class event_info); int do_damage_event(class event_info evt) { int x; if(evt->data != "miss") x = hurt_us(event_damage(evt) #ifdef HEALTH_USES_LIMBS , evt->target_extra #endif ); if(member_array(previous_object(), query_targets()) == -1) attacked_by(previous_object(), 0); return x; } // Modify us (as attacker). Include things such as racial modifiers, // resistances, etc. class event_info modify_our_event(class event_info evt) { return evt; } class event_info health_modify_event(class event_info evt) { return evt; } class event_info armors_modify_event(class event_info evt) { object array armors = event_get_armors(evt); if(armors) foreach(object ob in armors) evt = ob->sink_modify_event(evt); return evt; } // This is the method that gets called in the target object. Before // the event does any damage to us, make modifications. class event_info modify_event(class event_info evt) { evt = health_modify_event(evt); evt = armors_modify_event(evt); return evt; } void handle_result(class event_info evt) { object w; if(stringp(evt->data)) { handle_message("!" + evt->data, evt->target, evt->weapon #ifdef HEALTH_USES_LIMBS , evt->target_extra #endif ); switch (evt->data) { case "dispatch": evt->target->kill_us(); break; case "disarm": w = evt->target->query_weapon(); evt->target->unwield(); w->move(environment()); break; case "miss": evt->target->do_damage_event(evt); break; } } else { int percent = event_damage(evt); handle_message(damage_message(percent), evt->target, evt->weapon); percent = evt->target->do_damage_event(evt); } } void handle_events() { int i = 0; /* walking over the queue is slightly more efficient than deleting the first element each time, causing them all to have to move */ while (i < sizeof(queue)) { queue[i] = modify_our_event(queue[i]); if(!queue[i]) { i++; continue; } if(queue[i]->weapon) { queue[i] = queue[i]->weapon->source_modify_event(queue[i]); if(!queue[i]) { i++; continue; } } if(queue[i]->target) queue[i] = queue[i]->target->modify_event(queue[i]); if(!queue[i]) { i++; continue; } handle_result(queue[i]); i++; } queue = ({ }); }