(Tutorial) Adding new ammo and use new weapon for Wolf4SDL

Go down

(Tutorial) Adding new ammo and use new weapon for Wolf4SDL Empty (Tutorial) Adding new ammo and use new weapon for Wolf4SDL

Post by Officer-M. John (Admin) on Tue May 24, 2016 4:35 pm

I use My version in my mod and work.

Adding a new weapon:

WL_DEF.H:

Code:

//
// player attack frames
//
    SPR_KNIFEREADY,SPR_KNIFEATK1,SPR_KNIFEATK2,SPR_KNIFEATK3,
    SPR_KNIFEATK4,

    SPR_PISTOLREADY,SPR_PISTOLATK1,SPR_PISTOLATK2,SPR_PISTOLATK3,
    SPR_PISTOLATK4,

    SPR_MACHINEGUNREADY,SPR_MACHINEGUNATK1,SPR_MACHINEGUNATK2,MACHINEGUNATK3,
    SPR_MACHINEGUNATK4,

    SPR_CHAINREADY,SPR_CHAINATK1,SPR_CHAINATK2,SPR_CHAINATK3,
    SPR_CHAINATK4,
    
    SPR_MP44READY,SPR_MP44ATK1,SPR_MP44ATK2,SPR_MP44ATK3,
    SPR_MP44ATK4,

typedef enum {
    none,
    block,
    bo_gibs,
    bo_alpo,
    bo_firstaid,
    bo_key1,
    bo_key2,
    bo_key3,
    bo_key4,
    bo_cross,
    bo_chalice,
    bo_bible,
    bo_crown,
    bo_clip,
    bo_clip2,
    bo_pistol,
    bo_machinegun,
    bo_chaingun,
    bo_mp44,  <-- new weapon
    bo_food,
    bo_fullheal,
    bo_25clip,
    bo_spear
} wl_stat_t;

enum
{
    bt_nobutton=-1,
    bt_attack=0,
    bt_strafe,
    bt_run,
    bt_use,
    bt_readyknife,
    bt_readypistol,
    bt_readymachinegun,
    bt_readychaingun,
    bt_readymp44,
    bt_nextweapon,
    bt_prevweapon,
    bt_esc,
    bt_pause,
    bt_strafeleft,
    bt_straferight,
    bt_moveforward,
    bt_movebackward,
    bt_turnleft,
    bt_turnright,
    NUMBUTTONS
};

#define NUMWEAPONS      5
typedef enum
{
    wp_knife,
    wp_pistol,
    wp_machinegun,
    wp_chaingun,
    wp_mp44
} weapontype;

WL_AGENT.CPP:

Code:

struct atkinf
{
    int8_t    tics,attack,frame;              // attack is 1 for gun, 2 for knife
} attackinfo[5][14] =
{
    { {6,0,1},{6,2,2},{6,0,3},{6,-1,4} },
    { {6,0,1},{6,1,2},{6,0,3},{6,-1,4} },
    { {6,0,1},{6,1,2},{6,3,3},{6,-1,4} },
    { {6,0,1},{6,1,2},{6,4,3},{6,-1,4} },
    { {6,0,1},{6,1,2},{6,3,3},{6,-1,4} },  //wp_mp44
};

        case    bo_machinegun:
            SD_PlaySound (GETMACHINESND);
            GiveWeapon (wp_machinegun);
            break;
        case    bo_chaingun:
            SD_PlaySound (GETGATLINGSND);
            facetimes = 38;

            if(viewsize != 21)
                StatusDrawFace (GOTGATLINGPIC);
            facecount = 0;
            break;

        case    bo_mp44:
            SD_PlaySound (GETMACHINESND);
            GiveWeapon (wp_mp44);
            break;

    switch (gamestate.weapon)
    {
        case wp_pistol:
            SD_PlaySound (ATKPISTOLSND);
            break;
        case wp_machinegun:
            SD_PlaySound (ATKMACHINEGUNSND);
            break;
        case wp_chaingun:
            SD_PlaySound (ATKGATLINGSND);
            break;
        case wp_mp44:
            SD_PlaySound (TAKEDAMAGESND);
            break;
    }

WL_PLAY.CPP:

Code:

int buttonscan[NUMBUTTONS] = { sc_Control, sc_Alt, sc_LShift, sc_Space, sc_1, sc_2, sc_3, sc_4, sc_5 };

WL_DRAW.CPP:

Code:

int weaponscale[NUMWEAPONS] = {SPR_KNIFEREADY, SPR_PISTOLREADY,
    SPR_MACHINEGUNREADY, SPR_CHAINREADY, SPR_MP44READY};

WL_ACT1.CPP:

Code:

{SPR_STAT_0,bo_mp44},                           // puddle          spr1v

    switch (statinfo[type].type)
    {  
        case block:
            actorat[tilex][tiley] = (objtype *) 64;          // consider it a blocking tile
        case none:
            laststatobj->flags = 0;
            break;

        case    bo_cross:
        case    bo_chalice:
        case    bo_bible:
        case    bo_crown:
        case    bo_fullheal:
            if (!loadedgame)
                gamestate.treasuretotal++;

        case    bo_firstaid:
        case    bo_key1:
        case    bo_key2:
        case    bo_key3:
        case    bo_key4:
        case    bo_clip:
        case    bo_25clip:
 case    bo_pistol:
        case    bo_machinegun:
        case    bo_chaingun:
        case    bo_mp44:
        case    bo_food:
        case    bo_alpo:
        case    bo_gibs:
        case    bo_spear:
            laststatobj->flags = FL_BONUS;
            laststatobj->itemnumber = statinfo[type].type;
            break;
    }

Adding new ammo:

WL_DEF.H:

Code:

typedef enum {
    none,
    block,
    bo_gibs,
    bo_alpo,
    bo_firstaid,
    bo_key1,
    bo_key2,
    bo_key3,
    bo_key4,
    bo_cross,
    bo_chalice,
    bo_bible,
    bo_crown,
    bo_clip,
    bo_clip2,
    bo_pistol,
    bo_machinegun,
    bo_chaingun,
    bo_rounds, <-- new ammo for mp44
    bo_mp44,  
    bo_food,
    bo_fullheal,
    bo_25clip,
    bo_spear
} wl_stat_t;

typedef struct
{
    short       difficulty;
    short       mapon;
    int32_t     oldscore,score,nextextra;
    short       lives;
    short       health;
    short       ammo;
    short       rounds;
    short       keys;

void    GiveAmmo (int ammo);
void    GiveRounds (int rounds);
void    GiveKey (int key);

WL_AGENT.CPP:

Code:

// Checks to make sure you have ammo for weapon
// returns "true" if yes and "false" if no
int ChkAtkAmmo (int weapon)
{
   switch (weapon)
   {    
      case wp_knife:
      case wp_flakgun_mounted:    
           return 1;
      case wp_pistol:
           if (gamestate.ammo > 0) return 1;
         break;
      case wp_machinegun:
           if (gamestate.ammo > 0) return 1;
         break;
      case wp_chaingun:
           if (gamestate.ammo > 0) return 1;
         break;
      case wp_mp44:
           if (gamestate.rounds > 0) return 1;
         break;  
   }
   return 0;
}

void CheckWeaponChange (void)
{
  int   i,buttons;

   if (!gamestate.ammo && !gamestate.rounds)      // must use knife with no ammo
   {
      gamestate.weapon = wp_knife;
      return;
   }
   if (gamestate.chosenweapon == wp_pistol && gamestate.bestweapon < wp_pistol && !gamestate.rounds)
   {
      gamestate.chosenweapon = gamestate.weapon = wp_knife;
   }


/*    
      for (i=wp_knife ; i<=gamestate.bestweapon ; i++)
      if (buttonstate[bt_readyknife+i-wp_knife])
      {
         gamestate.weapon = gamestate.chosenweapon = i;
         DrawWeapon ();
         return;
      }
*/


    if (Keyboard[sc_1] && gamestate.bestweapon >= wp_knife)
    {
      gamestate.weapon = gamestate.chosenweapon = wp_knife;
    }
    if (Keyboard[sc_2] && gamestate.bestweapon >= wp_pistol)
    {
      gamestate.weapon = gamestate.chosenweapon = wp_pistol;
    }
    if (Keyboard[sc_3] && gamestate.bestweapon >= wp_machinegun)
    {
      gamestate.weapon = gamestate.chosenweapon = wp_machinegun;
    }
    if (Keyboard[sc_4] && gamestate.bestweapon >= wp_chaingun)
    {
      gamestate.weapon = gamestate.chosenweapon = wp_chaingun;
    }
    if (Keyboard[sc_5] && gamestate.bestweapon >= wp_mp44)
    {
      gamestate.weapon = gamestate.chosenweapon = wp_mp44;
    }

   //make ammo change with ammo/rounds/nordenfelt
   if (gamestate.chosenweapon == wp_pistol || gamestate.chosenweapon == wp_machinegun || gamestate.chosenweapon == wp_chaingun)
   {
      gamestate.ammo;
   }
   if (gamestate.chosenweapon == wp_mp44)
   {
      gamestate.rounds;
   }
  
   DrawWeapon ();
   DrawAmmo ();
}

void GiveWeapon (int weapon)
{
  if (weapon == wp_pistol)
      GiveAmmo (6);
  if (weapon == wp_machinegun)
      GiveAmmo (8);
  if (weapon == wp_chaingun)
      GiveAmmo (12);
  if (weapon == wp_mp44)
      GiveRounds (16);  
  
 if (gamestate.bestweapon<weapon)
 gamestate.bestweapon = gamestate.weapon
 = gamestate.chosenweapon = (weapontype) weapon;
        
    DrawWeapon ();        

}

/*
===============
=
= DrawAmmo
=
===============
*/

void DrawAmmo (void)
{
    switch (gamestate.chosenweapon)
    {
        case wp_mp44:
           LatchNumber (28,16,2,gamestate.rounds);
           break;      
        case wp_knife:
           LatchNumber (27,16,2,0);
           break;        
       default:
           LatchNumber (27,16,2,gamestate.ammo);
       }
}

/*
===============
=
= GiveRounds
=
===============
*/

void GiveRounds (int rounds)
{
 if (!gamestate.rounds)                 // knife was out
 {
                if (!gamestate.attackframe)
 {
 gamestate.weapon = gamestate.chosenweapon;
 DrawWeapon ();
 }
 }
 gamestate.rounds += rounds;
 if (gamestate.rounds > 99)
 gamestate.rounds = 99
    DrawAmmo ();
}

        case    bo_rounds:
            if (gamestate.rounds == 99)
                return;

               SD_PlaySound (GETAMMOSND);
               GiveRounds (5);
               break;

        switch (cur->attack)
        {
           case -1:            
             ob->state = &s_player;
                if (!ChkAtkAmmo (gamestate.weapon))
                {
                    gamestate.weapon = gamestate.chosenweapon = wp_knife;
                    DrawWeapon ();
                }
                else
                {
                //   if (gamestate.weapon != gamestate.chosenweapon)
                //   {
                        gamestate.weapon = gamestate.chosenweapon;
                        DrawWeapon ();
                 //   }
                }
                gamestate.attackframe = gamestate.weaponframe = 0;
                return;

            case 4:
                if (!ChkAtkAmmo(gamestate.weapon))
                    break;
                if (buttonstate[bt_attack])
                    gamestate.attackframe -= 2;
            case 1:
                if (!ChkAtkAmmo(gamestate.weapon))
                {       // can only happen with chain gun
                    gamestate.attackframe++;
                    break;
                }

 if (!ammocheat)    
 {
                        GunAttack (ob);  
                        }        
 switch (gamestate.weapon)
 {
 case wp_pistol:
                        case wp_machinegun:
                        case wp_chaingun:
 gamestate.ammo--;
 break;
                        case wp_mp44:
 gamestate.rounds--;
 break;
 }
 DrawAmmo ();
 break;
                
            case 2:
                KnifeAttack (ob);
                break;

            case 3:            
                if (ChkAtkAmmo(gamestate.weapon) && buttonstate[bt_attack])
                    gamestate.attackframe -= 2;
                break;  

WL_MAIN.CPP:

Code:

void NewGame (int difficulty,int episode)
{
    memset (&gamestate,0,sizeof(gamestate));
    gamestate.difficulty = difficulty;
    gamestate.weapon = gamestate.bestweapon
            = gamestate.chosenweapon = wp_pistol;
    gamestate.health = 100;
    gamestate.ammo = STARTAMMO;
    gamestate.rounds = 0;
    gamestate.lives = 3;
    gamestate.keys = 0;
    gamestate.nextextra = EXTRAPOINTS;
    gamestate.episode=episode;

    startgame = true;
}

        gamestate.oldscore = gamestate.score = 0;
        gamestate.lives = 1;
        gamestate.weapon =
            gamestate.chosenweapon =
            gamestate.bestweapon = wp_pistol;
        gamestate.ammo = 8;
        gamestate.rounds = 0;
    }

    return true;
}

WL_GAME.CPP:

Code:

    if (gamestate.lives > -1)
    {
        gamestate.health = 100;
        gamestate.armor = 100;
        gamestate.weapon = gamestate.bestweapon
            = gamestate.chosenweapon = wp_pistol;
        gamestate.ammo = STARTAMMO;
        gamestate.rounds = 0;
        gamestate.keys = 0;
        pwallstate = pwallpos = 0;
        gamestate.attackframe = gamestate.attackcount =
            gamestate.weaponframe = 0;

        if(viewsize != 21)
        {
            DrawKeys ();
            DrawWeapon ();
            DrawAmmo ();
            DrawHealth ();
            DrawFace ();
            DrawLives ();
            DrawArmor ();
        }
    }
}

WL_ACT1.CPP:

Code:

{SPR_STAT_40,bo_rounds},                    // Call Apogee          spr7v

    switch (statinfo[type].type)
    {  
        case block:
            actorat[tilex][tiley] = (objtype *) 64;          // consider it a blocking tile
        case none:
            laststatobj->flags = 0;
            break;

        case    bo_cross:
        case    bo_chalice:
        case    bo_bible:
        case    bo_crown:
        case    bo_fullheal:
            if (!loadedgame)
                gamestate.treasuretotal++;

        case    bo_firstaid:
        case    bo_key1:
        case    bo_key2:
        case    bo_key3:
        case    bo_key4:
        case    bo_clip:
        case    bo_25clip:
 case    bo_pistol:
        case    bo_machinegun:
        case    bo_chaingun:
        case    bo_rounds:
        case    bo_mp44:
        case    bo_food:
        case    bo_alpo:
        case    bo_gibs:
        case    bo_spear:
            laststatobj->flags = FL_BONUS;
            laststatobj->itemnumber = statinfo[type].type;
            break;
    }
Officer-M. John (Admin)
Officer-M. John (Admin)
Admin

Posts : 422
Join date : 2015-10-02
Age : 21

View user profile http://wolf3dfanboys.forumotion.com

Back to top Go down

Back to top

- Similar topics

 
Permissions in this forum:
You cannot reply to topics in this forum