Wolf3d Haven Forum

Please log in or register. Smile

Join the forum, it's quick and easy

Wolf3d Haven Forum

Please log in or register. Smile

Wolf3d Haven Forum

Would you like to react to this message? Create an account in a few clicks or log in to continue.
Wolf3d Haven Forum

A friendly Wolfenstein 3D community, about Wolfenstein 3D, the game that gave birth to first person shooters...


    motor bike

    Dark_wizzie
    Dark_wizzie
    I am Death Incarnate!
    I am Death Incarnate!


    Female
    Number of posts : 5120
    Age : 30
    Location : California, USA
    Job : Investor
    Hobbie : Computers, chess, computer chess, fashion, and philosophy
    Message : I made this forum when I was 13 High on Drugs
    Registration date : 2007-03-24

    motor bike Empty motor bike

    Post by Dark_wizzie Sun Apr 29, 2007 1:59 pm

    dome





    Code Editing Tutorials
    Adding a motorbike.




    You want to add a motorbike run to you game, like in Project Weltuntergang? Here's how to do it, by Kuki:

    *WL_DEF.H

    -add this to the gamestate structure:

    boolean mbike; // is the player riding on the mbike
    int motospeed; // what's the bike's speed
    boolean left; // are you turning left
    boolean right; // are you turning right


    *WL_GAME.C
    - in SetupGameLevel add: (it sets mbike to true, left & right to false and motospeed to 0 on certain level(s))

    if (!loadedgame)
    {
    gamestate.TimeCount=
    .
    .
    .
    gamestate.treasurecount=0;
    +if (gamestate.mapon==0 && gamestate.episode==0) // first level, first episode
    +{
    +gamestate.mbike=true;
    +gamestate.motospeed=0;
    +gamestate.left=false;
    +gamestate.right=false;
    +}
    +else
    +gamestate.mbike=false;
    }

    *WL_AGENT.C

    - in T_Player add: (no use (doors, elevators, secrets), fire or weapon change on a mbike)

    +if (gamestate.mbike!=true) {
    CheckWeaponChange();
    if (buttonstate[bt_use]...
    .
    .
    .
    Cmd_Fire ();
    + }

    - in ControlMovement add: (the most improtant part - driving the bike)

    //
    // side to side move
    //
    + if (gamestate.mbike!=true) // no strafe on a mbike
    + {
    if (buttonstate[bt_strafe])
    {
    //
    // strafing
    //
    //
    if (controlx > 0)
    {
    angle = ob->angle - ANGLES/4;
    if (angle < 0)
    angle += ANGLES;
    .
    .
    .
    .

    angle = ob->angle + ANGLES/2;
    if (angle >= ANGLES)
    angle -= ANGLES;
    Thrust (angle,controly*BACKMOVESCALE); // move backwards
    }

    + }
    + else
    + {
    + if (controlx > 0) // this section sets left & rigth to true/false depending on the keys that player presses
    + {
    + gamestate.left=true;
    + gamestate.right=false;
    + }
    + else if (controlx < 0)
    + {
    + gamestate.left=false;
    + gamestate.right=true;
    + }
    + else
    + {
    + gamestate.left=false;
    + gamestate.right=false;
    + }
    +
    + anglefrac += controlx*.5; // turning - you may adjust this line and/or add some gamestate.motospeed dependencies
    + angleunits = anglefrac/ANGLESCALE;
    + anglefrac -= angleunits*ANGLESCALE;
    + ob->angle -= angleunits;
    +
    + if (ob->angle >= ANGLES)
    + ob->angle -= ANGLES;
    + if (ob->angle < 0)
    + ob->angle += ANGLES;
    +
    + if (controly > 0 ) // brakes
    + {
    + if (gamestate.motospeed>controly)
    + gamestate.motospeed-=controly*2;
    + else if (gamestate.motospeed>=0-controly)
    + gamestate.motospeed=0;
    + else
    + gamestate.motospeed+=controly*2
    + SD_PlaySound (DIESND); //use some BRAKESND instead, this may cause problems, not well tested!!!
    + }
    + else if (controly < 0) // accelerate
    + {
    + if (gamestate.motospeed<30000)
    + gamestate.motospeed-=controly*.5;
    + else
    + gamestate.motospeed=30000;
    + SD_PlaySound (HITWALLSND); //use some ENGINESND instead, this may cause problems, not well tested!!!
    + }
    + else // no keys pressed - bike slowly reduces it's speed
    + {
    + if (gamestate.motospeed<0)
    + gamestate.motospeed+=10;
    + else if (gamestate.motospeed>0)
    + gamestate.motospeed-=1;
    + }
    + Thrust (ob->angle,gamestate.motospeed);
    + }

    if (gamestate.victoryflag) // watching the BJ actor
    return;

    - in TryMove: (kills an enemy when he's hit with big speed)

    for (y=yl;y<=yh;y++)
    for (x=xl;x<=xh;x++)
    {
    check = actorat[x][y];
    if (check > objlist
    && (check->flags & FL_SHOOTABLE) )
    {
    deltax = ob->x - check->x;
    if (deltax < -MINACTORDIST || deltax > MINACTORDIST)
    continue;
    deltay = ob->y - check->y;
    if (deltay < -MINACTORDIST || deltay > MINACTORDIST)
    continue;

    + if (gamestate.mbike==true && (gamestate.motospeed>=2000 || gamestate.motospeed<=-2000)) //adjust the speed to your liking
    + {
    + KillActor(actorat[x][y]);
    + return true;
    + }

    return false;
    }
    }

    return true;

    - in DrawWeapon (status bar weapon pic)

    void DrawWeapon (void)
    {
    if (gamestate.mbike!=true)
    StatusDrawPic (32,8,KNIFEPIC+gamestate.weapon);
    else
    StatusDrawPic (32,8,MBIKEPIC); // use your own picture
    }



    - in ClipMove (what to do after mbike hits an object/wall with a certain speed):

    if (noclip && ob->x > 2*TILEGLOBAL && ob->y > 2*TILEGLOBAL &&
    ob->x < (((long)(mapwidth-1))<<TILESHIFT)
    && ob->y < (((long)(mapheight-1))<<TILESHIFT) )
    return; // walk through walls

    + if (gamestate.mbike==true)
    + {
    + if (gamestate.motospeed<=200) // very slow or backwards movement - just set the speed to 0
    + gamestate.motospeed=0;
    + else // if we're riding faster... (you should add crash sound here, probably something like the sound stuff just below this "+" section. I didn't add it cause I have some problems with sound in Wolf and can't test it)
    + {
    + if (gamestate.motospeed>=5000) // take damage if you're driving really fast, damage depends on the speed
    +{
    + TakeDamage (gamestate.motospeed/500, NULL);
    + SD_PlaySound (EVASND); // use some CRASHSND of your creation instead
    +}
    + gamestate.motospeed=-0.3*gamestate.motospeed; // bounce
    + } // so that you won't get into a wall
    + ob->x=basex;
    + ob->y=basey;
    + return;
    + }

    if (!SD_SoundPlaying())
    SD_PlaySound (HITWALLSND);


    * WL_DRAW.C

    - in DrawPlayerWeapon (draws sprite appropriate to the side you're turning as the weapon in player's hands)

    #ifndef SPEAR
    if (gamestate.victoryflag)
    {
    if (player->state == &s_deathcam && (TimeCount&32) )
    SimpleScaleShape(viewwidth/2,SPR_DEATHCAM,viewheight+1);
    return;
    }
    #endif
    + if (gamestate.mbike == true)
    + {
    + if (gamestate.left == true)
    + {
    + SimpleScaleShape(viewwidth/2,SPR_CHAINATK1,viewheight+1); // change SPR_* here and below to your own ones
    + return;
    + }
    + else if (gamestate.right == true)
    + {
    + SimpleScaleShape(viewwidth/2,SPR_KNIFEATK2,viewheight+1);
    + return;
    + }
    + SimpleScaleShape(viewwidth/2,SPR_PISTOLATK3,viewheight+1);
    + return;
    + }

    if (gamestate.weapon != -1)
    {
    shapenum = weaponscale[gamestate.weapon]+gamestate.weaponframe;
    SimpleScaleShape(viewwidth/2,shapenum,viewheight+1);
    }


    Voila! You should get a nice motorbike. Any questions? Mail
    [email]Kuki[/email]. Thanks to him for such a nice tutorial!




    Wolf3d Haven
    Minute Logic Blog

      Current date/time is Thu Nov 21, 2024 3:35 am