Expand score to 64 bits (sort of).
PNG optimization pass.
|
Before Width: | Height: | Size: 231 B |
BIN
graphics/HUD/ScoreBoxL.png
Normal file
|
After Width: | Height: | Size: 215 B |
BIN
graphics/HUD/ScoreBoxM.png
Normal file
|
After Width: | Height: | Size: 97 B |
BIN
graphics/HUD/ScoreBoxR.png
Normal file
|
After Width: | Height: | Size: 127 B |
|
Before Width: | Height: | Size: 8.5 KiB After Width: | Height: | Size: 8.1 KiB |
|
Before Width: | Height: | Size: 8.2 KiB After Width: | Height: | Size: 8.2 KiB |
|
Before Width: | Height: | Size: 8.4 KiB After Width: | Height: | Size: 8.3 KiB |
|
Before Width: | Height: | Size: 8.5 KiB After Width: | Height: | Size: 8.4 KiB |
|
Before Width: | Height: | Size: 9.4 KiB After Width: | Height: | Size: 7.9 KiB |
|
Before Width: | Height: | Size: 9.3 KiB After Width: | Height: | Size: 8 KiB |
|
Before Width: | Height: | Size: 9.4 KiB After Width: | Height: | Size: 8 KiB |
|
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 4.9 KiB After Width: | Height: | Size: 4.9 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 4.6 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 4.4 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 4.4 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 4.4 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 4.5 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 4.3 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 4.4 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 4.4 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 4.6 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 4.4 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 4.5 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 4.5 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 4.6 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 4.5 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 4.6 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 4.4 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 4.6 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 4.4 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 4.4 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 4.4 KiB |
|
|
@ -222,8 +222,8 @@ Class SWWMStats : Thinker
|
|||
{
|
||||
PlayerInfo myplayer;
|
||||
int lastspawn, dashcount, boostcount, stompcount, airtime, kills,
|
||||
deaths, damagedealt, damagetaken, mkill, hiscore, topdealt,
|
||||
toptaken, skill;
|
||||
deaths, damagedealt, damagetaken, mkill, hiscore, hhiscore,
|
||||
topdealt, toptaken, skill;
|
||||
double grounddist, airdist, fuelusage, topspeed;
|
||||
Array<WeaponUsage> wstats;
|
||||
Array<Class<Weapon> > alreadygot;
|
||||
|
|
@ -279,42 +279,75 @@ Class SWWMStats : Thinker
|
|||
Class SWWMCredits : Thinker
|
||||
{
|
||||
PlayerInfo myplayer;
|
||||
int credits;
|
||||
int credits, hcredits;
|
||||
|
||||
static void Give( PlayerInfo p, int amount )
|
||||
static void Give( PlayerInfo p, int amount, int hamount = 0 )
|
||||
{
|
||||
let c = Find(p);
|
||||
if ( !c ) return;
|
||||
if ( (c.credits+amount < c.credits) || (c.credits+amount > 999999999) ) c.credits = 999999999;
|
||||
if ( c.credits+amount < c.credits ) c.credits = int.max;
|
||||
else c.credits += amount;
|
||||
while ( c.credits > 999999999 )
|
||||
{
|
||||
c.credits -= 1000000000;
|
||||
c.hcredits++;
|
||||
}
|
||||
if ( (c.hcredits+hamount < c.hcredits) || (c.hcredits+hamount > 999999999) ) c.hcredits = 999999999;
|
||||
else c.hcredits += hamount;
|
||||
let s = SWWMStats.Find(p);
|
||||
if ( s && (c.credits > s.hiscore) ) s.hiscore = c.credits;
|
||||
if ( s && ((c.hcredits > s.hhiscore) || ((c.credits > s.hiscore) && (c.hcredits >= s.hhiscore))) )
|
||||
{
|
||||
s.hiscore = c.credits;
|
||||
s.hhiscore = c.hcredits;
|
||||
}
|
||||
}
|
||||
|
||||
static clearscope bool CanTake( PlayerInfo p, int amount )
|
||||
static clearscope bool CanTake( PlayerInfo p, int amount, int hamount = 0 )
|
||||
{
|
||||
let c = Find(p);
|
||||
if ( !c ) return false;
|
||||
int req = amount, hreq = hamount;
|
||||
while ( req > 999999999 )
|
||||
{
|
||||
req -= 1000000000;
|
||||
hreq++;
|
||||
}
|
||||
// waaaaay too much
|
||||
if ( (c.hcredits-hreq < 0) || (c.hcredits-hreq > c.hcredits) ) return false;
|
||||
// too much!
|
||||
if ( (c.credits-amount < 0) || (c.credits-amount > c.credits) ) return false;
|
||||
if ( ((c.credits-amount < 0) || (c.credits-amount > c.credits)) && (c.hcredits-hreq <= 0) ) return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool Take( PlayerInfo p, int amount )
|
||||
static bool Take( PlayerInfo p, int amount, int hamount = 0 )
|
||||
{
|
||||
let c = Find(p);
|
||||
if ( !c ) return false;
|
||||
int req = amount, hreq = hamount;
|
||||
while ( req > 999999999 )
|
||||
{
|
||||
req -= 1000000000;
|
||||
hreq++;
|
||||
}
|
||||
// waaaaay too much
|
||||
if ( (c.hcredits-hreq < 0) || (c.hcredits-hreq > c.hcredits) ) return false;
|
||||
// too much!
|
||||
if ( (c.credits-amount < 0) || (c.credits-amount > c.credits) ) return false;
|
||||
c.credits -= amount;
|
||||
if ( ((c.credits-amount < 0) || (c.credits-amount > c.credits)) && (c.hcredits-hreq <= 0) ) return false;
|
||||
c.hcredits -= hreq;
|
||||
c.credits -= req;
|
||||
while ( c.credits < 0 )
|
||||
{
|
||||
c.credits += 1000000000;
|
||||
c.hcredits--;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
static clearscope int Get( PlayerInfo p )
|
||||
static clearscope int, int Get( PlayerInfo p )
|
||||
{
|
||||
let c = Find(p);
|
||||
if ( !c ) return 0;
|
||||
return c.credits;
|
||||
return c.credits, c.hcredits;
|
||||
}
|
||||
|
||||
static clearscope SWWMCredits Find( PlayerInfo p )
|
||||
|
|
@ -2808,7 +2841,7 @@ Class SWWMHandler : EventHandler
|
|||
if ( !item ) return;
|
||||
if ( SWWMCredits.Take(players[e.Args[0]],e.Args[1]) )
|
||||
{
|
||||
players[e.Args[0]].mo.GiveInventory(item,e.Args[2]);
|
||||
players[e.Args[0]].mo.GiveInventory(item,e.Args[2],true);
|
||||
if ( item is 'Weapon' ) players[e.Args[0]].mo.A_SelectWeapon((Class<Weapon>)(item));
|
||||
}
|
||||
}
|
||||
|
|
@ -2835,7 +2868,7 @@ Class SWWMHandler : EventHandler
|
|||
if ( amt > maxgive ) amt = maxgive;
|
||||
}
|
||||
else if ( amt > def.MaxAmount ) amt = def.MaxAmount;
|
||||
if ( (amt > 0) && players[e.Args[1]].mo.GiveInventory(item,amt) )
|
||||
if ( (amt > 0) && players[e.Args[1]].mo.GiveInventory(item,amt,true) )
|
||||
{
|
||||
players[e.Args[0]].mo.TakeInventory(item,amt);
|
||||
// add to history
|
||||
|
|
@ -2928,8 +2961,8 @@ Class SWWMHandler : EventHandler
|
|||
S_StartSound("menu/buyinv",CHAN_ITEM,CHANF_UI);
|
||||
S_StartSound("misc/emone",CHAN_VOICE,CHANF_UI);
|
||||
}
|
||||
SWWMCredits.Give(players[e.Args[0]],999999999);
|
||||
SWWMScoreObj.Spawn(999999999,players[e.Args[0]].mo.Vec3Offset(0,0,players[e.Args[0]].mo.Height/2));
|
||||
SWWMCredits.Give(players[e.Args[0]],1000000000);
|
||||
SWWMScoreObj.Spawn(1000000000,players[e.Args[0]].mo.Vec3Offset(0,0,players[e.Args[0]].mo.Height/2));
|
||||
}
|
||||
else if ( e.Name ~== "swwmlorecheat" )
|
||||
{
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ Class MsgLine
|
|||
|
||||
Class SWWMStatusBar : BaseStatusBar
|
||||
{
|
||||
TextureID StatusTex, WeaponTex, ScoreTex, InventoryTex, ChatTex[6],
|
||||
TextureID StatusTex, WeaponTex, ScoreTex[3], InventoryTex, ChatTex[6],
|
||||
HealthTex[5], FuelTex, DashTex, EnemyBTex, EnemyHTex[5], GenericAmmoTex[3];
|
||||
HUDFont mTewiFont, mMiniwiFont, mMPlusFont, mk6x8Font;
|
||||
|
||||
|
|
@ -49,7 +49,7 @@ Class SWWMStatusBar : BaseStatusBar
|
|||
bool can_project;
|
||||
transient CVar cvar_renderer;
|
||||
|
||||
DynamicValueInterpolator HealthInter, ScoreInter, FuelInter, DashInter;
|
||||
DynamicValueInterpolator HealthInter, ScoreInter, ScoreInter2, FuelInter, DashInter;
|
||||
|
||||
// if playing in Japanese, returns an alternate font of the same height
|
||||
// Tewi -> MPlus
|
||||
|
|
@ -317,7 +317,10 @@ Class SWWMStatusBar : BaseStatusBar
|
|||
// update interpolators
|
||||
HealthInter.Update(CPlayer.health);
|
||||
if ( !hnd ) hnd = SWWMHandler(EventHandler.Find("SWWMHandler"));
|
||||
ScoreInter.Update(SWWMCredits.Get(CPlayer));
|
||||
int s1, s2;
|
||||
[s1, s2] = SWWMCredits.Get(CPlayer);
|
||||
ScoreInter.Update(s1);
|
||||
if ( ScoreInter.GetValue() >= ScoreInter.mCurrentValue ) ScoreInter2.Update(s2);
|
||||
let d = Demolitionist(CPlayer.mo);
|
||||
if ( d )
|
||||
{
|
||||
|
|
@ -448,7 +451,9 @@ Class SWWMStatusBar : BaseStatusBar
|
|||
HealthTex[2] = TexMan.CheckForTexture("graphics/HUD/HealthBar2.png",TexMan.Type_Any);
|
||||
HealthTex[3] = TexMan.CheckForTexture("graphics/HUD/HealthBar3.png",TexMan.Type_Any);
|
||||
HealthTex[4] = TexMan.CheckForTexture("graphics/HUD/HealthBarS.png",TexMan.Type_Any);
|
||||
ScoreTex = TexMan.CheckForTexture("graphics/HUD/ScoreBox.png",TexMan.Type_Any);
|
||||
ScoreTex[0] = TexMan.CheckForTexture("graphics/HUD/ScoreBoxL.png",TexMan.Type_Any);
|
||||
ScoreTex[1] = TexMan.CheckForTexture("graphics/HUD/ScoreBoxM.png",TexMan.Type_Any);
|
||||
ScoreTex[2] = TexMan.CheckForTexture("graphics/HUD/ScoreBoxR.png",TexMan.Type_Any);
|
||||
WeaponTex = TexMan.CheckForTexture("graphics/HUD/WeaponBox.png",TexMan.Type_Any);
|
||||
ChatTex[0] = TexMan.CheckForTexture("graphics/HUD/ChatBoxTop.png",TexMan.Type_Any);
|
||||
ChatTex[1] = TexMan.CheckForTexture("graphics/HUD/ChatBoxLine.png",TexMan.Type_Any);
|
||||
|
|
@ -472,6 +477,7 @@ Class SWWMStatusBar : BaseStatusBar
|
|||
mk6x8Font = HUDFont.Create("k6x8Shaded");
|
||||
HealthInter = DynamicValueInterpolator.Create(100,.1,1,100);
|
||||
ScoreInter = DynamicValueInterpolator.Create(0,.1,1,999999999);
|
||||
ScoreInter2 = DynamicValueInterpolator.Create(0,.1,1,999999999);
|
||||
FuelInter = DynamicValueInterpolator.Create(120,.5,1,100);
|
||||
DashInter = DynamicValueInterpolator.Create(120,.5,1,40);
|
||||
gl_proj = new("swwmLe__GLScreen");
|
||||
|
|
@ -520,9 +526,9 @@ Class SWWMStatusBar : BaseStatusBar
|
|||
else tag = String.Format("\cy%s\c-",StringTable.Localize("$SWWM_NEXIT"));
|
||||
}
|
||||
Font fnt = LangFont(mMiniwiFont);
|
||||
Screen.DrawText(fnt,Font.CR_WHITE,(vpos.x-hsb.x*fnt.StringWidth(tag)/2.)/hsb.x,(vpos.y-hsb.y*fnt.GetHeight()/2.)/hs.y,tag,DTA_VirtualWidthF,ssb.x,DTA_VirtualHeightF,ssb.y,DTA_KeepRatio,true);
|
||||
Screen.DrawText(fnt,Font.CR_WHITE,(vpos.x-hsb.x*fnt.StringWidth(tag)/2.)/hsb.x,(vpos.y-hsb.y*fnt.GetHeight()/2.)/hsb.y,tag,DTA_VirtualWidthF,ssb.x,DTA_VirtualHeightF,ssb.y,DTA_KeepRatio,true);
|
||||
tag = String.Format("\cu(%s\cu)\c-",FormatDist(tdir.length()));
|
||||
Screen.DrawText(fnt,Font.CR_WHITE,(vpos.x-hsb.x*fnt.StringWidth(tag)/2.)/hsb.x,(vpos.y+hsb.y*fnt.GetHeight()/2.)/hs.y,tag,DTA_VirtualWidthF,ssb.x,DTA_VirtualHeightF,ssb.y,DTA_KeepRatio,true);
|
||||
Screen.DrawText(fnt,Font.CR_WHITE,(vpos.x-hsb.x*fnt.StringWidth(tag)/2.)/hsb.x,(vpos.y+hsb.y*fnt.GetHeight()/2.)/hsb.y,tag,DTA_VirtualWidthF,ssb.x,DTA_VirtualHeightF,ssb.y,DTA_KeepRatio,true);
|
||||
}
|
||||
}
|
||||
// targetting array
|
||||
|
|
@ -640,8 +646,35 @@ Class SWWMStatusBar : BaseStatusBar
|
|||
|
||||
private void DrawScore()
|
||||
{
|
||||
Screen.DrawTexture(ScoreTex,false,ss.x-(margin+72),margin,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
|
||||
Screen.DrawText(mTewiFont.mFont,Font.CR_FIRE,ss.x-(margin+57),margin+1,String.Format("%09d",clamp(ScoreInter.GetValue(),0,999999999)),DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
|
||||
if ( ScoreInter2.GetValue() > 0 )
|
||||
{
|
||||
int digits = 9;
|
||||
digits += int(Log10(ScoreInter2.GetValue()))+1;
|
||||
int xx = 19+6*digits;
|
||||
Screen.DrawTexture(ScoreTex[0],false,ss.x-(margin+xx),margin,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
|
||||
xx -= 15;
|
||||
for ( int i=0; i<digits; i++ )
|
||||
{
|
||||
Screen.DrawTexture(ScoreTex[1],false,ss.x-(margin+xx),margin,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
|
||||
xx -= 6;
|
||||
}
|
||||
Screen.DrawTexture(ScoreTex[2],false,ss.x-(margin+xx),margin,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
|
||||
Screen.DrawText(mTewiFont.mFont,Font.CR_FIRE,ss.x-(margin+4+6*digits),margin+1,String.Format("%d",clamp(ScoreInter2.GetValue(),0,999999999)),DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
|
||||
Screen.DrawText(mTewiFont.mFont,Font.CR_FIRE,ss.x-(margin+58),margin+1,String.Format("%09d",clamp(ScoreInter.GetValue(),0,999999999)),DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
|
||||
}
|
||||
else
|
||||
{
|
||||
int xx = 73;
|
||||
Screen.DrawTexture(ScoreTex[0],false,ss.x-(margin+xx),margin,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
|
||||
xx -= 15;
|
||||
for ( int i=0; i<9; i++ )
|
||||
{
|
||||
Screen.DrawTexture(ScoreTex[1],false,ss.x-(margin+xx),margin,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
|
||||
xx -= 6;
|
||||
}
|
||||
Screen.DrawTexture(ScoreTex[2],false,ss.x-(margin+xx),margin,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
|
||||
Screen.DrawText(mTewiFont.mFont,Font.CR_FIRE,ss.x-(margin+58),margin+1,String.Format("%09d",clamp(ScoreInter.GetValue(),0,999999999)),DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
|
||||
}
|
||||
// in doom/heretic (draw key icons)
|
||||
if ( !(gameinfo.gametype&(GAME_DOOMCHEX|GAME_HERETIC)) ) return;
|
||||
Vector2 keypos = (ss.x-(margin+2),margin+19);
|
||||
|
|
|
|||
|
|
@ -529,11 +529,10 @@ Class SWWMKnowledgeBaseMenu : GenericMenu
|
|||
}
|
||||
else if ( (curtab == TAB_STORE) && (storelist.Size() > 0) && (sel0 < storelist.Size()) )
|
||||
{
|
||||
int moni = SWWMCredits.Get(players[consoleplayer]);
|
||||
let itm = GetDefaultByType(storelist[sel0]);
|
||||
let amt = storeunits[sel0];
|
||||
int price = int(itm.Stamina*(1.+.5*(amt-1)));
|
||||
if ( moni < price )
|
||||
if ( !SWWMCredits.CanTake(players[consoleplayer],price) )
|
||||
{
|
||||
MenuSound("menu/noinvuse");
|
||||
tmsg = StringTable.Localize("$SWWM_STOREMUNS");
|
||||
|
|
@ -1859,8 +1858,11 @@ Class SWWMKnowledgeBaseMenu : GenericMenu
|
|||
Screen.DrawTexture(TabSeparator,false,origin.x+xx,origin.y+yy,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
|
||||
xx += 4;
|
||||
}
|
||||
int muns = SWWMCredits.Get(players[consoleplayer]);
|
||||
str = String.Format("\cg¥\c-%09d",muns);
|
||||
int muns1, muns2;
|
||||
[muns1, muns2] = SWWMCredits.Get(players[consoleplayer]);
|
||||
str = "\cg¥\c-";
|
||||
if ( muns2 > 0 ) str.AppendFormat("%d",muns2);
|
||||
str.AppendFormat("%09d",muns1);
|
||||
xx = 637-TewiFont.StringWidth(str);
|
||||
Screen.DrawText(TewiFont,Font.CR_FIRE,origin.x+xx,origin.y+yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
|
||||
// draw bottom messages
|
||||
|
|
@ -1973,7 +1975,8 @@ Class SWWMKnowledgeBaseMenu : GenericMenu
|
|||
}
|
||||
Screen.DrawText(fnt,Font.CR_WHITE,origin.x+xx,origin.y+yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
|
||||
yy += 16;
|
||||
str = String.Format("\cx%s\cu¥\c-%09d",StringTable.Localize("$SWWM_STATHISCORE"),stats.hiscore);
|
||||
if ( stats.hhiscore > 0 ) str = String.Format("\cx%s\cu¥\c-%d%09d",StringTable.Localize("$SWWM_STATHISCORE"),stats.hhiscore,stats.hiscore);
|
||||
else str = String.Format("\cx%s\cu¥\c-%09d",StringTable.Localize("$SWWM_STATHISCORE"),stats.hiscore);
|
||||
Screen.DrawText(fnt,Font.CR_WHITE,origin.x+xx,origin.y+yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
|
||||
yy += 16;
|
||||
}
|
||||
|
|
@ -2215,7 +2218,7 @@ Class SWWMKnowledgeBaseMenu : GenericMenu
|
|||
str = String.Format("¥%d",price);
|
||||
len = TewiFont.StringWidth(str);
|
||||
int clscol = Font.CR_FIRE;
|
||||
if ( price > muns ) clscol = Font.CR_BLACK;
|
||||
if ( (price > muns1) && (muns2 <= 0) ) clscol = Font.CR_BLACK;
|
||||
Screen.DrawText(TewiFont,clscol,origin.x+xx+longest+80-len,origin.y+yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_ColorOverlay,(i!=sel0)?Color(96,0,0,0):Color(0,0,0,0));
|
||||
yy += 16;
|
||||
if ( yy >= 370 )
|
||||
|
|
|
|||