------------------------------------------------------------------------------
-- Dark Star One (TM) - Mission Script
-- Copyright (C) [SNF]Norbert
-- All Rights Reserved.
------------------------------[ Info ]----------------------------------------
-- Author: [SNF]Norbert
-- Version: 1.6
-- Name: PASSIV_053
------------------------------[ Description ]---------------------------------
-- Zufallsmission im All: "Geheimdienstwaffen-Transport"
-- Ein überaus schwer gepanzerter Spezialfrachter mit Geheimdienstwaffen fliegt
-- ins System ein und liefert die Waffen in der Handelsstation ab. Der Frachter
-- wird am Sprungtor von einem großen Kreuzer erwartet, der ihn eskortiert und
-- beschützt. Weiterhin wird er noch von zwei Bossjägern als Eskorte begleitet.
-- Der Spieler kann versuchen, die Waffen zu erbeuten, was allerdings ziemlich
-- schwer sein dürfte und ihm außerdem Kriminalitätspunkte einträgt (Terrorist).
--
-- Diese Mission läuft relativ selten. Wenn sie erzeugt wird, dann wird noch
-- zufällig ausgewählt, ob sie kurz nach dem Sprung des Spielers in ein System
-- startet oder erst nach dem Verlassen eines Hangars (Handels- und F-Stationen,
-- Asteroiden und Kreuzer).
------------------------------[ Notes ]---------------------------------------
-- Skript im Quellcode als kleines Weihnachtsgeschenk 2011 für die DSO-Fans.
--
-- MTYPE_SPACE wird viel zu selten erzeugt, daher in MTYPE_ALWAYS mit variablem
-- Timeout geändert.
------------------------------[ Import ]--------------------------------------
source "lua/mission/MissionLib.lua" -- Verschiedene Hilfsfunktionen
--source "lua/mission/Tools.lua" -- Debug-Funktionen
------------------------------[ Register ]------------------------------------
NScript.Register( {
Name = "PASSIV_053",
Group = 0,
Type = MTYPE_ALWAYS,
Transitions = {
------------------------------[ Transitions ]---------------------------------
------------------------------[ Initialization / Destruction ]----------------
{ -- Missionsstart prüfen
nil, nil, "Init", function( V, Data )
if lua.type( PS_053 ) ~= "number" or PS_053 ~= 0 then
local level = MissionLib.GetPlayerLevel()
if level > 4 then
local system = MissionLib.GetStarSystemId()
if system < 400 then
V.SystemId = system
V.PlayerLevel = level
return { Ready = true }
end
end
end
-- Mission nicht erzeugen, wenn die Option PS_053 gleich Null oder keine Handelsstation da ist
return { Ready = false }
end },
{ -- Mission wird erzeugt
nil, nil, "Create", function( V, Data )
-- NGUI.ShowInfoText( { Text = "ID_MISSION_PS", Replace = { "ID_53" } } )
-- Rasse des Systems
V.Race = MissionLib.GetStarSystemNation( V.SystemId )
-- Variablen für Funkmeldungen
local nation = { [0]="hum", [1]="mor", [2]="rap", [3]="oct", [4]="arr", [5]="thu" }
local number = MissionLib.RandomBit()
local race = nation[V.Race]
local RACE = string.toupper( race )
V.Text = "IDR_STATION_LANDING_DENIED_"..RACE.."_00"
V.Voice = "VOICE."..V.Text.."_SPOKEN_"..race.."sta0"..number
if V.Race == RACE_HUMAN then
V.Video = "video/radio/radio_"..race.."sta0"..number..".bik"
else
V.Video = "video/radio/radio_"..race.."mil0"..number..".bik"
end
-- 1:1 Wahrscheinlichkeit für eine der beiden Variationen
if math.random() > 0.5 then
-- Mission startet mit zufälliger Verzögerung, wenn der Spieler das System betritt
V.Step = 1.1
else
-- Mission startet, wenn der Spieler einen Hangar verlässt
V.Step = 1.2
end
end },
{ -- Mission wird zerstört
nil, nil, "Destroy", function( V, Data )
end },
------------------------------[ Mandatory callbacks ]-------------------------
{ -- Subtype festlegen
nil, nil, "Subtype", function( V, Data )
return { Subtype = SUBTYPE_TRANSPORT }
end },
{ -- Mission startet
nil, nil, "MissionStart", function( V, Data )
-- Tools.UpdateStatistic( "PS_053" )
end },
{ -- Keinen Missionstext liefern
nil, nil, "Text", function( V, Data )
return { Text = "" }
end },
------------------------------[ Mission success / failure ]-------------------
{ -- Mission erfolgreich
1, nil, "Achieved", function( V, Data )
return { Timeout = 80, Text = "" }
end },
{ -- Erst alles zerstören
1, nil, "Failed", function( V, Data )
local time = lua.tonumber( V.Step )
if time > 2 then
time = MissionLib.RandomInteger( 15, 150 )
end
return { Timeout = time, Text = "" }
end },
------------------------------[ Custom mission steps ]------------------------
{ -- Spieler betritt ein System, Mission startet mit zufälliger Verzögerung
1.1, 1.1, "System", function( V, Data )
if Data.State == ENTER_POSTCAM then
-- 5-30 Sekunden Verzögerung für den Systemeintritt der Vorhut
local randomTime = MissionLib.RandomInteger( 5, 30 )
V.StartTimer = NMission.CreateTimer( { Time = randomTime } ).Timer
end
end },
{ -- Spieler verlässt den Hangar, Mission startet, sobald die Kamera zu Ende ist
1.2, 1.2, "Station", function( V, Data )
if not Data.Enter then
V.ActionCam = 1
end
end },
{ -- Kamera der Station ist zu Ende, los gehts
1.2, 1.2, "ActionCamEnd", function( V, Data )
if V.ActionCam then
V.ActionCam = nil
V.StartTimer = NMission.CreateTimer( { Time = 1.0 } ).Timer
end
end },
{ -- Ein großer Kreuzer kommt oberhalb des Sprungtors als Vorhut aus dem Hyperraum
1.1, 1.2, "Timer", function( V, Data )
if Data.Timer == V.StartTimer then
V.StartTimer = nil
local cruiserwing = NWing.Create( {
WingType = WINGTYPE_CRUISER1, -- großer Kreuzer
Race = V.Race, -- Rasse des Systems
Level = V.PlayerLevel + 2, -- erhöhte Kampfkraft
Number = 1, -- ein einzelner Kreuzer
PosType = POSDESCR_CRUISER_ENTRY, -- ins System springen und abbremsen
Position = { 0, 500, 9000 }, -- 1 Unit vor und 0.5u über dem Sprungtor
FrontDir = { 0, 0, -1 } -- auf Handelsstation ausgerichtet
} ).Wing
V.CruiserWing = cruiserwing
V.Cruiser = MissionLib.GetWingLeader( cruiserwing )
-- Der Kreuzer soll warten
MissionLib.WingAiActionWarten( cruiserwing )
-- Gruppe erzeugen und Kreuzerwing hinzufügen
V.Groups = NGroupAi.Create({})
NGroupAi.AddWings( { Group = V.Groups.GroupA, WingList = { cruiserwing } } )
-- Der Spezialfrachter kommt 3 Sekunden später
V.FreighterTimer = NMission.CreateTimer( { Time = 3 } ).Timer
V.Step = 2
end
end },
{ -- Landeverbot auf dem Kreuzer für den Spieler
2, nil, "Communication", function( V, Data )
if Data.Object == V.Cruiser then
NObject.PlayerLanding( { Object = V.Cruiser, Accept = 0 } )
NComm.AddMessage( {
Text = V.Text,
Voice = V.Voice,
Sender = V.Cruiser,
CommInOut = true
} )
return { Object = V.Cruiser, BlockDlg = true }
end
return {}
end },
{ -- Der Frachter kommt mit kleiner aber starker Eskorte aus dem Sprungtor
2, 2, "Timer", function( V, Data )
if Data.Timer == V.FreighterTimer then
V.FreighterTimer = nil
-- Ein Frachter der Rasse des Systems für 4 Geheimdienstwaffen-Container
local shiptype = {
[0] = SI_BOMBER_B4_HUMAN;
SI_BOMBER_B4_MORTOK,
SI_BOMBER_B4_RAPTOR,
SI_BOMBER_B4_OCTO,
SI_BOMBER_B4_ARRACK,
SI_BOMBER_B4_THUL
}
local freighter = shiptype[V.Race]
local hunter2 = MissionLib.RandomInteger( SI_HUNTER_HUMAN, SI_HUNTER2_HUMAN )
-- Frachter mit Geleitschutz erzeugen
local wing = NWing.Define( {
WingType = WINGTYPE_FREIGHTER200T, --< wenn angegeben, ist die Handelslogik aktiv
Ships = {
{ ObjType = ST_TRADERSHIP, ObjIndex = freighter, LevelOffset = 1 },
{ ObjType = ST_WINGMAN, ObjIndex = V.Race }, -- Hunter1, Rasse des Systems
{ ObjType = ST_WINGMAN, ObjIndex = hunter2 } -- Hunter2, zufällige Rasse
},
PosType = POSDESCR_HYPERSPACE
} ).Wing
-- Tabelle mit den Handles der einzelnen Schiffe
local shiplist = NWing.List( { Wing = wing } ).ShipList
-- Der Frachter selber ist Chef vom Wing, die beiden Jäger haben Bossstatus
freighter = shiplist[1]
NShip.SetBoss( { Ship = shiplist[2], BossId = 1 } )
NShip.SetBoss( { Ship = shiplist[3], BossId = 1 } )
-- Stärkere Panzerung und Schilde für den Frachter, Schildaufladung beschleunigen
NShip.SetDurability( { Ship = freighter, Hull = 3.0, Shield = 3.0 } )
NShip.SetRecharge( { Ship = freighter, ShieldSecs = 60.0 } )
-- Angriff vom Spieler auf den Frachter ist strafbar
NShip.SetCrime( { Ship = freighter, Set = true } )
-- Farbe: Militär (blau)
for i, ship in shiplist do
NObject.RadarMapColor( { Object = ship, Color = RADARMAP_SHIP_OFFICIAL } )
end
-- Mit Geheimdienstwaffen beladen
for i = 1, NShip.GetNumCargoBays( { Ship = freighter } ).NumCargoBays do
local weapon = NContainer.Create( {
Type = CONTAINER_SHIP, Size = CONTAINER_SPECIAL, Ship = freighter
} ).Container
NContainer.SetUniqueItems( { Container = weapon, Number = 1 } )
NContainer.Equip( { Container = weapon, Goods = "IDL_WEAPON_04" } )
end
-- Frachterwing in die Gruppe
NGroupAi.AddWings( { Group = V.Groups.GroupA, WingList = { wing } } )
-- Handle der Handelsstation
V.TradeStation = MissionLib.GetSystemTradeStation()
-- Wegpunkt an der Handelsstation für den Frachter
V.WP = NWaypoint.Create( {
Object = V.TradeStation,
Radius = MissionLib.GetOrbiterRadius( V.TradeStation ),
Wing = wing
} ).Waypoint
-- Wing und Leader in die skriptglobale V-Tabelle
V.FreighterWing = wing
V.Freighter = freighter
end
end },
{ -- Frachter ist im System eingetroffen
2, 2, "Wing", function( V, Data )
if Data.Event == WING_ENTER_SYSTEM and Data.Wing == V.FreighterWing then
-- Mit 50% Tempo zur Handelsstation fliegen, damit der Kreuzer mithalten kann
NWing.AddAction( {
Wing = V.FreighterWing,
List = LIST_ACTIVE,
First = 1,
Actions = {
{ Type = AI_ACTION_OBJECT2, Speed = 2.0, Handle = V.TradeStation },
{ Type = AI_ACTION_STANDARD }
}
} )
-- Kreuzer soll den Frachter beschützen
MissionLib.WingAiActionFollowShip( V.CruiserWing, V.Freighter )
V.Step = 3
end
end },
{ -- Spieler greift den Frachter an, alle werden feindlich
3, 3, "Hostile", function( V, Data )
if Data.Enemy == V.FreighterWing then
-- Kreuzer: "Sie behindern eine militärische Aktion, damit machen Sie sich strafbar!"
NComm.AddMessage( {
Text = "IDM_GLOBALSPACE_037_RADIO_MILITARY_001",
Voice = "IDM_GLOBALSPACE_037_RADIO_MILITARY_001_SPOKEN",
Video = V.Video,
Sender = V.Cruiser,
CommInOut = true
} )
NGroupAi.SetPlayerHostile( { Group = V.Groups.GroupA } )
MissionLib.RadarMapColor( { Wing = V.FreighterWing, Color = RADARMAP_SHIP_HOSTILE_WING } )
V.AttackTimer = NMission.CreateTimer( { Time = 0.1 } ).Timer
end
end },
{ -- Kreuzer startet zusätzliche Militärjäger zur Abwehr
3, 3, "Timer", function( V, Data )
if Data.Timer == V.AttackTimer then
V.AttackTimer = nil
if V.Cruiser then
V.MilitaryWing = NWing.Create( {
WingType = WINGTYPE_MILITARY,
Number = 10,
Race = V.Race,
PosType = POSDESCR_HANGAR,
Object = V.Cruiser
} ).Wing
-- Wing in die Gruppe, sonst kann er versehentlich den Frachterwing angreifen
NGroupAi.AddWings( { Group = V.Groups.GroupA, WingList = { V.MilitaryWing } } )
MissionLib.WingAiActionAngriffPlayer( V.MilitaryWing )
end
end
end },
{ -- Frachter ist schwer beschädigt und versucht zu flüchten
3, 3, "StarShip", function( V, Data )
if Data.Ship == V.Freighter and Data.Event == SHIP_HULL_10 and not V.HeavyDamage then
V.HeavyDamage = true
-- Frachter verlässt den Wing,...
V.RefugeeWing = MissionLib.LeaveWing( V.Freighter, WINGTYPE_FREIGHTER200T )
-- versucht zu flüchten...
NWing.NoEnemy( { Wing = V.RefugeeWing } )
MissionLib.WingAiActionHyperJump( V.RefugeeWing )
-- und verliert dabei seine Container
NShip.DumpCargo( { Ship = V.Freighter } )
-- Neuer Befehl für den Kreuzer, damit er nicht verschwindet
MissionLib.WingAiActionAngriffPlayer( V.CruiserWing )
end
end },
{ -- Den Kreuzer oder Frachter zerlegt es gerade
3, 3, "StarshipDeath", function( V, Data )
if Data.Ship == V.Cruiser then
V.Cruiser = nil
elseif Data.Ship == V.Freighter then
V.Freighter = nil
end
end },
{ -- Ein Wing wurde zerstört oder hat das System verlassen
3, 3, "Wing", function( V, Data )
if Data.Event == WING_DESTROYED then
local wing = Data.Wing
-- Frachterwing (Geleitschutz)
if wing == V.FreighterWing then
V.FreighterWing = nil
-- Kreuzer
elseif wing == V.CruiserWing then
V.CruiserWing = nil
-- Den Frachter gibt es auch nicht mehr, Mission zu Ende
if not V.Freighter then
NMission.SetState( { State = MSTATE_FAILED } )
end
-- Militär wurde zerstört, neue Gruppe starten
elseif wing == V.MilitaryWing then
V.MilitaryWing = nil
V.AttackTimer = NMission.CreateTimer( { Time = 5.0 } ).Timer
-- Flüchtender Frachter
elseif wing == V.RefugeeWing then
V.RefugeeWing = nil
V.Freighter = nil
-- Den Kreuzer gibt es auch nicht mehr, Mission zu Ende
if not V.Cruiser then
NMission.SetState( { State = MSTATE_FAILED } )
end
end
elseif Data.Event == WING_LEAVE_SYSTEM and Data.Wing == V.FreighterWing and V.CruiserWing then
-- Frachter hat das System normal verlassen und Kreuzer ist noch da (WP hat nicht getriggert)
local player = MissionLib.GetPlayerShip()
if not NWing.IsHostileShip( { Wing = V.CruiserWing, Ship = player } ).IsEnemy then
MissionLib.WingAiActionHyperJump( V.CruiserWing )
end
end
end },
{ -- Frachter dockt an der Handelsstation an, Mission zu Ende
3, 3, "Waypoint", function( V, Data )
if Data.Waypoint == V.WP and Data.Ship == V.Freighter then
-- Frachter wirft seine Container nicht mehr ab
NShip.ProtectCargo( { Ship = V.Freighter, Protect = true } )
MissionLib.RadarMapColor( { Wing = V.FreighterWing, Color = RADARMAP_INVALID } )
-- Kreuzer springt aus dem System raus
MissionLib.WingAiActionHyperJump( V.CruiserWing )
NMission.SetState( { State = MSTATE_FAILED } )
end
end },
{ -- Spieler verlässt das System, Mission zu Ende
1, nil, "System", function( V, Data )
if Data.State == LEAVE_SYSTEM then
NMission.SetState( { State = MSTATE_FAILED } )
end
end },
} -- close transition table
} -- close parameter table of NScript.Register()
) -- close function call to NScript.Register()