You can download it either from the Community Passport (link in the toolbar above) and/or from the Support Forums / Product Owner's Lounge / Fusion 2.5 / Download Links thread.
Printable View
I have just updated from 292.29 to 293.1 dev release version and my Kaspersky Total Security 20.0.14.1085(m) removed sdrt.exe when I started the software. I am using standalone version of Clickteam Fusion Developer 2.5. I am going to revert back and test it again.
Thank you, yes you're right, it's new. I've submitted the file as false positive to Kaspersky.
PS: in the meantime, don't revert back, just open Kaspersky and add an exclusion for the Fusion directory and the directory where you build your apps. They are usually quite fast to fix false positives.
hehe sorry I didn't meant to demand it. I was using the List Object other day and wondered why the list object was never global like other objects. My guess is the object was technically different (like using windows components) than regular actives and other objects that can be global.
Extension objects are not compatible with the "Global object" option used by active/string/counter objects, a new option has to be added in the object like the Global option in the Array object, and the code has to be done on 5 platforms (yes the List object uses the List component on each platform, but I guess retrieving the list content is not a problem).
got it, thanks Yves!
Found another instance of the loop bug and I isolated it completely. This might be useful for solving it. The requirements for triggering it seem very strange and specific. Attachment 29809
While installing the latest version on Steam, \Data\Runtime\Unicode\ssrt.exe gets marked as a trojan by Microsoft Security Essentials. Is this a known false positive?
Thanks, I think it's an object selection issue. The Start Loop action has always been known to not preserve the object selection. As you use it in the actions of a parent event, it can modify the object selection in the child events.
So the problem was not due to the optimization I talked about yesterday, it could have happened with previous builds too, I guess you were just lucky the object selection was ok.
An immediate solution for you is to insert an Always event as child event just below the parent event and move the actions of the parent event (especially the Start Loop action) to this line (line #51 in your previous example).
I'm checking if I can do something in this case (= when you use a Start Loop in actions of a parent event), not 100% sure I can fix it. EDIT: no easy fix and no fix that wouldn't possibly affect performances, so you have to use the solution above.
I don't really understand what you're saying. Nothing like this happened with previous builds and that example is all singletons so what's being picked? The condition is true as shown by the debug send and I never rely on object picking that happens before a loop to carry over. That fix did work but it doesn't make sense to me, logic-wise.
The object selection is saved at the end of the actions of the parent event, and restored before each child event line. So if the selection of the Player Flags object gets cleared before the child events are executed, the conditions on this object in child events will be false. And this is what happens after the loop is executed, because when I go through the child event line with a debugger the code says "no object selected => condition is false".Quote:
that example is all singletons so what's being picked?
Your second example doesn't work in previous builds, I've checked.Quote:
Nothing like this happened with previous builds
In your first example it was working because the fast loop was evaluating all the "On Loop" conditions of the frame and for some reason that I've no time to check right now the selection was OK after the last On Loop was evaluated. In the new build this no longer happens: thanks to the optimization / fix that was done only the On Loop conditions for the given loop name are evaluated and this revealed the problem.
Ok I have run into a VERY obscure issue. Essentially, at some point this summer, Valve upped the number of significant digits in Workshop item ID's from 8 to 10. This has put those values into a whole other unsigned 64-bit integer RAM bracket, and Fusion can't read them. Normally when loading in a ContentID value, they'll roll over into the negatives, and if I'm lucky I'll get something like 2496e+10^9 or whatever. This means the Steamworks object is unable to download Workshop items and likely won't ever work again.
Is there any any ANY chance the number of significant digits Fusion can read can be upped from 8 to 16? Mondrian is heavily reliant on user generated content and this bug could basically kill the game and nearly force me to remove it from market.
I don't get it. Are you saying it's working as intended? That seems unintuitive/illogical for a parent event to always make a child event (which requires no object picking because it's a singleton) false. I get that loops clear object picking. I coded around that. The child events shouldn't need any picking.
Edit: I've read this over and over and I think I get what you're saying, maybe? Instead of the object picking being reset, it keeps the object selection but none of them qualify so it's like a list of 0 "Player Flag"s now being tested. In the first example, I make a condition designed to pick (Fixed Value = *) and instead of looking at all bullets, it checks a list of 0 bullets and finds none. Is that really how it's supposed to be?
This is likely, as I updated the definitions yesterday night to be sure and it still quarantined the file while Steam was downloading it (while it's in the Steam\steamapps\downloading folder). I've restored the file so Steam could proceed with the update.
This morning it seems there's been a new definition update since, and scanning the file doesn't trigger any issues now.
Thank you!
? No, not at all. I say that Start Loop messes up the object selection, so it should not be used in the actions of a parent event (because the object selection is propagated to child events, and this is done after the last action of the parent event). Fixing this is a bit tricky and might cause performance issues, so I'm not sure this will be fixed. You should move the Start Loop action from the parent event to an Always line as first child event, so that the object selection is modified only in this new line and doesn't interfere with object scoping in other child events.
It's a similar issue to the known one when you use Start Loop with other actions, sometimes you have to move Start Loop to a new event line if it modifies the selection of the objects used in other actions.
Maybe, not sure if I understand what you mean either. And no it's not supposed to work like that, it's due to the Start Loop action which doesn't preserve object scoping.Quote:
Instead of the object picking being reset, it keeps the object selection but none of them qualify so it's like a list of 0 "Player Flag"s now being tested. In the first example, I make a condition designed to pick (Fixed Value = *) and instead of looking at all bullets, it checks a list of 0 bullets and finds none. Is that really how it's supposed to be?
Let me take your example:
1. First line selects the Player Controls object that have the onJump value equal to 1.Code:* onJump of Player Controls = 1
+ Hanging of Player Flags = 1
Special : Start loop "TryUnduck" 1 times
Special : Send Str$(Hanging( "Player Flags" )) to output window
+ Hanging of Player Flags = 1
Sound : Play sample click
2. Second line selects the Player Flags object that have the Hanging value equal to 1, and runs the actions:
=> when Start Loop returns for some reason the Player Flags selection list is cleared, so zero Player Flags is marked as selected.
=> Send Str$(Hanging( "Player Flags" )) to output window will seem to work because IIRC in expressions if no object is selected the engine takes the first instance.
=> after callind these actions, the engine saves the current object scoping that will be used in each child event.
3. Third line, as it's a child event it takes the object selection saved after the parent actions => no Player Flags is marked as selected. So the "Hanging of Player Flags = 1" will be false.
If you move Start Loop to a new line, this works the normal way, as the Start Loop issue doesn't interfere with the other child ev:
1. First line selects the Player Controls object that have the onJump value equal to 1, no change.Code:* onJump of Player Controls = 1
+ Hanging of Player Flags = 1
+ Always
Special : Start loop "TryUnduck" 1 times
Special : Send Str$(Hanging( "Player Flags" )) to output window
+ Hanging of Player Flags = 1
Sound : Play sample click
2. Second line selects the Player Flags object that have the Hanging value equal to 1. No action, so it just saves the current object selection, i.e. one Player Flags object is selected (and if the Player Controls object is used in child events this one is also saved).
3. Third line, the Always event line. The object selection saved above is restored, and the actions are executed.
4. Fourth line, the object selection saved above is also restored before the conditions are evaluated, in this case there is one Player Flags object selected, so the condition can be evaluated and is true.
Hopefully it's more clear.
It depends. If it's a simple sign issue, then we can probably fix it. If they use values above 4,294,967,295 then it's a different story and we would need to add new actions/conditions/expressions (which is possible too but more complicated).
EDIT: I don't see why a negative value would be a problem, it's probably just a display problem as the source code seems to use unsigned values (but maybe I didn't see everything).
Been working with Phi and Naitor over on Discord, and here's what we discovered. Using the old .NET extension, Phi was able to whip up a function that converts a big number into a string. So loading the ContentID values works there, even if it is a bit ugly. The problem though is loading those ContentID strings back into the Steamworks extension to then download the files on Workshop, because once they're converted back into Val's, they take on the 2.23646e+09 format, and the extension can't understand that. Even if it did, the rounded number would be incorrect.
Right now the files on our workshop are both sitting in the 2-billion range: 2236459396 and 2339258573 respectively. I don't know how Steam generates the numbers, whether they're completely random or adding up one at a time from Workshop items across the entire network. If they're random then there's a chance the billions spot could be any value between 1 and 9.
The negative value is a problem because the numbers have to be loaded into a list or array first, and then fed back into the Steamworks object to download the files at the associated ContentIDs. Since the ContentID's on Steam side aren't negative, you just get a statusErrorFailedToDownloadFile.
I feel like the best possible solution would be to load ContentID's in as strings, rather than values, since it's just pulling them from a URL essentially anyway.
Sure thing. Should I leave in the .NET extension or send the more baseline, no-crazy-C#-functions version?
Thanks, Yves. This one's really got me in a panic. I dunno what the plan is if content isn't downloadable.
@Yves
Hi and sorry for mention it again. Is any news to MP4 object or animation play object for all exporters?
In your example the problem comes from the Val function that you use to convert the string content from the List object. Val works with signed integers, and if the value is out of range (i.e. less than -2147483647 or greater than 2147483648), it converts it to a floating point value, and then when it's converted back to an integer value when it's passed to the Steamworks object, it gets out of range and an incorrect limit value is passed.
A possible solution is that you store the content ID to the line data in the List box object, and directly retrieve it from there, instead of using Str$ and then Val:
List : Set line fileNumber( "steamChecker" ) data to SteamLastUGCContentId( "SteamWorks" )
...
SteamWorks : Download file to Apppath$ + "\Downloads\" for content with id List Data( "List", fileNumber( "steamChecker" ) ) at priority 0
Is this possible and does this work?
Gave this a test, tried it a couple different ways, and just couldn't get the list data to store the SteamUGCContentID. Always came out as -1. So, on a whim, I also added a number array to store the values, and they came out with the negative values I got when trying to store the value as a string.
MFA attached.
This is not normal, are you sure you used the correct index?
Well, negative values are OK as they are correctly converted when they are passed as parameter to the Steamworks object (what was not OK was the floating point value returned by Val).
Sorry I can't test your app, it doesn't display anything on my machine (I guess because I don't own the Steam app?), but I'm pretty sure this works (I tried with a simple Download File action from the value that's in your example, via a List line data, and I didn't get the error message).
My setup looks like this:
* SteamWorks : On loop through search content results in session "subs"
List : Set line SteamLastUGCLoopIndex( "SteamWorks" ) data to SteamLastUGCContentId( "SteamWorks" ) [The line # = the SteamLastUGCLoop Index]
steamData : Write Value SteamLastUGCContentId( "SteamWorks" ) to (SteamLastUGCLoopIndex( "SteamWorks" )) [This writes the last ContentID value to to the loop index X spot on the array]
steamChecker : Set lineDataValue to List Data( "List", SteamLastUGCLoopIndex( "SteamWorks" ) ) [This is the alterable value that checks the line data value]
I'll reactivate the download function again pull the values from the array instead and see what happens there.Quote:
Well, negative values are OK as they are correctly converted when they are passed as parameter to the Steamworks object (what was not OK was the floating point value returned by Val).
Edit: No dice. I made some small changes to add a "numberOfFiles" value to the active. Then it's supposed to download the workshop file at the ContentID in the corresponding array X position, and stop when fileNumber("steamChecker") == numberOfFiles("steamChecker") but I get the statusErrorFailedToDownloadFile message again. I think what was preventing the error from appearing this time was comparing the fileNumber value to the number of lines, and since there were no lines, it basically started out finished.
Lemme know if you want a key. ;)Quote:
Sorry I can't test your app, it doesn't display anything on my machine (I guess because I don't own the Steam app?), but I'm pretty sure this works (I tried with a simple Download File action from the value that's in your example, via a List line data, and I didn't get the error message).
Hmm, it doesn't display anything in the list box even after activating the product. Is this normal? How can I test it?
I was having that same problem too. It does if you convert the values to strings and add them as a line, but not if you add line data.
Make sure though that you've gone over to workshop and subscribed to one or two items, because the Steam object's loop looks specifically for subscribed items, not all items.
Yes you have to add a line before being able to set its data. But anyway I'm trying to test the Array solution, I add the item ID to the list at the same time just to see it on screen, but after suscribing to 3 items it doesn't list anything (I've added a counter that is incremented on each loop, just to be sure). I'm using the first example you posted.
Alright I spiced things up a little bit, the results are the same but the data is a little clearer. It now starts with an Add Line function, which lists the Workshop item title. Each line stores the ContentID number, but they're still coming out negative. I also added a counter at top to display the ContentID.
Here's the updated MFA, it should work as is but just in case make sure the Steam AppID is set to 1087050.