swwmgz_m/zscript/player/swwm_player_face.zsc

164 lines
3.6 KiB
Text

// facial animation and cosmetics
extend Class Demolitionist
{
private int GetRandom()
{
return (rss = (rss<<1)*35447+(rss/87));
}
private void UpdateTags()
{
static const String colname[] =
{
"",
"Blue",
"Cyan",
"Dragonfly",
"Gold",
"Magenta",
"Orange",
"Peach",
"Pink",
"Purple",
"Red",
"Violet",
"White",
"Yellow",
"Black",
"Rust"
};
int idx = CVar.GetCVar('swwm_tagcolor',player).GetInt();
if ( (idx < 0) || (idx >= colname.Size()) ) idx = 0;
if ( idx != oldtagcolor )
A_ChangeModel("",0,"","",0,"models","DemoTags"..colname[idx]..".png",CMDL_USESURFACESKIN,-1);
oldtagcolor = idx;
for ( Inventory i=inv; i; i=i.inv )
{
if ( !(i is 'SWWMWeapon') ) continue;
SWWMWeapon(i).UpdateTags(idx,colname[idx]);
}
}
private void UpdateFace()
{
// damage handling
if ( facedamage )
{
bool setpaindir = false;
if ( lastdamage > 70 )
{
facestate = FS_OUCH;
facetimer = (lastdamagetimer-gametic)+10;
setpaindir = true;
paindir = 0;
}
else if ( facestate < FS_OUCH )
{
facestate = FS_PAIN;
facetimer = (lastdamagetimer-gametic)+10;
setpaindir = true;
paindir = 0;
}
// paraphrased from vanilla, with some tweaks
if ( setpaindir && player.attacker && (player.attacker != self) )
{
double atkang = AngleTo(player.attacker);
double angdiff = deltaangle(angle,atkang);
if ( abs(angdiff) < 135 )
{
if ( angdiff > 45 ) paindir = -1;
else if ( angdiff < -45 ) paindir = 1;
}
}
}
facedamage = false;
if ( facegrin && (facestate < FS_SAD) )
{
facestate = FS_GRIN;
facetimer = 50;
}
facegrin = false;
if ( facewink && (facestate < FS_SAD) )
{
facestate = FS_WINK;
facetimer = 20;
}
facewink = false;
if ( faceblink && (facestate < FS_PAIN) )
{
facestate = FS_BLINK;
facetimer = 30;
}
faceblink = false;
if ( facesad && (facestate <= FS_SAD) )
{
facestate = FS_SAD;
facetimer = 50;
}
facesad = false;
if ( FindInventory('RagekitPower') && (facestate < FS_PAIN) )
{
facestate = FS_EVIL;
facetimer = 10;
}
if ( facetimer > 0 )
{
facetimer--;
if ( facetimer <= 0 )
{
facestate = FS_DEFAULT;
blinktime = 30;
}
}
if ( !(gametic&1) )
{
if ( blinktime <= 0 )
{
blinktime--;
if ( blinktime < -3 )
{
rss = MSTime();
blinktime = (abs(GetRandom())%10)?(40+abs(GetRandom())%40):6;
}
}
else blinktime--;
}
// update our face texture if different
static const String facetex[] =
{
"Blank", "Blink", "Booty", "Dead",
"Default", "Dizzy", "Evil", "Grin",
"Hurt", "HurtLeft", "HurtRight",
"Off", "Ouch", "OuchLeft", "OuchRight",
"Sad", "Smug", "Unamused", "Wink"
};
int faceidx = GetFaceTex();
if ( !oldfaceidx || (faceidx != oldfaceidx) )
A_ChangeModel("",0,"","",1,"models","DemoFace_"..facetex[faceidx]..".png",CMDL_USESURFACESKIN,-1);
oldfaceidx = faceidx;
}
private int GetFaceTex()
{
if ( player.Health <= 0 ) return 3;
if ( (bInvulnerable || (player.cheats&(CF_GODMODE|CF_GODMODE2)) || FindInventory('InvinciballPower')) && (facestate >= FS_PAIN) ) return 16;
if ( facestate == FS_OUCH ) return (paindir==1)?14:(paindir==-1)?13:12;
if ( facestate == FS_PAIN ) return (paindir==1)?10:(paindir==-1)?9:8;
if ( facestate == FS_GRIN ) return 7;
if ( facestate == FS_EVIL ) return 6;
if ( facestate == FS_SAD ) return 15;
if ( facestate == FS_WINK ) return 18;
if ( facestate == FS_BLINK ) return ((facetimer>28)||(facetimer<2))?17:1;
switch ( blinktime )
{
case -1:
case -3:
return 15;
break;
case -2:
return 1;
break;
}
return (player.Health<=25)?15:4;
}
}