/* /lib/trap.c * From the Nightmare V Object Library * Allows living things to be trapped and stored across reboots * Created by Descartes of Borg 961010 * Version: @(#) trap.c 1.5@(#) * Last modified: 96/12/03 */ #include <lib.h> #include "include/trap.h" inherit LIB_STORAGE; int EscapeChance = 0; int MaxCapture = 0; static void create() { storage::create(); if( sizeof(GetCaptives()) ) { set_heart_beat(2); } } static void heart_beat() { if( !sizeof(GetCaptives()) ) { set_heart_beat(0); return; } if( !GetClosed() ) { if( GetEscapeChance() > (1 + random(100)) ) { eventEscape(); } } } mixed indirect_capture_liv_word_obj(object target) { if( environment() != this_player() ) { return "#You do not have " + GetShort() + "."; } if( !target ) { return 1; } return CanCapture(this_player(), target); } mixed indirect_free_liv_from_obj(object target) { if( environment() != this_player() ) { return "#You do not have " + GetShort() + "."; } if( !target ) { return 1; } return CanFree(this_player(), target); } mixed CanCapture(object who, object target) { if( environment(who) != environment(target) ) { return "#You cannot get to it."; } if( GetClosed() ) { return capitalize(GetShort()) + " is closed."; } if( sizeof(GetCaptives()) >= MaxCapture ) { return "You cannot capture anything else with " + GetShort() + "."; } return 1; } mixed CanFree(object who, object target) { if( environment(target) != this_object() ) { return "#" + target->GetName() + " is not in " + GetShort() + "."; } if( GetClosed() ) { return "You must open " + GetShort() + " before you can free " "things from it."; } return 1; } mixed eventCapture(object who, object target) { object env = environment(target); mixed tmp; if( !target->eventMove(this_object()) ) { return target->GetShort() + " will not fit!"; } who->eventPrint("You capture " + target->GetName() + " in " + GetShort() + "!"); environment(who)->eventPrint(who->GetName() + " captures " + target->GetName() + " in " + GetShort() + ".", ({ who, target })); target->eventPrint(who->GetName() + " captures you in " + GetShort() +"."); set_heart_beat(2); return 1; } mixed eventEscape() { object array captives; object captive, env; if( GetClosed() ) { return 0; } captives = GetCaptives(); if( !sizeof(captives) ) { return 0; } captive = captives[random(sizeof(captives))]; if( !captive ) { return 0; } env = environment(); if( living(env) ) { env = environment(env); if( !env ) { return 0; } } if( captive->eventMove(env) != 1 ) { return 0; } env->eventPrint(captive->GetShort() + " escapes from " + GetShort() + "."); return 1; } mixed eventFree(object who, string target) { target->eventMove(environment(who)); who->eventPrint("You release " + target->GetName() + " from " + GetShort() + "."); environment(who)->eventPrint(who->GetName() + " releases " + target->GetName() + " from " + GetShort()+".", ({ who, target })); target->eventPrint(who->GetName() + " releases you from " + GetShort() +"."); return 1; } object array GetCaptives() { return filter(all_inventory(), (: living :)); } int GetEscapeChance() { return EscapeChance; } int SetEscapeChance(int x) { return (EscapeChance = x); } int GetMaxCapture() { return MaxCapture; } int SetMaxCapture(int x) { return (MaxCapture = x); }