1ATLAS operation definition file (modeline for XEmacs: -*-Python-*-)
2IWILL Bach_beta2
3
4[
5{
6    id:"root_operation",
7    parents:["root"],
8    objtype:"op_definition",
9    serialno:0,
10    refno:0,
11    refid:"",
12    summary:"Base operation for all operators",
13    description:"This is base operation for all other
14    operations and defines basic attributes. You can use this as
15    starting point for browsing whole operation hiearchy. refno refers
16    to operation this is reply for. In examples all attributes that
17    are just as examples (and thus world specific) are started with 'e_'.",
18    from:"",
19    to:"",
20    seconds:0.0,
21    future_seconds:0.0,
22    time_string:"",
23    arg:{}
24    arg_names: ["arg"]
25},
26{
27    id:"action",
28    parents:["root_operation"],
29    summary:"This is base operator for operations that might have effects."
30},
31{
32    id:"info",
33    parents:["root_operation"],
34    summary:"This is base operator for operations that tell you info about objects or events.",
35    example:[{
36        objtype:"op",
37        parents:["info"],
38        arg:{
39            e_msg:"Here is some info"
40        }
41    }]
42},
43{
44    id:"create",
45    parents:["action"],
46    summary:"Create new things from nothing using this operator.",
47    description:"Map editor is main user for this in client side. Server uses this inside \"info\" operation to tell client about new things.",
48    arg_description:"entity describing object that is being created",
49    example:[
50        "Creating axe instance",
51        {
52            objtype:"op",
53            parents:["create"],
54            from:"map-editor",
55            arg:{
56                    parents:["axe"],
57                    name:"Ordinary axe",
58                    e_attack:3
59            }
60        }
61    ]
62},
63{
64    id:"delete",
65    parents:["action"],
66    summary:"Delete something.",
67    arg_description:"id of entity to be deleted",
68    example:[{
69        objtype:"op",
70        parents:["delete"],
71        arg:{
72            id:"foo_bar_344"
73        }
74    }]
75},
76{
77    id:"set",
78    parents:["action"],
79    summary:"Sets attributes for existing entity.",
80    example:[
81        "This one sets HP=50, height=1.8, width=0.3 for object \"9899\"",
82        {
83            objtype:"op",
84            parents:["set"],
85            arg:{
86                id:"9899",
87                e_HP:50,
88                e_height:1.8,
89                e_width:0.3
90            }
91        }
92    ]
93},
94{
95    id:"get",
96    parents:["action"],
97    summary:"Generic operation for getting info about things.",
98    arg_description:"id of target entity",
99    example:[
100        {
101            objtype:"op",
102            parents:["get"],
103            arg:{
104                id:"elf_type_id_45"
105            }
106        },
107        "<h4>Browsing operator hierarchy example:</h4>
108<p>
109First start from operator hierarchy root (root_operation):",
110        {
111            objtype:"op",
112            parents:["get"],
113            arg:{
114                id:"root_operation"
115            }
116        },
117        "Answer might be:",
118        {
119            objtype:"op",
120            parents:["info"],
121            arg:{
122                id:"root_operation",
123                children:["action","info"],
124                summary:"Base operator for all operatios"
125            }
126        },
127        "Then you can ask about action and info:",
128        {
129            objtype:"op",
130            parents:["get"],
131            arg:{
132                id:"action"
133            }
134        },
135        {
136            objtype:"op",
137            parents:["get"],
138            arg:{
139                id:"info"
140            }
141        },
142        "Etc..."
143    ]
144},
145{
146    id:"perception",
147    parents:["info"],
148    specification:"atlas_game",
149    summary:"Character perceives something.",
150    description:"Base operator for all kind of perceptions",
151    arg_description:"perceived thing",
152    example:[
153        "Usually derived operations are used, general notes
154                   on perceptions and actions:
155                   <ul>
156                   <li><b>action.from:</b> who made character to do something
157                   (talk for example); usually character itself, but
158                   not always, examples:
159                   <ul>
160                     <li>atlas_irc_gateway does puppet characters it
161                         has created for each nick from irc side
162                     <li>admin teaches NPCs by making them to talk
163                         itself
164                     <li>possession by spell
165                   </ul>
166
167                   <li><b>action.to:</b> same as character always
168
169                   <li><b>perception.from:</b> who produced this perception:
170                   always character itself (for example sound of talk)
171                   (well... unless you are made to hallusinate ;-)
172
173                   <li><b>perception.to:</b> you (unless you are
174                   server, then it's target to receive perception)
175                   </ul>
176
177                   <b>conclusion:</b> should use perception.from instead of
178                   inner action.from to decide who produced result
179                   <br>
180                   See <a href=\"#sound\">sound</a> and
181                       <a href=\"#sight\">sight</a>
182                   for actual examples
183                ",
184        {
185            objtype:"op",
186            parents:["perception"],
187            arg:{
188                id:"tree_8374"
189            }
190        }
191    ]
192},
193{
194    id:"error",
195    parents:["info"],
196    summary:"Something went wrong",
197    arg_description:"objects describing what went wrong<br>
198First argument is error entity which describes error.
199Second argument is operation which is wrong (not given if not relevant).",
200    example:[
201        "Client sent \"foo\" -operation which server rejects",
202        {
203            objtype:"op",
204            parents:["error"],
205            refno:123,
206            arg:{
207                message:"Uknown operation foo",
208                op:{
209                    objtype:"op",
210                    parents:["foo"],
211                    serialno:123,
212                    arg:{
213                        e_bar:"do some foo thing by using bar"
214                    }
215                },
216                no:42
217            }
218        }
219    ]
220},
221{
222    id:"combine",
223    parents:["create"],
224    specification:"atlas_game",
225    summary:"Combine existing objects into new objects.",
226    description:"This is how normal characters create objects.",
227    arg_description:"first argument is entity describing object that is being created and rest argument(s) are entities that are used as raw material.",
228    args_source:[],
229    arg_names: ["arg", "args_source"],
230    example:[
231        "Creating axe from wood and iron",
232        {
233            objtype:"op",
234            parents:["combine"],
235            arg:{
236                parents:["axe"],
237                name:"Bjorn's axe"
238            },
239            args_source:[
240                {
241                    id:"Wood_8898"
242                },
243                {
244                    id:"Iron_6578"
245                }
246            ]
247        }
248    ]
249},
250{
251    id:"divide",
252    parents:["create"],
253    specification:"atlas_game",
254    summary:"Divide existing object into pieces.",
255    description:"One of the pieces might be original object modified.",
256    arg_description:"id of original object and entities describing pieces.",
257    args_destination:[],
258    arg_names: ["arg", "args_source"],
259    example:[
260        "taking money from pile",
261        {
262            objtype:"op",
263            parents:["divide"],
264            arg:{
265                id:"money12345"
266            },
267            args_destination:[
268                {
269                    id:"money12345"
270                    e_amount:10
271                },
272                {
273                    e_amount:110
274                }
275            ]
276        }
277    ]
278},
279{
280    id:"communicate",
281    parents:["create"],
282    specification:"atlas_game",
283    summary:"Base operator for all kind of communication.",
284    arg_description:"communication entity",
285    example:[
286        "see talk"
287    ]
288},
289{
290    id:"move",
291    parents:["set"],
292    specification:"atlas_game",
293    summary:"Change position",
294    description:"More about <a href=\"move.html\">movement here</a>",
295    arg_description:"entity with id and new position",
296    example:[
297        "Movement conversation example:",
298        {
299            objtype:"op",
300            parents:["move"],
301            serialno:123,
302            from:"9899",
303            arg:{
304                id:"9899",
305                loc:"11",
306                pos:[12.3,3.0,0.0]
307            }
308        },
309        "Reply from server",
310        {
311            objtype:"op",
312            parents:["info","sight"],
313            serialno:1231,
314            refno:123,
315            from:"9899",
316            to:"9899",
317            seconds:19036033149.3,
318            time_string:"0612-01-05 10:59:09.3",
319            arg:{
320                objtype:"op",
321                parents:["set","move"],
322                serialno:1230,
323                refno:123,
324                from:"9899",
325                seconds:19036033149.3,
326                time_string:"0612-01-05 10:59:09.3",
327                arg:{
328                    id:"9899",
329                    loc:"11",
330                    pos:[12.3,3.0,0.0],
331                }
332            }
333        }
334    ]
335},
336{
337    id:"perceive",
338    parents:["get"],
339    specification:"atlas_game",
340    summary:"Generic base operation for perceiving things by eyes, ears, etc...",
341    arg_description:"object to be perceived",
342    example:[{
343        objtype:"op",
344        parents:["perceive"],
345        arg:{
346            id:"elf_3545"
347        }
348    }]
349},
350{
351    id:"login",
352    parents:["get"],
353    summary:"Operation for logging into server",
354    description:"For more about <a href=\"login.html\">out of game atlas here</a>",
355    arg_description:"entity with player name and password attribute",
356    example:[
357        {
358            objtype:"op",
359            parents:["login"],
360            arg:{,
361                id:"JoeBlatz",
362                password:"Rqv67.%"
363            }
364        },
365        "Conversation examples:<br> When you connect to
366        server you either need to have account already or make
367        one. Here is \"start by creating account\" -example:",
368        {
369            objtype:"op",
370            parents:["create"],
371            serialno:1,
372            arg:{
373                id:"player74",
374                parents:["player"],
375                password:"player_password"
376            }
377        },
378        "What if you already had account by that name? Then
379        reply from server could be something like this (1 argument:
380        message, 2 argument: original operation):",
381        {
382            objtype:"op",
383            parents:["error"],
384            serialno:4,
385            refno:1,
386            seconds:19036033149.3,
387            time_string:"0612-01-05 10:59:09.3",
388            arg:{
389                message:"Account id already exist"
390                op:{
391                    objtype:"op",
392                    parents:["create"],
393                    serialno:1,
394                    arg:{
395                        id:"player74",
396                        parents:["player"],
397                        password:"player_password"
398                    }
399                }
400            }
401        },
402        "For more about error operation see
403        <a href=\"#error\">error operation definition</a>.
404        <br><br>
405        If account login went OK them you might receive something
406        like:",
407        {
408            objtype:"op",
409            parents:["info"],
410            serialno:2,
411            refno:1,
412            seconds:19036033149.3,
413            time_string:"0612-01-05 10:59:09.3",
414            arg:{
415                id:"player74",
416                parents:["player"],
417                password:"player_password",
418                characters:["Bjorn_1"]
419            }
420        },
421        "If you don't have character, then you need to
422        create one. Creating character is similar to how you create
423        account.",
424        {
425            objtype:"op",
426            parents:["create"],
427            serialno:2,
428            arg:{
429                parents:["farmer"],
430                name:"Nisuf",
431                summary:"ordinary farmer",
432                e_sex:"male"
433            }
434        },
435        "Result of character creation is same as with account
436        creation, only resulting object differs."
437    ]
438},
439{
440    id:"logout",
441    parents:["login"],
442    summary:"Operation for logging out",
443    arg_description:"entity with player name",
444    example:[
445        {
446            objtype:"op",
447            parents:["logout"],
448            arg:{
449                  id:"JoeBlatz"
450            }
451        },
452        "Most useful with server<->server communication
453        telling that certain connection is not anymore pertinent"
454    ]
455},
456{
457    id:"sight",
458    parents:["perception"],
459    summary:"Character sees something",
460    arg_description:"object or event character sees",
461    example:[
462        "See <a href=\"#perception\">perception</a> operation too<br>
463                Common example:",
464        {
465            objtype:"op",
466            parents:["sight"],
467            arg:{
468                id:"grass1",
469                stamp:989.24
470            }
471        },
472        "Reply for looking at 'grass1':",
473        {
474            objtype:"op",
475            parents:["sight"],
476            arg:{
477                id:"grass1",
478                parents:["terrain"],
479                contains:["path1","tree1"],
480                summary:"Grass plains",
481                p:[
482                    [0.0,0.0],
483                    [10.0,0.0],
484                    [10.0,10.0],
485                    [0.0,10.0]
486                ],
487                area:[["grass1.p.0", "grass1.p.1", "grass1.p.2"],
488                      ["grass1.p.0", "grass1.p.2", "grass1.p.3"]]
489            }
490        },
491        "Event example:",
492        {
493            objtype:"op",
494            parents:["sight"],
495            arg:{
496                objtype:"op",
497                parents:["move"],
498                arg:{
499                    id:"orc_23498",
500                    loc:"grass1",
501                    pos:[0.5,3.0,0.0]
502                }
503            }
504        }
505    ]
506},
507{
508    id:"sound",
509    parents:["perception"],
510    summary:"Character hears something",
511    arg_description:"thing character heard",
512    example:[
513        "See <a href=\"#perception\">perception</a> operation too<br>
514                   Example (every operation might have from,
515to and time tags, not only this operation):",
516        {
517            objtype:"op",
518            parents:["sound"],
519            from:"sentry_34",
520            arg:{
521                objtype:"op",
522                parents:["talk"],
523                arg:{
524                    say:"What has happened there?"
525                }
526            }
527        }
528    ]
529## *** Topic for#coders ismake NPCs pass out by giving them enough vodka
530## <aloril> saw topic? ;-)
531## <wavey> heheh
532## <aloril> added drunkness into cyphesis in morning
533## <aloril> actually it holds for PCs too... ;-)
534## <wavey> i find that I have to remove drunkenness from my code, rather than add it ;)
535## * aloril rofl
536## * wavey chuckles
537## <wavey> damn, i need adsl :?
538## <wavey> :/ even
539## <wavey> doesn't arrive in UK till next spring :/
540## <aloril> hmm... actually need drunkness code for NPC version of http://www.ionet.net/~timtroyr/funhouse/beer.html
541## <wavey> yeah :)
542## <aloril> <ent><attr name="say">99 bottles of beer on the wall</attr><attr name="tone">singing</attr></ent>
543## <wavey> how do you see 'tone' being used?
544## <aloril> tone="talking" or tone="signing"
545## <aloril> hmm.. maybe better name?
546## <aloril> talktype?
547## <wavey> well..
548## <wavey> the name is one thing..
549## <wavey> but i mean more..
550## <wavey> how will clients use it?
551## <aloril> ohh... enough advanced client would use sound card to either talk or sing ...
552## <aloril> less advanced maybe different kind of bubles or different colors in speech window
553## <wavey> i see
554## <wavey> cool
555## <aloril> and text clients of course: Foo says "llll"
556## <wavey> lets think about the name..
557## <aloril> or Foo sings "llll"
558## <wavey> vocalisation?
559## <wavey> naw
560## <aloril> imagine above NPC demo with suitable graphic and suitable sound synthesis ...
561## <wavey> yup
562## <aloril> and in the end of course if any is walking: go to shop and buy more...,
563## <aloril> yup... sure slashdot headlines...
564## <aloril> especially is NPC script is relatively short so that it can be published at above link too...
565## <aloril> fun fun ....
566## <wavey> perhaps 'utterance' is better than 'tone'..
567## <wavey> probably a better word out there too
568## <wavey> or even 'vocal'
569## <wavey> i think i like 'vocal'
570## <wavey> summaries speech or singing
571## <wavey> or whispering
572## <wavey> or shouting
573## <aloril> hmm.. what would be value for drunk people?
574## <wavey> slurrs :)
575## <wavey> or 'drunkenly' :)
576## <aloril> okay, it's vocal then...
577## <wavey> coolio
578## <aloril> what about "say"? is that ok or is there better version?
579## <wavey> tone is purely musical..
580## <wavey> 'speech'?
581## <aloril> ok...
582## <wavey> but 'say' describes it fine :)
583## <aloril> hmm... say might be more generic?
584## <aloril> think about spell intonation...
585## <aloril> well then there is of course non speech sounds too...
586## <aloril> hmm.. maybe screaming is say
587## <aloril> but what about clapping?
588## <aloril> or farting ;-)
589## <aloril> or whistling
590## <aloril> or crunch voice coming when somebody tries to surprise you from behind
591## <wavey> those are actions
592## <aloril> <op><id>sound</id><ent><attr name=".... ></op>
593## <aloril> so is talking...
594## <aloril> but they produce sound you can hear...
595## <wavey> well
596## <wavey> i was wondering about that
597## <wavey> the beer example you started with
598## <aloril> for example if you make sword:
599## <aloril> action would be create sword
600## <wavey> had entity with attr or say and tone
601## <aloril> and it would produce sight and sound operations(/events)
602## <wavey> the tone should be an attr of say (or vocal)
603## <aloril> well there is sound entity which can have as many attributes as needed...
604## <wavey> sure
605## <wavey> that should be an attr of the entitie's vocal attr.
606## <wavey> if you get my meaning.
607## <aloril> question is what those attributes should be...
608## <aloril> ie think about what C structure would capture all sounds...
609## <wavey> ok, clear this up
610## <wavey> can an entity's attributes have attributes themselves?
611## <aloril> entity attributer can be subentity..
612## <wavey> ok cool
613## <aloril> just like structure in C can contain another structure..
614## <wavey> so 'fart' should be an action of an entity
615## <wavey> along with 'say'
616## <aloril> just doesn't make sense for something to be string and structure at the same time ;-)
617## <wavey> and 'sing' should be an attribute of the 'say' attribute
618## <wavey> s/say/vocal
619## <aloril> do you have forge cvs on your disk?
620## <wavey> nope :/
621## <wavey> wanna describe vocalisation once more?
622## <aloril> see: http://www.worldforge.org/website/protocols/proposals/operations.html#sight
623## <aloril> and http://www.worldforge.org/website/protocols/proposals/operations.html#sound
624## <wavey> man singing = entity with attr of 'vocal=singing'
625## <aloril> especially for example move crunch would be like that example in the end of sight
626## <aloril> probably fart too...
627## <wavey> what is 'move crunch'?
628## <aloril> voice stepping on some crunchy
629## <aloril> voice that is generated by stepping on some crunchy
630## <aloril> obviously fart would produce smell perception too
631## <wavey> crunchy == something that crunches, like a cardboard box
632## <wavey> when you compress it
633## <aloril> yup
634## <aloril> (in above discussion)
635## <wavey> so what do you mean by 'voice'?
636## <aloril> sound
637## <wavey> ok :)
638## <aloril> s/voice/sound/ ;-)
639## <wavey> <aloril> voice stepping on some crunchy
640## <wavey> ^ possibly the most confusing thing i've ever read on irc ;)
641## * aloril rofl
642## <wavey> in fact
643## *** wavey has changed the topic to: <aloril> voice stepping on some crunchy
644## <aloril> voice moving and producing sound ;-)
645## <aloril> perfectly valid thing: it's magical voice
646## <aloril> ;-)
647## * aloril wondering how that would be represented in atlas
648## *** aloril has changed the topic to: <aloril> voice stepping on some crunchy <aloril> it's magical voice
649## <wavey> i'm still utterly without understanding :)
650## <aloril> it's voice with mass ;-)
651## <wavey> ok
652## <wavey> start again
653## ***Mike (~mikeday@203.42.255.220) has joined #coders
654## <aloril> hi mike
655## <Mike> hello
656## <wavey> hiya mike
657## <wavey> tell aloril to stop hurting my head
658## * Mike grins
659## <aloril> drunkness part for http://www.ionet.net/~timtroyr/funhouse/beer.html added to cyphesis
660## <aloril> (actually it's vodka, but that's just detail ;-)
661## <aloril> why did I add it?
662## <aloril> * kosh gives aloril more vodka to improve his coding
663## <aloril> * aloril has been giving vodka to pet NPC ;-)
664## <aloril> <aloril> duh now it passed out..
665## <aloril> <kosh> really?
666## <aloril> <kosh> you have drinking working in cyphesis?
667## *** aloril has changed the topic to: voice stepping on something crunchy generates voice which steps ...
668## <wavey> mike!
669## <wavey> tell him!
670## <wavey> surely it's illegal to be this strange?
671## <Mike> voice. stepping. on something, crunchy.
672## * Mike boggles
673## * aloril is laughing uncontrollably
674## <wavey> aloril is talking uncontrollably
675## <wavey> shoot him in the lungs
676## <wavey> quick
677## <aloril> hey now real, guestion: how topic is expressed in atlas?
678## <wavey> before he says anything else
679## <wavey> <ent><attr name="topic"><attr value="* aloril needs help"></ent>
680## <aloril> <op><id>sound</id>
681## <aloril>   <op><id>move</id>
682## <aloril>     <ent>
683## <aloril>       <type><id>voice</id></type>
684## <aloril>       <attr name="say">crunch</attr>
685## <aloril>       <attr name="vocal">crunch</attr></ent>
686## <aloril>       <loc><id>crunchy_item</id><coords>0,0,0.1</coords></loc>
687## <aloril>   </ent>
688## <aloril>   </op>
689## <aloril> </op>
690},
691{
692    id:"smell",
693    parents:["perception"],
694    summary:"Character smells something",
695    arg_description:"thing character smells",
696    example:[
697        "Example (every operation might have from,
698to and time tags, not only this operation):",
699        {
700            objtype:"op",
701            parents:["smell"],
702            from:"flower_34",
703            arg:{
704                e_smell:"sweet"
705            }
706        }
707    ]
708},
709{
710    id:"feel",
711    parents:["perception"],
712    summary:"Character feels something (with fingers usually)",
713    arg_description:"thing character touches",
714    example:[{
715        objtype:"op",
716        parents:["feel"],
717        arg:{
718            id:"cloth_34",
719            e_surface_type:"rough"
720        }
721    }]
722},
723{
724    id:"imaginary",
725    parents:["action"],
726    summary:"When something is not yet implemented in server, then character can pretend to do something ;-)",
727    arg_description:"event that is supposed to happen",
728    example:[{
729        objtype:"op",
730        parents:["imaginary"],
731        arg:{
732            id:"some_unimplemented_action"
733        }
734    }]
735},
736{
737    id:"talk",
738    parents:["communicate"],
739    summary:"used for talking",
740    description:"need to relook at that 'Magic voice that steps on something crunchy and makes magic voice which...' -IRC log",
741    arg_description:"sentence(s) entity",
742    example:[
743        {
744            objtype:"op",
745            parents:["talk"],
746            arg:{
747                say:"What has happened there?"
748            }
749        },
750        "Talking out of game is same,
751except you use player id instead of character id."
752    ]
753},
754{
755    id:"look",
756    parents:["perceive"],
757    summary:"Looking at something",
758    arg_description:"target entity",
759    example:[
760        {
761            objtype:"op",
762            parents:["look"],
763            arg:{
764                id:"elf_3545"
765            }
766        },
767        "Conversation examples:<br> When you connect to
768        server you need to look to see things. Server sends all new
769        things that appear and all changes that you see (like
770        movement). But it's clients responsibility to make first
771        update of what it sees. Reason is that only client knows what
772        it has cached.
773
774        <p>First look can leave argument out (it's by default empty): then server sends
775        appropriate top level object for current scheme.",
776        {
777            objtype:"op",
778            parents:["look"],
779            serialno:5,
780            from:"Bjorn_10"
781        },
782        "Server reply:",
783        {
784            objtype:"op",
785            parents:["set","sight"],
786            serialno:100,
787            refno:5,
788            from:"Bjorn_10",
789            to:"Bjorn_10",
790            seconds:19035667864.4,
791            time_string:"0612-01-01 05:31:04.4",
792            arg:{
793                id:"world_0",
794                parents:["world"],
795                contains:["tavern_2","market_3","home_4","axe_5","Nisuf_6","Miyora_7","home_8","smithy_9","Bjorn_10"],
796                stamp:19035660000.0,
797                pos:[0.0,0.0,0.0]
798            }
799        },
800        "Client looks at contains attribute of above object
801        and then looks for those objects in turn:",
802        {
803            objtype:"op",
804            parents:["look"],
805            serialno:6,
806            from:"Bjorn_10",
807            arg:{
808                id:"Nisuf_6"
809            }
810        },
811        "And then server tells you more about it:",
812        {
813            objtype:"op",
814            parents:["set","sight"],
815            serialno:105,
816            refno:6,
817            from:"Nisuf_6",
818            to:"Bjorn_10",
819            seconds:19035667864.4,
820            time_string:"0612-01-01 05:31:04.4",
821            arg:{
822                id:"Nisuf_6",
823                parents:["farmer"],
824                e_drunkness:0.0,
825                stamp:19035650000.0,
826                loc:"world_0",
827                pos:[20.0,50.0,300.0],
828                summary:"ordinary farmer",
829                name:"Nisuf",
830                e_status:1.0,
831            }
832        }
833    ]
834},
835{
836    id:"listen",
837    parents:["perceive"],
838    summary:"Listen (something)",
839    arg_description:"target entity",
840    example:[{
841        objtype:"op",
842        parents:["listen"],
843        arg:{
844            id:"elf_3545"
845        }
846    }]
847},
848{
849    id:"sniff",
850    parents:["perceive"],
851    summary:"Sniff something",
852    arg_description:"target entity",
853    example:[{
854        objtype:"op",
855        parents:["sniff"],
856        arg:{
857            id:"flower_3545"
858        }
859    }]
860},
861{
862    id:"touch",
863    parents:["perceive"],
864    summary:"Touch something",
865    arg_description:"target entity",
866    example:[{
867        objtype:"op",
868        parents:["touch"],
869        arg:{
870            id:"cloth_3545"
871        }
872    }]
873},
874{
875    id:"appearance",
876    parents:["sight"],
877    summary:"Character sees something appearing: it literally appears or has it come in visible range",
878    arg_description:"object or event character sees",
879    example:[{
880        objtype:"op",
881        parents:["appearance"],
882        arg:{
883            id:"grass1",
884            stamp:989.24
885        }
886    }]
887},
888{
889    id:"disappearance",
890    parents:["sight"],
891    summary:"Character sees something disappearing: it literally disappears or has it gone too far to be visible",
892    arg_description:"object or event character sees",
893    example:[{
894        objtype:"op",
895        parents:["disappearance"],
896        arg:{
897            id:"grass1",
898            stamp:989.24
899        }
900    }]
901}
902]
903