Most asked questions

Top  Previous  Next

Q: I'm using the sword combat wdl in Aum12 and I need help adding gravity to the player and enemy. Please help!

A: Replace player_fight and enemy_fight with the ones below:

 

aum29_shot5

 

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

}

 

Q: How can I set the strength of the fog in my levels? I use camera.fog = 1..100 but I get the same effect.

A: Use the new camera.fog_start and camera.fog_end to set the strength. Check "Fogger" in Aum25 to see an example.

 

Q: Can someone please explain how to make a movement similar to Counterstrike. As in normal walking is running and shift halves the speed. I'm using the templates.

A: Place this line in function main:

 

shift_sense = 0.5;

 

and then change strength in movement.wdl like this:

 

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

 

Q: I'm trying to program a block where you step on it and a door opens, but I don't want to handcode each door, so for each block I just want it to point to a door so I can open it and give it a generic function. Is this possible?

A: Sure. Scan your doors using the block that triggers the event. Check the "Intelligent elevators" article in Aum18 to see how it is done.

 

Q: I have a gun and I can walk. If I fire a bullet I walk very slowly. Is this normal?

A: No, it isn't normal. Your bullet collides with its creator - the gun. Add this line in front of the ent_move line that moves the bullet:

 

move_mode = ignore_you + ignore_passable

 

Q: How can I play AVIs on a sprite?

A: Add the code below at the end of your office.wdl file; attach action movie_on_sprite to your sprite. Press "P" to play the movie.

 

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);

}

 

aum29_shot6

 

 

Q: Can anyone please tell me how to replace the sprite used by the rocket launcher with particles?

A: Paste the code below at the beginning of 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);

}

 

and then edit two lines in function rocket_launch:

 

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

}

 

aum29_shot7

 

Q: Is there a way to change patrol_path so that it uses a 3D path?

A: Use my "Campath" article in Aum6. That code moves the camera on a 3D path but you can replace the camera with any entity.

 

Q: I've seen people do some really incredible terrain with lod and grass etc. Just wondering if someone has the patience to share a clue with me.

A: Unreal Tournament uses a simple LOD system for the grass, with detailed sprites that appear when the player gets closer. Serious Sam 2 creates a number of detailed grass sprites around the player and removes the ones that are far away from the player.