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

View previous topic View next topic Go down

(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;
    }
avatar
Officer-M. John (Admin)
Admin

Posts : 328
Join date : 2015-10-02
Age : 19

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

Back to top Go down

View previous topic View next topic Back to top

- Similar topics

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