From 92a6e8302eb673893ad8267612ac3c7b23cbcd72 Mon Sep 17 00:00:00 2001 From: Marisa the Magician Date: Tue, 3 Jun 2025 10:45:42 +0200 Subject: [PATCH] Ouch left/right face expressions added. --- gldefs/demolitionist.txt | 22 ++++++++++++++++ language.version | 4 +-- models/DemoFace.xcf | Bin 13109 -> 0 bytes models/DemoFace_OuchLeft.png | Bin 0 -> 739 bytes models/DemoFace_OuchRight.png | Bin 0 -> 739 bytes zscript/hud/swwm_hud.zsc | 20 ++++++++------- zscript/hud/swwm_hud_status.zsc | 18 ++++++------- zscript/player/swwm_player_face.zsc | 38 +++++++++++++++------------- 8 files changed, 65 insertions(+), 37 deletions(-) delete mode 100644 models/DemoFace.xcf create mode 100644 models/DemoFace_OuchLeft.png create mode 100644 models/DemoFace_OuchRight.png diff --git a/gldefs/demolitionist.txt b/gldefs/demolitionist.txt index 8f6f06b23..9bab1d83c 100644 --- a/gldefs/demolitionist.txt +++ b/gldefs/demolitionist.txt @@ -142,6 +142,28 @@ Material Texture "models/DemoFace_Ouch.png" Uniform vec3 "RimFact" = ".6" "1." "1." Uniform vec3 "RimStep" = "0." ".5" ".5" } +Material Texture "models/DemoFace_OuchLeft.png" +{ + Brightmap "models/DemoFace_bright.png" + Shader "shaders/glsl/Envmask.fp" + Texture "masktex" "models/DemoFace_mask.png" + Texture "envtex" "models/envmap/glss4env.png" + Texture "rimtex" "models/envmap/glss4rim.png" + Uniform vec3 "EnvFact" = ".4" "1." "1." + Uniform vec3 "RimFact" = ".6" "1." "1." + Uniform vec3 "RimStep" = "0." ".5" ".5" +} +Material Texture "models/DemoFace_OuchRight.png" +{ + Brightmap "models/DemoFace_bright.png" + Shader "shaders/glsl/Envmask.fp" + Texture "masktex" "models/DemoFace_mask.png" + Texture "envtex" "models/envmap/glss4env.png" + Texture "rimtex" "models/envmap/glss4rim.png" + Uniform vec3 "EnvFact" = ".4" "1." "1." + Uniform vec3 "RimFact" = ".6" "1." "1." + Uniform vec3 "RimStep" = "0." ".5" ".5" +} Material Texture "models/DemoFace_Sad.png" { Brightmap "models/DemoFace_bright.png" diff --git a/language.version b/language.version index ba6552e9c..006c327c9 100644 --- a/language.version +++ b/language.version @@ -1,3 +1,3 @@ [default] -SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r1220 \cu(mar 03 jun 2025 10:31:07 CEST)\c-"; -SWWM_SHORTVER="\cw1.3pre r1220 \cu(2025-06-03 10:31:07)\c-"; +SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r1221 \cu(mar 03 jun 2025 10:45:42 CEST)\c-"; +SWWM_SHORTVER="\cw1.3pre r1221 \cu(2025-06-03 10:45:42)\c-"; diff --git a/models/DemoFace.xcf b/models/DemoFace.xcf deleted file mode 100644 index 1da0dced1d53187d8c87a5d7227bbab6046679ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13109 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 KV&ML-$p8Qym{|7! diff --git a/models/DemoFace_OuchLeft.png b/models/DemoFace_OuchLeft.png new file mode 100644 index 0000000000000000000000000000000000000000..320f0b21416aaab21194fd9480cc3611a8b908d2 GIT binary patch literal 739 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4rT@h2A3sW#~2tG4g~mwxH5o2_Rja&J3nRY z_>j5%UCQRyi5s5BtbP);{9*9oyM7C9hc0{IGwZtRq)V=S7cHw#m{%OP>pJH)^s;y9rmWFRTVj;I)~fo5cFbIZ z+@&7Vt||HVs)o$cidmu&HbvQ^)uecXj6)u~h%ujLv}Nr+S^F+As~U}%&2p|2)gw2_ z+O)`fO;q)psTQ$L$#;=T&?=RHWl|=^B4(vVIa~I>(Ntn!U|=i>@(X5gcy=R=fr0U& zr;B4q#Vyu@zS(n9CD<+$-#u?VdFB?+Fg-0n7pB&v@K@XF<5xX!GuLBXsModB(^u_t z-JN-$kO2jTg8~CXgWH7dJ71R6%zT!3S66@bm)igLd<=q-~-#f2_ zPCT??wYr$$M?R-U?BGCEOp z?y~D_TX%a$e)G+pbm8TNmn?gurxf-&T#)MR+$VFYLStIv)S!%|X~zy5{Q3QO`QgdD zOOA(Kn6>)w?E6+vR;N}n7=CeUetr1I1-44l-_J68q%?!38ZLYJ;caI9=ZTH}`SZ_l z2X+R9u3Gl9;%mC_iQMnb>#KBL8tlrdFZ{jF@WA2O)2{~e2QF*2TDN}veRGx*{Ez29 zy)&zFf9#dJ^^d2sF@Jct`*G&JDEDQBKYu+w`tV0FGvf*W@0G89Z?oUFetW#M0K?C^ q*T;8#xpDl8Jg)!)Qv(|)Mjq4$O@G!edvg&Vi0A3*=d#Wzp$P!tJ5#&> literal 0 HcmV?d00001 diff --git a/models/DemoFace_OuchRight.png b/models/DemoFace_OuchRight.png new file mode 100644 index 0000000000000000000000000000000000000000..87002fc5b7217093abdfa7d4bbf82e075ee82622 GIT binary patch literal 739 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4rT@h2A3sW#~2tG4g~mwxH5o2_Rja&J3nRY z_>j5%UCQRyi5s5BtbP);{9*9oyM7C9hc0{IGwZtRq)V=S7cHw#m{%OP>pJH)^s;y9rmWFRTVj;I)~fo5cFbIZ z+@&7Vt||HVs)o$cidmu&HbvQ^)uecXj6)u~h%ujLv}Nr+S^F+As~U}%&2p|2)gw2_ z+O)`fO;q)psTQ$L$#;=T&?=RHWl|=^B4(vVIa~I>(Ntn!U|=i>@(X5gcy=R=fr0U& zr;B4q#Vyu@zS(n9CD<+$-#u?VdFB?+Fg-0n7pB&v@K@XF<5xX!GuLBXsModB(^u_t z-JN-$kO2jTg8~CXgWH7dJ71R6%zT!3S66@bm)igLd<=q-~-#f2_ zNp^B4D=*4}OXI`P!q9^Ttt zR=$&Yx9;|i{N}4_Rbo|=+I&y<)DAa=jNW4|@qDQ^BBu{{X>JKJew--r@9)RU4^OgP zO4iOed-dVjeA!P|H`z2uR4qREHL)h6dC#oc&n9lYA}dcxTrTks{U5!X8Gn4Z`_UwRt@7m^HGe-oD)_Urk>Sbm-!@-sZ_D4letSJHM?=m2 pugS4hZ<1g2vvDvmI)EePgMHbx=lxGVmwJNY$J5o%Wt~$(695fpSIhta literal 0 HcmV?d00001 diff --git a/zscript/hud/swwm_hud.zsc b/zscript/hud/swwm_hud.zsc index 1d48af35c..79f7468f5 100644 --- a/zscript/hud/swwm_hud.zsc +++ b/zscript/hud/swwm_hud.zsc @@ -88,7 +88,7 @@ Class SWWMStatusBar : BaseStatusBar { TextureID StatusTex, WeaponTex, ScoreTex, InventoryTex, ChatTex[6], HealthTex[9], FuelTex[2], DashTex, EnemyBTex, EnemyHTex[7], - GenericAmmoTex[3], AmmoTex[3], MiniBox[2], bgtex, FaceTex[19]; + GenericAmmoTex[3], AmmoTex[3], MiniBox[2], bgtex, FaceTex[21]; Font mSmallFont, mSmallFontOutline, mSmallFontOutlineAlt, mTinyFont, mTinyFontOutline, mTinyFontOutlineAlt, MiniHUDFont, MiniHUDFontOutline; int mhudfontcol[NUM_MINIHUD_COLOR]; @@ -311,14 +311,16 @@ Class SWWMStatusBar : BaseStatusBar FaceTex[8] = TexMan.CheckForTexture("graphics/HUD/DemoFace_HurtLeft.png"); FaceTex[9] = TexMan.CheckForTexture("graphics/HUD/DemoFace_HurtRight.png"); FaceTex[10] = TexMan.CheckForTexture("graphics/HUD/DemoFace_Ouch.png"); - FaceTex[11] = TexMan.CheckForTexture("graphics/HUD/DemoFace_Dead.png"); - FaceTex[12] = TexMan.CheckForTexture("graphics/HUD/DemoFace_Smug.png"); - FaceTex[13] = TexMan.CheckForTexture("graphics/HUD/DemoFace_Angery.png"); - FaceTex[14] = TexMan.CheckForTexture("graphics/HUD/DemoFace_Barrier.png"); - FaceTex[15] = TexMan.CheckForTexture("graphics/HUD/DemoFace_Rage.png"); - FaceTex[16] = TexMan.CheckForTexture("graphics/HUD/DemoFace_Angerage.png"); - FaceTex[17] = TexMan.CheckForTexture("graphics/HUD/DemoFace_Sad.png"); - FaceTex[18] = TexMan.CheckForTexture("graphics/HUD/DemoFace_Wink.png"); + FaceTex[11] = TexMan.CheckForTexture("graphics/HUD/DemoFace_OuchLeft.png"); + FaceTex[12] = TexMan.CheckForTexture("graphics/HUD/DemoFace_OuchRight.png"); + FaceTex[13] = TexMan.CheckForTexture("graphics/HUD/DemoFace_Dead.png"); + FaceTex[14] = TexMan.CheckForTexture("graphics/HUD/DemoFace_Smug.png"); + FaceTex[15] = TexMan.CheckForTexture("graphics/HUD/DemoFace_Angery.png"); + FaceTex[16] = TexMan.CheckForTexture("graphics/HUD/DemoFace_Barrier.png"); + FaceTex[17] = TexMan.CheckForTexture("graphics/HUD/DemoFace_Rage.png"); + FaceTex[18] = TexMan.CheckForTexture("graphics/HUD/DemoFace_Angerage.png"); + FaceTex[19] = TexMan.CheckForTexture("graphics/HUD/DemoFace_Sad.png"); + FaceTex[20] = TexMan.CheckForTexture("graphics/HUD/DemoFace_Wink.png"); // other expressions will be added when needed mSmallFont = Font.GetFont('TewiFont'); mSmallFontOutline = Font.GetFont('TewiFontOutline'); diff --git a/zscript/hud/swwm_hud_status.zsc b/zscript/hud/swwm_hud_status.zsc index cadd45b33..0d5f9229d 100644 --- a/zscript/hud/swwm_hud_status.zsc +++ b/zscript/hud/swwm_hud_status.zsc @@ -81,14 +81,14 @@ extend Class SWWMStatusBar let paindir = demo.paindir; let facetimer = demo.facetimer; let blinktime = demo.blinktime; - if ( CPlayer.Health <= 0 ) return 11; - if ( (isInvulnerable() || demo.FindInventory('InvinciballPower')) && (facestate >= FS_PAIN) ) return 12; - if ( facestate == FS_OUCH ) return 10; + if ( CPlayer.Health <= 0 ) return 13; + if ( (isInvulnerable() || demo.FindInventory('InvinciballPower')) && (facestate >= FS_PAIN) ) return 14; + if ( facestate == FS_OUCH ) return (paindir==1)?11:(paindir==-1)?12:10; if ( facestate == FS_PAIN ) return (paindir==1)?8:(paindir==-1)?9:7; if ( facestate == FS_GRIN ) return 5; if ( facestate == FS_EVIL ) return 6; - if ( facestate == FS_SAD ) return 17; - if ( facestate == FS_WINK ) return 18; + if ( facestate == FS_SAD ) return 19; + if ( facestate == FS_WINK ) return 20; if ( facestate == FS_BLINK ) return ((facetimer>28)||(facetimer<2))?3:4; switch ( blinktime ) { @@ -100,7 +100,7 @@ extend Class SWWMStatusBar return 4; break; } - return (CPlayer.Health<=25)?17:2; + return (CPlayer.Health<=25)?19:2; } private void DrawMugshot() @@ -118,9 +118,9 @@ extend Class SWWMStatusBar Screen.DrawTexture(FaceTex[0],false,xmargin+shake.x,ss.y-(ymargin+32)+shake.y,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_SrcWidth,32,DTA_SrcHeight,32,DTA_DestWidth,32,DTA_DestHeight,32,DTA_SrcX,32*(facecol%4),DTA_SrcY,32*(facecol/4)); bool raging = CPlayer.mo.FindInventory('RagekitPower'); bool angy = CPlayer.mo.FindInventory('AngeryPower'); - if ( raging && angy ) Screen.DrawTexture(FaceTex[16],false,xmargin+shake.x,ss.y-(ymargin+32)+shake.y,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true); - else if ( raging ) Screen.DrawTexture(FaceTex[15],false,xmargin+shake.x,ss.y-(ymargin+32)+shake.y,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true); - else if ( angy ) Screen.DrawTexture(FaceTex[13],false,xmargin+shake.x,ss.y-(ymargin+32)+shake.y,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true); + if ( raging && angy ) Screen.DrawTexture(FaceTex[18],false,xmargin+shake.x,ss.y-(ymargin+32)+shake.y,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true); + else if ( raging ) Screen.DrawTexture(FaceTex[17],false,xmargin+shake.x,ss.y-(ymargin+32)+shake.y,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true); + else if ( angy ) Screen.DrawTexture(FaceTex[15],false,xmargin+shake.x,ss.y-(ymargin+32)+shake.y,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true); Screen.DrawTexture(FaceTex[1],false,xmargin+shake.x,ss.y-(ymargin+32)+shake.y,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_Color,Color(255,255,0,0),DTA_Alpha,min(1.,noiz)); if ( (CPlayer.Health > 0) && (isInvulnerable() || CPlayer.mo.FindInventory('InvinciballPower')) ) Screen.DrawTexture(FaceTex[1],false,xmargin+shake.x,ss.y-(ymargin+32)+shake.y,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_Alpha,.8+.1*sin(gametic+fractic)); diff --git a/zscript/player/swwm_player_face.zsc b/zscript/player/swwm_player_face.zsc index 0a50ffc27..62b02b3e0 100644 --- a/zscript/player/swwm_player_face.zsc +++ b/zscript/player/swwm_player_face.zsc @@ -44,26 +44,30 @@ extend Class Demolitionist // 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 ( player.attacker && (player.attacker != self) ) + } + // 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 ) { - 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; - } + if ( angdiff > 45 ) paindir = -1; + else if ( angdiff < -45 ) paindir = 1; } } } @@ -125,8 +129,8 @@ extend Class Demolitionist "Blank", "Blink", "Booty", "Dead", "Default", "Dizzy", "Evil", "Grin", "Hurt", "HurtLeft", "HurtRight", - "Off", "Ouch", "Sad", "Smug", - "Unamused", "Wink" + "Off", "Ouch", "OuchLeft", "OuchRight", + "Sad", "Smug", "Unamused", "Wink" }; int faceidx = GetFaceTex(); if ( !oldfaceidx || (faceidx != oldfaceidx) ) @@ -137,14 +141,14 @@ extend Class Demolitionist private int GetFaceTex() { if ( player.Health <= 0 ) return 3; - if ( (bInvulnerable || (player.cheats&(CF_GODMODE|CF_GODMODE2)) || FindInventory('InvinciballPower')) && (facestate >= FS_PAIN) ) return 14; - if ( facestate == FS_OUCH ) return 12; + 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 13; - if ( facestate == FS_WINK ) return 16; - if ( facestate == FS_BLINK ) return ((facetimer>28)||(facetimer<2))?15:1; + 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: @@ -155,6 +159,6 @@ extend Class Demolitionist return 1; break; } - return (player.Health<=25)?13:4; + return (player.Health<=25)?15:4; } }