source: experiments/frams/capture-the-flag/data/scripts/capture-the-flag.expdef @ 232

Last change on this file since 232 was 232, checked in by sz, 10 years ago

Capture The Flag game - http://www.framsticks.com/capture-the-flag

File size: 12.0 KB
Line 
1expdef:
2name:Capture The Flag game
3info:~
4A simple Capture The Flag game. Read more at
5http://www.framsticks.com/capture-the-flag
6~
7code:~
8
9//Flag positions
10global flagsX;
11global flagsY;
12
13//global log;
14
15//Sum of team points and events
16global points;
17global scored;
18global taken;
19global retrieved;
20
21function onExpDefLoad()
22{
23        GenePools.clear();
24        Populations.clear();
25       
26        World.wrldsiz = 100;
27        World.wrldtyp = 0;
28        World.wrldbnd = 2; //Teleport
29       
30        ExpParams.memberssno = 4;
31        ExpParams.teamsno = 2;
32        ExpParams.mindistance = 60;
33       
34        ExpParams.pointsCapture = 10;
35        ExpParams.pointsRetrieve = 5;
36        ExpParams.pointsScoring = 50;
37
38        //Styles of flags
39        Shapes.set("1p_flag0","lllX(X, RRllX(, RRllX(, (X, lllX, X),), LLLLLLLX(,, llllX)), X)", 0xFF0000);
40        Shapes.set("1p_flag1","lllX(X, RRllX(, RRllX(, (X, lllX, X),), LLLLLLLX(,, llllX)), X)", 0x0000FF);
41        Shapes.set("1p_flag2","lllX(X, RRllX(, RRllX(, (X, lllX, X),), LLLLLLLX(,, llllX)), X)", 0x00FF00);
42        Shapes.set("1p_flag3","lllX(X, RRllX(, RRllX(, (X, lllX, X),), LLLLLLLX(,, llllX)), X)", 0x00FFFF);
43        Shapes.set("1p_flag4","lllX(X, RRllX(, RRllX(, (X, lllX, X),), LLLLLLLX(,, llllX)), X)", 0xFF00FF);
44       
45//      log = File.createDirect("statistics"+Math.time+".txt","CTF statistics");
46//      log.writeString("Step;Team1_Points;Team1_Scored;Team1_Captured;Team1_Retrieved;Team2_Points;Team2_Scored;Team2_Captured;Team2_Retrieved;\n");
47
48}
49
50function onExpInit()
51{
52        ExpParams_create_call();
53
54}
55
56function onBorn()
57{
58  Creature.energ0 = 100;
59  Creature.energy = Creature.energ0;
60}
61
62function onDied()
63{
64 
65}
66
67function onExpLoad()
68{
69 
70}
71
72function onExpLoad_Unknown()
73{
74 
75}
76
77function onExpSave()
78{
79 
80}
81
82function createTeams(){
83       
84}
85
86function ExpParams_create_call(){
87        //Create GenePool and Population for each team
88        GenePools.clear();
89        GenePool.name = "Team1";
90        GenePool.fitness = "return this.user3;";
91        while (GenePools[0].size > 0)
92                GenePools[0].delete(0);
93       
94        Populations.clear();
95        Population.name = "Team1";
96       
97        while (Population.size > 0)
98                        Population.delete(0);
99       
100       
101       
102        Population.selfmask = 0x50001;
103    Population.othermask = 0x60001;
104       
105        var i = 2;
106        for (i = 2; i <= ExpParams.teamsno; i++){
107                Populations.addGroup("Team"+i);
108                Population.selfmask = 0x50001;
109        Population.othermask = 0x60001;
110                GenePools.addGroup("Team"+i);
111                GenePool.fitness = "return this.user3;";       
112        }
113       
114        //Create GenePool for flags and fill it
115        GenePools.addGroup("Flags");
116       
117        GenePool.addGeno(Geno.newFrom("m:Vstyle=flag0\np:",48,"Flag","Single flag object"));
118        GenePool.addGeno(Geno.newFrom("m:Vstyle=flag1\np:",48,"Flag","Single flag object"));
119        GenePool.addGeno(Geno.newFrom("m:Vstyle=flag2\np:",48,"Flag","Single flag object"));
120        GenePool.addGeno(Geno.newFrom("m:Vstyle=flag3\np:",48,"Flag","Single flag object"));
121        GenePool.addGeno(Geno.newFrom("m:Vstyle=flag4\np:",48,"Flag","Single flag object"));
122}
123
124function ExpParams_fill_call(){
125        var team = 0;
126        var player = 0;
127       
128        //Reset all global points vectors
129        flagsX = Vector.new();
130        flagsY = Vector.new();
131       
132        points = Vector.new();
133        scored = Vector.new();
134        taken = Vector.new();
135        retrieved = Vector.new();
136       
137        //Init global vectors
138        var x, y, i;
139        var ok = 0;
140       
141        for (i = 0; i < ExpParams.teamsno; i++){
142                points.add(0);
143                scored.add(0);
144                taken.add(0);
145                retrieved.add(0);       
146        }
147       
148        //Clear Populations
149        for (team = 0; team < ExpParams.teamsno; team++){
150                while (Populations[team].size > 0)
151                        Populations[team].delete(0);
152        }
153       
154        //Draw flag positions according to minimal distance parameter
155        var totalTries = 0, flagTries = 0, done = 0;
156       
157        while (totalTries < 1000 && done == 0){
158                flagsX = Vector.new();
159                flagsY = Vector.new();
160
161                ok = 1;         
162                while (flagsX.size < ExpParams.teamsno && ok == 1){
163                        ok = 0;
164                        flagTries = 0;
165                        while (ok == 0 && flagTries < 1000){
166                                x = Math.random(80) + 10;
167                                y = Math.random(80) + 10;
168                               
169                                ok = 1;
170                                for (i = 0; i < flagsX.size; i++){
171                                        if (Math.sqrt(Math.pow(flagsX[i] - x, 2)+Math.pow(flagsY[i] - y,2)) < ExpParams.mindistance){
172                                                ok = 0;
173                                                break;
174                                        }
175                                }
176                                if (ok == 1){
177                                        flagsX.add(x);
178                                        flagsY.add(y);
179                                } else
180                                        flagTries += 1;
181                        }
182                       
183                }
184               
185                if (flagsX.size == ExpParams.teamsno)
186                        done = 1;
187                else
188                        totalTries += 1;
189        }
190        //Flags weren't placed successfully'
191        if (done != 1){
192                Simulator.message("Flags could not be placed correctly. Consider lowering minimal distance between flags.", 2);
193                Simulator.beep();
194                return;
195        }
196       
197       
198        //Fill each team's Population with players and a flag and place players close to their flag
199        for (team = 0; team < ExpParams.teamsno; team++){
200                while (Populations[team].size > 0)
201                        Populations[team].delete(0);
202               
203                GenePools.group = ExpParams.teamsno;
204                GenePools.genotype = team;
205               
206                Populations[team].createFromGenotype();
207                placeFlag(Populations[team][0]);
208                Creature.signals.add("Flag");
209                Creature.signals[0].flavor = team;
210                Creature.signals[0].power=1000;
211                Creature.user1 = 0;
212                Creature.user2 = 0;
213                Creature.user3 = 0;
214               
215                GenePools.group = team;
216
217                var crX, crY;
218               
219                for (player = 0; player < ExpParams.memberssno; player++){
220                        GenePools.genotype = player % GenePool.size;
221                        Populations[team].createFromGenotype();
222                        crX = Math.random(30) - 15;
223                        if (crX >=0 && crX < 5)
224                                crX = 5;
225                        else if (crX > -5 && crX < 0)
226                                crX = -5;
227                        crY = Math.random(30) - 15;
228                        if (crY >=0 && crY < 5)
229                                crY = 5;
230                        else if (crY > -5 && crY < 0)
231                                crY = -5;
232                        Creature.moveAbs(flagsX[team] + crX, flagsY[team] + crY, 0);
233                        Creature.user1 = 0;
234                        Creature.user2 = 0;
235                        Creature.user3 = 0;
236                }
237        }
238}
239
240function ExpParams_default_call(){
241        //Insert default player genotype in team's GenePools
242        var team = 0;
243        for (team = 0; team < ExpParams.teamsno; team++){
244                while (GenePools[team].size > 0)
245                        GenePools[team].delete(0);
246                if (team != 1)
247                        GenePools[team].addGeno(Geno.newFrom("lllfffX[0:2.420, 2:-2, 1:-1][-1:1, 0:1, 0:-1][-1:1](RRlllfffMMMX[|-1:-10]lllFFFMMMX[|-2:-1], fffIXlllfffMMMsX[|6:10, 3:-10](RRlllfffMMMIX[|-4:-10]lllFFFMMMIX[|-5:-1][*], , RRlllfffMMMIX[|-7:10]lllFFFMMMIX[|-8:-1][*]), RRlllfffMMMX[|-10:10]lllFFFMMMX[|-11:-1.784])", 49, "Player", "Player"));
248                else if (team == 1)
249                        GenePools[team].addGeno(Geno.newFrom("lllfffX[0:2.420, 2:-2, 1:-1][-1:1, 0:1, 0:-1][-1:1](RRlllfffMMMX[|-1:-10]lllFFFMMMX[|-2:-1], fffIXlllfffMMMsX[|1:1][Thr2,lo:-0.75,hi:0.75,t:0.75,3:-10,6:10](RRlllfffMMMIX[|-4:-10]lllFFFMMMIX[|-5:-1][FlagDef,opp:0,my:1], , RRlllfffMMMIX[|-7:10]lllFFFMMMIX[|-8:-1][FlagDef,opp:0,my:1]), RRlllfffMMMX[|-10:10]lllFFFMMMX[|-11:-1.784])", 49, "Inteligent Player", "Inteligent Player"));
250        }
251}
252
253function onStep(){
254        var team = 0;
255        var player = 0;
256       
257        //Update flags position if taken and cooldown if recently retrieved
258        for (team = 0; team < Populations.size; team++){
259                Populations.group = team;
260                Populations.creature = 0;
261                if (Creature.user3 > 0)
262                        Creature.user3 -= 1;
263               
264                for (player = 1; player < Population.size; player++){
265                        Populations.creature = player;
266                        if (Creature.user1 == 1){
267                                Creature.user2.moveAbs(Creature.pos_x, Creature.pos_y, Creature.size_z + 1);
268                        }
269                }
270        }
271       
272//      if (Simulator.time % 100 == 0){
273//              var i = 0;
274//              var line = "";
275//              line=line+Simulator.time+";";
276//             
277//              for (i = 0; i < ExpParams.teamsno; i++){
278//                      line=line+points[i]+";"+scored[i]+";"+taken[i]+";"+retrieved[i]+";";
279//              }
280//              line=line+"\n";
281//              log.writeString(line);
282//             
283//      }
284       
285}
286
287function placeFlag(flag){
288        flag.moveAbs(flagsX[flag.group.index], flagsY[flag.group.index], 0);
289}
290
291function takeFlag(flag, creature){
292        //If the cooldown is on - do nothing
293        if (flag.user3 > 0)
294                return;
295       
296        //Take flag by changing its flavour and setting flag in player and player in flag fields
297        flag.signals[0].flavor = flag.group.index + 100;
298        flag.user1 = 1;
299        flag.user2 = creature;
300        creature.user1 = 1;
301        creature.user2 = flag;
302       
303        //Score points for taking a flag
304        creature.user3 += ExpParams.pointsCapture;
305       
306//      Simulator.print("Flag "+(flag.group.index+1)+" taken by team "+(creature.group.index+1));
307       
308        //Update team points and events
309        points.set(creature.group.index, points[creature.group.index] + ExpParams.pointsCapture);
310        taken.set(creature.group.index, taken[creature.group.index] + 1);
311
312}
313
314function retrieveFlag(flag, creature){
315        //Retrieve flag by changing its flavour and deleting it from player and player from flag
316        flag.signals[0].flavor = flag.group.index;
317        flag.user1 = 0;
318       
319        flag.user2.user1 = 0;
320        flag.user2.user2 = 0;
321       
322        flag.user2 = 0;
323       
324        //Set cooldown for taking a flag
325        flag.user3 = 1000;
326       
327        placeFlag(flag);
328
329        //Score points for retrieving a flag
330        creature.user3 += ExpParams.pointsRetrieve;
331       
332//      Simulator.print("Flag "+ (flag.group.index+1) +" retrieved");
333       
334        //Update team scores
335        points.set(creature.group.index, points[creature.group.index] + ExpParams.pointsRetrieve);
336        retrieved.set(creature.group.index, retrieved[creature.group.index] + 1);
337}
338
339function scoreFlag(flag, creature){
340        //Put the flag back on its spot and delete references between player and flag
341        creature.user2.signals[0].flavor = creature.user2.group.index;
342        creature.user2.user1 = 0;
343        creature.user2.user2 = 0;
344       
345        placeFlag(creature.user2);
346       
347        creature.user1 = 0;
348        creature.user2 = 0;
349       
350        //Score points for scoring a flag
351        creature.user3 += ExpParams.pointsScoring;
352       
353//      Simulator.print("Team "+ (creature.group.index + 1) +" scored");
354       
355        //Update team points
356        points.set(creature.group.index, points[creature.group.index] + ExpParams.pointsScoring);
357        scored.set(creature.group.index, scored[creature.group.index] + 1);
358}
359
360function onTeam1CrCollision, onTeam2CrCollision, onTeam3CrCollision, onTeam4CrCollision, onTeam5CrCollision(){
361        var c1 = CrCollision.Creature1;
362        var c2 = CrCollision.Creature2;
363
364        //Flag vs. flag collision - do nothing
365        if (c1.geno.name == "Flag" && c2.geno.name == "Flag"){
366                return;
367        }
368       
369        var flag;
370        var creature;
371        var colFlag = 0;
372       
373        //Try to assign colliding creatures to flag and player
374        if (c1.geno.name == "Flag"){
375                flag = c1;
376                creature = c2;
377                colFlag = 1;
378        } else if (c2.geno.name == "Flag"){
379                flag = c2;
380                creature = c1;
381                colFlag = 1;
382        }
383
384        //Flag vs. player collision
385        if (colFlag == 1){
386                //Collision with my flag which is taken
387                if (flag.group.index == creature.group.index && flag.user1 == 1){
388                        retrieveFlag(flag, creature);
389                } //Collision with my flag which is not taken while carrying another team's flag
390                else if (flag.group.index == creature.group.index && flag.user1 == 0 && creature.user1 == 1 && flag.user3 != 1){
391                        scoreFlag(flag, creature);
392                } //Collision with another team's flag which is not taken while not carrying any flag
393                else if (flag.group.index != creature.group.index && flag.user1 == 0 && creature.user1 == 0 && flag.user3 != 1){
394                        takeFlag(flag, creature);
395                }
396        }
397        //Player vs. player collision
398        else {
399                //Players of different teams
400                if (c1.group.index != c2.group.index){
401                        //If player 1 has a flag ...
402                        if (c1.user1 == 1){
403                                // ... and the flag is of my team ...
404                                if (c2.group.index == c1.user2.group.index){
405                                        //... retrieve it
406                                        retrieveFlag(c1.user2, c2);
407                                }
408                        }
409                        //If player 2 has a flag ...
410                        if (c2.user1 == 1){
411                                // ... and the flag is of my team ...
412                                 if (c1.group.index == c2.user2.group.index){
413                                        //... retrieve it
414                                        retrieveFlag(c2.user2, c1);
415                                }
416                        }
417                }
418        }
419
420
421
422~
423
424prop:
425id:teamsno
426name:Number of teams
427type:d 2 5
428
429prop:
430id:memberssno
431name:Number of members in team
432type:d 1 8
433
434prop:
435id:mindistance
436name:Minimal distance between flags
437type:d 1 100
438
439prop:
440id:create
441name:Create teams
442type:p
443
444prop:
445id:default
446name:Insert default player
447type:p
448
449prop:
450id:fill
451name:Fill teams
452type:p
453
454prop:
455id:pointsCapture
456name:Points for flag capture
457type:d 0 100
458
459prop:
460id:pointsRetrieve
461name:Points for flag retrieve
462type:d 0 100
463
464prop:
465id:pointsScoring
466name:Points for scoring a flag
467type:d 0 100
468
Note: See TracBrowser for help on using the repository browser.