Jump to content

madrussian

Member
  • Content Count

    1025
  • Joined

  • Last visited

  • Medals

Everything posted by madrussian

  1. I'll be happy if I can just send a single MG42 guy into a building, up the stairs, over to a window, have him face out the window and shoot at people, and then later get him back out of the building, and do all this reliably. Especially the part where he is able to exit the building eventually. That's the genius of johnnyboy's script/idea. OK it's not much yet, but here's what I've got so far:
  2. @johnnyboy Agree, our approaches are very similar. So starting out, we're basically detecting/creating (the functional equivalent of) a nav mesh. OK, let me see what I can cook up! (Again no promises, you know in case win the lottery, get hit by bus and turn into vegetable, get hired out of blue by BI and move to Czech Republic, etc) [Runs off to evil lair to begin diabolical experimentation...]
  3. All jesting aside, in terms of creating an automated system to gather the building position data: My point was if you break that portion down into individual steps, no one step is really all that hard. Now, getting the AI to use those points effectively, and not collide with each other, etc, yeah that's hard! Good thing johnnyBoy signed up for that part. Anyhow, I think his system is quite promising and a worthy endeavor. Because let's face it, using buildingPos & doMove (& relying on path-lods) and watching the AI freak out, run in circles, and get trapped in buildings sure ain't cutting it.
  4. Very excited about this idea! Here's how I would approach, per building: Get a list of internal rooms (detected using a series of randomly positioned raycasting "bombs"), obtaining the bounding box for each room. [moderately hard but doable] Find and frame the openings between rooms (detected with a grid of parallel raycasts along each wall). [moderately hard but doable] Determine which of these openings between rooms are doorways, and which are simply "holes in the wall" (using the data from step 2). [semi-easy] Find and frame the external windows (again detected with a grid of parallel raycasts along each wall). [moderately hard but doable] Get all the "standing directly in the middle of the doorway" points (easy). Get all the "standing in front of the doorway" points (semi-easy). Get all the "standing in front of the window" points (semi-easy). Detect the stairwells and get the two important points (top and bottom). [might take quite a bit of effort, but should be doable] Get "nav-mesh style grid info" for each room, by find the obstructions within each room (beds, dressers, cabinets, sinks, bathtubs, etc), again detected with a grid of parallel raycasts, this time facing down from the ceiling [moderately hard but doable] Pick some random navigation points within each room using the "nav-mesh style grid info". (easy) Organize all the points, "connecting the dots" so to speak (with info on floors, type of point, etc), making sure to raycast between them to ensure the connections. For use by our illustrious AI script creators. Then some "rooms" are missing a wall (like destroyed church), and some rooms have an extra diagonal wall (like that town-center corner building), so we'd have many edge cases. Then we have all the external "rooms" (like balconies, rooftops, etc), which would obviously be more challenging. The whole endeavor would require quite an iterative approach. Start with the easy stuff first, then work our way up. Side questions - Anyone recall if Arma building internal doors are detectable? Does anyone know if DayZ ever implemented indoor path-finding? I seemed to recall they pretty much canned AI from the mod tools. But how does indoor path-finding work for the AI zombies? (as compared to ArmA3 indoor AI path-finding). Curious, as that may be an indicator of how Arma4 indoor AI path-finding will end up. Anyhow, back to the here and now. Seems to me we have the tools to make this happen: Quaternion Rotation functions Btw - I'm not necessarily volunteering! But I might just run a few experiments to (you know) see if we can get this ball rolling, and see where it goes.
  5. @.kju Sure thing, I wrote up US and UK "missing words" issue here: When ordering player-led AI squad, US and UK soldier’s confirmations are not Audible (while Soviet and German AI confirmations are) Makes sense, good to know. Btw- Thanks again for all your efforts!
  6. @.kju & @Gunter Severloh: Good tips, didn't know about bind turret turning on the keyboard, I think that will help a lot. Also Gunter good strategies on command a tank with AI that you are also in. Agree that it helps tremendously to be driver (or at least to directly control driver). I still would like faster turret versions of vehicles far more than driverless version of vehicles, but anyway nice to know I can always mod something up. Quick followup on the whole "missing voices" in the Radio Protocols thing I mentioned previously: Again, I noticed that commanding US and UK soldiers to move should result in them speaking confirmation of order aloud and confirmation of arrival aloud (like with vanilla units, and like with Soviets and Germans), but that US and UK soldiers do not speak confirmations. First off, curious - Supposing this was an easy thing to fix, would people want it fixed? (Or do people prefer the more silent commanded soldiers?) My latest related experiments, etc: Perhaps we should be downgrading radio protocol (US and UK) to A2 tech, instead of upgrading (GER and SOV) to A3 tech. Considering all the missing words due to (potential KBTell bug related to) lack of radios. Curious your thoughts? Also curious, would we even see any advantages upon upgrading it?
  7. About turret speeds, imho: I like in principal what team is going for in term of realism, and appreciate all your efforts, etc. However, from gameplay perspective here are two major drawbacks to slow turrets: 1. When player mans slowest turrets, it's super annoying and un-fun to try and traverse turret with the mouse. 2. By far most importantly: In my experience the AI simply can't handle these (relatively) super-slow turret speeds. When AI-crewed tanks are stationary, players can literally run circles around them with zero danger (to the point of things becoming quite silly). And with slow turrets the AI is not nearly coordinated enough to move and shoot and the same time, and hardly ever gets a shot off. Overall (speaking of all mods in general and again imo), fun factor for playing against AI-crewed tanks increases dramatically when turret speeds approach vanilla speeds. I would much rather see either a compromise between standard turret speed of vanilla tank turrets with ultra-realistic turret speeds (maybe halfway between? perhaps somewhat closer to vanilla speeds?) -OR- Two versions of each vehicle. One version with faster turret speeds closer to vanilla (to give those AI a chance), and one version ultra-realistic (like now) for PVP. [Of course having two versions of each vehicle would increase workload for team and increase aforementioned bloat in terms of number of vehicle types, so yes it's always a trade-off.]
  8. I'd like to tweak some foot soldier equipment Armor values of my favorite mods (for personal use, etc). Thankfully, I see how to tweak vest armor (and helmet armor) described in a straightforward way here on the wiki. Good so far. The simple question is: Where are uniform armor values defined? Here's a quick rundown on what I did & where I looked (so far):
  9. OK, I think I may have just figured out the rest. From the top... Soldier type "O_Soldier_F" wears uniform "U_O_CombatUniform_ocamo". This uniform has "ItemInfo" >> "uniformClass" equal to "O_Soldier_F". So "U_O_CombatUniform_ocamo" uniform gets armor values from the HitPoints entry for "O_Soldier_F", which in this case are elevated (mostly 6 with neck being 4, etc). In contrast, soldier type "B_Soldier_F" wears uniform "U_B_CombatUniform_mcam". This uniform has "ItemInfo" >> "uniformClass" equal to "B_Soldier_F". So "U_O_CombatUniform_ocamo" uniform gets armor values from the HitPoints entry for "B_Soldier_F", which in this case are lower (mostly 1 with arms and hand being 3, etc). This guy gets his armor more from his vest, etc. Most of that makes sense, except for one bizarre conclusion. It seems that "O_Soldier_F", in addition to having a more resilient uniform, would also have a more resilient body. Not quite sure how that squares up!
  10. Thanks for response BadHabitz. Good to hear confirmation that uniforms indeed have armor values (and CSAT specifically). Ok, so I take soldier type "O_Soldier_F". In config I see he wears uniform "U_O_CombatUniform_ocamo". In CfgWeapons, I find this uniform type. I look for "ItemInfo" >> "HitpointsProtectionInfo", but it's not there. Instead I see "ItemInfo" >> "uniformClass". Because I don't see "ItemInfo" >> "HitpointsProtectionInfo" (where you obtain armor info for vests), but instead see "ItemInfo" >> "uniformClass" in it's place, I infer that "uniformClass" is the probably the key to determining uniform armor. Can anyone confirm (yay or nay) that "uniformClass" has anything to do with obtaining uniform's armor? (Btw- Sorry if I'm being obtuse. I have CS degree but in this case I'm mega-stuck and could use bit more help, thanks!)
  11. Thanks for response kju. Again, I see how look/up modify armor value for vests and helmets, but not for uniforms. Specifically, vests and helmets have "ItemInfo" >> "HitpointsProtectionInfo", and as you show (in your example) armor can be modified inside there. In contrast, uniforms do not have "ItemInfo" >> "HitpointsProtectionInfo", and instead have "ItemInfo" >> "uniformClass". Seems to me the armor value for uniform must somehow be derived from "uniformClass". That's where I'm stuck though, not sure how to get armor value from "uniformClass". More broadly, I am under the impression (based on that steam post I mentioned in spoiler above and some limited experiments) that uniforms specifically even have armor values at all. Can someone confirm (yay or nay) whether this is the case?
  12. Congrats on the big release! You guys have simply outdone yourselves and result is pretty astounding. Initial takeaway: When leading a IFA3 UK squad, I noticed that when ordering AI subordinates around, they would not report important info. For instance, upon ordering AI to move to position, they would NOT say “On The Way”, “Copy That”, “Roger”, “Understood”, etc and then upon arriving they would NOT say “Standing By”, “Waiting”, “Ready”. Checked and this is now also true when commanding IFA3 US AI subordinates. Tested quickly with IFA3 Russian squad and IFA3 German squad and they report this info just fine. Now, I’m 99% sure IFA3 US subordinates used to report these statements aloud. This lack of verbal feedback from subordinates is bugging me and affecting my ability to effectively command my squad. Anyone else recall IFA3 US subordinates used to report this info (aloud), upon being commanded to move (and upon arriving at destination)? Here’s some more info on the issue (and a possible solution), for those interested: @Gunter Severloh Great info and pics about vehicles going too fast. I'm having the same issues, and it's not just tanks. I also think the acceleration is set way too high.
  13. madrussian

    Engage player

    Not sure if this is covered in any of the threads pierregmi listed, but (among other things) make sure and use enableAttack false on the enemy group. Otherwise the enemy group leader will keep ordering his men to stop (via subgroups) once he sees targets. I'm 99% sure the "ordering to stop" part is independent of disabling AUTOCOMBAT on the enemy group (via disableAI "AUTOCOMBAT"), which you may also want to do. Edit: Opps, said "AUTOTARGET", meant "AUTOCOMBAT"
  14. Thinking outside the box a bit. I know the AI will avoid land-mines. Could there be a way to piggy-back off that "area avoidance" mechanism?
  15. madrussian

    ArmA 3 AI Pathing Rant

    A man can dream... and this is my dream as well. Oh how I hope AI path-finding within buildings is within scope and a major priority for Arma 4.
  16. I had this problem also, in a big way in my dynamic mission. Noticed that a specific WW2 vehicle type was getting stuck 100% of the time. If I recall correctly, was trying to solve this specifically with a FOW vehicle. Spent a bunch of time investigating, and to my surprise pinned this down to the lowering of speed (via limitSpeed and/or forceSpeed). In the case of my mission, I was lowering vehicle speed mission-wide dynamically based on the amount of territory the enemy took. Removing speed lowering unstuck that particular vehicle type. Now curious, I removed speed lowering mission-wide. The biggest surprise was this: Suddenly I noticed far fewer instances of mysteriously stuck vehicles in my mission. (This included certain IFA3 vehicles too if I recall correctly.) Suddenly vehicles were getting to their destinations literally most of the time. Removing that "speed lowering" improved the fun factor of my mission by at least a factor of 3, not kidding at all. (The downside is now putting up with the ridiculous acceleration to top speed of the those small FOW halftracks.) The funny thing is, for literally years I blamed all those stuck vehicles on BIS's path-finding overhaul. And in my case so much sticking was simply related to speed lowering. Anyhow, please everyone be very careful when lowering vehicle speed or you will probably run into this stuck vehicles too. It doesn't take much speed lowering at all to stick the susceptible types. Also btw- I have overcome most of my BIS pathfinding issues. Should do a write-up on the various stuck remedies I employ (none of which involve teleporting the vehicle). I believe I have enough insight into that horrible bug where AI drivers can't turn around and drive toward a WP behind them, to where BIS could actually fix it. (Would want to pull all the stops though and create a formal detailed report with history, screenshots, etc like that excellent "17 years old bug in A3 - 'A fallen static objects' geometries bug'" thread, which resulted in BIS finally fixing that long-standing nightmare issue.) @Wiki Curious if you pinned your particular problem down to certain vehicles types?
  17. madrussian

    JBOY Longboat [Release]

    Awesome, here's a quick screenshot: This quick boat mod requires some of my vector rotation functions, which I posted here. Here's your code with my mods (each indicated via "MRU Mod -"): Boat mod crew positioning is surprisingly good, but could definitely use some minor improvement (inc front guy's gun poking through hull slightly, etc). Please someone improve away and post here, thanks! Totally agree about having a simple static outboard motor object, that would be perfect.
  18. Here are a handful of functions I wrote a while back that I figure might help some folks out. MRU_V3_QRotation is the big one. Rotate a 3D vector around any axis in 3D space by any number of degrees. Useful in both world space and model space. [Feel free to use these in any way you see fit. If you use in a release, please add simple credit, as these took a while to develop.] Here ya go. Have fun! MRU_Q_Conjugate = { // MRU_Q_Conjugate by MadRussian (created long ago, updated 2/11/19) // This returns a simple quaternion conjugate. // Call with: [Quaternion] call MRU_Q_Conjugate; // Example: _quaternionConjugate = [[1,1,1,0]] call MRU_Q_Conjugate; // Result is [-1,-1,-1,0] private ["_x","_y","_z","_w"]; params ["_Q"]; _x = -(_Q select 0); _y = -(_Q select 1); _z = -(_Q select 2); _w = (_Q select 3); [_x, _y ,_z ,_w] }; MRU_Q_FromV3 = { // MRU_Q_FromV3 by MadRussian (created long ago, updated 2/11/19) // This is a simple vector to quaternion conversion. // Call with: [Vector3] call MRU_Q_FromV3; // Example: _quaternion = [[1,1,1]] call MRU_Q_FromV3; // Result is [1,1,1,0] params ["_V"]; [_V select 0, _V select 1, _V select 2, 0] }; MRU_Q_Multiply = { // MRU_Q_Multiply by MadRussian (created long ago, updated 2/11/19) // This performs a simple quaternion multiplication. // Call with: [Quaternion1, Quaternion2] call MRU_Q_Multiply; // Example: _quaternion = [ [1,1,1,0], [0,0,0,1] ] call MRU_Q_Multiply; // Result is [1,1,1,0] private ["_x","_y","_z","_w"]; params ["_qA","_qB"]; _x = (_qA select 3)*(_qB select 0) + (_qA select 0)*(_qB select 3) + (_qA select 1)*(_qB select 2) - (_qA select 2)*(_qB select 1); _y = (_qA select 3)*(_qB select 1) - (_qA select 0)*(_qB select 2) + (_qA select 1)*(_qB select 3) + (_qA select 2)*(_qB select 0); _z = (_qA select 3)*(_qB select 2) + (_qA select 0)*(_qB select 1) - (_qA select 1)*(_qB select 0) + (_qA select 2)*(_qB select 3); _w = (_qA select 3)*(_qB select 3) - (_qA select 0)*(_qB select 0) - (_qA select 1)*(_qB select 1) - (_qA select 2)*(_qB select 2); [_x, _y, _z, _w] }; MRU_Q_Normalize = { // MRU_Q_Normalize by MadRussian (created long ago, updated 2/11/19) // This performs a simple quaternion normalize. // Call with: [Quaternion] call MRU_Q_Normalize; // Example: _quaternionNormal = [[7,0,0,0]] call MRU_Q_Normalize; // Result is [1,0,0,0] private ["_l","_result"]; params ["_Q"]; _l = sqrt ( (_Q select 0)*(_Q select 0) + (_Q select 1)*(_Q select 1) + (_Q select 2)*(_Q select 2) + (_Q select 3)*(_Q select 3) ); _result = [0,0,0,0]; if (_l != 0) then { _result = [(_Q select 0)/_l, (_Q select 1)/_l, (_Q select 2)/_l, (_Q select 3)/_l] }; _result }; MRU_V3_QRotation = { // MRU_V3_QRotation by MadRussian (created long ago, updated 2/11/19) // This performs a simple(?) quaternion rotation. // Call with: [OrigVector, RotationAxis, RotationAngle] call MRU_V3_QRotation; // where OrigVector is the original 3D vector to be translated // RotationAxis is the rotational axis to be rotated about, represented by a 3D vector // RotationalAngle is the angle to rotate by in degrees // // Example: _vector3 = [ [0,0,1], [1,0,0], 90 ] call MRU_V3_QRotation; // would result in a rotated 3D vector of [0,1,0] private ["_origQ","_rotAxisQ","_rotAxisNormQ","_sinAD","_rotAxisTransQ","_rotAxisConjQ","_preResultQ","_resultQ"]; params ["_origV","_rotAxis","_rotAng"]; _origQ = [_origV] call MRU_Q_FromV3; _rotAxisQ = [_rotAxis] call MRU_Q_FromV3; _rotAxisNormQ = [_rotAxisQ] call MRU_Q_Normalize; _sinAD = sin(_rotAng/2); _rotAxisTransQ = [ (_rotAxisNormQ select 0)*_sinAD, (_rotAxisNormQ select 1)*_sinAD, (_rotAxisNormQ select 2)*_sinAD, cos(_rotAng/2) ]; _rotAxisConjQ = [_rotAxisTransQ] call MRU_Q_Conjugate; _preResultQ = [_rotAxisTransQ, _origQ] call MRU_Q_Multiply; _resultQ = [_preResultQ, _rotAxisConjQ] call MRU_Q_Multiply; [_resultQ select 0, _resultQ select 1, _resultQ select 2] }; Update 2/11/19: Cleaned up the comments & examples, removed an empty private block.
  19. madrussian

    JBOY Longboat [Release]

    Roger all that. So I got it working nicely with "Land_RowBoat_V1_F". It's suppose to be a "row" boat (no engine etc), but it looks & plays great for WW2 missions imo. Had to rotate 90 degrees left, then rotate around forward axis by 19 degrees to get it perfectly aligned (as this object is listing to side by default). Using attachment point [-0.075, 0, -.8] and it looks very good. Still tweaking to minimize horizontal boards clipping with extra crew, etc. Also, it's possible to use all 5 crew positions if you use your imagination a bit for two the guys laying down. (Considering attaching some boxes underneath those two guys to get it looking perfect.) Thanks so much for the idea & script!
  20. madrussian

    JBOY Longboat [Release]

    Great script! When developing, did you happen to try this on other static vanilla game boats (and/or wrecks)? If so, any success? Hoping to apply this idea in some WW2 missions (in non-tropical settings). Those poor Russians & Germans could use some boat transport over water (like US forces have).
  21. Hello, could use some quick help with an error I'm getting. On a hosted server, I apply a custom texture to a flag via setFlagTexture, like this: _flag setFlagTexture "Misc\Images\JapaneseNavyFlag.paa"; So far, so good. Everything works correctly on the server machine. I see the flag texture, etc. But on the clients, end up seeing an empty flagpole and get this error: I checked and my picture file is good, 256x256 pixels, etc, and works just fine on server so it's really a file path issue. Anyway here's the thing: I'm getting this error running my mission from the editor. If I pack mission into a PBO and run that way, the error disappears, and the clients all see the correct flag texture. So one workaround could be to always pack and run from a PBO. Unfortunately, I really need to be able to work from the editor. I've been tinkering with sqs/sqf since the days of OFP and run into plenty of annoying things, but never anything that forces me to export to a PBO constantly. There must be a way to get around this! Now I'm thinking outside the box. Thinking back, I had a similar (exact?) issue with setting the picture of listbox items via lbSetPicture (and later retrieving that picture via lbPicture). On the server the picture was showing up just fine, but all the clients were getting that exact same error ("Cannot load texture" with server machine's username in the file path). After some digging, I learned that lbSetPicture accepts a simple file path from your mission folder (like "Options\Images\JapaneseArmyFlag.paa"), but then lbPicture returns the entire local file path (in this case "c:\users\%my_username%\documents\arma 3\mpmissions\%my_mission%.chernarus_summer\options\images\japanesearmyflag.paa). The solution in that case was to strip out the root part of the file path before broadcasting over to the clients, like this: _missionRoot = BUB_MissionRoot; if ((_pic find (toLower _missionRoot)) == 0) then { _pic = _pic select [count _missionRoot, (count _pic) - (count _missionRoot)]; }; For listboxes, this worked because lbSetPicture is an "Effect Local" command (meaning it's effects are NOT broadcast to all machines). Taking a closer look at setFlagTexture, I confirm it is indeed "Effect Global", meaning it's effects ARE broadcast to all machines. Sounds like I need an "Effect Local" version of this command. I look and the closest thing I can find is setObjectTexture which is "Effect Local" (great!), but unfortunately this just sets the texture of the... flagpole. Now I'm stumped. So here's my question: Anyone know a way to set the flag texture and do so locally? (in contrast with setFlagTexture which has global effect) Or any other way to avoid that pathing error message (without resorting to packing mission to PBO again and again, ad nauseam)? Btw- I welcome any and all ideas, even simple things I may have missed. Thanks!
  22. Hello team, quick thanks again for your efforts / awesome results. Quick question - Just noticed some new "_KOTH" versions of some vehicles, like "LIB_sdKfz_7_AA" vs "LIB_sdKfz_7_AA_KOTH". I assume these versions are specially made for "King of the Hill" game mode? What is different about KOTH from standard versions (aside from type name)? Trying to figure out whether to exclude them in my dynamic mission.
  23. For me in MP, clientOwner called on server always returns 2. On both Hosted Server and Dedicated Server. As in, “you can take it to the bank” always. But one time in approx ten-thousand runs, clientOwner called on server returned something like 12 or 13, and totally borked my dynamic mission! I have no idea how or why this happened but now I know it indeed does happen (did detailed analysis during that single run). Need to reproduce this phenomenon, in order to handle this possibility properly via a fix. Has anyone else seen this? [In MP, clientOwner called on server returning value other than 2] Anyone know under what conditions this occurs?
  24. madrussian

    clientOwner going haywire

    @HazJ Let's see, seems you are possibly thinking of the owner command? (Indeed owner must be called on the server.) In contrast, clientOwner is intended to be called on any machine (including all clients). Can be used to track the various machines in MP game. Here's one example of how I use clientOwner. Upon mission startup, my group-based respawn system (GLR, short for Group Linked Respawn) runs on all machines and all initial player units store their clientOwner in a temporary "MRU_GLR_ClientOwner" variable on the units. When this part gets done Server then does a pass, storing these clientOwners in an ordered array (MRU_GLR_OrderedClientOwners) to keep track of the original player hierarchy. So when players die and take over as an AI, the player with highest priority (earliest clientOwner in MRU_GLR_OrderedClientOwners) becomes group leader. The thinking is player who took the top spot in the MP lobby wants to be group leader, so keep that player as group leader. Also, my group linked respawn system allows players to degroup into smaller groups, and so this hierarchy is important when players die in one group and end up in another group (that may or may not already have players, etc). Anyhow regarding this thread, here's what I'm really after: On the clientOwner reference, in the comments section Killzone Kid's mentions the following: Considering this inconsistency exists, and that I may have accidentally stumbled upon this by witnessing the aforementioned clientOwner inconsistency, curious about following. When "in MP, clientOwner called on server returning value other than 2" is happening: In this case how does remoteExec handle it's targets parameter? If you use 2 for target, will the server get the message, or must you now use the server's bizzaro clientOwner value to send server messages via remoteExec? The only way to answer this question is to figure out how to reliably reproduce the "in MP, clientOwner called on server returning value other than 2" setting. At present, I have no clue how to accomplish this! Any ideas?
  25. I love it when a thing comes together. Added proper getSetSkill function! Given a final skill value, correctly computes original setSkill. Also, I'm getting accuracy of ~ 0.0000001 now both ways, no matter what I feed in. (I think this is due to recent change of inflection point minimum to 0.01) Overhauled everything a bit (including improving some function names), now in single file format. Please someone try this and report back! So I can move forward and create a proper release thread. New Instructions: Create a file named "MRU_FinalSkillCalculator.sqf" (in mission dir), paste this code inside, and save: Then in "init.sqf", paste this and save: call compile preprocessFile "MRU_FinalSkillCalculator.sqf"; call MRU_FSC_Initiate; Test via: // Create AI man in the editor, and call him "Loon" _difficultySKILL = missionNamespace getVariable ["MRU_FSC_DifficultySKILL", -1]; _difficultyPRECISION = missionNamespace getVariable ["MRU_FSC_DifficultyPRECISION", -1]; _skill = 0.38; _subSkill = "general"; //_subSkill = "aimingAccuracy"; //_subSkill = "aimingShake"; //_subSkill = "aimingSpeed"; //_subSkill = "commanding"; //_subSkill = "courage"; //_subSkill = "endurance"; //_subSkill = "reloadSpeed"; //_subSkill = "spotDistance"; //_subSkill = "spotTime"; _projectedFinalSkill = [_skill, _subSkill] call MRU_FSC_GetFinalSkill; Loon setSkill [_subSkill, _skill]; _actualFinalSkill = Loon skillFinal _subSkill; _finalSkillDelta = _actualFinalSkill - _projectedFinalSkill; _checkGetSetSkill = [_actualFinalSkill, _subSkill] call MRU_FSC_GetSetSkill; hint format ["_difficultySKILL: %1\n_difficultyPRECISION: %2\n\n_skill: %3\n_subSkill: %4\n\n_projectedFinalSkill: %5\n_actualFinalSkill: %6\n_finalSkillDelta: %7\n\n_checkGetSetSkill: %8", _difficultySKILL, _difficultyPRECISION, _skill, _subSkill, _projectedFinalSkill, _actualFinalSkill, _finalSkillDelta, _checkGetSetSkill]; Note - Test expanded & function names updated ^
×