CON Script Examples v7-27-2004 Release 3 © RTCM Usurper
Introduction |
Contents
The examples on this page are intended primarily for newbie consumption. They are
written with the assumption that you have read at least one con editing guide.
See: RTCM's other Online Con Related Documents
Downloads for this Document:
spikeart.zip and
newrockt.zip
Contents (Some examples are designed for ver. 1.4/1.5 only.)
- About the explosion actor:
The explosion actor is one of the few actors in the game that stays at the same
brightness no matter how dark a sector it is in. Sprites generally conform to the shade of
the floor or (parallaxed) ceiling. The explosion actor (EXPLOSION2), it's ground flame
(EXPLOSION2BOT) and the shrinker's blast (SHRINKEREXPLOSION) share this property.
br> The RPG, Pipebomb, and Tripbomb all use the explosion actor.
The explosion is light generating. It will, for a moment, increase the brightness of
visible sectors.
- Plain English explanation of how to achieve explosion variants:
The explosion uses the same action, EXPLOSION_FRAMES, every time it is spawned. You can
code the explosion to behave differently depending upon what spawned it. We can give the
explosion actor different actions, each using a different set of art tiles. The actor
remains the same, but the appearance would be different.
- Some reasons to have multiple explosion types:
- You want the explosions to be different for the Pipebomb, RPG, and Tripbomb
- You want random types of explosions to break up the monotony
- You want another actor to spawn an explosion to generate light without visible explosion
graphics, or with different graphics than the usual explosion
- You want to spawn an actor that remains at full brightness
- The acutal work involved:
The code associated with the explosion actor reads:
action EXPLOSION_FRAMES 0 20 1 1 4
actor EXPLOSION2 1 EXPLOSION_FRAMES
ifactioncount 20
killit
enda
The first line is merely defines the action.
Leave this line alone. On the first actual line of the actor, which starts with
"actor", delete "EXPLOSION_FRAMES" from the line. There is really no
action now when it is spawned, so the current action becomes "0".
You should add in the new action(s) above the line that begins with actor. Give the action
a name. If your new art has 15 frames and begins on tile number 4000 in editart, your
action would read:
action NEWEXPLOSION 2110 15 1 1 4
NEWEXPLOSION is simply the action name; any word will work as long as it isn't already
used. I believe actions are case-sensitive as well. Using caps for all actions, actors,
and AI routines helps avoid confusion.
2110 is the starting frame in relation to the actor. Since the explosion is defined in the
defs.con file at tile 1890, we can determine that our action, which starts at tile 4000,
is 2110 tiles ahead of the starting tile for the explosion.
15 is the number of frames in the animation.
The next number, 1, is the number of viewable angles the action has. Since this action
will look the same from all sides, it's value is 1.
After that is the number of tiles to increment the animation. Since it will go forward one
frame at a time, this number is 1.
The last number is the speed at which the animation moves. The higher the number, the
slower the animation. I've chosen 4 for this explosion variant.
Your code should now read:
action NEWEXPLOSION 2110 15 1 1 4
action EXPLOSION_FRAMES 0 20 1 1 4
actor EXPLOSION2 1
ifactioncount 20
killit
enda
Let's say that we want the Pipebomb to use the new explosion frames and leave the other
explosions the same as usual. We need to tell the actor when to use each action. Then we
need to tell it what to do when it is using each action. We would write our code like
this:
action NEWEXPLOSION 2110 15 1 1 4
action EXPLOSION_FRAMES 0 20 1 1 4
actor EXPLOSION2 1
ifaction 0
{
ifspawnedby HEAVYHBOMB
{
action NEWEXPLOSION
}
else
{
action EXPLOSION_FRAMES
}
}
ifaction NEWEXPLOSION
{
ifactioncount 15
killit
}
ifaction EXPLOSION_FRAMES
{
ifactioncount 20
killit
}
enda
"HEAVYHBOMB" is the name used for the pipebomb thrown by the player. We've
simply associated the NEWEXPLOSION action with the explosion when it is spawned by the
pipebomb. You must add in the "else" statement in order for the EXPLOSION_FRAMES
action to be used for other explosions.
Additional adjustments can be made as well. We can make one of the explosion types
partially transparent by giving the actor a certain cstat value when it uses a particular
action. For example:
ifaction NEWEXPLOSION
{
cstat 2
ifactioncount 15
killit
}
Because the Recon cars are hard-coded, and therefore cannot be modified
directly in the cons, there is little that can be modified. However, it is easy to
change the enemy that is spawned by them. If we want it to spawn Lizmen instead, we
would add the following lines to the pigcop code right under the line that begins
"actor PIGCOP."
ifspawnedby RECON { cstat 32768 spawn LIZMAN killit }
The cstat value immediately makes the pigcop invisible on the off chance that we are
able to catch a glimpse of him before he spawns the Lizman and dies. If Lizmen
aren't your cup of tea, simply substitute the appropriate actor's name.
This line of code affects the pistol, shotgun, and chaingun. If there is a way to
affect only one of them, I do not know what it is. Each of these weapons fires a variation
of the shotspark actor. The pistol fires it in its purest form, SHOTSPARK1. The shotgun
fires a burst of 7 shotsparks, and the chaingun fires rapid fire shotsparks. While enemies
may fire the pistol, shotgun, or chaingun weapons, they produce only the impact spark,
called WEAP2FRAMES, when their shots hit a wall. The actual bullet hole is probably
deleted immediately by the game, the same way the game deletes the bullet hole when you
shoot a door or elevator or any sector that moves. The shotspark is actually the
"bullet hole" that appears when you shoot a wall, and it spawns a puff of
SMALLSMOKE when shot by the player.
Method 1: To make the player's bullets explode, add the following lines of code
directly under the line that reads "actor SMALLSMOKE 0 SMOKEFRAMES":
{
ifspawnedby SHOTSPARK1
{
ifactioncount 0
{
spawn EXPLOSION2
hitradius **** a b c d
}
ifactioncount 1
{
killit
}
}
}
The line under your last bracket should read "ifmove 0".
After "hitradius", **** is the size of the blast area from the point of impact.
1024 is the largest grid size, I believe. The letters a, b, c, and d represent the
strength of the explosion in each of its four blast regions. "A" is the blast
region farthest from the center of the blast, and "d" is the blast region at the
center of the blast. Logically, the explosion will do more damage to something at the
center of the blast than something on the edge of the blast. Customize this to your
liking. I should note that these exploding bullets will blow up cracked walls the same way
the RPG, Devastator, and Pipebomb will.
Method 2: This method isn't as good as the previous one, but it does allow the
enemies' bullets to explode as well. It makes the shotspark's impact animation,
WEAP2FRAMES, show the same frames as the explosion. Find the line that starts
"action WEAP2FRAMES" and change that line and the rest of the shotspark code to
look like this:
action WEAP2FRAMES -705 20 1 1
4 // 0 4 1 1 6
actor SHOTSPARK1 PISTOL_WEAPON_STRENGTH WEAP2FRAMES
sizeto 64 64
ifdead
killit
ifactioncount 20 // 4
killit
else
{
ifactioncount 3
{
ifinwater
spawn WATERBUBBLE
}
else
ifcount 2 nullop
else
ifonwater
spawn WATERSPLASH2
}
enda
I put the original values after a double slash and space ("// ") in case I
wanted to change them back later. I recommend you do the same whenever you edit lines of
code, as it could save you time later. The drawbacks to this method are:
- The explosion is partially transparent (hard-coded into the game)
- The explosion is affected by the shade and palette of the floor, unlike the explosion
actor that is spawned in method 1. So you could have a dark explosion, when the
explosion should be generating its own light and thus remain at a constant shade (I assume
this is built into the game's exe file).
- You can insert the line "hitradius **** a b c d" into the code, but the
hitradius doesn't die a split second after impact. While the explosion is on its
20th frame, barely visible any longer, you can still stumble into the hitradius area and
get hurt. If the animation for the explosion were only 3 or 4 frames, this might not be
noticeable, but 20 frames go a long way.
Exploding Recon Cars spawn other actors. Because the Recon cars are hard-coded, and
therefore cannot be modified directly in the cons, there is little that can be modified.
However, it is easy to change the enemy that is spawned by them. If we want it to spawn
Lizmen instead, we would add the following lines to the pigcop code right under the line
that begins "actor PIGCOP.":
ifspawnedby RECON { cstat 32768 spawn LIZMAN killit }
The cstat value immediately makes the pigcop invisible on the off chance that we are
able to catch a glimpse of him before he spawns the Lizman and dies. If Lizmen aren't your
cup of tea, simply substitute the appropriat actor's name.
SPIKE SHOOTERS
These are based on the code from the cannon (v1.4/1.5). Theoretically you could
probably adapt these to v1.3d by replacing a minor actor, but I don't have the time or
means to cater to the inferior version of Duke Nukem. The spike shooter should be
put in a hole in the wall because the spike itself hovers when it is spawned instead of
moving immediately.
Here's the art I've used for the spike shooter. If you don't like it, feel free
to make your own. The spawner, since it can't be seen behind a maskwall, is just a
simple icon so you can identify it.
ART-.pcx { spikeart.zip }
Here's the code used for the spikes and spikeshooters (defines are shown as xxxx so you
can put the appropriate art numbers in when you've imported the art, and you'll have to
find your own sound effects):
// HAPPYSPIKE is shot by a Spiker. It is a trap, (similar to the
one in Quake)
// and is based on the
// CANNONBALL code. It's best to put the Spiker in a deep hole in the
// wall and put a 1-way mask wall in front of it
// because the spike hovers a moment before moving forward, which looks
// stupid.
define HAPPYSPIKE xxxx
define HAPPYSPIKESTRENGTH 400
move HAPPYSPIKE1 512 0
move HAPPYSPIKE2 512 10
move HAPPYSPIKE3 512 20
move HAPPYSPIKE4 512 40
move HAPPYSPIKE5 512 80
action SPIKEACTION 0 1 7
useractor notenemy HAPPYSPIKE HAPPYSPIKESTRENGTH
ifaction 0
{
sizeat 32 32
cstat 257 // Force
actor to block
action SPIKEACTION
}
ifactioncount 46
{
ifactioncount 47 nullop
else
move HAPPYSPIKE5 geth getv
}
else
ifactioncount 44
{
ifactioncount 45 nullop
else
move HAPPYSPIKE4 geth getv
}
else
ifactioncount 40
{
ifactioncount 41 nullop
else
move HAPPYSPIKE3 geth getv
}
else
ifactioncount 32
{
ifactioncount 33 nullop
else
move HAPPYSPIKE2 geth getv
}
else
ifactioncount 16
{
ifactioncount 17 nullop
else move HAPPYSPIKE1 geth getv
}
ifnotmoving
{
debris SCRAP1 2
debris SCRAP2 2
hitradius 650 20 30 40 50
killit
}
ifhitweapon
{
ifdead
{
spawn HEXPLODE
hitradius 4096 WEAKEST WEAK MEDIUMSTRENGTH TOUGH
killit
}
else
debris SCRAP1 3
}
enda
define SPIKERSTRENGTH 100000
define SPIKER xxxx
action ASPIKERWAIT 0 1 1 1 1
action ASPIKERSHOOTING 0 1 1 1 1
move SPIKERSTOP
useractor enemy SPIKER SPIKERSTRENGTH // fall
cstat 0
ifaction 0
{
// sizeat 64 64
action ASPIKERWAIT
}
else
ifaction ASPIKERSHOOTING
{
spawn HAPPYSPIKE
action ASPIKERWAIT
}
else
ifaction ASPIKERWAIT
{
ifactioncount 64
{
ifrnd 128
action ASPIKERSHOOTING
else
resetactioncount
}
}
ifhitweapon
{
ifdead
{
hitradius 4096 WEAKEST WEAK MEDIUMSTRENGTH TOUGH
spawn EXPLOSION2
killit
}
else debris SCRAP1 3
}
ifpdistl 1024
ifhitspace
{
ifp pfacing
ifcanshoottarget
spawn HAPPYSPIKE
else break
}
enda
Here's the code and art for the rocket spawners. They're placed the same as the
spike shooters. Again, since the rocket spawner is not visible if placed behind a
maskwall, it is only a basic icon so you can identify it in build.
ART-.pcx { newrockt.zip }
action NEWROCKETEXISTING 0 1 7
define NEWROCKET xxxx
define NEWROCKETSTRENGTH 400
move NEWROCKET1 512 0
move NEWROCKET2 512 10
move NEWROCKET3 512 20
move NEWROCKET4 512 40
move NEWROCKET5 512 80
useractor notenemy NEWROCKET NEWROCKETSTRENGTH
ifaction 0
{
sizeat 32 32
cstat 257 // Force
actor to block
action NEWROCKETEXISTING
}
ifactioncount 46
{
ifactioncount 47 nullop
else
move NEWROCKET5 geth getv
}
else
ifactioncount 44
{
ifactioncount 45 nullop
else
move NEWROCKET4 geth getv
}
else
ifactioncount 40
{
ifactioncount 41 nullop
else
move NEWROCKET3 geth getv
}
else
ifactioncount 32
{
ifactioncount 33 nullop
else
move NEWROCKET2 geth getv
}
else
ifactioncount 16
{
ifactioncount 17 nullop
else move NEWROCKET1 geth getv
}
ifnotmoving
{
spawn EXPLOSION2
sound PIPEBOMB_EXPLODE
hitradius 2500 30 85 100 200
killit
}
ifhitweapon
{
ifdead
{
spawn EXPLOSION2
hitradius 4096 WEAKEST WEAK MEDIUMSTRENGTH TOUGH
killit
}
else
debris SCRAP1 3
}
ifaction NEWROCKETEXISTING
spawn SMALLSMOKE
enda
define NEWROCKETLAUNCHER xxxx
define NEWROCKETLAUNCHERSTRENGTH 15000
action ANEWROCKETLAUNCHERWAIT 0 1 1 1 1
action ANEWROCKETLAUNCHERSHOOTING 0 1 1 1 1
move NEWROCKETLAUNCHERSTOP
useractor enemy NEWROCKETLAUNCHER NEWROCKETLAUNCHERSTRENGTH // fall
cstat 0
ifaction 0
{
// sizeat 64 64
action ANEWROCKETLAUNCHERWAIT
}
else
ifaction ANEWROCKETLAUNCHERSHOOTING
{
spawn NEWROCKET
action ANEWROCKETLAUNCHERWAIT
}
else
ifaction ANEWROCKETLAUNCHERWAIT
{
ifactioncount 64
{
ifrnd 128
action ANEWROCKETLAUNCHERSHOOTING
else
resetactioncount
}
}
ifhitweapon
{
ifdead
{
addkills 1
hitradius 4096 WEAKEST WEAK MEDIUMSTRENGTH TOUGH
spawn EXPLOSION2
killit
}
else debris SCRAP1 3
}
ifpdistl 1024
ifhitspace
{
ifp pfacing
ifcanshoottarget
spawn NEWROCKET
else break
}
enda
Lets address a few of the simple user.con game tweaks. Read On.
-Sample: Making camers destructable via the USER.CON
- Open the USER.CON with Notepad or any other plain text editiors.
- Scroll down to MISC Game Settings and take a look at this line[L37]: define CAMERASDESTRUCTABLE NO // YES
- This line simply tells the game to either allow the cameras to be destroyed (YES) or not
destructible (NO)
- The // portion of the line tells the game to ignore anything after it. Thus the YES is
ignored and it is present just for a reminder.
- Change the NO to a YES and //YES to //YES or NO.
- Now save the con file and replace the one that is there.
- Load and Run the game normally and locate a security camera, sometimes they scan and
rotate an area other times they are fixed in one direction.
- Now shoot the camera until its destroyed. Now the cameras in the game can be 'switched
off' with a shotgun blast. This of course makes the view screen of this camera useless.
Easy... Lets do some more.
-Sample: Making the Freeze 'ball' bounce more than three times via the USER.CON
- Open the USER.CON with Notepad or any other plain text editiors.
- Scroll down to MISC Game Settings and take a look at this line[L74]: define
NUMFREEZEBOUNCES 3 // 0 - 255
- This line will indacte to the game how many times the freeze 'ball' should bounce. 3
times is the default.
- The values follow // indicate that the ball can be a single shot and hit, or bounce from
1 to 255 times max.
- Change the value to 8 for eight bounces including the first hit.
- Now save the con file and replace the one that is there.
- Load and Run the game normally and shoot the Freeze Gun and watch the ball bounce
around.
-The ball bounces off a wall texture at ?45? degree angle.
If you want to try more samples try the following:
-Sample: More Health for the player via the USER.CON
- Open the USER.CON with Notepad or any other plain text editiors.
- Scroll down to MISC Game Settings and take a look at this line[L40]: define
MAXPLAYERHEALTH 100
- This line controls how much health the player will start at. It also indicates the
maxium in game health level (using only first aids)
- Change the value to 400.
- Now save the con file and replace the one that is there.
- Load and Run the game normally and look at your health readout. It will indicate 400.
Zoom is really easy and simple to do, but pulling off a really good effect is harder.
Here is the cheesy, rough effect with a twist...
/*
Zoom CON
By James Hollidge (Cyborg) 2000 (c)
*/
state zoom
ifpinventory GET_HEATS 0 { } else { addinventory GET_HEATS 1200 }
ifpinventory GET_HEATS 1199 { } else { addinventory GET_HEATS 1200 addinventory
GET_HOLODUKE 1 break } // if the Nightvision is used zoom
ifpinventory GET_HOLODUKE 1 { } else { sizeat 4095 4095 addinventory GET_HOLODUKE 0 break
}
ifpinventory GET_HOLODUKE 0 { } else { sizeat 42 36 break } // If the nigtvision is not
used stop zooming
ends
All you need do now is find the start of the player code (actor APLAYER) and insert a
'state zoom' after that line. You can see the zoom in effect just by using the
nightgoggles. The player, you might notice, becomes huge when the zoom is used: this is
how the effect is achieved. Fixing the graphics basically involves spawning a new actor to
display the correct graphics for the player and making the player invisible.
Try it, love it: zoom is cool.
Hello, Im BlitZ and Im explaining the way to make an extra melee weapon in 1.5 Duke.
First off it replaces the freezer and goes a bit fast.
What it does is:
- Shoots a projectile (preferably the SHOTSPARK1 but can be anything) into the ground in
front of Duke.
- If a wall or sprite is in front of Duke it will make the effect of something hitting it.
- If its not hitting it then you arent close enough.
Now for the code!
- Go into your user.con find the line that says something like NUMFREEZEBOUNCES 3 \\0-255.
Turn the 3 into a 0.
- Next go into the game.con and find the transporterstar actor. under actor
TRANSPORTERSTAR 0 TRANSFOWARD add this code:
ifspawnedby
FREEZEBLAST { shoot SHOTSPARK1 killit }
Now it should look like this:
action TRANSFOWARD 0 6 1 1 2
action TRANSBACK 5 6 1 -1 2
actor TRANSPORTERSTAR 0 TRANSFOWARD
ifspawnedby FREEZEBLAST { shoot SHOTSPARK1 killit }
ifaction TRANSFOWARD { ifactioncount 6 action TRANSBACK }
else ifactioncount 6 killit
enda
VIOLA!You did it, if you encountered a problem remove all of what you did previously
and restart. If for any reason you really can't get it working email me : See my
RTCM Contact page.
|