/////////////////////////////// #include //Füge Standard Bibliothek hinzu #include #define STATE skill1 //Definiere Skills #define ANIMATION skill2 #define CREATOR skill3 /////////////////////////////// /*Der Unterschied zwischen Funktion und Action ist eigentlich nur das eine Action, eine Funktion ist die man auf Entitys zuweisen kann. Man Weist einer Entity im WED eine Action zu indem man diese Anklickt und dieser Behaivour/Action/"Ordner anklicken" eine Action zuweist. Natürlich muss das Skript vorher dem Levelzugewiesen werden.*/ var winner = 0; //Setzte Variable für Gewinner auf 0 function main() { level_load("*LEVEL*.wmb"); //Lade Level (Kompilierte WMB-Datei) while(1) { //initialisiere Endlossschleife if (winner == 1) draw_text("Gut gemacht! Rot gewinnt...",10,10,vector(50,50,255)); //Wenn Winner gleich 1 ist schreiben das Spieler Rot gewonnen hat else if (winner == 2) draw_text("Ouch!! Grün gewinnt...",10,10,vector(50,255,50)); //Wenn Winner gleich 2 ist schreibe das Spieler Grün gewonnen hat wait(1); } } function camera_follow(ENTITY* ent) //Function für 3rd-Personen Kamera { while(1) { vec_set(camera.x,vector(-150,10,50)); //Setzte Kamera hinter die Spieler Entity vec_rotate(camera.x,ent.pan); //Drehe Kamera mit Spieler Entity vec_add(camera.x,ent.x); //Passe Kamera der Spielerposition an vec_set(camera.pan,vector(ent.pan,-10,0)); //Siehe etwas nach unten (um 10°) wait(1); } } action spell_fly() //Action für das Projektil { my.ambient = 50; //Mittlere Eigenhelligkeit my.lightrange = 300; //Setzte Lichtreichweite vec_set(my.blue,vector(255,50,50)); //Setzte Lichtfarbe fest set(me,BRIGHT); //Setzte Blendeffekt vec_scale(my.scale_x,0.15); //Setzte Projektil auf kleine Größe c_setminmax(me); //Setzte Begrenzungsrahmen auf die reale Größe my.pan = your.pan; //Fliege in die Richtung in die der Spieler sieht set(my,FLAG2); //Setzte FLAG2 für Creator my.CREATOR = you; //Definiere Creator my.STATE = 1; //Setzte State auf 1 while(1) { // state 1: flying /////////////////////////////////////////// //Stadium 1 Fliegen if (my.STATE == 1) //Wenn STATE gleich 1 ist { my.roll += 20*time_step; //Drehe Projektil um 20 mal Zeit c_move(me,vector(40*time_step,0,0),NULL,IGNORE_YOU); //Bewege Projektil geradeaus mit der Geschwindigkeit von 40 *Zeit und Ignoriere dich if (HIT_TARGET) //Wenn getroffen my.STATE = 2; //Setzte State auf 2 } // state 2: exploding //////////////////////////////////////// //Stadium 2 Explosion if (my.STATE == 2) //Wenn State gleich 2 ist { set(me,ZNEAR); //fixiere Projektil genau vor dem getroffenen Objekt my.roll = random(360); //Zufällige Drehung my.lightrange *= 1+0.5*time_step; //erhöhe Lichtradius vec_scale(my.scale_x,1+0.5*time_step); //änder Größe des Projektils if (my.scale_x > 1) { //Wenn Explodiert also Größe noch kleiner als 1 ist ent_remove(me); //Entferne Projektil return; //LIefer zurück } } wait(1); //Warte 1 Frame } } function wizard_hit() //Entity getroffen Funktion { my.ANIMATION = 0; //setzte Animation auf 0 my.STATE = 4; //Setzte State auf 4 also Tot } action wizard_walk() //Action Spieler läuft { camera_follow(me); //Starte Funktion für 3rd-Person Kamera my.event = wizard_hit; //Setzte Event auf Funktion wizard_hit my.emask |= ENABLE_IMPACT; //Mache empfindlich für Kollisionen VECTOR vFeet; //Setzte Vector vFeet vec_for_min(vFeet,me); //vFeet.z = Distanz von Spielerursprung bis zur niedrigsten Eckpunkt set(my,FLAG2); //Setzte FLAG2 my.CREATOR = me; //Setzte CREATOR auf Spieler my.STATE = 1; //Setzte State auf 1 while (1) { // state 1: walking //////////////////////////////////////////// //Stadium 1 Laufen if (my.STATE == 1) //Wenn State gleich 1 ist { my.pan += (key_a-key_d)*5*time_step; //Drehe Entity mit "A" und "D" nach Links und Rechts var distance = (key_cuu-key_cud)*5*time_step; //Bewege Entity mit "W" und "S" vor und zurück über Variable Distanz c_move(me, vector(distance,0,0), NULL, GLIDE); //Bewegungsbefehl mit Variable Distanz und setzte Gleiten my.ANIMATION += 2*distance; //Setzte ANIMATION auf 2 mal Distanz ent_animate(me,"walk",my.ANIMATION,ANM_CYCLE); //Animiere Entity mit einer Zyklischen Abfolge aller Frames mit "walk" c_trace(my.x,vector(my.x,my.y,my.z-1000),IGNORE_ME | IGNORE_PASSABLE); //Setzte Entity auf den Boden (GROUND) my.z = hit.z - vFeet.z; //Plaziere die Füße auf dem Boden if (key_space) { //Wenn Leertaste gedückt wurde my.ANIMATION = 0; //Setzte Animation auf 0 my.STATE = 2; //Setzet Stae auf 2 } } // state 2: casting a spell /////////////////////////////////// //Stadium 2 Erzeuge das Projektil if (my.STATE == 2) //Wenn State gleich 2 ist { my.ANIMATION += 8*time_step; //Erhöhe Animation auf 8 mal Zeit ent_animate(me,"attack",my.ANIMATION,0); //Animiere Entity mit einer Zyklischen Abfolge aller Frames mit "attack" if (my.ANIMATION > 100) { //Wenn Animation kleiner ist als 100 ent_create("spell.dds",vector(my.x,my.y,my.z+20),spell_fly); //Kreiere Entity "spell.dds" mit der Action "spell_fly" my.ANIMATION = 0; //Setzte Animation auf 0 my.STATE = 3; //Setzte State auf 3 } } // state 3: waiting for key release /////////////////////////// //Stadium 3 warte is Taste losgelassen wurde if (my.STATE == 3) { //Wenn STATE gleich 3 ist if (!key_space) my.STATE = 1; //Wenn sie lossgelassen wurde setzte STATE auf 1 } // state 4: death animation //////////////////////////////////// //Stadium 4 Todes Animation if (my.STATE == 4) //Wenn STATE gleich 4 ist { winner = 2; //Setzte Winner auf 2 my.ANIMATION += 3*time_step; //Erhöhe Animation um 3 mal Zeit ent_animate(me,"death",my.ANIMATION,0); //Animiere Entity mit einer Zyklischen Abfolge aller Frames mit "death" if (my.ANIMATION > 70) //Wenn Animation kleiner als 70 ist return; //Liefer zurück } wait(1); //Warte 1 FRAME } } action wizard_stand() //Action für Gegner Entity { my.event = wizard_hit; //Setzte Event auf Funktion wizard_hit my.emask |= ENABLE_IMPACT; //Mache empfindlich für Kollision ENTITY* enemy = NULL; //Setzte Entity emeny (Gegner) auf 0 my.STATE = 1; //Setzte STAE auf 1 while (1) { if(my.STATE == 1) //Status 1 Warte bis Gegner oder Projektil entdeckt wurden { c_scan(my.x,my.pan,vector(360,0,750),SCAN_ENTS | SCAN_FLAG2 | IGNORE_ME); //Suche nach Allen Entitys mit FLAG2 im Umkreis von 750quants und ingnoriere dich if (you) { //Wenn Gegner oder Projektil gefunden my.STATE = 2; //Setzte State auf 2 enemy = your.CREATOR; //Setzte Gegner (Spieler) auf Enemy } } // state 2: turn towards enemy, cast spells /////////////////// if (my.STATE == 2) //Wenn State gleich 2 ist { VECTOR vDirection; //Setzte Vector vDirection (Entfernung) ANGLE vTargetAngle; //Setzte Angle vTargetAngle (Position) vec_diff(vDirection,enemy.x,my.x); //Bewege Entity zum Gegner vec_to_angle(vTargetAngle,vDirection); //Laufe in richtung Gegner my.pan += time_step * sign(ang(vTargetAngle.pan - my.pan)); //Verfolge Gegner my.ANIMATION += 3*time_step; //Erhöhe Animation um 3 mal Zeit ent_animate(me,"attack",my.ANIMATION,ANM_CYCLE); //Animiere Entity mit einer Zyklischen Abfolge aller Frames mit "attack" if (my.ANIMATION > 100) { //Wen Animation kleiner ist als 100 ent_create("spell.dds",vector(my.x,my.y,my.z+10),spell_fly); //Kreiere Entity "spell.dds" mit der Action "spell_fly" my.ANIMATION -= 100; //Setzte Animation zurück und fang von Vorne an } if (enemy.STATE == 4) //Wenn Enemy State gleich 4 ist, also Gegner/Spieler tot ist my.STATE = 3; //Setzte State auf 3 } // state 3: killed the enemy => dance of joy //////////////////// //Stadium 3 Gegner getötet jubel if(my.STATE == 3) //Wenn STATE gleich 3 ist { my.ANIMATION += 8*time_step; //Erhöhe Animation um 8 mal Zeit ent_animate(me,"attack",my.ANIMATION,ANM_CYCLE); //Animiere Entity mit einer Zyklischen Abfolge aller Frames mit "attack" } // state 4: death animation //////////////////////////////////// //Stadium 4 Todesanimation if(my.STATE == 4) //Wenn State gleich 4 ist { winner = 1; //Setzte Winner auf 1 my.ANIMATION += 3*time_step; //Erhöhe Animation um 3 mal Zeit ent_animate(me,"death",my.ANIMATION,0); //Animiere Entity mit einer Zyklischen Abfolge aller Frames mit "death" if (my.ANIMATION > 70) //Wenn Animation kleiner ist als 70 return; //gebe Zurück } wait(1); //Warte 1 Frame } }