"How do I ZScript?"

Ask about ACS, DECORATE, ZScript, or any other scripting questions here!

Moderator: GZDoom Developers

Forum rules
Before asking on how to use a ZDoom feature, read the ZDoom wiki first. If you still don't understand how to use a feature, then ask here.

Please bear in mind that the people helping you do not automatically know how much you know. You may be asked to upload your project file to look at. Don't be afraid to ask questions about what things mean, but also please be patient with the people trying to help you. (And helpers, please be patient with the person you're trying to help!)
Blue Shadow
Posts: 5032
Joined: Sun Nov 14, 2010 12:59 am

Re: "How do I ZScript?"

Post by Blue Shadow »

ramon.dexter wrote:How do I use random number in Damage property of projectile? When i put in 'random(1,10);', it returns error, that even numbers has to be used :(
Use DamageFunction instead of Damage as the property.
User avatar
Major Cooke
Posts: 8196
Joined: Sun Jan 28, 2007 3:55 pm
Preferred Pronouns: He/Him
Location: QZDoom Maintenance Team

Re: "How do I ZScript?"

Post by Major Cooke »

Just be warned, changing the damage from then on out will remove the damagefunction and it'll be based on damage*1d8! At least that's what it looks like from the source code.
User avatar
cambertian
Posts: 344
Joined: Thu May 07, 2015 4:24 pm
Graphics Processor: nVidia with Vulkan support
Location: New England Area, USA

Re: "How do I ZScript?"

Post by cambertian »

If I'm trying to make an inventory item that should only be picked up if, say, the player doesn't have item X in his inventory, which virtual function should I override - HandlePickup, TryPickup, TryPickupRestricted, CanPickup, or ShouldStay?
I've been trying HandlePickup already, but even when it returns false it seems to get added to the inventory...
ZippeyKeys12
Posts: 111
Joined: Wed Jun 15, 2016 2:49 pm

Re: "How do I ZScript?"

Post by ZippeyKeys12 »

Is it possible to detect multiple simultaneous key-presses inside of InputProcess? Set booleans when buttons are pressed and remove when released—Thanks Gutawer

Also is it possible to register an EventHandler while the game is running? I recall seeing ZZYZX mention this, but I can't seem to figure it out. :?

Any help would be appreciated :)

EDIT: Also, is it not possible to put a constant array in a struct?
EDIT 5: Can I access a variable in an EventHandler from my StatusBar?

EDIT 2: Is there no way to do exponents? exp(x) is only e^x ** Operator—Thanks Gutawer again
EDIT 3: I guess I know nothing. Does cos(x) have a relatively significant performance cost like sqrt(x)? Don't bother micro-optimizing—Thanks Gutawer again
EDIT 4: And is there a way to get pi? Set it as a constant because it's close enough—Thanks Apeirogon
Last edited by ZippeyKeys12 on Sun Nov 05, 2017 7:45 pm, edited 2 times in total.
User avatar
Apeirogon
Posts: 1606
Joined: Mon Jun 12, 2017 12:57 am

Re: "How do I ZScript?"

Post by Apeirogon »

ZippeyKeys12 wrote: EDIT 4: And is there a way to get pi?
TL:DR Just define its as constant.
Pi is irrational transcendent number and cant be evaluate like 2+2, just approximately defined to some decimal number. Even if you planing use eulers identity to find n roots of number (why?),pi=3.141596 and e=2.718281828 would be more than satisfaing aproximation, because other number in gzdoom may, and would, be defined with musch less precision.

How make a_chase function more "intelligent", because, as example, monster hard to find entrance into small corridor where stand player?
ZippeyKeys12
Posts: 111
Joined: Wed Jun 15, 2016 2:49 pm

Re: "How do I ZScript?"

Post by ZippeyKeys12 »

Apeirogon wrote:How make a_chase function more "intelligent", because, as example, monster hard to find entrance into small corridor where stand player?
If you're making a map then check this out:viewtopic.php?f=105&t=58168 else idk maybe try using hitscans or actors to try and plot out the map and try every path to find the player?
User avatar
Gutawer
Posts: 469
Joined: Sat Apr 16, 2016 6:01 am
Preferred Pronouns: She/Her

Re: "How do I ZScript?"

Post by Gutawer »

ZippeyKeys12 wrote: EDIT 2: Is there no way to do exponents? exp(x) is only e^x
EDIT 3: I guess I know nothing. Does cos(x) have a relatively significant performance cost like sqrt(x)?
2: Use the ** operator.
3: Even sqrt() doesn't have a massive performance impact unless you're calling it a lot, so I wouldn't assume that cos() has any significant performance impact either. Don't try and optimise until your code is running slowly, because otherwise you get messy micro-optimised code which is a pain to read.
User avatar
ramon.dexter
Posts: 1562
Joined: Tue Oct 20, 2015 12:50 pm
Graphics Processor: nVidia with Vulkan support
Location: Kozolupy, Bohemia

Re: "How do I ZScript?"

Post by ramon.dexter »

OK, how does replaces excatly work in zscript?

Let's say, I have a weapon, here:

Code: Select all

class staffBlaster : Weapon replaces RocketLauncher
But I can find rocket launcher where it should be in map (better said: It is not replaced). Relacers for rocketammo works as expected, replacers for other weapons work as expected, but the replacer for rocketlauncher just dont work. What am I doing wrong?
Blue Shadow
Posts: 5032
Joined: Sun Nov 14, 2010 12:59 am

Re: "How do I ZScript?"

Post by Blue Shadow »

Are you loading other mods with yours that replace the rocket launcher (especially ones which to so via DECORATE)?
User avatar
ramon.dexter
Posts: 1562
Joined: Tue Oct 20, 2015 12:50 pm
Graphics Processor: nVidia with Vulkan support
Location: Kozolupy, Bohemia

Re: "How do I ZScript?"

Post by ramon.dexter »

No. I'm testing the mod only with basic doom2. And it really suprises me, since the shotgun IS replaced, the armor is replaced, but the rocketlauncher sits there and smiles on me :)
ZippeyKeys12
Posts: 111
Joined: Wed Jun 15, 2016 2:49 pm

Re: "How do I ZScript?"

Post by ZippeyKeys12 »

Is your rocket launcher in a separate file that you forgot to #include?
Maybe something is left over in AutoLoad?
User avatar
ramon.dexter
Posts: 1562
Joined: Tue Oct 20, 2015 12:50 pm
Graphics Processor: nVidia with Vulkan support
Location: Kozolupy, Bohemia

Re: "How do I ZScript?"

Post by ramon.dexter »

Yup. forget to remove the rocketlaucnher replacer/remover that I put in and completely forgot about :)
User avatar
Rip and Tear
Posts: 186
Joined: Tue May 02, 2017 3:54 pm

Re: "How do I ZScript?"

Post by Rip and Tear »

What is the practical effect of the identifier in the random number functions (wiki)?
ZippeyKeys12
Posts: 111
Joined: Wed Jun 15, 2016 2:49 pm

Re: "How do I ZScript?"

Post by ZippeyKeys12 »

Rip and Tear wrote:What is the practical effect of the identifier in the random number functions (wiki)?
From what I can tell, it seems as if running random functions under a specific identifier could somehow bias future random functions with that same identifier. So I supposed if one needed a more independent random value they would use a different identifier? :shrug:
Gonna have to see what someone more informed has to say, I'm interested now.
User avatar
Gutawer
Posts: 469
Joined: Sat Apr 16, 2016 6:01 am
Preferred Pronouns: She/Her

Re: "How do I ZScript?"

Post by Gutawer »

The identifier determines which FRandom object is returned internally when parsing the random functions - essentially, each FRandom object is a random number generator which holds an array of "states" (20 states, if interpreted as 32-bit integers). When an RNG function is called, the internal array index is incremented, and the state at that index is returned as a random number. Each FRandom object's states are seperate from the others, meaning that RNGs with different objects act independently of each other. So:

Code: Select all

int num1 = random(0, 10);
int num2 = random(0, 10);
Console.printf("%d, %d", num1, num2);
should act the same as:

Code: Select all

int num1 = random(0, 10);
int throwaway = random[whatever](0, 10);
int num2 = random(0, 10);
Console.printf("%d, %d", num1, num2);

Return to “Scripting”