Hello
soldier! I see you would
like to get a new, shiny
and pickable weapon...
Well, read on! The
tools you will need is:
-
of course the code
- FloEdit
- MapEdit (to add the
weapon to maps)
- Compiler :)
1.
Open up WL_AGENT.C file,
and do a search for
'struct atkinf' (without
quotes, of course). You
should find a piece of
code looking like this
one:
struct
atkinf
{
char tics,attack,frame;
// attack is 1 for gun,
2 for knife
}
attackinfo[4][14]
=
{
{
{6,0,1},{6,2,2},{6,0,3},{6,-1,4}
},
{
{8,0,1},{8,1,2},{8,0,3},{8,-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}
},
};
You
are wondering what is
this? Well, it's the
weapon behaviour code.
You may see that we
are
starting "from the end",
and I'm not sure this is
the best way... Anyway,
1st line of the
numbers
is for knife, 2 for
pistol, 3 for machinegun
and 4 for chaingun.
Below, add the new line
copied from the ones
above - it's depending
on what type of weapon
would you like to have.
In this tutorial, I
wanted to have something
with
machinegun-behaviour.
Also, don't forget to
add +1 in the bracket
after "attackinfo". So,
the code now looks like
this:
struct
atkinf
{
char 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}
},
{
{8,0,1},{8,1,2},{8,0,3},{8,-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}
},
};
Now
do a search for
CheckWeaponChange.
Modify the entire little
function to this (copy
&
paste).
void
CheckWeaponChange
(void)
{
int i,buttons;
if (!gamestate.ammo) //
must use knife with no
ammo
return;
switch (LastScan)
{
case 2:
LastScan=0;
gamestate.weapon =
gamestate.chosenweapon =
wp_knife;
break;
case 3:
LastScan=0;
gamestate.weapon =
gamestate.chosenweapon =
wp_pistol;
break;
case 4:
LastScan=0;
if (gamestate.bestweapon
>= wp_machinegun)
{
gamestate.weapon =
gamestate.chosenweapon =
wp_machinegun;
}
break;
case 5:
LastScan=0;
if (gamestate.bestweapon
>= wp_chaingun)
gamestate.weapon =
gamestate.chosenweapon =
wp_chaingun;
}
break;
case 6:
LastScan=0;
if (gamestate.bestweapon
>=wp_saw)
gamestate.weapon =
gamestate.chosenweapon =
wp_saw;
}
break;
}
DrawWeapon();
}
Here
I used the modified
version of code from
"Weapon Change
Sound".
Good. Now you may close
the WL_AGENT.C file.
Open up the WL_DEF.H,
and scroll down until
you see a bunch of funny
names like CHAINATK1,
CHAINATK2 and so on.
It's the sprite
definition
for the weapons:
SPR_CHAINREADY,SPR_CHAINATK1,SPR_CHAINATK2,SPR_CHAINATK3,
SPR_CHAINATK4,
The
same are for machinegun
and pistol before that.
Below the CHAINATK
things, add your own
ones. Let's say your new
weapon will be called
SAW. So the code will
now look like
this:
SPR_CHAINREADY,SPR_CHAINATK1,SPR_CHAINATK2,SPR_CHAINATK3,
SPR_CHAINATK4,
SPR_SAWREADY,SPR_SAWATK1,SPR_SAWATK2,SPR_SAWATK3,
SPR_SAWATK4,
So
now we have the weapon
defined. We are still in
WL_DEF.H, so let's make
a use of it! Search
for bo_spear until you
will find a bunch of bo_
names in the row. Below
bo_spear
add:
bo_saw
Yes
that was really hard,
wasn't it? Okay, now
let's modify the
existing object so we
can pickup
our new weapon. Of
course you may also add
new sprites with FloEdit
and then add the bo_
definition to it. Open
the WL_ACT1.C, and
search for SPR_STAT
names. Pick one
not-needed sprite, and
after the SPR_STAT add
"," and write
bo_saw.
Now, when the player
crosses that item, he
will pick up the
SAW.
Do
a search for NUMWEAPONS
5. You will get
this:
define
NUMWEAPONS 5
typedef enum {
wp_knife,
wp_pistol,
wp_machinegun,
wp_chaingun
}
weapontype;
Add
+1 to NUMWEAPONS, and
below wp_chaingun add
wp_saw, so the code will
look like this:
define NUMWEAPONS 6
typedef enum {
wp_knife,
wp_pistol,
wp_machinegun,
wp_chaingun,
wp_saw
}
weapontype;
Scroll
down a bit so you will
see case bo_spear:.
After that, add case
bo_saw:.
This is not the end of
our adventure yet :).
Open up WL_AGENT.C again
:). Search for
bo_spear. You will
get:
case
bo_spear:
spearflag = true;
spearx =
player->x;
speary =
player->y;
spearangle =
player->angle;
playstate =
ex_completed;
After
that,
add:
case
bo_saw:
SD_PlaySound
(GETMACHINESND);
GiveWeapon (wp_saw);
break;
So
now the weapon is really
pickable. But don't
check yet. Now it's the
end! Open up WL_DRAW.C.
After scrolling down you
will see sth like
this:
int
weaponscale[NUMWEAPONS]
={SPR_KNIFEREADY,SPR_PISTOLREADY,
SPR_MACHINEGUNREADY,SPR_CHAINREADY};
after
SPR_CHAINREADY add
SPR_SAWREADY so the code
will look like
this:
int
weaponscale[NUMWEAPONS]
={SPR_KNIFEREADY,SPR_PISTOLREADY,
SPR_MACHINEGUNREADY,SPR_CHAINREADY,SPR_SAWREADY};
And
now let's do some
cosmetic work. Open up
WL_AGENT.C and do a
search for
"GunAttack".
There you should see the
bunch of Sd_Playsounds.
Copy one of those defs
and modify for SAW.
It's easy, so I won't
write it
here.
Okay,
now everything you have
to do is to add the
proper sprites in
FloEdit. Because we
wrote SPR_SAWREADY after
SPR_CHAINREADY, you
should add new sprites
directly after end of
Chaingun animations. If
you do, everything
should be
OK.
This
tutorial was really
messy, don't you think?
Drop me an e-mail if it
works/ doesn't for
you.
muad.dib1@wp.pl.
Get
back to the Dome
tutorials
Jump
to the
top
|