From 1b41ffea5adb7a01bb6fe17b5942da44536df8fd Mon Sep 17 00:00:00 2001 From: Marisa Kirisame Date: Fri, 20 Aug 2021 21:49:27 +0200 Subject: [PATCH] Fix crash when trading items if using keyboard input. --- language.version | 4 +- zscript/kbase/swwm_kbase.zsc | 98 +++++++++++++++++++++++++++++++++--- 2 files changed, 93 insertions(+), 9 deletions(-) diff --git a/language.version b/language.version index 1a57f9325..e6e9186bd 100644 --- a/language.version +++ b/language.version @@ -1,3 +1,3 @@ [default] -SWWM_MODVER="\chSWWM \czGZ\c- \cw1.0.5 r3 \cu(Fri 20 Aug 21:49:13 CEST 2021)\c-"; -SWWM_SHORTVER="\cw1.0.5 r3 \cu(2021-08-20 21:49:13)\c-"; +SWWM_MODVER="\chSWWM \czGZ\c- \cw1.0.5 r4 \cu(Fri 20 Aug 21:49:27 CEST 2021)\c-"; +SWWM_SHORTVER="\cw1.0.5 r4 \cu(2021-08-20 21:49:27)\c-"; diff --git a/zscript/kbase/swwm_kbase.zsc b/zscript/kbase/swwm_kbase.zsc index c2b36bc81..8532611af 100644 --- a/zscript/kbase/swwm_kbase.zsc +++ b/zscript/kbase/swwm_kbase.zsc @@ -570,12 +570,18 @@ Class DemolitionistMenu : GenericMenu } } } - else if ( ((tabs[curtab] == TAB_INVENTORY) || (tabs[curtab] == TAB_KEYS) || ((tabs[curtab] == TAB_TRADING) && sub && (sel0 != -1))) && (invlist.Size() > 1) ) + else if ( ((tabs[curtab] == TAB_INVENTORY) || (tabs[curtab] == TAB_KEYS)) && (invlist.Size() > 1) ) { MenuSound("menu/demoscroll"); ofs0 = ++sel0; if ( sel0 >= invlist.Size() ) ofs0 = sel0 = 0; } + else if ( ((tabs[curtab] == TAB_TRADING) && sub && (sel0 != -1)) && (invlist.Size() > 1) ) + { + MenuSound("menu/demoscroll"); + ofs1 = ++sel1; + if ( sel1 >= invlist.Size() ) ofs1 = sel1 = 0; + } else if ( (tabs[curtab] == TAB_STORE) && (storelist.Size() > 1) ) { MenuSound("menu/demoscroll"); @@ -659,12 +665,18 @@ Class DemolitionistMenu : GenericMenu } } } - else if ( ((tabs[curtab] == TAB_INVENTORY) || (tabs[curtab] == TAB_KEYS) || ((tabs[curtab] == TAB_TRADING) && sub && (sel0 != -1))) && (invlist.Size() > 1) ) + else if ( ((tabs[curtab] == TAB_INVENTORY) || (tabs[curtab] == TAB_KEYS)) && (invlist.Size() > 1) ) { MenuSound("menu/demoscroll"); ofs0 = --sel0; if ( sel0 < 0 ) ofs0 = sel0 = invlist.Size()-1; } + else if ( ((tabs[curtab] == TAB_TRADING) && sub && (sel0 != -1)) && (invlist.Size() > 1) ) + { + MenuSound("menu/demoscroll"); + ofs1 = --sel1; + if ( sel1 < 0 ) ofs1 = sel1 = invlist.Size()-1; + } else if ( (tabs[curtab] == TAB_STORE) && (storelist.Size() > 1) ) { MenuSound("menu/demoscroll"); @@ -703,13 +715,20 @@ Class DemolitionistMenu : GenericMenu MenuSound("menu/demoscroll"); } } - else if ( ((tabs[curtab] == TAB_INVENTORY) || (tabs[curtab] == TAB_KEYS) || ((tabs[curtab] == TAB_TRADING) && sub && (sel0 != -1))) && (invlist.Size() > 21) ) + else if ( ((tabs[curtab] == TAB_INVENTORY) || (tabs[curtab] == TAB_KEYS)) && (invlist.Size() > 21) ) { int oldsel = sel0; ofs0 = sel0 += 22; if ( sel0 >= invlist.Size() ) ofs0 = sel0 = invlist.Size()-1; if ( sel0 != oldsel ) MenuSound("menu/demoscroll"); } + else if ( ((tabs[curtab] == TAB_TRADING) && sub && (sel0 != -1)) && (invlist.Size() > 21) ) + { + int oldsel = sel1; + ofs1 = sel1 += 22; + if ( sel1 >= invlist.Size() ) ofs1 = sel1 = invlist.Size()-1; + if ( sel1 != oldsel ) MenuSound("menu/demoscroll"); + } else if ( (tabs[curtab] == TAB_STORE) && (storelist.Size() > 21) ) { int oldsel = sel0; @@ -752,11 +771,16 @@ Class DemolitionistMenu : GenericMenu MenuSound("menu/demoscroll"); } } - else if ( ((tabs[curtab] == TAB_INVENTORY) || (tabs[curtab] == TAB_KEYS) || ((tabs[curtab] == TAB_TRADING) && sub && (sel0 != -1))) && (invlist.Size() > 21) && (sel0-22 >= 0) ) + else if ( ((tabs[curtab] == TAB_INVENTORY) || (tabs[curtab] == TAB_KEYS)) && (invlist.Size() > 21) && (sel0-22 >= 0) ) { MenuSound("menu/demoscroll"); ofs0 = sel0 -= 22; } + else if ( ((tabs[curtab] == TAB_TRADING) && sub && (sel0 != -1)) && (invlist.Size() > 21) && (sel1-22 >= 0) ) + { + MenuSound("menu/demoscroll"); + ofs1 = sel1 -= 22; + } else if ( (tabs[curtab] == TAB_STORE) && (storelist.Size() > 21) && (sel0-22 >= 0) ) { MenuSound("menu/demoscroll"); @@ -2208,7 +2232,7 @@ Class DemolitionistMenu : GenericMenu override void Ticker() { Super.Ticker(); - if ( (players[consoleplayer].Health <= 0) || isclosing ) + if ( (gamestate != GS_LEVEL) || (players[consoleplayer].Health <= 0) || isclosing ) { // ded (or force close) EventHandler.SendNetworkEvent("swwmclearalltransactions",consoleplayer); @@ -2499,7 +2523,7 @@ Class DemolitionistMenu : GenericMenu // alphabetically sorted inventory for ( Inventory inv=players[consoleplayer].mo.Inv; inv; inv=inv.Inv ) { - if ( (inv.Amount <= 0) || !inv.SpawnState.ValidateSpriteFrame() || (inv is 'Key') || (inv is 'BasicArmor') || (inv is 'HexenArmor') || (inv is 'Powerup') || (inv is 'SWWMArmor') || (!(inv is 'Ammo') && !(inv is 'Weapon') && !inv.bINVBAR) && !(inv is 'HammerspaceEmbiggener') && !(inv is 'SWWMCollectible') && !(inv is 'MagAmmo') ) continue; + if ( (inv.Amount <= 0) || !inv.SpawnState.ValidateSpriteFrame() || (inv is 'Key') || (inv is 'BasicArmor') || (inv is 'HexenArmor') || (inv is 'Powerup') || (inv is 'SWWMArmor') || (!(inv is 'Ammo') && !(inv is 'Weapon') && !inv.bINVBAR) && !(inv is 'HammerspaceEmbiggener') && !(inv is 'SWWMCollectible') && !(inv is 'MagAmmo') || (inv is 'SWWMCollectible') ) continue; // no hidden weapons if ( (inv is 'SWWMWeapon') && SWWMWeapon(inv).bHIDEINMENU ) continue; String tag = inv.GetTag(); @@ -3147,7 +3171,7 @@ Class DemolitionistMenu : GenericMenu } } } - else if ( (tabs[curtab] == TAB_INVENTORY) || ((tabs[curtab] == TAB_TRADING) && sub && (sel0 != -1)) ) + else if ( tabs[curtab] == TAB_INVENTORY ) { if ( invlist.Size() <= 0 ) { @@ -3207,6 +3231,66 @@ Class DemolitionistMenu : GenericMenu Screen.DrawTexture(WindowSeparatorH,false,origin.x,origin.y+377,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true); } } + else if ( (tabs[curtab] == TAB_TRADING) && sub && (sel0 != -1) ) + { + if ( invlist.Size() <= 0 ) + { + str = StringTable.Localize("$SWWM_NOINV"); + Screen.DrawText(fnt,Font.CR_FIRE,origin.x+(640-fnt.StringWidth(str))/2,origin.y+(400-fnt.GetHeight())/2,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true); + return; + } + xx = 9; + yy = 23; + int longest, len; + int maxcol, totalcol, cols = 1; + // first pass, calculate longest item name + for ( int i=0; i 1) || (!(invlist[i] is 'PuzzleItem') && !(invlist[i] is 'Weapon') && (invlist[i].MaxAmount > 1)) ) str = String.Format("%dx %s",invlist[i].Amount,invlist[i].GetTag()); + else str = invlist[i].GetTag(); + len = fnt.StringWidth(str); + if ( len > longest ) longest = len; + } + maxcol = 622/(longest+24); + totalcol = int(ceil(invlist.Size()/22.)); + int ofs = int(max(0,(ofs0/22)-(maxcol-1))*22); + for ( int i=ofs; i 1) || (!(invlist[i] is 'PuzzleItem') && !(invlist[i] is 'Weapon') && (invlist[i].MaxAmount > 1)) ) str = String.Format("%dx %s",invlist[i].Amount,invlist[i].GetTag()); + else str = invlist[i].GetTag(); + int clscol = Font.CR_WHITE; + if ( invlist[i] is 'Weapon' ) clscol = Font.CR_GOLD; + else if ( invlist[i] is 'MagAmmo' ) clscol = Font.CR_TAN; + else if ( (invlist[i] is 'BackpackItem') || (invlist[i] is 'HammerspaceEmbiggener') ) clscol = Font.CR_DARKBROWN; + else if ( invlist[i] is 'Ammo' ) clscol = Font.CR_BROWN; + else if ( (invlist[i] is 'PowerupGiver') || (invlist[i] is 'AmmoFabricator') || invlist[i].bBIGPOWERUP ) clscol = Font.CR_PURPLE; + else if ( (invlist[i] is 'Health') || (invlist[i] is 'HealthPickup') || (invlist[i] is 'SWWMHealth') ) clscol = Font.CR_RED; + else if ( (invlist[i] is 'Armor') || (invlist[i] is 'SWWMSpareArmor') ) clscol = Font.CR_GREEN; + else if ( invlist[i] is 'PuzzleItem' ) clscol = Font.CR_LIGHTBLUE; + else if ( invlist[i] is 'SWWMCollectible' ) clscol = Font.CR_FIRE; + Screen.DrawText(fnt,clscol,origin.x+xx,origin.y+yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_ColorOverlay,(i!=sel1)?Color(96,0,0,0):Color(0,0,0,0)); + yy += 16; + if ( yy >= 370 ) + { + xx += longest+24; + yy = 23; + cols++; + if ( cols > maxcol ) break; + } + } + if ( maxcol < totalcol ) + { + // draw scrollbar + int szr = totalcol-maxcol; + xx = floor((ofs/22.)*(630./szr))+2.; + Screen.DrawText(TewiFont,Font.CR_FIRE,origin.x+xx,origin.y+373,"▬",DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true); + Screen.DrawTexture(WindowSeparatorH,false,origin.x,origin.y+377,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true); + } + } else if ( tabs[curtab] == TAB_KEYS ) { if ( invlist.Size() <= 0 )