//------------------------------------------------ // survival.script // Brandon Reinhart //------------------------------------------------ //------------------------------------------------ // Includes //------------------------------------------------ include library.space_create; include library.space_quest; include library.space_utils; include library.space_crafting; include library.space_transition; include library.utils; include library.ship_ai; include library.prose; //------------------------------------------------ // Constants //------------------------------------------------ const string_id SID_TARGETS_REMAINING = new string_id( "space/quest", "destroy_duty_targets_remaining" ); const string_id SID_ABANDONED_SURVIVAL = new string_id( "space/quest", "survival_abandoned" ); const string SOUND_SPAWN_WAVE = "clienteffect/ui_quest_spawn_wave.cef"; const string SOUND_DESTROYED_WAVE = "clienteffect/ui_quest_destroyed_wave.cef"; /* - Player enters the zone. - Gets waypoint to location. - Begins to receive transmission...cannot hyperspace during this time. (It results in failure.) - Enemies attack in waves while the transmission is received. - Transmission ends, player can hyperspace. */ //------------------------------------------------ // 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; } // Get the transmission point. setObjVar( self, "transPoint", questInfo.getString("transmissionPoint") ); // Get the mission timers. setObjVar( self, "totalTransTime", questInfo.getInt("totalTransmissionTime") ); setObjVar( self, "transStart", questInfo.getInt("transmissionStartDelay") ); setObjVar( self, "delayToAttack", questInfo.getInt("delayToFirstAttack") ); setObjVar( self, "numUpdates", questInfo.getInt("timesToUpdateProgress") ); // Get attack info. int numAttackShipLists = questInfo.getInt( "numAttackShipLists" ); setObjVar( self, "numAttackShipLists", numAttackShipLists ); for ( int i=0; i 2000.f ) ok = false; if ( hasObjVar( self, "outofrange" ) ) { if ( ok ) removeObjVar( self, "outofrange" ); else { // We are still out of range. We failed. string_id rangemsg = new string_id( "spacequest/"+questType+"/"+questName, "outofrange_failed" ); space_quest.sendQuestMessage( player, rangemsg ); questFailed( self ); } } else { if ( !ok ) { // We are out of range. Warn the player. string_id rangemsg = new string_id( "spacequest/"+questType+"/"+questName, "outofrange" ); space_quest.sendQuestMessage( player, rangemsg ); setObjVar( self, "outofrange", 1 ); } } // Validate again. messageTo( self, "validateDistance", null, 30.f, false ); return SCRIPT_CONTINUE; } //------------------------------------------------ // clearMissionWaypoint //------------------------------------------------ void clearMissionWaypoint( obj_id self ) { obj_id player = getObjIdObjVar( self, space_quest.QUEST_OWNER ); obj_id waypoint = getObjIdObjVar( self, "survival_waypoint" ); if ( isIdValid(waypoint) ) destroyWaypointInDatapad( waypoint, player ); removeObjVar( self, "survival_waypoint" ); // Unregister the arrive trigger. dictionary params = new dictionary(); string loc = getStringObjVar( self, "loc" ); if ( loc != null ) removeLocationTarget(player, loc); } //------------------------------------------------ // questCompleted //------------------------------------------------ void questCompleted( obj_id self ) { // Clear the mission waypoint. clearMissionWaypoint( self ); // We finished the quest! obj_id player = getObjIdObjVar( self, space_quest.QUEST_OWNER ); space_quest.setQuestWon( player, self ); } //------------------------------------------------ // questFailed //------------------------------------------------ void questFailed( obj_id self ) { // Clear the mission waypoint. clearMissionWaypoint( self ); // We finished the quest! obj_id player = getObjIdObjVar( self, space_quest.QUEST_OWNER ); space_quest.setQuestFailed( player, self ); } //------------------------------------------------ // questAborted //------------------------------------------------ void questAborted( obj_id self ) { // Clear the mission waypoint. clearMissionWaypoint( self ); // We finished the quest! obj_id player = getObjIdObjVar( self, space_quest.QUEST_OWNER ); space_quest.setQuestAborted( 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 ); space_quest._removeQuest( player, self ); return SCRIPT_CONTINUE; } //------------------------------------------------ // abortMission //------------------------------------------------ messageHandler abortMission() { if ( hasObjVar( self, "noAbort" ) ) return SCRIPT_CONTINUE; questAborted( self ); return SCRIPT_CONTINUE; } //------------------------------------------------ // 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 ); } //------------------------------------------------ // launchFirstAttack //------------------------------------------------ messageHandler launchFirstAttack() { // Notify the player. string questName = getStringObjVar( self, space_quest.QUEST_NAME ); string questType = getStringObjVar( self, space_quest.QUEST_TYPE ); string_id foundLocation = new string_id( "spacequest/"+questType+"/"+questName, "first_attack" ); questUpdate( self, foundLocation ); // Launch the attack. messageTo( self, "launchAttack", null, 5, false ); return SCRIPT_CONTINUE; } //------------------------------------------------ // 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" ); // Use attack lists incrementally. 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 ); obj_id playership = space_transition.getContainingShip(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; } setObjVar( self, "targets", targets ); // Record this wave count. setObjVar( self, "wave"+wavenum, count ); // Set a formation. if ( count > 3 ) ship_ai.squadSetFormationRandom( squad ); // 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, "target" ); 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