inherit "/std/races/humanoid"; #include <armoury.h> void knock_out( object player, object golem ); void unarmed_hands( int damage, object him, object me, string a_type, string a_name ); object make_corpse(); void setup() { set_name( "golem" ); set_long( "Golems are artifical shaped of clay to resemble humanoids and " "animated using religious rituals. If they are actually alive is a " "question under constant debate.\n" ); set_height( 200 ); set_weight( 40000 ); set_desc( "a tall, human-shaped creature made of clay" ); add_property( "no scry", 1 ); add_ac( "blunt", "pierce", ({150}) ); add_ac( "pierce", "pierce", ({250}) ); add_ac( "sharp", "sharp", ({250}) ); add_ac( "fire", "fire", ({10000}) ); add_ac( "cold", "cold", ({10000}) ); add_ac( "acid", "acid", ({10000}) ); add_ac( "magic", "magic", ({10000}) ); set_sight( ({ 0, 5, 100, 125 }) ); set_stats( ({ 30, 10, 0, 40, 0 }) ); } /* void setup() */ varargs int query_ac( string type, int damage, string zone, int amount ) { object attacker, weapon; if( type == "blunt" ) return amount; attacker = (object)previous_object()->query_attacker(); if( attacker ) { weapon = (object)attacker->query_weapon(); if( weapon && weapon != attacker ) weapon->adjust_cond( -(int)weapon->query_cond() / 15 ); } return amount; } /* varargs int query_ac() */ object make_corpse() { object corpse, owner; owner = previous_object(); corpse = ARMOURY->request_item( "golem corpse", 100 ); all_inventory( owner )->move( corpse ); return corpse; } /* object make_corpse() */ void set_unarmed_attacks( object thing ) { if( !thing ) return; thing->remove_attack( "hands" ); thing->remove_attack( "feet" ); thing->add_attack( "hands", 75, ({ 50, 10, 15 }), "blunt", "unarmed", ({ "unarmed_hands", this_object() }) ); } /* void set_unarmed_attacks() */ void unarmed_hands( int damage, object him, object me, string a_type, string a_name ) { // Golems do not kill people. if( damage > 130 || damage >= him->query_hp() ) { damage = 0; knock_out( him, me ); } } /* void unarmed_hands() */ /* This should knock the player out of the room, if possible - if there is no * suitable exit, he stays in the room. In any case, he should pass out for * 3 - 6 minutes. */ void knock_out( object player, object golem ) { object room, target; string *all_exits, *no_doors = ({ }); string exit; int i; if( !player || !golem ) return; player->stop_all_fight(); golem->stop_fight( player ); if( !( room = environment( golem ) ) ) return; all_exits = room->query_dest_dir(); for( i = 0; i < sizeof( all_exits ); i += 2 ) if( !room->query_door( all_exits[i], "door" ) ) no_doors += ({ all_exits[i + 1] }); target = load_object( no_doors[ random( sizeof( no_doors ) ) ] ); tell_object( player, golem->the_short() + "' blow lifts you off your feet and hurls " "you through the air.\n" "You see the world race past you and then the ground approaching very " "fast.\n" ); if( target ) { exit = all_exits[ member_array( file_name( target ), all_exits ) - 1 ]; player->move( target, "$N come$s flying through the air from $F in a high arc and " "thump$s onto the ground.", "$N is lifted off " + player->query_possessive() + " feet by " + golem->the_short() + "'s blow and sail$s out of the room " "to the " + exit + "." ); } else tell_room( room, player->the_short() + " is lifted off " + player->query_possessive() + " feet by " + golem->the_short() + "'s blow and smashes to the " "ground.\n", ({player}) ); player->set_position( "lying on the ground unconscious" ); player->add_property( "passed out", 1, ( 150 + random( 150 ) ) ); } /* void knock_out() */ int stone_skinned() { return 1; } /* int stone_skinned() */