[Added] RandomPick

Moderator: Developers

RandomPick

Postby Major Cooke » Sat Dec 13, 2014 4:15 pm

A long time ago, I suggested something like this for ZDoom. I've finally programmed it.
Clamps down and returns one of the two numbers entered, and nothing else. To get more results, pick inside of pick can happen:

Code: Select allExpand view
randompick(1,2,9,12)


...to get a result of 1, 2, 9, or 12. Lots of possibilities with this, that's for sure.

Here's the pull request.
Last edited by Major Cooke on Sat Dec 27, 2014 3:54 pm, edited 3 times in total.
User avatar
Major Cooke
Slaughterer of Sewers
 
Joined: 28 Jan 2007
Discord: Major Cooke#0846

Re: RClamp

Postby Graf Zahl » Sat Dec 13, 2014 4:19 pm

I think a better implementation would be to allow an infinite amount of parameters and then randomly select one instead of nesting these calls.
User avatar
Graf Zahl
Lead GZDoom Developer
 
Joined: 19 Jul 2003
Location: Germany

Re: RClamp (Random Clamp)

Postby Gez » Sat Dec 13, 2014 4:29 pm

The name is misleading, that's not a clamp. (Thread title had me scratching my head, what's a random clamp and how could it be useful?)

It's something that randomly picks one of the numbers given, right? Then why not call it pick?

And what Graf said. pick(x, ...)
Gez
 
 
 
Joined: 06 Jul 2007

Re: RClamp (Random Clamp)

Postby Major Cooke » Sat Dec 13, 2014 4:50 pm

Name change: Done. Now Pick.

And I have no idea how I'm going to allow unlimited parameters, truthfully. Mind giving me a hand?
User avatar
Major Cooke
Slaughterer of Sewers
 
Joined: 28 Jan 2007
Discord: Major Cooke#0846

Re: Pick

Postby Nightfall » Sat Dec 13, 2014 5:27 pm

After scanning the initial '(', read in variables until ')' is encountered. Store these in a TArray<FxExpression*> and pass that to FxPick which then processes this further with the casting.

I think 'choose' would make a better name.
User avatar
Nightfall
 
Joined: 06 Aug 2009
Location: Finland

Re: Pick

Postby Major Cooke » Sat Dec 13, 2014 5:43 pm

The question then comes to mind, what if we have something like pick(1,2,(user_somenumber*82))? Wouldn't that throw it off?
User avatar
Major Cooke
Slaughterer of Sewers
 
Joined: 28 Jan 2007
Discord: Major Cooke#0846

Re: Pick

Postby Graf Zahl » Sat Dec 13, 2014 5:57 pm

Not if parsed properly. The ParseExpression functions parse an entire expression and store it as an FxExpression object. This object can be anything, ranging from a constant to some complex constructs that requires several levels of recursion to be evaluated.
User avatar
Graf Zahl
Lead GZDoom Developer
 
Joined: 19 Jul 2003
Location: Germany

Re: Pick

Postby Major Cooke » Sat Dec 13, 2014 7:50 pm

I'm not sure what to do about resolving with the array though. Any ideas?

Here's my code so far. Again, this is... very alien territory for me so it shouldn't be a surprise if I completely screwed the code up entirely. :?

Currently, it doesn't work. Access violation occurs in the Resolve call.

Spoiler:
User avatar
Major Cooke
Slaughterer of Sewers
 
Joined: 28 Jan 2007
Discord: Major Cooke#0846

Re: Pick

Postby Graf Zahl » Sun Dec 14, 2014 3:59 am

You try to get the size of your array by calling min.Max() when you should call min.Size(). Max() returns the amount of reserved memory, not the amount of elements in use.
User avatar
Graf Zahl
Lead GZDoom Developer
 
Joined: 19 Jul 2003
Location: Germany

Re: Pick

Postby Major Cooke » Sun Dec 14, 2014 5:46 am

That did the trick! Thanks Graf! :D

The pull request has been updated.
User avatar
Major Cooke
Slaughterer of Sewers
 
Joined: 28 Jan 2007
Discord: Major Cooke#0846

Re: Pick

Postby Graf Zahl » Sun Dec 14, 2014 6:02 am

Added, but I had to plug a memory leak. You forgot to delete the array's contents.
User avatar
Graf Zahl
Lead GZDoom Developer
 
Joined: 19 Jul 2003
Location: Germany

Re: Pick

Postby Major Cooke » Sun Dec 14, 2014 8:34 am

Aw hell. Sorry. Yeah, I still have a lot to learn.

Thanks for that though!
User avatar
Major Cooke
Slaughterer of Sewers
 
Joined: 28 Jan 2007
Discord: Major Cooke#0846

Re: Pick

Postby D2JK » Tue Dec 16, 2014 10:05 am

Perhaps a dumb question, but is this supposed to work in decorate? For me, using it in an action function makes ZDoom shut down in the startup, without any error message.
D2JK
 
Joined: 30 Aug 2014

Re: Pick

Postby Major Cooke » Tue Dec 16, 2014 11:47 am

Copy and paste your code, and I'll take a look at it. I only really designed this for DECORATE usage though. Whether it works in ACS or not was something I didn't have in mind for this to begin with. This is mainly because I don't want to make Graf clean up after my abysmal mess again. :oops:

If the latter, this is code I used to test it.
Code: Select allExpand view
Actor MM
{
   var int user_t;
   +NOINTERACTION
   States
   {
   Spawn:
      TNT1 A 0 NoDelay A_SetUserVar("user_t",pick(1,4,12,16))
      TNT1 A 0 A_JumpIf(user_t == 1,"s1")
      TNT1 A 0 A_JumpIf(user_t == 4,"s2")
      TNT1 A 0 A_JumpIf(user_t == 12,"s3")
      TNT1 A 0 A_JumpIf(user_t == 16,"s4")
   Err:
      TNT1 A 35 A_PrintBold("Apparently it didnt work.")
      Goto Spawn
   s1:
      TNT1 A 35 A_PrintBold("One")
      Goto Spawn
   s2:
      TNT1 A 35 A_PrintBold("Four")
      Goto Spawn
   s3:
      TNT1 A 35 A_PrintBold("Twelve")
      Goto Spawn
   s4:
      TNT1 A 35 A_PrintBold("Sixteen")
      Goto Spawn
   }
}
User avatar
Major Cooke
Slaughterer of Sewers
 
Joined: 28 Jan 2007
Discord: Major Cooke#0846

Re: Pick

Postby D2JK » Tue Dec 16, 2014 12:15 pm

Decorate.

I used the latest (Dec 16) x64 build in here.

Actually there is an error message, the window just closed so fast I couldn't see it first: "Call to an unknown function Pick".

For example, this code can cause the error:
Spoiler:
D2JK
 
Joined: 30 Aug 2014

Next

Return to Closed Feature Suggestions

Who is online

Users browsing this forum: No registered users and 2 guests