Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
/*
Better Falling Snow by Joe Wilcox
(c) 1997, Simply Silly Software
You need to add 3 sprites to your ART tiles and reference them below.
I've included our default sprites.. feel free to use them.
The 2 Snow Makers use their palettes to determine how often to spawn
snow. It goes as follows:
Pal 0 : Lite Snow Storm
Pal 1 : Medium Snow Storm
Pal 2 : Very Lite Snow Storm
Pal 3 : Flurries
Pal 4 : Blizzard
The snowflake can be added by itself to give the appearance of it
already snowing. SNOWMAKER will roam around the screen dropping a
flake every now and this. This looks really good. SNOWMAKERNOMOVE
stands in once place. You want to use this for holes in ceilings and
other small areas.
There are some limitations:
These sprites move and will go through openings if it's open at the
level they are at. It should however be easy to change them to
ACTOR STAYPUTs so they stay in their sectors. That just didn't work
for me since I had alot of sectors that were small.
It seems you can't start a MAKER close to other sprites. If you do, the
snow will get confused and stay on the ceiling. It's really weird.
Oh.. I wouldn't put more than 15 or so in an area.. you will kill
yourself.
--------------------------------------------------------------------------------
Duke: Nuclear Winter
By Joris Weimar
© 1997 Simply Silly Software
--------------------------------------------------------------------------------
Duke: Nuclear Winter Plus
By Hendricks266
--------------------------------------------------------------------------------
*/
// The Snowmaker is the actor that tosses out new snowflakes.
action SNOWMAKE
move SNOWMAKERMOVE 100 0 // Use this to adjust the speed at which the
// SNOWMAKER's move
ai AISNOWMAKERROAM SNOWMAKE SNOWMAKERMOVE getv geth randomangle
useractor notenemy SNOWMAKER 0 0 randomangle
cstat 32768
// I start by spawning a snowflake.
ifai 0
{
spawn SNOWFLAKE
ai AISNOWMAKERROAM
break
}
// Anytime the maker stops.. bounce it again
ifnotmoving
{
ai AISNOWMAKERROAM
}
// the IFCOUNT sets the frequency that it drops snow
ifspritepal 0
{
ifcount 48
{
ifcansee
spawn SNOWFLAKE
ai AISNOWMAKERROAM
resetcount
}
}
ifspritepal 1
{
ifcount 32
{
ifcansee
spawn SNOWFLAKE
ai AISNOWMAKERROAM
resetcount
}
}
ifspritepal 2
{
ifcount 64
{
ifcansee
spawn SNOWFLAKE
ai AISNOWMAKERROAM
resetcount
}
}
ifspritepal 3
{
ifcount 96
{
ifcansee
spawn SNOWFLAKE
ai AISNOWMAKERROAM
resetcount
}
}
ifspritepal 4
{
ifcount 16
{
ifcansee
spawn SNOWFLAKE
ai AISNOWMAKERROAM
resetcount
}
}
enda
// The SnowMakerNoMove is the actor that tosses out snowflakes from a
// single position.
useractor notenemy SNOWMAKERNOMOVE 0 0 randomangle
cstat 32768
ifspritepal 0
{
ifcount 32
{
spawn SNOWFLAKE
resetcount
}
}
ifspritepal 1
{
ifcount 48
{
ifcansee
spawn SNOWFLAKE
resetcount
}
}
ifspritepal 2
{
ifcount 64
{
ifcansee
spawn SNOWFLAKE
resetcount
}
}
ifspritepal 3
{
ifcount 96
{
ifcansee
spawn SNOWFLAKE
resetcount
}
}
ifspritepal 4
{
ifcount 16
{
ifcansee
spawn SNOWFLAKE
resetcount
}
}
enda
action ASNOW
move SNOWMOVE -25 40 // You can tweak the motion here
useractor notenemy SNOWFLAKE 0 ASNOW SNOWMOVE getv geth randomangle
sizeat 25 25
cstat 0
ifcount 4
{
move SNOWMOVE getv geth randomangle
resetcount
break
}
// Unlike the original code from Mystique, these flakes die when they
// hit the ground.. Works much better.
iffloordistl 5 killit
// Unlike the original snow from Joe Wilcox, these flakes have significant
// improvements in both code and looks.
// I (Hendricks266) have changed the incredibly ugly snow tile to a more
// detailed one with a smaller in-game size.
setactor[THISACTOR].mdflags 16
ifnotmoving killit
enda
// Hendricks266's much better Snow
/*
ActorExtra[i].floorz = s->z = getflorzofslope(s->sectnum,s->x,s->y);
s->xvel = (krand()&7)+(sintable[T1&2047]>>9);
T1 += (krand()&63);
if ((T1&2047) > 512 && (T1&2047) < 1596)
{
if (sector[sect].lotag == 2)
{
if (s->zvel < 64)
s->zvel += (g_spriteGravity>>5)+(krand()&7);
}
else if (s->zvel < 144)
s->zvel += (g_spriteGravity>>5)+(krand()&7);
}
A_SetSprite(i,CLIPMASK0);
if ((krand()&3) == 0)
setsprite(i,(vec3_t *)s);
if (s->sectnum == -1) KILLIT(i);
l = getflorzofslope(s->sectnum,s->x,s->y);
if (s->z > l)
{
s->z = l;
A_AddToDeleteQueue(i);
PN ++;
j = headspritestat[STAT_MISC];
while (j >= 0)
{
if (sprite[j].picnum == BLOODPOOL)
if (ldist(s,&sprite[j]) < 348)
{
s->pal = 2;
break;
}
j = nextspritestat[j];
}
}
if (sp->picnum == MONEY || sp->picnum == MAIL || sp->picnum == PAPER)
{
ActorExtra[i].temp_data[0] = krand()&2047;
sp->cstat = krand()&12;
sp->xrepeat = sp->yrepeat = 8;
sp->ang = krand()&2047;
}
changespritestat(i,5);
*/
useractor notenemy SNOW 0
sizeat 4 4
addvar temp2 16
ifvarg temp2 2047 subvar temp2 4095
setvarvar temp3 temp2
sin temp3 temp3
shiftvarr temp3 5
/*
getactor[THISACTOR].x x
getactor[THISACTOR].y y
getactor[THISACTOR].z z
updatesectorz x y z temp
getactor[THISACTOR].zvel z
ifvare sector[temp].lotag 2
{
ifvarl z 64
{
setvar tempb GRAVITATIONALCONSTANT
shiftvarr tempb 5
addvarvar tempb temp4
addvarvar z tempb
}
}
else
{
ifvarl z 144
{
setvar tempb GRAVITATIONALCONSTANT
shiftvarr tempb 5
addvarvar tempb temp4
addvarvar z tempb
}
}
*/
movesprite THISACTOR temp3 0 256 CLIPMASK0 RETURN
ifvarn RETURN 0 killit
getactor[THISACTOR].x x
getactor[THISACTOR].y y
getactor[THISACTOR].z z
updatesectorz x y z temp
ifvarn temp -1 getflorzofslope temp x y temp2 else killit
ifvarvare z temp2 killit
enda