package script.space.quest_logic; import script.*; import script.base_class.*; import script.combat_engine.*; import java.util.Arrays; import java.util.Hashtable; import java.util.Vector; import script.base_script; import script.library.space_create; import script.library.space_quest; import script.library.space_utils; import script.library.space_transition; import script.library.utils; import script.library.ship_ai; import script.library.prose; import script.library.money; public class assassinate extends script.space.quest_logic.recovery { public assassinate() { } public static final String SOUND_SPAWN_ENEMY = "clienteffect/ui_quest_spawn_enemy.cef"; public static final String SOUND_DESTROYED_ALL = "clienteffect/ui_quest_destroyed_all.cef"; public static final string_id WARPOUT_FAILURE = new string_id( "space/quest", "warpout_failure"); public int OnAttach(obj_id self) throws InterruptedException { 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)) { return SCRIPT_OVERRIDE; } String qTable = "datatables/spacequest/"+questType+"/"+questName+".iff"; dictionary questInfo = dataTableGetRow( qTable, 0 ); if (questInfo == null) { sendSystemMessageTestingOnly( player, "Debug: Failed to open quest table "+qTable ); return SCRIPT_OVERRIDE; } setObjVar( self, "targetArrivalDelay", questInfo.getInt("targetArrivalDelay") ); String targetShip = questInfo.getString("targetShipType"); if (targetShip != null) { setObjVar( self, "targetShipType", targetShip ); } String[] escortShips = dataTableGetStringColumn( qTable, "targetEscort"); space_quest.cleanArray( self, "escortShips", escortShips ); setObjVar( self, "mustDestroyEscort", questInfo.getInt( "mustDestroyEscort") ); setObjVar( self, "targetAttackMode", questInfo.getInt("targetAttackMode") ); setObjVar( self, "numResponses", questInfo.getInt( "numResponses") ); String[] escortPath = dataTableGetStringColumn( qTable, "escortPath"); space_quest.cleanArray( self, "escortPath", escortPath ); String questZone = getStringObjVar( self, space_quest.QUEST_ZONE ); if (getCurrentSceneName().startsWith( questZone )) { dictionary outparams = new dictionary(); outparams.put( "player", player ); messageTo( self, "initializedQuestPlayer", outparams, 1.f, false ); } int questid = questGetQuestId( "spacequest/"+questType+"/"+questName ); if (questid != 0) { questActivateTask( questid, 0, player ); if (questInfo.getInt( "mustDestroyEscort" ) == 1) { questActivateTask( questid, 2, player ); } setObjVar( self, "taskId", 1 ); questActivateTask( questid, 1, player ); } return SCRIPT_OVERRIDE; } public int warpInTarget(obj_id self, dictionary params) throws InterruptedException { obj_id player = getObjIdObjVar( self, space_quest.QUEST_OWNER ); String questZone = getStringObjVar( self, space_quest.QUEST_ZONE ); if (!getCurrentSceneName().startsWith( questZone )) { return SCRIPT_OVERRIDE; } int targetAttackMode = getIntObjVar( self, "targetAttackMode"); obj_id ship = createTargetShip( self ); ship_ai.unitSetLeashDistance( ship, 16000 ); setObjVar( self, "target", ship ); setLookAtTarget( player, ship ); setObjVar( ship, "quest", self ); attachScript( ship, "space.quest_logic.assassinate_target"); switch( targetAttackMode ) { case 0: ship_ai.unitSetAttackOrders( ship, ship_ai.ATTACK_ORDERS_RETURN_FIRE ); break; case 1: ship_ai.unitSetAttackOrders( ship, ship_ai.ATTACK_ORDERS_ATTACK_FREELY ); break; case 2: ship_ai.unitSetAttackOrders( ship, ship_ai.ATTACK_ORDERS_HOLD_FIRE ); break; } space_quest._addMissionCriticalShip( player, self, ship ); playClientEffectObj( player, SOUND_SPAWN_ENEMY, player, ""); setObjVar( ship, "objMissionOwner", player ); ship_ai.unitAddExclusiveAggro( ship, player ); messageTo( self, "updateTargetWaypoint", null, 1.f, false ); transform[] translist = getPathTransforms( self, true ); ship_ai.unitAddPatrolPath( ship, translist ); dictionary outparams = new dictionary(); outparams.put( "quest", self ); outparams.put( "loc", getLocationObjVar( self, "last_loc") ); outparams.put( "player", player ); outparams.put( "dest", "escape"); messageTo( ship, "registerDestination", outparams, 1.f, false ); String[] shipTypes = getStringArrayObjVar( self, "escortShips"); if (shipTypes != null) { int escortSquad = ship_ai.squadCreateSquadId(); obj_id[] escorts = new obj_id[shipTypes.length]; for (int i=0; i 0) { ship_ai.squadFollow( escortSquad, ship, new vector(0,0,1), 10 ); ship_ai.squadSetGuardTarget( escortSquad, ship_ai.unitGetSquadId(ship) ); switch( targetAttackMode ) { case 0: ship_ai.squadSetAttackOrders( escortSquad, ship_ai.ATTACK_ORDERS_RETURN_FIRE ); break; case 1: ship_ai.squadSetAttackOrders( escortSquad, ship_ai.ATTACK_ORDERS_ATTACK_FREELY ); break; case 2: ship_ai.squadSetAttackOrders( escortSquad, ship_ai.ATTACK_ORDERS_HOLD_FIRE ); break; } } } String questName = getStringObjVar( self, space_quest.QUEST_NAME ); String questType = getStringObjVar( self, space_quest.QUEST_TYPE ); string_id status_update = new string_id( "spacequest/"+questType+"/"+questName, "arrival_phase_2"); questUpdate( self, status_update ); return SCRIPT_OVERRIDE; } public int assassinateSuccess(obj_id self, dictionary params) throws InterruptedException { if (params == null) { return SCRIPT_CONTINUE; } 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 ); obj_id ship = params.getObjId( "ship"); int mustDestroyEscort = getIntObjVar( self, "mustDestroyEscort"); int escortDestroyed = getIntObjVar( self, "escortDestroyed"); int questid = questGetQuestId( "spacequest/"+questType+"/"+questName ); if ((questid != 0) && questIsTaskActive( questid, 1, player )) { questCompleteTask( questid, 1, player ); } if ((mustDestroyEscort == 1) && (escortDestroyed == 0)) { string_id update = new string_id( "spacequest/"+questType+"/"+questName, "destroy_escort"); questUpdate( self, update ); setObjVar( self, "targetDestroyed", 1 ); } else if ((mustDestroyEscort == 0) || ((mustDestroyEscort == 1) && (escortDestroyed == 1))) { if (questid != 0 && questIsQuestActive( questid, player )) { questCompleteQuest( questid, player ); } string_id update = new string_id( "spacequest/"+questType+"/"+questName, "assassinate_success"); questUpdate( self, update ); messageTo( self, "completeQuestMsg", null, 2.f, false ); } return SCRIPT_CONTINUE; } public int targetEscaped(obj_id self, dictionary params) throws InterruptedException { if (params == null) { return SCRIPT_CONTINUE; } 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 ); obj_id ship = params.getObjId( "target"); string_id status_update = new string_id( "spacequest/"+questType+"/"+questName, "failed_escape"); questUpdate( self, status_update ); cleanupShips( self ); questFailed( self ); return SCRIPT_CONTINUE; } public int handleShipDestroyed(obj_id self, dictionary params) throws InterruptedException { if (params == null) { return SCRIPT_OVERRIDE; } 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 ); obj_id destroyed = params.getObjId( "ship"); obj_id[] escorts = getObjIdArrayObjVar( self, "escorts"); int dead_escorts = getIntObjVar( self, "dead_escorts"); int mustDestroyEscort = getIntObjVar( self, "mustDestroyEscort"); int targetDestroyed = getIntObjVar( self, "targetDestroyed"); if (escorts == null) { return SCRIPT_OVERRIDE; } for (int i=0; i