Adding a script fragment to an existing script

SoonGames
10 Oct 2017, 02:01Hi community.
Is there a way to add something to a script fragment, such as object.changedparent? Like a variable:
string = string + "Contents"
script = script + => Addscript
object. changedparent = object. changedparent + => Script
salutation
SoonGames
hegemonkhan
10 Oct 2017, 02:22(filler for getting my edited post. updated/posted)
(finally a topic that I can help with pretty well, for once, hehe)
yes, it involves using 'Delegates', here's documentation:
http://docs.textadventures.co.uk/quest/types/using_delegates.html
https://docs.textadventures.co.uk/quest/elements/delegate.html
http://docs.textadventures.co.uk/quest/scripts/rundelegate.html
http://docs.textadventures.co.uk/quest/functions/rundelegatefunction.html
http://docs.textadventures.co.uk/quest/functions/hasdelegateimplementation.html
(after I learned how delegates work... I now hardly ever use Functions, as I like working with Objects for encapsulation and organization, hehe)
basically a delegate is like a 'prototype' but for Script Attributes instead of functions
and the delegate enables a Script Attribute to have the same functionality as a Function (parameters and/or returning a value)
here's an example of it:
(this is using an Integer Parameter VARIABLE, but you can use an Object Parameter VARIABLE, for what you want to do in your OP, or any of the Data/Attribute Types: Strings/Doubles/Booleans/Lists/Dictionaries/Integers/Objects, just like with a Function)
<include ref="English.aslx" />
<include ref="Core.aslx" />
<!--
This is a good location for Delegates, to ensure they get compiled first, so you can then use them (without/no errors):
-->
<delegate name="two_integers_and_return_delegate" type="int" parameters="integer_parameter_1, integer_parameter_2" />
<!--
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-->
<game name="example_game">
<attr name="start" type="script">
msg ("Addition Result: " + addition_script_attribute (5, 10))
msg ("Multiplication Result: " + multiplication_script_attribute (5, 10))
</attr>
<attr name="addition_script_attribute" type="two_integers_and_return_delegate">
return (integer_parameter_1 + integer_parameter_2)
</attr>
<attr name="multiplication_script_attribute" type="two_integers_and_return_delegate">
return (integer_parameter_1 * integer_parameter_2)
</attr>
</game>
// output/results:
Addition Result: 15
Multiplication Result: 50
hegemonkhan
10 Oct 2017, 02:39yes, you can do concatenation:
(simple/quick example)
string_variable = "Hi"
string_variable = string_variable + ", my name is HK"
msg (string_variable)
// output/result:
Hi, my name is HK
you can also use the 'set' Function:
string_variable = "Khan"
set (player, "alias", "Hegemon" + string_variable)
msg (player.alias)
// output/results:
HegemonKhan
for scripting / script Attributes, you can use the 'do' Function for doing concatenation:
(just a quick example)
// Thanks KV for the correction (was missing the curly braces):
joe.run_laps_script_attribute => { msg (this.name + " runs laps") }
jim.run_laps_script_attribute => { msg (this.name + " runs laps") }
game.my_objectlist_attribute = NewObjectList ()
list add (game.my_objectlist_attribute, joe)
list add (game.my_objectlist_attribute, jim)
string_variable = "run_laps"
foreach (object_variable, game.my_objectlist_attribute) {
do (object_variable, string_variable + "_script_attribute")
}
// output/results:
joe runs laps
jim runs laps
but I'm not sure about the 'Script Attribute' stuff... hopefully someone else can help with it...

K.V.
10 Oct 2017, 03:12I know you can make a script like this:
game.myScript => {
ClearScreen
msg ("Blah, blah, blah...")
}
Then, you can:
myOldScript = game.myScript
...but I don't know if you can add on to the script like you can a string.
Pertex
10 Oct 2017, 06:12You want to create scripts at runtime? Uuuu... A cold shiver runs down my spine. :-)
mrangel
10 Oct 2017, 08:38If you just want to add something to the default script, it'd be easier to copy the default script into your code.
Or this.oldchangedparent = this.changedparent
, and then set a new script which does do (this, "oldchangedparent")
at the end.
If you might be adding multiple scripts, here's a way to do it…
(warning: this is massive overkill for anything you are really likely to want)
if (not HasAttribute(this, "listchangedparent")) {
this.listchangedparent = NewList()
if (HasScript(this, "changedparent")) {
list add (this.listchangedparent, this.changedparent)
}
this.changedparent => {
parameters = NewDictionary()
if (IsDefined("oldvalue")) {
dictionary add (parameters, "oldvalue", oldvalue)
}
for (i, 0, ListCount(this.listchangedparent)-1) {
set (this, "scriptpart_changedparent"+i, ListItem(this.listchangedparent, i))
do (this, "scriptpart_changedparent"+i, parameters)
}
}
}
newscript => {
// Script you want to add goes here
}
list add (this.listchangedparent, newscript)
(In the past I've looped over a list of scripts calling them with invoke
; in this case it's probably easier to add them to numbered script attributes so that they can all use this
normally. But it's easier to add/remove/check-existence for lists, so easier to keep them in a list and then map onto the numbered attributes when they're needed)