source: experiments/frams/foraminifera/data/scripts/foraminifera.expdef @ 430

Last change on this file since 430 was 430, checked in by oriona, 9 years ago

new reticulopodia range implemented, visualization of reticulopodia

File size: 19.2 KB
Line 
1expdef:
2name:Reproduction of benthic foraminifera
3info:~
4Genes and parameter values which control reproduction are stored in user1 and user2 fields.
5
6user1:
7genes which are not encoded in Ff genotype:
8min_repro_energy - Minimum energy necessary for reproduction
9hibernation - Defines foram behavior in the case of no nutrients
10
11user2:
12Physiological parameters of foraminifera:
13max_energy_level - maximum energy level reached so far
14gen - generation: 0 haploid, 1 diploid
15species - species: 0 hibernating 1 not hibernating
16hibernated - 0/1 foram isn't/is hibernated
17reproduce - 0/1 foram isn't/is ready for reproduction
18~
19code:~
20
21/*
22changes 2015-06-24:
23- xxx.get(...) changed to xxx[...]
24- xxx.set(...,...) changed to xxx[...]=...
25- function placeRandomlyNotColliding(cr) explicitly called when adding a new creature, and removed collision checking from onForamsBorn() which is also called when "growing" (since "growing" is implemented as creating a new creature in place of the old one, so onForamsBorn() is also called)
26- use creature's center (not the bbox corner) when growing
27- added "S" receptor to visualize the difference between diplo and haplo generations
28- signal.value is a MechPart (a reference) so it does not have to be updated after changing the object location
29*/
30
31global nutrientenergywaiting;
32global reprocounter;
33global colors;
34global chambers;
35global o;
36global max_chamber_energ;
37global dir_change;
38
39@include "foraminifera.inc"
40
41// -------------------------------- experiment begin --------------------------------
42
43function onExpDefLoad()
44{
45        // define genotype and creature groups
46        GenePools.clear();
47        Populations.clear();
48        GenePools[0].name = "Unused";
49
50        var pop = Populations[0];
51        pop.name = "Forams";
52        pop.en_assim = 0;
53        pop.nnsim = 0;
54        pop.enableperf = 1;
55        pop.death = 1;
56        pop.energy = 1;
57        pop.selfmask = 0x10001;
58        pop.othermask = 0x20001;
59        //pop.selfmask = 0x20002; pop.othermask = 0x10002;
60        pop.perfperiod = 25;
61
62        pop = Populations.addGroup("Nutrients");
63        pop.nnsim = 0;
64        pop.enableperf = 0;
65        pop.death = 1;
66        pop.energy = 1;
67        pop.selfmask = 0x20002;
68        pop.othermask = 0x10000;
69        //pop.othermask = 0x10002;
70
71        //ExpParams.showRet = 1; //uncomment to show reticulopodia
72
73        pop = Populations.addGroup("Reticulopodia");
74        pop.nnsim = 0;
75        pop.enableperf = 0;
76        pop.death = 0;
77        pop.energy = 0;
78        pop.selfmask = 0x20002;
79        pop.othermask = 0x10000;
80       
81        //world
82        SignalView.mode = 1;
83        ExpParams.world_size = scale(40000);
84        World.wrldwat = 200;
85        World.wrldsiz = ExpParams.world_size;
86        World.wrldbnd = 1;
87        ExpParams.stress = 1;
88        ExpParams.creath = -0.99; //just above the bottom
89        ExpParams.autorestart = 0;
90
91        //ExpParams.logging = 1; //uncomment to enable logging simulation parameters to log files
92
93        //reproduction
94        ExpParams.foramPop = 10;       
95        ExpParams.crossprob = 0.4;
96        ExpParams.mutationprob = 0.2;
97        ExpParams.repro_time = 20;
98        reprocounter = 0;
99
100        //morphology
101        dir_change = 500;
102        ExpParams.zone1_range = scale(5000);
103        ExpParams.zone2_range = scale(8000);
104        init_chambers();
105        ExpParams.chamber_proculus_haplo = scale(50);
106        ExpParams.chamber_difference_haplo = 0.0;
107        ExpParams.chamber_proculus_diplo = scale(20);
108        ExpParams.chamber_difference_diplo = 0.2;
109        max_chamber_energ = [Vector.new(), Vector.new()];
110        for (var j = 0; j < 2; j++)
111        {
112                for (var i = 0; i < chambers[0].size; i++)
113                {
114                        max_chamber_energ[j].add(((Math.pow(getProperty(j, "chamber_proculus"),3) + Math.pow(getProperty(j, "chamber_proculus") + (i) * getProperty(j, "chamber_difference"),3))*(i+1))/2);
115                }                                 
116        }
117
118        //energetics
119        ExpParams.min_repro_energ_haplo = 4;
120        ExpParams.min_repro_energ_diplo = 6;
121
122        ExpParams.e_meta = 0.0002;
123        ExpParams.energy_hib = 0.0001;
124        ExpParams.energy_move = 0.00025;
125
126        ExpParams.energies0_haplo = max_chamber_energ[0][0] - 0.001*max_chamber_energ[0][0];
127        ExpParams.energies0_diplo = max_chamber_energ[1][0] - 0.001*max_chamber_energ[1][0];
128        ExpParams.feedtrans = 0.5;
129        ExpParams.e_repro_cost_haplo = 0.7;
130        ExpParams.e_repro_cost_diplo = 0.3;
131
132        //nutrients
133        ExpParams.nutrientsize = scale(10);
134        ExpParams.energy_nut = 100 * Math.pow(ExpParams.nutrientsize, 3);
135        ExpParams.nutrientPop = 1;
136        ExpParams.feedrate = 0.1;
137        nutrientenergywaiting = ExpParams.energy_nut;
138        ExpState.totaltestedcr = 0;
139        ExpState.nutrient = "";
140}
141
142@include "standard_placement.inc"
143
144function scale(x)
145{
146        return x*0.025;
147}
148
149function getProperty(gen, prop_id)
150{
151        var ploid = "haplo";
152        if (gen == 1) ploid = "diplo";
153        return ExpParams.[prop_id + "_" + ploid];
154}
155
156function addInitialForam(species, i)
157{
158        var geno = createForamGenotype(0, species, 0);
159        var cr = Populations[0].add(geno);
160        cr.name = "Initial creature" + species + "_" + i;
161        placeCreatureRandomly(cr, 0, 0);
162        cr.energy0 = getProperty(0, "energies0");
163        cr.energy = cr.energy0;
164        setGenotype({"opt" : 0, "cr" : cr, "species" : species});
165}
166
167function onExpInit()
168{
169        Populations[0].clear();
170        Populations[1].clear();
171        Populations[2].clear();
172
173        for (var i = 0; i < ExpParams.foramPop; i++)
174        {
175                addInitialForam(0, i); 
176                addInitialForam(1, i);
177        }
178        o = Populations[0][0].getMechPart(0).orient.clone();
179        ExpState.totaltestedcr = 0;
180        nutrientenergywaiting = ExpParams.energy_nut;
181}
182
183function onExpLoad()
184{
185        for (var pop in Populations)
186                pop.clear();
187
188        Loader.addClass(sim_params.*);
189        Loader.setBreakLabel(Loader.BeforeUnknown, "onExpLoad_Unknown");
190        Loader.run();
191
192        Simulator.print("Loaded " + Populations[0].size + " Forams and " + Populations[1].size + " nutrient objects");
193}
194
195function onExpLoad_Unknown()
196{
197        if (Loader.objectName == "org") // saved by the old expdef
198        {
199                var g = Genotype.newFromString("");
200                Loader.currentObject = g;
201                Interface.makeFrom(g).setAllDefault();
202                Loader.loadObject();
203                var cr = Populations[0].add(g);
204                if (cr != null)
205                {
206                        //cr.rotate(0,0,Math.rnd01*Math.twopi);
207                        if ((typeof(g.user1) == "Vector") && (g.user1.size >= 3))
208                        {
209                                // [x,y,energy]
210                                cr.move(g.user1[0] - cr.center_x, g.user1[1] - cr.center_y, 0);
211                                cr.energy = g.user1[2];
212                        }
213                        else
214                        {
215                                cr.move(Math.rnd01 * World.wrldsiz - cr.center_x, Math.rnd01 * World.wrldsiz - cr.center_y, 0);
216                        }
217                }
218        }
219        else if (Loader.objectName == "Creature")
220        {
221                Loader.currentObject = CreatureSnapshot.new();
222                Loader.loadObject();
223                Populations[0].add(Loader.currentObject);
224        }
225}
226
227function onExpSave()
228{
229        File.writeComment("saved by '%s.expdef'" % Simulator.expdef);
230
231        var tmpvec = [], i;
232
233        for(var cr in Populations[1])
234                tmpvec.add([cr.center_x, cr.center_y, cr.energy]);
235
236        ExpState.nutrient = tmpvec;
237        File.writeObject(sim_params.*);
238        ExpState.nutrient = null; //vectors are only created for saving and then discardedsetForam
239
240        for (var cr in Populations[0])
241                File.writeObject(cr);
242}
243
244// -------------------------------- experiment end --------------------------------
245
246// -------------------------------- foram begin -----------------------------------
247
248function setForamMeta(cr, gen)
249{
250        cr.idleen = ExpParams.e_meta * max_chamber_energ[gen][Math.min(lastChamberNum(cr), max_chamber_energ[gen].size-1)];
251}
252
253function lastChamberNum(cr)
254{
255        return cr.numparts-1;
256}
257
258function onForamsBorn(cr)
259{
260        setForamMeta(cr, 1);
261        if (ExpParams.showRet == 1)
262        {
263                var ret = Populations[2].add("//0\np:sh=3,sx=0.01,sy="+ExpParams.zone1_range+",sz="+ExpParams.zone1_range+",ry=1.57");
264                cr.user3 = ret;
265        }
266}
267
268function placeRandomlyNotColliding(cr)
269{
270        var retry = 100; //try 100 times
271        while (retry--)
272        {
273                placeCreatureRandomly(cr, 0, 0);
274                if (!cr.boundingBoxCollisions(0))
275                        return cr;
276        }
277
278        Populations[0].delete(cr);
279}
280
281function foramGrow(cr, chamber_num)
282{
283        var geno = createForamGenotype(cr.user2["gen"], cr.user2["species"], chamber_num+1);
284        var cr2 = Populations[0].add(geno);
285
286        cr2.energy0 = cr.energy;
287        cr2.energy = cr2.energy0;
288
289        setGenotype({"cr" : cr2, "parent_user1" : cr.user1, "parent_user2" : cr.user2, "opt" : 2});
290        cr2.moveAbs(cr.center_x - cr2.size_x / 2, cr.center_y - cr2.size_y / 2, cr.pos_z);
291        setForamMeta(cr2, cr2.user2["gen"]);
292
293        if (ExpParams.showRet == 1)
294        {
295                Populations[2].delete(cr.user3);
296        }
297        Populations[0].delete(cr);
298}
299
300function stepToNearest(cr, range)
301{
302        var p = cr.getMechPart(0);
303        var n = cr.signals.receiveSet("nutrient", ExpParams.zone2_range);
304
305        //if signals are received find the source of the nearest
306        if (n.size > 0)
307        {
308                var i;
309                var mp;
310                var distvec = XYZ.new(0, 0, 0);
311                var dist;
312                var mindist = 100000000000;
313                var mindistvec = null;
314                var eating = 0;
315
316                for (i = 0; i < n.size; i++)
317                {
318                        mp = n[i].value.getMechPart(0);
319                        distvec.set(mp.pos);
320                        distvec.sub(p.pos);
321                        dist = distvec.length;
322                        if (dist < ExpParams.zone1_range)
323                        {
324                                if (n[i].value != null)
325                                {
326                                        energyTransfer(cr, n[i].value);
327                                        eating = 1;
328                                }
329                        }
330                        else if (eating == 0 && cr.user2["hibernated"] == 0 && dist < mindist)
331                        {
332                                mindist = dist;
333                                mindistvec = distvec.clone();
334                        }
335                }
336
337                if (!eating && cr.user2["hibernated"] == 0)
338                {
339                        mindistvec.normalize();
340                        mindistvec.scale(-0.08);
341                        cr.localDrive = mindistvec;
342                        moveEnergyDec(cr);
343                }
344
345                return 1;
346        }
347       
348        else
349                return 0;
350}
351
352function moveEnergyDec(cr)
353{
354        if (cr.user2["hibernated"] == 0)
355        {
356                cr.energy_m += ExpParams.energy_move * max_chamber_energ[cr.user2["gen"]][Math.min(lastChamberNum(cr), (max_chamber_energ[cr.user2["gen"]].size)-1)];
357        }
358}
359
360function foramMove(cr)
361{
362        //TODO moving inside sediment?
363
364        //adjustment in z axis
365        cr.moveAbs(cr.pos_x, cr.pos_y, 0);
366
367        //are there any nutrients in zone 1 or 2?
368        {
369                var moved = stepToNearest(ExpParams.zone2_range); //TODO weighted sum of distance and energy
370                if (moved==1)
371                {
372                        return;
373                }
374        }
375
376        //no nutrients in zone 2
377        var hibernation = 0;
378        if (cr.user2["gen"] == 0) hibernation =  cr.user1["hibernation"];
379        else hibernation =  cr.user1[0]["hibernation"];
380        //hibernation
381        if (hibernation == 1)
382        {
383                reverseHib(cr);
384                cr.localDrive = XYZ.new(0,0,0);
385        }
386        //random move
387        else if (cr.lifespan%dir_change == 0)
388        {
389                var dir = (Math.rndUni(-ExpParams.zone2_range, ExpParams.zone2_range), Math.rndUni(-ExpParams.zone2_range, ExpParams.zone2_range), 0);//(0.1 * Math.rnd01, 0.1 * Math.rnd01, 0);       
390                dir.normalize();
391                dir.scale(-0.08);
392                cr.localDrive = dir;
393                moveEnergyDec(cr);
394        }
395}
396
397function energyTransfer(cr1, cr2)
398{
399        cr1.localDrive = XYZ.new(0,0,0);
400        var e = cr2.getPart(0).ing * ExpParams.feedtrans; //TODO efficiency dependent on age
401        e = Math.min(cr2.energy, e) + 0.0000001;
402        //Simulator.print("transferring "+e+" to "+cr1.name+" from "+cr2.name+" ("+cr2.energy+")");
403        cr2.energy_m = cr2.energy_m + e;
404        cr1.energy_p = cr1.energy_p + e;
405        if (cr1.user2["hibernated"] == 1)
406        {
407                reverseHib(cr1);
408        }
409}
410
411function reverseHib(cr)
412{
413        if (cr.user2["hibernated"] == 1)
414        {
415                setForamMeta(cr, cr.user2["gen"]); //unhibernate
416        }
417        else
418        {
419                cr.idleen = ExpParams.energy_hib * max_chamber_energ[cr.user2["gen"]][Math.min(lastChamberNum(cr), (max_chamber_energ[cr.user2["gen"]].size)-1)]; //hibernate
420        }
421        cr.user2["hibernated"] = 1 - cr.user2["hibernated"];
422}
423
424function onForamsStep(cr)
425{
426        cr.getMechPart(0).orient.set(o);
427        if (ExpParams.showRet == 1)
428                cr.user3.moveAbs(cr.center_x-ExpParams.zone1_range, cr.center_y-ExpParams.zone1_range, cr.center_z-ExpParams.zone1_range-getProperty(cr.user2["gen"], "chamber_proculus"));
429
430        if (deathConditions(cr) == 1)
431        {
432                Populations[0].kill(cr);
433                return;
434        }
435
436        foramMove(cr);
437
438        var repro = foramReproduce(cr);
439        if (repro == 1)
440        {
441                return;
442        }
443
444        cr.user2["max_energy_level"] = Math.max(cr.energy, cr.user2["max_energy_level"]);
445        if  (lastChamberNum(cr) <= chambers[0].size-1)
446        {
447                if ((cr.user2["max_energy_level"] >= max_chamber_energ[cr.user2["gen"]][lastChamberNum(cr)]))   
448                {
449                        foramGrow(cr, lastChamberNum(cr));
450                }       
451        }       
452}
453
454function deathConditions(cr)
455{
456        if ((cr.energy <= ExpParams.e_death_level) || (Math.rnd01 < ExpParams.hunted_prob))
457                return 1;
458        else
459                return 0;
460}
461
462function onForamsDied(cr)
463{
464        if (ExpParams.showRet == 1)
465        {
466                Populations[2].delete(cr.user3);
467        }
468        //fossilization
469        var geno = GenePools[0].add(cr.genotype);
470        geno.user1 = cr.user1;
471        geno.user2 = cr.user2;
472        if (ExpParams.logging == 1) Simulator.print("\"" + cr.name + "\" died...");
473        ExpState.totaltestedcr++;
474}
475
476// --------------------------------foram end -------------------------------------
477
478// -------------------------------- nutrient begin --------------------------------
479
480function createNutrientGenotype(nutrientsize, zone1_range)
481{
482        return "//0\np:sh=3,sx="+(nutrientsize+25)+",sy="+nutrientsize+",sz="+nutrientsize+",ry=1.5,vr=0.0,1.0,0.0";
483}
484
485function onNutrientsStep(cr)
486{
487        cr.moveAbs(cr.pos_x % ExpParams.world_size, cr.pos_y % ExpParams.world_size, -ExpParams.zone1_range+0.5);
488}
489
490function addNutrient()
491{
492        var cr = Populations[1].add(createNutrientGenotype(ExpParams.nutrientsize, ExpParams.zone1_range));
493
494        cr.name = "Nutrients";
495        cr.idleen = 0;
496        cr.energy0 = ExpParams.energy_nut;
497        cr.energy = cr.energy0;
498        cr.signals.add("nutrient");
499
500        cr.signals[0].value = cr;
501
502        placeCreatureRandomly(cr, 0, 0);
503}
504
505function nutrientGrowth()
506{
507        nutrientenergywaiting = nutrientenergywaiting + ExpParams.feedrate;
508        if (nutrientenergywaiting > ExpParams.energy_nut)
509        {
510                for (var i = 0; i < ExpParams.nutrientPop; i++)
511                {
512                        addNutrient();
513                }
514
515                nutrientenergywaiting = 0.0;
516                Simulator.checkpoint();
517        }
518}
519
520// -------------------------------- nutrient end --------------------------------
521
522// -------------------------------- step begin --------------------------------
523
524function onStep()
525{
526        if (ExpParams.logging == 1)
527        {
528                createStatistics();
529        }
530
531        nutrientGrowth();
532
533        //reproduction --------------------------------------------
534        reprocounter += 1;
535        if (reprocounter > ExpParams.repro_time)
536        {
537                reprocounter = 0;
538                reproduce_parents(0);
539                reproduce_parents(1);
540        }
541
542        //check for extinction -----------------------------------------------
543        if (Populations[0].size == 0)
544        {
545                if (ExpParams.autorestart)
546                {
547                        Simulator.print("no more creatures, restarting...");
548                        onExpInit();
549                }
550                else
551                {
552                        Simulator.print("no more creatures, stopped.");
553                        Simulator.stop();
554                }
555        }
556        if (Simulator.stepNumber == 150000)
557                Simulator.stop();
558}
559
560function createStatistics()
561{       
562        var number = [[0, 0],[0,0]]; // [species][gen]
563        var e_inc = [[0, 0],[0,0]];
564        var e_nut = 0.0;
565
566        for (var i = 0; i < Populations[0].size; i++)
567        {
568                var cr = Populations[0].get(i);
569                var gen = cr.user2["gen"];
570                var species = cr.user2["species"];
571
572                number[species][gen] = number[species][gen] + 1;
573                e_inc[species][gen] = e_inc[species][gen] + cr.energy;
574        }
575
576        for (var i = 0; i < Populations[1].size; i++)
577        {
578                var cr = Populations[1].get(i);
579                e_nut += cr.energy;
580        }
581
582        var log_numbers = [number[0][0], number[0][1], number[1][0], number[1][1], Populations[1].size];
583        var log_energies = [e_inc[0][0], e_inc[0][1], e_inc[1][0], e_inc[1][1], e_nut];
584
585        log(log_numbers, "forams_log.txt");
586        log(log_energies, "energies_log.txt");
587}
588
589function log(tolog, fname)
590{
591        var f = File.appendDirect(fname, "forams data");
592        f.writeString("" + Simulator.stepNumber);
593        for (var  i = 0; i < tolog.size; i++)
594        {
595                f.writeString(";" + tolog[i]);
596        }
597        f.writeString("\n");
598        f.close();
599}
600
601// -------------------------------- step end --------------------------------
602
603@include "standard_events.inc"
604
605~
606
607prop:
608id:showRet
609name:Show reticulopodia
610type:d 0 1 0
611group:Foraminifera
612
613prop:
614id:e_repro_cost_haplo
615name:Cost of reproduction
616type:f 0.1 0.9 0.5
617group:Foraminifera
618
619prop:
620id:e_repro_cost_diplo
621name:Cost of reproduction
622type:f 0.1 0.9 0.3
623group:Foraminifera
624
625prop:
626id:chamber_proculus_haplo
627name:Size of proculus
628type:f
629group:Foraminifera
630
631prop:
632id:chamber_proculus_diplo
633name:Size of proculus
634type:f
635group:Foraminifera
636
637prop:
638id:chamber_difference_haplo
639name:Difference in size between subsequent chambers
640type:f
641group:Foraminifera
642
643prop:
644id:chamber_difference_diplo
645name:Difference in size between subsequent chambers
646type:f
647group:Foraminifera
648
649prop:
650id:hunted_prob
651name:Probability of being hunted
652type:f 0 1 0
653group:Forminifera
654
655prop:
656id:zone1_range
657name:Zone 1 range
658type:f 0 200
659group:Foraminifera
660
661prop:
662id:zone2_range
663name:Zone 2 range
664type:f 0 3000
665group:Foraminifera
666
667prop:
668id:colors
669name:Haploid and diploid colors
670type:x
671group:Foraminifera
672
673prop:
674id:min_repro_energ_haplo
675name:Min reproduction energy of forams
676type:f
677group:Foraminifera
678
679prop:
680id:min_repro_energ_diplo
681name:Min reproduction energy of forams
682type:f
683group:Foraminifera
684
685prop:
686id:repro_prob
687name:Probability of reproduction
688type:f 0 1 0.8
689group:Foraminifera
690
691prop:
692id:energies0_haplo
693name:Energy of offspring from diploid forams
694type:f
695group:Foraminifera
696
697prop:
698id:energies0_diplo
699name:Energy of offspring from diploid forams
700type:f
701group:Foraminifera
702
703prop:
704id:energy_hib
705name:Energy used for hibernation during one step
706type:f 0 1 0.001
707group:Foraminifera
708
709prop:
710id:energy_move
711name:Energy used for movement during one step
712type:f 0 20 0.001
713group:Foraminifera
714
715prop:
716id:min_vol
717name:Minimal volume for reproduction
718type:f 100 900 100
719group:Foraminifera
720
721prop:
722id:max_size
723name:Maximal size
724type:d 1 10 5
725group:Foraminifera
726
727prop:
728id:foramPop
729name:Initial forams population size
730type:d 1 1000 100
731group:Foraminifera
732
733prop:
734id:crossprob
735name:Crossover probability
736type:f 0 1 0
737group:Foraminifera
738
739prop:
740id:mutationprob
741name:Mutation probability
742type:f 0 1 0
743group:Foraminifera
744
745prop:
746id:e_death_level
747name:Minimal level of energy to sustain life
748type:f 0 20 0
749group:Foraminifera
750
751prop:
752id:e_meta
753name:Idle metabolism
754type:f 0 1
755group:Energy
756help:Each stick consumes this amount of energy in one time step
757
758prop:
759id:feedrate
760name:Feeding rate
761type:f 0 100
762group:Energy
763help:How fast energy is created in the world
764
765prop:
766id:energy_nut
767name:Nutrient energy
768type:f 0 1000
769group:Energy
770
771prop:
772id:feedtrans
773name:Ingestion multiplier
774type:f 0 100
775group:Energy
776
777prop:
778id:nutrientsize
779name:Nutrient size
780type:f 0.1 0.9 0.1
781group:Energy
782
783prop:
784id:nutrientPop
785name:Nutrient population size
786group:Energy
787type:d 1 1000 10
788
789prop:
790id:world_size
791name:World size
792type:d 10 10000 20
793group:World
794
795prop:
796id:stress
797name:Environmental stress
798type:d 0 1 1
799group:World
800
801prop:
802id:repro_trigger
803name:Reproduction trigger
804type:d 0 1 1
805group:World
806
807prop:
808id:repro_time
809name:Time before reproduction
810type:d 0 1000
811
812prop:
813id:creath
814name:Creation height
815type:f -1 50
816help:~
817Vertical position (above the surface) where new Forams are revived.
818Negative values are only used in the water area:
819  0   = at the surface
820-0.5 = half depth
821-1   = just above the bottom~
822
823state:
824id:nutrient
825name:Nutrient locations
826help:vector of vectors [x,y,energy]
827type:x
828flags:32
829
830prop:
831id:autorestart
832name:Restart after extinction
833help:Restart automatically this experiment after the last creature has died?
834type:d 0 1
835
836state:
837id:notes
838name:Notes
839type:s 1
840help:~
841You can write anything here
842(it will be saved to the experiment file)~
843
844state:
845id:totaltestedcr
846name:Evaluated Forams
847help:Total number of the Forams evaluated in the experiment
848type:d
849flags:16
850
851prop:
852id:logging
853name:Log statistics to file
854type:d 0 1 0
Note: See TracBrowser for help on using the repository browser.