Jump to content

rejenorst

Member
  • Content Count

    427
  • Joined

  • Last visited

  • Medals

Community Reputation

18 Good

4 Followers

About rejenorst

  • Rank
    Gunnery Sergeant

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

  1. rejenorst

    [SP] Road To Pyrgos

    STEAM LINK https://steamcommunity.com/sharedfiles/filedetails/?id=2038618881 Mission name is a bit misleading as it doesn't take place in or near Pyrgos but plays on the whole Operation Steel Pegasus theme of busting a move towards Pyrgos. Your play as part of a US Marine Corp Platoon who do an amphibious assault on low draft Riverine craft to secure a beachhead for potential supply or withdrawal operations only to find yourself dragged inland a bit deeper. Mission is voice acted and has some of my music in it. Uses some assets from Jets and Marksman. You do not control a squad. Your are led by an AI Squad leader. At least one of your squad mates must survive. Localized stringtable includes English and German. Please message me if you would like to translate to another language. Open only if you prefer spoilers and don't like surprises (No plot surprises as there isn't much of a story just scripts and what the mission is broken up into): Let me know if the music is too loud or if the levels in the music are off and if you run into any problems. Thank you!
  2. rejenorst

    Group Board Convoy Script

    Fixed a flaw in script that would result in only one vehicle being checked rather than all the vehicles in array. EDIT: *FIXED 17/12/2016 - Problem with unit excluding itself from the assigned cargo list. This could result in unit not finding an available position. This should be fixed now and seems to work better in my test.
  3. rejenorst

    Group Board Convoy Script

    Fixed a variable inconsistency in script that would result in script not working. Apologies for that.
  4. This script is intended to be used if you want a group to board in cargo positions only in a convoy that has another group assigned as drivers. It will assign each unit where there is room and will calculate how many units have already been assigned to a particular vehicle vs the cargo spaces available (for own group only. If another group is assigned to cargo and in the process of boarding this will not work correctly). If you're looking for units to command vehicles in a convoy your best off using addvehicle command. This is just for assigning units to cargo of vehicles driven by other groups. There are likely way better more efficient scripts out there and this one still needs more testing. INPUT: _hasBoarded = [_group,_assignedVehicles] call rej_fnc_assignCargo; _group = the group you want to assign to cargo. _assignedVehicles = An array of vehicles you want group to board. Return Value Example: 0: Boolean. True if all alive units have boarded. Will return false if units are still in the process of boarding. 1: Boolean: True if there wasn't enough cargo spaces for all units. Meaning boarding has failed and should not be continued,You may need to unassignVehicle any units that have boarded. 2: Number of alive units counted 3: Number of boarded units counted. 2 and 3 should be equal if 0 == true. 0 should be false if 1 is true. Script: //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //-- This Script Will Check For Available Cargo Positions In One Or More Vehicles Within An Array And Assign Units Not Currently In The Vehicle To Get In Cargo --// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// _targetGroup = _this select 0; _vehicles = _this select 1; _vehicleCount = (count _vehicles) - 1; copytoclipboard str(_targetGroup); _units = units _targetGroup; _aliveUnits = 0; _boardedUnits = 0; _returnVar = [false,false,_aliveUnits,_boardedUnits]; _unitCount = (count _units) - 1; if (_unitCount >= 0) then { for [{_a = 0},{(_a <= _unitCount)},{_a = _a + 1}] do { _unit = _units select _a; if (lifeState _unit find "DEAD" < 0) then { _aliveUnits = _aliveUnits + 1; if ((not (vehicle _unit in _vehicles)) && (currentCommand _unit != "GET IN")) then { if (_vehicleCount >= 0) then { _vehiclePositionFound = false; for [{_b = 0},{(_b <= _vehicleCount) && (!_vehiclePositionFound)},{_b = _b + 1}] do { _vehicle = _vehicles select _b; _emptyPositions = _vehicle emptyPositions "CARGO"; _alreadyAssignedCargoPositions = 0; {if ((_unit != _x) && (assignedVehicle _x == _vehicle) && (vehicle _x != _vehicle)) then {_alreadyAssignedCargoPositions = _alreadyAssignedCargoPositions + 1};} forEach _units; if (_emptyPositions - _alreadyAssignedCargoPositions > 0) then { _unit assignAsCargo _vehicle; [_unit] orderGetIn true; _vehiclePositionFound = true; }; }; _b = nil; if (!_vehiclePositionFound) then { _returnVar set [1,true]; }; }; } else { if (vehicle _unit in _vehicles) then { _boardedUnits = _boardedUnits + 1; }; }; }; }; _a = nil; if (_boardedUnits == _aliveUnits) then { _returnVar set [0,true]; _returnVar set [2,_aliveUnits]; _returnVar set [3,_boardedUnits]; }; }; _returnVar Put this in init.sqf: rej_fnc_assignCargo = compile preProcessFileLineNumbers "rej_commandscript\functions\rej_fnc_assigncargo.sqf"; To Check if group has boarded (can be used in a loop to check progress of boarding): _hasBoarded = [_group,_assignedVehicles] call rej_fnc_assignCargo; if ((_hasBoarded select 0) && (not (_hasBoarded select 1))) then { //-- Boarding completed --// } else { if (_hasBoarded select 1) then { //-- Boarding has failed --// }; };
  5. rejenorst

    Rejenorst's unit spawn script

    22/08/2016 Interchanged the command used for adding uniforms. Have replaced it with forceAddUniform so that you can add enemy uniforms as well. EDIT: Also fixed handgun not removing properly if using ["WEAPH",""] or adding new handgun.
  6. rejenorst

    Rejenorst's unit spawn script

    UPDATE 19.08.2016: Have updated script so that if primary weapon is replaced then unit will select primary weapon and if units need to reload after script launch they will reload all their weapons. Also tested with a moveincargo comand shortly after and still seems to reload weapon though you may hear a reload noise. An example of adding a weapon, optic for primary gun and magazines to player (group is left grpNull since your not spawning a unit): [grpNull,player,[["WEAPP","arifle_SPAR_01_blk_F"],["ATTP","optic_Aco"],["MAG","30Rnd_556x45_Stanag",6]]] call rej_fnc_spawnUnit;
  7. This is just a quick script I am currently using to either spawn units with specific equipment changes or to change the equipment of an existing unit. There are better scripts out there that are likely much more efficient but thought I'd upload it for anyone wanting it. The script still needs testing. If you have any problems with it, please post the inputs and I'll try and replicate then fix he problem. UPDATE 19.08.2016: Have updated script so that if primary weapon is replaced then unit will select primary weapon and if units need to reload after script launch they will reload all their weapons. Input arguements: 0: group (if planning on spawning units otherwise set as grpNull or anything as it is only used in spawning) 1: existing unit or spawn array eg: ["B_Soldier_SL_F",_startPos,[],_placementRadius,"FORM"] 2: Items array eg: [["HEAD","H_Watchcap_blk"]]. The first string is the reference string so my script knows which code to execute and the second is the classname. In some cases if class name is left "" it will just remove the current item type. 3: Optional Boolean either true or false (True by default). Determines whether inventory is automatically transferred from old to newly spawned vest/uniform/backpack. To change the appearance of a unit only; you can do this: (adds a cap to head, a silencer to primary weapon and a vest the items of which will be automatically transferred to the new vest. Can be turned off): [grpNull,player,[["HEAD","H_Watchcap_blk"],["ATTP","muzzle_snds_H"],["VEST","V_PlateCarrier1_rgr"]]] call rej_fnc_spawnUnit; You can either use it as a function by placing this in the init (Make sure you change the sqf name appropriately): ///////////////////////// //-- Spawn functions --// ///////////////////////// rej_fnc_spawnUnit = compile preProcessFileLineNumbers "rej_spawnunit.sqf"; Spawning a group with SF helmet, specific vests and no goggles with a placement radius of 25 meters and Sergeant and two Corporal ranks: //////////////////////// //-- Create group 1 --// //////////////////////// _group = createGroup WEST; _groupType = [ [_group,["B_Soldier_SL_F",_startPos,[],25,"FORM"],[["ATTP","muzzle_snds_H"],["HEAD","H_HelmetSpecB"],["VEST","V_PlateCarrier1_rgr"],["GOOGLES",""],["RANK","SERGEANT"]]], [_group,["B_Soldier_TL_F",_startPos,[],25,"FORM"],[["ATTP","muzzle_snds_H"],["HEAD","H_HelmetSpecB"],["VEST","V_PlateCarrier1_rgr"],["GOOGLES",""],["RANK","CORPORAL"]]], [_group,["B_soldier_LAT_F",_startPos,[],25,"FORM"],[["ATTP","muzzle_snds_H"],["HEAD","H_HelmetSpecB"],["VEST","V_PlateCarrier1_rgr"],["GOOGLES",""],["RANK","CORPORAL"]]], [_group,["B_soldier_M_F",_startPos,[],25,"FORM"],[["ATTP","muzzle_snds_H"],["HEAD","H_HelmetSpecB"],["VEST","V_PlateCarrier1_rgr"],["GOOGLES",""]]], [_group,["B_medic_F",_startPos,[],25,"FORM"],[["ATTP","muzzle_snds_H"],["HEAD","H_HelmetSpecB"],["VEST","V_PlateCarrier1_rgr"],["GOOGLES",""]]], [_group,["B_soldier_AR_F",_startPos,[],25,"FORM"],[["ATTP","muzzle_snds_H"],["HEAD","H_HelmetSpecB"],["VEST","V_PlateCarrier1_rgr"],["GOOGLES",""]]], [_group,["B_Soldier_A_F",_startPos,[],25,"FORM"],[["ATTP","muzzle_snds_H"],["HEAD","H_HelmetSpecB"],["VEST","V_PlateCarrier1_rgr"],["GOOGLES",""]]] ]; {_x call rej_fnc_spawnUnit} forEach _groupType; String codes: ATTH = HandGun attachement ATTP = Primary weapon attachement ATTS = Secondary weapon attachment BACK = Backpack FACE = Setface. String should be the face you want for unit. GOOGLES = Googles HEAD = Helmet/headgear ITEM = items (Adds item eg:. ["ITEM",<insert classname>,2]. See MAG for similar input description.) MAG = Magazine eg: ["MAG","20Rnd_762x51_Mag",2] 3rd input is the number of magazines NVG = Night vission goggles NAME = setName command. Eg: ["NAME",["Ben Kerry","Ben","Kerry"]] NAMESOUND = setNameSound command. Eg: ["NAMESOUND","dixon"] PITCH = Voice pitch. setPitch command. EG: ["PITCH",1] RANK = setRank command. EG: ["RANK","CORPORAL"] SPEAKER = setspeaker command. EG ["SPEAKER","NoVoice"]; UNI = Set Uniform VEST = set vest WEAPH = set Handgun weapon (Magazines of previous weapon will be removed) WEAPP = Set primary weapon (Magazines of previous weapon will be removed) WEAPS = Set secondary weapon (Magazines of previous weapon will be removed) NOTE: For items and magazines the script will check if it can add the item to the unit before placing it in inventory. EDIT: 10/04/2016 Fixed googles not being removed properly when adding an array specifying GOOGLES as "". The script itself: /////////////////////////////////////// //-- Rejenorst's unit spawn script --// /////////////////////////////////////// _group = _this select 0; _unitSpawnInfo = _this select 1; _unitEquipment = _this select 2; _reAddItems = true; if (count _this > 3) then { _reAddItems = _this select 3; }; ////////////////////////////////////////////////////////////////////////// //-- Define variables and check if unit exists or needs to be spawned --// ////////////////////////////////////////////////////////////////////////// private["_unit"]; if (typename _unitSpawnInfo == "OBJECT") then { _unit = _unitSpawnInfo; } else { _unitType = _unitSpawnInfo select 0; _unitSpawnPos = _unitSpawnInfo select 1; _unitMarkers = _unitSpawnInfo select 2; _unitPlacementRadius = _unitSpawnInfo select 3; _unitSpecial = _unitSpawnInfo select 4; _unit = _group createUnit [_unitType,_unitSpawnPos,_unitMarkers,_unitPlacementRadius,_unitSpecial]; //["SoldierWB", position player, [], 100, "FORM"] }; ////////////////////////////////////////////////// //-- Check if unit has been spawned or exists --// ////////////////////////////////////////////////// if (isNil "_unit") then { _unit = objNull; }; /////////////////////// //-- Add equipment --// /////////////////////// if (!isNull _unit) then { private["_magCount","_magArray"]; _itemTransferArray = []; _magazinesAmmoFull = magazinesAmmoFull _unit; //////////////////////// //-- Add unit items --// //////////////////////// _arrayCount = (count _unitEquipment) - 1; if (_arrayCount >= 0) then { for "_i" from 0 to _arrayCount do { _itemArray = _unitEquipment select _i; _itemString = toUpper (_itemArray select 0); _item = _itemArray select 1; _checkItem = [_unit,_itemString,_item] call { _unit = _this select 0; _itemString = _this select 1; _item = _this select 2; if (_itemString == "ATTH") exitWith {_unit addHandgunItem _item}; if (_itemString == "ATTP") exitWith {_unit addPrimaryWeaponItem _item}; if (_itemString == "ATTS") exitWith {_unit addSecondaryWeaponItem _item}; if (_itemString == "BACK") exitWith { _itemsToTransfer = backpackItems _unit; removeBackPack _unit; if (_item != "") then { _unit addBackPack _item; }; {if (_unit canAddItemToBackpack _x) then {_unit addItemToBackpack _x};} forEach _itemsToTransfer; }; if (_itemString == "FACE") exitWith {_unit setFace _item;}; if (_itemString == "GOOGLES") exitWith { removeGoggles _unit; if (_item != "") then { _unit addGoggles _item; }; }; if (_itemString == "HEAD") exitWith { removeHeadgear _unit; if (_item != "") then { _unit addHeadgear _item; }; }; if (_itemString == "ITEM") exitWith { _itemCount = 0; if (count _itemArray > 2) then { _itemCount = (_itemArray select 2) - 1; }; if (_itemCount >= 0) then { for "_a" from 0 to _itemCount do { if (_unit canAdd _item) then { _unit addItem _item; }; }; _a = nil; }; }; if (_itemString == "MAG") exitWith { _magazineCount = 0; if (count _itemArray > 2) then { _magazineCount = (_itemArray select 2) - 1; }; if (_magazineCount >= 0) then { for "_a" from 0 to _magazineCount do { if (_unit canAdd _item) then { _unit addMagazine _item; }; }; _a = nil; }; }; if (_itemString == "NVG") exitWith { _assignedItems = assignedItems _unit; {if (_x find "NVGoggles" > (-1)) then {_unit unassignItem _x;_unit removeItem _x};} forEach _assignedItems; if (_item != "") then { _unit addItem _item; }; }; if (_itemString == "NAME") exitWith {_unit setName _item}; if (_itemString == "NAMESOUND") exitWith {_unit setNameSound _item}; if (_itemString == "PITCH") exitWith {_unit setPitch _item}; if (_itemString == "RANK") exitWith {_unit setRank _item}; if (_itemString == "SPEAKER") exitWith {_unit setSpeaker _item}; if (_itemString == "UNI") exitWith { _itemsToTransfer = uniformItems _unit; removeUniform _unit; if (_item != "") then { _unit forceAddUniform _item; }; if (_reAddItems) then { {if (_unit canAddItemToUniform _x) then {_unit addItemToUniform _x};} forEach _itemsToTransfer; }; }; if (_itemString == "VEST") exitWith { _itemsToTransfer = vestItems _unit; removeVest _unit; if (_item != "") then { _unit addVest _item; }; if (_reAddItems) then { {if (_unit canAddItemToVest _x) then {_unit addItemToVest _x};} forEach _itemsToTransfer; }; }; if (_itemString == "WEAPH") exitWith { if (handgunWeapon _unit != "") then { _magArray = getArray (configfile >> "CfgWeapons" >> (handgunWeapon _unit) >> "magazines"); _magCount = (count _magArray) - 1; _unit removeWeapon (handgunWeapon _unit); }; if (_item != "") then { _unit addWeapon _item; }; if (!isNil "_magCount") then { if (_magCount >= 0) then { for "_a" from 0 to _magCount do { _mag = _magArray select _a; _unit removeMagazines _mag; }; _a = nil; _magCount = nil; _magArray = nil; }; }; }; if (_itemString == "WEAPP") exitWith { if (primaryWeapon _unit != "") then { _magArray = getArray (configfile >> "CfgWeapons" >> (primaryWeapon _unit) >> "magazines"); _magCount = (count _magArray) - 1; _unit removeWeapon (primaryWeapon _unit); }; if (_item != "") then { _unit addWeapon _item; _unit selectWeapon _item; }; if (!isNil "_magCount") then { if (_magCount >= 0) then { for "_a" from 0 to _magCount do { _mag = _magArray select _a; _unit removeMagazines _mag; }; _a = nil; _magCount = nil; _magArray = nil; }; }; }; if (_itemString == "WEAPS") exitWith { if (secondaryWeapon _unit != "") then { _magArray = getArray (configfile >> "CfgWeapons" >> (secondaryWeapon _unit) >> "magazines"); _magCount = (count _magArray) - 1; _unit removeWeapon (secondaryWeapon _unit); }; if (_item != "") then { _unit addWeapon _item; }; if (!isNil "_magCount") then { if (_magCount >= 0) then { for "_a" from 0 to _magCount do { _mag = _magArray select _a; _unit removeMagazines _mag; }; _a = nil; _magCount = nil; _magArray = nil; }; }; }; }; }; }; _i = nil; if (needReload _unit == 1) then {reload _unit}; };
  8. rejenorst

    SP Harpoon Delta

    Have updated the steam version of this mission. I have been super busy with work and overseas travel lately. The uploaded version had a fatal oversight that the large boat at start was to close to the smaller boats resulting in potential death at start. Have fixed this. Additionally have removed an awareness part of the script for friendly units which ws incompatible with another part of combat script resulting in units not moving as much as they should. Additionally have lowered enemy skill maximum random variable settings to decrease difficulty somewhat and have also added an FIA squad that will join the player's squad should his unit count to to low (IF they're still alive as they will aid you at the beach early on and then wait there to reinforce you if needed). This hopefully makes the mission a bit more enjoyable and easier to cope with. It certainly doesn't stop you from having to watch your back. This mission had been a great help in testing some scripts I have been working on. It has also enabled me to identify major weaknesses and inefficiencies which I am attempting to address in a new more efficient script for future missions. http://steamcommunity.com/sharedfiles/filedetails/?id=532117787
  9. Will definitely give these a try. Probably won't be in the next mission (as it will be a vanilla test mission for further scripts) but after next mission I want to do a lot more work with mods etc :D
  10. Wow those camos look really nice man! Especially love the NATO and CSAT green camos :D
  11. rejenorst

    SP Harpoon Delta

    Hi Inlesco! Thank you very much for the great feedback :D I loved the intense CQC. I’ve shot AAF when one of them was breaching into a building. That was a moment of awesomeness, considering this is dynamic AI doing stuff. The garrison script I have caters for explosive specs and mine layers. Explosive specs if in your area will lay down explosives and run away to a nearby building. If they know your near the explosives and there are no friendly's nearby they will detonate. After which they will likely resume building to building movement in your/nearest enemy direction. Mine layers may lay mines on occasion if they spot you and try and run away. This sometimes leads to hilarity. I once had the hostage accidentally walk over one of those mines ^_^ There's some good ideas which I might add to the mission: Advise the player to check the inventory of the boat (there’s some useful goodies inside!) I might add a radio message or hint for this. unitPlay for boat insertion? The smoothness of the insertion is certainly unpredictable. The units currentcommand will switch to GET OUT. Sadly for some reason units sometimes get stuck in this mode when exiting boats (especially the zodiacs). I believe its to do with the fact that units attempt to run off to the deep end where they get stuck. Unitplay might help but the units may still be in GET OUT mode which means they may attempt to run to the side of the boat to fullfill their GETOUT condition (I assume) and get stuck. They usually snap out of it after a while. Currently my script switches leaders when units get stuck in GET OUT and will setpos subordinate units on the leaders position should they lag to far behind. After about 3 setpos' subordinates generally resume following leader. I think BI needs to disable the units moving to a set waypoint at the side of boats after disembarking. When units get out of helicopters or tanks they always seem to move away from the vehicle off to the side. Seems hard-coded or something. I’ve seen vehicles teleporting around in the city (offroads, hatchbacks, etc.). Must be a faulty script. FIA hatchbacks? My script checks when a vehicle gets stuck. The FIA offroad that drops off hotel bravo may have gotten stuck and the script may have setpos'd it to a new location. After 3 setpos attempts it will or should kill/destroy the vehicle. Add a civilian kill cap for the player? I contemplated doing it but would likely have to add more eventhandlers to each civ. I can add this to the next update. Also, civilians walk in ‘Slow’ mode during the firefights in the city. They should run or stay crouched / prone behind cover. This really ruins immersion. Yeah I think I will change this to have them run only. Currently each civ has a firednear eventhandler that switches them to run/scream when fired near. I might just make them perma run. enableEnvironment false? Too many bunnies and butterflies around in the battlefield, snakes too. Annoys a little. Good idea. I might try that out thanks :D didn't know it disables wildlife. AI gets into the balconies without opening the door. Usually they're pretty good and I generally see open doors where the AI ventures but I have seen them occasionally moving through doors instead of opening them. Adding resources to correct this would mean additional nearby door checks which if it happens only occasionally I'd prefer to avoid but I'll keep it in mind and see if there's an effective way of dealing with it. The second squad got lost or something. I had no idea of their location, nor they did report anything. No tension created on that one. You mean Hotel Bravo? They're an FIA squad (ie: they are friendly but not part of your group.) They will randomly patrol around the objective area looking for enemies and checking areas of last known enemy contacts. I might explore some more tension creating avenues for this and I might change the orders they're given as well. Also, if possible, some small AI extraction script to order them to take cover or simply halt would be great. Or, better yet, make the player and captured AI a separate team that must link up with the remaining survivors. Do you mean for your team to wait for you while you extract the hostage instead of heading back to the vehicle without waiting? I might look into that and see if I can sort something out. It will take me a little while to get on these things as I work on another mission and come back to this one every so often to update scripts and do repairs etc especially when I have new scripts that can replace older ones :)
  12. rejenorst

    SP Harpoon Delta

    No worries. Will let you know once I get that done. If you can test without mods or run a test again in the meantime PM me the results. My scripts create a logic side which may cause some problems with other AI scripts etc.
  13. rejenorst

    SP Harpoon Delta

    Hmmm that is strange. I have failed the mission a couple of times but I am getting a lot more successful completions on play-through then before. I have noticed that if the enemy spots you early they will start making their way down to towards you which can be problematic at the beach but most of the time in playthroughs my men have managed to get off the beach and into town. I have never had any problems with the savegame error that you mentioned and I save a lot :0 Can you try the following?: -Disable any mods (Especially AI mods). -Delete the mission and download it again (In case of corrupt mission file) I will delete my mission and download it from steam just to see if something is wrong with the upload. if the mission is a failure then it will be one of the following reasons being triggered: 1) Vip is dead/kiled. 2) All your men have been killed. (At least one of your men must stay alive) 3) You have left the mission area (ie: 400 meters outside the city. You will get a warning over the radio and have 10 secs to get back). Next time you get the error check the debriefing to see which one of these it is that way I can isolate what is being triggered. Also for the grenade launcher you can choose a rifle with gren launcher on the briefing screen :) I recommend TRG http://armedassault.wikia.com/wiki/TRG_21 Its really good with a scope and has limited recoil. Grab the eglm version on briefing screen. I will probably lower the number of enemies in the city or at least give players a dialogue screen to choose hard/normal/easy modes. EDIT: Have done some test in various difficulty modes. It seems that in elite mode where AI difficulty is set to expert I have noticed the AI taking more time to get to its destination. Have therefore updated the mission and disabled attack in the player group's waypoint. This seems to get the AI to at least look for cover rather than to try and head on any enemies. The group will still move slowly in expert modes but for they did seem to advance for me. I must admit I did not do enough testing in the higher difficulty levels previously. However some of the errors your reporting are errors I have never come across. PM me if the problems persist. Also note: At the beginning of the mission units will automatically get spread out across the city. It can be bad luck of the draw if you get multiple enemies moving to the beach at the start. This is bad mission design on my part as a landing area should be safe to avoid frustration. I hope you will excuse my tardiness on that point as this has been mostly a test mission to work on my scripts. Hopefully in future missions I can take what I've learned here and apply them in my mission design concepts.
  14. Was testing allmarkers but the infantry marker for player doesn't seem to show up in array: hint str(allMapMarkers). By that I mean the automatically generated inf dot.
  15. rejenorst

    SP Harpoon Delta

    Was it a mission failed or mission completed ending?
×