4.10 support update (unfinished and untested).
This commit is contained in:
parent
eb624f15e3
commit
8e952f412f
80 changed files with 2343 additions and 2356 deletions
|
|
@ -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");
|
||||
|
|
|
|||
|
|
@ -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 )
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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) )
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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++ )
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)));
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue