/** * * Title: mediator.script * Description: mediator object script: POI = mysteriousdisk */ //------------------------------------------------ // Includes //------------------------------------------------ include library.npc; include library.poi; include library.scenario; include library.ai_lib; include library.utils; include ai.ai_combat; //----------------------------------------------- // Inherits //----------------------------------------------- inherits poi.base.scenario_actor; //------------------------------------------------ // Constants //------------------------------------------------ const string SCRIPT_CONVERSE = "npc.converse.npc_converse_menu"; const string LOG_NAME = "poiMysteriousDisk Mediator"; const string ALERT_VOLUME_NAME = "alertTriggerVolume"; // Conversation states. const int CONV_GREET = 0; const int CONV_TALKMEDIATOR = 1; //------------------------------------------------ // Methods //------------------------------------------------ //------------------------------------------------ // OnAttach //------------------------------------------------ trigger OnAttach() { attachScript( self, SCRIPT_CONVERSE ); return SCRIPT_CONTINUE; } //------------------------------------------------ // OnInitialize //------------------------------------------------ trigger OnInitialize() { attachScript( self, SCRIPT_CONVERSE ); return SCRIPT_CONTINUE; } //------------------------------------------------ // OnIncapacitated //------------------------------------------------ trigger OnIncapacitated( obj_id killer ) { // Get reference to base. obj_id poiMaster = poi.getBaseObject( self ); if ( (poiMaster == null) || (poiMaster == obj_id.NULL_ID) ) return SCRIPT_CONTINUE; messageTo( poiMaster, scenario.HANDLER_ACTOR_DEATH, null, 0, false ); return SCRIPT_CONTINUE; } //------------------------------------------------ // OnTriggerVolumeEntered //------------------------------------------------ trigger OnTriggerVolumeEntered( string volumeName, obj_id breacher ) { if ( hasObjVar( breacher, "gm") ) return SCRIPT_OVERRIDE; if ( ai_lib.isInCombat( self ) ) return SCRIPT_OVERRIDE; if ( breacher == self ) return SCRIPT_OVERRIDE; if ( isIncapacitated(self) ) return SCRIPT_OVERRIDE; if ( !isMob( breacher ) ) return SCRIPT_OVERRIDE; if ( ai_lib.isMonster( breacher ) ) return SCRIPT_OVERRIDE; if ( volumeName == ALERT_VOLUME_NAME ) { // We can only trigger once. if ( hasObjVar( self, "ranForHelp" ) ) return SCRIPT_CONTINUE; setObjVar( self, "ranForHelp", true ); // Store reference to breacher. setObjVar( self, "breacher", breacher ); // Turn to breacher. faceTo( self, breacher ); queueCommand( self, ##"social", breacher, "hail", COMMAND_PRIORITY_DEFAULT ); // Run to the breacher. messageTo( self, "runToTarget", null, 6, false ); return SCRIPT_OVERRIDE; } return SCRIPT_OVERRIDE; } //------------------------------------------------ // runToTarget //------------------------------------------------ messageHandler runToTarget() { // Follow the breacher a bit. ai_lib.aiFollow( self, getObjIdObjVar( self, "breacher" ) ); // Shout at him. poi.quickSay( self, "m_helpme" ); // Set a callback to shout again. messageTo( self, "tryToGetHelp1", null, 10, false ); return SCRIPT_CONTINUE; } //------------------------------------------------ // tryToGetHelp1 //------------------------------------------------ messageHandler tryToGetHelp1() { if ( hasObjVar( self, "inChat" ) ) return SCRIPT_CONTINUE; // Shout at him. poi.quickSay( self, "m_pleasehelpme" ); // Set a callback to shout again. messageTo( self, "tryToGetHelp2", null, 10, false ); return SCRIPT_CONTINUE; } //------------------------------------------------ // tryToGetHelp2 //------------------------------------------------ messageHandler tryToGetHelp2() { if ( hasObjVar( self, "inChat" ) ) return SCRIPT_CONTINUE; // Shout at him. poi.quickSay( self, "m_desperatehelpme" ); // Stop following. ai_lib.aiStopFollowing( self ); // Do an action in a bit. messageTo( self, "begForHelp", null, 2, false ); return SCRIPT_CONTINUE; } //------------------------------------------------ // begForHelp //------------------------------------------------ messageHandler begForHelp() { // Emote. queueCommand( self, ##"social", null, "grovel", COMMAND_PRIORITY_DEFAULT ); // Get base object reference. obj_id poiMaster = poi.getBaseObject(self); if ( (poiMaster == null) || (poiMaster == obj_id.NULL_ID) ) return SCRIPT_CONTINUE; // Set timer to fight. messageTo( poiMaster, "startFight", null, 20, false ); return SCRIPT_CONTINUE; } //------------------------------------------------ // OnStartNpcConversation //------------------------------------------------ trigger OnStartNpcConversation( obj_id speaker ) { // Ignore conversation in combat. if ( ai_lib.isInCombat(self) ) return SCRIPT_CONTINUE; // Get conversation. string convo = scenario.getConvo(); if ( convo.equals("") ) { npcEndConversation ( speaker ); return SCRIPT_CONTINUE; } // Look up our progress. int progress = scenario.getPlayerProgress( speaker ); // Msg/response vars. string_id msg = new string_id( convo, "m_greet_0" ); resizeable string_id[] responses = new string_id[0]; // Stop following. ai_lib.aiStopFollowing( self ); setObjVar( self, "inChat", true ); // Normal greeting. if ( progress == CONV_GREET ) { msg = new string_id( convo, "m_greet" ); responses = utils.addElement( responses, new string_id(convo, "r_m_greet_who") ); npcStartConversation( speaker, self, convo, msg, responses ); } else npcEndConversation( speaker ); return SCRIPT_CONTINUE; } //------------------------------------------------ // OnNpcConversationResponse //------------------------------------------------ trigger OnNpcConversationResponse( string convoName, obj_id speaker, string_id response ) { // Ignore conversation in combat. if ( ai_lib.isInCombat(self) ) return SCRIPT_CONTINUE; // Get reference to base. obj_id poiMaster = poi.getBaseObject( self ); if ( (poiMaster == null) || (poiMaster == obj_id.NULL_ID) ) { npcEndConversation( speaker ); return SCRIPT_CONTINUE; } // Get reference to conversation. string convo = scenario.getConvo(); if ( convo.equals("") ) { npcEndConversation( speaker ); return SCRIPT_CONTINUE; } // Validate our conversation. if ( !convoName.equals(convo) ) { LOG( LOG_NAME, "Convo files do not match!!" ); return SCRIPT_CONTINUE; } // Look up the player's progress. int progress = scenario.getPlayerProgress( speaker ); // Respond to the player's comment. string aId = response.getAsciiId(); string_id msg = new string_id(); string_id[] responses = new string_id[0]; // Zero out responses. npcSetConversationResponses( speaker, responses ); // Who are these prisoners? if ( ( aId.equals("r_m_greet_who") ) ) { // Add the player to the scenario. // scenario.addPlayer( poiMaster, speaker ); scenario.setPlayerProgress( speaker, CONV_TALKMEDIATOR ); // Create the disk and give it to the player. obj_id inventory = getObjectInSlot( speaker, "inventory" ); string diskItem = "object/tangible/mission/mission_datadisk.iff"; obj_id disk = createObject( diskItem, inventory, "" ); // setName( disk, new string_id( convo, "itemname" ) ); setName( disk, "Encrypted Datadisk" ); // System message. // string_id sid = new string_id( convo, "systemmessage" ); // sendSystemMessage( speaker, sid ); sendSystemMessage( speaker, "You received an encrypted datadisk!", null ); // They are coming! npcSpeak( speaker, new string_id( convo, "m_theycome" ) ); // We gave the disk. setObjVar( self, "gaveDisk", true ); // Set timer to fight. messageTo( poiMaster, "startFight", null, 3, false ); } return SCRIPT_CONTINUE; }