Q: How can I add an engine sound to the car code in Aum10?
A: You have to add a few things and modify function player_to_car():

var engine_handle;

sound engine_snd = <engine.wav>;

function player_to_car()
{
     wait (1);
     ent_remove (me);
     player.shadow = off;
     player._MOVEMODE = _MODE_DRIVING;
     player._FORCE = 1.5;
     player._BANKING = 0.1;
     player.__SLOPES = on;
     player.__WHEELS = on;
     player.__JUMP = off;
     player.__STRAFE = off;
     player.__TRIGGER = on;
     astrength.pan = 1.5;
     car_entity.visible = on;
     while (key_space == 0) // press space to switch from car to player
     {
          if (key_force.y != 0)
          {
               if (snd_playing (engine_handle) == 0)
               {
                    snd_loop (engine_snd, 40, 0);
                    engine_handle = result;
               }
          }
          else
          {
               snd_stop (engine_handle);
          }
          wait (1);
     }
     temp.x = player.x - 100 * sin(player.pan);
     temp.y = player.y + 100 * cos(player.pan);
     temp.z = player.z;
     ent_create (car_mdl, player.pos, create_car);
     vec_set (player.pos, temp);
     car_entity.visible = off;
     car_to_player();
}
 
 

Q: How do I create a panel that says: "press any key to continue" for every level that is loaded?
A: Use this piece of code:

bmap presskey_pcx = <presskey.pcx>;

panel presskey_pan
{
 bmap = presskey_pcx;
 layer = 30;
 pos_x = 0;
 pos_y = 0;
 flags = d3d, overlay, refresh;
}

action panel_trigger // place any entity with this action attached to it in every level
{
    my.invisible = on;
    my.passable = on;
    presskey_pan.visible = on;
    while (key_any == 0) {wait (1);}
    presskey_pan.visible = off;
}
 
 

Q: How do I make my player disappear when it enters a vehicle and reappear when it gets out of the vehicle?
A: Here's the car code in Aum10 modified for 3rd person player:

// include this file in your main game file
// attach action my_car to your car model

string car_mdl = <rallycar.mdl>;

function player_to_car();
function car_to_player();
function create_car();

entity car_entity
{
     type = <rallycar.mdl>;
     layer = 10;
     view = camera;
     x = 20;
     y = 0;
     z = -60;
}

action my_car
{
     person_3rd = 0.5; // force 3rd person mode
     my.enable_impact = on;
     my.event = player_to_car;
}

function player_to_car()
{
     wait (1);
     ent_remove (me);
     player.shadow = off;
     player.invisible = on;
     player._MOVEMODE = _MODE_DRIVING;
     player._FORCE = 1.5;
     player._BANKING = 0.1;
     player.__SLOPES = on;
     player.__WHEELS = on; // rotate only when moving
     player.__JUMP = off; // the car can't jump
     player.__STRAFE = off; // can't strafe
     player.__TRIGGER = on;
     astrength.pan = 1.5; // decrease rotation speed (pan)
     car_entity.visible = on;
     while (key_space == 0) // press space to switch from car to player
     {
          wait (1);
     }
     temp.x = player.x - 100 * sin(player.pan); // check to see if there is an empty space (near the car door) to deploy the player
     temp.y = player.y + 100 * cos(player.pan);
     temp.z = player.z;
     ent_create (car_mdl, player.pos, create_car);
     vec_set (player.pos, temp);
     car_entity.visible = off;
     car_to_player();
}

function car_to_player()
{
     player._MOVEMODE = _MODE_WALKING;
     player._FORCE = 0.75;
     player._BANKING = -0.1;
     player.__SLOPES = off;
     player.__WHEELS = off;
     player.__JUMP = on;
     player.__DUCK = on;
     player.__STRAFE = on;
     player.__BOB = on;
     player.__TRIGGER = on;
     player.invisible = off;
     astrength.pan = 7; // restore the original value in move.wdl
}
 
function create_car()
{
     wait (1);
     vec_set(temp, my.x);
     my.pan = player.pan;
     temp.z -= 2000; // trace 2000 quants below the car
     trace_mode = ignore_me + ignore_passable + ignore_models + ignore_sprites;
     my.z -= trace (my.x, temp); // place the car at ground level
     my_car(); // start the action again
}

 

Q: I use the car code in Aum10 and I'd like to know how to make my player face the same direction as the car after entering it; now the car receives my player's pan value which doesn't look right.
A: Change function player_to_car() this way:

function player_to_car()
{
     wait (1);
     player.pan = my.pan;
     ent_remove (me);
     player.shadow = off;
     player._MOVEMODE = _MODE_DRIVING;
     player._FORCE = 1.5;
     player._BANKING = 0.1;
     player.__SLOPES = on;
     player.__WHEELS = on; // rotate only when moving
     player.__JUMP = off; // the car can't jump
     player.__STRAFE = off; // can't strafe
     player.__TRIGGER = on;
     astrength.pan = 1.5; // decrease rotation speed (pan)
     car_entity.visible = on;
     while (key_space == 0) // press space to switch from car to player
     {
          wait (1);
     }
     temp.x = player.x - 100 * sin(player.pan); // check to see if there is an empty space (near the car door) to deploy the player
     temp.y = player.y + 100 * cos(player.pan);
     temp.z = player.z;
     ent_create (car_mdl, player.pos, create_car);
     vec_set (player.pos, temp);
     car_entity.visible = off;
     car_to_player();
}
 
 

Q: How do I do, that when the player picks up a gun, it actually holds the gun in the third person view?
A: Animate your gun model(s) together with the player model then save them as separate models. This piece of code does what you want:
 
string gun_mdl = <gun.mdl>;

function attach_player_gun();

action pick_me_up // attach it to your gun
{
    my.passable = on;
    while (player == null) {wait (1);}
    while (vec_dist (player.x, my.x) < 100) {wait (1);}
    ent_remove (me);
    ent_create(gun_mdl, nullvector, attach_player_gun); // give the player a gun
}

function attach_player_gun()
{
     proc_late();
     my.passable = on;
     my.metal = on;
     while(player != null)
     {
        vec_set(my.pos,player.pos);
        vec_set(my.pan,player.pan);
        my.frame = player.frame;
        my.next_frame = player.next_frame;
        wait(1);
     }
     ent_remove(my);
}
 
 

Q: I would like to use the keys WSAD for movement; is it possible if I am using the templates?
A: Replace these lines in movement.wdl (input.wdl if your templates are newer):
 
force.X = strength.X*(KEY_FORCE.Y+JOY_FORCE.Y);  // forward/back
force.Y = strength.Y*(KEY_COMMA-KEY_PERIOD);     // side to side

with these ones:

force.X = strength.X*(KEY_FORCE.Y+JOY_FORCE.Y+key_w-key_s);
force.Y = strength.Y*(KEY_COMMA-KEY_PERIOD+key_a-key_d);
 
 

Q: How can I increase or reduce player's health or armor smoothly instead of taking one big chunk of it?
A: Here's an example:

define damage skill10;

function decrease_health();

action enemy // could be an enemy, an enemy bullet, etc
{
    my.damage = 10;
    ........................
}

action player
{
    ..................................
    my.enable_impact = on;
    my.event = decrease_health;
    while (1)
    {
        ...........
        wait (1);
    }
}
 
function decrease_health()
{
    if (event_type == event_impact && you.damage != 0) // it is an enemy, an enemy bullet, etc
    {
        player.skill48 = player._health;
        while (player._health > player.skill48 - you.damage)
        {
            player._health -= 5 * time;
            wait (1);
        }
    }
}

 

Q: How do I do that when the player clicks "use" on a certain object, it moves to the next level, and restores health and armor?
A: Here's the code:

function next_level();

bmap use_pcx = <use.pcx>;
string level2_wmb = <level2.wmb>;

panel use_me // shows the usable object on the screen
{
     bmap = use_pcx;
     layer = 20;
     pos_x = 40;
     pos_y = 60;
     flags = d3d, overlay, refresh, visible;
     on_click next_level;
}

function next_level()
{
     level_load (level2_wmb);
}
 
Health and armor are restored automatically (set their values using skill9 and skill10 if you are using the templates).
 
 

Q: I'm trying to do a car racing game; what do I need to call the left, right, etc animation frames when I press the corresponding keys?
A: I will assume that you are using the arrow keys for movement:

action my_car
{
    while (1)
    {
        ...........
        // movement code
        ..........
        if (key_cul == 1)
        {
            ent_cycle("rotateleft", my.skill20); // name your animation frames this way
            my.skill20 += 3 * time; // animation speed
            my.skill20 %= 100; // loop the animation
        }
        if (key_cur == 1)
        {
            ent_cycle("rotateright", my.skill20); // name your animation frames this way
            my.skill20 += 3 * time; // animation speed
            my.skill20 %= 100; // loop the animation
        }
        if ((key_cul + key_cur == 0) && (key_cuu + key_cud != 0))
        {
            ent_cycle("moveforward", my.skill20); // name your animation frames this way
            my.skill20 += 3 * time; // animation speed
            my.skill20 %= 100; // loop the animation
        }
        wait (1);
    }
}