Hello everybody,

I have a Problem with my script. If I start the game, the Count of functions rises until it reachs a Point where I get an error "Too many functions" (after 1-2 minutes).

Code:
#define STATE skill1
#define CREATOR skill2
#define ANIMATION skill3

ENTITY* spieler;
ENTITY* zauber;
ENTITY* feind;

function camera_follow(ENTITY* ent)                 //Dritte Person Kamera

 { 
    while(1) { 
      vec_set(camera.x,vector(-150,10,25)); 
      vec_rotate(camera.x,ent.pan);
      vec_add(camera.x,ent.x);
      vec_set(camera.pan,vector(ent.pan,-10,0)); 
      wait(5); 
    } 
 } 
 
 function sterben(){
 	my.ANIMATION = 0;
 	my.STATE = 4;
 	}
 


action zauberkugel()
{

zauber = me;
my.pan = your.pan;
my.ambient = 50;
my.lightrange = 300;
vec_set(my.blue,vector(255,50,50)); // bluish light color
set(me,BRIGHT);   // additive blending
vec_scale(my.scale_x,0.15);
c_setminmax(me);

set(my, FLAG2);
my.CREATOR = you;
my.STATE = 1;
//////////STATE 1 == FLIEGEN////////////////////////////////////////////////////////////
while(1){	
if(my.STATE == 1){
c_move(me, vector(40*time_step, 0, 0), nullvector, IGNORE_YOU); //IGNORE _YOU verhindert dass die Kugel schon mit dem Spieler kollidiert
my.roll += 20*time_step;

if(HIT_TARGET) my.STATE = 2;
}
//////////STATE 2 == KOLLISION////////////////////////////////////////////////////////////////
if(my.STATE == 2){
set(me,ZNEAR);         //ZNEAR sorgt dafür, dass das Explosionssprite komplett sichtbar ist
my.roll = random(360);       //Der Roll-Winkel wird jedem Frame auf einen Zufallswert von 0 bis 360 Grad gesetzt
my.lightrange= my.lightrange* (1+0.5*time_step);   //Lichtkegel wächst exponentiell an (mit jedem Tick)
vec_scale(my.scale_x,1+0.5*time_step);     //Größe des Sprite wächst exponentiell an (mit jedem Tick)
if (my.scale_x > 1) {                       //wenn Originalgröße erreicht, dann entferne Sprite
ent_remove(me);
return;	                     //Macht Entfernen des Sprite rückgängig	
}
wait(1);
}wait(1);
}
}

action gegner(){
	feind = me;
	my.event = sterben;
	my.emask |= ENABLE_IMPACT;
	ENTITY* enemy = NULL; //Zauberziel
	my.STATE = 1;
	while(1){
	//////////////STATE 1 = NICHTS TUN//////////////////////////
	if(my.STATE == 1){
		c_scan(my.x, my.pan, vector(360, 0, 750), SCAN_ENTS | SCAN_FLAG2 | IGNORE_ME);
		if(you) {  //Spieler oder Zauberkugel gefunden?
	   my.STATE = 2;	
		enemy = your.CREATOR;
	}
	}
	//////////////STATE 2 = ANGREIFEN/////////////////////////////////
	if(my.STATE == 2){
		VECTOR vDirection;
		ANGLE vTargetAngle;
		vec_diff(vDirection, enemy.x, my.x);
		vec_to_angle(vTargetAngle, vDirection);
		my.pan += time_step* sign(ang(vTargetAngle.pan - my.pan));
		
		my.ANIMATION += 3*time_step;
		ent_animate(me, "attack", my.ANIMATION, ANM_CYCLE);
		if(my.ANIMATION>100){
			ent_create("spell.dds", vector(my.x,my.y,my.z+10), zauberkugel);/////////STATE 3 gibt es nicht
			my.ANIMATION -= 100;	
		}
	}
	/////////////////STATE 4 = STERBEN//////////////////////////////
		if(my.STATE == 4){
		my.ANIMATION = 3*time_step;
		ent_animate(me, "death", my.ANIMATION, 0);	
		if(my.ANIMATION>70) 
		return;
		}
	wait(1);	
	}
}

action move(){
 spieler = me;
 my.STATE = 1;
 VECTOR vFeet;
 vec_for_min(vFeet,me);
 
 my.event = sterben;
 my.emask |= ENABLE_IMPACT;
 set(my, FLAG2);
 my.CREATOR = me;
 
 while(1){         // ALLES SOLL FORTLAUFEND PASSIEREN
 camera_follow(me);      //Kamera soll Spieler folgen	
 c_trace(my.x,vector(my.x,my.y,my.z-1000),IGNORE_ME | IGNORE_PASSABLE);
 my.z = hit.z - vFeet.z;
 
 /////STATE 1 == LAUFEN///////////////////////////////////////
 if(my.STATE == 1){
 var walk_speed;
 walk_speed = (key_cuu-key_cud)*5*time_step;
 c_move(me, vector(walk_speed, 0, 0), vector(0, 0, 0), GLIDE);
 my.pan += (key_cul-key_cur)*5*time_step;
 
 my.ANIMATION += walk_speed*2;
 ent_animate(me, "walk", my.ANIMATION, ANM_CYCLE);
 if(my.ANIMATION>100) my.ANIMATION -= 100;
 if(key_space){                                            ///Wird die Leertaste gedrückt, dann gehe über in Zustand 2
 	my.STATE = 2;
 	my.ANIMATION = 0;
 	}
 }
 ////////STATE 2 == ANGREIFEN/////////////////////////////////
 if(my.STATE == 2){
 
 my.ANIMATION += 8*time_step;	
 ent_animate(me, "attack", my.ANIMATION, 0);
 if(my.ANIMATION>=100){                              //Ist die Animation einmal abgespielt worden, dann setze sie zurück und gehe über in Zustand 3
 	 my.ANIMATION = 0;
    ent_create("spell.dds", vector(my.x,my.y,my.z+20), zauberkugel);
 	 my.STATE = 3;
 	 }
 	}
////////STATE 3 //////////////////////////////////////
if(my.STATE == 3){
	if(key_space != 1){                                       //Ist die Leertaste losgelassen, wenn ja, gehe zurück in Zustand 1
	my.STATE = 1;		
	}	
}
//////////STATE 4 == STERBEN//////////////////////////////////////////
if(my.STATE == 4){
	my.ANIMATION = 5*time_step;
	ent_animate(me, "death", my.ANIMATION, 0);
	if(my.ANIMATION>70){
		return;
	}
}

wait(1);
}	

}



I suppose that it has something to do with while(1) Loops.
And yes, this is the try to make the Workshop 24

(This .c data is part of another scipts. Thats why function main is missing)

Last edited by Saschaw04; 04/05/15 20:55.

-- started with programming on march 2015 --
-- living in Germany near Dortmund --