From afa734aba6dd76f34998f49657a040314029573c Mon Sep 17 00:00:00 2001 From: Lemon-King Date: Sun, 16 Jun 2024 01:40:57 -0400 Subject: [PATCH] WIP: PWAD Mode Added supporting MarineStuff.wad from Realm667 to support DoomPlayer with Hexen Armor --- resources/assets/cvarinfo.hxdd | 4 +- .../assets/filter/game-doom/menudef.hxdd | 66 ++++ .../playersheets/clericplayer.playersheet | 7 +- .../playersheets/doomplayer.playersheet | 172 ++++++++++ .../playersheets/fighterplayer.playersheet | 7 +- .../playersheets/hereticplayer.playersheet | 24 +- .../hx2assassinplayer.playersheet | 24 ++ .../hx2crusaderplayer.playersheet | 5 + .../playersheets/hx2paladinplayer.playersheet | 24 ++ .../hx2succubusplayer.playersheet | 24 ++ .../playersheets/mageplayer.playersheet | 7 +- resources/assets/trnslate.hxdd | 5 + resources/assets/zscript/actors/_actors.zs | 1 + .../zscript/actors/hxdd/items/doomarmor.zs | 98 ++++++ .../zscript/actors/hxdd/shared/_shared.zs | 1 + .../actors/hxdd/shared/inventory/hxddarmor.zs | 321 ++++++++++++++++++ .../hxdd/shared/inventory/progression.zs | 171 ++++++++-- .../assets/zscript/lib/xgametranslation.zs | 22 +- resources/assets/zscript/menu/newgame.zs | 2 +- resources/realm667/MarineStuff.wad | Bin 0 -> 3582 bytes .../java/lemon/hxdd/builder/MetaFile.java | 18 +- .../lemon/hxdd/builder/PackageBuilder.java | 42 +++ 22 files changed, 978 insertions(+), 67 deletions(-) create mode 100644 resources/assets/filter/game-doom/menudef.hxdd create mode 100644 resources/assets/playersheets/doomplayer.playersheet create mode 100644 resources/assets/trnslate.hxdd create mode 100644 resources/assets/zscript/actors/hxdd/items/doomarmor.zs create mode 100644 resources/assets/zscript/actors/hxdd/shared/inventory/hxddarmor.zs create mode 100644 resources/realm667/MarineStuff.wad diff --git a/resources/assets/cvarinfo.hxdd b/resources/assets/cvarinfo.hxdd index 2054af6..869d5f4 100644 --- a/resources/assets/cvarinfo.hxdd +++ b/resources/assets/cvarinfo.hxdd @@ -5,7 +5,7 @@ server noarchive latch bool hxdd_multipickup_singlemode = true; server noarchive latch int hxdd_gamemode = 0; // Progression -server noarchive latch int hxdd_progression = 0; // 0 = Default +server noarchive int hxdd_progression = 0; // 0 = Default server int hxdd_progression_user_level_0 = 800; server int hxdd_progression_user_level_1 = 1600; @@ -50,7 +50,7 @@ server int hxdd_armor_user_3 = 20; server int hxdd_armor_user_4 = 10; // Armor Mode -server noarchive latch int hxdd_armor_mode = 0; // 0 = Default +server noarchive int hxdd_armor_mode = 0; // 0 = Default // Hexen egg artwork (Gold) user bool hxdd_hexen_artiegg = false; diff --git a/resources/assets/filter/game-doom/menudef.hxdd b/resources/assets/filter/game-doom/menudef.hxdd new file mode 100644 index 0000000..be358b7 --- /dev/null +++ b/resources/assets/filter/game-doom/menudef.hxdd @@ -0,0 +1,66 @@ +// Main Menu +DEFAULTLISTMENU +{ + Font "BigFontX", "DarkGray" + LineSpacing 20 + + Selector "M_SLCTR1", -28, -1 +} + +LISTMENU "MainMenu" { + StaticPatch 88, 2, "assets/ui/M_HXDD.png" + StaticPatch 68, 68, "KGZ1A0" + StaticPatch 250, 68, "KGZ1A0" + StaticPatch 58, 2, "assets/ui/M_UI_ORB.png" + StaticPatch 240, 2, "assets/ui/M_UI_ORB.png" + Position 110, 66 + + TextItem "$MNU_NEWGAME", "n", "HXDDNewGameConfig" + TextItem "$MNU_OPTIONS", "o", "OptionsMenu" + TextItem "$MNU_GAMEFILES", "g", "GameFilesMenu" + TextItem "$MNU_INFO", "i", "ReadThisMenu" + TextItem "$MNU_QUITGAME", "q", "QuitMenu" + + font "SMALLFONT", "DarkGray" + StaticText -52, 190, "$HXDD_BUILD_VERSION" +} + + + +OptionValue "HXDD_Playstyle_Progression_DOOM_PH" +{ + 0, "Default" + 1, "None (Heretic & Hexen)" + 2, "Levels (Hexen II)" +} + +OptionValue "HXDD_Playstyle_ArmorMode_DOOM_PH" +{ + 0, "Default" + 1, "Heretic (Simple)" + 2, "Hexen & Hexen II (Class Defined)" +} + +OptionMenu "HXDDNewGameConfig" +{ + StaticText "" + Title "New Game" + Caption "Game Options" + StaticText "" + StaticText "" + StaticText "-Armor Mode-", "Tan" + StaticText "Default: Class Based", "Grey" + StaticText "Heretic: Traditional Armor System from Heretic", "Grey" + StaticText "Hexen & Hexen II: Uses the Armor Class system found in Hexen and Hexen II", "Grey" + Option "Armor Type", "hxdd_armor_mode", "HXDD_Playstyle_ArmorMode_DOOM_PH" + StaticText "" + StaticText "" + StaticText "-Progression-", "Tan" + StaticText "Default: Uses whichever system the Class originated with.", "Grey" + StaticText "None: No Leveling", "Grey" + StaticText "Leveling: Hexen II leveling system", "Grey" + Option "Progression", "hxdd_progression", "HXDD_Playstyle_Progression_DOOM_PH" + StaticText "" + StaticText "" + Submenu "Select Class", "PlayerclassMenu" +} \ No newline at end of file diff --git a/resources/assets/playersheets/clericplayer.playersheet b/resources/assets/playersheets/clericplayer.playersheet index 82e434b..3f72a27 100644 --- a/resources/assets/playersheets/clericplayer.playersheet +++ b/resources/assets/playersheets/clericplayer.playersheet @@ -15,6 +15,11 @@ "dexterity": [6,10] }, "xgame": { + "GreenArmor": "PlatinumHelm,MeshArmor", + "BlueArmor": "AmuletOfWarding,FalconShield", + "SilverShield": "PlatinumHelm,MeshArmor", + "EnchantedShield": "AmuletOfWarding,FalconShield", + "Fist": "Mana1", "Chainsaw": "CWeaponPiece3", "Pistol": "Mana1", @@ -39,8 +44,6 @@ "Medikit": "ArtiHealth", "ArmorBonus": "ArtiPoisonBag", - "GreenArmor": "PlatinumHelm,MeshArmor", - "BlueArmor": "AmuletOfWarding,FalconShield", "InvulnerabilitySphere": "ArtiInvulnerability2", "Soulsphere": "ArtiSuperHealth", diff --git a/resources/assets/playersheets/doomplayer.playersheet b/resources/assets/playersheets/doomplayer.playersheet new file mode 100644 index 0000000..105b407 --- /dev/null +++ b/resources/assets/playersheets/doomplayer.playersheet @@ -0,0 +1,172 @@ +{ + "class": "DoomPlayer", + "armor_type": "simple", + "progression_type": "none", + "alignment": "good", + "max_level": 20, + "experience": [675,1600,3750,7250,15000,28500,52000,86000,110000,150000,150000], + "health": [65,75,5,10,3,150], + "resource": [80,90,5,10,3,200], + "ac": [0, 15, 15, 15, 15], + "hx2armor": { + "static": 0, + "items": { + "pickup_class_name": 5 + } + }, + "stats": { + "strength": [15,18], + "intelligence": [12,15], + "wisdom": [10,13], + "dexterity": [12,15], + "rage": [15, 18], + }, + "xgame": { + "SilverShield": { + "cvar": "hxdd_armor_mode", + "equals": 2, + "true": ["HXDDHeavyBoots", "HXDDUnderArmor"], + "false": "GreenArmor" + }, + "EnchantedShield": { + "cvar": "hxdd_armor_mode", + "equals": 2, + "true": ["HXDDCombatHelm", "HXDDBodyArmor"], + "false": "BlueArmor" + }, + "GreenArmor": { + "cvar": "hxdd_armor_mode", + "equals": 2, + "true": ["HXDDHeavyBoots", "HXDDUnderArmor"], + "false": "GreenArmor" + }, + "BlueArmor": { + "cvar": "hxdd_armor_mode", + "equals": 2, + "true": ["HXDDCombatHelm", "HXDDBodyArmor"], + "false": "BlueArmor" + }, + "MeshArmor": { + "cvar": "hxdd_armor_mode", + "equals": 1, + "true": "GreenArmor", + "false": "HXDDBodyArmor" + }, + "PlatinumHelm": { + "cvar": "hxdd_armor_mode", + "equals": 1, + "true": "GreenArmor", + "false": "HXDDCombatHelm" + }, + "AmuletOfWarding": { + "cvar": "hxdd_armor_mode", + "equals": 1, + "true": "BlueArmor", + "false": "HXDDUnderArmor" + }, + "FalconShield": { + "cvar": "hxdd_armor_mode", + "equals": 1, + "true": "BlueArmor", + "false": "HXDDHeavyBoots" + }, + "ArmorBonus": { + "cvar": "hxdd_armor_mode", + "equals": 2, + "true": "none", + "false": "ArmorBonus" + }, + + "CrystalVial": "Stimpack", + "ArtiHealth": "Medikit", + + "ArtiTimeBomb": "ArmorBonus,HealthBonus", + + "ArtiInvulnerability": "InvulnerabilitySphere", + "ArtiSuperHealth": "Soulsphere", + "ArtiTomeOfPower": "Megasphere", + "ArtiEgg": "BlurSphere", + "ArtiInvisibility": "BlurSphere", + "ArtiTeleport": "RadSuit", + "ArtiTorch": "Infrared", + "SuperMap": "Allmap", + "ArtiTomeOfPower": "Berserk", + + "BagOfHolding": "Backpack", + + "Staff": "Fist", + "Gauntlets": "Chainsaw", + "GoldWand": "Pistol", + "Crossbow": "Shotgun,SuperShotgun", + "Blaster": "Chaingun", + "PhoenixRod": "RocketLauncher", + "SkullRod": "PlasmaRifle", + "Mace": "BFG9000", + + "GoldWandAmmo": "Clip", + "BlasterAmmo": "Clip", + "GoldWandHefty": "ClipBox", + "BlasterHefty": "ClipBox", + "CrossbowAmmo": "Shell", + "CrossbowHefty": "ShellBox", + "PhoenixRodAmmo": "RocketAmmo", + "PhoenixRodHefty": "RocketBox", + "SkullRodAmmo": "Cell", + "SkullRodHefty": "CellPack", + "MaceAmmo": "Cell", + "MaceHefty": "CellPack", + + "FWeapAxe": "Shotgun,SuperShotgun", + "CWeapStaff": "Crossbow", + "MWeapFrost": "CrossbowHefty", + + "FWeapHammer": "Chaingun", + "CWeapFlame": "SkullRod", + "MWeapLightning": "PhoenixRod", + + "FWeaponPiece1": "RocketLauncher", + "FWeaponPiece2": "none", + "FWeaponPiece3": "none", + + "CWeaponPiece1": "none", + "CWeaponPiece2": "PlasmaRifle", + "CWeaponPiece3": "none", + + "MWeaponPiece1": "BFG9000", + "MWeaponPiece2": "none", + "MWeaponPiece3": "none", + + "ArtiHealth": "Soulsphere", + "ArtiBoostMana": "Backpack", + "ArtiBoostArmor": { + "cvar": "hxdd_armor_mode", + "equals": 2, + "true": "ArtiBoostArmor", + "false": "Berserk" + }, + "Mana1": "Clip,ClipBox,Shell,ShellBox", + "Mana2": "Cell,RocketAmmo", + "Mana3": "CellPack,RocketBox", + + "ArtiDarkServant": "Berserk", + "ArtiPoisonBag": "ArmorBonus,HealthBonus", + "ArtiInvulnerability2": "InvulnerabilitySphere", + "ArtiPork": "ArmorBonus,HealthBonus", + "ArtiFly": "BlurSphere", + "ArtiTeleport": "ArmorBonus,HealthBonus", + "ArtiTeleportOther": "ArmorBonus,HealthBonus", + "ArtiSpeedBoots": "ArmorBonus,HealthBonus", + "ArtiBlastRadius": "ArmorBonus,HealthBonus" + }, + "game_type_damage_scale": { + "doom": 1.0, + "heretic": 1.0, + "hexen": 1.5 + }, + "xp_bonus_stat": "rage", + "use_max_health_scaler": false, + "skill_modifier": [], + "xp_modifier": 1.0, + "halve_xp_before_level_4": true, + "event_handler": false +} \ No newline at end of file diff --git a/resources/assets/playersheets/fighterplayer.playersheet b/resources/assets/playersheets/fighterplayer.playersheet index 6caf331..cc4d1fa 100644 --- a/resources/assets/playersheets/fighterplayer.playersheet +++ b/resources/assets/playersheets/fighterplayer.playersheet @@ -15,6 +15,11 @@ "dexterity": [10,13], }, "xgame": { + "GreenArmor": "AmuletOfWarding,PlatinumHelm", + "BlueArmor": "FalconShield,MeshArmor", + "SilverShield": "AmuletOfWarding,PlatinumHelm", + "EnchantedShield": "FalconShield,MeshArmor", + "Fist": "Mana1", "Chainsaw": "FWeaponPiece3", "Pistol": "Mana1", @@ -39,8 +44,6 @@ "Medikit": "ArtiHealth", "ArmorBonus": "ArtiPoisonBag", - "GreenArmor": "AmuletOfWarding,PlatinumHelm", - "BlueArmor": "FalconShield,MeshArmor", "InvulnerabilitySphere": "ArtiInvulnerability2", "Soulsphere": "ArtiSuperHealth", diff --git a/resources/assets/playersheets/hereticplayer.playersheet b/resources/assets/playersheets/hereticplayer.playersheet index 1109892..29d1db1 100644 --- a/resources/assets/playersheets/hereticplayer.playersheet +++ b/resources/assets/playersheets/hereticplayer.playersheet @@ -27,6 +27,18 @@ "true": ["AmuletOfWarding", "FalconShield"], "false": "EnchantedShield" }, + "GreenArmor": { + "cvar": "hxdd_armor_mode", + "equals": 2, + "true": ["MeshArmor", "PlatinumHelm"], + "false": "SilverShield" + }, + "BlueArmor": { + "cvar": "hxdd_armor_mode", + "equals": 2, + "true": ["AmuletOfWarding", "FalconShield"], + "false": "EnchantedShield" + }, "Fist": "Staff", "Chainsaw": "Gauntlets", @@ -52,18 +64,6 @@ "Medikit": "ArtiHealth", "ArmorBonus": "ArtiTimeBomb", - "GreenArmor": { - "cvar": "hxdd_armor_mode", - "equals": 2, - "true": ["MeshArmor", "PlatinumHelm"], - "false": "SilverShield" - }, - "BlueArmor": { - "cvar": "hxdd_armor_mode", - "equals": 2, - "true": ["AmuletOfWarding", "FalconShield"], - "false": "EnchantedShield" - }, "InvulnerabilitySphere": "ArtiInvulnerability", "Soulsphere": "ArtiSuperHealth", diff --git a/resources/assets/playersheets/hx2assassinplayer.playersheet b/resources/assets/playersheets/hx2assassinplayer.playersheet index e9834c5..a3630ba 100644 --- a/resources/assets/playersheets/hx2assassinplayer.playersheet +++ b/resources/assets/playersheets/hx2assassinplayer.playersheet @@ -15,6 +15,30 @@ "dexterity": [15,18] }, "xgame": { + "GreenArmor": "PlatinumHelm,MeshArmor", + "BlueArmor": "AmuletOfWarding,FalconShield", + "SilverShield": "PlatinumHelm,MeshArmor", + "EnchantedShield": "AmuletOfWarding,FalconShield", + + "Fist": "Mana1", + "Chainsaw": "Mana3", + "Pistol": "Mana1", + "Shotgun": "AWeapCrossbow", + "SuperShotgun": "AWeapGrenades", + "Chaingun": "AWeapCrossbow", + "RocketLauncher": "Mana3", + "PlasmaRifle": "AWeapGrenades", + "BFG9000": "Mana3", + + "Clip": "none", + "ClipBox": "Mana3", + "Shell": "Mana1", + "ShellBox": "Mana3", + "RocketAmmo": "Mana2", + "RocketBox": "Mana3", + "Cell": "Mana2", + "CellPack": "Mana3", + "GoldWandAmmo": "none", "GoldWandHefty": "Mana1", diff --git a/resources/assets/playersheets/hx2crusaderplayer.playersheet b/resources/assets/playersheets/hx2crusaderplayer.playersheet index 0199685..78b888a 100644 --- a/resources/assets/playersheets/hx2crusaderplayer.playersheet +++ b/resources/assets/playersheets/hx2crusaderplayer.playersheet @@ -15,6 +15,11 @@ "dexterity": [6,10] }, "xgame": { + "GreenArmor": "FalconShield,AmuletOfWarding", + "BlueArmor": "PlatinumHelm,MeshArmor", + "SilverShield": "FalconShield,AmuletOfWarding", + "EnchantedShield": "PlatinumHelm,MeshArmor", + "GoldWandAmmo": "none", "GoldWandHefty": "Mana1", diff --git a/resources/assets/playersheets/hx2paladinplayer.playersheet b/resources/assets/playersheets/hx2paladinplayer.playersheet index ea6de68..2318445 100644 --- a/resources/assets/playersheets/hx2paladinplayer.playersheet +++ b/resources/assets/playersheets/hx2paladinplayer.playersheet @@ -15,6 +15,30 @@ "dexterity": [10,13] }, "xgame": { + "GreenArmor": "PlatinumHelm,MeshArmor", + "BlueArmor": "AmuletOfWarding,FalconShield", + "SilverShield": "PlatinumHelm,MeshArmor", + "EnchantedShield": "AmuletOfWarding,FalconShield", + + "Fist": "Mana1", + "Chainsaw": "PWeapPurifierPiece2", + "Pistol": "Mana1", + "Shotgun": "PWeapVorpalSword", + "SuperShotgun": "PWeapAxe", + "Chaingun": "PWeapVorpalSword", + "RocketLauncher": "Mana3", + "PlasmaRifle": "PWeapAxe", + "BFG9000": "PWeapPurifierPiece1", + + "Clip": "none", + "ClipBox": "Mana3", + "Shell": "Mana1", + "ShellBox": "Mana3", + "RocketAmmo": "Mana2", + "RocketBox": "Mana3", + "Cell": "Mana2", + "CellPack": "Mana3", + "GoldWandAmmo": "none", "GoldWandHefty": "Mana1", diff --git a/resources/assets/playersheets/hx2succubusplayer.playersheet b/resources/assets/playersheets/hx2succubusplayer.playersheet index 1579408..9906716 100644 --- a/resources/assets/playersheets/hx2succubusplayer.playersheet +++ b/resources/assets/playersheets/hx2succubusplayer.playersheet @@ -15,6 +15,30 @@ "dexterity": [9,13] }, "xgame": { + "GreenArmor": "MeshArmor,PlatinumHelm", + "BlueArmor": "FalconShield,AmuletOfWarding", + "SilverShield": "MeshArmor,PlatinumHelm", + "EnchantedShield": "FalconShield,AmuletOfWarding", + + "Fist": "Mana1", + "Chainsaw": "SWeapTempestStaffPiece2", + "Pistol": "Mana1", + "Shotgun": "SWeapAcidRune", + "SuperShotgun": "AWeapGrenades", + "Chaingun": "SWeapAcidRune", + "RocketLauncher": "Mana3", + "PlasmaRifle": "SWeapFireStorm", + "BFG9000": "SWeapTempestStaffPiece1", + + "Clip": "none", + "ClipBox": "Mana3", + "Shell": "Mana1", + "ShellBox": "Mana3", + "RocketAmmo": "Mana2", + "RocketBox": "Mana3", + "Cell": "Mana2", + "CellPack": "Mana3", + "GoldWandAmmo": "none", "GoldWandHefty": "Mana1", diff --git a/resources/assets/playersheets/mageplayer.playersheet b/resources/assets/playersheets/mageplayer.playersheet index 9b8cef4..516fa45 100644 --- a/resources/assets/playersheets/mageplayer.playersheet +++ b/resources/assets/playersheets/mageplayer.playersheet @@ -15,6 +15,11 @@ "dexterity": [8,12] }, "xgame": { + "GreenArmor": "PlatinumHelm,MeshArmor", + "BlueArmor": "AmuletOfWarding,FalconShield", + "SilverShield": "PlatinumHelm,MeshArmor", + "EnchantedShield": "AmuletOfWarding,FalconShield", + "Fist": "Mana1", "Chainsaw": "MWeaponPiece3", "Pistol": "Mana1", @@ -39,8 +44,6 @@ "Medikit": "ArtiHealth", "ArmorBonus": "ArtiPoisonBag", - "GreenArmor": "MeshArmor,PlatinumHelm", - "BlueArmor": "FalconShield,AmuletOfWarding", "InvulnerabilitySphere": "ArtiInvulnerability2", "Soulsphere": "ArtiSuperHealth", diff --git a/resources/assets/trnslate.hxdd b/resources/assets/trnslate.hxdd new file mode 100644 index 0000000..2ae3e42 --- /dev/null +++ b/resources/assets/trnslate.hxdd @@ -0,0 +1,5 @@ +HXDD_ArmorMode_HX_Doom_Helm_Placeholder = "112:127=176:191", "152:159=160:167" +HXDD_ArmorMode_HX_Doom_Helm_Frame1 = "80:108=112:127" +HXDD_ArmorMode_HX_Doom_Helm_Frame2 = "80:108=119:127" +HXDD_ArmorMode_HX_Doom_UnderArmor_Frame2 = "112:127=119:127" +HXDD_ArmorMode_HX_Doom_Boots_Frame2 = "152:159=153:159", "144:151=146:151", "128:143=131:143" \ No newline at end of file diff --git a/resources/assets/zscript/actors/_actors.zs b/resources/assets/zscript/actors/_actors.zs index 7d0155e..21e5508 100644 --- a/resources/assets/zscript/actors/_actors.zs +++ b/resources/assets/zscript/actors/_actors.zs @@ -1,6 +1,7 @@ #include "zscript/actors/hxdd/shared/_shared.zs" // Player Weapons and Ammo +#include "zscript/actors/hxdd/items/doomarmor.zs" //#include "zscript/actors/hxdd/items/compatabilityitems.zs" //#include "zscript/actors/hxdd/items/hereticammo.zs" #include "zscript/actors/hxdd/items/hereticarmor.zs" diff --git a/resources/assets/zscript/actors/hxdd/items/doomarmor.zs b/resources/assets/zscript/actors/hxdd/items/doomarmor.zs new file mode 100644 index 0000000..08a6647 --- /dev/null +++ b/resources/assets/zscript/actors/hxdd/items/doomarmor.zs @@ -0,0 +1,98 @@ + +class HXDDBodyArmorTest : HXDDArmor { + Default { + +NOGRAVITY + Health 100; // Armor class + HXDDArmor.SavePercent 15; + HXDDArmor.SaveAmount 25; + HXDDArmor.Type "hexen2"; + + Inventory.Amount 0; + Inventory.PickupMessage "[PH] Body Armor"; + } + States { + Spawn: + ARM1 A 6 A_SetTranslation("HXDD_ArmorMode_HX_Doom_Helm_Placeholder"); + ARM1 B 6 bright A_SetTranslation("none"); + loop; + } +} + +class HXDDBodyArmorTest2 : HXDDArmor { + Default { + +NOGRAVITY + Health 100; // Armor class + HXDDArmor.SavePercent 15; + HXDDArmor.SaveAmount 30; + HXDDArmor.type "hexen2"; + + Inventory.Amount 0; + Inventory.PickupMessage "[PH] Body Armor"; + } + States { + Spawn: + ARM1 A 6 A_SetTranslation("HXDD_ArmorMode_HX_Doom_Helm_Placeholder"); + ARM1 B 6 bright A_SetTranslation("none"); + loop; + } +} + +class HXDDBodyArmor : HexenArmor { + Default { + +NOGRAVITY + Health 0; // Armor class + Inventory.Amount 0; + Inventory.PickupMessage "[PH] Body Armor"; + } + States { + Spawn: + ARM2 A 6; + ARM2 B 6 bright; + loop; + } +} + +class HXDDHeavyBoots : HexenArmor { + Default { + +NOGRAVITY + Health 1; // Armor class + Inventory.Amount 0; + Inventory.PickupMessage "[PH] Heavy Boots"; + } + States { + Spawn: + BOOT A 6 A_SetTranslation("none"); + BOOT A 6 Bright A_SetTranslation("HXDD_ArmorMode_HX_Doom_Boots_Frame2"); + loop; + } +} + +class HXDDCombatHelm : HexenArmor { + Default { + +NOGRAVITY + Health 2; // Armor class + Inventory.Amount 0; + Inventory.PickupMessage "[PH] Combat Helm"; + } + States { + Spawn: + AHLM A 6 A_SetTranslation("HXDD_ArmorMode_HX_Doom_Helm_Frame1"); + AHLM A 6 Bright A_SetTranslation("HXDD_ArmorMode_HX_Doom_Helm_Frame2"); + loop; + } +} + +class HXDDUnderArmor : HexenArmor { + Default { + +NOGRAVITY + Health 3; // Armor class + Inventory.Amount 0; + Inventory.PickupMessage "[PH] Underarmor"; + } + States { + Spawn: + UNIF A 6 A_SetTranslation("none"); + UNIF A 6 Bright A_SetTranslation("HXDD_ArmorMode_HX_Doom_UnderArmor_Frame2"); + loop; + } +} diff --git a/resources/assets/zscript/actors/hxdd/shared/_shared.zs b/resources/assets/zscript/actors/hxdd/shared/_shared.zs index 0bfafc3..e7682be 100644 --- a/resources/assets/zscript/actors/hxdd/shared/_shared.zs +++ b/resources/assets/zscript/actors/hxdd/shared/_shared.zs @@ -4,6 +4,7 @@ #include "zscript/actors/hxdd/shared/mixins/attachedactors.zs" #include "zscript/actors/hxdd/shared/inventory/gamemodecompat.zs" +#include "zscript/actors/hxdd/shared/inventory/hxddarmor.zs" #include "zscript/actors/hxdd/shared/inventory/multipickup.zs" #include "zscript/actors/hxdd/shared/inventory/progression.zs" #include "zscript/actors/hxdd/shared/inventory/recoilcontroller.zs" diff --git a/resources/assets/zscript/actors/hxdd/shared/inventory/hxddarmor.zs b/resources/assets/zscript/actors/hxdd/shared/inventory/hxddarmor.zs new file mode 100644 index 0000000..ae15892 --- /dev/null +++ b/resources/assets/zscript/actors/hxdd/shared/inventory/hxddarmor.zs @@ -0,0 +1,321 @@ + +// REF: +// HX2 Armor Calc: https://github.com/videogamepreservation/hexen2/blob/master/H2MP/hcode/damage.hc#L661 + + +class HXDDArmorSlot { + String name; + String type; + int current; + int saveAmount; + double savePercent; + bool isAdditive; + bool isStatic; + + void Init(HXDDArmor item) { + self.name = item.GetClassName(); + self.type = item.type; + self.saveAmount = item.SaveAmount; + self.savePercent = item.SavePercent; + self.isAdditive = item.IsAdditive; + if (self.isAdditive) { + self.Add(); + } else { + self.Reset(); + } + } + + void InitFromProgression() { + // TODO + } + + void Add() { + self.current += self.saveAmount; + } + + void Reset() { + self.current = self.saveAmount; + } + + void Zero() { + self.current = 0; + } + + void ReduceBy(int value) { + self.current = max(0, self.current - value); + } + + int GetTotal() { + return self.saveAmount; + } + + int GetCurrent() { + return self.current; + } + + bool isDamaged() { + if (self.isAdditive) { + return false; + } + return self.current < self.saveAmount; + } + + bool canProtect() { + return self.current > 0; + } + + void SetIsStatic() { + self.isStatic = true; + } + + String GetName() { + return self.name; + } + + bool isType(String type) { + return self.type == type; + } +} + +class HXDDArmor : Armor { + String type; + double SavePercent; + int SaveAmount; + bool IsAdditive; + + property type: Type; + property SaveAmount: SaveAmount; + property SavePercent: SavePercent; + property IsAdditive: IsAdditive; + + Map Slots; + + Default + { + +Inventory.KEEPDEPLETED + +Inventory.UNTOSSABLE + } + + //=========================================================================== + // + // AHexenArmor :: CreateCopy + // + //=========================================================================== + + override Inventory CreateCopy(Actor other) { + // Like BasicArmor, HexenArmor is used in the inventory but not the map. + // health is the slot this armor occupies. + // Amount is the quantity to give (0 = normal max). + let copy = HXDDArmor(Spawn("HXDDArmor")); + console.printf("CreateCopy %s", copy.GetClassName()); + copy.AddArmorToSlot(self); + GoAwayAndDie(); + return copy; + } + + //=========================================================================== + // + // AHexenArmor :: CreateTossable + // + // Since this isn't really a single item, you can't drop it. Ever. + // + //=========================================================================== + + override Inventory CreateTossable (int amount) { + return NULL; + } + + //=========================================================================== + // + // AHexenArmor :: HandlePickup + // + //=========================================================================== + + override bool HandlePickup (Inventory item) { + if (item is "HexenArmor") { + console.printf("HandlePickup T %s", item.GetClassName()); + } + if (item is "HXDDArmor") { + HXDDArmor armor = HXDDArmor(item); + console.printf("HandlePickup %s", armor.GetClassName()); + if (self.AddArmorToSlot(armor)) { + console.printf("HandlePickup T %s", armor.GetClassName()); + item.bPickupGood = true; + } + return true; + } + return false; + } + + //=========================================================================== + // + // AHexenArmor :: AddArmorToSlot + // + //=========================================================================== + + bool AddArmorToSlot(HXDDArmor item) { + String name = item.GetClassName(); + bool exists = self.Slots.CheckKey(name); + if (!exists) { + let slot = new("HXDDArmorSlot"); + slot.Init(item); + self.AddArmorType(slot); + console.printf("New, Init, %s", self.GetClassName()); + return true; + } + let slot = self.Slots.Get(name); + if (slot.isAdditive) { + slot.Add(); + return true; + } else if (slot.isDamaged()) { + slot.Reset(); + console.printf("Damaged, reset"); + return true; + } else { + } + return false; + } + + //=========================================================================== + // + // AHexenArmor :: AbsorbDamage + // + //=========================================================================== + + override void AbsorbDamage (int damage, Name damageType, out int newdamage, Actor inflictor, Actor source, int flags) { + if (!DamageTypeDefinition.IgnoreArmor(damageType)) { + int saved = 0; + + // Doom / Heretic / Strife Armor Calc + int totalBasic = self.GetBasic(); + if (totalBasic) { + // NYI + } + + // Hexen Armor Calc + int totalHX = self.GetHX(); + int savedPercent = min(self.GetHX(true), 100); + if (savedPercent) { + foreach (type, slot : self.Slots) { + if (!slot.isType("hexen") || slot.isStatic || !slot.canProtect()) { + continue; + } + if (damage < 10000) { + slot.ReduceBy(damage * slot.GetTotal() / 300.0); + } else { + slot.Zero(); + } + } + saved =+ int(damage * savedPercent / 100.0); + if (saved > savedPercent*2) { + saved = int(savedPercent*2); + } + console.printf("Damage: %d New: %d Saved: %d", damage, damage - saved, saved); + } + + // Hexen II Armor Calc + int countHX2Peices = self.GetHX2Peices(); + if (countHX2Peices > 0 && damage > 0) { + console.printf("incoming %d", damage); + double totalHX2Armor = GetHX2(); + console.printf("totalHX2Armor %d, countHX2Peices %d", totalHX2Armor, countHX2Peices); + Progression itemProgression = Progression(Owner.FindInventory("Progression")); + if (itemProgression) { + totalHX2Armor += itemProgression.currlevel * .001; + } + double armor_damage = (totalHX2Armor * .01) * damage; + console.printf("armor_damage %d", armor_damage); + if (armor_damage > self.GetHX2(true)) { + console.printf("zero'd?"); + foreach (type, slot : self.Slots) { + if (slot.isType("hexen") && slot.canProtect()) { + slot.Zero(); + } + } + } else { + int armorSave = armor_damage / countHX2Peices; + + console.printf("armor_damage %d, armorSave %d", armor_damage, armorSave); + foreach (type, slot : self.Slots) { + if (slot.isType("hexen2") && slot.canProtect()) { + slot.ReduceBy(armorSave); + saved += armorSave; + console.printf("type %s, damage %d, saved %d", type, armorSave, saved); + } + } + } + } + + if (saved) { + newdamage -= saved; + damage = newdamage; + console.printf("outgoing %d", newdamage); + } + } + } + + //=========================================================================== + // + // AHexenArmor :: DepleteOrDestroy + // + //=========================================================================== + + override void DepleteOrDestroy() { + self.Slots.Clear(); + } + + void AddArmorType(HXDDArmorSlot slot) { + self.Slots.Insert(slot.name, slot); + console.printf("AddArmorType %s", slot.name); + } + + int GetTotal() { + int total = 0; + foreach (slot : self.Slots) { + total += slot.GetTotal(); + } + return total; + } + + int GetBasic(bool getRemaining = false) { + int total = 0; + foreach (slot : self.Slots) { + if (slot.isType("basic")) { + total += getRemaining ? slot.GetCurrent() : slot.GetTotal(); + } + } + return total; + } + + int GetHX(bool getRemaining = false) { + int total = 0; + foreach (slot : self.Slots) { + if (slot.isType("hexen")) { + total += getRemaining ? slot.GetCurrent() : slot.GetTotal(); + } + } + return total; + } + + int GetHX2(bool getRemaining = false) { + int total = 0; + foreach (slot : self.Slots) { + if (slot.isType("hexen2")) { + total += getRemaining ? slot.GetCurrent() : slot.GetTotal(); + } + } + return total; + } + + int GetHX2Peices() { + int count = 0; + foreach (slot : self.Slots) { + if (slot.isType("hexen2")) { + if (slot.current > 0) { + count++; + } + } + } + return count; + } +} diff --git a/resources/assets/zscript/actors/hxdd/shared/inventory/progression.zs b/resources/assets/zscript/actors/hxdd/shared/inventory/progression.zs index 66623e6..8e761f3 100644 --- a/resources/assets/zscript/actors/hxdd/shared/inventory/progression.zs +++ b/resources/assets/zscript/actors/hxdd/shared/inventory/progression.zs @@ -58,10 +58,22 @@ class PlayerSheetEventHandler: EventHandler { } } +/* +class PlayerSheetStatParams { + int start_min; // Starting Min + int start_max; // Starting Max + int inc_min; // Compute Min + int inc_max; // Compute Max + int inc; // Compute Max Level + int maximum; // Maximum Stat Value +} +*/ + class PlayerSheetStat { String name; Array table; double value; + bool useScale; double stat_compute(double min, double max) { double value = (max-min+1) * frandom[sheetstat](0.0, 1.0) + min; @@ -92,10 +104,12 @@ class PlayerSheetStat { } } +/* class PlayerSheetResource { Array resourceTable; bool useScale; } +*/ class PlayerSheetJSON { bool IsLoaded; @@ -120,12 +134,14 @@ class PlayerSheetJSON { Array resourceTable; Array hexenArmorTable; bool hasHexenArmorTable; - + String xp_bonus_stat; - Map resources; // per resource + //Map resources; // per resource Map stats; + String soundLevelUp; + int GetEnumFromArmorType(String type) { Array keys = {"ac", "armor", "armorclass", "hexen", "hx", "hx2"}; if (keys.Find(type) != keys.Size()) { @@ -229,8 +245,19 @@ class PlayerSheetJSON { valHexenArmorTable = FileJSON.GetArray(jsonObject, "hxarmor"); // alt } + HXDD_JsonObject valHXDDArmor = HXDD_JsonObject(jsonObject.get("ac")); + if (valHXDDArmor) { + // TODO: Improved Armor Slot System + } + // Dynamic User Defined Stats HXDD_JsonObject objStats = HXDD_JsonObject(jsonObject.get("stats")); + if (!objStats) { + objStats = HXDD_JsonObject(jsonObject.get("attributes")); + } + if (!objStats) { + objStats = HXDD_JsonObject(jsonObject.get("attr")); + } if (objStats) { Array keys; objStats.GetKeysInto(keys); @@ -267,7 +294,10 @@ class PlayerSheetJSON { self.xp_bonus_stat = valXPStat; } - let valUsesEventHandler = FileJSON.GetBool(jsonObject, "event_handler"); + let valUsesEventHandler = FileJSON.GetBool(jsonObject, "event_handler"); + + + String valSoundLevelUp = FileJSON.GetString(jsonObject, "levelup_sfx"); // TODO: Setup Item Class Table Here for MultiClassItem Refactor @@ -283,6 +313,8 @@ class PlayerSheetJSON { self.UsesEventHandler = valUsesEventHandler; + self.soundLevelUp = valSoundLevelUp; + if (valSkillModifier) { if (defaultSkillMod.Size() < valSkillModifier.arr.Size()) { self.skillmodifier.Resize(valSkillModifier.arr.Size()); @@ -377,9 +409,11 @@ class Progression: Inventory { ProgressionEventHandler handler; - Map resources; // per resource + //Map resources; // per resource Map stats; + String soundLevelUp; + Default { +INVENTORY.KEEPDEPLETED +INVENTORY.HUBPOWER @@ -510,6 +544,8 @@ class Progression: Inventory { } } + self.soundLevelUp = PlayerSheet.soundLevelUp; + if (cvarProgression == PSP_LEVELS) { self.HalveXPBeforeLevel4 = PlayerSheet.HalveXPBeforeLevel4; @@ -611,7 +647,7 @@ class Progression: Inventory { v.table[4] = v.table[1] * 4.0; v.Roll(); } - + self.maxlevel = 20; } @@ -655,6 +691,7 @@ class Progression: Inventory { let hasHexenArmor = true; let itemHexenArmor = HexenArmor(player.FindInventory("HexenArmor")); if (itemHexenArmor == null) { + owner.player.mo.GiveInventory("HXDDArmor", 1); owner.player.mo.GiveInventory("HexenArmor", 1); itemHexenArmor = HexenArmor(player.FindInventory("HexenArmor")); hasHexenArmor = false; @@ -730,6 +767,23 @@ class Progression: Inventory { } } + int GetMaxResource(String className) { + int value = self.maxResource; + PlayerSheetStat stat = self.GetStat(className.MakeLower()); + if (stat) { + value = stat.value; + } + stat = self.GetStat("ammo"); + if (stat) { + value = stat.value; + } + stat = self.GetStat("resources"); + if (stat) { + value = stat.value; + } + return value; + } + void InitLevel_PostBeginPlay() { if (self.currlevel != 0) { return; @@ -749,7 +803,7 @@ class Progression: Inventory { player.A_SetHealth(self.MaxHealth, AAPTR_DEFAULT); // Alt Ammo Handler - maxResource = stats_compute(resourceTable[0], resourceTable[1]); + self.maxResource = stats_compute(resourceTable[0], resourceTable[1]); // Calc initial ammo // Add ammo dummies to player @@ -758,25 +812,59 @@ class Progression: Inventory { let ammotype = (class)(AllActorClasses[i]); if (ammotype && GetDefaultByType(ammotype).GetParentAmmo() == ammotype) { Ammo ammoItem = Ammo(Owner.player.mo.FindInventory(ammotype)); + bool isUnowned = false; if (ammoItem == null) { // The player did not have the ammoitem. Add it. ammoItem = Ammo(Spawn(ammotype)); + isUnowned = true; } + ammoItem.AttachToOwner(Owner.player.mo); if (ammoItem) { + int statMaxResource = GetMaxResource(ammoItem.GetClassName()); + + double nextAmount = statMaxResource; if (!(ammoItem is "mana1" || ammoItem is "mana2")) { - ammoItem.MaxAmount = (double)(ammoItem.Default.MaxAmount) * (maxResource / 100.0); + ammoItem.MaxAmount = (double)(ammoItem.Default.MaxAmount) * (statMaxResource / 100.0); + } + if (self.HasBackpack()) { + ammoItem.BackpackMaxAmount = nextAmount * (ammoItem.Default.BackpackMaxAmount / ammoItem.Default.MaxAmount); + ammoItem.MaxAmount = ammoItem.BackpackMaxAmount; } else { - ammoItem.MaxAmount = maxResource; - ammoItem.Amount = 0; + ammoItem.MaxAmount = nextAmount; + ammoItem.BackpackMaxAmount = nextAmount * (ammoItem.Default.BackpackMaxAmount / ammoItem.Default.MaxAmount); } - //ammoItem.Amount = 0; - if (cvarAllowBackpackUse) { - ammoItem.BackpackMaxAmount = ammoItem.MaxAmount * (ammoItem.Default.BackpackMaxAmount / ammoItem.Default.MaxAmount); + } + if (isUnowned) { + // Clear any unowned ammo + ammoItem.Amount = 0; + } + } + } + + Inventory next; + for (Inventory item = player.Inv; item != NULL; item = next) { + next = item.Inv; + + let invItem = player.FindInventory(item.GetClass()); + if (invItem != NULL && invItem is "Ammo") { + Ammo ammoItem = Ammo(invItem); + if (ammoItem) { + int statMaxResource = GetMaxResource(ammoItem.GetClassName()); + + double nextAmount = statMaxResource; + if (!(ammoItem is "mana1" || ammoItem is "mana2")) { + ammoItem.MaxAmount = (double)(ammoItem.Default.MaxAmount) * (statMaxResource / 100.0); + } + if (self.HasBackpack()) { + ammoItem.BackpackMaxAmount = nextAmount * (ammoItem.Default.BackpackMaxAmount / ammoItem.Default.MaxAmount); + ammoItem.MaxAmount = ammoItem.BackpackMaxAmount; + ammoItem.Amount = clamp(ammoItem.Amount, 0.0, ammoItem.BackpackMaxAmount); } else { - ammoItem.BackpackMaxAmount = ammoItem.MaxAmount; + ammoItem.MaxAmount = nextAmount; + ammoItem.BackpackMaxAmount = nextAmount * (ammoItem.Default.BackpackMaxAmount / ammoItem.Default.MaxAmount); + ammoItem.Amount = clamp(ammoItem.Amount, 0.0, nextAmount); } } - ammoItem.AttachToOwner(Owner.player.mo); } } @@ -812,12 +900,16 @@ class Progression: Inventory { bool cvarAllowBackpackUse = LemonUtil.CVAR_GetBool("hxdd_allow_backpack_use", false); PlayerPawn player = PlayerPawn(owner.player.mo); - String cvarLevelUpAudio = LemonUtil.CVAR_GetString(String.format("hxdd_playersheet_%s_level_audio", playerClassName), "misc/chat"); + String cvarLevelUpAudio = soundLevelUp != "" ? soundLevelUp : LemonUtil.CVAR_GetString(String.format("hxdd_level_audio", playerClassName), "misc/chat"); S_StartSound(cvarLevelUpAudio, CHAN_AUTO); while (self.currlevel < advanceLevel && self.currlevel < self.maxlevel) { int lastLevel = self.currlevel++; + foreach (k, v : self.stats) { + v.ProcessLevelIncrease(self.currlevel == self.maxlevel); + } + double healthInc = 0; double resourceInc = 0; if (lastLevel < self.MaxLevel) { @@ -870,24 +962,24 @@ class Progression: Inventory { if (invItem != NULL && invItem is "Ammo") { Ammo ammoItem = Ammo(invItem); if (ammoItem) { + int statMaxResource = GetMaxResource(ammoItem.GetClassName()); + + double nextAmount = statMaxResource; if (!(ammoItem is "mana1" || ammoItem is "mana2")) { - ammoItem.MaxAmount = (double)(ammoItem.Default.MaxAmount) * (MaxResource / 100.0); - } else { - ammoItem.MaxAmount = MaxResource; + ammoItem.MaxAmount = (double)(ammoItem.Default.MaxAmount) * (statMaxResource / 100.0); } - ammoItem.Amount = clamp(ammoItem.Amount, 0.0, ammoItem.MaxAmount); - if (cvarAllowBackpackUse) { - ammoItem.BackpackMaxAmount = ammoItem.MaxAmount * (ammoItem.Default.BackpackMaxAmount / ammoItem.Default.MaxAmount); + if (self.HasBackpack()) { + ammoItem.BackpackMaxAmount = nextAmount * (ammoItem.Default.BackpackMaxAmount / ammoItem.Default.MaxAmount); + ammoItem.MaxAmount = ammoItem.BackpackMaxAmount; + ammoItem.Amount = clamp(ammoItem.Amount, 0.0, ammoItem.BackpackMaxAmount); } else { - ammoItem.BackpackMaxAmount = ammoItem.MaxAmount; + ammoItem.MaxAmount = nextAmount; + ammoItem.BackpackMaxAmount = nextAmount * (ammoItem.Default.BackpackMaxAmount / ammoItem.Default.MaxAmount); + ammoItem.Amount = clamp(ammoItem.Amount, 0.0, nextAmount); } } } } - - foreach (k, v : self.stats) { - v.ProcessLevelIncrease(self.currlevel == self.maxlevel); - } //for (let i = 0; i < self.stats.Size(); i++) { // self.stats[i].ProcessLevelIncrease(self.currlevel == self.maxlevel); //} @@ -900,19 +992,30 @@ class Progression: Inventory { String nameCap = String.format("%s%s", k.Left(1).MakeUpper(), k.Mid(1, k.Length() - 1)); console.printf("%s: %0.2f", nameCap, v.value); } - /* - for (let i = 0; i < self.stats.Size(); i++) { - String name = self.stats[i].name; - String nameCap = String.format("%s%s", name.Left(1).MakeUpper(), name.Mid(1, name.Length() - 1)); - console.printf("%s: %0.2f", nameCap, self.stats[i].value); - } - */ console.printf(""); console.printf("You are now level %d!", self.currlevel); console.printf(""); } } + bool HasBackpack() { + PlayerPawn player = PlayerPawn(owner.player.mo); + Inventory next; + for (Inventory item = player.Inv; item != NULL; item = next) { + next = item.Inv; + + let invItem = player.FindInventory(item.GetClass()); + if (invItem != NULL && invItem is "BackpackItem") { + BackpackItem backpackItem = BackpackItem(invItem); + if (backpackItem && backpackItem.Amount > 0) { + console.printf("backpackItem: %s %d", backpackItem.GetClassName(), backpackItem.Amount); + return true; + } + } + } + return false; + } + double GiveExperience(double amount) { if (self.HalveXPBeforeLevel4 && self.currlevel < 4) { amount *= 0.5; @@ -924,7 +1027,7 @@ class Progression: Inventory { PlayerSheetStat stat = GetStat(self.xp_bonus_stat); if (stat) { int xp_bonus_stat_modifier = stat.value - 11; - amount += amount * xp_bonus_stat_modifier / 20; + amount += amount * xp_bonus_stat_modifier / self.maxlevel; } } diff --git a/resources/assets/zscript/lib/xgametranslation.zs b/resources/assets/zscript/lib/xgametranslation.zs index a0d5e77..0594a46 100644 --- a/resources/assets/zscript/lib/xgametranslation.zs +++ b/resources/assets/zscript/lib/xgametranslation.zs @@ -329,7 +329,7 @@ class XGameTranslation { String val = FileJSON.GetString(jo, "true"); if (val) { val.Substitute(" ", ""); - val.Split(xta.defaults, ","); + val.Split(xta.alternates, ","); } } HXDD_JsonArray arrDefaults = FileJSON.GetArray(jo, "false"); @@ -347,6 +347,9 @@ class XGameTranslation { val.Split(xta.defaults, ","); } } + if (!xta.defaults.Size() == 0) { + xta.defaults.push(key); + } } return xta; @@ -381,14 +384,15 @@ class XGameTranslation { } } - replacement = list[0]; - if (list.Size() > 1) { - // choose randomly - int size = list.Size() - 1; - int choice = random[xclass](0, size); - console.printf("XGameTranslation.XClass.TrySwap Found: %s %d", replacee, choice); - replacement = list[choice]; + if (list.Size() == 0) { + return replacee; } + + // select random + int size = list.Size() - 1; + int choice = random[xclass](0, size); + //console.printf("XGameTranslation.XClass.TrySwap Found: %s %d", replacee, choice); + replacement = list[choice]; //console.printf("XGameTranslation.XClass.TrySwap Found: %s, Replacement: %s", replacee, replacement); return replacement; @@ -420,7 +424,7 @@ class XGameTranslation { //HXDD_JsonArray valLabels = GetArray(objListItem, "labels"); HXDD_JsonArray valActors = FileJSON.GetArray(objListItem, "actors"); if (valKey && valActors) { - let newXSwap = new ("XTranslationActors"); + let newXSwap = new ("XTranslationActors"); newXSwap.key = valKey; newXSwap.defaults.Resize(valActors.Size()); for (int j = 0; j < valActors.Size(); j++) { diff --git a/resources/assets/zscript/menu/newgame.zs b/resources/assets/zscript/menu/newgame.zs index 021e69d..8933184 100644 --- a/resources/assets/zscript/menu/newgame.zs +++ b/resources/assets/zscript/menu/newgame.zs @@ -203,7 +203,7 @@ class ZFPlayerClassSelection ui { double classLineX = (1080 * 0.25) + (56 * 2.5) + 50; double hereticPosY = 450 + ((142 * 2.5 * 0.5) - (112 * 1.5 * 0.5)); - Array imagesCorvus = {"sprites/PLAYA1.png", "sprites/PLAYB1.png", "sprites/PLAYC1.png", "sprites/PLAYD1.png"}; + Array imagesCorvus = {"sprites/CORVA1.png", "sprites/CORVB1.png", "sprites/CORVC1.png", "sprites/CORVD1.png"}; btnClassCorvus = new("ButtonPlayerClass"); btnClassCorvus.Create(frame, cmdHandlerClassSelect, (hereticPosY, classLineX), 1.5, "Corvus", "HXDDHereticPlayer", "graphics/M_HBOX.png", imagesCorvus); diff --git a/resources/realm667/MarineStuff.wad b/resources/realm667/MarineStuff.wad new file mode 100644 index 0000000000000000000000000000000000000000..21c30a06c382c853d6bd549ebf051713e9e6aedb GIT binary patch literal 3582 zcmcgvOK2Nc6n%*k+fgC{T@|vKWkM2~bWuVI1=(_l$;ZKR$ReW3SQ^WcER8MAjDD77 z%dSa_35F~p>ys?!pJ9*lmHc1?(t%TWxui3O6uIHtM z>)CC%-j@=tcemkCruJgKL2K~ei|N`;xE@iIFcFBG!pIV;pA5BoimB)HCUR$lSA26;sYm`zr}DF(6T zciy#)2R+yaXR#lGo)LjNIw-njf$IxMLQvv80lyHCj-B9aK6z|R;@#X)X;j!|Ljv!I z)hdd9?r6W2vxy^8m=6la%qGJz*XQy`J0teH1fJ{RL(d4g%=>ZY5+C#g5I~YgM$D#O zF%S@(l1B`jahA!PqvGCxf=I=aXlKB?(>va$C7 z+SAji>4jS&+1O(ubJKHP?`SG@Gr;KlyvOZwyKl~eLc#3(ym#2)T%1cSFrHeN^E&L# z)HY8sKAXDrkMGK4H|00AHYEC4y+Bj79G2S5XAz;D2x z09>g$+1R&_sO7T8N`pqZDk5D7_|mQE#WmeK#?+~9-RCQ7>+42o)WXQ4hip?~IJpw=``DZ3%xBb8-l)VidX1 zm5>4!fqTFwz}LW!fDSZ(KLENCjsVAjH-QVlb-)Wmft$b`;1Tc{@ECvwT`yG{jdfNR zUDNb(tx;<*rm3n{s;*aILn0NesA_s;y;5hitQJ&VtJKQ|ErDvKQmtHLR?wnWs%%lM zSj5;`xoVV5)zqSjNG)DoRpDI6Xv1Eq7U+1rUNLyJRxhrusgMHis7$S1FX^SS-l!os zczwOF`gBz-tv4VXeEq3fSSx7Nddt45>cv74>MAXD8g*}kM`k6^O*Noph*eu+Db;D- z)p{$lO3A1SEd%CL(^NQW&>Dg1C1hD=^+RRLrE;~=K)?1CeGxNt6?hwP15w~zUCA1`6+D~GWV18r+cOyqrS^P2n_bM$q&7M2@6F7-lf~BE?mwGu@iZNuS;}PE zc{ZKT}14SET55e#MxTwS7NGzG0Vv`b9lyG!1IhkZkk!2+k zpNhkV$&D$Jtb}7zu>_-0IV6XbSR!iB2&fW?OhzY}6;x6pu`Q}d62?wO-k*Oqv zgHMgip!?T;10os!4LxeWcf+c z;c^<>p0zJOUZ(xQ4R_1v@1)xpnK>LZ)>016k(oX1aOUWd!ldPJ+8lz;!ySZJ`+5fk zEkk`r(Ec3vdI$Tg{X;hLGx)dQ{g=-T;6m=~qrZgMY!2IyWpIe{S8$BcHzms{9CiDV zH#mKjq5Naa=TG4DuW=7}yql0NYRA8GYEK>5wo`uPpy7|cn@~OsfhEMVwm5yuqaVcY JyNv%