I don't know what to do with this script.
jmnevil54
29 Dec 2017, 20:20I tried making a script to control the spawn rate of the monsters. I don't know what I'm doing wrong.
Nothing is working. Well, the "after entering room" script is working, but nothing else is working.
Here is the code, I guess.
Start script
Ffgh
game.spawn = false
game.spawncount = 0
game.count2 = 0
if (game.count2 = 1) {
game.spawn = false
}
game.change => {
if (game.count2 = 2) {
game.spawn = false
}
if (game.count2 = 3) {
game.spawn = false
}
}
game.change2 => {
if (game.count2 = 4) {
game.count2 = 0
}
}
player.changed3 => {
if (player.count2 > 6) {
msg ("Hits points now " + player.hitpoints)
msg ("You are dead!")
}
}
player.critdesc = "You attack #target# with your bare hands and get a critical (#hits# hits)."
player.attackdesc = "You attack #target# with your bare hands and hit (#hits# hits)."
player.missdesc = "You swing wildly and entirely miss #target#."
Enter and spawn script
Dfhhj
firsttime {
game.spawn = false
}
if (game.spawn = false) {
SpawnZombie (this)
}
game.count2 = game.count2 + 1
Any help is appreciated. Thanks.

K.V.
29 Dec 2017, 23:24The start script doesn't set any of those attributes up?
They're set up on my first turn when I drop that script into a fresh game.
"You attack #target# with your bare hands and get a critical (#hits# hits)."
I don't know what this is supposed to do, unless you meant to put:
"You attack "+target+" with your bare hands and get a critical ("+hits+" hits)."
...but that will only work if called by a script where two local variables are defined: target
and hits
. (I'm not saying it's not. Just a word of warning.)
What is it doing, and what is it not doing?
jmnevil54
29 Dec 2017, 23:39The player descriptions are extra. Forget them.
I'll quote myself. "Well, the "after entering room" script is working, but nothing else is working." Yeah, a few of the attributes cannot be set to a script, and/or are not working.
And just wondering, how is your new save system coming along? Is it working?

K.V.
29 Dec 2017, 23:54How are you calling game.change, game.change2, and player.changed3?
And is it spawning something when game.spawn = false
?
I wasn't messing with a save system.
I was messing with a transcript function, and a way to save the Log's text to a file automatically. (They both work, thanks to mrangel!)
I think maybe Anonynn was talking about a save system, but I'm just guessing.
jmnevil54
30 Dec 2017, 00:04@The anonynn Oh, cool.
Well, what it was supposed to do, was to only spawn zombies when 'game.spawn = false'. The other types of code were just me trying and failing to get this all to work. I tried putting it in the initialisation script to, but nothing.

K.V.
30 Dec 2017, 00:19Add this to the scripts when you think game.spawn
should be false
:
msg("<hr/>DEBUGGING: game.spawn = "+game.spawn+"<hr/>")
It will print:
DEBUGGING: game.spawn = true
OR
DEBUGGING: game.spawn = false
jmnevil54
30 Dec 2017, 00:38I already know it's not working. But I'll give it a go anyway.
jmnevil54
30 Dec 2017, 00:48Yeah. The game knows what game.spawn is. But it won't set to game.spawn = false when it should.
I also made a command called 'Check1', that prints:
msg ("You are count " + game.count2 + ".")
when typed in.
The count2 counter does not reset either.

K.V.
30 Dec 2017, 01:01In the start script, put this:
game.changedspawn => {
msg("game.spawn just changed to "+game.spawn)
Log("game.spawn just changed to "+game.spawn)
}

K.V.
30 Dec 2017, 01:08The Log won't help you online, of course.
You could do:
JS.alert("game.spawn = "+game.spawn)
(Those popups will probably drive you crazy, though!)
You could also put that on a game turn script, if you wanted to really get down and dirty.
jmnevil54
30 Dec 2017, 01:11I said I already did that.
I just put the message in the "on enter" script, after everything else.

K.V.
30 Dec 2017, 01:20Oh, whoops!
I missed it when you said you got it.
Rock on!
jmnevil54
30 Dec 2017, 01:27What.
It's still broken. (I have to remember to say "did that" and not "got it"...)
None of the scripts in the start script are working, so I was just seeing if someone had a second solution.
Can you set a script to another script with JavaScript?

K.V.
30 Dec 2017, 03:51Can you set a script to another script with JavaScript?
Err...
Umm...
Yeah? But it's best to avoid it.
You'd need to set up a normal function in Quest (preferrably with only one parameter), then call the function via an ASLEvent()
from JS (which is being called from Quest through some Chromium browser interface thingy)...
Wait.
Okay. My brain froze up for a second. What were we talking about?
Oh yeah!
<function name="JsTest" parameters="param">
msg("DEBUGGING MESSAGE: Running JsTest")
msg("DEBUGGING MESSAGE: JsTest("+param+")")
game.js_test_variable = param
msg("DEBUGGING MESSAGE: game.js_test_variable is now set to: "+game.js_test_variable+".")
</function>
Then, you use JS to pass the string you enter through an ASLEvent to the Quest function:
JS.ASLEvent("JsTest","Hello, jmne!")
OR
JS.eval("ASLEvent('JsTest','Hello,jmne!');")
OR
JS.eval("var testVar = prompt('Enter the test variable.');ASLEvent('JsTest',testVar);")
OR, if you actually want a JS function defined:
JS.eval("setTestVar = function(tstVar){ASLEvent('JsTest',tstVar);};")
After that, you could simply:
JS.setTestVar("Hello, jmne!")
Then, after about 1 or 2 seconds, you could:
msg(game.js_test_variable)
...and that should print:
Hello, jmne!
K.V.
30 Dec 2017, 04:03More on point, what are you doing with those attributes?
How are they being called?
You are setting them up in the start script, but none of the code you've posted calls any of them.
- game.change
You would have to do something likeinvoke(game.change)
to run this (I think).
- game.change2
You would have to do something likeinvoke(game.change2)
to run this one, too (again, I think).
- game.changed3
If you have an attribute named game.3 (which you might, but I don't think Quest will allow numbers for attribute names), this would run that script when game.3 changed.
jmnevil54
30 Dec 2017, 04:24So is game.changed3 right then?
What's the difference? I can't tell the difference.

K.V.
30 Dec 2017, 04:39Do you have a game.3 set up?
jmnevil54
30 Dec 2017, 12:01Oh... Is it only the name that's messed up?
My bad... I may have to experiment more...

K.V.
30 Dec 2017, 14:19Hrmm?
I didn't say that...
I was asking if game.3 is a thing. If it isn't, game.changed3 has no game.3 to watch to see if its value changes.
jmnevil54
30 Dec 2017, 18:45Alright. I have this now.
game.spawn = false
game.spawncount = 0
game.count2 = 0
if (game.count2 = 1) {
game.spawn = false
}
game.change => {
if (game.count2 = 2) {
game.spawn = false
}
if (game.count2 = 3) {
game.spawn = false
}
}
game.changedcount2 => {
if (game.count2 = 4) {
game.count2 = 0
}
}
I still don't know what I'm doing. What do I have to set now?
jmnevil54
31 Dec 2017, 03:06Hey.
Please explain this. (And I don't think invoke is an actual function...)
You would have to do something like invoke(game.change) to run this (I think).

K.V.
31 Dec 2017, 05:58You're setting up game.change as a script attribute:
game.change => {
if (game.count2 = 2) {
game.spawn = false
}
if (game.count2 = 3) {
game.spawn = false
}
}
When does Quest call this script?
How does it ever run?
invoke
is a script that runs a script.
http://docs.textadventures.co.uk/quest/scripts/invoke.html
So, I have no idea how game.change is called during your game (if ever), and I was pointing out that one way to do that would be invoke(game.change)
.
Of course, you'd probably have to check the debugger to see if game.count2 was 2
or 3
(or something else), and if it then set game.spawn to false
when applicable.
Instead of all that code you've got, I'd try:
game.spawn = false
game.spawncount = 0
game.count2 = 0
game.changedcount2 => {
switch(game.count2){
case(1,2,3){
game.spawn = false
}
case(4){
game.count2 = 0
}
}
}
NOTE: I'm not sure what your code is doing, but, if you've got the basics correct, this should work.
jmnevil54
01 Jan 2018, 00:48It's not working when I paste it in.
It just says error.
invoke (script)
hegemonkhan
01 Jan 2018, 09:28usage of 'invoke' and 'do' Scripts/Functions:
invoke (NAME_OF_OBJECT.NAME_OF_SCRIPT_ATTRIBUTE)
for example:
invoke (game.start)
invoke (NAME_OF_SCRIPT_Variable)
for examples:
// I think this works but it might not:
script_variable = game.start
invoke (script_variable)
// this does work:
script_variable => msg ("hi")
invoke (script_variable)
do (NAME_OF_OBJECT, "NAME_OF_SCRIPT_ATTRIBUTE")
for example:
do (game, "start")
// or:
object_variable = game
script_name_as_string_variable = "start"
do (object_variable, script_name_as_string_variable)
make sure your input for the 'invoke' and/or 'do' is an actual/existing Script VARIABLE in your game and that you're correctly doing its syntax properly.

K.V.
01 Jan 2018, 21:23Sorry, I've been flu-ridden (it's my first flu, too, and it SUCKS).
...and HK is awesome for explaining invoke()
. (You the man, HK!)
I was only pointing out that scripts were created (like game.change), but never called. Then, I explained how to call a script. (You could invoke(game.change)
.)
Again, though, I don't think this will help you here.
I believe you can change your script:
game.spawncount = 0
game.count2 = 0
if (game.count2 = 1) {
game.spawn = false
}
game.change => {
if (game.count2 = 2) {
game.spawn = false
}
if (game.count2 = 3) {
game.spawn = false
}
}
game.changedcount2 => {
if (game.count2 = 4) {
game.count2 = 0
}
}
to this:
game.spawn = false
game.spawncount = 0
game.count2 = 0
game.changedcount2 => {
switch(game.count2){
case(1,2,3){
game.spawn = false
}
case(4){
game.count2 = 0
}
}
}
jmnevil54
01 Jan 2018, 21:30K V That doesn't work either. The formatting is off.

K.V.
01 Jan 2018, 21:37What formatting is off?
It drops right in for me.

K.V.
01 Jan 2018, 23:08Try this one with debugging messages:
game.spawn = false
game.spawncount = 0
game.count2 = 0
game.changedcount2 => {
msg ("DEBUGGING: Calling game.changedcount2.")
msg ("DEBUGGING: game.count2 is now: "+game.count2)
switch (game.count2) {
case (1,2,3) {
game.spawn = false
}
case (4) {
game.count2 = 0
}
}
msg ("DEBUGGING: game.spawn = "+game.spawn)
}

K.V.
01 Jan 2018, 23:10If that doesn't work in your game, try this example game to see it all working:
<!--Saved by Quest 5.7.6404.15496-->
<asl version="550">
<include ref="English.aslx" />
<include ref="Core.aslx" />
<game name="test">
<gameid>f36c14c6-3d92-482f-bb2d-96361074cb7b</gameid>
<version>1.0</version>
<firstpublished>2018</firstpublished>
<start type="script"><![CDATA[
JS.setCommands ("increase count2")
game.spawn = false
game.spawncount = 0
game.count2 = 0
game.changedcount2 => {
msg ("DEBUGGING: Calling game.changedcount2.")
msg ("DEBUGGING: game.count2 is now: "+game.count2)
switch (game.count2) {
case (1,2,3) {
game.spawn = false
}
case (4) {
game.count2 = 0
}
}
msg ("DEBUGGING: game.spawn = "+game.spawn)
}
]]></start>
<commandpane />
</game>
<object name="room">
<inherit name="editor_room" />
<description><![CDATA[{command: Increase count2}<br/><br/>]]></description>
<object name="player">
<inherit name="editor_object" />
<inherit name="editor_player" />
</object>
</object>
<command name="inc_cnt2">
<pattern>increase count2</pattern>
<script>
game.count2 = game.count2 + 1
</script>
</command>
</asl>

K.V.
02 Jan 2018, 13:03Did you get it working?
jmnevil54
02 Jan 2018, 19:08Part way working. The count2 is finally resetting. Don't know why. Your code still is not working.

K.V.
03 Jan 2018, 11:41Did you edit in full Code View?
If so, it needs to be CDATA:
<start type="script"><![CDATA[
JS.setCommands ("increase count2")
game.spawn = false
game.spawncount = 0
game.count2 = 0
game.changedcount2 => {
msg ("DEBUGGING: Calling game.changedcount2.")
msg ("DEBUGGING: game.count2 is now: "+game.count2)
switch (game.count2) {
case (1,2,3) {
game.spawn = false
}
case (4) {
game.count2 = 0
}
}
msg ("DEBUGGING: game.spawn = "+game.spawn)
}
]]></start>
But, if you have it working, it's probably wise not to mess with it. (I just realized that CDATA was probably what was getting you.)
hegemonkhan
03 Jan 2018, 17:55I used to do it like 'KV', but now I prefer to do it like this:
I like showing it like this, just so they can see that the 'cdata' is containing the scripting, and so I can easily check/see if I messed up any of the syntax with it (missing: ']', '[', '!', etc, usually, lol) and/or completely forgot to add the 'cdata' if/when it's needed (lol), but it takes up more lines, but it makes it easier to read and spot-mistakes:
<start type="script">
<![CDATA[
JS.setCommands ("increase count2")
game.spawn = false
game.spawncount = 0
game.count2 = 0
game.changedcount2 => {
msg ("DEBUGGING: Calling game.changedcount2.")
msg ("DEBUGGING: game.count2 is now: "+game.count2)
switch (game.count2) {
case (1,2,3) {
game.spawn = false
}
case (4) {
game.count2 = 0
}
}
msg ("DEBUGGING: game.spawn = "+game.spawn)
}
]]>
</start>

K.V.
03 Jan 2018, 21:38Well...
Quest does that, not me.
I can make a new game and paste in HK's start script:
<asl version="550">
<include ref="English.aslx"/>
<include ref="Core.aslx"/>
<game name="NewTest (CDATA)">
<gameid>cec840ed-55f9-4793-b3bd-d3272554c160</gameid>
<version>1.0</version>
<firstpublished>2018</firstpublished>
<start type="script">
<![CDATA[
JS.setCommands ("increase count2")
game.spawn = false
game.spawncount = 0
game.count2 = 0
game.changedcount2 => {
msg ("DEBUGGING: Calling game.changedcount2.")
msg ("DEBUGGING: game.count2 is now: "+game.count2)
switch (game.count2) {
case (1,2,3) {
game.spawn = false
}
case (4) {
game.count2 = 0
}
}
msg ("DEBUGGING: game.spawn = "+game.spawn)
}
]]>
</start>
</game>
<object name="room">
<inherit name="editor_room" />
<object name="player">
<inherit name="editor_object" />
<inherit name="editor_player" />
</object>
</object>
</asl>
After switching back to GUI and adding something (in this case, I enabled the commands pane, but I just did a different test where I only added a room description, and it still does the same thing), Quest turns it into this:
<!--Saved by Quest 5.7.6404.15496-->
<asl version="550">
<include ref="English.aslx" />
<include ref="Core.aslx" />
<game name="NewTest (CDATA)">
<gameid>cec840ed-55f9-4793-b3bd-d3272554c160</gameid>
<version>1.0</version>
<firstpublished>2018</firstpublished>
<start type="script"><![CDATA[
JS.setCommands ("increase count2")
game.spawn = false
game.spawncount = 0
game.count2 = 0
game.changedcount2 => {
msg ("DEBUGGING: Calling game.changedcount2.")
msg ("DEBUGGING: game.count2 is now: "+game.count2)
switch (game.count2) {
case (1,2,3) {
game.spawn = false
}
case (4) {
game.count2 = 0
}
}
msg ("DEBUGGING: game.spawn = "+game.spawn)
}
]]></start>
<commandpane />
</game>
<object name="room">
<inherit name="editor_room" />
<object name="player">
<inherit name="editor_object" />
<inherit name="editor_player" />
</object>
</object>
</asl>
hegemonkhan
03 Jan 2018, 23:51oh... my bad... didn't realize this was because of quest's formatting-reversion (I hate it too... which is why I avoid toggling between the GUI/Editor and Code View modes).
my apologies, KV.
(I like the format, as I think it's easier for new people to read/understand it. When I first started coding, I liked being as concise as possible with my code lines, but now I like having spacing and etc stuff to make it easier to see/read/edit/understand/etc)

K.V.
04 Jan 2018, 00:54Oh, you're cool, HK!
...and you're definitely right about the spacing making it easier to see what is actually happening.
jmnevil54
04 Jan 2018, 03:26Oh, you were right, K.V.! IT FINALLY WORKS NOW!
Thank you, everyone!
hegemonkhan
04 Jan 2018, 03:59anytime you work in code, and you use the '<' and/or '>' characters/symbols in your scripting, you need to put in the 'cdata' tags

K.V.
04 Jan 2018, 09:10Whoo-hoo!
I'm also pretty sure (to tack on to HK's knowledge-nugget) that you can make something CDATA that doesn't need to be, and Quest won't mind at all. (I like safety nets!)
jmnevil54
04 Jan 2018, 16:47I'm using the online version still, by the way...