Welcome to the Creatures Wiki! Log in and join the community.

Difference between revisions of "KAOS How To"

From Creatures Wiki
Jump to navigation Jump to search
(16 intermediate revisions by 5 users not shown)
Line 1: Line 1:
 
{{indevelopment}}
 
{{indevelopment}}
 +
This is a brief tutorial for working with [[Kaos]].
  
 
==Install==
 
==Install==
I presuppose you have some basic knowlage, of inner caos-working,c16-image-editor,folders , about agents etc.<br />
+
I presume you have some basic knowlage, of inner caos-working, c16-image-editor, folders, about agents etc.
Download kaos_1.tar.bz2 , untar and copy kaos and mach.sh in /usr/local/bin.
+
 
 +
* Linux : Download kaos_1.tar.bz2 , untar and copy kaos and mach.sh in /usr/local/bin.
 +
* Win(XP) : Download installer, at c:\programme\kaos is batch-file  run_kaos.bat, copy this in workingdir. then type :run_kaos foo.k
 +
 
 
===Whats new===
 
===Whats new===
My version runs with normal [[Lc2e|Linux Creatures Evolution Engine]], if the cos-files ar put in Bootstrap-folder.
+
My version runs with the normal [[Lc2e|Linux Creatures Evolution Engine]], if the cos-files are put in Bootstrap-folder.
The Numbers of script command cloud now be up to 65535.<br />
+
The Numbers of script command could now be up to 65535.
The big  advantage of kaos is : the scripts are more readable and modern as caos .<br />
+
 
My precompiled version of kaos-compiler has the librarys included:
+
The big  advantage of kaos is : the scripts are more readable and modern as caos .
 +
 
 +
My precompiled version of kaos-compiler includes the following libraries:
 
  attrbhvr.k
 
  attrbhvr.k
 
  prelude.k
 
  prelude.k
 
  KaosLib.k
 
  KaosLib.k
 
  lib2.k
 
  lib2.k
In this libs most of commands for ''everyday use'' of caos are defined. If you need a new command or macro write an include file and bind it to youre source.<br />
+
In these libraries most commands for ''everyday use'' of caos are defined. If you need a new command or macro write an include file and bind it to your source.
Only if you have many of then an recompiling would be usefull.
+
You should only to recompile if you have a lot of libraries for everyday use.
  
 
==How to use==
 
==How to use==
Simply take an texteditor (geany would be perfect , I am planning some extantions), write code and save file with *.k<br />
+
Simply take a text editor (geany would be perfect , I am planning some extensions), write code and save file with a .k file extension.
Then type '''mach.sh foo.k''' , output is saveed as '''foo.k.cos'''.
+
Then type '''mach.sh foo.k''' , output is saved as '''foo.k.cos'''.
  
 
For using ''newcompound(''), in my way first you have to define the variables:
 
For using ''newcompound(''), in my way first you have to define the variables:
Line 28: Line 34:
 
  ...
 
  ...
  
or you write an extra file with predefined constants. see ''classifiers.k''<br />
+
or you write an extra file with predefined constants. see ''classifiers.k''
This allows you to build an table for multiple use without looking for [[Classification_system]] all time.<br />
+
 
other constants see e.g. ''predef.k'' (these are the same used by dockingstation '''ov01,ov02...''' for agents)<br />
+
This allows you to build an table for multiple use without looking for [[Classification system]] all time.
'''AND''' to defin new commands make new file e.g.  mylib.k and then  
+
 
 +
For other constants see e.g. ''predef.k'' (these are the same used by Docking Station '''ov01,ov02...''' for agents)
 +
 
 +
To define new commands make new file e.g.  mylib.k and then  
  
 
  ...
 
  ...
Line 39: Line 48:
 
  ...
 
  ...
  
Important NOTE the includes '''MUST BE AT TOP OF FILE''' (only an poor shell-script include yet)  
+
NOTE : the includes ''Should BE AT THE TOP OF THE FILE'' (an ''preprocesso'' writen in haskell does the work)
 +
 
 +
===How to write a new kaos command===
 +
This is simple . See first in doc/index.html if the command is already defined.
 +
 
 +
For ''agent independent'' commands:
 +
You need for example ''HAND'', which is define in CAOS-handbook as:
 +
HAND (command) name_for_the_hand (string)
 +
  Sets the name of the hand. By default this is 'hand'.
 +
 
 +
HAND (string)
 +
  This returns the name of the hand.
 +
 
 +
The first is a value assignment, the second returns the assigned value.
 +
 
 +
To define a new kaoscommand, type :
 +
<pre>
 +
/**First:
 +
HAND string
 +
*/
 +
define new_name_of_hand(string name) /* could be string numeric or agent */ {
 +
 
 +
_caos { HAND $name(r);
 +
 
 +
}
 +
 
 +
}
 +
</pre>
 +
then you could use later : '''new_name_of_hand("Norn");''' /* same type as definition*/ => ''HAND Norn''
 +
 
 +
<pre>
 +
/**Second:
 +
HAND returning string
 +
*/
 +
define whats_your_name() returning string  /* could be string numeric or agent */ {
 +
 
 +
    _caos { .static let $return = HAND; };
 +
 
 +
};
 +
</pre>
 +
usage : ''' string c = whats_your_name();
 +
prints(c);''' /* must be the same type as in definition prints is debug*/ =>''dbg: outs hand''
 +
 
 +
For agent related commands, e.g. ''[[VELO]]'':
 +
<pre>
 +
/**
 +
VELO
 +
*/
 +
define velocity( agent a,numeric x, numeric y)
 +
{
 +
  _caos {
 +
    .targ < $a {
 +
      VELO $x(r) $y(r);
 +
    };
 +
  };
 +
}
 +
</pre>
 +
usage : '''velocity(a,(20),0)''';  or  '''a.velocity((-20),0);''' ( where a is agent), both mean the same => ''VELO 20 0''
  
===How to write an new caos command===
 
This is simple . See first in doc/index.html if command is allready definied.<br />
 
You need for example ''SIN''
 
''next time''
 
 
==A little demo-agent==
 
==A little demo-agent==
 +
First lets start easy . A moving window at the left side of the main screen, which shows the x,y position of mouse-pointer (hand).<br />
 +
Comments are the same as c,c++
 +
*one line to end '''//'''
 +
*multiline /*  ..... */
 +
If keywords are used (inside the comment lines) e.g. Script, File,  Function... , then it is possible to generate with NaruralDocs auto-documents. 
  
  
Line 61: Line 128:
 
  * -----------------------------------------------------------------------------
 
  * -----------------------------------------------------------------------------
 
  */
 
  */
 +
</pre>
 +
now the included files:(with constants,predefs...). To download  see :  lifandi.ccdevnet.org/index.php/Script_Nummber_overview (down)
 +
<pre>
 
#include classifiers.k  
 
#include classifiers.k  
 
#include predef.k  
 
#include predef.k  
 +
</pre>
 +
This is how to access '''OV'''-Varioables :here '''OV99''' Note must be at top BEFORE install begins!!
 +
<pre>
 +
ovar numeric hidden[99];//true=1 false =0
 +
</pre>
 +
The basic-funktions of agents are install{}, script{} ,remove{}<br />
 +
it is not  necessary to put all in one file but more readable.
  
ovar numeric hidden[99];//true=1 false =0
+
Inside install{} all information about attributes , images are written
 +
it is the same as '''INST''' in caos!
 +
<pre>
 
install {
 
install {
 
         agent simplemonitor;
 
         agent simplemonitor;
Line 81: Line 160:
 
simplemonitor.newbutton(4, "ds gui", 16, 77, 331, 170,  0 ,"[]", 2001, 1);
 
simplemonitor.newbutton(4, "ds gui", 16, 77, 331, 170,  0 ,"[]", 2001, 1);
 
     }
 
     }
 
+
</pre>
 +
This is the same as '''SCRP'''
 +
<pre>
 
script (F_INVISIBLE, G_SYSTEM, S_SIMPLEMONITOR,2000) {agent a=owner;
 
script (F_INVISIBLE, G_SYSTEM, S_SIMPLEMONITOR,2000) {agent a=owner;
 
  if (a.hidden==0) {velocity(a,(-20),0);wait(15);velocity(a,(0),0);}
 
  if (a.hidden==0) {velocity(a,(-20),0);wait(15);velocity(a,(0),0);}
Line 105: Line 186:
 
         s.parttext=ausgabe;
 
         s.parttext=ausgabe;
 
}
 
}
 +
</pre>
 +
The '''RSCR'''
 +
<pre>
 
remove {
 
remove {
 
     enum (F_INVISIBLE, G_SYSTEM, S_SIMPLEMONITOR) {|p| p.kill();}
 
     enum (F_INVISIBLE, G_SYSTEM, S_SIMPLEMONITOR) {|p| p.kill();}
Line 111: Line 195:
 
}
 
}
 
</pre>
 
</pre>
 +
==Reimplement of orange sponge.cos from C3==
 +
===Analyse of Orange Sponge.cos from C3===
 +
<gallery>
 +
Image:Orange.jpg |Blockdiagam made with Kivio
 +
Image:orange1.jpg | Screenshot of DS with orang.k
 +
</gallery>
 +
 +
 +
First look at the cos script. The agent has only one script :timer!
 +
 +
The Subs I want to port to  define macros.
 +
 +
The script ''mymacro.k'' could be used for other plant similarly to orange sponge (e.g. opal sponge ...)
 +
 +
===Main script===
 +
It is not exactly the same as in C3.
 +
TODO:
 +
* Lifecycle of orange sponge fine tuning
 +
* Seed ,C3 like  growing  conditions.(there are some little bugs in the ''if'' conditions.)
 +
 +
<pre>
 +
/**
 +
    Script: orang.k
 +
    ___________________________________________________________________________
 +
    Version 0.1
 +
    Copyright (C) 2009 august0815
 +
  * under GNU
 +
* -----------------------------------------------------------------------------
 +
* Agent  : F_INVISIBLE, G_GOODPLANT, S_ORA
 +
* Sprites: oraponge.c16 //form C3
 +
* -----------------------------------------------------------------------------
 +
*/
 +
/* Save this as orang.k  an compile with run_kaos.sh orang.k (run_kaos.bat orang.k ) */
 +
// include files must be in the same folder  !!
 +
define numeric F_INVISIBLE = 1 ;
 +
define numeric G_GOODPLANT = 4;
 +
define numeric S_ORA =3002;
 +
define numeric S_ORA_SEED=3003;
 +
#include predef.k
 +
 +
#include mymacro.k
 +
 +
ovar numeric temp40[40];
 +
 +
install {
 +
numeric ypos=9500; // in DS meso
 +
numeric xpos=1250; // in DS meso
 +
numeric t=0;
 +
do{
 +
t=t+1;
 +
        agent opal;numeric x,y,z;
 +
      opal = newcompound(F_INVISIBLE, G_GOODPLANT, S_ORA,"oraponge", 59 ,0 ,4200);
 +
      opal.attributes=197;
 +
opal.perm=100;
 +
opal.elasticity=0;
 +
opal.clickAction=(-1);
 +
opal.acceleration=1;
 +
opal.aerodynamics=5;
 +
opal.friction=100;
 +
opal.pose=4;
 +
x=(t*20)+1250;//xops
 +
 +
      opal.moveto(x,ypos);
 +
      opal.age_of_agent=399;
 +
opal.stage_of_life=8;
 +
opal.bioenergy=55;
 +
opal.tick=10;
 +
} while t<2
 +
}
 +
script ( F_INVISIBLE, G_GOODPLANT, S_ORA, 9) {agent a=owner; numeric randval;
 +
  a.age_of_agent=a.age_of_agent+1;
 +
  if (roomOfTarg(a)==9) {deth2(a);}//NOT IN WATER :)
 +
 
 +
  if (a.age_of_agent>700) {deth2(a);}
 +
  if ((a.age_of_agent>0) && (a.age_of_agent<25)) {a.pose=4; a.stage_of_life=0;};
 +
  if ((a.age_of_agent>=25) && (a.age_of_agent<75) && (a.stage_of_life==0) ) {a.pose=5; a.stage_of_life=1;};
 +
  if ((a.age_of_agent>=75) && (a.age_of_agent<100)&& (a.stage_of_life==1)) {a.pose=6; a.stage_of_life=2;};
 +
  if ((a.age_of_agent>=100) && (a.age_of_agent<150) && (a.stage_of_life==2)) {a.pose=7; a.stage_of_life=3;};
 +
  if ((a.age_of_agent>=150) && (a.age_of_agent<200) && (a.stage_of_life==3)) {a.pose=8; a.stage_of_life=4;};
 +
  if ((a.age_of_agent>=200) && (a.age_of_agent<250) && (a.stage_of_life==4)) {a. baseIndex=9; a.stage_of_life=5;};//set base 9
 +
  if ((a.age_of_agent>=250) && (a.age_of_agent<300) && (a.stage_of_life==5)) {a. baseIndex=19; a.stage_of_life=6;};
 +
  if ((a.age_of_agent>=300) && (a.age_of_agent<350) && (a.stage_of_life==6)) {a. baseIndex=29; a.stage_of_life=7;};
 +
  if ((a.age_of_agent>=350) && (a.age_of_agent<400) && (a.stage_of_life==7)) {a. baseIndex=39; a.stage_of_life=8;};
 +
  if ((a.age_of_agent>=400) && (a.age_of_agent<450) && (a.stage_of_life==8)) {a. baseIndex=49; a.stage_of_life=9;};
 +
 +
  if ((a.stage_of_life>4) && (a.stage_of_life<10) ) {a.anim(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 255);};
 +
 
 +
  if (a.age_of_agent>700) {kill(a);}/* {deth2(a);}*/; //is needed?
 +
 
 +
  if ((a.stage_of_life>0) || (a.stage_of_life<2) ) {check(a);};
 +
 
 +
  if (a.stage_of_life==10) { a.temp40=a.temp40+1;
 +
  if (a.temp40==20) {a.stage_of_life=9;}
 +
  }
 +
 +
 +
if (a.stage_of_life==9)  {randval=getRandom(1,20); if (randval=10) {seed();} };
 +
 +
  }
 +
 +
 
 +
script ( F_INVISIBLE, G_GOODPLANT, S_ORA_SEED, 9) {agent a=owner;
 +
if (a.stats==0) { whatroom(a); a.age_of_agent=a.age_of_agent+2;
 +
if ((a.tmp==99) || (a.age_of_agent>1500)) {deth (a);}
 +
if ((a.age_of_agent>1000) && (a.age_of_agent<1500)) {a.acceleration=0.50;a.stats=1;/*wait 75? */}
 +
a.anim(0, 1, 2, 3, 255);
 +
}
 +
if (a.stats!=0) { grow(a);} /* and not carr!!*/
 +
rndm(a);
 +
move_it(a);
 +
a.velocity (a.x_heading,a.y_heading);
 +
}
 +
 +
remove {
 +
    enum ( F_INVISIBLE, G_GOODPLANT, S_ORA) {|p| p.kill();}
 +
    enum ( F_INVISIBLE, G_GOODPLANT, S_ORA_SEED) {|p| p.kill();}   
 +
// Zap the scripts.
 +
deletescript(  F_INVISIBLE, G_GOODPLANT, S_ORA,9);
 +
deletescript(F_INVISIBLE, G_GOODPLANT ,S_ORA_SEED,9);
 +
}
 +
 +
</pre>
 +
 +
===mymacro.k for plant===
 +
TODO:
 +
* make the script more general,(for using with other plants)
 +
* document the macros.
 +
<pre>
 +
ovar numeric tmp[99];
 +
ovar numeric temp86[86];
 +
ovar numeric temp87[87];
 +
 +
define isok(numeric x,numeric y) returning numeric
 +
{
 +
  _caos {
 +
    .inline let $return = TMVT $x(r) $y(r);
 +
  };
 +
}
 +
define walldown() returning numeric
 +
{
 +
  _caos {
 +
    .inline let $return = OBST DOWN;
 +
    };
 +
  };
 +
define wallup() returning numeric
 +
{
 +
  _caos {
 +
    .inline let $return = OBST _UP_;
 +
    };
 +
  };
 +
 +
 +
define deth2(agent a) { agent b,c; b=null();c=heldBy(owner);
 +
if (c!=b)  { a.tmp=99;}
 +
else {
 +
if (owner.stage_of_life==0) {owner.baseIndex=0;framerate(3); a.anim(4);}
 +
  if (owner.stage_of_life==1) {owner.baseIndex=0;framerate(3); a.anim(5,4);}
 +
  if (owner.stage_of_life==9 || owner.stage_of_life==10)  {a.baseIndex=0;framerate(5);
 +
                                                                                                  a.anim(49,39,29,19,9,8,7,6,5,4);}
 +
kill(a);
 +
}
 +
}
 +
define deth(agent c) { agent a,b; b=null();//a=heldBy(owner);
 +
//if (a!=b)  { a.tmp=99;}
 +
//else {
 +
kill(c);
 +
//}
 +
}
 +
 +
define check(agent a) {
 +
numeric temp=0;numeric temp40;
 +
 +
  if (temp==0) { temp40=0; range (500);
 +
  _caos{esee 1 4 3002;}; temp40=temp40+1;_caos{next;}
 +
if (temp40>7) {kill(a); } temp=temp+1;} //deth2(a)
 +
 +
  if (temp==1) { temp40=0; 
 +
      _caos{etch 1 4 3002;}  temp40=temp40+1;_caos{next;}
 +
      if (temp40>2) {kill(a);} }//deth2(a) 
 +
 +
}
 +
 +
define grow (agent c) {numeric tmpx,tmpy,t1,t2;agent b;
 +
tmpx=owner.x();tmpy=owner.y();
 +
b=newcompound(F_INVISIBLE, G_GOODPLANT, S_ORA,"oraponge", 59 ,0 ,4200);
 +
b.attributes=192;
 +
b.perm=100;
 +
b. elasticity=20;
 +
b. clickAction=(-1);
 +
b.acceleration=1;
 +
b.aerodynamics=5;
 +
b. friction=100;
 +
b.pose=4;
 +
t1=isok(tmpx,tmpy);
 +
if (t1==1) {b.moveto(tmpx,tmpy);}
 +
      else  {b.kill;stop(); };
 +
   
 +
b.age_of_agent=0;
 +
b.stage_of_life=0;
 +
b.bioenergy=50;
 +
b.tick=5;
 +
_caos{slow;}
 +
deth(owner);
 +
}
 +
 +
 +
define seed() { numeric tmpx,tmpy,t1,tt,t3,t4,u;agent b;
 +
tt=0;t4=0;t3=0;b=owner;
 +
tmpx=b.x()+2;
 +
tmpy=b.y()-58;
 +
t1=70; range (500);
 +
tt=0;
 +
//this has to be changed !!
 +
_caos {ESEE 1 4 3003 ADDV $tt(rw) 1 NEXT;}
 +
if (tt<=4) {t3=getRandom(1,3);}
 +
if ((tt>=5) && (tt<=7))  {t3=getRandom(1,2);}
 +
if ((tt>=8) && (tt<=10)) {t3=1;}
 +
if (tt>10) {t3=0;deth2(b);stop();} //deth2(b)
 +
if (t3>0) {
 +
//reps t3
 +
b=newcompound(F_INVISIBLE, G_GOODPLANT ,S_ORA_SEED, "oraponge", 4 ,0,5000);
 +
b.attributes=199;
 +
b.behaviour=32;
 +
b.perm=100;
 +
b. elasticity=0;
 +
b. clickAction=(-1);
 +
b.acceleration=0;
 +
b.aerodynamics=0;
 +
b. friction=100;
 +
t1=isok(tmpx,tmpy);
 +
if (t1==1) {b.moveto(tmpx,tmpy);}
 +
      else  {b.kill;stop(); };
 +
//tt=getRandom((-1),1);
 +
b.velocity(tt,-3);
 +
b.age_of_agent=0;
 +
b.stage_of_life=0;
 +
b.bioenergy=20;
 +
b.tick=1;
 +
//_caos{slow;}
 +
}
 +
  b.stage_of_life=10;
 +
}
 +
 +
define whatroom(agent a) {
 +
if (roomOfTarg(a)==9) { a.temp86=a.temp86+1;
 +
do {if ((a.temp86>=0) && (a.temp86<=6)) {a.temp87=a.temp87+0.03;}
 +
if ((a.temp86>6) && (a.temp86<200)) {a.temp87=a.temp87+0.08;}
 +
a.acceleration=a.temp87;
 +
} until ((roomOfTarg(a)==9) || (a.temp86 >=200))
 +
if (a.temp86>200) {wait (getRandom (100,400));deth(a);}
 +
}
 +
if (roomOfTarg(a)!=9) { a.temp86=0; a.temp87=0; }
 +
a.acceleration=a.temp87;
 +
}
 +
/*
 +
subr room
 +
 +
 +
doif rtyp room ownr = 9
 +
setv ov86 0
 +
setv ov87 0
 +
endi
 +
accg ov87
 +
retn
 +
*/
 +
define rndm(agent a) { agent b;numeric d;
 +
do  { a.x_heading=getRandom((-2),2);
 +
} until (a.x_heading!=0);
 +
d=walldown();
 +
if (d<500) { do  { a.y_heading=getRandom((-1),1); } until (a.y_heading!=0);}
 +
if (d>500) { do  { a.y_heading=getRandom((-1),2); } until (a.y_heading!=0);}
 +
 +
}
 +
 +
define move_it(agent a) { numeric d,u,l,r;
 +
u=wallup();d=walldown();l=wallleft();r=wallright();
 +
if ((d<20) && (u>200)) { a.acceleration=3;a.x_heading=1 ;wait(10);_caos{STOP;};}
 +
if ((d<20) && (u<=200)) {a.y_heading=(-1);}
 +
if (l<50) {a.x_heading=getRandom(2,2);}
 +
if (r<50) {a.x_heading=getRandom((-2),(-1));}
 +
if (u<20) {a.y_heading=(2);}
 +
}
 +
 +
 +
</pre>
 +
 
==ADDITIONAL OPTIONS==
 
==ADDITIONAL OPTIONS==
 
''Geany IDE''  
 
''Geany IDE''  
Line 116: Line 486:
 
*more commands predefined ...
 
*more commands predefined ...
 
*Substituting  
 
*Substituting  
 +
 
  script (F_INVISIBLE, G_SYSTEM, S_SIMPLEMONITOR,2000)
 
  script (F_INVISIBLE, G_SYSTEM, S_SIMPLEMONITOR,2000)
 
  with
 
  with
 
  script (monitor , clicked) ...
 
  script (monitor , clicked) ...
 +
 +
*CAOS code optimization, in the output file
  
 
==NOTES==
 
==NOTES==
  
 
==Link==
 
==Link==
Download at http://www.creaturetopia.org/viewtopic.php?f=10&t=117&p=6525#p6525
+
Download at http://ctopia.treesprite.com/treesprite.com/ctopia/viewtopic.php?f=10&t=117&p=6525
  
[[Category:Unofficial_C3/DS_Tools]]
+
[[Category:Unofficial_C3/DS_Tools]][[Category:Tutorials]]

Revision as of 05:48, 28 September 2018

Editnorn.png This article is about a project that is in development.
Information may change significantly as the project progresses.

This is a brief tutorial for working with Kaos.

Install

I presume you have some basic knowlage, of inner caos-working, c16-image-editor, folders, about agents etc.

  • Linux : Download kaos_1.tar.bz2 , untar and copy kaos and mach.sh in /usr/local/bin.
  • Win(XP) : Download installer, at c:\programme\kaos is batch-file run_kaos.bat, copy this in workingdir. then type :run_kaos foo.k

Whats new

My version runs with the normal Linux Creatures Evolution Engine, if the cos-files are put in Bootstrap-folder. The Numbers of script command could now be up to 65535.

The big advantage of kaos is : the scripts are more readable and modern as caos .

My precompiled version of kaos-compiler includes the following libraries:

attrbhvr.k
prelude.k
KaosLib.k
lib2.k

In these libraries most commands for everyday use of caos are defined. If you need a new command or macro write an include file and bind it to your source. You should only to recompile if you have a lot of libraries for everyday use.

How to use

Simply take a text editor (geany would be perfect , I am planning some extensions), write code and save file with a .k file extension. Then type mach.sh foo.k , output is saved as foo.k.cos.

For using newcompound(), in my way first you have to define the variables:

...
define numeric F_INVISIBLE = 1 ;define numeric G_SYSTEM = 1 ; ...
...
newcompound(F_INVISIBLE, G_SYSTEM, S_SIMPLEMONITOR, "ds gui", 77,2, 5000);
...

or you write an extra file with predefined constants. see classifiers.k

This allows you to build an table for multiple use without looking for Classification system all time.

For other constants see e.g. predef.k (these are the same used by Docking Station ov01,ov02... for agents)

To define new commands make new file e.g. mylib.k and then

...
#include my.lib 
#include classifiers.k 
#include predef.k 
...

NOTE : the includes Should BE AT THE TOP OF THE FILE (an preprocesso writen in haskell does the work)

How to write a new kaos command

This is simple . See first in doc/index.html if the command is already defined.

For agent independent commands: You need for example HAND, which is define in CAOS-handbook as:

HAND (command) name_for_the_hand (string)
 Sets the name of the hand. By default this is 'hand'.
HAND (string)
 This returns the name of the hand.

The first is a value assignment, the second returns the assigned value.

To define a new kaoscommand, type :

 /**First:
 HAND string
 */
 define new_name_of_hand(string name) /* could be string numeric or agent */ {

	_caos { HAND $name(r);

	}

 }

then you could use later : new_name_of_hand("Norn"); /* same type as definition*/ => HAND Norn

/**Second:
HAND returning string
 */
define whats_your_name() returning string  /* could be string numeric or agent */ {

	     _caos { .static let $return = HAND; };

}; 

usage : string c = whats_your_name(); prints(c); /* must be the same type as in definition prints is debug*/ =>dbg: outs hand

For agent related commands, e.g. VELO:

/**
VELO
*/
define velocity( agent a,numeric x, numeric y)
{
  _caos {
    .targ < $a {
      VELO $x(r) $y(r);
    };
  };
}

usage : velocity(a,(20),0); or a.velocity((-20),0); ( where a is agent), both mean the same => VELO 20 0

A little demo-agent

First lets start easy . A moving window at the left side of the main screen, which shows the x,y position of mouse-pointer (hand).
Comments are the same as c,c++

  • one line to end //
  • multiline /* ..... */

If keywords are used (inside the comment lines) e.g. Script, File, Function... , then it is possible to generate with NaruralDocs auto-documents.


/**
    Script: simplemonitor
    ___________________________________________________________________________

    Version 0.1
    Copyright (C) 2008 august0815
   * under GNU
 * -----------------------------------------------------------------------------
 * Agent  : F_INVISIBLE, G_SYSTEM, S_SIMPLEMONITOR
 * Sprites: ds gui ( orginal dockingstation sprites)
 * -----------------------------------------------------------------------------
 */

now the included files:(with constants,predefs...). To download see : lifandi.ccdevnet.org/index.php/Script_Nummber_overview (down)

#include classifiers.k 
#include predef.k 

This is how to access OV-Varioables :here OV99 Note must be at top BEFORE install begins!!

ovar numeric hidden[99];//true=1 false =0

The basic-funktions of agents are install{}, script{} ,remove{}
it is not necessary to put all in one file but more readable.

Inside install{} all information about attributes , images are written it is the same as INST in caos!

install {
        agent simplemonitor;
      	simplemonitor = newcompound(F_INVISIBLE, G_SYSTEM, S_SIMPLEMONITOR, "ds gui", 77,2, 5000);
      	simplemonitor.attributes = A_CAMERASHY|A_FLOATABLE|A_INVISIBLE;;
        simplemonitor.floatat(-331, 400);
        simplemonitor.tick = 2;
        simplemonitor.hidden=1;
      	simplemonitor.newtextinputpart(1, "ds gui", 4, 100, 100, 0, 0, "whiteontransparentchars");
        simplemonitor.changepart(1);
		simplemonitor.textformat(1 ,1, 1, 1, 1, 1, 0);	
		simplemonitor.newtextinputpart(2, "ds gui", 4, 100, 135, 0, 0, "whiteontransparentchars");
        simplemonitor.changepart(2);
		simplemonitor.textformat(1 ,1, 1, 1, 1, 1, 0);	
		simplemonitor.newbutton(3, "ds gui", 14, 77, 331, 0,  0 ,"[]", 2000, 1);
		simplemonitor.newbutton(4, "ds gui", 16, 77, 331, 170,  0 ,"[]", 2001, 1);
     }

This is the same as SCRP

 
script (F_INVISIBLE, G_SYSTEM, S_SIMPLEMONITOR,2000) {agent a=owner;
 if (a.hidden==0) {velocity(a,(-20),0);wait(15);velocity(a,(0),0);}
 a.hidden=1;
  }
script (F_INVISIBLE, G_SYSTEM, S_SIMPLEMONITOR,2001) {agent a=owner;
 if (a.hidden==1) { velocity(a,(20),0);wait(15);velocity(a,(0),0);}
 a.hidden=0;
  }     
script ( F_INVISIBLE, G_SYSTEM, S_SIMPLEMONITOR, 9) {
	agent s;s=owner;numeric room;numeric x;numeric y;numeric type;string fo;numeric foo;string fooo;
	string ausgabe="Room ";numeric xx;numeric yy;
	s.changepart(1);
	room=getroomid(mouseX(),mouseY());
        ausgabe="X:  " ;
        xx = pointer.x;
        ausgabe=addstring(ausgabe,NumToStr(xx));
        s.parttext=ausgabe;
	s.changepart(2); 
        ausgabe="Y:  " ;
        yy = pointer.y;
        ausgabe=addstring(ausgabe,NumToStr(yy));
        s.parttext=ausgabe;
}

The RSCR

remove {
     enum (F_INVISIBLE, G_SYSTEM, S_SIMPLEMONITOR) {|p| p.kill();}
	// Zap the scripts.
	deletescript( F_INVISIBLE, G_SYSTEM, S_SIMPLEMONITOR,9);
}

Reimplement of orange sponge.cos from C3

Analyse of Orange Sponge.cos from C3


First look at the cos script. The agent has only one script :timer!

The Subs I want to port to define macros.

The script mymacro.k could be used for other plant similarly to orange sponge (e.g. opal sponge ...)

Main script

It is not exactly the same as in C3. TODO:

  • Lifecycle of orange sponge fine tuning
  • Seed ,C3 like growing conditions.(there are some little bugs in the if conditions.)
/**
    Script: orang.k
    ___________________________________________________________________________
    Version 0.1
    Copyright (C) 2009 august0815
   * under GNU
 * -----------------------------------------------------------------------------
 * Agent  : F_INVISIBLE, G_GOODPLANT, S_ORA
 * Sprites: oraponge.c16 //form C3 
 * -----------------------------------------------------------------------------
 */
/* Save this as orang.k  an compile with run_kaos.sh orang.k (run_kaos.bat orang.k ) */
// include files must be in the same folder  !!
define numeric F_INVISIBLE = 1 ;
define numeric G_GOODPLANT = 4;
define numeric S_ORA =3002;
define numeric S_ORA_SEED=3003;
#include predef.k 

#include mymacro.k 

ovar numeric temp40[40];

install {
numeric ypos=9500; // in DS meso
numeric xpos=1250; // in DS meso
numeric t=0;
do{
t=t+1;
        agent opal;numeric x,y,z;
      	opal = newcompound(F_INVISIBLE, G_GOODPLANT, S_ORA,"oraponge", 59 ,0 ,4200);
      	opal.attributes=197;
		opal.perm=100;
		opal.elasticity=0;
		opal.clickAction=(-1);
		opal.acceleration=1;
		opal.aerodynamics=5;
		opal.friction=100;
		opal.pose=4;
		x=(t*20)+1250;//xops
		 	
      	opal.moveto(x,ypos); 
      	opal.age_of_agent=399;
		opal.stage_of_life=8;
		opal.bioenergy=55;
		opal.tick=10;
	} while t<2
}
script ( F_INVISIBLE, G_GOODPLANT, S_ORA, 9) {agent a=owner; numeric randval;
   a.age_of_agent=a.age_of_agent+1;
   if (roomOfTarg(a)==9) {deth2(a);}//NOT IN WATER :)
   
   if (a.age_of_agent>700) {deth2(a);}
   if ((a.age_of_agent>0) && (a.age_of_agent<25)) {a.pose=4; a.stage_of_life=0;};
   if ((a.age_of_agent>=25) && (a.age_of_agent<75) && (a.stage_of_life==0) ) {a.pose=5; a.stage_of_life=1;};
   if ((a.age_of_agent>=75) && (a.age_of_agent<100)&& (a.stage_of_life==1)) {a.pose=6; a.stage_of_life=2;};
   if ((a.age_of_agent>=100) && (a.age_of_agent<150) && (a.stage_of_life==2)) {a.pose=7; a.stage_of_life=3;};
   if ((a.age_of_agent>=150) && (a.age_of_agent<200) && (a.stage_of_life==3)) {a.pose=8; a.stage_of_life=4;};
   if ((a.age_of_agent>=200) && (a.age_of_agent<250) && (a.stage_of_life==4)) {a. baseIndex=9; a.stage_of_life=5;};//set base 9
   if ((a.age_of_agent>=250) && (a.age_of_agent<300) && (a.stage_of_life==5)) {a. baseIndex=19; a.stage_of_life=6;};
   if ((a.age_of_agent>=300) && (a.age_of_agent<350) && (a.stage_of_life==6)) {a. baseIndex=29; a.stage_of_life=7;};
   if ((a.age_of_agent>=350) && (a.age_of_agent<400) && (a.stage_of_life==7)) {a. baseIndex=39; a.stage_of_life=8;};
   if ((a.age_of_agent>=400) && (a.age_of_agent<450) && (a.stage_of_life==8)) {a. baseIndex=49; a.stage_of_life=9;};

   if ((a.stage_of_life>4) && (a.stage_of_life<10) ) {a.anim(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 255);};
   
   if (a.age_of_agent>700) {kill(a);}/* {deth2(a);}*/; //is needed?
   
   if ((a.stage_of_life>0) || (a.stage_of_life<2) ) {check(a);};
   
   if (a.stage_of_life==10) { a.temp40=a.temp40+1;
   								if (a.temp40==20) {a.stage_of_life=9;}
   							}	
 
	
	if (a.stage_of_life==9)  {randval=getRandom(1,20); if (randval=10) {seed();} };
	
  }

  
 script ( F_INVISIBLE, G_GOODPLANT, S_ORA_SEED, 9) {agent a=owner;
 		if (a.stats==0) { whatroom(a); a.age_of_agent=a.age_of_agent+2;
 			if ((a.tmp==99) || (a.age_of_agent>1500)) {deth (a);}
 			if ((a.age_of_agent>1000) && (a.age_of_agent<1500)) {a.acceleration=0.50;a.stats=1;/*wait 75? */}
 			a.anim(0, 1, 2, 3, 255);
			} 
 		if (a.stats!=0)	{ grow(a);}	/* and not carr!!*/
 		rndm(a);
 		move_it(a);
 		a.velocity (a.x_heading,a.y_heading);
}

remove {
     enum ( F_INVISIBLE, G_GOODPLANT, S_ORA) {|p| p.kill();}
     enum ( F_INVISIBLE, G_GOODPLANT, S_ORA_SEED) {|p| p.kill();}    
	// Zap the scripts.
	deletescript(  F_INVISIBLE, G_GOODPLANT, S_ORA,9);
	deletescript(F_INVISIBLE, G_GOODPLANT ,S_ORA_SEED,9);
}

mymacro.k for plant

TODO:

  • make the script more general,(for using with other plants)
  • document the macros.
ovar numeric tmp[99];
ovar numeric temp86[86];
ovar numeric temp87[87];

define isok(numeric x,numeric y) returning numeric
{
  _caos {
    .inline let $return = TMVT $x(r) $y(r);
  };
}
define walldown() returning numeric
{
  _caos {
     .inline let $return = OBST DOWN;
    };
  };
define wallup() returning numeric
{
  _caos {
     .inline let $return = OBST _UP_;
    };
  };


define deth2(agent a) { agent b,c; b=null();c=heldBy(owner);
				if (c!=b)   { a.tmp=99;}
					else 	{ 
							if (owner.stage_of_life==0) {owner.baseIndex=0;framerate(3); a.anim(4);}
							  if (owner.stage_of_life==1) {owner.baseIndex=0;framerate(3); a.anim(5,4);}
							  if (owner.stage_of_life==9 || owner.stage_of_life==10)  {a.baseIndex=0;framerate(5); 
                                                                                                   a.anim(49,39,29,19,9,8,7,6,5,4);}
							kill(a);
							}	
				}
define deth(agent c) { agent a,b; b=null();//a=heldBy(owner);
				//if (a!=b)   { a.tmp=99;}
					//else {
					 kill(c);
					 //}	
				}
				
define check(agent a) {
 numeric temp=0;numeric temp40;

  if (temp==0) { temp40=0; range (500);
  				_caos{esee 1 4 3002;}; temp40=temp40+1;_caos{next;} 
 	 			if (temp40>7) {kill(a); } temp=temp+1;} //deth2(a) 
 	 			
  if (temp==1) { temp40=0;  
       _caos{etch 1 4 3002;}  temp40=temp40+1;_caos{next;}
       if (temp40>2) {kill(a);} }//deth2(a)  

}		

define grow (agent c) {numeric tmpx,tmpy,t1,t2;agent b;
			tmpx=owner.x();tmpy=owner.y();
			b=newcompound(F_INVISIBLE, G_GOODPLANT, S_ORA,"oraponge", 59 ,0 ,4200);
			b.attributes=192;
			b.perm=100;
			b. elasticity=20;
			b. clickAction=(-1);
			b.acceleration=1;
			b.aerodynamics=5;
			b. friction=100;
			b.pose=4;
			t1=isok(tmpx,tmpy);
			if (t1==1) {b.moveto(tmpx,tmpy);}
		       else  {b.kill;stop(); };
		    
			b.age_of_agent=0;
			b.stage_of_life=0;
			b.bioenergy=50;
			b.tick=5;
			_caos{slow;}
			deth(owner);
}


define seed() { numeric tmpx,tmpy,t1,tt,t3,t4,u;agent b;
				tt=0;t4=0;t3=0;b=owner;
				tmpx=b.x()+2;
				tmpy=b.y()-58;
				t1=70; 	range (500);
				tt=0;
				//this has to be changed !!
				_caos {ESEE 1 4 3003 ADDV $tt(rw) 1 NEXT;}
				if (tt<=4) {t3=getRandom(1,3);}
				if ((tt>=5) && (tt<=7))  {t3=getRandom(1,2);}
				if ((tt>=8) && (tt<=10)) {t3=1;}
				if (tt>10) {t3=0;deth2(b);stop();} //deth2(b)
				if (t3>0) {
		 //reps t3
		 		b=newcompound(F_INVISIBLE, G_GOODPLANT ,S_ORA_SEED, "oraponge", 4 ,0,5000);
				b.attributes=199;
				b.behaviour=32;
			 	b.perm=100;
				b. elasticity=0;
				b. clickAction=(-1);
				b.acceleration=0;
				b.aerodynamics=0;
				b. friction=100;
				t1=isok(tmpx,tmpy);
				if (t1==1) {b.moveto(tmpx,tmpy);}
		       		else  {b.kill;stop(); };
				//tt=getRandom((-1),1);
				b.velocity(tt,-3);
				b.age_of_agent=0;
				b.stage_of_life=0;
				b.bioenergy=20;
				b.tick=1;
				//_caos{slow;}
				}
			   b.stage_of_life=10;
				} 
				
define whatroom(agent a) { 
	if (roomOfTarg(a)==9) { a.temp86=a.temp86+1;
							do {if ((a.temp86>=0) && (a.temp86<=6)) {a.temp87=a.temp87+0.03;}
								if ((a.temp86>6) && (a.temp86<200)) {a.temp87=a.temp87+0.08;}
								a.acceleration=a.temp87;
								} until ((roomOfTarg(a)==9) || (a.temp86 >=200))
							if (a.temp86>200) {wait (getRandom (100,400));deth(a);}
							}
	if (roomOfTarg(a)!=9) { a.temp86=0; a.temp87=0;	}
	a.acceleration=a.temp87;				
}
/*
	subr room
		
		
		doif rtyp room ownr = 9
			setv ov86 0
			setv ov87 0
		endi
		accg ov87
	retn
	*/
define rndm(agent a) { agent b;numeric d;
 do  { a.x_heading=getRandom((-2),2);
 	 } until (a.x_heading!=0);
 d=walldown();
 if (d<500) { do  { a.y_heading=getRandom((-1),1); 	 } until (a.y_heading!=0);}
 if (d>500) { do  { a.y_heading=getRandom((-1),2); 	 } until (a.y_heading!=0);}
 
}	
			
define move_it(agent a) { numeric d,u,l,r;
 u=wallup();d=walldown();l=wallleft();r=wallright();
 if ((d<20) && (u>200)) { a.acceleration=3;a.x_heading=1 ;wait(10);_caos{STOP;};}
 if ((d<20) && (u<=200)) {a.y_heading=(-1);} 
 if (l<50) {a.x_heading=getRandom(2,2);}
 if (r<50) {a.x_heading=getRandom((-2),(-1));}
 if (u<20) {a.y_heading=(2);}
}		


ADDITIONAL OPTIONS

Geany IDE

TODO

  • more commands predefined ...
  • Substituting
script (F_INVISIBLE, G_SYSTEM, S_SIMPLEMONITOR,2000)
with
script (monitor , clicked) ...
  • CAOS code optimization, in the output file

NOTES

Link

Download at http://ctopia.treesprite.com/treesprite.com/ctopia/viewtopic.php?f=10&t=117&p=6525