4.10 support update (unfinished and untested).

This commit is contained in:
Mari the Deer 2022-12-05 02:10:56 +01:00
commit 8e952f412f
80 changed files with 2343 additions and 2356 deletions

View file

@ -190,17 +190,28 @@ Class DemolitionistMenu : GenericMenu
'DemolitionistHelpTab',
'DemolitionistSecretTab'
};
// since GZDoom 4.10 we have to "pre-tick" tabs as soon as they're initialized
for ( int i=0; i<deftabs.Size()-2; i++ )
tabs.Push(DemolitionistMenuTab(new(deftabs[i])).Init(self));
// custom tabs go before the help and secret tabs
for ( int i=0; i<AllClasses.Size(); i++ )
{
let ct = (Class<DemolitionistMenuTabCustom>)(AllClasses[i]);
let t = DemolitionistMenuTab(new(deftabs[i])).Init(self);
t.Ticker();
tabs.Push(t);
}
// custom tabs go before the help and secret tabs
foreach ( cls:AllClasses )
{
let ct = (Class<DemolitionistMenuTabCustom>)(cls);
if ( !ct || (ct.GetParentClass() != 'DemolitionistMenuTabCustom') ) continue;
tabs.Push(DemolitionistMenuTab(new(ct)).Init(self));
let t = DemolitionistMenuTab(new(ct)).Init(self);
t.Ticker();
tabs.Push(t);
}
for ( int i=deftabs.Size()-2; i<deftabs.Size(); i++ )
tabs.Push(DemolitionistMenuTab(new(deftabs[i])).Init(self));
{
let t = DemolitionistMenuTab(new(deftabs[i])).Init(self);
t.Ticker();
tabs.Push(t);
}
if ( shnd.menustate )
{
Class<DemolitionistMenuTab> saved = shnd.menustate.At("LastTab");

View file

@ -9,11 +9,11 @@ Class DemolitionistMenuList ui
override void OnDestroy()
{
for ( int i=0; i<items.Size(); i++ )
foreach ( i:items )
{
// just in case do a null pointer check
if ( !items[i] ) continue;
items[i].Destroy();
if ( !i ) continue;
i.Destroy();
}
}
@ -21,9 +21,9 @@ Class DemolitionistMenuList ui
int GetWidth()
{
int mw = 0;
for ( int i=0; i<items.Size(); i++ )
foreach ( i:items )
{
int cw = items[i].GetWidth();
int cw = i.GetWidth();
if ( cw > mw ) mw = cw;
}
return mw;
@ -31,8 +31,8 @@ Class DemolitionistMenuList ui
// tick all items
void Ticker()
{
for ( int i=0; i<items.Size(); i++ )
items[i].Ticker();
foreach ( i:items )
i.Ticker();
}
// draw all items with a specific offset
void Drawer( Vector2 offset )

View file

@ -70,8 +70,8 @@ Class DemolitionistChatTab : DemolitionistMenuTab
}
else
{
for ( int i=0; i<msglist.items.Size(); i++ )
ypos += msglist.items[i].GetHeight();
foreach ( i:msglist.items )
ypos += i.GetHeight();
recenter = false;
}
maxofs = max(ypos-int(master.ws.y-46),0);

View file

@ -9,10 +9,10 @@ Class DemolitionistGameTab : DemolitionistMenuTab
override DemolitionistMenuTab Init( DemolitionistMenu master )
{
title = StringTable.Localize("$SWWM_GAMETAB");
for ( int i=0; i<AllClasses.Size(); i++ )
foreach ( cls:AllClasses )
{
if ( AllClasses[i].isAbstract() || !(AllClasses[i] is 'MadcatGame') ) continue;
gamelist.Push((Class<MadcatGame>)(AllClasses[i]));
if ( cls.isAbstract() || !(cls is 'MadcatGame') ) continue;
gamelist.Push((Class<MadcatGame>)(cls));
}
bDirectInput = true;
return Super.Init(master);
@ -30,9 +30,9 @@ Class DemolitionistGameTab : DemolitionistMenuTab
// auto-add lore for kris
let lore = SWWMLoreLibrary.Find(players[consoleplayer]);
bool found = false;
for ( int i=0; i<lore.ent.Size(); i++ )
foreach ( ent:lore.ent )
{
if ( !(lore.ent[i].tag ~== "$SWWM_LORETAG_MADCAT") ) continue;
if ( !(ent.tag ~== "$SWWM_LORETAG_MADCAT") ) continue;
found = true;
break;
}

View file

@ -43,9 +43,9 @@ Class DemolitionistInventoryTab : DemolitionistMenuTab
else if ( a is 'Ammo' )
{
Class<Weapon> usesa, usesb;
for ( int i=0; i<AllActorClasses.Size(); i++ )
foreach ( cls:AllActorClasses )
{
let w = (Class<Weapon>)(AllActorClasses[i]);
let w = (Class<Weapon>)(cls);
if ( !w ) continue;
let def = GetDefaultByType(w);
if ( w is 'SWWMWeapon' )
@ -95,9 +95,9 @@ Class DemolitionistInventoryTab : DemolitionistMenuTab
pamoa = MagAmmo(a).ParentAmmo;
pamob = MagAmmo(b).ParentAmmo;
Class<Weapon> usesa, usesb;
for ( int i=0; i<AllActorClasses.Size(); i++ )
foreach ( cls:AllActorClasses )
{
let w = (Class<Weapon>)(AllActorClasses[i]);
let w = (Class<Weapon>)(cls);
if ( !w ) continue;
let def = GetDefaultByType(w);
if ( w is 'SWWMWeapon' )
@ -254,32 +254,32 @@ Class DemolitionistInventoryTab : DemolitionistMenuTab
i--;
}
// check if new entries must be added
for ( Inventory i=players[consoleplayer].mo.inv; i; i=i.inv )
for ( Inventory inv=players[consoleplayer].mo.inv; inv; inv=inv.inv )
{
if ( FilterInventory(i) ) continue;
if ( FilterInventory(inv) ) continue;
// skip if it's already there
bool skipme = false;
for ( int j=0; j<invlist.items.Size(); j++ )
foreach ( i:invlist.items )
{
if ( DemolitionistMenuInvItem(invlist.items[j]).inv != i ) continue;
if ( DemolitionistMenuInvItem(i).inv != inv ) continue;
skipme = true;
break;
}
if ( skipme ) continue;
// make sure we sort alphabetically on first insert
String tag = i.GetTag();
String tag = inv.GetTag();
bool greater = false;
for ( int j=0; j<invlist.items.Size(); j++ )
{
String tag2 = DemolitionistMenuInvItem(invlist.items[j]).inv.GetTag();
if ( tag > tag2 ) continue;
greater = true;
invlist.items.Insert(j,new("DemolitionistMenuInvItem").Init(master,i));
invlist.items.Insert(j,new("DemolitionistMenuInvItem").Init(master,inv));
mustsort = true;
break;
}
if ( greater ) continue;
invlist.items.Push(new("DemolitionistMenuInvItem").Init(master,i));
invlist.items.Push(new("DemolitionistMenuInvItem").Init(master,inv));
mustsort = true;
}
}
@ -299,11 +299,11 @@ Class DemolitionistInventoryTab : DemolitionistMenuTab
int maxw = invlist.GetWidth();
int xx = 0;
int yy = 0;
for ( int i=0; i<invlist.items.Size(); i++ )
foreach ( i:invlist.items )
{
maxofs = max(maxofs,int(xx+invlist.items[i].GetWidth()));
invlist.items[i].xpos = xx;
invlist.items[i].ypos = yy;
maxofs = max(maxofs,int(xx+i.GetWidth()));
i.xpos = xx;
i.ypos = yy;
yy += 16;
if ( yy > (master.ws.y-62) )
{

View file

@ -57,11 +57,10 @@ Class DemolitionistLibraryTab : DemolitionistMenuTab
lists[i].master = master;
}
loresz = lore.ent.Size();
for ( int i=0; i<loresz; i++ )
foreach ( e:lore.ent )
{
let ent = lore.ent[i];
let le = new("DemolitionistMenuLoreItem").Init(master,ent);
lists[ent.tab].items.Push(le);
let le = new("DemolitionistMenuLoreItem").Init(master,e);
lists[e.tab].items.Push(le);
lwidth = max(lwidth,master.mSmallFont.StringWidth("‼"..le.label)+6);
}
for ( int i=0; i<4; i++ )

View file

@ -135,10 +135,10 @@ Class DemolitionistMissionTab : DemolitionistMenuTab
}
override void OnDestroy()
{
for ( int i=0; i<mtext.Size(); i++ )
foreach ( t:mtext )
{
if ( !mtext[i] ) continue;
mtext[i].Destroy();
if ( !t ) continue;
t.Destroy();
}
}

View file

@ -31,24 +31,23 @@ Class DemolitionistStatsTab : DemolitionistMenuTab
// because these types of stats don't actually change while the menu is open, we can initialize their lists ONLY ONCE here
if ( swwm_uniqstats )
{
for ( int i=0; i<stats.lstats.Size(); i++ )
foreach ( s:stats.lstats )
{
if ( stats.lstats[i].mapname ~== level.mapname ) continue;
if ( s.mapname ~== level.mapname ) continue;
for ( int j=0; j<lists[2].items.Size(); j++ )
{
if ( !(DemolitionistMenuMapStatItem(lists[2].items[j]).s.mapname ~== stats.lstats[i].mapname) ) continue;
if ( !(DemolitionistMenuMapStatItem(lists[2].items[j]).s.mapname ~== s.mapname) ) continue;
lists[2].items[j].Destroy();
lists[2].items.Delete(j);
j--;
}
lists[2].items.Push(new("DemolitionistMenuMapStatItem").Init(master,stats.lstats[i]));
lists[2].items.Push(new("DemolitionistMenuMapStatItem").Init(master,s));
}
}
else
{
lists[2].items.Resize(stats.lstats.Size());
for ( int i=0; i<stats.lstats.Size(); i++ )
lists[2].items[i] = new("DemolitionistMenuMapStatItem").Init(master,stats.lstats[i]);
foreach ( s:stats.lstats )
lists[2].items.Push(new("DemolitionistMenuMapStatItem").Init(master,s));
}
clstat = new("LevelStat");
clstat.hub = !!(level.clusterflags&level.CLUSTER_HUB);
@ -62,8 +61,8 @@ Class DemolitionistStatsTab : DemolitionistMenuTab
lists[2].selected = lists[2].items.Size()-1; // so it shows the "current level" indicator
for ( int i=0; i<lists[2].items.Size(); i++ )
lists[2].items[i].ypos = i*16;
for ( int i=0; i<master.shnd.achievementinfo.Size(); i++ )
lists[3].items.Push(new("DemolitionistMenuAchievementItem").Init(master,master.shnd.achievementinfo[i]));
foreach ( inf:master.shnd.achievementinfo )
lists[3].items.Push(new("DemolitionistMenuAchievementItem").Init(master,inf));
return Super.Init(master);
}
override void OnDestroy()
@ -326,9 +325,9 @@ Class DemolitionistStatsTab : DemolitionistMenuTab
// update widths
w = int(master.ws.x-(18+lwidth));
if ( maxofs[1] > 0 ) w -= 8;
for ( int i=0; i<lists[1].items.Size(); i++ )
foreach ( i:lists[1].items )
{
let k = DemolitionistMenuKillItem(lists[1].items[i]);
let k = DemolitionistMenuKillItem(i);
k.width = w;
}
// sort
@ -352,9 +351,9 @@ Class DemolitionistStatsTab : DemolitionistMenuTab
if ( maxofs[2] > 0 ) w -= 8;
int len[4], maxlen[4];
for ( int i=0; i<4; i++ ) maxlen[i] = 0;
for ( int i=0; i<lists[2].items.Size(); i++ )
foreach ( i:lists[2].items )
{
let l = DemolitionistMenuMapStatItem(lists[2].items[i]);
let l = DemolitionistMenuMapStatItem(i);
l.width = w;
// and calculate "max lengths"
int sec = Thinker.Tics2Seconds(l.s.time);
@ -381,25 +380,25 @@ Class DemolitionistStatsTab : DemolitionistMenuTab
}
}
// second pass to propagate the "max lengths"
for ( int i=0; i<lists[2].items.Size(); i++ )
foreach ( i:lists[2].items )
{
let l = DemolitionistMenuMapStatItem(lists[2].items[i]);
let l = DemolitionistMenuMapStatItem(i);
for ( int j=0; j<4; j++ )
l.maxlen[j] = maxlen[j];
}
break;
case 3:
// update achievement progress
for ( int i=0; i<lists[3].items.Size(); i++ )
DemolitionistMenuAchievementItem(lists[3].items[i]).Update();
foreach ( i:lists[3].items )
DemolitionistMenuAchievementItem(i).Update();
// sort achievements
qsort_achievements(lists[3].items,0,lists[3].items.Size()-1);
// set offsets (based on which ones should be hidden, too)
int ay = 0;
bool dohide = (swwm_filterachievements==2);
for ( int i=0; i<lists[3].items.Size(); i++ )
foreach ( i:lists[3].items )
{
let ai = DemolitionistMenuAchievementItem(lists[3].items[i]);
let ai = DemolitionistMenuAchievementItem(i);
let key = ai.a.basename;
ai.bHidden = true;
if ( (key == "everything") && !ai.a.state ) continue;
@ -413,9 +412,9 @@ Class DemolitionistStatsTab : DemolitionistMenuTab
// update widths
w = int(master.ws.x-(24+lwidth));
if ( maxofs[3] > 0 ) w -= 8;
for ( int i=0; i<lists[3].items.Size(); i++ )
foreach ( i:lists[3].items )
{
let ai = DemolitionistMenuAchievementItem(lists[3].items[i]);
let ai = DemolitionistMenuAchievementItem(i);
ai.width = w;
}
}

View file

@ -174,18 +174,18 @@ Class DemolitionistStoreTab : DemolitionistMenuTab
if ( invlist[bSell].selected > i ) invlist[bSell].selected = max(0,invlist[bSell].selected-1);
i--;
}
for ( int i=0; i<AllActorClasses.Size(); i++ )
foreach ( cls:AllActorClasses )
{
let type = (Class<Inventory>)(AllActorClasses[i]);
let type = (Class<Inventory>)(cls);
if ( !type ) continue;
let cur = players[consoleplayer].mo.FindInventory(type);
let inv = GetDefaultByType(type);
if ( FilterStore(type,cur,inv) ) continue;
// skip if it's already there
bool skipme = false;
for ( int j=0; j<invlist[bSell].items.Size(); j++ )
foreach ( i:invlist[bSell].items )
{
if ( DemolitionistMenuStoreItem(invlist[bSell].items[j]).inv != type ) continue;
if ( DemolitionistMenuStoreItem(i).inv != type ) continue;
skipme = true;
break;
}
@ -219,19 +219,19 @@ Class DemolitionistStoreTab : DemolitionistMenuTab
// rearrange all item positions
maxofs = 0;
maxw = 0;
for ( int i=0; i<invlist[bSell].items.Size(); i++ )
foreach ( i:invlist[bSell].items )
{
let fw = DemolitionistMenuStoreItem(invlist[bSell].items[i]).GetFullWidth();
let fw = DemolitionistMenuStoreItem(i).GetFullWidth();
if ( fw > maxw ) maxw = fw;
}
int xx = 0;
int yy = 0;
for ( int i=0; i<invlist[bSell].items.Size(); i++ )
foreach ( i:invlist[bSell].items )
{
maxofs = max(maxofs,xx+maxw-16);
DemolitionistMenuStoreItem(invlist[bSell].items[i]).width = maxw;
invlist[bSell].items[i].xpos = xx;
invlist[bSell].items[i].ypos = yy;
DemolitionistMenuStoreItem(i).width = maxw;
i.xpos = xx;
i.ypos = yy;
yy += 16;
if ( yy > (master.ws.y-62) )
{
@ -478,9 +478,9 @@ Class DemolitionistMenuStoreItem : DemolitionistMenuListItem
if ( bSell ) maxamt = cur.Amount; // we can sell ALL our ammo
else maxamt = cur?(cur.MaxAmount-cur.Amount):def.MaxAmount;
// get the largest affordable child pickup amount (that we need, or we can sell)
for ( int j=0; j<AllActorClasses.Size(); j++ )
foreach ( cls:AllActorClasses )
{
let inv2 = (Class<Ammo>)(AllActorClasses[j]);
let inv2 = (Class<Ammo>)(cls);
if ( !inv2 || (inv2.GetParentClass() != inv) ) continue;
let def2 = GetDefaultByType(inv2);
int cprice = int(abs(def.Stamina)*(1.+.75*(def2.Amount-1)));
@ -496,9 +496,9 @@ Class DemolitionistMenuStoreItem : DemolitionistMenuListItem
// never bought, only sold
int maxamt = cur.Amount;
// get the largest affordable child pickup amount (that we can sell)
for ( int j=0; j<AllActorClasses.Size(); j++ )
foreach ( cls:AllActorClasses )
{
let inv2 = (Class<MagAmmo>)(AllActorClasses[j]);
let inv2 = (Class<MagAmmo>)(cls);
if ( !inv2 || (inv2.GetParentClass() != inv) ) continue;
let def2 = GetDefaultByType(inv2);
int cprice = int(abs(def.Stamina)*(1.+.75*(def2.Amount-1)));