Description of protocol between server and client

  • Intro
  • Library
  • Binary vs ASCII
  • ASCII protocol format
  • Description of protocol
  • Log
  • Intro

    Here is suggestion for procotol for communication between server-client, where client could be player, NPC script or map editor. Protocol is almost same for both directions. What should be changed etc... ?

    Library

    Implement this all as an library: easy to new communication methods or change protocol as needed.

    Binary vs ASCII

    If server and client agree on same version of protocol: use binary protocol. Otherwise use ASCII protocol. Binary protocol is not defined here.

    ASCII protocol format

    Why ASCII? It's more robust and easier for humans when debugging. Binary is more optimized and this reduces some redundancy that is useful when protocol changes.

    I see two choices, Python 'style' (what Cyphesis currently uses and is used in examples here) or XML. XML would be more standard but Python 'style' is more debugger/command line friendly.

    In any case they are 'just' strings, here are some Python 'style' examples:

    "event('make',what=ething('_Nisuf3',name='Nisuf',type='farmer'),loc=(20, 50, 300))"
    "event('destroy', what='_Nisuf3')"
    "event('move', what='_Nisuf3', loc=(-50, 50, 290))"
    "event('move', what='_axe10', loc='_Nisuf3')"
    "event('fire', what='_fire', loc='_house2', target='_house2')"
    
    (strings starting with underscore are ids)
    Could somebody that is versatile with XML translate these to XML?

    Description of protocol

    You always send list of events or minimum message is empty list: "[]" (in the end is log of example session)
    event:
    ------
    
      EVENT ATTRIBUTES
      not all these are needed (command and what are always needed)
      command: type of event: examples: "move", "make", "destroy", "say", "fire"
          type: string
      source: sender of event (world sets this if not set)
          type: id string
      target: receiver of event (you should set this for any thing
              that changes things, for example delete and change events)
          type: id string (in future also others, like: circle(loc,radius)
      desc: description of event
          type: string
      what: to what thing event relates or operates
          type: id string type string or ething or esay or 
                string (attribute name) or (inside server actual thing)
      what_desc: description of above
          type: string
      loc: location of event
          type: id string or tuple (x,y,z)
                will likely change to: (id string, (x,y,z)) format
      loc_desc: description of above
          type: string
      amount: how big fire, how strong visual signal, 
              how much to change object
          type: type of attribute that is changed
      time: time of event (world sets this if not set)
          type: mktime compatible tuple: (612, 1, 6, 8, 0, 0.0, 0, 6, -1)
    
    
      DIFFERENT COMMANDS:
      command "make":
        what="thing to make" as string or ething
        optional desc=for example "birth"
        optional loc=place for thing to appear (otherwise it appears in what
                     issued event)
        issuers:
          mind: event("make",what="axe", what_desc="ordinary axe")
          body: event("make", desc="birth", what=ething(...))
          house: event("make",what=fire)
    
      command "destroy":
        what=id string of thing to destroy
      
      command "change":
        what=what to change (is string or attribute name)
        amount=amount of change
    
        Here 'what' could be attribute name instead of id of thing.
        If target doesn't have that attribute it's initialized to
        given amount. Otherwise it's added to given amount. If 'what'
        is an id, then status attribute is changed.
    
        Target then would have id of target or in future some area or
        maybe some Python code or if not set then everything is changed.
    
      command "look":
        what=like change
        target=like change
        Will result in sight event, where 'what' is asked thing:
          if asked thing was attribute, then 'what' is its value
          if asked thing was id (or not defined), 
             then return all attributes as ething
          source=target in look event
    
      command "move":
        what=what to move
        loc=location to move into
    
      command "cut":
        CHEAT! (will likely change)
        what=what thing is used in cutting
    
      command "sight":
        what=event (for example move, destroy or make) or
             ething
    
      command "say":
        what=esay
    
      command "sound" (not used yet):
        what=event
    
      command "fire":
        what=fire
        loc=place of fire (for observers)
        target=target of fire
        amount=how big it is
    
      command "extinguish":
        what=fire to extinguish
        target=same as what
    
      command "goal":
        what=resulting event list from decision, example:
            [event('move',source='_farmer',target='_farmer',what='_farmer',
            loc=(12.5431347914, 95.4016955914, 265.44628788))]
        what_desc=decision derivation string, example: 
            goal('find place for home and build it').
            goal('find place for home and make it').
            goal('find place for home not too near or far from others').
            find_place()
    
      command "illegal":
        what=event
        what_desc=description about what's wrong: source_xyz, target_xyz
    
      command "debug":
        what=on or off
    
      command "NYI" (Not Yet Implemented):
        desc=description about what should have been implemented
    
      command "imaginary":
        desc=description about what events happened ;-)
    
      command "empty" (NOP, not really used)
    
    
      metaevents for engine.py:
    
      command "step" (run one tick in world)
    
    
    
    ething:
    -------
    
      first is id or when thing doesn't yet exist, then use name as id
      type: what kind of thing is going to be created (example: "farmer")
      other attributes are attributes for thing (like: sex="female")
    
      Examples:
      ething("Nisuf",type="farmer",sex="male")
      ething("_Nisuf3",name="Nisuf",type="thing.vbody.body.farmer",sex="male")
    
    
    esay:
    -----
      Experimental feature
    
      verb: string
      subject: string or id string
      object: string or id string
      type: string
      string: string (this is for PC to PC communication)
      
      examples: 
      esay('own',subject='_Nisuf',object='_house')
      esay('know',subject='axe',object='smithy')
      esay('know',subject='smithy',object=(20, 10, 305))
      esay('learn',subject='chop trees',object=
           "cut_something(self,'chop trees', 'winter', 'forest','axe')")
    

    Log

    Here is discussion between map editor and world when map editor creates things and teaches NPC:s:

    '>': from map editor
    '<': from server
    '#': comments: seek this character for interesting parts (recommended, this is quite long)

    This is just 'create itself' or login thing.
    >> "[event('make',what=ething('Observer',desc='external mind',
       name='Observer',type='god_body',xyz=(-100, -100, -100)))]"
    
    #(here it invisibly returns ibody CORBA object, 
    #not really part of official protocol, not shown here)
    
    > [event('make',what=ething('house',desc='ordinary house (_Observer_1)',
              name='house',place='home',xyz=(20, 50, 300),type='house'))]
    #create house
    
    < [event('sight',what=event('make',what=ething('_illegal',desc='some thing',
              type='thing',xyz=(0, 0, 0),name='illegal',status=1.0),
              time=(612, 1, 1, 0, 30, 0.0, 2, 1, -1))), 
      event('sight',what=event('make',what=ething('_Observer',
            desc='external mind',type='thing.vbody.god_body',
            xyz=(-100, -100, -100),name='Observer',place='home',status=1.0),
            time=(612, 1, 1, 0, 30, 0.0, 2, 1, -1)))]  
    #it now sees officially its creation ;-)
    
    < [event('sight',what=event('make',source='_Observer',
             what=ething('_house',desc='ordinary house (_Observer_1)',
             type='thing.house',xyz=(20, 50, 300),name='house',place='home',
             status=1.0),time=(612, 1, 1, 1, 0, 0.0, 2, 1, -1))), 
       event('sight',what='_house')]
    
    #here sight of house creation is received
    
    #This another (short) sight event will be replaced with something like:
    #event('sight',what=event('appear',what='_house',loc=(10,20,30)))
    #and
    #event('sight',what=event('disappear',what='_house',loc=(100,-20,30)))
    #or similar.
    
    > [event('make',what=ething('axe',
             desc='normal axe good for cutting trees (_Observer_2)',
             name='axe', place='forest',xyz=(150, -50, 250),status=1.0))]
    
    < [event('sight',what='_house')]
    
    < [event('sight',what=event('make',source='_Observer',
             what=ething('_axe',
             desc='normal axe good for cutting trees (_Observer_2)',
             type='thing',xyz=(150, -50, 250),name='axe',place='forest',
             status=1.0), time=(612, 1, 1, 2, 0, 0.0, 2, 1, -1))), 
      event('sight',what='_house')]
    
    > [event('make',what=ething('Nisuf',desc='ordinary farmer (_Observer_3)',
             name='Nisuf',type='farmer',age=864000.0,xyz=(20, 50, 300),sex='male'))]
    #make NPC
    
    < [event('sight',what='_house')]
    
    < [event('sight',what=event('make',source='_Observer',
             what=ething('_Nisuf',desc='ordinary farmer (_Observer_3)',
             type='thing.vbody.body.farmer',xyz=(20, 50, 300),
             name='Nisuf',place='home',age=864000.0,sex='male',status=1.0),
             time=(612, 1, 1, 3, 0, 0.0, 2, 1, -1))), 
      event('sight',what='_house')]
    #sight of NPC creation
    
    > [event('make',what=ething('Miyora',sex='female',name='Miyora',
             type='farmer',copy='_Nisuf',desc='some thing (_Observer_4)'))]
    
    
    < [event('sight',what='_house')]
    < [event('sight',what=event('make',source='_Observer',
             what=ething('_Miyora',desc='some thing (_Observer_4)',
             type='thing.vbody.body.farmer',xyz=(20, 50, 300),
             name='Miyora',place='home',age=867600.0,sex='female',status=1.0),
             time=(612, 1, 1, 4, 0, 0.0, 2, 1, -1))), 
      event('sight',what='_house')]
    
    > [event('say',target='_Nisuf',what=esay('own',subject='_Nisuf',
             object='_house'))]
    #tell it that it owns house
    > [event('say',target='_Miyora',what=esay('own',subject='_Miyora',
             object='_house'))]
    > [event('say',target='_Nisuf',what=esay('own',subject='_Nisuf',
             object='_axe'))]
    > [event('say',target='_Nisuf',what=esay('know',subject='axe',
             object='smithy'))]
    #tell it that axes can be acquired from smithy
    > [event('say',target='_Nisuf',what=esay('know',subject='smithy',
             object=(20, 10, 305)))]
    #tell it where smithy resides
    > [event('say',target='_Nisuf',what=esay('know',subject='forest',
             object=(150, -50, 250)))]
    > [event('say',target='_Nisuf',what=esay('know',subject='tavern',
             object=(50, 30, 295)))]
    > [event('say',target='_Miyora',what=esay('know',subject='axe',
             object='smithy'))]
    > [event('say',target='_Miyora',what=esay('know',subject='smithy',
             object=(20, 10, 305)))]
    > [event('say',target='_Miyora',what=esay('know',subject='forest',
             object=(150, -50, 250)))]
    
    > [event('say',target='_Miyora',what=esay('know',subject='tavern',
             object=(50, 30, 295)))]
    > [event('say',target='_Nisuf',what=esay('know',subject='home',
             object=(20, 50, 300)))]
    > [event('say',target='_Miyora',what=esay('know',subject='home',
             object=(20, 50, 300)))]
    > [event('say',target='_Nisuf',what=esay('know',subject='field',
             object=(-100, 50, 300)))]
    > [event('say',target='_Miyora',what=esay('know',subject='field',
             object=(-100, 50, 300)))]
    > [event('say',target='_Nisuf',what=esay('learn',subject='breakfast',
             object="imaginary('have a breakfast', 'morning', 'home')"))]
    #give imaginary goal (this is really NPC scripting specific)
    > [event('say',target='_Nisuf',what=esay('learn',subject='dinner',
             object="imaginary('have a dinner', 'midday', 'home')"))]
    > [event('say',target='_Nisuf',what=esay('learn',subject='supper',
             object="imaginary('have a supper', 'evening', 'home')"))]
    > [event('say',target='_Nisuf',what=esay('learn',subject='sleep',
             object="imaginary('sleep good night', 'night', 'home')"))]
    > [event('say',target='_Nisuf',what=esay('learn',subject='build home',
             object='build_home'))]
    #find suitable place for home and build home goal (see mgoal.py)
    > [event('say',target='_Miyora',what=esay('learn',subject='breakfast',
             object="imaginary('have a breakfast', 'morning', 'home')"))]
    > [event('say',target='_Miyora',what=esay('learn',subject='dinner',
             object="imaginary('have a dinner', 'midday', 'home')"))]
    
    > [event('say',target='_Miyora',what=esay('learn',subject='supper',
             object="imaginary('have a supper', 'evening', 'home')"))]
    > [event('say',target='_Miyora',what=esay('learn',subject='sleep',
             object="imaginary('sleep good night', 'night', 'home')"))]
    > [event('say',target='_Miyora',what=esay('learn',subject='build home',
             object='build_home'))]
    > [event('say',target='_Nisuf',what=esay('learn',subject='chop trees',
             object="cut_something(self,'chop trees', 'winter', 'forest','axe')"))]
    #chop trees in forest
    > [event('make',what=ething('house',desc='ordinary house (_Observer_5)',
             name='house',place='home',xyz=(70, 0, 300),type='house'))]
    
    < [event('sight',what='_house')]
    < [event('sight',what=event('make',source='_Observer',
             what=ething('_house1',desc='ordinary house (_Observer_5)',
             type='thing.house',xyz=(70, 0, 300),name='house',place='home',
             status=1.0),time=(612, 1, 1, 5, 0, 0.0, 2, 1, -1))), 
      event('sight',what='_house'), 
      event('sight',what='_house1')]
    > [event('make',what=ething('smithy',desc='ordinary smithy (_Observer_6)',
             name='smithy',place='smithy',xyz=(20, 10, 305),
             type='house',status=1.0))]
    
    < [event('imaginary',source='_Miyora',desc='sleep good night',
             time=(612, 1, 1, 5, 30, 0.0, 2, 1, -1)), 
      event('goal',source='_Miyora',
            what=[event('imaginary',desc='sleep good night')],
            what_desc="imaginary('sleep good night').imaginary()",
            time=(612, 1, 1, 5, 30, 0.0, 2, 1, -1)), 
      event('imaginary',source='_Nisuf',desc='sleep good night',
            time=(612, 1, 1, 5, 30, 0.0, 2, 1, -1)), 
      event('goal',source='_Nisuf',
            what=[event('imaginary',desc='sleep good night')],
            what_desc="imaginary('sleep good night').imaginary()",
            time=(612, 1, 1, 5, 30, 0.0, 2, 1, -1)), 
      event('sight',what='_house'), 
      event('sight',what='_house1')]
    #lots of imaginary events and goal event: 
    #goal event is NPCs thoughts (for debugging, not for PCs)
    
    < [event('sight',what=event('make',source='_Observer',
             what=ething('_smithy',desc='ordinary smithy (_Observer_6)',
             type='thing.house',xyz=(20, 10, 305),name='smithy',
             place='smithy',status=1.0),
             time=(612, 1, 1, 6, 0, 0.0, 2, 1, -1))), 
      event('imaginary',source='_Miyora',desc='sleep good night',
            time=(612, 1, 1, 6, 0, 0.0, 2, 1, -1)), 
      event('goal',source='_Miyora',
            what=[event('imaginary',desc='sleep good night')],
            what_desc="imaginary('sleep good night').imaginary()",
            time=(612, 1, 1, 6, 0, 0.0, 2, 1, -1)), 
      event('imaginary',source='_Nisuf',desc='sleep good night',
            time=(612, 1, 1, 6, 0, 0.0, 2, 1, -1)), 
      event('goal',source='_Nisuf',
            what=[event('imaginary',desc='sleep good night')],
            what_desc="imaginary('sleep good night').imaginary()",
            time=(612, 1, 1, 6, 0, 0.0, 2, 1, -1)), 
            event('sight',what='_house'), 
            event('sight',what='_house1')]
    
    > [event('make',what=ething('Bjorn',desc='only smith in village (_Observer_7)',
             type='smith',age=1728000.0,xyz=(70, 0, 300),place='home',
             name='Bjorn',sex='male'))]
    
    < [event('imaginary',source='_Miyora',desc='sleep good night',
             time=(612, 1, 1, 6, 30, 0.0, 2, 1, -1)), 
      event('goal',source='_Miyora',
            what=[event('imaginary',desc='sleep good night')],
            what_desc="imaginary('sleep good night').imaginary()",
            time=(612, 1, 1, 6, 30, 0.0, 2, 1, -1)), 
      event('imaginary',source='_Nisuf',desc='sleep good night',
            time=(612, 1, 1, 6, 30, 0.0, 2, 1, -1)), 
      event('goal',source='_Nisuf',
            what=[event('imaginary',desc='sleep good night')],
            what_desc="imaginary('sleep good night').imaginary()",
            time=(612, 1, 1, 6, 30, 0.0, 2, 1, -1)), 
      event('sight',what='_house'), 
      event('sight',what='_house1')]
    
    < [event('imaginary',source='_Miyora',desc='sleep good night',
             time=(612, 1, 1, 7, 0, 0.0, 2, 1, -1)), 
      event('goal',source='_Miyora',
            what=[event('imaginary',desc='sleep good night')],
            what_desc="imaginary('sleep good night').imaginary()",
            time=(612, 1, 1, 7, 0, 0.0, 2, 1, -1)), 
      event('sight',what=event('make',source='_Observer',
            what=ething('_Bjorn',desc='only smith in village (_Observer_7)',
            type='thing.vbody.body.smith',xyz=(70, 0, 300),name='Bjorn',
            place='home',age=1728000.0,sex='male',status=1.0),
            time=(612, 1, 1, 7, 0, 0.0, 2, 1, -1))), 
      event('imaginary',source='_Nisuf',desc='sleep good night',
            time=(612, 1, 1, 7, 0, 0.0, 2, 1, -1)), 
      event('goal',source='_Nisuf',
            what=[event('imaginary',desc='sleep good night')],
            what_desc="imaginary('sleep good night').imaginary()",
            time=(612, 1, 1, 7, 0, 0.0, 2, 1, -1)), 
      event('sight',what='_house'), 
      event('sight',what='_house1')]
    
    > [event('say',target='_Bjorn',what=esay('own',subject='_Bjorn',
             object='_house1'))]
    > [event('say',target='_Bjorn',what=esay('own',subject='_Bjorn',
             object='_smithy'))]
    > [event('say',target='_Bjorn',what=esay('know',subject='axe',
             object='smithy'))]
    > [event('say',target='_Bjorn',what=esay('know',subject='smithy',
             object=(20, 10, 305)))]
    > [event('say',target='_Bjorn',what=esay('know',subject='forest',
             object=(150, -50, 250)))]
    
    > [event('say',target='_Bjorn',what=esay('know',subject='tavern',
             object=(50, 30, 295)))]
    > [event('say',target='_Bjorn',what=esay('know',subject='home',
             object=(70, 0, 300)))]
    > [event('say',target='_Bjorn',what=esay('learn',subject='breakfast',
             object="imaginary('have a breakfast', 'morning', 'home')"))]
    > [event('say',target='_Bjorn',what=esay('learn',subject='dinner',
             object="imaginary('have a dinner', 'midday', 'home')"))]
    > [event('say',target='_Bjorn',what=esay('learn',subject='supper',
             object="imaginary('have a supper', 'evening', 'home')"))]
    > [event('say',target='_Bjorn',what=esay('learn',subject='sleep',
             object="imaginary('sleep good night', 'night', 'home')"))]
    > [event('say',target='_Bjorn',what=esay('learn',subject='build home',
             object='build_home'))]
    > [event('say',target='_Bjorn',what=esay('learn',subject='create axes',
             object="make_amount('axe',10,'ordinary axe','smithy')"))]
    #make axes goal
    
    #From now forward it's one way only
    < [event('imaginary',source='_Miyora',desc='sleep good night',
             time=(612, 1, 1, 7, 30, 0.0, 2, 1, -1)), 
      event('goal',source='_Miyora',
            what=[event('imaginary',desc='sleep good night')],
            what_desc="imaginary('sleep good night').imaginary()",
            time=(612, 1, 1, 7, 30, 0.0, 2, 1, -1)), 
      event('imaginary',source='_Nisuf',desc='sleep good night',
            time=(612, 1, 1, 7, 30, 0.0, 2, 1, -1)), 
      event('goal',source='_Nisuf',
            what=[event('imaginary',desc='sleep good night')],
            what_desc="imaginary('sleep good night').imaginary()",
            time=(612, 1, 1, 7, 30, 0.0, 2, 1, -1)), 
      event('sight',what='_house'), 
      event('sight',what='_house1')]
    
    < [event('imaginary',source='_Miyora',desc='sleep good night',
             time=(612, 1, 1, 8, 0, 0.0, 2, 1, -1)), 
      event('goal',source='_Miyora',
            what=[event('imaginary',desc='sleep good night')],
            what_desc="imaginary('sleep good night').imaginary()",
            time=(612, 1, 1, 8, 0, 0.0, 2, 1, -1)), 
      event('imaginary',source='_Nisuf',desc='sleep good night',
            time=(612, 1, 1, 8, 0, 0.0, 2, 1, -1)), 
      event('goal',source='_Nisuf',
            what=[event('imaginary',desc='sleep good night')],
            what_desc="imaginary('sleep good night').imaginary()",
            time=(612, 1, 1, 8, 0, 0.0, 2, 1, -1)), 
      event('sight',what='_house'), 
      event('sight',what='_house1')]
    
    < [event('imaginary',source='_Miyora',desc='have a breakfast',
             time=(612, 1, 1, 8, 30, 0.0, 2, 1, -1)), 
      event('goal',source='_Miyora',
            what=[event('imaginary',desc='have a breakfast')],
            what_desc="imaginary('have a breakfast').imaginary()",
            time=(612, 1, 1, 8, 30, 0.0, 2, 1, -1)), 
      event('imaginary',source='_Bjorn',desc='have a breakfast',
            time=(612, 1, 1, 8, 30, 0.0, 2, 1, -1)), 
      event('goal',source='_Bjorn',
            what=[event('imaginary',desc='have a breakfast')],
            what_desc="imaginary('have a breakfast').imaginary()",
            time=(612, 1, 1, 8, 30, 0.0, 2, 1, -1)), 
      event('imaginary',source='_Nisuf',desc='have a breakfast',
            time=(612, 1, 1, 8, 30, 0.0, 2, 1, -1)), 
      event('goal',source='_Nisuf',
            what=[event('imaginary',desc='have a breakfast')],
            what_desc="imaginary('have a breakfast').imaginary()",
            time=(612, 1, 1, 8, 30, 0.0, 2, 1, -1)), 
      event('sight',what='_house'), 
      event('sight',what='_house1')]
    
    < [event('imaginary',source='_Miyora',desc='have a breakfast',
             time=(612, 1, 1, 9, 0, 0.0, 2, 1, -1)), 
      event('goal',source='_Miyora',
            what=[event('imaginary',desc='have a breakfast')],
            what_desc="imaginary('have a breakfast').imaginary()",
            time=(612, 1, 1, 9, 0, 0.0, 2, 1, -1)), 
      event('imaginary',source='_Bjorn',desc='have a breakfast',
            time=(612, 1, 1, 9, 0, 0.0, 2, 1, -1)), 
      event('goal',source='_Bjorn',
            what=[event('imaginary',desc='have a breakfast')],
            what_desc="imaginary('have a breakfast').imaginary()",
            time=(612, 1, 1, 9, 0, 0.0, 2, 1, -1)), 
      event('imaginary',source='_Nisuf',desc='have a breakfast',
            time=(612, 1, 1, 9, 0, 0.0, 2, 1, -1)), 
      event('goal',source='_Nisuf',
            what=[event('imaginary',desc='have a breakfast')],
            what_desc="imaginary('have a breakfast').imaginary()",
            time=(612, 1, 1, 9, 0, 0.0, 2, 1, -1)), 
      event('sight',what='_house'), 
      event('sight',what='_house1')]
    
    < [event('goal',source='_Bjorn',
             what=[event('move',what='_Bjorn',loc=(20, 10, 305))],
             what_desc="make_amount('axe',10).move_me('smithy').move_to_loc()",
             time=(612, 1, 1, 9, 30, 0.0, 2, 1, -1)), 
      event('goal',source='_Nisuf',
            what=[event('move',what='_Nisuf',loc=(150, -50, 250))],
            what_desc="cut_something('axe').acquire_thing('axe').
                       acquire_known_thing('axe').move_it_into_me('_axe').
                       move_me((150, -50, 250)).move_to_loc()",
            time=(612, 1, 1, 9, 30, 0.0, 2, 1, -1)), 
      event('sight',what='_house'), 
      event('sight',what='_house1')]
    #more complicated goal events
    
    #following section: sight of NPC moving and making things
    #decimals in move command: body didn't allow NPC to move 
    #directly to target ;-)
    < [event('sight',source='_Bjorn',
             what=event('move',source='_Bjorn',target='_Bjorn',
             what='_Bjorn',loc=(20, 10, 305),
             time=(612, 1, 1, 10, 0, 0.0, 2, 1, -1)),
             time=(612, 1, 1, 10, 0, 0.0, 2, 1, -1)), 
      event('sight',what=event('make',source='_Bjorn',
            what=ething('_axe1',desc='ordinary axe',type='thing',name='axe',
            place='_Bjorn',status=0.1),
            time=(612, 1, 1, 10, 0, 0.0, 2, 1, -1))), 
      event('goal',source='_Bjorn',
            what=[event('make',what='axe',what_desc='ordinary axe')],
            what_desc="make_amount('axe',10).do_all()",
            time=(612, 1, 1, 10, 0, 0.0, 2, 1, -1)), 
      event('sight',source='_Nisuf',what=event('move',source='_Nisuf',
            target='_Nisuf',what='_Nisuf',
            loc=(95.8175396576, -8.32118435198, 270.839407824),
            time=(612, 1, 1, 10, 0, 0.0, 2, 1, -1)),
            time=(612, 1, 1, 10, 0, 0.0, 2, 1, -1)), 
      event('goal',source='_Nisuf',
            what=[event('move',what='_Nisuf',loc=(150, -50, 250))],
            what_desc="cut_something('axe').acquire_thing('axe').
                       acquire_known_thing('axe').move_it_into_me('_axe').
                       move_me((150, -50, 250)).move_to_loc()",
            time=(612, 1, 1, 10, 0, 0.0, 2, 1, -1)), 
      event('sight',what='_house'), 
      event('sight',what='_house1')]
    

    Aloril
    Last modified: Wed Feb 10 06:57:37 EET 1999 1