Basic interactive plant script
This is a CAOS tutorial in the form of an in-depth analysis of an agent.
This plant script uses a few basic variables and is coded so that creatures can push, pull or hit the plant, with the appropriate stimulus attached, so that creatures are rewarded for playing with plants. The plant itself will grow and ungrow wherever it lands, and never die. Unlike the basic plant script, this plant's growth script does not use subroutines, and instead, relies on valid logic statements to give another approach to solving the problems associated with growing plants with CAOS. It's useful to use the CAOS Tool or another highlighting tool because they can make the CAOS syntax easier to read.
CAOS2PRAY is a feature included with RProgrammer's Jagent which allows the coder to not have to code a separate PRAY file in their agents. This chunk of code goes at the top of the COS file, and when it is dragged and dropped onto Monk, compiles the cos file, with its dependant sprite file, into an agent that will be easy for everyone to install and play with. For more details on CAOS2PRAY, see CAOS2PRAY: An Easier Way by Amaikokonut.
**CAOS2PRAY *# Pray-File "BasicInteractivePlant.agents" *# C3-Name "Basic Interactive Plant" *# attach sharmflower.c16 *# desc = "A basic plant that grows and ungrows, and creatures can interact with. Injects into the C3 Norn Terrarium." *# Agent Animation File = "sharmflower.c16" *# Agent Animation String = "0 1 2 3 4 5 4 3 2 1 255" *# Agent Sprite First Image = 0 *# Agent Animation Gallery = "sharmflower" *# Web URL = "creatures.wiki" *# Web Label = "Creatures Wiki"
The Install Script
NEW: SIMP line, installing a plant with the class number 2 4 1000, using the first 6 images in the sprite named File:Sharmflower.c16, and installing it in a random plane between 200 and 6000. A common error that can be introduced here is "Pose change failed", caused by miscounting the amount of images that are being used, by not including image #0. An alternative to using the .c16 provided is to use the spritesheet above to the right with the blue border and use "Automatic Cut" after pasting it into SpriteBuilder.
new: simp 2 4 1000 "sharmflower" 6 0 rand 200 6000
setv ov00 0
OV99 - an object variable we're going to use as an age counter, counts the amount of time spent in a mature state.
setv ov99 0
The timer script will run every 10 to 50 in-game seconds.
tick rand 200 1000
Ending the '5 plants' REPS loop
The Push Script
scrp 2 4 1000 1
Stimulating the creature who pushed the plant with stimulus # 84: played with friendly plant.
stim writ from 84 1
The Pull Script
scrp 2 4 1000 2
Stimulating the creature who pulled the plant with stimulus # 84: played with friendly plant.
stim writ from 84 1
The Timer Script
Just as a reminder, this will run at a random point between 10 to 50 seconds. This timer script does not use subroutines, and relies on valid logic statements.
scrp 2 4 1000 9
ov00 is the plant state: whether it is growing UP or down (going forwards or backwards in its growth animation). If ov00 is 0, the plant will grow UP.
doif ov00 eq 0
This uses a temporary variable (va00) to step up through the poses if it is less than 5, the mature flower.
Because the state (ov00) is growing UP, but the pose of the plant is NOT less than 5, the plant must be mature, so adding to its age counter (ov99) allows it to remain in a mature pose.
addv ov99 1
End the check if the plant's pose is less than mature.
Check how long we've been mature and counting up the age counter (ov99): if it's equal to 50, the plant has been mature for too long now, prepare to become immature.
doif ov99 eq 50
Setting the state (ov00) to 1 to signal that the plant is now growing down (stepping backwards through its growth animation).
setv ov00 1
Ending the age check (ov99) for the plant.
Ending the check if the state (ov00) is 0.
If the state (ov00) is 1,
doif ov00 eq 1
and if the pose is greater than 0
doif pose gt 0
Subtract 1 from the pose.
setv va00 pose subv va00 1 pose va00
If the pose is not greater than 0 (then it must be 0)
Reset the age counter and the plant state, ready for the next growth cycle.
setv ov99 0 setv ov00 0
end the pose check
end the state check
end the timer script.
The Hit Script
This script reuses two pieces of code from previous scripts: it stimulates whoever hit the plant as per the push script, and it uses a bit of code repeated from the timer to make the plant grow down (regress to an immature state) if it is hit when it is more than just a seedling. Note the use of TARG OWNR between the two to make sure that the plant itself will change pose.
scrp 2 4 1000 3 stim writ from 84 1 targ ownr doif pose gt 0 setv va00 pose subv va00 1 pose va00 endi endm
The Removal Script
This simply counts through all the objects in the world with that class number, removes them, and then removes the scripts that belong to that class number. It's important to double-check that the class numbers here match the class numbers you've been using all along, and make sure that all SCRPs in the object have a corresponding scrx. If the class numbers here do not match the ones you've been using, you might accidentally delete some other object in the player's world, or silently delete another object's scripts, which would be hard for someone to fix!
**CAOS2PRAY *# Pray-File "BasicInteractivePlant.agents" *# C3-Name "Basic Interactive Plant" *# attach sharmflower.c16 *# desc = "A basic plant that grows and ungrows, and creatures can interact with. Injects into the C3 Norn Terrarium." *# Agent Animation File = "sharmflower.c16" *# Agent Animation String = "0 1 2 3 4 5 4 3 2 1 255" *# Agent Sprite First Image = 0 *# Agent Animation Gallery = "sharmflower" *# Web URL = "creatures.wiki" *# Web Label = "Creatures Wiki" inst reps 5 new: simp 2 4 1000 "sharmflower" 6 0 rand 200 6000 attr 192 bhvr 11 elas 0 setv ov00 0 setv ov99 0 tick rand 200 1000 doif tmvt rand 1740 2740 674 eq 1 mvto rand 1740 2740 674 endi repe *push script scrp 2 4 1000 1 stim writ from 84 1 endm *pull script scrp 2 4 1000 2 stim writ from 84 1 endm *timer script scrp 2 4 1000 9 *Grow UP doif ov00 eq 0 doif pose lt 5 setv va00 pose addv va00 1 pose va00 else *remain in a mature pose, add to age counter. addv ov99 1 endi *you've been mature for too long now, prepare to become immature. doif ov99 eq 50 setv ov00 1 endi endi *grow DOWN doif ov00 eq 1 doif pose gt 0 setv va00 pose subv va00 1 pose va00 else *Reset plant setv ov99 0 setv ov00 0 endi endi endm *Hit script scrp 2 4 1000 3 stim writ from 84 1 *this makes sure that the plant itself is targeted to change pose. targ ownr *the plant grows DOWN if it is hit. doif pose gt 0 setv va00 pose subv va00 1 pose va00 endi endm *REMOVE ME rscr enum 2 4 1000 kill targ next scrx 2 4 1000 1 scrx 2 4 1000 2 scrx 2 4 1000 9 scrx 2 4 1000 3
- Change the genus to be a bad plant (2 5 1000 instead of 2 4 1000) and change all three stimuli to 83, "Danger plant", instead of 84, "Friendly plant".
- Search on OpenGameArt.org or take inspiration from the Creating Agent Art tutorial to make a new sprite for your plant.
- Make the plant appear in a different metaroom. Use the keyboard shortcut CTRL + SHIFT + X to explore different coordinates.
- Try using the Constructor Script (10) to hold various values for the plant.
- To simulate ungrowing to death, an additional, pure black, sprite could be added to the C16 file as sprite #0 to allow the plant to vanish, and the number used to note the peak of the plant's growth and the number of images from the sprite file used in the NEW: SIMP line would both need to be changed.
- See the Full Lifecycle Plant script for an object that uses similar logic statements to grow, wait and then grow old and die, rather than grow and ungrow forever as this example plant does.