//------------------------------------------------ // delivery.script // Brandon Reinhart // // Move to a location, meet a ship, pick up an item, // move to another location, meet a ship, drop off the item. // With attacks during the transport process. // // // Player flies to pickup rendezvous. // Warp in Pickup Ship // Player docks. // Player receives contents. // Player flies to target location. // Player is attacked on route. // Player reaches target location. // Warp in Dropoff Ship // Player docks. // Player transfers contents. // //------------------------------------------------ //------------------------------------------------ // Includes //------------------------------------------------ include library.space_create; include library.space_transition; include library.space_quest; include library.space_utils; include library.utils; include library.ship_ai; include library.prose; //------------------------------------------------ // Constants //------------------------------------------------ // Strings const string_id SID_ABANDONED_MISSION = new string_id( "space/quest", "mission_abandoned" ); const string_id SID_TARGETS_REMAINING = new string_id( "space/quest", "destroy_duty_targets_remaining" ); const string SOUND_SPAWN_ESCORT = "clienteffect/ui_quest_spawn_escort.cef"; const string SOUND_SPAWN_WAVE = "clienteffect/ui_quest_spawn_wave.cef"; const string SOUND_DESTROYED_WAVE = "clienteffect/ui_quest_destroyed_wave.cef"; //------------------------------------------------ // OnAttach //------------------------------------------------ trigger OnAttach() { // Set up quest specific objvars. string questName = getStringObjVar( self, space_quest.QUEST_NAME ); string questType = getStringObjVar( self, space_quest.QUEST_TYPE ); obj_id player = getObjIdObjVar( self, space_quest.QUEST_OWNER ); if ( (questName == null) || (questType == null) ) { // Failed to find basic quest info. return SCRIPT_CONTINUE; } string qTable = "datatables/spacequest/"+questType+"/"+questName+".iff"; dictionary questInfo = dataTableGetRow( qTable, 0 ); if ( questInfo == null ) { // Failed to find quest info. sendSystemMessageTestingOnly( player, "Debug: Failed to open quest table "+qTable ); return SCRIPT_CONTINUE; } // Determine the type of ship we have to pick up from and deliver to. setObjVar( self, "pickupShip", questInfo.getString("pickupShip") ); setObjVar( self, "deliveryShip", questInfo.getString("deliveryShip") ); // Get our pickup point. setObjVar( self, "pickupPoint", questInfo.getString("pickupPoint") ); // Get our delivery point. setObjVar( self, "deliveryPoint", questInfo.getString("deliveryPoint") ); // Get attack info. int numAttackShipLists = questInfo.getInt( "numAttackShipLists" ); setObjVar( self, "numAttackShipLists", numAttackShipLists ); for ( int i=0; i 0 ) messageTo( self, "launchAttack", null, attackPeriod, false ); } else if ( hasObjVar( self, "dropoff" ) ) { // The player is undocking during the pickup phase. // See if he is undocking with the pickup ship. obj_id target = params.getObjId( "target" ); obj_id ship = getObjIdObjVar( self, "delivery_ship" ); if ( target != ship ) return SCRIPT_CONTINUE; // This is a correct ship. removeObjVar( self, "dropoff" ); utils.removeScriptVar( ship, "dockable" ); // Send a message. string_id status_update = new string_id( "spacequest/"+questType+"/"+questName, "docking_complete_delivery" ); prose_package pp = prose.getPackage( status_update, 0 ); space_quest.groupTaunt( ship, player, pp ); // Update the quest journal. int questid = questGetQuestId( "spacequest/"+questType+"/"+questName ); if ( questid != 0 ) { if ( hasObjVar( self, "delivery_nopickup" ) ) { if ( questIsTaskActive( questid, 2, player ) ) questCompleteTask( questid, 2, player ); } else { if ( questIsTaskActive( questid, 4, player ) ) questCompleteTask( questid, 4, player ); } } // Have the pickup ship move away and hyperspace out. transform t = getTransform_o2w( ship ); transform goalLoc = space_quest.getRandomPositionInSphere( t, 1000, 1200 ); ship_ai.unitMoveTo( ship, goalLoc ); messageTo( ship, "lightspeedJump", null, 15.f, false ); // Quick win for now. messageTo( self, "finishQuest", null, 2.f, false ); } return SCRIPT_OVERRIDE; } //------------------------------------------------ // findDeliveryPoint //------------------------------------------------ messageHandler findDeliveryPoint() { obj_id player = getObjIdObjVar( self, space_quest.QUEST_OWNER ); dictionary outparams = new dictionary(); outparams.put( "player", player ); messageTo( self, "initializedQuestPlayer", outparams, 1.f, false ); return SCRIPT_OVERRIDE; } //------------------------------------------------ // clearMissionWaypoint //------------------------------------------------ void clearMissionWaypoint( obj_id self ) { obj_id player = getObjIdObjVar( self, space_quest.QUEST_OWNER ); obj_id waypoint = getObjIdObjVar( self, "pickup_waypoint" ); if ( isIdValid(waypoint) ) destroyWaypointInDatapad( waypoint, player ); removeObjVar( self, "pickup_waypoint" ); // Unregister the arrive trigger. dictionary params = new dictionary(); string loc = getStringObjVar( self, "loc" ); if ( loc != null ) removeLocationTarget(player, loc); } //------------------------------------------------ // abortMission //------------------------------------------------ messageHandler abortMission() { if ( hasObjVar( self, "noAbort" ) ) return SCRIPT_CONTINUE; questAborted( self ); return SCRIPT_CONTINUE; } //------------------------------------------------ // questAborted //------------------------------------------------ void questAborted( obj_id self ) { // Clean up transports. cleanUpTransports( self, false ); // Clear the mission waypoint. clearMissionWaypoint( self ); // We finished the quest! obj_id player = getObjIdObjVar( self, space_quest.QUEST_OWNER ); space_quest.setQuestAborted( player, self ); } //------------------------------------------------ // questCompleted //------------------------------------------------ void questCompleted( obj_id self ) { // Clean up transports. cleanUpTransports( self, true ); // Clear the mission waypoint. clearMissionWaypoint( self ); // We finished the quest! obj_id player = getObjIdObjVar( self, space_quest.QUEST_OWNER ); space_quest.setQuestWon( player, self ); } //------------------------------------------------ // removeQuest //------------------------------------------------ messageHandler removeQuest() { obj_id player = getObjIdObjVar( self, space_quest.QUEST_OWNER ); // Flag the main quest journal entry as finished. string questName = getStringObjVar( self, space_quest.QUEST_NAME ); string questType = getStringObjVar( self, space_quest.QUEST_TYPE ); int questid = questGetQuestId( "spacequest/"+questType+"/"+questName ); if ( (questid != 0) && questIsQuestActive( questid, player ) ) questCompleteQuest( questid, player ); // Kill the quest. space_quest._removeQuest( player, self ); return SCRIPT_CONTINUE; } //------------------------------------------------ // finishQuest //------------------------------------------------ messageHandler finishQuest() { questCompleted( self ); return SCRIPT_CONTINUE; } //------------------------------------------------ // cleanUpTransports //------------------------------------------------ void cleanUpTransports( obj_id self, boolean keepDelivery ) { obj_id ship = getObjIdObjVar( self, "pickup_ship" ); if ( isIdValid( ship ) && exists( ship ) ) destroyObjectHyperspace( ship ); ship = getObjIdObjVar( self, "delivery_ship" ); if ( isIdValid( ship ) && exists( ship ) && !keepDelivery ) destroyObjectHyperspace( ship ); } //------------------------------------------------ // questUpdate //------------------------------------------------ void questUpdate( obj_id self, string_id update_id ) { obj_id player = getObjIdObjVar( self, space_quest.QUEST_OWNER ); string questName = getStringObjVar( self, space_quest.QUEST_NAME ); string questType = getStringObjVar( self, space_quest.QUEST_TYPE ); string_id update_prefix = new string_id( "spacequest/"+questType+"/"+questName, "quest_update" ); prose_package pp = prose.getPackage( update_prefix, update_id ); space_quest.sendQuestMessage( player, pp ); } //------------------------------------------------ // launchAttack //------------------------------------------------ messageHandler launchAttack() { // Abort if the ship already arrived or hasn't shown up yet. if ( !hasObjVar( self, "initialized" ) ) return SCRIPT_CONTINUE; // It's time to launch an attack on the player. obj_id player = getObjIdObjVar( self, space_quest.QUEST_OWNER ); string questName = getStringObjVar( self, space_quest.QUEST_NAME ); string questType = getStringObjVar( self, space_quest.QUEST_TYPE ); // Determine if enough waves are already launched. if ( hasObjVar( self, "wave1" ) && hasObjVar( self, "wave2" ) ) { // Both waves are active, so we can't spawn another right now. setObjVar( self, "new_wave_pending", 1 ); return SCRIPT_CONTINUE; } // Determine the wave number. int wavenum = 0; if ( hasObjVar( self, "wave1" ) ) wavenum = 2; else wavenum = 1; // Gather the info we need to spawn. int numAttackShipLists = getIntObjVar( self, "numAttackShipLists" ); if ( numAttackShipLists == 0 ) return SCRIPT_CONTINUE; int attack = getIntObjVar( self, "attackindex" ); if ( (attack < 1) || (attack > numAttackShipLists) ) attack = 1; setObjVar( self, "attackindex", attack+1 ); if ( getIntObjVar( self, "attackListType" ) == 1 ) attack = rand( 1, numAttackShipLists ); string[] shipList = getStringArrayObjVar( self, "attackShips"+attack ); int count = shipList.length; int k = 0; obj_id[] targets = null; obj_id[] oldtargets = getObjIdArrayObjVar( self, "targets" ); if ( oldtargets == null ) targets = new obj_id[count]; else { targets = new obj_id[count+oldtargets.length]; k = oldtargets.length; // Copy old targets into buffer. for ( int i=0; i 3 ) ship_ai.unitSetSquadId( newship, squad ); attachScript( newship, "space.quest_logic.dynamic_ship" ); attachScript( newship, "space.quest_logic.destroyduty_ship" ); targets[i] = newship; setObjVar( newship, "quest", self ); space_quest._addMissionCriticalShip( player, self, newship ); setObjVar( newship, "objMissionOwner", player ); ship_ai.unitAddExclusiveAggro( newship, player ); dictionary dict = new dictionary (); dict.put ("player", space_transition.getContainingShip(player)); dict.put ("newship", newship); messageTo (self, "attackPlayerShip", dict, 4.0f, false); // Mark the ship with its wave. setObjVar( newship, "wave", wavenum ); j++; if ( j >= shipList.length ) j = 0; } // Record this wave count. setObjVar( self, "wave"+wavenum, count ); // Set a formation. if ( count > 3 ) ship_ai.squadSetFormationRandom( squad ); setObjVar( self, "targets", targets ); // Notify the player. string_id attack_notify = new string_id( "spacequest/"+questType+"/"+questName, "attack_notify" ); space_quest.sendQuestMessage( player, attack_notify ); playClientEffectObj( player, SOUND_SPAWN_WAVE, player, "" ); // Launch another attack. int attackPeriod = getIntObjVar( self, "attackPeriod" ); messageTo( self, "launchAttack", null, attackPeriod, false ); return SCRIPT_CONTINUE; } //------------------------------------------------ // targetDestroyed //------------------------------------------------ messageHandler targetDestroyed() { if ( params == null ) return SCRIPT_OVERRIDE; obj_id ship = getObjIdObjVar( self, "ship" ); obj_id player = getObjIdObjVar( self, space_quest.QUEST_OWNER ); string questName = getStringObjVar( self, space_quest.QUEST_NAME ); string questType = getStringObjVar( self, space_quest.QUEST_TYPE ); obj_id deadship = params.getObjId( "ship" ); obj_id targets[] = getObjIdArrayObjVar( self, "targets" ); int deadships = getIntObjVar( self, "deadships" ); boolean launchWave = false; for ( int i=0; i