/****************************************************************************** Shoot weapon ammo base object Radix - February 23, 1996 Khelben - Juny 23, 1996 *******************************************************************************/ #include "path.h" inherit "/obj/weapon.c"; private int *ranged_damage; object shadow; string ammo; void anger_npc(object a, object e, mixed tmp); // Will do NPCs attack // players. void set_proj_name(string arg) { ammo = arg; } string query_proj_name() { return ammo; } void init() { if ( (int)this_object()->query_property("cursed") == 100 && !(shadow) ) { if( (string)this_player()->query_cap_name() == (string)this_object()->query_property("stiked") ) { // This clone the arrow shadow when the player log off with a // stinking arrow. With the property "cursed" we are sure that // he cannot drop the arrow. shadow = clone_object(SHOOT_SHADOW); shadow->setup_shadow(this_player() , this_object()); this_player()->add_extra_look(shadow); } else { this_object()->remove_property("cursed"); this_object()->remove_property("stiked"); } } add_action("extract_proj","extract"); ::init(); } int *query_weapon_damage() { return ranged_damage; } int query_ranged_weapon_ammo() { return 1; } int query_ranged_ammo() { return 1; } void set_weapon_damage(int *dam) { if(!dam || !sizeof(dam)) return; ranged_damage = dam; return; } int do_ranged_weapon_damage(object archer, object enemy, mixed tmp, string proj) { int dam; ammo = proj; if(!archer || !enemy) return 0; if ( sizeof(ranged_damage) != 3 ) // Not necessary. Can be erased ranged_damage = ({ 1, 5, 0 }); dam = roll(ranged_damage[0],ranged_damage[1])+ranged_damage[2]; dam = dam + this_object()->query_enchant(); if(dam < 0) dam = 1; if(dam > 20) dam = 20; if(environment(enemy) == environment(archer)) { if(archer->query_hidden_shadow() || archer->query_hidden()) { dam *= 2; archer->destruct_hide_shadow(); archer->set_hidden(0); } else dam *= 1.3; } else { if(tmp[0] == "down") dam *= 2; if(tmp[0] == "up") dam /= 2; } enemy->adjust_hp(-dam,archer); if(!userp(enemy)) // If he is a NPC will move him. anger_npc(archer, enemy, tmp); enemy->attack_by(archer); if (userp(enemy)) // We'll not slay NPCs because they are fools { this_object()->add_property("cursed",100); this_object()->add_property("stiked",enemy->query_cap_name()); shadow = clone_object(SHOOT_SHADOW); shadow->setup_shadow(enemy , this_object()); enemy->add_extra_look(shadow); this_object()->move(enemy); } dam = (dam * (100 - (int)enemy->query_property("missile")))/100; return dam; } void anger_npc(object archer, object enemy, mixed tmp) { if ( enemy->query_hp() >= 0 ) { while(environment(archer) != environment(enemy)) enemy->do_command(tmp[0]); } } int extract_proj(string str) { object arrow; ammo = (string)this_object()->query_proj_name(); if ( ( str == ammo || str == (string)this_object()->query_name() || str == (string)this_object()->query_short() ) && (int)this_object()->query_property("cursed") == 100 ) { if ( random(100) > ((int)this_player()->query_dex() * 5) ) { // The player cannot extract the arrow because he is clumsy tell_object(this_player(), "You try extract the stinking "+this_object()->query_name()+" "+ "but you only remove it into your flesh.\n"); this_player()->adjust_hp(-1,this_object()); return 1; } shadow->destruct_me(); if ( ammo == "arrow") { if( random(100) <= ARROW_BREAK ) { arrow = clone_object(BROKEN_MISSILE); arrow->set_name("broken arrow"); arrow->set_short("broken arrow"); arrow->set_long("This is a broken arrow stained with blood at " "the point.\n"); arrow->add_alias("arrow"); arrow->move(this_player()); tell_object(this_player(), "As you extract the arrow you feel a " "deep pain across all your body as you hear the " "click of the arrow breaking.\n"); this_object()->dest_me(); return 1; } else tell_object(this_player(), "As you extract the arrow you feel a " "deep pain across all your body, but now you're " "better.\n"); } else if ( ammo == "bolt") { if( random(100) <= BOLT_BREAK ) { arrow = clone_object(BROKEN_MISSILE); arrow->set_name("broken bolt"); arrow->set_short("broken bolt"); arrow->set_long("This is a broken bolt stained with blood at " "the point.\n"); arrow->add_alias("bolt"); arrow->move(this_player()); tell_object(this_player(), "As you extract the bolt you feel a " "deep pain across all your body as you hear the " "click of the bolt breaking.\n"); this_object()->dest_me(); return 1; } else tell_object(this_player(), "As you extract the bolt you feel a " "deep pain across all your body, but now you're " "better.\n"); } else if ( ammo == "needle") { if( random(100) <= NEEDLE_BREAK ) { arrow = clone_object(BROKEN_MISSILE); arrow->set_name("broken needle"); arrow->set_short("broken needle"); arrow->set_long("This is a broken needle stained with blood at " "the point. \n"); arrow->move(this_player()); tell_object(this_player(), "As you extract the needle you feel a " "deep pain across all your body as you hear the click " "of the needle breaking.\n"); this_object()->dest_me(); return 1; } else tell_object(this_player(), "As you extract the needle you feel a " "deep pain across all your body, but now you're " "better.\n"); } this_object()->remove_property("cursed"); return 1; } else return 0; }