From 8b7656cef30d93f51731a2548397b230e2bc4cbc Mon Sep 17 00:00:00 2001 From: Marisa Kirisame Date: Sat, 7 Nov 2020 13:54:21 +0100 Subject: [PATCH] Weredragons and Ettins are pettable now. Befriended monsters activate their death specials, if they have any. Add colored icons to monster tags to denote bosses and friends. Minigames will be part of a second free DLC update. --- Achievements.md | 13 +++++++++++-- FuturePlans.md | 9 ++++++++- Roadmap.md | 6 +++--- TODO.md | 2 +- language.version | 2 +- zscript/swwm_handler.zsc | 9 +++++---- zscript/swwm_hud.zsc | 2 ++ zscript/swwm_player.zsc | 8 ++++++++ zscript/swwm_thinkers.zsc | 7 ++++++- zscript/swwm_utility.zsc | 13 +++++++++++++ 10 files changed, 58 insertions(+), 13 deletions(-) diff --git a/Achievements.md b/Achievements.md index 59ac665eb..ddc88bf96 100644 --- a/Achievements.md +++ b/Achievements.md @@ -43,10 +43,10 @@ - **Pest Control**: Obtain 100% kills in 30 maps. - **Premium Detective**: Obtain 100% secrets in 30 maps. - **Return to Sender**: Kill 50 enemies with parried projectiles. -- **Robutts Die Twice**: Reenact your favorite Souls-like. +- **Robutts Die Twice**: Die and reboot two times in the same map. - **Salutations**: Greet another player. - **Sayonara, Scumbag**: Wave at a dying enemy 20 times. -- **Shaped Like A Friend**: Befriend 50 Cacodemons with headpats. +- **Shaped Like A Friend**: Befriend 50 Cacodemons, Weredragons or Ettins with headpats. - **Sharing Is Caring**: Share items in multiplayer 50 times. - **Shockmaster**: Perform 50 Biospark combos. - **Slam Your Balls**: Land 100 Lead Ball crits. @@ -73,3 +73,12 @@ - **High Noon**: Land 6 killing shots in a single Puntzer Beta reload. - **The Most Silent Takedown**: Kill 50 enemies with the Ray-Khom primary without alerting anyone else. - **You Gained Brouzouf**: Unload an entire mag in fuller auto with the Puntzer Gamma without missing a single shot. + +### DLC Gameset achievements: + +- **Tetromination**: Complete a full game of Tetris. +- **Danny Won, Yeah**: Complete a full game of Pong. +- **Tsuchinoko Real**: Complete a full game of Snake. +- **Master of Platformers**: Complete a full game of Demo Land Adventure. +- **Master of SHMUPs**: Complete a full game of Interstellar Demolitionist. +- **Master of RPGs**: Complete a full game of Demolition Quest. \ No newline at end of file diff --git a/FuturePlans.md b/FuturePlans.md index 4fb3886f3..978d54f95 100644 --- a/FuturePlans.md +++ b/FuturePlans.md @@ -20,7 +20,14 @@ This is just a bit of *"future planning"* for stuff that I ***might*** add after - **[Heretic]** Doomguy Action Figure *("Oh, he gets one too?")* - **[Hexen]** Obelisk of the Golden Vale *("I puked out my guts when I touched that fucking thing")* * ***(Maybe)* Fake livestream chat overlay, with dynamic reactions to all sorts of stuff** -* ***(Maybe)* Minigames for the Demolitionist Menu (pong, tetris, some sort of basic platformer or shmup)** +* **DLC Gameset:** + - Tetris + - Pong + - Snake + - ... maybe other small games + - **[Doom]** Demo Land Adventure (platformer with shooty gameplay) + - **[Heretic]** Interstellar Demolitionist (a somewhat simple SHMUP, kinda Touhou styled) + - **[Hexen]** Demolition Quest (a JRPG, kinda like early FF / BoF) * **Mothgirl summon for Lämp easter egg** * **Ibuki companion add-on *(w/ optional "stream friendly" clothing)*** * **Saya model, for scenes or something idk *(maybe a companion add-on too)*** diff --git a/Roadmap.md b/Roadmap.md index 5e39689f0..2400f24d7 100644 --- a/Roadmap.md +++ b/Roadmap.md @@ -10,17 +10,17 @@ - See if I can add those damn swimming anims. - Beg more artists for intermission fanart. - Stuff to maybe add during this stage: Explodium Guns akimbo, Quick grenade. - - Collectables. Froggy Chair was only the beginning. + - Collectibles. Froggy Chair was only the beginning. **Cutie Robutt Adventures:** - Going Gold™. - Think about the future. There are lots of things I could do now *(see FuturePlans.md)*. - - Maybe try to do the fancy titlemap now, mod trailer, etc. **Extra Funtimes:** - DLC weapons. + - DLC minigames. **LODS OF LORE:** @@ -29,7 +29,7 @@ **Funny Fellas:** - - Monster/decoration replacement packs. All of it modelled and tweaked to fit the style and theme of the mod. Expect enhanced enemy behaviour, not gonna keep it "vanilla". + - Monster/decoration replacement packs. All of it modeled and tweaked to fit the style and theme of the mod. Expect enhanced enemy behavior, not gonna keep it "vanilla". - Porting weapons to Hideous Destructor as a meme. **Fight for the Front and freedom. Move out!:** diff --git a/TODO.md b/TODO.md index 06e4dfb5e..b3cf93df9 100644 --- a/TODO.md +++ b/TODO.md @@ -12,7 +12,7 @@ - Mod trailer video (doubt I'd be able to, I might ask someone instead) - Rewrite the entire Demolitionist Menu code from the ground up to be more easily extensible and adapt to any window size - Hexen key and puzzle item models? - - Minigames? + - DLC gameset **Very extra things for the future:** diff --git a/language.version b/language.version index cd5b505be..77a2ef90a 100644 --- a/language.version +++ b/language.version @@ -1,2 +1,2 @@ [default] -SWWM_MODVER="\chSWWM \czGZ\c- \cw0.9.11b-pre r608 \cu(Sat 7 Nov 10:27:26 CET 2020)"; +SWWM_MODVER="\chSWWM \czGZ\c- \cw0.9.11b-pre r608 \cu(Sat 7 Nov 13:54:21 CET 2020)"; diff --git a/zscript/swwm_handler.zsc b/zscript/swwm_handler.zsc index 5b67944c3..53808458f 100644 --- a/zscript/swwm_handler.zsc +++ b/zscript/swwm_handler.zsc @@ -1182,7 +1182,7 @@ Class SWWMHandler : EventHandler { if ( (e.Thing.IsFriend(e.DamageSource) || SWWMUtility.IsCivilian(e.DamageSource)) ) lastcombat = AddOneliner("friendhit",1,10); - else if ( (!lastcombat || (gametic > lastcombat+100)) && !Random[DemoLines](0,(e.DamageSource.bBOSS||e.DamageSource.bBOSSDEATH)?2:4) && !SWWMHDoomHandler.IsCuteGirl(e.DamageSource) ) // [HDoom] don't shout at the girls + else if ( (!lastcombat || (gametic > lastcombat+100)) && !Random[DemoLines](0,e.DamageSource.bBOSS?2:4) && !SWWMHDoomHandler.IsCuteGirl(e.DamageSource) ) // [HDoom] don't shout at the girls lastcombat = AddOneliner("gethit",1,15); } highesttic = gametic; @@ -1221,7 +1221,7 @@ Class SWWMHandler : EventHandler { if ( e.Thing.IsFriend(src) || SWWMUtility.IsCivilian(e.Thing) ) lastcombat = AddOneliner("friendkill",1,5); - else if ( (!lastcombat || (gametic > lastcombat+100)) && !Random[DemoLines](0,(e.Thing.bBOSS||e.Thing.bBOSSDEATH)?2:5) && !SWWMHDoomHandler.IsCuteGirl(e.Thing) ) // [HDoom] don't shout at the girls + else if ( (!lastcombat || (gametic > lastcombat+100)) && !Random[DemoLines](0,e.Thing.bBOSS?2:5) && !SWWMHDoomHandler.IsCuteGirl(e.Thing) ) // [HDoom] don't shout at the girls lastcombat = AddOneliner("scorekill",1,15); } } @@ -1411,9 +1411,10 @@ Class SWWMHandler : EventHandler e.Thing.A_SetSize(20,40); e.Thing.bNOBLOOD = true; } - else if ( SWWMUtility.IdentifyingDog(e.Thing) || SWWMUtility.IdentifyingCaco(e.Thing) ) + else if ( SWWMUtility.IdentifyingDog(e.Thing) || SWWMUtility.IdentifyingCaco(e.Thing) + || SWWMUtility.IdentifyingDrug(e.Thing) || SWWMUtility.IdentifyingDoubleBoi(e.Thing) ) { - // you can pet the dog, and you can also pet the caco + // you can pet the dog, and you can also pet the caco (and friends) let hp = Actor.Spawn("HeadpatTracker",e.Thing.pos); hp.target = e.Thing; } diff --git a/zscript/swwm_hud.zsc b/zscript/swwm_hud.zsc index be261f4b8..85beb88fa 100644 --- a/zscript/swwm_hud.zsc +++ b/zscript/swwm_hud.zsc @@ -734,6 +734,8 @@ Class SWWMStatusBar : BaseStatusBar if ( StringTable.Localize("$SWWM_LEGPREFIX") == "R" ) tag = tag..StringTable.Localize("$SWWM_LEG"); else tag = StringTable.Localize("$SWWM_LEG")..tag; } + if ( targ.bBOSS ) tag = "\cx★\c- "..tag.." \cx★\c-"; + if ( targ.bFRIENDLY ) tag = "\cg♥\c- "..tag.." \cg♥\c-"; int mtime = 35; if ( thesight && (targ.lasthealth > 0) ) mtime += 105; double alph = clamp(((targ.updated+mtime)-level.maptime)/35.,0.,1.); diff --git a/zscript/swwm_player.zsc b/zscript/swwm_player.zsc index 191992f0a..9c87609fb 100644 --- a/zscript/swwm_player.zsc +++ b/zscript/swwm_player.zsc @@ -3213,6 +3213,14 @@ Class SWWMGesture : SWWMWeapon t.bCOUNTKILL = false; level.total_monsters--; } + if ( t.special && !(t.ActivationType&THINGSPEC_NoDeathSpecial) ) + { + Actor whomst = level.actownspecial?t:self; + if ( t.ActivationType&THINGSPEC_ThingActs ) whomst = t; + else if ( t.ActivationType&THINGSPEC_TriggerActs ) whomst = self; + level.ExecuteSpecial(t.special,whomst,null,false,t.args[0],t.args[1],t.args[2],t.args[3],t.args[4]); + t.special = 0; + } t.bFRIENDLY = true; if ( deathmatch ) t.SetFriendPlayer(player); diff --git a/zscript/swwm_thinkers.zsc b/zscript/swwm_thinkers.zsc index f53ceb057..a6d76c7c7 100644 --- a/zscript/swwm_thinkers.zsc +++ b/zscript/swwm_thinkers.zsc @@ -789,6 +789,7 @@ Class SWWMCombatTracker : Thinker int tcnt; double height; transient CVar funtags, maxdist; + bool bBOSS, bFRIENDLY; void UpdateTag() { @@ -827,7 +828,7 @@ Class SWWMCombatTracker : Thinker } else t.lasthealth = t.maxhealth = target.health; t.updated = int.min; - t.height = t.mytarget.height; + t.height = target.height; t.pos = level.Vec3Offset(target.pos,(0,0,t.height)); t.prevpos = level.Vec3Offset(target.prev,(0,0,t.height)); t.oldpos = target.pos; @@ -835,6 +836,8 @@ Class SWWMCombatTracker : Thinker t.intp = DynamicValueInterpolator.Create(t.lasthealth,.5,1,100); t.myplayer = target.player; t.next = hnd.trackers; + t.bBOSS = target.bBOSS; + t.bFRIENDLY = target.bFRIENDLY; if ( hnd.trackers ) hnd.trackers.prev = t; hnd.trackers = t; hnd.trackers_cnt++; @@ -920,6 +923,8 @@ Class SWWMCombatTracker : Thinker Console.Printf(StringTable.Localize("$SWWM_LTFORM"),mytag); } } + bBOSS = mytarget.bBOSS|(maxhealth>1000); + bFRIENDLY = mytarget.bFRIENDLY; lasthealth = mytarget.Health; intp.Update(lasthealth); if ( !maxdist ) maxdist = CVar.GetCVar('swwm_maxtargetdist',players[consoleplayer]); diff --git a/zscript/swwm_utility.zsc b/zscript/swwm_utility.zsc index b4b90753e..e8bf9e395 100644 --- a/zscript/swwm_utility.zsc +++ b/zscript/swwm_utility.zsc @@ -874,6 +874,19 @@ Class SWWMUtility if ( a.Species == 'Caco' ) return true; // CH return false; } + + // Друг + static clearscope bool IdentifyingDrug( Actor a ) + { + if ( a is 'Beast' ) return true; + return false; + } + + static clearscope bool IdentifyingDoubleBoi( Actor a ) + { + if ( a is 'Ettin' ) return true; + return false; + } } Class RadiusDebugSphere : Actor