diff --git a/README.md b/README.md index 8114a394c..8e7ef0635 100644 --- a/README.md +++ b/README.md @@ -36,17 +36,18 @@ You are an **Akari Labs Demolitionist Bot**, one of the very first units, fresh Additional features: - - **Programmable colour tags:** Located around various parts of your body, allows quick and easy differentiation between multiple units (not available due to *engine limitations™*, so they're always green). - - **Lucky Collar:** A little something that your creator gives to all of her creations. Reduces incoming damage by 75% when you're below 25% health. + - **Glowing color tags:** Located around various parts of your body, allows quick and easy differentiation between multiple units (color not directly configurable due to *engine limitations™*). + - **Lucky Collar:** A little something that your creator gives to all of her creations. Reduces incoming damage by 75% when you're below 25% health. Plus an additional 50% reduction to any damage from your own weapons. + - **High-Resonant Almasteel Plating:** Your chassis is built from one of the hardest alloys known across the universe. Thus, your body is practically indestructible, but not impervious to damage. All direct damage is reduced by 50%, and all explosive damage is reduced by 80%. - **User Menu:** With the press of a button, open a dedicated menu to see all your stats in detail, info on carried items and weapons, check out a grand library of information on things you come across, and access the store for buying extra items with your score points. - - **Magnetic Utility Belt:** Makes some weapons easier to reload while on the go. - - **Keychain:** For carrying all your keys around, and other valuable things. - - **Pocket Hammerspace™ containers:** These will store and deploy your ammunition and weapons on demand. The capacity for ammo storage can be increased by finding **Hammerspace™ Embiggener** modules. - - **Forx JetBurst™ Units:** Can be used for quick dashes in any direction, or even for short bursts of flight. + - **Magnetic Utility Belt:** Holds important equipment tightly, and is also the secret to how you can reload some weapons so damn fast. + - **Keychain:** A lil' something to bring some extra good luck charms with you. + - **Pocket Hammerspace™ containers:** These will store and deploy items on demand, along with keeping hold of any keys you find. The capacity for ammo storage can be increased by finding **Hammerspace™ Embiggener** modules. + - **Forx JetBurst™ Impulsors:** Can be used for quick dashes in any direction, or even for short bursts of flight. - **Targetting Array:** Tracks nearby foes and provides basic information on their health. Compatible with **Omnisight™** mapping modules for tracking key items and nearby exits. Can also highlight nearby pickups by holding a dedicated button. - **Akari Labs CuteEmotion™ Display:** Equipped onto your visor to show a wide range of predefined facial expressions in order to convey simple emotions to others. - - **Akari Labs LoudBoi™ Voicebox:** Allows you to 🇪 🇲 🇮 🇹. Additional voice options will be available through add-ons. Note that the default voice is in Japanese, but subtitles will be provided when available. - - **On-demand Item Obtainers:** AKA "hands". You can pick up certain items from a distance by pressing Use (this is mainly a workaround for any quirks that might come from items in this mod having modified collision). + - **Akari Labs LoudBoi™ Voicebox:** Allows you to 🇪 🇲 🇮 🇹. Easily moddable to allow alternate voicepack add-ons. Note that the default voice is in Japanese, but subtitles will be provided when needed. + - **On-demand Item Obtainers:** AKA "hands". You can pick up the mod's items from a distance by pressing Use (this is mainly a workaround for any quirks that might come from them having modified collision). **Note:** Since you're a robutt you pretty much can swim indefinitely and are also immune to poison. @@ -455,6 +456,7 @@ A single-volume manga by Saya Miyamoto "based on true events" about a young girl The most adorable and huggable plush doll of the cutest and sweetest emperor. This was not only also handcrafted by Nukritas 2xx, but also imbued with Kirin's magic, his blessing making anyone feel warm and fuzzy when holding it close to their heart. Like the Saya plush, also emits a cute giggle when squeezed. ## The HUD +![](docimg/hudsample.png) Pretty simplistic so it doesn't get in the way of the action. Some things may be configurable. @@ -479,7 +481,7 @@ The scoring system is pretty straightforward. Each enemy you kill will give you You are also given +100 points for each secret found, +1000 if it's the final secret. Countable items give +10 points each or +500 if it's the final item. In addition, +5000 will be given to all players if the level is fully cleared (100% kills/items/secrets). -Score can be used to buy items on the in-game store, and it is preserved between hubs. +Score can be used to buy items on the in-game store, and it is preserved between hubs, but pistol starts will reset it. In **Doom** and **Heretic**, collected keys will be displayed below the score box. diff --git a/docimg/hudsample.png b/docimg/hudsample.png new file mode 100644 index 000000000..2743eacca Binary files /dev/null and b/docimg/hudsample.png differ diff --git a/language.def_base b/language.def_base index 2260d3ed5..e9a6cdc8c 100644 --- a/language.def_base +++ b/language.def_base @@ -838,8 +838,8 @@ OB_FBOSS = "%o was green'd by the fighty boi's Lame Sword."; OB_MBOSS = "%o was assploded by the magic boi's Explodey Staff."; OB_CBOSS = "%o was ghosted by the holy boi's Ghostpenis."; OB_HERESIARCH = "%o saw that coming."; -DEFOB_PIG = "%o angered the hams."; // gzdoom will look this up since it has no obituary assigned OB_PIG = "%o angered the hams."; // for when gzdoom fixes this (come on, graf) +DEFOB_PIG = "$$OB_PIG"; // gzdoom will look this up since it has no obituary assigned // eviternity obituaries OB_FCAPTAIN = "%o was zapped by an angry green lad."; OB_ANNIHIL = "%o was terminated by a cybergoat."; @@ -857,6 +857,7 @@ D_RAGEKIT = "The Ragekit has ragequit."; D_REFRESHER = "The Refresher boost has ended."; D_WARARMOR = "The War Armor is no more."; SWWM_URDED = "Demolitionist Unit \"%s\" has fallen"; +SWWM_URDED_GEN = "Demolitionist Unit has fallen"; SWWM_URDED2 = "Press \cfUse\c- to restart from the most recent save"; SWWM_URDED3 = "...or press \cfFire\c- to attempt an emergency reboot"; SWWM_URDEDMP = "Press \cfUse\c- to respawn"; diff --git a/language.es_base b/language.es_base index 048e8e840..6891fb796 100644 --- a/language.es_base +++ b/language.es_base @@ -783,8 +783,8 @@ OB_FBOSS = "%o fue verdeado por la espada esa del tío ciclao."; OB_MBOSS = "%o fue reventado por la varita explosiva esa del tío mágico."; OB_CBOSS = "%o fue fantasmado por la verga fantasma del tío santurrón."; OB_HERESIARCH = "%o lo vio venir."; -DEFOB_PIG = "%o enfureció a los jamones."; // gzdoom will look this up since it has no obituary assigned OB_PIG = "%o enfureció a los jamones."; // for when gzdoom fixes this (come on, graf) +DEFOB_PIG = "$$OB_PIG"; // gzdoom will look this up since it has no obituary assigned // eviternity obituaries OB_FCAPTAIN = "%o fue chispad@[ao_esp] por un tío verde cabreado."; OB_ANNIHIL = "%o fue exterminad@[ao_esp] por una cibercabra."; diff --git a/language.version b/language.version index 7d867cffc..0ae057023 100644 --- a/language.version +++ b/language.version @@ -1,2 +1,2 @@ [default] -SWWM_MODVER="\chSWWM \czGZ\c- \cw0.9.11b-pre r746 \cu(Wed 13 Jan 12:10:14 CET 2021)"; +SWWM_MODVER="\chSWWM \czGZ\c- \cw0.9.11b-pre r748 \cu(Wed 13 Jan 14:30:04 CET 2021)"; diff --git a/zscript/swwm_common.zsc b/zscript/swwm_common.zsc index cb998d9c0..3ed795922 100644 --- a/zscript/swwm_common.zsc +++ b/zscript/swwm_common.zsc @@ -1457,7 +1457,7 @@ Class SWWMShadow : Actor private void Update( bool nointerpolate = false ) { // update scale / alpha - if ( ((target is 'Inventory') && Inventory(target).Owner) || target.bKILLED || target.bINVISIBLE || (target.sprite == target.GetSpriteIndex('TNT1')) || (target.sprite == target.GetSpriteIndex('ACLO') ) + if ( ((target is 'Inventory') && Inventory(target).Owner) || target.bKILLED || target.bINVISIBLE || (target.sprite == target.GetSpriteIndex('TNT1')) || (target.sprite == target.GetSpriteIndex('ACLO')) ) alpha = 0.; else { diff --git a/zscript/swwm_hud.zsc b/zscript/swwm_hud.zsc index eae2810d8..3cbf864e4 100644 --- a/zscript/swwm_hud.zsc +++ b/zscript/swwm_hud.zsc @@ -1352,7 +1352,9 @@ Class SWWMStatusBar : BaseStatusBar Screen.DrawText(fnt,Font.CR_RED,xx,yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true); } alph = clamp((deadtimer-60)/60.,0.,1.); - str = String.Format(StringTable.Localize("$SWWM_URDED"),CPlayer.GetUserName()); + String nam = CPlayer.GetUserName(); + if ( nam == "Player" ) str = StringTable.Localize("$SWWM_URDED_GEN"); + else str = String.Format(StringTable.Localize("$SWWM_URDED"),nam); fnt = LangFont(mTewiFont); len = fnt.StringWidth(str); xx = int((ss.x-len)/2.); diff --git a/zscript/swwm_player.zsc b/zscript/swwm_player.zsc index 8115f739a..08a72bfd7 100644 --- a/zscript/swwm_player.zsc +++ b/zscript/swwm_player.zsc @@ -2865,6 +2865,7 @@ Class DemolitionistSelfLight : Actor { bool oldactive; bool oldglow; + transient Color tagcolor; Default { @@ -2894,6 +2895,18 @@ Class DemolitionistSelfLight : Actor Destroy(); return; } + if ( tagcolor.a == 0 ) + { + let lmp = Wads.FindLump("tagcolor.txt"); + if ( lmp ) + { + String str = Wads.ReadLump(lmp); + Array rgb; + str.Split(rgb,",",0); + tagcolor = Color(255,rgb[0].ToInt(),rgb[1].ToInt(),rgb[2].ToInt()); + } + else tagcolor = Color(255,32,48,24); + } bool curactive = activelight(); if ( curactive && !oldactive ) target.A_AttachLight('DemoSelfLight',DynamicLight.PointLight,Color(56,72,88),200,0,DynamicLight.LF_DONTLIGHTSELF|DynamicLight.LF_ATTENUATE|DynamicLight.LF_SPOT,(5,0,target.player?(target.player.viewz-target.pos.z):(target.height*.93)),0,30,90,target.pitch); @@ -2901,7 +2914,7 @@ Class DemolitionistSelfLight : Actor target.A_RemoveLight('DemoSelfLight'); oldactive = curactive; bool curglow = !(target.bINVISIBLE||(target.alpha <= double.epsilon)); - if ( curglow && !oldglow ) target.A_AttachLight('DemoSelfLight2',DynamicLight.PointLight,Color(32,48,24),80,0,DynamicLight.LF_DONTLIGHTSELF|DynamicLight.LF_ATTENUATE,(0,0,target.height/2)); + if ( curglow && !oldglow ) target.A_AttachLight('DemoSelfLight2',DynamicLight.PointLight,tagcolor,80,0,DynamicLight.LF_DONTLIGHTSELF|DynamicLight.LF_ATTENUATE,(0,0,target.height/2)); else if ( !curglow && oldglow ) target.A_RemoveLight('DemoSelfLight2'); oldglow = curglow; }