F: Ich verwende den Schwertkampfcode aus Aum 12 und ich brauche Hilfe bei der Gravitation für den Spieler und den Gegner. Bitte helft!
A: Ersetzen Sie player_fight und enemy_fight mit den Funktionen hier:

action player_fight // attached to the player
{
player = me; // I'm the player
player.healthpoints = 100; // and I have 100 health points
while (player.healthpoints > 0) // as long as I'm alive
{
camera.x = player.x - 200 * cos(player.pan); // 200 = distance between the player and the camera
camera.y = player.y - 200 * sin(player.pan); // same value here
camera.z = player.z + 200; // above the player
camera.pan = player.pan; // looks in the same direction with the player
camera.tilt = -30; // look down at the player

my.pan += 4 * (key_a - key_d) * time - 20 * mouse_force.x * time; // rotates with the keys A and D or with the mouse
player_distance.x = 10 * (key_w - key_s) * time; // moves forward / backward with W / S
player_distance.y = 0;
vec_set (temp, my.x);
temp.z -= 1000;
trace_mode = ignore_me + use_box;
player_distance.z = -trace (my.x, temp);

if ((key_w == 1) || (key_s == 1)) // the player is walking
{
ent_cycle("walk", my.skill20); // play walk frames animation
my.skill20 += 4 * time; // "walk" animation speed
if (my.skill20 > 100) {my.skill20 = 0;} // loop animation
}
else // the player is standing
{
ent_cycle("stand", my.skill21); // play stand frames animation
my.skill21 += 2 * time; // "stand" animation speed
if (my.skill21 > 100) {my.skill21 = 0;} // loop animation
}
ent_move(player_distance, nullvector);

if (mouse_left == 1) // if we press the left mouse button
{
my.skill22 = 0; // reset "attack" frames
while (my.skill22 < 100)
{
ent_vertex(my.sword_tip, 315); // sword tip vertex coords - get the value in Med
ent_vertex(my.sword_base, 293); // sword base vertex coords - get the value in Med
trace_mode = ignore_me + ignore_passable; // ignore me (the player) and all the entities that are passable
trace (my.sword_base, my.sword_tip); // trace between these sword positions
if (result != 0) // the player has hit something
{
effect (particle_sparks, 10, target, normal);
if (you != null) {you.healthpoints -= 6 * time;} // if it hasn't hit a wall, decrease health
ent_playsound (my, sword_snd, 50); // sword sound
}
ent_cycle("attack", my.skill22); // play attack frames animation
my.skill22 += 8 * time; // "attack" animation speed
wait (1);
}
while (mouse_left == 1) {wait (1);} // can't use autofire on a sword :)
}
wait (1);
}
while (my.skill23 < 90) // the player is dead
{
ent_cycle("death", my.skill23); // play death frames animation
my.skill23 += 3 * time; // "death" animation speed
wait (1);
}
my.passable = on; // the corpse can't be hit by the enemy sword from now on
}

action enemy_fight // attached to the enemy
{
enemy = me; // I'm the enemy
enemy.healthpoints = 100; // and I have 100 healthpoints
while (my.healthpoints > 0) // as long as I'm alive
{
if (vec_dist (my.x, player.x) < 200 && player.healthpoints > 0) // the player approaches the enemy
{
vec_set(temp, player.x);
vec_sub(temp, my.x);
vec_to_angle(my.pan, temp);
my.tilt = 0; // I'm a maniac :)
enemy_distance.x = 5 * time;
enemy_distance.y = 0;
vec_set (temp, my.x);
temp.z -= 1000;
trace_mode = ignore_me + use_box;
enemy_distance.z = -trace (my.x, temp);
ent_move(enemy_distance, nullvector);
ent_cycle("walk", my.skill19); // play walk frames animation
my.skill19 += 5 * time; // "walk" animation speed
if (my.skill19 > 100) {my.skill19 = 0;} // loop animation
if (vec_dist (my.x, player.x) < 50) // if the player comes closer than 50 quants attack him
{
my.skill20 = 0; // reset "attack" frames
while (my.skill20 < 100)
{
ent_vertex(my.sword_tip, 291); // sword tip vertex coords - get the value in Med
ent_vertex(my.sword_base, 306); // sword base vertex coords - get the value in Med
trace_mode = ignore_me + ignore_passable;
trace (my.sword_base, my.sword_tip); // trace between these sword positions
if (result != 0) // hit something, could be the player or another enemy
{
effect (particle_blood, 2, target, normal);
if (you != null) {you.healthpoints -= 4 * time;}
ent_playsound (my, sword_snd, 50); // sword sound
}
ent_cycle("attack", my.skill20); // play attack frames animation
my.skill20 += 5 * time; // "attack" animation speed
wait (1);
}
waitt (6); // slows down the enemy and reduces the number of traces per second
}
}
else // the player is farther than 200 quants away
{
ent_cycle("stand", my.skill21); // play stand frames animation
my.skill21 += 2 * time; // "stand" animation speed
if (my.skill21 > 100) {my.skill21 = 0;} // loop animation
}
wait (1);
}
while (my.skill22 < 80) // the enemy is dead
{
ent_cycle("death", my.skill22); // play death frames animation
my.skill22 += 1 * time; // "death" animation speed
wait (1);
}
my.passable = on; // the corpse can't be hit by the sword from now on
}

F: Wie kann ich die Intensität des Nebels in meinen Levels ändern? Ich verändere camera.fog, doch alle Werte zwischen 1 und 100 liefern den gleichen Effekt!
A: Setzen Sie die Intensität mit den neuen Variablen camera.fog_start und camera.fog_end. Schauen Sie sich “Fogger” in Aum 25 für ein Beispiel an.

F: Kann bitte jemand erklären, wie ich eine Bewegung ähnlich wie in Counterstrike hinbekomme, also normales Gehen ist eigentlich Rennen und mit Shift wird die Geschwindigkeit halbiert. Ich verwende die Templates.
A: Schreiben Sie diese Zeile in die Main Funktion:

shift_sense = 0.5;

und ändern Sie danach die strength Variable in der movement.wdl auf diese Weise:

var strength[3] = 10,4,75; // default ahead, side, jump strength

F: Ich versuche einen Block zu programmieren, der eine Tür öffnet, wenn man darauf tritt, aber ich möchte nicht jede Tür aufs Neue programmieren; ich möchte einfach jeder Tür die gleiche Funktion geben und die Blöcke auf die Türen weisen lassen. Ist das möglich?
A: Sicher. Scannen Sie die Türen mit Hilfe der Blöcke. Schauen Sie sich den “Intelligent Elevators” Artikel in Aum 18 an, um zu sehen, wie es gemacht wird.

F: Ich habe eine Waffe und kann laufen. Wenn ich eine Kugel abschieße, gehe ich sehr langsam. Ist das normal?
A: Nein, ist es nicht. Ihre Kugel kollidiert mit der Waffe. Schreiben Sie diese Zeile vor die ent_move Anweisung für Ihre Kugel:

move_mode = ignore_you + ignore_passable

F: Wie kann ich AVIs auf Sprites abspielen?
A: Schreiben Sie den Code unten an das Ende Ihrer office.wdl; dann geben Sie Ihrem Sprite die Action movie_on_sprite. Mit der “P” Taste rufen Sie den Film auf.

action movie_on_sprite
{
while (key_p == 0) {wait (1);} // press "P" to play the movie
media_play ("skiing.avi",bmap_for_entity (my, 0), 100);
}

F: Kann mir jemand verraten, wie ich den Sprite des Raketenwerfers durch Partikel ersetzen kann?
A: Schreiben Sie den Code an den Anfang der weapons.wdl:

bmap spark_pcx = <spark.pcx>;

function fade_away()
{
my.alpha -= 3 * time;
if (my.alpha < 0) {my.lifespan = 0;}
}

function particle_sparks()
{
temp.x = random(2) - 1;
temp.y = random(2) - 1;
temp.z = random(2) - 1;
vec_rotate (temp, my.pan);
vec_normalize (temp, 3);
vec_add (my.vel_x, temp);
my.alpha = 40 + random(30);
my.bmap = spark_pcx;
my.size = random(2) + 5;
my.flare = on;
my.bright = on;
my.move = on;
my.lifespan = 100;
my.function = fade_away;
}

function _rocket_event2()
{
proc_kill(1); //EXCLUSIVE_ENTITY; // terminate other functions started by 'my' to stop moving
MY.EVENT = NULL;
MY.SKILL9 = -1; // stop movement

wait(1); // to avoid dangerous instruction in event warning
// Apply damage
range = MY._DAMAGE * 6;
damage = MY._DAMAGE;
temp.PAN = 360;
temp.TILT = 360;
temp.Z = range;
indicator = _EXPLODE; // must always be set before scanning
scan(MY.POS,MY_ANGLE,temp);

// Explode
MY.AMBIENT = 100;
MY.FACING = ON;
MY.NEAR = ON;
MY.FLARE = ON;

MY.PASSABLE = ON;
MY.AMBIENT = 100;
MY.LIGHTRED = light_flash.RED;
MY.LIGHTGREEN = light_flash.GREEN;
MY.LIGHTBLUE = light_flash.BLUE;
MY.LIGHTRANGE = 64;
wait(1);

play_entsound ME,hit_wham,300;
my.skill9 = 10;
vec_set (temp, my.pos);
while (my.skill9 > 0)
{
effect (particle_sparks, 10, temp, normal);
my.skill9 -= 2 * time;
}
remove(ME);
}

und ändern Sie dann zwei Zeilen in der rocket_launch Funktion:

function rocket_launch()
{
vec_scale(MY.SCALE_X,actor_scale); // use actor_scale

MY.ENABLE_BLOCK = ON; // collision with map surface
MY.ENABLE_ENTITY = ON; // collision with entity
MY.ENABLE_STUCK = ON;
MY.ENABLE_IMPACT = ON;
MY.ENABLE_PUSH = ON;
MY.EVENT = _rocket_event2;

MY.AMBIENT = 100; // bright
MY.LIGHTRANGE = 150;
MY.LIGHTRED = 250;
MY.LIGHTGREEN = 50;
MY.LIGHTBLUE = 50;

//- MY.PAN = YOUR.PAN; // the rocket start in the same direction than this 'emitter'
//- MY.TILT = YOUR.TILT;
//- MY.ROLL = YOUR.ROLL;
vec_to_angle(MY.PAN, shot_speed);

MY.SKILL2 = shot_speed.x;
MY.SKILL3 = shot_speed.y;
MY.SKILL4 = shot_speed.z;
MY._DAMAGE = damage;
MY._FIREMODE = fire_mode;

MY.SKILL9 = 250; // 'burn time' (fuel)
while(MY.SKILL9 > 0)
{
temp.X = MY.SKILL2 * TIME;
temp.Y = MY.SKILL3 * TIME;
temp.Z = MY.SKILL4 * TIME;
vec_scale(temp,movement_scale); // scale distance by movement_scale
//-- move(ME,NULLSKILL,temp);
move_mode = ignore_you + ignore_passable + activate_trigger;
result = ent_move(nullskill,temp);

emit(3,MY.POS,particle_smoke); // emit( smoke
MY.SKILL9 -= TIME; // burn fuel
wait(1); // update position once per tick
}
_rocket_event2(); // explode when out of fuel
}

F: Gibt es eine Möglichkeit, die patrol_path Action zu ändern, dass ein 3D Pfad verwendet wird?
A: Benutzen Sie den “Campath” Artikel auf Aum 6. Der Code bewegt eine Kamera auf einem 3D Pfad, aber Sie können die Kamera durch jede andere Entity ersetzen.

F: Ich habe bei anderen schon atemberaubende Terrains mit LOD, Gras, etc. gesehen. Ich frage mich, ob vielleicht jemand die Geduld hätte, mir einen Hinweis zu geben, wie sowas bewerkstelligt werden kann...
A: Unreal Tournament benutzt ein simples LOD System für das Gras, mit detaillierten Sprites die angezeigt werden, wenn der Spieler näher kommt. Serious Sam 2 erzeugt detaillierte Gras Sprites um den Spieler herum und entfernt die, die weiter weg sind.