Garden Box Development Guides, posted here in one convenient file since the forums are Very, Very Broken (Thank you, Mea, for bringing this to my attention). Please email questions/concerns/errors to amaikokonut at songua dot com! Thanks!
This is a simple guide to making your agents Garden Box compatible.
First, you just write the agent like any other agent. Eat scripts, growth scripts, flying scripts, whatever.
Then, in the injection script, mvsf your agent to game "ch_x" game "ch_y" to get it to inject where the crosshair is pointing. The agent should not inject unless the crosshair is in a valid position, so you shouldn’t need to worry about backup coords. Really, only extensive testing will tell, but my hope is that no one will have to write tmvt backups.
Really, that is all you need to do in the cosfile itself. The rest of the GB-compatible information is stored in the PRAY file.
You will need to prepare a display sprite no larger than 40x40 (unless you want to be known as “the lazy guy who’s huge sprites mess up my garden box.”). It is recommended that you have a specific sprite prepared for display. You will specify this in your prayfile.
Write your PRAY file as you would any other PRAY file, but keep these differences in mind:
- Use group DSGB “[Agent Name]” not AGNT, not DSAG. The chunk type must be DSGB for the Garden Box to detect it.
- Keep in mind that no two agents can have the same name or they will clash; that collectively includes all standard C3, DS, and GB agents, so it might be a good idea to denote your GB-specific agents with a prefix or suffix to avoid clashes.
- Dependencies, scripts, inline files, etc; are all written in as normal.
- Agent Description is written as normal, but keep in mind there is less space to display it on the Garden Box. Include details in a help file and just keep the description brief.
- "Agent Animation File", "Agent Animation Gallery", and "Agent Sprite First Image" are all still required, though animation itself is not supported (thus, "Agent Animation String" does not need to be included) These will point to your 40x40 display sprite.
- “Web URL”, “Web Icon” and so on are not supported. They won’t blow up anything, no, but they won’t do you any good.
The following new items can be included in your prayfile
“GB_Category” [integer 1-8]
Categories are as follows:
1: Patch Plant
2: Traditional Plant
3: Animal
4: Aquatic Plant
5: Aquatic Animal
6: Decoration
7: Tools
8: Misc/Other
- Take special caution to not accidentally label something as a patch plant or decoration that isn’t one (or vice versa), because agents in these categories are injected differently and are likely to crash the injector if they’re mislabled.
- If you don’t include a category, your agent won’t be able to be filtered. (it will still show up if no filter is applied).
"GB_Category Name" “[name]”
This is not required or even recommended. If your category is defined as a number higher than 8, this will attach a name to that number. Useful for creating your own categories, and annoying people by clashing your categories with theirs and slowing down the filtering process as the game tries to filter all those categories. Use sparingly, if ever.
Agent Author” “[Your Name]”
- Will display next to the agent name. I always wished the regular agent injector had something like this-- it would make tracking authors down a lot easier.
- If you don’t include an Author name, the author will show up as “Unknown.”
Otherwise, write as you would a normal prayfile.
Now personally, I'm as lazy as they come, so I actually use CAOS2PRAY with Jagent/Monk (Requires the latest version 2.0.4, updated 8-14-12) and have a block like this at the top of my cosfile:
*# Pray-File
"gb_pp_apples.agent"
*# DSGB-Name "Apples
(C3)"
*# Depend apple.c16
*# Attach
gb_applepatch.c16
*# desc = "Juicy, crunchy C3
apples, now available anywhere."
*# Agent Animation File =
"gb_applepatch.c16"
*# Agent Animation Gallery =
"gb_applepatch"
*# Agent Sprite First Image = 0
*#
GB_Category = 1
*# Agent Author = "Amaikokonut"
Then select "PRAY Chunk" on Monk and drag the cosfile onto it. It should then compile the agent properly, assuming all the components are in the same folder. In my view, this is the easiest way to do things.
Feel free to ask any questions, let me know if there's any confusion, or just let me know if following these instructions works!
Herein lies the very-detailed annotated cosfile for the chillies patch plant! You should be able to use this as a template for your own patch plants, or just get a general idea of what it entails:
**How to make a Patch
Plant
**Using the Chili Pepper Plant as an example
**The
first thing you need to do is make an invisible flag agent
**This
agent is classified as 1 205 X, and stores information about your
patch plant.
**This means a lot of NAME variables.
new:
simp 1 205 22935 "blnk" 0 0 9000
*The first
thing you're going to do is define the number of your spawn
script
*This is the script that the patch core will trigger when
it's time to spawn a fruit/bud/whatever.
*I'm going to use
script 1000 for this... we'll get more into it later.
setv
name "spawn_script" 1000
*Now you have to define
the file name and image number of the sprite that will represent your
plant
*when it is fully grown. This will be used both in placing
a fruit/bud and serving as the little
*indicator that shows on
the hand when you're placing the patch.
sets name
"sprite_file" "chilli"
setv name
"sprite_pose" 11
*finally, you need to define
the classifiers for your produce
setv name "prod_fmly"
2
setv name "prod_gnus" 8
setv name "prod_spcs"
22935
*now personally, I like to define my blossoms as
"fruit" all the way through the growing process,
*and
just keep them invisible to creatures until they are fully grown. You
might chose to do it
*differently and define them as flowers
that later are killed and replaced with fruits. However
*you
choose to do it is up to you-- but the only agents that are going to
be considered part
*of your patch are those with those
classifiers as defined above. Thus, once your flower is killed
*and
replaced with a fruit, the patch won't recognize it anymore-- so
you'll have have to do some
*more creative coding if you want to
do it that way.
*Now that you have everything defined, you
need to contact the patch core agent (1 1 22929) and let
*it
know that you're here-- the patch scripts will take it from there and
generate the
*placement windows, let the user choose options,
and so on.
seta va00 targ
enum 1 1 22929
mesg
wrt+ targ 1000 va00 0 0
next
**That's it for your
install script!
*Now for your spawn script-- this is 1000
as we defined it in the install script.
scrp 1 205 22935
1000
inst
*If this script is running, it's because
the patch core decided it was time for your
*patch to spawn a
new bud. It has also sent the coordinates it has decided were proper
in
*_p1_ (x) and _p2_ (y). It has also stored the plane set by
the patch options in the NAME
*"patch_plane"
variable.
*So first, create your little fruit to be:
new:
simp 2 8 22935 "chilli" 14 1 name "patch_plane"
*again,
I like to keep my blossoms invisible to creatures so they don't
*try
to eat them while they're still flowers. You also obviously don't
want them to suffer
*physics just yet.
attr 80
bhvr
48
accg 2
perm 64
fric 100
elas 30
aero
2
*And move it to the coords sent by the patch
agent:
mvto _p1_ _p2_
*Now, a few new name
variables have been defined in your patch flag agent since you
last
*left it-- these are settings that have been defined in the
options window as well as a
*unique patch ID number that has
been generated. You'll need to copy these over to your
*your
budding fruit!
*The patch ID is important-- if you don't
copy it over, the patch plant won't realize that
*the fruit is
there, and it will spawn another one, and continue spawning
FOREVER.
setv name "patch_id" mame
"patch_id"
*then there's the ticks as set in the
options panel:
tick rand mame "tickfrom" mame
"tickto"
*personally I like to define a default
tick too, in case something goes wrong and the tick ends
*up as
0.
doif tick eq 0
tick 200
endi
endm
*And
that is just about it.
*From here you pretty much script
it like you would any other blossoming plant-- give it a
timer
*script to grow, ripen, become visible and so on. Of
course, don't forget eat scripts,
*collision scripts,
etc.
*Keep in mind: when your plant is picked (or falls
off the patch if you decide to code it like that)
*aside from
making it suffer physics, you'll also have to decide if you want to
clear the
*patch_id variable. If you clear it, it will no longer
count toward the total number of
*fruits growing on the patch,
and a new one will spawn to take its place. If you don't clear
*it,
the script will keep counting it and until that fruit is eaten or
otherwise disappears,
*a new fruit won't spawn. If you haven't
scripted your fruits to eventually decay, you may
*wish to keep
the patch_id variable intact so you don't have a patch that keeps
spawning
*endless numbers of fruits that pile up and slow down
the game.
*Another thing you might consider doing is
setting the tick to something static after the fruit
*falls off
the patch, so that the growth rate set by the user does not affect
the decay rate of
*the fruit. Personally, I choose not to do
this, but it is an option to consider.
*This is my timer
script:
scrp 2 8 22935 9
*if it's not fully
grown, grow it to the next stage
doif pose lt 10
setv
va00 pose
addv va00 1
pose va00
stop
endi
*if
it is fully grown, add to its timer (ov00), and make sure creatures
can see/grab it.
doif ov00 lt 10
addv ov00 1
doif
attr = 80
attr 67
*also make it start smelling like a
fruit
emit 6 0.01
endi
stop
endi
*if
it's fully grown and has been sitting on the plant for 10 turns,
*it
should fall off the patch
doif attr = 67
attr
195
pose 11
*I'm going to chose to clear the patch_id
variable so a new one can spawn where it fell.
setv name
"patch_id" 0
*and if it's fully grown and
already on the ground, it should add to its decay timer (ov01)
elif
attr = 195
doif ov01 lt 10
addv ov01 1
else
*but
if its been laying on the floor for 10 turns, go ahead and call it
rotten.
*I'm going to be lazy and just kill targ, but if you
have proper sprites prepared,
*turning it into detritus can
benefit your ecosystem if you've got bugs and critters that eat
it.
kill targ
endi
endi
endm
*here's
the collision script-- in this case if it's hitting the floor for the
first time
*it changes the sprite.
scrp 2 8 22935
6
lock
snde "smit"
doif ov02 = 0
pose
rand 12 13
setv ov02 1
endi
endm
*This is
the pickup script
scrp 2 8 22935 4
inst
*if
it's attr is still 67, you (or a creature) are picking it directly
off the plant
*and need to set it so it doesn't act attached to
the patch anymore
doif attr = 67
attr 195
pose
11
*Again, I'm going to chose to clear the patch_id
variable so a new one can spawn.
setv name "patch_id"
0
endi
endm
*Finally, the eat script. Nom.
scrp
2 8 22935 12
inst
snde "leat"
stim writ from
78 1
*going to add hotness and vitamin C to mimic the
hardman chilis.
doif from ne null
targ from
chem
153 .15
chem 99 .35
endi
*Again, I'm just
killing it here, but no reason you can create a fruit with multiple
bites, or
*something that turns into detritus after it's
eaten.
kill ownr
endm
rscr
enum 1 205
22935
kill targ
next
enum 2 8 22935
kill
targ
next
Feel free to post any questions you have in this thread! I will do my best to keep it updated with clarifications to make the development process as easy as possible.
Decoration agents are painfully simple
to write-- in fact, it probably takes more time to write the PRAYfile
than the code, unless you want to include some really snazzy special
actions.
This is your basic code for a decoration agent:
new: simp 1 99 [spcs] "[sprite]" 1 0 500
mvto
game "ch_x" game "ch_y"
scrp 1 99
[spcs] 1001
*special action 1
endm
scrp 1 99
[spcs] 1002
*special action 2
endm
scrp 1 99
[spcs] 1003
*special action 3
endm
scrp 1 99
[spcs] 1004
*special action 4
endm
rscr
enum
1 99 [spcs]
kill targ
next
Unless you plan on actually including special actions in
your scripts, you don't have to include those scrp lines either,
meaning the only code you need is:
new: simp 1 99 [spcs] "[sprite]" 1 0 500
mvto
game "ch_x" game "ch_y"
rscr
enum
1 99 [spcs]
kill targ
next
How's that for simple?
Important things to
note:
- The family/genus must always be 1/99 -- that's how
the deco panel tells it's a decoration.
- it has to be a simple,
not a compound agent, else it won't show up with the box-selection
properly (Turns out LINE doesn't play nice with compound agents) >:
-
You cannot change the ATTR (well, you can try, but the deco panel
will reset it). Deco agents will always be invisible to creatures, no
matter what.
- If you want to get really creative and include
other scripts in your deco agents, keep in mind that the following
are already used with the garden box deco panel:
-
1 (Activate 1/Select)
- 4
(Pickup)
- 10
(Creation/Self-select)
- 75 (Mouse
movement)
- 1001-1004 (Special
Actions-- you can use these obviously, for their intended
purpose)
- 2000 (Plane Change)
If
you use any of these scripts in your deco agent, they're unlikely to
work properly.
Have fun! The decoration possibilities are
endless.