diff --git a/cvarinfo.txt b/cvarinfo.txt index a534e0a42..e526be216 100644 --- a/cvarinfo.txt +++ b/cvarinfo.txt @@ -101,6 +101,7 @@ nosave int swwm_numcolor_hp = 7; // font color for health numbers (default: blu nosave int swwm_numcolor_ap = 3; // font color for armor numbers (default: green) server int swwm_drlaskill = 3; // [DRLA Monsters] skill setting for monster spawns nosave bool swwm_showminimap = false; // show a minimap below the score counter +nosave noarchive float swwm_minimapzoom = 1; // zoom level of minimap server noarchive bool swwm_iseriouslywanttoplaythiswithbd = false; // self-explanatory diff --git a/keyconf.txt b/keyconf.txt index b0d90d40d..3efa6e89e 100644 --- a/keyconf.txt +++ b/keyconf.txt @@ -12,6 +12,8 @@ addmenukey "$SWWM_GESTURE2" "netevent swwmgesture 1" addmenukey "$SWWM_GESTURE3" "netevent swwmgesture 2" addmenukey "$SWWM_GESTURE4" "netevent swwmgesture 3" addmenukey "$SWWM_KBASE" "event swwmdemomenu" +addmenukey "$SWWM_MINIMAPIN" "event swwmzoomin" +addmenukey "$SWWM_MINIMAPOUT" "event swwmzoomout" defaultbind "mouse1" "+attack" defaultbind "mouse2" "+altattack" defaultbind "r" "+reload" @@ -25,3 +27,5 @@ defaultbind "j" "netevent swwmgesture 1" defaultbind "k" "netevent swwmgesture 2" defaultbind "l" "netevent swwmgesture 3" defaultbind "q" "event swwmdemomenu" +defaultbind "kp+" "event swwmzoomin" +defaultbind "kp-" "event swwmzoomout" diff --git a/language.def_menu b/language.def_menu index a107e71f8..be6f40865 100644 --- a/language.def_menu +++ b/language.def_menu @@ -14,6 +14,8 @@ SWWM_GESTURE2 = "Thumbs Up"; SWWM_GESTURE3 = "Victory"; SWWM_GESTURE4 = "Blow Kiss"; SWWM_KBASE = "Demolitionist Menu"; +SWWM_MINIMAPIN = "Minimap Zoom In"; +SWWM_MINIMAPOUT = "Minimap Zoom Out"; // skills SWWM_SKCHILL = "\cdJust Chillin'\c-"; SWWM_SKEASY = "\ckTaking It Easy~\c-"; diff --git a/language.es_menu b/language.es_menu index ef67354d0..9a90071b9 100644 --- a/language.es_menu +++ b/language.es_menu @@ -14,6 +14,8 @@ SWWM_GESTURE2 = "Pulgar Arriba"; SWWM_GESTURE3 = "Victoria"; SWWM_GESTURE4 = "Soplar Beso"; SWWM_KBASE = "MenĂº de Demolicionista"; +SWWM_MINIMAPIN = "Acercar Zoom de Minimapa"; +SWWM_MINIMAPOUT = "Alejar Zoom de Minimapa"; // skills SWWM_SKCHILL = "\cdDe Relax\c-"; SWWM_SKEASY = "\ckCon Calmita~\c-"; diff --git a/language.version b/language.version index e01464385..5cc1f6d35 100644 --- a/language.version +++ b/language.version @@ -1,3 +1,3 @@ [default] -SWWM_MODVER="\chSWWM \czGZ\c- \cw0.9.11b-pre r297 \cu(Mon 22 Feb 00:58:07 CET 2021)\c-"; -SWWM_SHORTVER="\cw0.9.11b-pre r297 \cu(2021-02-22 00:58:07)\c-"; +SWWM_MODVER="\chSWWM \czGZ\c- \cw0.9.11b-pre r298 \cu(Mon 22 Feb 12:49:57 CET 2021)\c-"; +SWWM_SHORTVER="\cw0.9.11b-pre r298 \cu(2021-02-22 12:49:57)\c-"; diff --git a/zscript/swwm_handler.zsc b/zscript/swwm_handler.zsc index 09b5a7c6a..783ac41cb 100644 --- a/zscript/swwm_handler.zsc +++ b/zscript/swwm_handler.zsc @@ -1417,21 +1417,22 @@ Class SWWMHandler : EventHandler } // update trackers for anything around the player bool thesight = players[consoleplayer].mo.FindInventory("Omnisight"); - BlockThingsIterator bt = BlockThingsIterator.Create(players[consoleplayer].Camera,SWWMStatusBar.MAPVIEWDIST); + double viewdist = SWWMStatusBar.MAPVIEWDIST*swwm_minimapzoom; + BlockThingsIterator bt = BlockThingsIterator.Create(players[consoleplayer].Camera,viewdist); while ( bt.Next() ) { let a = bt.Thing; if ( !a ) continue; Vector2 rv = a.pos.xy-players[consoleplayer].Camera.pos.xy; - if ( max(abs(rv.x)-a.radius,abs(rv.y)-a.radius) > SWWMStatusBar.MAPVIEWDIST ) + if ( max(abs(rv.x)-a.radius,abs(rv.y)-a.radius) > viewdist ) continue; if ( a == players[consoleplayer].Camera ) continue; - if ( !a.player && !a.bISMONSTER && !a.bFRIENDLY && !(a is 'Inventory') && !(a is 'Chancebox') ) + if ( !a.player && !a.bSOLID && !a.bSHOOTABLE && !a.bISMONSTER && !a.bFRIENDLY && !(a is 'Inventory') && !(a is 'Chancebox') ) continue; if ( !thesight && !a.IsFriend(players[consoleplayer].mo) && !players[consoleplayer].Camera.CheckSight(a,SF_IGNOREVISIBILITY|SF_IGNOREWATERBOUNDARY) ) continue; - if ( a.bKILLED ) + if ( a.bKILLED || (a.Health <= 0) ) continue; if ( (a is 'Inventory') && (!a.bSPECIAL || Inventory(a).Owner) ) continue; @@ -1439,21 +1440,24 @@ Class SWWMHandler : EventHandler continue; SWWMSimpleTracker.Track(a); } - // prune expired trackers SWWMSimpleTracker trk = strackers; while ( trk ) { SWWMSimpleTracker next = trk.next; + // reduce sight counter + if ( trk.lastupdate < level.maptime ) + trk.sightcount = max(0,trk.sightcount-1); // minimize lifespan of destroyed targets if ( !trk.target ) trk.lastupdate = min(trk.lastupdate,level.maptime); else if ( !trk.expired ) { // "last breath" update - if ( trk.target.bKILLED + if ( (trk.target.bKILLED || (trk.target.Health <= 0)) || ((trk.target is 'Inventory') && (!trk.target.bSPECIAL || Inventory(trk.target).Owner)) || ((trk.target is 'Chancebox') && (trk.target.CurState != trk.target.SpawnState)) ) trk.Update(); } + // prune expired trackers if ( trk.lastupdate+140 < level.maptime ) { if ( !trk.prev ) strackers = trk.next; @@ -3106,6 +3110,21 @@ Class SWWMHandler : EventHandler return; Menu.SetMenu('DemolitionistMenu'); } + else if ( e.Name ~== "swwmzoomin" ) + { + if ( (gamestate != GS_LEVEL) || (players[consoleplayer].Health <= 0) || !(players[consoleplayer].mo is 'Demolitionist') ) + return; + double val = max(.5,swwm_minimapzoom/2.); + CVar.FindCVar('swwm_minimapzoom').SetFloat(val); + } + else if ( e.Name ~== "swwmzoomout" ) + { + if ( (gamestate != GS_LEVEL) || (players[consoleplayer].Health <= 0) || !(players[consoleplayer].mo is 'Demolitionist') ) + return; + double maxval = players[consoleplayer].mo.FindInventory("Omnisight")?2.:1.; + double val = min(maxval,swwm_minimapzoom*2.); + CVar.FindCVar('swwm_minimapzoom').SetFloat(val); + } } override void NetworkProcess( ConsoleEvent e ) diff --git a/zscript/swwm_hud.zsc b/zscript/swwm_hud.zsc index 6a7cdb01e..e36b4b38e 100644 --- a/zscript/swwm_hud.zsc +++ b/zscript/swwm_hud.zsc @@ -60,6 +60,7 @@ Class SWWMStatusBar : BaseStatusBar bool koraxhack; + double minimapzoom, oldminimapzoom; // minimap constants const CLIPDIST = 800; // clip distance for minimap view, with rotation accounted const MAPVIEWDIST = 1132; // maximum distance for something to be considered visible (rounded up CLIPDIST*sqrt(2)) @@ -416,6 +417,15 @@ Class SWWMStatusBar : BaseStatusBar if ( CPlayer.ReadyWeapon is 'SWWMWeapon' ) SWWMWeapon(CPlayer.ReadyWeapon).HudTick(); bool thesight = CPlayer.mo.FindInventory("Omnisight"); + double desiredzoom = clamp(swwm_minimapzoom,.5,thesight?2.:1.); + if ( (minimapzoom != swwm_minimapzoom) || (oldminimapzoom != swwm_minimapzoom) ) + { + oldminimapzoom = minimapzoom; + double diff = .1*(desiredzoom-minimapzoom); + minimapzoom += diff; + if ( abs(minimapzoom-desiredzoom) <= double.epsilon ) + minimapzoom = desiredzoom; + } let cam = players[consoleplayer].camera; Vector3 viewvec = (cos(viewrot.x)*cos(viewrot.y),sin(viewrot.x)*cos(viewrot.y),sin(-viewrot.y)); int sz; @@ -616,6 +626,7 @@ Class SWWMStatusBar : BaseStatusBar GenericAmmoTex[1] = TexMan.CheckForTexture("graphics/HUD/GenericAmmoBoxM.png",TexMan.Type_Any); GenericAmmoTex[2] = TexMan.CheckForTexture("graphics/HUD/GenericAmmoBoxR.png",TexMan.Type_Any); MiniBox = TexMan.CheckForTexture("graphics/HUD/MinimapBox.png",TexMan.Type_Any); + minimapzoom = oldminimapzoom = 1.; mTewiFont = HUDFont.Create("TewiShaded"); mMiniwiFont = HUDFont.Create("MiniwiShaded"); mMPlusFont = HUDFont.Create("MPlusShaded"); @@ -942,6 +953,8 @@ Class SWWMStatusBar : BaseStatusBar private void DrawMapLines( Vector2 basepos ) { + double zoomlevel = oldminimapzoom*(1.-FracTic)+minimapzoom*FracTic; + double zoomview = MAPVIEWDIST*zoomlevel, zoomclip = CLIPDIST*zoomlevel; Vector2 cpos = CPlayer.Camera.prev.xy*(1.-FracTic)+CPlayer.Camera.pos.xy*FracTic; for ( int i=0; i= 4)) ) continue; Vector2 rv1 = l.v1.p-cpos, rv2 = l.v2.p-cpos; - if ( min(min(abs(rv1.x),abs(rv2.x)),min(abs(rv1.y),abs(rv2.y))) > MAPVIEWDIST ) + if ( min(min(abs(rv1.x),abs(rv2.x)),min(abs(rv1.y),abs(rv2.y))) > zoomview ) continue; // flip Y rv1.y *= -1; @@ -960,11 +973,11 @@ Class SWWMStatusBar : BaseStatusBar rv2 = Actor.RotateVector(rv2,ViewRot.x-90); // clip to frame bool visible; - [visible, rv1, rv2] = SWWMUtility.LiangBarsky((-1,-1)*CLIPDIST,(1,1)*CLIPDIST,rv1,rv2); + [visible, rv1, rv2] = SWWMUtility.LiangBarsky((-1,-1)*zoomclip,(1,1)*zoomclip,rv1,rv2); if ( !visible ) continue; // scale to minimap frame - rv1 *= (HALFMAPSIZE/double(CLIPDIST))*hs.x; - rv2 *= (HALFMAPSIZE/double(CLIPDIST))*hs.x; + rv1 *= (HALFMAPSIZE/zoomclip)*hs.x; + rv2 *= (HALFMAPSIZE/zoomclip)*hs.x; // offset to minimap center rv1 += basepos; rv2 += basepos; @@ -1018,11 +1031,14 @@ Class SWWMStatusBar : BaseStatusBar private void DrawMapThings( Vector2 basepos ) { bool thesight = !!CPlayer.mo.FindInventory("Omnisight"); + double zoomlevel = oldminimapzoom*(1.-FracTic)+minimapzoom*FracTic; + double zoomview = MAPVIEWDIST*zoomlevel, zoomclip = CLIPDIST*zoomlevel; Vector2 cpos = CPlayer.Camera.prev.xy*(1.-FracTic)+CPlayer.Camera.pos.xy*FracTic; for ( SWWMSimpleTracker t=hnd.strackers; t; t=t.next ) { Color col = am_thingcolor; bool isitem = false; + bool plainactor = false; Vector2 pos; double angle; double radius; @@ -1042,6 +1058,7 @@ Class SWWMStatusBar : BaseStatusBar else if ( t.target.bFRIENDLY ) col = am_thingcolor_friend; else if ( t.target.bCOUNTKILL ) col = am_thingcolor_monster; else if ( t.target.bISMONSTER ) col = am_thingcolor_ncmonster; + else plainactor = true; } else { @@ -1059,25 +1076,39 @@ Class SWWMStatusBar : BaseStatusBar else if ( t.friendly ) col = am_thingcolor_friend; else if ( t.countkill ) col = am_thingcolor_monster; else if ( t.ismonster ) col = am_thingcolor_ncmonster; + else plainactor = true; } int mtime = 35; if ( thesight && !t.expired && t.target ) mtime += 105; double alph = clamp(((t.lastupdate+mtime)-level.maptime)/35.,0.,1.); + alph *= min(1.,t.sightcount/10.); if ( alph <= 0. ) continue; Vector2 rv = pos-cpos; - if ( min(abs(rv.x)-radius,abs(rv.y)-radius) > MAPVIEWDIST ) continue; - // get actor triangle + if ( min(abs(rv.x)-radius,abs(rv.y)-radius) > zoomview ) + continue; Vector2 tv[4]; - int nidx = isitem?4:3; + int nidx; if ( isitem ) { - tv[0] = rv+(-10,-10); - tv[1] = rv+(10,10); - tv[2] = rv+(10,-10); - tv[3] = rv+(-10,10); + // rhombus + nidx = 4; + double crad = min(radius,10); + for ( int i=0; i<4; i++ ) + tv[i] = rv+Actor.RotateVector((crad,0),i*90); + } + else if ( plainactor ) + { + // aabb box + nidx = 4; + tv[0] = rv+(-radius,-radius); + tv[1] = rv+(radius,-radius); + tv[2] = rv+(radius,radius); + tv[3] = rv+(-radius,radius); } else { + // oriented triangle + nidx = 3; tv[0] = rv+Actor.RotateVector((radius,0),angle); tv[1] = rv+Actor.RotateVector((-radius,radius),angle); tv[2] = rv+Actor.RotateVector((-radius,-radius),angle); @@ -1089,29 +1120,14 @@ Class SWWMStatusBar : BaseStatusBar bool visible; Vector2 x0, x1; // clip to frame - if ( isitem ) for ( int j=0; j<4; j+=2 ) + for ( int j=0; j