From 6ebc9119378f50a0e50a9fdddd1d6e7a20e9a226 Mon Sep 17 00:00:00 2001 From: necromanceranne <40847847+necromanceranne@users.noreply.github.com> Date: Tue, 16 Mar 2021 04:48:55 +1100 Subject: [PATCH 001/135] Batons knockdown and slowdown on rightclick, otherwise they stagger, but always do damage. Damage respects melee armor, but power cells grant armor pen based on max charge. --- code/__DEFINES/traits.dm | 1 + code/_globalvars/traits.dm | 2 +- code/game/objects/items/stunbaton.dm | 72 ++++++++++++++------- code/game/objects/items/teleprod.dm | 2 +- code/game/objects/structures/watercloset.dm | 2 +- 5 files changed, 53 insertions(+), 26 deletions(-) diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 8e0886a30d..9b4e5a0ada 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -215,6 +215,7 @@ #define TRAIT_NO_STAMINA_BUFFER_REGENERATION "block_stamina_buffer_regen" /// Prevents stamina buffer regeneration #define TRAIT_NO_STAMINA_REGENERATION "block_stamina_regen" /// Prevents stamina regeneration #define TRAIT_ARMOR_BROKEN "armor_broken" //acts as if you are wearing no clothing when taking damage, does not affect non-clothing sources of protection +#define TRAIT_IWASBATONED "iwasbatoned" //some dastardly fellow has struck you with a baton and thought to use another to strike you again, the rogue /// forces update_density to make us not dense #define TRAIT_LIVING_NO_DENSITY "living_no_density" /// forces us to not render our overlays diff --git a/code/_globalvars/traits.dm b/code/_globalvars/traits.dm index ac6ea4e25c..26e0197deb 100644 --- a/code/_globalvars/traits.dm +++ b/code/_globalvars/traits.dm @@ -123,7 +123,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_HIGH_BLOOD" = TRAIT_HIGH_BLOOD, "TRAIT_EMPATH" = TRAIT_EMPATH, "TRAIT_FRIENDLY" = TRAIT_FRIENDLY, - "TRAIT_NICE_SHOT" = TRAIT_NICE_SHOT + "TRAIT_IWASBATONED" = TRAIT_IWASBATONED ), /obj/item/bodypart = list( "TRAIT_PARALYSIS" = TRAIT_PARALYSIS diff --git a/code/game/objects/items/stunbaton.dm b/code/game/objects/items/stunbaton.dm index cc01e6aaee..ece3341eae 100644 --- a/code/game/objects/items/stunbaton.dm +++ b/code/game/objects/items/stunbaton.dm @@ -16,17 +16,20 @@ armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 50, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 80) attack_speed = CLICK_CD_MELEE - var/stamforce = 35 + var/stamina_loss_amount = 35 var/turned_on = FALSE var/knockdown = TRUE var/obj/item/stock_parts/cell/cell var/hitcost = 750 var/throw_hit_chance = 35 var/preload_cell_type //if not empty the baton starts with this type of cell + var/cooldown_duration = 5 SECONDS //How long our baton rightclick goes on cooldown for after applying a knockdown + var/status_duration = 5 SECONDS //how long our status effects last for otherwise + COOLDOWN_DECLARE(shove_cooldown) /obj/item/melee/baton/examine(mob/user) . = ..() - . += "Right click attack while in combat mode to disarm instead of stun." + . += "Right click attack while in combat mode to knockdown, but only once per [cooldown_duration / 10] seconds." /obj/item/melee/baton/get_cell() . = cell @@ -74,6 +77,16 @@ //we're below minimum, turn off switch_status(FALSE) +///Check for our cell to determine how much penetration our weapon does. +/obj/item/melee/baton/proc/get_cell_zap_pen() + var/obj/item/stock_parts/cell/copper_top = get_cell() + if(copper_top) + var/chargepower = copper_top.maxcharge + var/zap_penetration = (chargepower/1000) //This is our effective penetration. Every 1000 max charge, we get 1 pen power. A high capacity cell is equal to 10 armor pen, as an example. + return zap_penetration + else + return 0 + /obj/item/melee/baton/proc/switch_status(new_status = FALSE, silent = FALSE) if(turned_on != new_status) turned_on = new_status @@ -101,6 +114,7 @@ var/obj/item/stock_parts/cell/copper_top = get_cell() if(copper_top) . += "\The [src] is [round(copper_top.percent())]% charged." + . += "\The [src] currently can penetrate [round(copper_top.maxcharge/1000)]% of enemy armor thanks to it's loaded cell." else . += "\The [src] does not have a power source installed." @@ -150,10 +164,10 @@ /obj/item/melee/baton/alt_pre_attack(atom/A, mob/living/user, params) if(!user.CheckActionCooldown(CLICK_CD_MELEE)) return - . = common_baton_melee(A, user, TRUE) //return true (attackchain interrupt) if this also returns true. no harm-disarming. + . = common_baton_melee(A, user, TRUE) //return true (attackchain interrupt) if this also returns true. no harm-shoving. //return TRUE to interrupt attack chain. -/obj/item/melee/baton/proc/common_baton_melee(mob/M, mob/living/user, disarming = FALSE) +/obj/item/melee/baton/proc/common_baton_melee(mob/M, mob/living/user, shoving = FALSE) if(iscyborg(M) || !isliving(M)) //can't baton cyborgs return FALSE if(turned_on && HAS_TRAIT(user, TRAIT_CLUMSY) && prob(50)) @@ -167,21 +181,26 @@ if(check_martial_counter(L, user)) return TRUE if(turned_on) - if(baton_stun(M, user, disarming)) + if(baton_stun(M, user, shoving)) user.do_attack_animation(M) else if(user.a_intent != INTENT_HARM) //they'll try to bash in the last proc. M.visible_message("[user] has prodded [M] with [src]. Luckily it was off.", \ "[user] has prodded you with [src]. Luckily it was off") - return disarming || (user.a_intent != INTENT_HARM) + return shoving || (user.a_intent != INTENT_HARM) -/obj/item/melee/baton/proc/baton_stun(mob/living/L, mob/living/user, disarming = FALSE) +/obj/item/melee/baton/proc/baton_stun(mob/living/L, mob/living/user, shoving = FALSE) var/list/return_list = list() if(L.mob_run_block(src, 0, "[user]'s [name]", ATTACK_TYPE_MELEE, 0, user, null, return_list) & BLOCK_SUCCESS) //No message; check_shields() handles that playsound(L, 'sound/weapons/genhit.ogg', 50, 1) return FALSE - var/stunpwr = stamforce - stunpwr = block_calculate_resultant_damage(stunpwr, return_list) + var/final_stamina_loss_amount = stamina_loss_amount //Our stunning power for the baton + var/shoved = FALSE //Did we succeed on knocking our target over? + var/zap_penetration = get_cell_zap_pen() //Find out what kind of cell we have, and calculating the resultant armor pen we get from it + var/zap_block = L.run_armor_check(BODY_ZONE_CHEST, "melee", null, null, zap_penetration) //armor check, including calculation for armor penetration, for our attack + final_stamina_loss_amount = block_calculate_resultant_damage(final_stamina_loss_amount, return_list) + var/obj/item/stock_parts/cell/our_cell = get_cell() + if(!our_cell) switch_status(FALSE) return FALSE @@ -194,29 +213,34 @@ L.visible_message("[user] has prodded [L] with [src]. Luckily it was out of charge.", \ "[user] has prodded you with [src]. Luckily it was out of charge.") return FALSE - stunpwr *= round(stuncharge/hitcost, 0.1) + final_stamina_loss_amount *= round(stuncharge/hitcost, 0.1) if(user && !user.UseStaminaBuffer(getweight(user, STAM_COST_BATON_MOB_MULT), warn = TRUE)) return FALSE - if(!disarming) - if(knockdown) - L.DefaultCombatKnockdown(50, override_stamdmg = 0) //knockdown - L.adjustStaminaLoss(stunpwr) - else - L.drop_all_held_items() //no knockdown/stamina damage, instead disarm. + if(shoving && COOLDOWN_FINISHED(src, shove_cooldown) && !HAS_TRAIT(L, TRAIT_IWASBATONED)) //Rightclicking applies a knockdown, but only once every couple of seconds, based on the cooldown_duration var. If they were recently knocked down, they can't be knocked down again by a baton. + L.DefaultCombatKnockdown(50, override_stamdmg = 0) + L.apply_status_effect(STATUS_EFFECT_TASED_WEAK, status_duration) //Even if they shove themselves up, they're still slowed. + shoved = TRUE + COOLDOWN_START(src, shove_cooldown, cooldown_duration) + else //If we cannot/don't knock down the target, we apply a stagger, which keeps them from just running off + L.apply_status_effect(STATUS_EFFECT_STAGGERED, status_duration) - L.apply_effect(EFFECT_STUTTER, stamforce) + L.apply_damage (final_stamina_loss_amount, STAMINA, BODY_ZONE_CHEST, zap_block) + L.apply_effect(EFFECT_STUTTER, stamina_loss_amount) SEND_SIGNAL(L, COMSIG_LIVING_MINOR_SHOCK) if(user) L.lastattacker = user.real_name L.lastattackerckey = user.ckey - L.visible_message("[user] has [disarming? "disarmed" : "stunned"] [L] with [src]!", \ - "[user] has [disarming? "disarmed" : "stunned"] you with [src]!") - log_combat(user, L, disarming? "disarmed" : "stunned") + L.visible_message("[user] has [shoved ? "knocked to the floor" : "stunned"] [L] with [src]!", \ + "[user] has [shoved ? "knocked you to the floor" : "stunned you"] with [src]!") + log_combat(user, L, shoved ? "stunned and attempted knockdown" : "stunned") playsound(loc, 'sound/weapons/egloves.ogg', 50, 1, -1) + ADD_TRAIT(L, TRAIT_IWASBATONED, STATUS_EFFECT_TRAIT) //Prevents swapping to a new baton to avoid the cooldown by just acquiring more batons + addtimer(TRAIT_CALLBACK_REMOVE(L, TRAIT_IWASBATONED, STATUS_EFFECT_TRAIT), cooldown_duration) + if(ishuman(L)) var/mob/living/carbon/human/H = L H.forcesay(GLOB.hit_appends) @@ -228,7 +252,7 @@ user.visible_message("[user] accidentally hits [user.p_them()]self with [src]!", \ "You accidentally hit yourself with [src]!") SEND_SIGNAL(user, COMSIG_LIVING_MINOR_SHOCK) - user.DefaultCombatKnockdown(stamforce*6) + user.DefaultCombatKnockdown(stamina_loss_amount*6) playsound(loc, 'sound/weapons/egloves.ogg', 50, 1, -1) deductcharge(hitcost) @@ -306,16 +330,18 @@ w_class = WEIGHT_CLASS_BULKY force = 3 throwforce = 5 - stamforce = 25 + stamina_loss_amount = 25 hitcost = 1000 throw_hit_chance = 10 slot_flags = ITEM_SLOT_BACK + cooldown_duration = 7 SECONDS //It's a little on the weak side + status_duration = 2 //Slows someone for a tiny bit var/obj/item/assembly/igniter/sparkler /obj/item/melee/baton/cattleprod/Initialize() . = ..() sparkler = new (src) - sparkler.activate_cooldown = 5 + sparkler.activate_cooldown = 7 //Helps visualize the knockdown /obj/item/melee/baton/cattleprod/baton_stun() sparkler?.activate() diff --git a/code/game/objects/items/teleprod.dm b/code/game/objects/items/teleprod.dm index 63bde36976..ac853cae56 100644 --- a/code/game/objects/items/teleprod.dm +++ b/code/game/objects/items/teleprod.dm @@ -16,7 +16,7 @@ user.visible_message("[user] accidentally hits [user.p_them()]self with [src]!", \ "You accidentally hit yourself with [src]!") SEND_SIGNAL(user, COMSIG_LIVING_MINOR_SHOCK) - user.DefaultCombatKnockdown(stamforce * 6) + user.DefaultCombatKnockdown(stamina_loss_amount * 6) playsound(loc, 'sound/weapons/egloves.ogg', 50, 1, -1) if(do_teleport(user, get_turf(user), 50, channel = TELEPORT_CHANNEL_BLUESPACE)) deductcharge(hitcost) diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index dba8d5de45..01c62a7901 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -554,7 +554,7 @@ if(B.cell) if(B.cell.charge > 0 && B.turned_on) flick("baton_active", src) - var/stunforce = B.stamforce + var/stunforce = B.stamina_loss_amount user.DefaultCombatKnockdown(stunforce * 2) user.stuttering = stunforce/20 B.deductcharge(B.hitcost) From 29a28d4ed8fc68aa9d3ee6bf288c8cd76c98fecd Mon Sep 17 00:00:00 2001 From: necromanceranne <40847847+necromanceranne@users.noreply.github.com> Date: Tue, 16 Mar 2021 05:52:38 +1100 Subject: [PATCH 002/135] keeps knockdown on rng throw, because you deserve it if you land it --- code/game/objects/items/stunbaton.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/stunbaton.dm b/code/game/objects/items/stunbaton.dm index ece3341eae..9ebe13ca9d 100644 --- a/code/game/objects/items/stunbaton.dm +++ b/code/game/objects/items/stunbaton.dm @@ -57,7 +57,7 @@ ..() //Only mob/living types have stun handling if(turned_on && prob(throw_hit_chance) && iscarbon(hit_atom)) - baton_stun(hit_atom) + baton_stun(hit_atom, shoving = TRUE) /obj/item/melee/baton/loaded //this one starts with a cell pre-installed. preload_cell_type = /obj/item/stock_parts/cell/high/plus From 832fb7a6f846e8efa95b99fda9f211b27f5d2723 Mon Sep 17 00:00:00 2001 From: necromanceranne <40847847+necromanceranne@users.noreply.github.com> Date: Tue, 16 Mar 2021 06:03:22 +1100 Subject: [PATCH 003/135] oops, this should fix that failed check...I hope --- code/game/objects/items/stunbaton.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/stunbaton.dm b/code/game/objects/items/stunbaton.dm index 9ebe13ca9d..9ba22ab0c6 100644 --- a/code/game/objects/items/stunbaton.dm +++ b/code/game/objects/items/stunbaton.dm @@ -56,8 +56,8 @@ /obj/item/melee/baton/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) ..() //Only mob/living types have stun handling - if(turned_on && prob(throw_hit_chance) && iscarbon(hit_atom)) - baton_stun(hit_atom, shoving = TRUE) + if(turned_on && prob(throw_hit_chance) && iscarbon(hit_atom) && thrownby) + baton_stun(hit_atom, thrownby, shoving = TRUE) /obj/item/melee/baton/loaded //this one starts with a cell pre-installed. preload_cell_type = /obj/item/stock_parts/cell/high/plus From 1de69e0dec29c23515db2d3fbb1ea1bb163ad296 Mon Sep 17 00:00:00 2001 From: necromanceranne <40847847+necromanceranne@users.noreply.github.com> Date: Tue, 16 Mar 2021 06:14:49 +1100 Subject: [PATCH 004/135] uuuuh if you say so boss --- code/game/objects/items/stunbaton.dm | 6 +++--- code/game/objects/items/teleprod.dm | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/code/game/objects/items/stunbaton.dm b/code/game/objects/items/stunbaton.dm index 9ba22ab0c6..189cb2fd83 100644 --- a/code/game/objects/items/stunbaton.dm +++ b/code/game/objects/items/stunbaton.dm @@ -343,7 +343,7 @@ sparkler = new (src) sparkler.activate_cooldown = 7 //Helps visualize the knockdown -/obj/item/melee/baton/cattleprod/baton_stun() +/obj/item/melee/baton/cattleprod/baton_stun(mob/living/L, mob/living/carbon/user, shoving = FALSE) sparkler?.activate() . = ..() @@ -370,8 +370,8 @@ /obj/item/melee/baton/boomerang/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) if(turned_on) var/caught = hit_atom.hitby(src, FALSE, FALSE, throwingdatum=throwingdatum) - if(ishuman(hit_atom) && !caught && prob(throw_hit_chance))//if they are a carbon and they didn't catch it - baton_stun(hit_atom) + if(ishuman(hit_atom) && !caught && prob(throw_hit_chance) && thrownby)//if they are a carbon and they didn't catch it + baton_stun(hit_atom, thrownby, shoving = TRUE) if(thrownby && !caught) sleep(1) if(!QDELETED(src)) diff --git a/code/game/objects/items/teleprod.dm b/code/game/objects/items/teleprod.dm index ac853cae56..94eb6fc85b 100644 --- a/code/game/objects/items/teleprod.dm +++ b/code/game/objects/items/teleprod.dm @@ -6,7 +6,7 @@ item_state = "teleprod" slot_flags = null -/obj/item/melee/baton/cattleprod/teleprod/baton_stun(mob/living/L, mob/living/carbon/user)//handles making things teleport when hit +/obj/item/melee/baton/cattleprod/teleprod/baton_stun(mob/living/L, mob/living/carbon/user, shoving = FALSE)//handles making things teleport when hit . = ..() if(!. || L.anchored) return From a61ac1fc684a09fc606b72c662a528b6aab4553e Mon Sep 17 00:00:00 2001 From: necromanceranne <40847847+necromanceranne@users.noreply.github.com> Date: Sat, 20 Mar 2021 04:23:23 +1100 Subject: [PATCH 005/135] Applies off balance on right click, allowing you to shove a weapon out of someones hands --- code/game/objects/items/stunbaton.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/game/objects/items/stunbaton.dm b/code/game/objects/items/stunbaton.dm index 189cb2fd83..ea4ee8f822 100644 --- a/code/game/objects/items/stunbaton.dm +++ b/code/game/objects/items/stunbaton.dm @@ -30,6 +30,7 @@ /obj/item/melee/baton/examine(mob/user) . = ..() . += "Right click attack while in combat mode to knockdown, but only once per [cooldown_duration / 10] seconds." + . += "This knockdown will also put them off balance for [status_duration / 2] seconds, allowing you to shove a weapon out of their hand with a right click in Disarm intent." /obj/item/melee/baton/get_cell() . = cell @@ -221,6 +222,7 @@ if(shoving && COOLDOWN_FINISHED(src, shove_cooldown) && !HAS_TRAIT(L, TRAIT_IWASBATONED)) //Rightclicking applies a knockdown, but only once every couple of seconds, based on the cooldown_duration var. If they were recently knocked down, they can't be knocked down again by a baton. L.DefaultCombatKnockdown(50, override_stamdmg = 0) L.apply_status_effect(STATUS_EFFECT_TASED_WEAK, status_duration) //Even if they shove themselves up, they're still slowed. + L.apply_status_effect(STATUS_EFFECT_OFF_BALANCE, status_duration * 0.5) //They're very likely to drop items if shoved briefly after a knockdown. shoved = TRUE COOLDOWN_START(src, shove_cooldown, cooldown_duration) else //If we cannot/don't knock down the target, we apply a stagger, which keeps them from just running off From 6a752cfd5d43d7f3b2f199d1219215fa83f0da45 Mon Sep 17 00:00:00 2001 From: necromanceranne <40847847+necromanceranne@users.noreply.github.com> Date: Sat, 20 Mar 2021 04:28:20 +1100 Subject: [PATCH 006/135] Not quite right --- code/game/objects/items/stunbaton.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/stunbaton.dm b/code/game/objects/items/stunbaton.dm index ea4ee8f822..9e08edf032 100644 --- a/code/game/objects/items/stunbaton.dm +++ b/code/game/objects/items/stunbaton.dm @@ -30,7 +30,7 @@ /obj/item/melee/baton/examine(mob/user) . = ..() . += "Right click attack while in combat mode to knockdown, but only once per [cooldown_duration / 10] seconds." - . += "This knockdown will also put them off balance for [status_duration / 2] seconds, allowing you to shove a weapon out of their hand with a right click in Disarm intent." + . += "This knockdown will also put them off balance for [status_duration / 20] seconds, allowing you to shove a weapon out of their hand with a right click in Disarm intent." /obj/item/melee/baton/get_cell() . = cell From 45340ef1ac317c80bbffc5e6a9b4bbaf161ed452 Mon Sep 17 00:00:00 2001 From: necromanceranne <40847847+necromanceranne@users.noreply.github.com> Date: Thu, 25 Mar 2021 09:27:33 +1100 Subject: [PATCH 007/135] Makes shove off-balancing remove any active item, not just guns. Makes baton knockdowns not go on cooldown from normal hits, makes baton offbalance trait share a duration. Gives the stunprod a little more oomph to keep it comparable to unarmed. --- code/__DEFINES/combat.dm | 3 --- code/datums/status_effects/debuffs.dm | 3 +-- code/game/objects/items/stunbaton.dm | 10 +++++----- code/modules/mob/living/carbon/human/species.dm | 2 -- 4 files changed, 6 insertions(+), 12 deletions(-) diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm index d12fe77448..d219736abe 100644 --- a/code/__DEFINES/combat.dm +++ b/code/__DEFINES/combat.dm @@ -159,9 +159,6 @@ #define SHOVE_STAGGER_DURATION 35 /// how long they're off balance for #define SHOVE_OFFBALANCE_DURATION 30 -//Shove disarming item list -GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list( - /obj/item/gun))) //Embedded objects diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index fe59bbe14a..10e183a8c8 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -108,8 +108,7 @@ /datum/status_effect/off_balance/on_remove() var/active_item = owner.get_active_held_item() - if(is_type_in_typecache(active_item, GLOB.shove_disarming_types)) - owner.visible_message("[owner.name] regains their grip on \the [active_item]!", "You regain your grip on \the [active_item]", null, COMBAT_MESSAGE_RANGE) + owner.visible_message("[owner.name] regains their grip on \the [active_item]!", "You regain your grip on \the [active_item]", null, COMBAT_MESSAGE_RANGE) return ..() /obj/screen/alert/status_effect/asleep diff --git a/code/game/objects/items/stunbaton.dm b/code/game/objects/items/stunbaton.dm index 9e08edf032..9c5b911376 100644 --- a/code/game/objects/items/stunbaton.dm +++ b/code/game/objects/items/stunbaton.dm @@ -222,9 +222,12 @@ if(shoving && COOLDOWN_FINISHED(src, shove_cooldown) && !HAS_TRAIT(L, TRAIT_IWASBATONED)) //Rightclicking applies a knockdown, but only once every couple of seconds, based on the cooldown_duration var. If they were recently knocked down, they can't be knocked down again by a baton. L.DefaultCombatKnockdown(50, override_stamdmg = 0) L.apply_status_effect(STATUS_EFFECT_TASED_WEAK, status_duration) //Even if they shove themselves up, they're still slowed. - L.apply_status_effect(STATUS_EFFECT_OFF_BALANCE, status_duration * 0.5) //They're very likely to drop items if shoved briefly after a knockdown. + L.apply_status_effect(STATUS_EFFECT_OFF_BALANCE, status_duration) //They're very likely to drop items if shoved briefly after a knockdown. shoved = TRUE COOLDOWN_START(src, shove_cooldown, cooldown_duration) + ADD_TRAIT(L, TRAIT_IWASBATONED, STATUS_EFFECT_TRAIT) //Prevents swapping to a new baton to avoid the cooldown by just acquiring more batons + addtimer(TRAIT_CALLBACK_REMOVE(L, TRAIT_IWASBATONED, STATUS_EFFECT_TRAIT), cooldown_duration) + playsound(loc, 'sound/weapons/zapbang.ogg', 50, 1, -1) else //If we cannot/don't knock down the target, we apply a stagger, which keeps them from just running off L.apply_status_effect(STATUS_EFFECT_STAGGERED, status_duration) @@ -240,9 +243,6 @@ playsound(loc, 'sound/weapons/egloves.ogg', 50, 1, -1) - ADD_TRAIT(L, TRAIT_IWASBATONED, STATUS_EFFECT_TRAIT) //Prevents swapping to a new baton to avoid the cooldown by just acquiring more batons - addtimer(TRAIT_CALLBACK_REMOVE(L, TRAIT_IWASBATONED, STATUS_EFFECT_TRAIT), cooldown_duration) - if(ishuman(L)) var/mob/living/carbon/human/H = L H.forcesay(GLOB.hit_appends) @@ -337,7 +337,7 @@ throw_hit_chance = 10 slot_flags = ITEM_SLOT_BACK cooldown_duration = 7 SECONDS //It's a little on the weak side - status_duration = 2 //Slows someone for a tiny bit + status_duration = 3 //Slows someone for a tiny bit var/obj/item/assembly/igniter/sparkler /obj/item/melee/baton/cattleprod/Initialize() diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 986fc38cd3..89e9f61d6f 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -2039,8 +2039,6 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) user, "You shove [target.name]!") target.Stagger(SHOVE_STAGGER_DURATION) var/obj/item/target_held_item = target.get_active_held_item() - if(!is_type_in_typecache(target_held_item, GLOB.shove_disarming_types)) - target_held_item = null if(!target.has_status_effect(STATUS_EFFECT_OFF_BALANCE)) if(target_held_item) if(!HAS_TRAIT(target_held_item, TRAIT_NODROP)) From 8091844a1ca62cc80b874fe5ae84be1b0e7c3855 Mon Sep 17 00:00:00 2001 From: necromanceranne <40847847+necromanceranne@users.noreply.github.com> Date: Sat, 27 Mar 2021 14:06:41 +1100 Subject: [PATCH 008/135] Urist McGreyshit regains their grip on the ! --- code/datums/status_effects/debuffs.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index 10e183a8c8..0341e243a8 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -108,7 +108,8 @@ /datum/status_effect/off_balance/on_remove() var/active_item = owner.get_active_held_item() - owner.visible_message("[owner.name] regains their grip on \the [active_item]!", "You regain your grip on \the [active_item]", null, COMBAT_MESSAGE_RANGE) + if(active_item) + owner.visible_message("[owner.name] regains their grip on \the [active_item]!", "You regain your grip on \the [active_item]", null, COMBAT_MESSAGE_RANGE) return ..() /obj/screen/alert/status_effect/asleep From 04f90b749f6a72dfdfa097b41aa8c53c3032e975 Mon Sep 17 00:00:00 2001 From: qweq12yt <45515587+qweq12yt@users.noreply.github.com> Date: Tue, 30 Mar 2021 12:33:23 -0300 Subject: [PATCH 009/135] fixes material crates not shipping --- .../closets/secure/secure_closets.dm | 47 +++++++++++++++++++ code/modules/cargo/packs.dm | 5 +- code/modules/cargo/packs/materials.dm | 16 +++---- code/modules/cargo/packs/misc.dm | 2 +- code/modules/shuttle/supply.dm | 1 - 5 files changed, 60 insertions(+), 11 deletions(-) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm index 0c314d988c..5b78ca323c 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm @@ -19,3 +19,50 @@ desc = "A sturdier card-locked storage unit used for bulky shipments." max_integrity = 500 // Same as crates. melee_min_damage = 25 // Idem. + +/obj/structure/closet/secure_closet/goodies/owned + name = "private locker" + desc = "A locker designed to only open for who purchased its contents." + ///Account of the person buying the crate if private purchasing. + var/datum/bank_account/buyer_account + ///Department of the person buying the crate if buying via the NIRN app. + var/datum/bank_account/department/department_account + ///Is the secure crate opened or closed? + var/privacy_lock = TRUE + ///Is the crate being bought by a person, or a budget card? + var/department_purchase = FALSE + +/obj/structure/closet/secure_closet/goodies/owned/examine(mob/user) + . = ..() + . += "It's locked with a privacy lock, and can only be unlocked by the buyer's ID." + +/obj/structure/closet/secure_closet/goodies/owned/Initialize(mapload, datum/bank_account/_buyer_account) + . = ..() + buyer_account = _buyer_account + if(istype(buyer_account, /datum/bank_account/department)) + department_purchase = TRUE + department_account = buyer_account + +/obj/structure/closet/secure_closet/goodies/owned/togglelock(mob/living/user, silent) + if(privacy_lock) + if(!broken) + var/obj/item/card/id/id_card = user.get_idcard(TRUE) + if(id_card) + if(id_card.registered_account) + if(id_card.registered_account == buyer_account || (department_purchase && (id_card.registered_account?.account_job?.paycheck_department) == (department_account.department_id))) + if(iscarbon(user)) + add_fingerprint(user) + locked = !locked + user.visible_message("[user] unlocks [src]'s privacy lock.", + "You unlock [src]'s privacy lock.") + privacy_lock = FALSE + update_icon() + else if(!silent) + to_chat(user, "Bank account does not match with buyer!") + else if(!silent) + to_chat(user, "No linked bank account detected!") + else if(!silent) + to_chat(user, "No ID detected!") + else if(!silent) + to_chat(user, "[src] is broken!") + else ..() diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm index 7ec3a775a5..db722436ca 100644 --- a/code/modules/cargo/packs.dm +++ b/code/modules/cargo/packs.dm @@ -21,7 +21,10 @@ /datum/supply_pack/proc/generate(atom/A, datum/bank_account/paying_account) var/obj/structure/closet/crate/C if(paying_account) - C = new /obj/structure/closet/crate/secure/owned(A, paying_account) + if(ispath(crate_type, /obj/structure/closet/secure_closet/goodies)) + C = new /obj/structure/closet/secure_closet/goodies/owned(A, paying_account) + else + C = new /obj/structure/closet/crate/secure/owned(A, paying_account) C.name = "[crate_name] - Purchased by [paying_account.account_holder]" else C = new crate_type(A) diff --git a/code/modules/cargo/packs/materials.dm b/code/modules/cargo/packs/materials.dm index 86c6b114f0..8b063c1a30 100644 --- a/code/modules/cargo/packs/materials.dm +++ b/code/modules/cargo/packs/materials.dm @@ -14,56 +14,56 @@ ////////////////////////////////////////////////////////////////////////////// /datum/supply_pack/materials/cardboard50 - goody = PACK_GOODY_PUBLIC + crate_type = /obj/structure/closet/secure_closet/goodies name = "50 Cardboard Sheets" desc = "Create a bunch of boxes." cost = 300 //thrice their export value contains = list(/obj/item/stack/sheet/cardboard/fifty) /datum/supply_pack/materials/glass50 - goody = PACK_GOODY_PUBLIC + crate_type = /obj/structure/closet/secure_closet/goodies name = "50 Glass Sheets" desc = "Let some nice light in with fifty glass sheets!" cost = 300 //double their export value contains = list(/obj/item/stack/sheet/glass/fifty) /datum/supply_pack/materials/metal50 - goody = PACK_GOODY_PUBLIC + crate_type = /obj/structure/closet/secure_closet/goodies name = "50 Metal Sheets" desc = "Any construction project begins with a good stack of fifty metal sheets!" cost = 300 //double their export value contains = list(/obj/item/stack/sheet/metal/fifty) /datum/supply_pack/materials/plasteel20 - goody = PACK_GOODY_PUBLIC + crate_type = /obj/structure/closet/secure_closet/goodies name = "20 Plasteel Sheets" desc = "Reinforce the station's integrity with twenty plasteel sheets!" cost = 4000 contains = list(/obj/item/stack/sheet/plasteel/twenty) /datum/supply_pack/materials/plastic50 - goody = PACK_GOODY_PUBLIC + crate_type = /obj/structure/closet/secure_closet/goodies name = "50 Plastic Sheets" desc = "Build a limitless amount of toys with fifty plastic sheets!" cost = 200 // double their export contains = list(/obj/item/stack/sheet/plastic/twenty) /datum/supply_pack/materials/sandstone30 - goody = PACK_GOODY_PUBLIC + crate_type = /obj/structure/closet/secure_closet/goodies name = "30 Sandstone Blocks" desc = "Neither sandy nor stoney, these thirty blocks will still get the job done." cost = 150 // five times their export contains = list(/obj/item/stack/sheet/mineral/sandstone/thirty) /datum/supply_pack/materials/wood50 - goody = PACK_GOODY_PUBLIC + crate_type = /obj/structure/closet/secure_closet/goodies name = "50 Wood Planks" desc = "Turn cargo's boring metal groundwork into beautiful panelled flooring and much more with fifty wooden planks!" cost = 400 // 6-7 planks shy from having equal import/export prices contains = list(/obj/item/stack/sheet/mineral/wood/twenty) /datum/supply_pack/materials/rcdammo - goody = PACK_GOODY_PUBLIC + crate_type = /obj/structure/closet/secure_closet/goodies name = "Large RCD ammo Single-Pack" desc = "A single large compressed RCD matter pack, to help with any holes or projects people might be working on." cost = 600 diff --git a/code/modules/cargo/packs/misc.dm b/code/modules/cargo/packs/misc.dm index 985c827e65..d72ee231a8 100644 --- a/code/modules/cargo/packs/misc.dm +++ b/code/modules/cargo/packs/misc.dm @@ -370,7 +370,7 @@ ////////////////////////////////////////////////////////////////////////////// /datum/supply_pack/misc/carpet - goody = PACK_GOODY_PUBLIC + crate_type = /obj/structure/closet/secure_closet/goodies name = "Classic Carpet Single-Pack" desc = "Plasteel floor tiles getting on your nerves? This 50 units stack of extra soft carpet will tie any room together." cost = 200 diff --git a/code/modules/shuttle/supply.dm b/code/modules/shuttle/supply.dm index 899e2b2f6f..60dfdd53c5 100644 --- a/code/modules/shuttle/supply.dm +++ b/code/modules/shuttle/supply.dm @@ -128,7 +128,6 @@ GLOBAL_LIST_INIT(cargo_shuttle_leave_behind_typecache, typecacheof(list( var/value = 0 var/purchases = 0 var/list/goodies_by_buyer = list() // if someone orders more than GOODY_FREE_SHIPPING_MAX goodies, we upcharge to a normal crate so they can't carry around 20 combat shotties - for(var/datum/supply_order/SO in SSshuttle.shoppinglist) if(!empty_turfs.len) break From 2775543c9734078422075b5d2d6e6183c2a7999b Mon Sep 17 00:00:00 2001 From: qweq12yt <45515587+qweq12yt@users.noreply.github.com> Date: Wed, 31 Mar 2021 00:46:07 -0300 Subject: [PATCH 010/135] additional comments --- code/modules/cargo/packs.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm index db722436ca..f35e2d91ea 100644 --- a/code/modules/cargo/packs.dm +++ b/code/modules/cargo/packs.dm @@ -21,8 +21,8 @@ /datum/supply_pack/proc/generate(atom/A, datum/bank_account/paying_account) var/obj/structure/closet/crate/C if(paying_account) - if(ispath(crate_type, /obj/structure/closet/secure_closet/goodies)) - C = new /obj/structure/closet/secure_closet/goodies/owned(A, paying_account) + if(ispath(crate_type, /obj/structure/closet/secure_closet/goodies)) // lets ensure private orders don't come in crates when the original one comes in lockers + C = new /obj/structure/closet/secure_closet/goodies/owned(A, paying_account) // that would lead to infinite money exploits else C = new /obj/structure/closet/crate/secure/owned(A, paying_account) C.name = "[crate_name] - Purchased by [paying_account.account_holder]" From b97a38f125d1dc22f2b5bd69827bd0da443cb0e5 Mon Sep 17 00:00:00 2001 From: qweq12yt <45515587+qweq12yt@users.noreply.github.com> Date: Wed, 31 Mar 2021 00:55:14 -0300 Subject: [PATCH 011/135] todo comment hopefully i will be able to do it in the future, or someone else will implement it --- code/modules/shuttle/supply.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/shuttle/supply.dm b/code/modules/shuttle/supply.dm index 60dfdd53c5..74ac0fc166 100644 --- a/code/modules/shuttle/supply.dm +++ b/code/modules/shuttle/supply.dm @@ -128,6 +128,7 @@ GLOBAL_LIST_INIT(cargo_shuttle_leave_behind_typecache, typecacheof(list( var/value = 0 var/purchases = 0 var/list/goodies_by_buyer = list() // if someone orders more than GOODY_FREE_SHIPPING_MAX goodies, we upcharge to a normal crate so they can't carry around 20 combat shotties + // var/list/lockers_by_buyer = list() // TODO, combine orders that come in lockers into a single locker to not crowd the shuttle for(var/datum/supply_order/SO in SSshuttle.shoppinglist) if(!empty_turfs.len) break From 37be0768b3f666aa7aedd718a9bf572f2a0af697 Mon Sep 17 00:00:00 2001 From: qweq12yt <45515587+qweq12yt@users.noreply.github.com> Date: Wed, 31 Mar 2021 01:08:01 -0300 Subject: [PATCH 012/135] goodbye define - more comments --- code/__DEFINES/cargo.dm | 5 ++--- code/modules/cargo/packs.dm | 1 + 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/code/__DEFINES/cargo.dm b/code/__DEFINES/cargo.dm index 40a50fe1e6..85e5e9d2ac 100644 --- a/code/__DEFINES/cargo.dm +++ b/code/__DEFINES/cargo.dm @@ -60,6 +60,5 @@ GLOBAL_LIST_INIT(podstyles, list(\ )) //cit -#define PACK_GOODY_NONE 0 -#define PACK_GOODY_PUBLIC 1 //can be bought by both privates and cargo -#define PACK_GOODY_PRIVATE 2 //can be bought only by privates +#define PACK_GOODY_NONE 0 // can be bought by cargo and privates +#define PACK_GOODY_PRIVATE 1 // can be bought only by privates diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm index f35e2d91ea..3e3aeff592 100644 --- a/code/modules/cargo/packs.dm +++ b/code/modules/cargo/packs.dm @@ -15,6 +15,7 @@ var/special_enabled = FALSE var/DropPodOnly = FALSE //only usable by the Bluespace Drop Pod via the express cargo console var/admin_spawned = FALSE //Can only an admin spawn this crate? + // this might be all in all unnecessary with current code if some changes are made var/goody = PACK_GOODY_NONE //Small items can be grouped into a single crate.They also come in a closet/lockbox instead of a full crate, so the 700 min doesn't apply var/can_private_buy = TRUE //Can it be purchased privately by each crewmember? From 6ae984971cfdbc9d72d4c520efe381193babfecd Mon Sep 17 00:00:00 2001 From: Putnam Date: Tue, 30 Mar 2021 23:25:36 -0700 Subject: [PATCH 013/135] Ported bluespace pipes from yogs --- code/game/machinery/pipe/construction.dm | 19 ++++ .../atmospherics/machinery/pipes/bluespace.dm | 86 ++++++++++++++++++ .../research/designs/bluespace_designs.dm | 10 ++ .../research/techweb/nodes/bluespace_nodes.dm | 2 +- icons/obj/atmospherics/pipes/bluespace.dmi | Bin 0 -> 677 bytes 5 files changed, 116 insertions(+), 1 deletion(-) create mode 100644 code/modules/atmospherics/machinery/pipes/bluespace.dm create mode 100644 icons/obj/atmospherics/pipes/bluespace.dmi diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index 141afa53e7..d825cb5a23 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -236,3 +236,22 @@ Buildable meters /obj/item/pipe_meter/proc/setAttachLayer(new_layer = PIPING_LAYER_DEFAULT) piping_layer = new_layer PIPING_LAYER_DOUBLE_SHIFT(src, piping_layer) + +/obj/item/pipe/bluespace + pipe_type = /obj/machinery/atmospherics/pipe/bluespace + var/bluespace_network_name = "default" + icon_state = "bluespace" + disposable = FALSE + +/obj/item/pipe/bluespace/attack_self(mob/user) + var/new_name = input(user, "Enter identifier for bluespace pipe network", "bluespace pipe", bluespace_network_name) as text|null + if(!isnull(new_name)) + bluespace_network_name = new_name + +/obj/item/pipe/bluespace/make_from_existing(obj/machinery/atmospherics/pipe/bluespace/make_from) + bluespace_network_name = make_from.bluespace_network_name + return ..() + +/obj/item/pipe/bluespace/build_pipe(obj/machinery/atmospherics/pipe/bluespace/A) + A.bluespace_network_name = bluespace_network_name + return ..() diff --git a/code/modules/atmospherics/machinery/pipes/bluespace.dm b/code/modules/atmospherics/machinery/pipes/bluespace.dm new file mode 100644 index 0000000000..2735a38106 --- /dev/null +++ b/code/modules/atmospherics/machinery/pipes/bluespace.dm @@ -0,0 +1,86 @@ +GLOBAL_LIST_EMPTY(bluespace_pipe_networks) +/obj/machinery/atmospherics/pipe/bluespace + name = "bluespace pipe" + desc = "Transmits gas across large distances of space. Developed using bluespace technology." + icon = 'icons/obj/atmospherics/pipes/bluespace.dmi' + icon_state = "map" + pipe_state = "bluespace" + dir = SOUTH + initialize_directions = SOUTH + device_type = UNARY + can_buckle = FALSE + construction_type = /obj/item/pipe/bluespace + var/bluespace_network_name + +/obj/machinery/atmospherics/pipe/bluespace/New() + icon_state = "pipe" + if(bluespace_network_name) // in case someone maps one in for some reason + if(!GLOB.bluespace_pipe_networks[bluespace_network_name]) + GLOB.bluespace_pipe_networks[bluespace_network_name] = list() + GLOB.bluespace_pipe_networks[bluespace_network_name] |= src + ..() + +/obj/machinery/atmospherics/pipe/bluespace/on_construction() + . = ..() + if(bluespace_network_name) + if(!GLOB.bluespace_pipe_networks[bluespace_network_name]) + GLOB.bluespace_pipe_networks[bluespace_network_name] = list() + GLOB.bluespace_pipe_networks[bluespace_network_name] |= src + +/obj/machinery/atmospherics/pipe/bluespace/Destroy() + if(GLOB.bluespace_pipe_networks[bluespace_network_name]) + GLOB.bluespace_pipe_networks[bluespace_network_name] -= src + for(var/p in GLOB.bluespace_pipe_networks[bluespace_network_name]) + var/obj/machinery/atmospherics/pipe/bluespace/P = p + QDEL_NULL(P.parent) + P.build_network() + return ..() + +/obj/machinery/atmospherics/pipe/bluespace/examine(user) + . = ..() + . += "This one is connected to the \"[html_encode(bluespace_network_name)]\" network." + +/obj/machinery/atmospherics/pipe/bluespace/SetInitDirections() + initialize_directions = dir + +/obj/machinery/atmospherics/pipe/bluespace/pipeline_expansion() + return ..() + GLOB.bluespace_pipe_networks[bluespace_network_name] - src + +/obj/machinery/atmospherics/pipe/bluespace/hide() + update_icon() + +/obj/machinery/atmospherics/pipe/bluespace/update_icon(showpipe) + underlays.Cut() + + var/turf/T = loc + if(level == 2 || !T.intact) + showpipe = TRUE + plane = GAME_PLANE + else + showpipe = FALSE + plane = FLOOR_PLANE + + if(!showpipe) + return //no need to update the pipes if they aren't showing + + var/connected = 0 //Direction bitset + + for(var/i in 1 to device_type) //adds intact pieces + if(nodes[i]) + var/obj/machinery/atmospherics/node = nodes[i] + var/image/img = get_pipe_underlay("pipe_intact", get_dir(src, node), node.pipe_color) + underlays += img + connected |= img.dir + + for(var/direction in GLOB.cardinals) + if((initialize_directions & direction) && !(connected & direction)) + underlays += get_pipe_underlay("pipe_exposed", direction) + +/obj/machinery/atmospherics/pipe/bluespace/paint() + return FALSE + +/obj/machinery/atmospherics/pipe/bluespace/proc/get_pipe_underlay(state, dir, color = null) + if(color) + . = getpipeimage('icons/obj/atmospherics/components/binary_devices.dmi', state, dir, color) + else + . = getpipeimage('icons/obj/atmospherics/components/binary_devices.dmi', state, dir) diff --git a/code/modules/research/designs/bluespace_designs.dm b/code/modules/research/designs/bluespace_designs.dm index a70449b035..cf6aff5918 100644 --- a/code/modules/research/designs/bluespace_designs.dm +++ b/code/modules/research/designs/bluespace_designs.dm @@ -105,3 +105,13 @@ materials = list(/datum/material/iron = 2000, /datum/material/bluespace = 500) category = list("Bluespace Designs") departmental_flags = DEPARTMENTAL_FLAG_SERVICE + +/datum/design/bluespace_pipe + name = "Bluespace Pipe" + desc = "A pipe that teleports gases." + id = "bluespace_pipe" + build_type = PROTOLATHE + materials = list(/datum/material/gold = 1000, /datum/material/diamond = 750, /datum/material/uranium = 250, /datum/material/bluespace = 2000) + build_path = /obj/item/pipe/bluespace + category = list("Bluespace Designs") + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING diff --git a/code/modules/research/techweb/nodes/bluespace_nodes.dm b/code/modules/research/techweb/nodes/bluespace_nodes.dm index 6c782456a8..90b69eb28d 100644 --- a/code/modules/research/techweb/nodes/bluespace_nodes.dm +++ b/code/modules/research/techweb/nodes/bluespace_nodes.dm @@ -61,7 +61,7 @@ display_name = "Bluespace Travel" description = "Application of Bluespace for static teleportation technology." prereq_ids = list("adv_power", "adv_bluespace") - design_ids = list("tele_station", "tele_hub", "quantumpad", "quantum_keycard", "launchpad", "launchpad_console", "teleconsole", "roastingstick") + design_ids = list("tele_station", "tele_hub", "quantumpad", "quantum_keycard", "launchpad", "launchpad_console", "teleconsole", "roastingstick", "bluespace_pipe") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) /datum/techweb_node/unregulated_bluespace diff --git a/icons/obj/atmospherics/pipes/bluespace.dmi b/icons/obj/atmospherics/pipes/bluespace.dmi new file mode 100644 index 0000000000000000000000000000000000000000..866e6f9b844f4f4a9c987755618f0d3ca5a9087f GIT binary patch literal 677 zcmV;W0$TlvP)V!Y0R8_htE;PQY;6CPVgJl#eSLkvz`zX+ z4PIVegM)*(xVRY^86O`X8X6k4wY41`9b#f)x3{;3hK3s(8(CRdw6wG%F=jRZ0004W zQchCV=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ> zRWQ*r;NmRLOex6#a*U0*I5Sc+(=$pSoZ^zil2jm5sUWi;Rf&r;C9|j)$Tj5ROe;#v zO$D*dfTF26iIpH>9g-lz^xVV(?1me1DJ!`8xqzJv05#Dr#k$KneEa!CT?#h!$R^WZnO?Z6-nypoZd+G38!XgQfoq6@ci9H62}G(+w9DyIQ0_?@P`l4G z5M2s_ra$GMmx8vH225?6X&^ew3KX5iA!PKlf-bF)x-PfEj?)4ZJrL6_qYv-Uv;L0# zoip4mXY(DrW^FiQc^8sh|G2gR3A4q>z=LcoJ z81j9J->l?+89!8=QvTQH15)RMw8Nn4vH*2HkP1EjhkLqq1~wnqd|()cVHl6W;R>dI zjQvQA5QjsYa}CI#pYwf>GMMr`%3#j-D1$lQ!*(#`d)yiP Date: Tue, 30 Mar 2021 23:35:47 -0700 Subject: [PATCH 014/135] why did this not update --- tgstation.dme | 1 + 1 file changed, 1 insertion(+) diff --git a/tgstation.dme b/tgstation.dme index db49b62864..d3ade0623e 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1808,6 +1808,7 @@ #include "code\modules\atmospherics\machinery\components\unary_devices\vent_scrubber.dm" #include "code\modules\atmospherics\machinery\other\meter.dm" #include "code\modules\atmospherics\machinery\other\miner.dm" +#include "code\modules\atmospherics\machinery\pipes\bluespace.dm" #include "code\modules\atmospherics\machinery\pipes\layermanifold.dm" #include "code\modules\atmospherics\machinery\pipes\manifold.dm" #include "code\modules\atmospherics\machinery\pipes\manifold4w.dm" From 68ad5c2e5c6db6badfea8ecd22f50ee5b88bb436 Mon Sep 17 00:00:00 2001 From: Putnam Date: Tue, 30 Mar 2021 23:56:12 -0700 Subject: [PATCH 015/135] disposability --- code/game/machinery/pipe/construction.dm | 1 + code/game/objects/items/RPD.dm | 14 ++++++++------ 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index d825cb5a23..5b30105409 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -21,6 +21,7 @@ Buildable meters level = 2 var/piping_layer = PIPING_LAYER_DEFAULT var/RPD_type + var/disposable = TRUE /obj/item/pipe/directional RPD_type = PIPE_UNARY diff --git a/code/game/objects/items/RPD.dm b/code/game/objects/items/RPD.dm index 70e4441c66..635ea97902 100644 --- a/code/game/objects/items/RPD.dm +++ b/code/game/objects/items/RPD.dm @@ -375,12 +375,14 @@ GLOBAL_LIST_INIT(fluid_duct_recipes, list( . = TRUE if((mode & DESTROY_MODE) && istype(A, /obj/item/pipe) || istype(A, /obj/structure/disposalconstruct) || istype(A, /obj/structure/c_transit_tube) || istype(A, /obj/structure/c_transit_tube_pod) || istype(A, /obj/item/pipe_meter)) - to_chat(user, "You start destroying a pipe...") - playsound(get_turf(src), 'sound/machines/click.ogg', 50, 1) - if(do_after(user, destroy_speed, target = A)) - activate() - qdel(A) - return + var/obj/item/pipe/P = A + if(!istype(P) || P.disposable) + to_chat(user, "You start destroying a pipe...") + playsound(get_turf(src), 'sound/machines/click.ogg', 50, 1) + if(do_after(user, destroy_speed, target = A)) + activate() + qdel(A) + return if((mode & PAINT_MODE)) if(istype(A, /obj/machinery/atmospherics/pipe) && !istype(A, /obj/machinery/atmospherics/pipe/layer_manifold)) From 43d855c41339c7e16072f5abc41dcdd493b85ff4 Mon Sep 17 00:00:00 2001 From: Blue Wildrose Date: Sun, 4 Apr 2021 17:05:18 -0700 Subject: [PATCH 016/135] Killable space pirate sleepers --- .../objects/structures/ghost_role_spawners.dm | 41 ++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/code/game/objects/structures/ghost_role_spawners.dm b/code/game/objects/structures/ghost_role_spawners.dm index 306868daba..a14c1208cd 100644 --- a/code/game/objects/structures/ghost_role_spawners.dm +++ b/code/game/objects/structures/ghost_role_spawners.dm @@ -590,7 +590,7 @@ /obj/effect/mob_spawn/human/pirate name = "space pirate sleeper" - desc = "A cryo sleeper smelling faintly of rum." + desc = "A cryo sleeper smelling faintly of rum. The sleeper looks unstable. Perhaps the pirate within can be killed with the right tools..." job_description = "Space Pirate" random = TRUE icon = 'icons/obj/machines/sleeper.dmi' @@ -608,6 +608,45 @@ assignedrole = "Space Pirate" var/rank = "Mate" +/obj/effect/mob_spawn/human/pirate/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags) + . = ..() + if(.) + return + if(user.mind.has_antag_datum(/datum/antagonist/pirate)) + to_chat(user, "Your shipmate sails within their dreams for now. Perhaps they may wake up eventually.") + else + to_chat(user, "If you want to kill the pirate off, something to pry open the sleeper might be the best way to do it.") + + +/obj/effect/mob_spawn/human/pirate/attackby(obj/item/W, mob/user, params) + if(W.tool_behaviour == TOOL_CROWBAR && user.a_intent != INTENT_HARM) + if(user.mind.has_antag_datum(/datum/antagonist/pirate)) + to_chat(user,"Why would you want to do that to your shipmate? That'd kill them.") + return + user.visible_message("[usr.name] pries open the [src], disrupting the sleep of the pirate within and killing them.", + "You pry open the [src], disrupting the sleep of the pirate within and killing them.", + "You hear prying, followed by the death rattling of bones.") + W.play_tool_sound(src) + playsound(src.loc, 'modular_citadel/sound/voice/scream_skeleton.ogg', 50, 1, 4, 1.2) + if(rank == "Captain") new /obj/effect/mob_spawn/human/pirate/corpse/captain(get_turf(src)) + else new /obj/effect/mob_spawn/human/pirate/corpse(get_turf(src)) + qdel(src) + else + ..() + +/obj/effect/mob_spawn/human/pirate/corpse //occurs when someone pries a pirate out of their sleeper. + mob_name = "Dead Space Pirate" + death = TRUE + instant = TRUE + random = FALSE + +/obj/effect/mob_spawn/human/pirate/corpse/Destroy() + return ..() +/obj/effect/mob_spawn/human/pirate/corpse/captain + rank = "Captain" + mob_name = "Dead Space Pirate Captain" + outfit = /datum/outfit/pirate/space/captain + /obj/effect/mob_spawn/human/pirate/special(mob/living/new_spawn) new_spawn.fully_replace_character_name(new_spawn.real_name,generate_pirate_name()) new_spawn.mind.add_antag_datum(/datum/antagonist/pirate) From 414d9d43e3802928d2af93c6cbfd4ccd512c7a26 Mon Sep 17 00:00:00 2001 From: Blue Wildrose Date: Sun, 4 Apr 2021 18:50:11 -0700 Subject: [PATCH 017/135] adding a gap here --- code/game/objects/structures/ghost_role_spawners.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/objects/structures/ghost_role_spawners.dm b/code/game/objects/structures/ghost_role_spawners.dm index a14c1208cd..9a85a700e2 100644 --- a/code/game/objects/structures/ghost_role_spawners.dm +++ b/code/game/objects/structures/ghost_role_spawners.dm @@ -642,6 +642,7 @@ /obj/effect/mob_spawn/human/pirate/corpse/Destroy() return ..() + /obj/effect/mob_spawn/human/pirate/corpse/captain rank = "Captain" mob_name = "Dead Space Pirate Captain" From fb79a2033d68c201e2f2b4b4430defcab894f3e0 Mon Sep 17 00:00:00 2001 From: Blue Wildrose Date: Sun, 4 Apr 2021 21:34:27 -0700 Subject: [PATCH 018/135] usr.name into user, also adding in do_after. --- .../objects/structures/ghost_role_spawners.dm | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/code/game/objects/structures/ghost_role_spawners.dm b/code/game/objects/structures/ghost_role_spawners.dm index 9a85a700e2..2e1f76cefe 100644 --- a/code/game/objects/structures/ghost_role_spawners.dm +++ b/code/game/objects/structures/ghost_role_spawners.dm @@ -623,14 +623,19 @@ if(user.mind.has_antag_datum(/datum/antagonist/pirate)) to_chat(user,"Why would you want to do that to your shipmate? That'd kill them.") return - user.visible_message("[usr.name] pries open the [src], disrupting the sleep of the pirate within and killing them.", - "You pry open the [src], disrupting the sleep of the pirate within and killing them.", - "You hear prying, followed by the death rattling of bones.") + user.visible_message("[user] start to pry open the [src]...", + "You start to pry open the [src]...", + "You hear prying...") W.play_tool_sound(src) - playsound(src.loc, 'modular_citadel/sound/voice/scream_skeleton.ogg', 50, 1, 4, 1.2) - if(rank == "Captain") new /obj/effect/mob_spawn/human/pirate/corpse/captain(get_turf(src)) - else new /obj/effect/mob_spawn/human/pirate/corpse(get_turf(src)) - qdel(src) + if(do_after(user, 100*W.toolspeed, target = src)) + user.visible_message("[user] pries open the [src], disrupting the sleep of the pirate within and killing them.", + "You pry open the [src], disrupting the sleep of the pirate within and killing them.", + "You hear prying, followed by the death rattling of bones.") + W.play_tool_sound(src) + playsound(src.loc, 'modular_citadel/sound/voice/scream_skeleton.ogg', 50, 1, 4, 1.2) + if(rank == "Captain") new /obj/effect/mob_spawn/human/pirate/corpse/captain(get_turf(src)) + else new /obj/effect/mob_spawn/human/pirate/corpse(get_turf(src)) + qdel(src) else ..() From f1b45b3839d2c012ffcceffa967bea9eac93babc Mon Sep 17 00:00:00 2001 From: zerothebigboy Date: Mon, 5 Apr 2021 21:55:17 -0400 Subject: [PATCH 019/135] eatshitanddie --- code/modules/admin/verbs/randomverbs.dm | 49 +++ .../simple_animal/hostile/megafauna/drake.dm | 330 ++++++++++++------ 2 files changed, 269 insertions(+), 110 deletions(-) diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index e5390bc457..199004abed 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -1547,6 +1547,55 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits msg += "" src << browse(msg.Join(), "window=Player_playtime_check") +/obj/effect/temp_visual/fireball + icon = 'icons/obj/wizard.dmi' + icon_state = "fireball" + name = "fireball" + desc = "Get out of the way!" + layer = FLY_LAYER + randomdir = FALSE + duration = 9 + pixel_z = 270 + +/obj/effect/temp_visual/fireball/Initialize() + . = ..() + animate(src, pixel_z = 0, time = duration) + +/obj/effect/temp_visual/target + icon = 'icons/mob/actions/actions_items.dmi' + icon_state = "sniper_zoom" + layer = BELOW_MOB_LAYER + light_range = 2 + duration = 9 + +/obj/effect/temp_visual/target/ex_act() + return + +/obj/effect/temp_visual/target/Initialize(mapload, list/flame_hit) + . = ..() + INVOKE_ASYNC(src, .proc/fall, flame_hit) + +/obj/effect/temp_visual/target/proc/fall(list/flame_hit) + var/turf/T = get_turf(src) + playsound(T,'sound/magic/fleshtostone.ogg', 80, 1) + new /obj/effect/temp_visual/fireball(T) + sleep(duration) + if(ismineralturf(T)) + var/turf/closed/mineral/M = T + M.gets_drilled() + playsound(T, "explosion", 80, 1) + new /obj/effect/hotspot(T) + T.hotspot_expose(700, 50, 1) + for(var/mob/living/L in T.contents) + if(istype(L, /mob/living/simple_animal/hostile/megafauna/dragon)) + continue + if(islist(flame_hit) && !flame_hit[L]) + L.adjustFireLoss(40) + to_chat(L, "You're hit by the drake's fire breath!") + flame_hit[L] = TRUE + else + L.adjustFireLoss(10) //if we've already hit them, do way less damage + /datum/admins/proc/cmd_show_exp_panel(client/client_to_check) if(!check_rights(R_ADMIN)) return diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm index 9dd2441829..769946bb6c 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm @@ -63,7 +63,7 @@ Difficulty: Medium butcher_results = list(/obj/item/stack/ore/diamond = 5, /obj/item/stack/sheet/sinew = 5, /obj/item/stack/sheet/bone = 30) guaranteed_butcher_results = list(/obj/item/stack/sheet/animalhide/ashdrake = 10) var/swooping = NONE - var/swoop_cooldown = 0 + var/player_cooldown = 0 achievement_type = /datum/award/achievement/boss/drake_kill crusher_achievement_type = /datum/award/achievement/boss/drake_crusher score_achievement_type = /datum/award/score/drake_score @@ -116,66 +116,167 @@ Difficulty: Medium ranged_cooldown = world.time + ranged_cooldown_time if(prob(15 + anger_modifier) && !client) - if(health < maxHealth/2) - INVOKE_ASYNC(src, .proc/swoop_attack, TRUE, null, 50) + if(health < maxHealth*0.5) + swoop_attack(lava_arena = TRUE) else - fire_rain() + lava_swoop() else if(prob(10+anger_modifier) && !client) - if(health > maxHealth/2) - INVOKE_ASYNC(src, .proc/swoop_attack) + if(health < maxHealth*0.5) + mass_fire() else - INVOKE_ASYNC(src, .proc/triple_swoop) + fire_cone() else - fire_walls() + if(prob(50) && !client) + INVOKE_ASYNC(src, .proc/lava_pools, 10, 2) + fire_cone() -/mob/living/simple_animal/hostile/megafauna/dragon/proc/fire_rain() +/mob/living/simple_animal/hostile/megafauna/dragon/proc/lava_pools(var/amount, var/delay = 0.8) if(!target) return - target.visible_message("Fire rains from the sky!") - for(var/turf/turf in range(9,get_turf(target))) - if(prob(11)) - new /obj/effect/temp_visual/target(turf) - -/mob/living/simple_animal/hostile/megafauna/dragon/proc/fire_walls() - playsound(get_turf(src),'sound/magic/fireball.ogg', 200, 1) - - for(var/d in GLOB.cardinals) - INVOKE_ASYNC(src, .proc/fire_wall, d) - -/mob/living/simple_animal/hostile/megafauna/dragon/proc/fire_wall(dir) - var/list/hit_things = list(src) - var/turf/E = get_edge_target_turf(src, dir) - var/range = 10 - var/turf/previousturf = get_turf(src) - for(var/turf/J in getline(src,E)) - if(!range || (J != previousturf && (!previousturf.atmos_adjacent_turfs || !previousturf.atmos_adjacent_turfs[J]))) + target.visible_message("Lava starts to pool up around you!") + while(amount > 0) + if(!target) break - range-- - new /obj/effect/hotspot(J) - J.hotspot_expose(DRAKE_FIRE_TEMP, DRAKE_FIRE_EXPOSURE, 1) - for(var/mob/living/L in J.contents - hit_things) - if(istype(L, /mob/living/simple_animal/hostile/megafauna/dragon)) + var/turf/T = pick(RANGE_TURFS(1, target)) + new /obj/effect/temp_visual/lava_warning(T, 60) // longer reset time for the lava + amount-- + sleep(delay) + +/mob/living/simple_animal/hostile/megafauna/dragon/proc/lava_swoop(var/amount = 30) + INVOKE_ASYNC(src, .proc/lava_pools, amount) + swoop_attack(FALSE, target, 1000) // longer cooldown until it gets reset below + fire_cone() + if(health < maxHealth*0.5) + sleep(10) + fire_cone() + sleep(10) + fire_cone() + SetRecoveryTime(40) + +/mob/living/simple_animal/hostile/megafauna/dragon/proc/mass_fire(var/spiral_count = 12, var/range = 15, var/times = 3) + for(var/i = 1 to times) + SetRecoveryTime(50) + playsound(get_turf(src),'sound/magic/fireball.ogg', 200, 1) + var/increment = 360 / spiral_count + for(var/j = 1 to spiral_count) + var/list/turfs = line_target(j * increment + i * increment / 2, range, src) + INVOKE_ASYNC(src, .proc/fire_line, turfs) + sleep(25) + SetRecoveryTime(30) + +/mob/living/simple_animal/hostile/megafauna/dragon/proc/lava_arena() + if(!target) + return + target.visible_message("[src] encases you in an arena of fire!") + var/amount = 3 + var/turf/center = get_turf(target) + var/list/walled = RANGE_TURFS(3, center) - RANGE_TURFS(2, center) + var/list/drakewalls = list() + for(var/turf/T in walled) + drakewalls += new /obj/effect/temp_visual/drakewall(T) // no people with lava immunity can just run away from the attack for free + var/list/indestructible_turfs = list() + for(var/turf/T in RANGE_TURFS(2, center)) + if(istype(T, /turf/open/indestructible)) + continue + if(!istype(T, /turf/closed/indestructible)) + T.ChangeTurf(/turf/open/floor/plating/asteroid/basalt/lava_land_surface) + else + indestructible_turfs += T + sleep(10) // give them a bit of time to realize what attack is actually happening + + var/list/turfs = RANGE_TURFS(2, center) + while(amount > 0) + var/list/empty = indestructible_turfs.Copy() // can't place safe turfs on turfs that weren't changed to be open + var/any_attack = 0 + for(var/turf/T in turfs) + for(var/mob/living/L in T.contents) + if(L.client) + empty += pick(((RANGE_TURFS(2, L) - RANGE_TURFS(1, L)) & turfs) - empty) // picks a turf within 2 of the creature not outside or in the shield + any_attack = 1 + for(var/obj/mecha/M in T.contents) + empty += pick(((RANGE_TURFS(2, M) - RANGE_TURFS(1, M)) & turfs) - empty) + any_attack = 1 + if(!any_attack) + for(var/obj/effect/temp_visual/drakewall/D in drakewalls) + qdel(D) + return 0 // nothing to attack in the arena time for enraged attack if we still have a target + for(var/turf/T in turfs) + if(!(T in empty)) + new /obj/effect/temp_visual/lava_warning(T) + else if(!istype(T, /turf/closed/indestructible)) + new /obj/effect/temp_visual/lava_safe(T) + amount-- + sleep(24) + return 1 // attack finished completely + +/mob/living/simple_animal/hostile/megafauna/dragon/proc/arena_escape_enrage() // you ran somehow / teleported away from my arena attack now i'm mad fucker + SetRecoveryTime(80) + visible_message("[src] starts to glow vibrantly as its wounds close up!") + adjustBruteLoss(-250) // yeah you're gonna pay for that, don't run nerd + add_atom_colour(rgb(255, 255, 0), TEMPORARY_COLOUR_PRIORITY) + move_to_delay = move_to_delay / 2 + light_range = 10 + sleep(10) // run. + mass_fire(20, 15, 3) + remove_atom_colour(TEMPORARY_COLOUR_PRIORITY) + move_to_delay = initial(move_to_delay) + light_range = initial(light_range) + +/mob/living/simple_animal/hostile/megafauna/dragon/proc/fire_cone(var/atom/at = target) + playsound(get_turf(src),'sound/magic/fireball.ogg', 200, 1) + if(QDELETED(src) || stat == DEAD) // we dead no fire + return + var/range = 15 + var/list/turfs = list() + turfs = line_target(-40, range, at) + INVOKE_ASYNC(src, .proc/fire_line, turfs) + turfs = line_target(0, range, at) + INVOKE_ASYNC(src, .proc/fire_line, turfs) + turfs = line_target(40, range, at) + INVOKE_ASYNC(src, .proc/fire_line, turfs) + +/mob/living/simple_animal/hostile/megafauna/dragon/proc/line_target(var/offset, var/range, var/atom/at = target) + if(!at) + return + var/angle = ATAN2(at.x - src.x, at.y - src.y) + offset + var/turf/T = get_turf(src) + for(var/i in 1 to range) + var/turf/check = locate(src.x + cos(angle) * i, src.y + sin(angle) * i, src.z) + if(!check) + break + T = check + return (getline(src, T) - get_turf(src)) + +/mob/living/simple_animal/hostile/megafauna/dragon/proc/fire_line(var/list/turfs) + var/list/hit_list = list() + for(var/turf/T in turfs) + if(istype(T, /turf/closed)) + break + new /obj/effect/hotspot(T) + T.hotspot_expose(700,50,1) + for(var/mob/living/L in T.contents) + if(L in hit_list || L == src) continue + hit_list += L L.adjustFireLoss(20) - to_chat(L, "You're hit by the drake's fire breath!") - hit_things += L - previousturf = J - sleep(1) + to_chat(L, "You're hit by [src]'s fire breath!") -/mob/living/simple_animal/hostile/megafauna/dragon/proc/triple_swoop() - swoop_attack(swoop_duration = 30) - swoop_attack(swoop_duration = 30) - swoop_attack(swoop_duration = 30) + // deals damage to mechs + for(var/obj/mecha/M in T.contents) + if(M in hit_list) + continue + hit_list += M + M.take_damage(45, BRUTE, "melee", 1) + sleep(1.5) -/mob/living/simple_animal/hostile/megafauna/dragon/proc/swoop_attack(fire_rain, atom/movable/manual_target, swoop_duration = 40) +/mob/living/simple_animal/hostile/megafauna/dragon/proc/swoop_attack(lava_arena = FALSE, atom/movable/manual_target, var/swoop_cooldown = 30) if(stat || swooping) return if(manual_target) target = manual_target if(!target) return - swoop_cooldown = world.time + 200 stop_automated_movement = TRUE swooping |= SWOOP_DAMAGEABLE density = FALSE @@ -209,32 +310,16 @@ Difficulty: Medium swooping |= SWOOP_INVULNERABLE mouse_opacity = MOUSE_OPACITY_TRANSPARENT sleep(7) - var/list/flame_hit = list() - while(swoop_duration > 0) - if(!target && !FindTarget()) - break //we lost our target while chasing it down and couldn't get a new one - if(swoop_duration < 7) - fire_rain = FALSE //stop raining fire near the end of the swoop - if(loc == get_turf(target)) - if(!fire_rain) - break //we're not spewing fire at our target, slam they - if(isliving(target)) - var/mob/living/L = target - if(L.stat == DEAD) - break //target is dead and we're on em, slam they - if(fire_rain) - new /obj/effect/temp_visual/target(loc, flame_hit) + + while(target && loc != get_turf(target)) forceMove(get_step(src, get_dir(src, target))) - if(loc == get_turf(target)) - if(!fire_rain) - break - if(isliving(target)) - var/mob/living/L = target - if(L.stat == DEAD) - break - var/swoop_speed = 1.5 - swoop_duration -= swoop_speed - sleep(swoop_speed) + sleep(0.5) + + // Ash drake flies onto its target and rains fire down upon them + var/descentTime = 10; + var/lava_success = 1 + if(lava_arena) + lava_success = lava_arena() //ensure swoop direction continuity. if(negative) @@ -245,8 +330,8 @@ Difficulty: Medium negative = TRUE new /obj/effect/temp_visual/dragon_flight/end(loc, negative) new /obj/effect/temp_visual/dragon_swoop(loc) - animate(src, alpha = 255, transform = oldtransform, time = 5) - sleep(5) + animate(src, alpha = 255, transform = oldtransform, descentTime) + sleep(descentTime) swooping &= ~SWOOP_INVULNERABLE mouse_opacity = initial(mouse_opacity) icon_state = "dragon" @@ -264,6 +349,8 @@ Difficulty: Medium var/throwtarget = get_edge_target_turf(src, throw_dir) L.throw_at(throwtarget, 3) visible_message("[L] is thrown clear of [src]!") + for(var/obj/mecha/M in orange(1, src)) + M.take_damage(75, BRUTE, "melee", 1) for(var/mob/M in range(7, src)) shake_camera(M, 15, 1) @@ -271,16 +358,20 @@ Difficulty: Medium density = TRUE sleep(1) swooping &= ~SWOOP_DAMAGEABLE - SetRecoveryTime(MEGAFAUNA_DEFAULT_RECOVERY_TIME) + SetRecoveryTime(swoop_cooldown) + if(!lava_success) + arena_escape_enrage() /mob/living/simple_animal/hostile/megafauna/dragon/AltClickOn(atom/movable/A) if(!istype(A)) AltClickNoInteract(src, A) return - if(swoop_cooldown >= world.time) - to_chat(src, "You need to wait 20 seconds between swoop attacks!") + if(player_cooldown >= world.time) + to_chat(src, "You need to wait [(player_cooldown - world.time) / 10] seconds before swooping again!") return - swoop_attack(TRUE, A, 25) + swoop_attack(FALSE, A) + lava_pools(10, 2) // less pools but longer delay before spawns + player_cooldown = world.time + 200 // needs seperate cooldown or cant use fire attacks /obj/item/gps/internal/dragon icon_state = null @@ -289,54 +380,63 @@ Difficulty: Medium invisibility = 100 -/obj/effect/temp_visual/fireball - icon = 'icons/obj/wizard.dmi' - icon_state = "fireball" - name = "fireball" - desc = "Get out of the way!" - layer = FLY_LAYER - randomdir = FALSE - duration = 9 - pixel_z = DRAKE_SWOOP_HEIGHT - -/obj/effect/temp_visual/fireball/Initialize() - . = ..() - animate(src, pixel_z = 0, time = duration) - -/obj/effect/temp_visual/target - icon = 'icons/mob/actions/actions_items.dmi' - icon_state = "sniper_zoom" +/obj/effect/temp_visual/lava_warning + icon_state = "lavastaff_warn" layer = BELOW_MOB_LAYER light_range = 2 - duration = 9 + duration = 13 -/obj/effect/temp_visual/target/ex_act() +/obj/effect/temp_visual/lava_warning/ex_act() return -/obj/effect/temp_visual/target/Initialize(mapload, list/flame_hit) +/obj/effect/temp_visual/lava_warning/Initialize(mapload, var/reset_time = 10) . = ..() - INVOKE_ASYNC(src, .proc/fall, flame_hit) + INVOKE_ASYNC(src, .proc/fall, reset_time) + src.alpha = 63.75 + animate(src, alpha = 255, time = duration) -/obj/effect/temp_visual/target/proc/fall(list/flame_hit) +/obj/effect/temp_visual/lava_warning/proc/fall(var/reset_time) var/turf/T = get_turf(src) playsound(T,'sound/magic/fleshtostone.ogg', 80, 1) - new /obj/effect/temp_visual/fireball(T) sleep(duration) - if(ismineralturf(T)) - var/turf/closed/mineral/M = T - M.gets_drilled() - playsound(T, "explosion", 80, 1) - new /obj/effect/hotspot(T) - T.hotspot_expose(700, 50, 1) + playsound(T,'sound/magic/fireball.ogg', 200, 1) + for(var/mob/living/L in T.contents) if(istype(L, /mob/living/simple_animal/hostile/megafauna/dragon)) continue - if(islist(flame_hit) && !flame_hit[L]) - L.adjustFireLoss(40) - to_chat(L, "You're hit by the drake's fire breath!") - flame_hit[L] = TRUE - else - L.adjustFireLoss(10) //if we've already hit them, do way less damage + L.adjustFireLoss(10) + to_chat(L, "You fall directly into the pool of lava!") + + // deals damage to mechs + for(var/obj/mecha/M in T.contents) + M.take_damage(45, BRUTE, "melee", 1) + + // changes turf to lava temporarily + if(!istype(T, /turf/closed) && !istype(T, /turf/open/lava)) + var/lava_turf = /turf/open/lava/smooth + var/reset_turf = T.type + T.ChangeTurf(lava_turf) + sleep(reset_time) + T.ChangeTurf(reset_turf) + +/obj/effect/temp_visual/drakewall + desc = "An ash drakes true flame." + name = "Fire Barrier" + icon = 'icons/effects/fire.dmi' + icon_state = "1" + anchored = TRUE + opacity = 0 + density = TRUE + CanAtmosPass = ATMOS_PASS_DENSITY + duration = 82 + color = COLOR_DARK_ORANGE + +/obj/effect/temp_visual/lava_safe + icon = 'icons/obj/hand_of_god_structures.dmi' + icon_state = "trap-earth" + layer = BELOW_MOB_LAYER + light_range = 2 + duration = 13 /obj/effect/temp_visual/dragon_swoop name = "certain death" @@ -347,7 +447,7 @@ Difficulty: Medium pixel_x = -32 pixel_y = -32 color = "#FF0000" - duration = 5 + duration = 10 /obj/effect/temp_visual/dragon_flight icon = 'icons/mob/lavaland/64x64megafauna.dmi' @@ -376,7 +476,7 @@ Difficulty: Medium /obj/effect/temp_visual/dragon_flight/end pixel_x = DRAKE_SWOOP_HEIGHT pixel_z = DRAKE_SWOOP_HEIGHT - duration = 5 + duration = 10 /obj/effect/temp_visual/dragon_flight/end/flight(negative) if(negative) @@ -399,6 +499,16 @@ Difficulty: Medium crusher_loot = list() butcher_results = list(/obj/item/stack/ore/diamond = 5, /obj/item/stack/sheet/sinew = 5, /obj/item/stack/sheet/bone = 30) +/mob/living/simple_animal/hostile/megafauna/dragon/lesser/AltClickOn(atom/movable/A) + if(!istype(A)) + return + if(player_cooldown >= world.time) + to_chat(src, "You need to wait [(player_cooldown - world.time) / 10] seconds before swooping again!") + return + swoop_attack(FALSE, A) + lava_pools(10, 2) // less pools but longer delay before spawns + player_cooldown = world.time + 200 // needs seperate cooldown or cant use fire attacks + /mob/living/simple_animal/hostile/megafauna/dragon/lesser/transformed //ash drake balanced around player control name = "transformed ash drake" desc = "A sentient being transformed into an ash drake" From 80e94373903f9a2ee0c2a687f8bfa1052f579a33 Mon Sep 17 00:00:00 2001 From: Blue Wildrose Date: Mon, 5 Apr 2021 21:47:15 -0700 Subject: [PATCH 020/135] add some game logging for good measure --- code/game/objects/structures/ghost_role_spawners.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/objects/structures/ghost_role_spawners.dm b/code/game/objects/structures/ghost_role_spawners.dm index 2e1f76cefe..6044912028 100644 --- a/code/game/objects/structures/ghost_role_spawners.dm +++ b/code/game/objects/structures/ghost_role_spawners.dm @@ -631,6 +631,7 @@ user.visible_message("[user] pries open the [src], disrupting the sleep of the pirate within and killing them.", "You pry open the [src], disrupting the sleep of the pirate within and killing them.", "You hear prying, followed by the death rattling of bones.") + log_game("[key_name(user)] has successfully pried open a [src] and disabled a space pirate spawner.") W.play_tool_sound(src) playsound(src.loc, 'modular_citadel/sound/voice/scream_skeleton.ogg', 50, 1, 4, 1.2) if(rank == "Captain") new /obj/effect/mob_spawn/human/pirate/corpse/captain(get_turf(src)) From de6b3552d5980d3b351b0c6ade1d9b1aaee70e86 Mon Sep 17 00:00:00 2001 From: BlueWildrose <57083662+BlueWildrose@users.noreply.github.com> Date: Mon, 5 Apr 2021 22:59:24 -0700 Subject: [PATCH 021/135] that grammar would make me mad if I left it there why did I do that --- code/game/objects/structures/ghost_role_spawners.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/structures/ghost_role_spawners.dm b/code/game/objects/structures/ghost_role_spawners.dm index 6044912028..ffe2b8a492 100644 --- a/code/game/objects/structures/ghost_role_spawners.dm +++ b/code/game/objects/structures/ghost_role_spawners.dm @@ -631,7 +631,7 @@ user.visible_message("[user] pries open the [src], disrupting the sleep of the pirate within and killing them.", "You pry open the [src], disrupting the sleep of the pirate within and killing them.", "You hear prying, followed by the death rattling of bones.") - log_game("[key_name(user)] has successfully pried open a [src] and disabled a space pirate spawner.") + log_game("[key_name(user)] has successfully pried open [src] and disabled a space pirate spawner.") W.play_tool_sound(src) playsound(src.loc, 'modular_citadel/sound/voice/scream_skeleton.ogg', 50, 1, 4, 1.2) if(rank == "Captain") new /obj/effect/mob_spawn/human/pirate/corpse/captain(get_turf(src)) From eff724a3f51d121672e8f608e8f3eceba6afe93b Mon Sep 17 00:00:00 2001 From: qweq12yt <45515587+qweq12yt@users.noreply.github.com> Date: Tue, 6 Apr 2021 18:57:00 -0300 Subject: [PATCH 022/135] time to LOUD --- code/modules/power/supermatter/supermatter.dm | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index 1e82a601ea..87adcefeb3 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -390,7 +390,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) speaking = "[DisplayTimeText(i, TRUE)] remain before causality stabilization." else speaking = "[i*0.1]..." - radio.talk_into(src, speaking, common_channel) + radio.talk_into(src, speaking, common_channel, list(SPAN_COMMAND)) // IT GOT WORSE, LOUD TIME sleep(10) explode() @@ -715,7 +715,8 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) //Oh shit it's bad, time to freak out if(damage > emergency_point) - radio.talk_into(src, "[emergency_alert] Integrity: [get_integrity()]%", common_channel) + // it's bad, LETS YELL + radio.talk_into(src, "[emergency_alert] Integrity: [get_integrity()]%", common_channel, list(SPAN_YELL)) lastwarning = REALTIMEOFDAY if(!has_reached_emergency) investigate_log("has reached the emergency point for the first time.", INVESTIGATE_SUPERMATTER) From 3cf25a8cc78da4e769e2c02326b7e133b74f11c7 Mon Sep 17 00:00:00 2001 From: Blue Wildrose Date: Tue, 6 Apr 2021 23:10:23 -0700 Subject: [PATCH 023/135] Slimeperson organs are now more confusing --- .../carbon/human/species_types/jellypeople.dm | 4 +++- code/modules/surgery/organs/heart.dm | 4 ++-- code/modules/surgery/organs/liver.dm | 5 +++++ code/modules/surgery/organs/lungs.dm | 1 + code/modules/surgery/organs/stomach.dm | 5 +++++ icons/obj/surgery.dmi | Bin 43965 -> 43972 bytes 6 files changed, 16 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm index 7a15fd2e5c..c37671cfc5 100644 --- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm @@ -7,6 +7,9 @@ species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,WINGCOLOR,HAS_FLESH) mutantlungs = /obj/item/organ/lungs/slime mutant_heart = /obj/item/organ/heart/slime + mutantstomach = /obj/item/organ/stomach/slime + mutantliver = /obj/item/organ/liver/slime + mutant_brain = /obj/item/organ/brain/jelly mutant_bodyparts = list("mcolor" = "FFFFFF", "mam_tail" = "None", "mam_ears" = "None", "mam_snouts" = "None", "taur" = "None", "deco_wings" = "None", "legs" = "Plantigrade") inherent_traits = list(TRAIT_TOXINLOVER) meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/slime @@ -22,7 +25,6 @@ heatmod = 0.5 // = 1/4x heat damage burnmod = 0.5 // = 1/2x generic burn damage species_language_holder = /datum/language_holder/jelly - mutant_brain = /obj/item/organ/brain/jelly tail_type = "mam_tail" wagging_type = "mam_waggingtail" diff --git a/code/modules/surgery/organs/heart.dm b/code/modules/surgery/organs/heart.dm index aaa4e34f36..4dba68ada3 100644 --- a/code/modules/surgery/organs/heart.dm +++ b/code/modules/surgery/organs/heart.dm @@ -98,8 +98,8 @@ failed = TRUE /obj/item/organ/heart/slime - name = "slime heart" - desc = "It seems we've gotten to the slimy core of the matter." + name = "mitochondria" + desc = "The powerhouse of the cell. Or in this case, the hearty organelle of a slimeperson." icon_state = "heart-s-on" icon_base = "heart-s" diff --git a/code/modules/surgery/organs/liver.dm b/code/modules/surgery/organs/liver.dm index 69633c54df..16bfee8212 100755 --- a/code/modules/surgery/organs/liver.dm +++ b/code/modules/surgery/organs/liver.dm @@ -77,6 +77,11 @@ C.action_cooldown_mod *= value cachedmoveCalc = value +/obj/item/organ/liver/slime + name = "filtratum" //this is the name that Fermi came up with when testmerging that one thing that never got finished on Citadel - if Fermi ever updates this, this probably will have a lot more functionality. + icon_state = "liver-s" + desc = "An organelle resembling a liver for slimepeople." + /obj/item/organ/liver/fly name = "insectoid liver" icon_state = "liver-x" //xenomorph liver? It's just a black liver so it fits. diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm index 953c8b2c1b..594553c662 100644 --- a/code/modules/surgery/organs/lungs.dm +++ b/code/modules/surgery/organs/lungs.dm @@ -592,6 +592,7 @@ /obj/item/organ/lungs/slime name = "vacuole" desc = "A large organelle designed to store oxygen and other important gasses." + icon_state = "lungs-s" safe_toxins_max = 0 //We breathe this to gain POWER. diff --git a/code/modules/surgery/organs/stomach.dm b/code/modules/surgery/organs/stomach.dm index cabe49db25..7fbd1045a5 100644 --- a/code/modules/surgery/organs/stomach.dm +++ b/code/modules/surgery/organs/stomach.dm @@ -78,6 +78,11 @@ SEND_SIGNAL(H, COMSIG_CLEAR_MOOD_EVENT, "disgust") ..() +/obj/item/organ/stomach/slime + name = "macrolysosome" + icon_state = "stomach-s" + desc = "A slimeperson organelle resembling a stomach. It breaks down, or digests macromolecules. Or just food." + /obj/item/organ/stomach/fly name = "insectoid stomach" icon_state = "stomach-x" //xenomorph liver? It's just a black liver so it fits. diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi index 454138a2543e198d515f9cbfd5c6101705c1b7e6..be9cb74799de0c1e0762abe0252cbe4e2cc84f78 100755 GIT binary patch literal 43972 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 literal 43965 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 From 3d5878dd268352afd6c114fb08005f5024883f77 Mon Sep 17 00:00:00 2001 From: zerothebigboy Date: Wed, 7 Apr 2021 03:41:36 -0400 Subject: [PATCH 024/135] i --- _maps/map_files/BoxStation/BoxStation.dmm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index ad4dd9ad26..2b231ff41c 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -10444,7 +10444,7 @@ /area/maintenance/port/fore) "avV" = ( /obj/structure/table/wood, -/obj/item/reagent_containers/food/snacks/burger/ghost, +/obj/item/ectoplasm, /turf/open/floor/wood, /area/maintenance/port/fore) "avW" = ( From 657d1f69c81cdc57c442525cfba72492bc696cb9 Mon Sep 17 00:00:00 2001 From: zerothebigboy Date: Wed, 7 Apr 2021 04:18:04 -0400 Subject: [PATCH 025/135] sex --- .../mining/lavaland/necropolis_chests.dm | 12 +- .../hostile/megafauna/bubblegum.dm | 471 +++++++++++++----- 2 files changed, 356 insertions(+), 127 deletions(-) diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index 9956fb1982..75f3913883 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -36,7 +36,7 @@ desc = "It's watching you suspiciously." /obj/structure/closet/crate/necropolis/tendril/magic/PopulateContents() - var/loot = rand(1,9) + var/loot = rand(1,10) switch(loot) if(1) new /obj/item/soulstone/anybody(src) @@ -57,6 +57,8 @@ new /obj/item/immortality_talisman(src) if(9) new /obj/item/gun/magic/wand/book/healing(src) + if(10) + new /obj/item/guardiancreator(src) /obj/structure/closet/crate/necropolis/tendril/weapon_armor/PopulateContents() var/loot = rand(1,11) @@ -128,7 +130,7 @@ new /obj/item/disk/design_disk/modkit_disc/rapid_repeater(src) /obj/structure/closet/crate/necropolis/tendril/all/PopulateContents() - var/loot = rand(1,28) + var/loot = rand(1,29) switch(loot) if(1) new /obj/item/shared_storage/red(src) @@ -192,6 +194,8 @@ new /obj/item/immortality_talisman(src) if(28) new /obj/item/gun/magic/wand/book/healing(src) + if(29) + new /obj/item/guardiancreator(src) //KA modkit design discs /obj/item/disk/design_disk/modkit_disc @@ -1094,14 +1098,12 @@ /obj/structure/closet/crate/necropolis/bubblegum/PopulateContents() new /obj/item/clothing/suit/space/hostile_environment(src) new /obj/item/clothing/head/helmet/space/hostile_environment(src) - var/loot = rand(1,3) + var/loot = rand(1,2) switch(loot) if(1) new /obj/item/mayhem(src) if(2) new /obj/item/book/granter/spell/asura(src) - if(3) - new /obj/item/guardiancreator(src) /obj/structure/closet/crate/necropolis/bubblegum/crusher name = "bloody bubblegum chest" diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm index d5b78b14b6..dc26057480 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm @@ -1,5 +1,3 @@ -#define MEDAL_PREFIX "Bubblegum" - /* BUBBLEGUM @@ -7,17 +5,18 @@ BUBBLEGUM Bubblegum spawns randomly wherever a lavaland creature is able to spawn. It is the most powerful slaughter demon in existence. Bubblegum's footsteps are heralded by shaking booms, proving its tremendous size. -It acts as a melee creature, chasing down and attacking its target while also using different attacks to augment its power that increase as it takes damage. +It acts as a melee creature, chasing down and attacking its target while also using different attacks to augment its power -It often charges, dealing massive damage to anything unfortunate enough to be standing where it's aiming. -Whenever it isn't chasing something down, it will sink into nearby blood pools (if possible) and springs out of the closest one to its target. -To make this possible, it sprays streams of blood at random. -From these blood pools Bubblegum may summon slaughterlings - weak, low-damage minions designed to impede the target's progress. +It leaves blood trails behind wherever it goes, its clones do as well. +It tries to strike at its target through any bloodpools under them; if it fails to do that. +If it does warp it will enter an enraged state, becoming immune to all projectiles, becoming much faster, and dealing damage and knockback to anything that gets in the cloud around it. +It may summon clones charging from all sides, one of these charges being bubblegum himself. +It can charge at its target, and also heavily damaging anything directly hit in the charge. +If at half health it will start to charge from all sides with clones. -When Bubblegum dies, it leaves behind a H.E.C.K. suit+helmet as well as a chest that can contain three things: - 1. A spellblade that can slice off limbs at range - 2. A bottle that, when activated, drives everyone nearby into a frenzy - 3. A super double-barrel shotgun that shoots both shells at the same time. +When Bubblegum dies, it leaves behind a H.E.C.K. mining suit as well as a chest that can contain three things: + 1. A bottle that, when activated, drives everyone nearby into a frenzy + 2. A scroll that teaches the reader a martial art that sacrifices health for raw demonic power with their bare hands. Difficulty: Hard @@ -42,15 +41,20 @@ Difficulty: Hard melee_damage_lower = 40 melee_damage_upper = 40 speed = 1 - move_to_delay = 10 - ranged_cooldown_time = 10 + move_to_delay = 5 + retreat_distance = 5 + minimum_distance = 5 + rapid_melee = 8 // every 1/4 second + melee_queue_distance = 20 // as far as possible really, need this because of blood warp ranged = 1 pixel_x = -32 gender = MALE del_on_death = 1 crusher_loot = list(/obj/structure/closet/crate/necropolis/bubblegum/crusher) loot = list(/obj/structure/closet/crate/necropolis/bubblegum) + blood_volume = BLOOD_VOLUME_MAXIMUM //BLEED FOR ME var/charging = 0 + var/enrage_till = null achievement_type = /datum/award/achievement/boss/bubblegum_kill crusher_achievement_type = /datum/award/achievement/boss/bubblegum_crusher @@ -67,36 +71,60 @@ Difficulty: Hard desc = "You're not quite sure how a signal can be bloody." invisibility = 100 -/mob/living/simple_animal/hostile/megafauna/bubblegum/BiologicalLife(seconds, times_fired) - if(!(. = ..())) - return - move_to_delay = clamp(round((health/maxHealth) * 10), 3, 10) +/mob/living/simple_animal/hostile/megafauna/bubblegum/adjustBruteLoss(amount, updating_health = TRUE, forced = FALSE) + . = ..() + if(. > 0 && prob(25)) + var/obj/effect/decal/cleanable/blood/gibs/bubblegum/B = new /obj/effect/decal/cleanable/blood/gibs/bubblegum(loc) + if(prob(40)) + step(B, pick(GLOB.cardinals)) + else + B.setDir(pick(GLOB.cardinals)) + +/obj/effect/decal/cleanable/blood/gibs/bubblegum + name = "thick blood" + desc = "Thick, splattered blood." + random_icon_states = list("gib3", "gib5", "gib6") + bloodiness = 20 + +/obj/effect/decal/cleanable/blood/gibs/bubblegum/can_bloodcrawl_in() + return TRUE /mob/living/simple_animal/hostile/megafauna/bubblegum/OpenFire() - anger_modifier = clamp(((maxHealth - health)/50),0,20) + anger_modifier = clamp(((maxHealth - health)/60),0,20) if(charging) return - ranged_cooldown = world.time + ranged_cooldown_time + ranged_cooldown = world.time + 50 + if(!try_bloodattack()) + blood_warp() - blood_warp() - - if(prob(25)) - INVOKE_ASYNC(src, .proc/blood_spray) - - else if(prob(5+anger_modifier/2)) - slaughterlings() - else - if(health > maxHealth/2 && !client) - INVOKE_ASYNC(src, .proc/charge) + if(health > maxHealth * 0.5) + if(prob(50 + anger_modifier)) + charge(delay = 6) + charge(delay = 4) // The FitnessGram Pacer Test is a multistage aerobic capacity test that progressively gets more difficult as it continues. + charge(delay = 2) + SetRecoveryTime(15) else - INVOKE_ASYNC(src, .proc/triple_charge) + hallucination_charge_around(times = 6, delay = 10 - anger_modifier / 5) + SetRecoveryTime(10) + else + if(prob(50 - anger_modifier)) + hallucination_charge_around(times = 4, delay = 9) + hallucination_charge_around(times = 4, delay = 8) + hallucination_charge_around(times = 4, delay = 7) + SetRecoveryTime(15) + else + for(var/i = 1 to 5) + INVOKE_ASYNC(src, .proc/hallucination_charge_around, 2, 10, 2, 0) + sleep(5) + SetRecoveryTime(10) /mob/living/simple_animal/hostile/megafauna/bubblegum/Initialize() . = ..() - for(var/mob/living/simple_animal/hostile/megafauna/bubblegum/B in GLOB.mob_list) - if(B != src) - return INITIALIZE_HINT_QDEL //There can be only one + if(istype(src, /mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination)) + return + for(var/mob/living/simple_animal/hostile/megafauna/bubblegum/B in GLOB.mob_living_list) if(B != src) + return INITIALIZE_HINT_QDEL //There can be only one var/obj/effect/proc_holder/spell/bloodcrawl/bloodspell = new AddSpell(bloodspell) if(istype(loc, /obj/effect/dummy/phased_mob/slaughter)) @@ -108,53 +136,79 @@ Difficulty: Hard if(.) SSshuttle.shuttle_purchase_requirements_met |= "bubblegum" -/mob/living/simple_animal/hostile/megafauna/bubblegum/do_attack_animation(atom/A, visual_effect_icon, obj/item/used_item, no_effect) - if(charging) - return - ..() +/mob/living/simple_animal/hostile/megafauna/bubblegum/do_attack_animation(atom/A, visual_effect_icon) + if(!charging) + ..() /mob/living/simple_animal/hostile/megafauna/bubblegum/AttackingTarget() - if(charging) + if(!charging) + . = ..() + if(.) + recovery_time = world.time + 20 // can only attack melee once every 2 seconds but rapid_melee gives higher priority + +/mob/living/simple_animal/hostile/megafauna/bubblegum/bullet_act(obj/item/projectile/P) + if(is_enraged()) + visible_message("[src] deflects the projectile; [p_they()] can't be hit with ranged weapons while enraged!", "You deflect the projectile!") + playsound(src, pick('sound/weapons/bulletflyby.ogg', 'sound/weapons/bulletflyby2.ogg', 'sound/weapons/bulletflyby3.ogg'), 300, 1) + return 0 + return ..() + +/mob/living/simple_animal/hostile/megafauna/bubblegum/ex_act(severity, target) + if(severity >= EXPLODE_LIGHT) return - ..() + severity = EXPLODE_LIGHT // puny mortals + return ..() + +/mob/living/simple_animal/hostile/megafauna/bubblegum/CanPass(atom/movable/mover, turf/target) + if(istype(mover, /mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination)) + return 1 + return ..() /mob/living/simple_animal/hostile/megafauna/bubblegum/Goto(target, delay, minimum_distance) - if(charging) - return - ..() + if(!charging) + ..() + +/mob/living/simple_animal/hostile/megafauna/bubblegum/MoveToTarget(list/possible_targets) + if(!charging) + ..() /mob/living/simple_animal/hostile/megafauna/bubblegum/Move() - if(!stat) - playsound(src.loc, 'sound/effects/meteorimpact.ogg', 200, 1, 2, 1) if(charging) - new/obj/effect/temp_visual/decoy/fading(loc,src) + new /obj/effect/temp_visual/decoy/fading(loc,src) DestroySurroundings() - . = ..() + ..() + +/mob/living/simple_animal/hostile/megafauna/bubblegum/Moved() + new /obj/effect/decal/cleanable/blood(src.loc) if(charging) DestroySurroundings() + playsound(src, 'sound/effects/meteorimpact.ogg', 200, 1, 2, 1) + return ..() -/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/triple_charge() - charge() - sleep(10) - charge() - sleep(10) - charge() - -/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/charge() - var/turf/T = get_turf(target) - if(!T || T == loc) +/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/charge(var/atom/chargeat = target, var/delay = 3, var/chargepast = 2) + if(!chargeat) return - new /obj/effect/temp_visual/dragon_swoop(T) + var/chargeturf = get_turf(chargeat) + if(!chargeturf) + return + var/dir = get_dir(src, chargeturf) + var/turf/T = get_ranged_target_turf(chargeturf, dir, chargepast) + if(!T) + return + new /obj/effect/temp_visual/dragon_swoop/bubblegum(T) charging = 1 DestroySurroundings() walk(src, 0) - setDir(get_dir(src, T)) + setDir(dir) var/obj/effect/temp_visual/decoy/D = new /obj/effect/temp_visual/decoy(loc,src) - animate(D, alpha = 0, color = "#FF0000", transform = matrix()*2, time = 5) - sleep(5) - throw_at(T, get_dist(src, T), 1, src, 0) + animate(D, alpha = 0, color = "#FF0000", transform = matrix()*2, time = 3) + sleep(delay) + var/movespeed = 0.7 + walk_towards(src, T, movespeed) + sleep(get_dist(src, T) * movespeed) + walk(src, 0) // cancel the movement + try_bloodattack() charging = 0 - Goto(target, move_to_delay, minimum_distance) /** * Attack by override for bubblegum @@ -176,36 +230,147 @@ Difficulty: Hard if(isturf(A) || isobj(A) && A.density) A.ex_act(EXPLODE_HEAVY) DestroySurroundings() + if(isliving(A)) + var/mob/living/L = A + L.visible_message("[src] slams into [L]!", "[src] tramples you into the ground!") + src.forceMove(get_turf(L)) + L.apply_damage(istype(src, /mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination) ? 15 : 30, BRUTE) + playsound(get_turf(L), 'sound/effects/meteorimpact.ogg', 100, 1) + shake_camera(L, 4, 3) + shake_camera(src, 2, 3) ..() -/mob/living/simple_animal/hostile/megafauna/bubblegum/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) - if(!charging) - return ..() +/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/get_mobs_on_blood() + var/list/targets = ListTargets() + . = list() + for(var/mob/living/L in targets) + var/list/bloodpool = get_pools(get_turf(L), 0) + if(bloodpool.len && (!faction_check_mob(L) || L.stat == DEAD)) + . += L - else if(isliving(hit_atom)) - var/mob/living/L = hit_atom - L.visible_message("[src] slams into [L]!", "[src] slams into you!") - L.apply_damage(40, BRUTE) - playsound(get_turf(L), 'sound/effects/meteorimpact.ogg', 100, 1) - shake_camera(L, 4, 3) - shake_camera(src, 2, 3) - var/throwtarget = get_edge_target_turf(src, get_dir(src, get_step_away(L, src))) - L.throw_at(throwtarget, 3) +/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/try_bloodattack() + var/list/targets = get_mobs_on_blood() + if(targets.len) + INVOKE_ASYNC(src, .proc/bloodattack, targets, prob(50)) + return TRUE + return FALSE - charging = 0 +/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/bloodattack(list/targets, handedness) + var/mob/living/target_one = pick_n_take(targets) + var/turf/target_one_turf = get_turf(target_one) + var/mob/living/target_two + if(targets.len) + target_two = pick_n_take(targets) + var/turf/target_two_turf = get_turf(target_two) + if(target_two.stat != CONSCIOUS || prob(10)) + bloodgrab(target_two_turf, handedness) + else + bloodsmack(target_two_turf, handedness) + if(target_one) + var/list/pools = get_pools(get_turf(target_one), 0) + if(pools.len) + target_one_turf = get_turf(target_one) + if(target_one_turf) + if(target_one.stat != CONSCIOUS || prob(10)) + bloodgrab(target_one_turf, !handedness) + else + bloodsmack(target_one_turf, !handedness) + + if(!target_two && target_one) + var/list/poolstwo = get_pools(get_turf(target_one), 0) + if(poolstwo.len) + target_one_turf = get_turf(target_one) + if(target_one_turf) + if(target_one.stat != CONSCIOUS || prob(10)) + bloodgrab(target_one_turf, handedness) + else + bloodsmack(target_one_turf, handedness) + +/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/bloodsmack(turf/T, handedness) + if(handedness) + new /obj/effect/temp_visual/bubblegum_hands/rightsmack(T) + else + new /obj/effect/temp_visual/bubblegum_hands/leftsmack(T) + sleep(4) + for(var/mob/living/L in T) + if(!faction_check_mob(L)) + to_chat(L, "[src] rends you!") + playsound(T, attack_sound, 100, 1, -1) + var/limb_to_hit = L.get_bodypart(pick(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG)) + L.apply_damage(10, BRUTE, limb_to_hit, L.run_armor_check(limb_to_hit, "melee", null, null, armour_penetration)) + sleep(3) + +/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/bloodgrab(turf/T, handedness) + if(handedness) + new /obj/effect/temp_visual/bubblegum_hands/rightpaw(T) + new /obj/effect/temp_visual/bubblegum_hands/rightthumb(T) + else + new /obj/effect/temp_visual/bubblegum_hands/leftpaw(T) + new /obj/effect/temp_visual/bubblegum_hands/leftthumb(T) + sleep(6) + for(var/mob/living/L in T) + if(!faction_check_mob(L)) + if(L.stat != CONSCIOUS) + to_chat(L, "[src] drags you through the blood!") + playsound(T, 'sound/magic/enter_blood.ogg', 100, 1, -1) + var/turf/targetturf = get_step(src, dir) + L.forceMove(targetturf) + playsound(targetturf, 'sound/magic/exit_blood.ogg', 100, 1, -1) + addtimer(CALLBACK(src, .proc/devour, L), 2) + sleep(1) + +/obj/effect/temp_visual/dragon_swoop/bubblegum + duration = 10 + +/obj/effect/temp_visual/bubblegum_hands + icon = 'icons/effects/bubblegum.dmi' + duration = 9 + +/obj/effect/temp_visual/bubblegum_hands/rightthumb + icon_state = "rightthumbgrab" + +/obj/effect/temp_visual/bubblegum_hands/leftthumb + icon_state = "leftthumbgrab" + +/obj/effect/temp_visual/bubblegum_hands/rightpaw + icon_state = "rightpawgrab" + layer = BELOW_MOB_LAYER + +/obj/effect/temp_visual/bubblegum_hands/leftpaw + icon_state = "leftpawgrab" + layer = BELOW_MOB_LAYER + +/obj/effect/temp_visual/bubblegum_hands/rightsmack + icon_state = "rightsmack" + +/obj/effect/temp_visual/bubblegum_hands/leftsmack + icon_state = "leftsmack" /mob/living/simple_animal/hostile/megafauna/bubblegum/proc/blood_warp() + if(Adjacent(target) || (enrage_till + 30 > world.time)) + return FALSE + var/list/can_jaunt = get_pools(get_turf(src), 1) + if(!can_jaunt.len) + return FALSE + + var/list/pools = get_pools(get_turf(target), 2) + var/list/pools_to_remove = get_pools(get_turf(target), 1) + pools -= pools_to_remove + if(!pools.len) + return FALSE + + var/obj/effect/temp_visual/decoy/DA = new /obj/effect/temp_visual/decoy(loc,src) + DA.color = "#FF0000" + var/oldtransform = DA.transform + DA.transform = matrix()*2 + animate(DA, alpha = 255, color = initial(DA.color), transform = oldtransform, time = 3) + sleep(3) + qdel(DA) var/obj/effect/decal/cleanable/blood/found_bloodpool - var/list/pools = list() - var/can_jaunt = FALSE - for(var/obj/effect/decal/cleanable/blood/nearby in view(src,2)) - can_jaunt = TRUE - break - if(!can_jaunt) - return - for(var/obj/effect/decal/cleanable/blood/nearby in view(get_turf(target),2)) - pools += nearby + pools = get_pools(get_turf(target), 2) + pools_to_remove = get_pools(get_turf(target), 1) + pools -= pools_to_remove if(pools.len) shuffle_inplace(pools) found_bloodpool = pick(pools) @@ -215,48 +380,110 @@ Difficulty: Hard forceMove(get_turf(found_bloodpool)) playsound(get_turf(src), 'sound/magic/exit_blood.ogg', 100, 1, -1) visible_message("And springs back out!") + blood_enrage() + return TRUE + return FALSE +/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/blood_enrage(var/boost_time = 30) + enrage_till = world.time + boost_time + retreat_distance = null + minimum_distance = 1 + change_move_delay(3.75) + var/newcolor = rgb(149, 10, 10) + add_atom_colour(newcolor, TEMPORARY_COLOUR_PRIORITY) + var/datum/callback/cb = CALLBACK(src, .proc/blood_enrage_end) + addtimer(cb, boost_time) -/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/blood_spray() - visible_message("[src] sprays a stream of gore!") - var/turf/E = get_edge_target_turf(src, src.dir) - var/range = 10 - var/turf/previousturf = get_turf(src) - for(var/turf/J in getline(src,E)) - if(!range) - break - new /obj/effect/temp_visual/dir_setting/bloodsplatter(previousturf, get_dir(previousturf, J)) - if(!previousturf.CanAtmosPass(J)) - break - playsound(J,'sound/effects/splat.ogg', 100, 1, -1) - new /obj/effect/decal/cleanable/blood(J) - range-- - previousturf = J - sleep(1) +/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/blood_enrage_end(var/newcolor = rgb(149, 10, 10)) + retreat_distance = initial(retreat_distance) + minimum_distance = initial(minimum_distance) + change_move_delay() + remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, newcolor) -/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/slaughterlings() - visible_message("[src] summons a shoal of slaughterlings!") - for(var/obj/effect/decal/cleanable/blood/H in range(src, 10)) - if(prob(25)) - new /mob/living/simple_animal/hostile/asteroid/hivelordbrood/slaughter(H.loc) +/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/is_enraged() + return (enrage_till > world.time) -/mob/living/simple_animal/hostile/asteroid/hivelordbrood/slaughter - name = "slaughterling" - desc = "Though not yet strong enough to create a true physical form, it's nonetheless determined to murder you." - icon_state = "bloodbrood" - icon_living = "bloodbrood" - icon_aggro = "bloodbrood" - attack_verb_continuous = "pierces" - attack_verb_simple = "pierce" - color = "#C80000" - density = FALSE - faction = list("mining", "boss") - weather_immunities = list("lava","ash") - has_field_of_vision = FALSE +/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/change_move_delay(var/newmove = initial(move_to_delay)) + move_to_delay = newmove + handle_automated_action() // need to recheck movement otherwise move_to_delay won't update until the next checking aka will be wrong speed for a bit -/mob/living/simple_animal/hostile/asteroid/hivelordbrood/slaughter/CanPass(atom/movable/mover, turf/target) - if(istype(mover, /mob/living/simple_animal/hostile/megafauna/bubblegum)) +/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/get_pools(turf/T, range) + . = list() + for(var/obj/effect/decal/cleanable/nearby in view(T, range)) + if(nearby.can_bloodcrawl_in()) + . += nearby + +/obj/effect/decal/cleanable/blood/bubblegum + bloodiness = 0 + +/obj/effect/decal/cleanable/blood/bubblegum/can_bloodcrawl_in() + return TRUE + +/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/hallucination_charge_around(var/times = 4, var/delay = 6, var/chargepast = 0, var/useoriginal = 1) + var/startingangle = rand(1, 360) + if(!target) + return + var/turf/chargeat = get_turf(target) + var/srcplaced = 0 + for(var/i = 1 to times) + var/ang = (startingangle + 360/times * i) + if(!chargeat) + return + var/turf/place = locate(chargeat.x + cos(ang) * times, chargeat.y + sin(ang) * times, chargeat.z) + if(!place) + continue + if(!srcplaced && useoriginal) + forceMove(place) + srcplaced = 1 + continue + var/mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination/B = new /mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination(src.loc) + B.forceMove(place) + INVOKE_ASYNC(B, .proc/charge, chargeat, delay, chargepast) + if(useoriginal) + charge(chargeat, delay, chargepast) + +/mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination + name = "bubblegum's hallucination" + desc = "Is that really just a hallucination?" + health = 1 + maxHealth = 1 + alpha = 127.5 + crusher_loot = null + loot = null + deathmessage = "Explodes into a pool of blood!" + deathsound = 'sound/effects/splat.ogg' + +/mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination/Initialize() + ..() + toggle_ai(AI_OFF) + +/mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination/charge() + ..() + qdel(src) + +/mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination/Destroy() + new /obj/effect/decal/cleanable/blood(get_turf(src)) + . = ..() + +/mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination/CanPass(atom/movable/mover, turf/target) + if(istype(mover, /mob/living/simple_animal/hostile/megafauna/bubblegum)) // hallucinations should not be stopping bubblegum or eachother return 1 - return 0 + return ..() -#undef MEDAL_PREFIX +/mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination/Life() + return + +/mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination/adjustBruteLoss(amount, updating_health = TRUE, forced = FALSE) + return + +/mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination/OpenFire() + return + +/mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination/AttackingTarget() + return + +/mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination/try_bloodattack() + return + +/mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination/grant_achievement(medaltype,scoretype) + return From cb7259f4e2d844e6d0e7aadfaeb2f10cc6b198e5 Mon Sep 17 00:00:00 2001 From: zerothebigboy Date: Wed, 7 Apr 2021 04:44:57 -0400 Subject: [PATCH 026/135] sex --- .../mob/living/simple_animal/hostile/megafauna/bubblegum.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm index dc26057480..12cbb82f9a 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm @@ -71,7 +71,7 @@ Difficulty: Hard desc = "You're not quite sure how a signal can be bloody." invisibility = 100 -/mob/living/simple_animal/hostile/megafauna/bubblegum/adjustBruteLoss(amount, updating_health = TRUE, forced = FALSE) +/mob/living/simple_animal/hostile/megafauna/bubblegum/adjustBruteLoss(amount, updating_health = TRUE, forced = FALSE, only_robotic = FALSE, only_organic = TRUE) . = ..() if(. > 0 && prob(25)) var/obj/effect/decal/cleanable/blood/gibs/bubblegum/B = new /obj/effect/decal/cleanable/blood/gibs/bubblegum(loc) @@ -473,7 +473,7 @@ Difficulty: Hard /mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination/Life() return -/mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination/adjustBruteLoss(amount, updating_health = TRUE, forced = FALSE) +/mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination/adjustBruteLoss(amount, updating_health = TRUE, forced = FALSE, only_robotic = FALSE, only_organic = TRUE) return /mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination/OpenFire() From c104ab1fc46d7bd61b2588778e9a949182e87a34 Mon Sep 17 00:00:00 2001 From: zerothebigboy Date: Wed, 7 Apr 2021 04:54:06 -0400 Subject: [PATCH 027/135] sex --- .../mob/living/simple_animal/hostile/megafauna/bubblegum.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm index 12cbb82f9a..72a72d3683 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm @@ -136,7 +136,7 @@ Difficulty: Hard if(.) SSshuttle.shuttle_purchase_requirements_met |= "bubblegum" -/mob/living/simple_animal/hostile/megafauna/bubblegum/do_attack_animation(atom/A, visual_effect_icon) +/mob/living/simple_animal/hostile/megafauna/bubblegum/do_attack_animation(atom/A, visual_effect_icon, obj/item/used_item, no_effect) if(!charging) ..() @@ -185,7 +185,7 @@ Difficulty: Hard playsound(src, 'sound/effects/meteorimpact.ogg', 200, 1, 2, 1) return ..() -/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/charge(var/atom/chargeat = target, var/delay = 3, var/chargepast = 2) +/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/charge(atom/chargeat = target, delay = 3, chargepast = 2) if(!chargeat) return var/chargeturf = get_turf(chargeat) @@ -457,7 +457,7 @@ Difficulty: Hard ..() toggle_ai(AI_OFF) -/mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination/charge() +/mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination/charge(atom/chargeat = target, delay = 3, chargepast = 2) ..() qdel(src) From cd81345e9fb77a3696453d604786e6af7f030d84 Mon Sep 17 00:00:00 2001 From: Blue Wildrose Date: Wed, 7 Apr 2021 15:00:09 -0700 Subject: [PATCH 028/135] Polishing up the new slimeperson organs also WHY IS THE SLIMEBRAIN SPRITE GONE --- code/modules/mob/living/brain/brain_item.dm | 5 +++++ .../carbon/human/species_types/jellypeople.dm | 7 +------ code/modules/surgery/organs/liver.dm | 2 +- code/modules/surgery/organs/lungs.dm | 2 +- code/modules/surgery/organs/stomach.dm | 4 ++-- icons/obj/surgery.dmi | Bin 43972 -> 44539 bytes 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm index 59a119a89a..c31b566cf3 100644 --- a/code/modules/mob/living/brain/brain_item.dm +++ b/code/modules/mob/living/brain/brain_item.dm @@ -297,6 +297,11 @@ icon = 'icons/obj/surgery.dmi' icon_state = "posibrain-ipc" +/obj/item/organ/brain/slime + name = "slime nucleus" + desc = "A slimey membranous mass from a slimeperson." + icon_state = "brain-s" + ////////////////////////////////////TRAUMAS//////////////////////////////////////// diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm index c37671cfc5..2f463fa8bc 100644 --- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm @@ -9,7 +9,7 @@ mutant_heart = /obj/item/organ/heart/slime mutantstomach = /obj/item/organ/stomach/slime mutantliver = /obj/item/organ/liver/slime - mutant_brain = /obj/item/organ/brain/jelly + mutant_brain = /obj/item/organ/brain/slime mutant_bodyparts = list("mcolor" = "FFFFFF", "mam_tail" = "None", "mam_ears" = "None", "mam_snouts" = "None", "taur" = "None", "deco_wings" = "None", "legs" = "Plantigrade") inherent_traits = list(TRAIT_TOXINLOVER) meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/slime @@ -31,11 +31,6 @@ species_category = SPECIES_CATEGORY_JELLY ass_image = 'icons/ass/assslime.png' -/obj/item/organ/brain/jelly - name = "slime nucleus" - desc = "A slimey membranous mass from a slime person" - icon_state = "brain-slime" - /datum/species/jelly/on_species_loss(mob/living/carbon/C) C.faction -= "slime" if(ishuman(C)) diff --git a/code/modules/surgery/organs/liver.dm b/code/modules/surgery/organs/liver.dm index 16bfee8212..749f5a8c38 100755 --- a/code/modules/surgery/organs/liver.dm +++ b/code/modules/surgery/organs/liver.dm @@ -78,7 +78,7 @@ cachedmoveCalc = value /obj/item/organ/liver/slime - name = "filtratum" //this is the name that Fermi came up with when testmerging that one thing that never got finished on Citadel - if Fermi ever updates this, this probably will have a lot more functionality. + name = "viscoplasm" //this is the name that Fermis came up with when working on that organ PR that never got finished - if Fermis ever updates this, this probably will have a lot more functionality. icon_state = "liver-s" desc = "An organelle resembling a liver for slimepeople." diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm index 594553c662..083c71fda2 100644 --- a/code/modules/surgery/organs/lungs.dm +++ b/code/modules/surgery/organs/lungs.dm @@ -591,8 +591,8 @@ /obj/item/organ/lungs/slime name = "vacuole" - desc = "A large organelle designed to store oxygen and other important gasses." icon_state = "lungs-s" + desc = "A large organelle designed to store oxygen and other important gasses." safe_toxins_max = 0 //We breathe this to gain POWER. diff --git a/code/modules/surgery/organs/stomach.dm b/code/modules/surgery/organs/stomach.dm index 7fbd1045a5..ba7b950602 100644 --- a/code/modules/surgery/organs/stomach.dm +++ b/code/modules/surgery/organs/stomach.dm @@ -79,9 +79,9 @@ ..() /obj/item/organ/stomach/slime - name = "macrolysosome" + name = "macrolysosome" //an original cell has multiple lysosomes, but in this case a slimeperson only really has one... a big one? probably give it "macro" in the name. icon_state = "stomach-s" - desc = "A slimeperson organelle resembling a stomach. It breaks down, or digests macromolecules. Or just food." + desc = "A slimeperson organelle resembling a stomach. It breaks down, or digests macromolecules. Or food and drinks." /obj/item/organ/stomach/fly name = "insectoid stomach" diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi index be9cb74799de0c1e0762abe0252cbe4e2cc84f78..0460934eee163988b724d4398cf7cade6593aadd 100755 GIT binary patch literal 44539 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 - -

20 February 2021

-

Adelphon updated:

-
    -
  • polychromic pants
  • -
  • urban coat made polychromic
  • -
-

Chiirno updated:

-
    -
  • Synthflesh now unhusks with 100u instead of requiring 101u.
  • -
-

SmArtKar updated:

-
    -
  • Added some QoL changes to TCG
  • -
  • Fixed TCG cards not saving
  • -
-

TyrianTyrell updated:

-
    -
  • fixed the signed language so that you can actually use it, and that it's unusable when it's meant to be.
  • -
-

timothyteakettle updated:

-
    -
  • stops people using Message All on PDAs when their cartridge doesn't allow it
  • -
GoonStation 13 Development Team From 0534f70ccd3f2610d0b9594aecc0a9e380e1b324 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Sat, 24 Apr 2021 13:29:53 -0600 Subject: [PATCH 124/135] Update bitfields.dm (#14645) --- code/_globalvars/bitfields.dm | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index d44a4b3898..9c6f16e724 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -49,7 +49,12 @@ GLOBAL_LIST_INIT(bitfields, list( "UNIQUE_RENAME" = UNIQUE_RENAME, "USES_TGUI" = USES_TGUI, "FROZEN" = FROZEN, - "SHOVABLE_ONTO" = SHOVABLE_ONTO + "SHOVABLE_ONTO" = SHOVABLE_ONTO, + "BLOCK_Z_OUT_DOWN" = BLOCK_Z_OUT_DOWN, + "BLOCK_Z_OUT_UP" = BLOCK_Z_OUT_UP, + "BLOCK_Z_IN_DOWN" = BLOCK_Z_IN_DOWN, + "BLOCK_Z_IN_UP" = BLOCK_Z_IN_UP, + "EXAMINE_SKIP" = EXAMINE_SKIP ), "datum_flags" = list( "DF_USE_TAG" = DF_USE_TAG, From 7d6cb67c9148a2f40ee4e06b4afd529dd8e74dd0 Mon Sep 17 00:00:00 2001 From: DrPainis <79603707+DrPainis@users.noreply.github.com> Date: Sat, 24 Apr 2021 15:40:41 -0400 Subject: [PATCH 125/135] literally just changes one letter (#14634) --- .../mob/living/simple_animal/hostile/megafauna/bubblegum.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm index 72a72d3683..4d54487244 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm @@ -23,7 +23,7 @@ Difficulty: Hard */ /mob/living/simple_animal/hostile/megafauna/bubblegum - name = "bubblegum" + name = "Bubblegum" desc = "In what passes for a hierarchy among slaughter demons, this one is king." health = 2500 maxHealth = 2500 From 2e5f56152ec9f02e61b2bd37a1f554c322dc1c9e Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 24 Apr 2021 14:40:43 -0500 Subject: [PATCH 126/135] Automatic changelog generation for PR #14634 [ci skip] --- html/changelogs/AutoChangeLog-pr-14634.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-14634.yml diff --git a/html/changelogs/AutoChangeLog-pr-14634.yml b/html/changelogs/AutoChangeLog-pr-14634.yml new file mode 100644 index 0000000000..508a2515a1 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-14634.yml @@ -0,0 +1,4 @@ +author: "DrPainis" +delete-after: True +changes: + - spellcheck: "Bubblegum is now capitalized." From ace2f522fb75af16e53dab516b16112c46b6a556 Mon Sep 17 00:00:00 2001 From: WanderingFox95 <75953558+WanderingFox95@users.noreply.github.com> Date: Sat, 24 Apr 2021 21:47:04 +0200 Subject: [PATCH 127/135] No more Suicidal Parrots! (Ready) (#14628) * Modifies Parrots They spawn from hostile triggers, not as friendly pets now. * Removes Parrots from Gold Extracts altogether --- code/modules/mob/living/simple_animal/parrot.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index d146bb855f..bd45c482a2 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -64,7 +64,6 @@ friendly_verb_simple = "groom" mob_size = MOB_SIZE_SMALL movement_type = FLYING - gold_core_spawnable = FRIENDLY_SPAWN var/parrot_damage_upper = 10 var/parrot_state = PARROT_WANDER //Hunt for a perch when created From d07f1f3d30bbc40893ad2fcb8696231fe8802f64 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Sat, 24 Apr 2021 13:51:53 -0600 Subject: [PATCH 128/135] Update radioactive.dm (#14615) --- code/datums/components/radioactive.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/components/radioactive.dm b/code/datums/components/radioactive.dm index 8afa4353b2..4c418bb8dc 100644 --- a/code/datums/components/radioactive.dm +++ b/code/datums/components/radioactive.dm @@ -52,7 +52,7 @@ return strength -= strength / hl3_release_date if(strength <= RAD_BACKGROUND_RADIATION) - return PROCESS_KILL + qdel(src) /datum/component/radioactive/proc/glow_loop(atom/movable/master) From 7cc8e5ea33ef967766d02d8c2a00415c04449609 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sun, 25 Apr 2021 00:06:57 +0000 Subject: [PATCH 129/135] Automatic changelog compile [ci skip] --- html/changelog.html | 25 ++++++---------------- html/changelogs/.all_changelog.yml | 3 +++ html/changelogs/AutoChangeLog-pr-14634.yml | 4 ---- 3 files changed, 9 insertions(+), 23 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-14634.yml diff --git a/html/changelog.html b/html/changelog.html index 241394e803..3b965b74e8 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -50,6 +50,12 @@ -->
+

25 April 2021

+

DrPainis updated:

+
    +
  • Bubblegum is now capitalized.
  • +
+

22 April 2021

Whoneedspacee updated:

    @@ -838,25 +844,6 @@
  • Added pain emote to getting wounded
  • added a new pain emote sounds
- -

21 February 2021

-

Hatterhat updated:

-
    -
  • Anomaly announcements and brand intelligence now always announce instead of having some ham-fisted chance of being a command report.
  • -
-

IronEleven updated:

-
    -
  • Raises Space Vine Population Requirement from 10 to 20
  • -
-

MrJWhit updated:

-
    -
  • Removes an unnecessary % on the seed extractor.
  • -
-

timothyteakettle updated:

-
    -
  • the query for checking mentors now gets properly deleted
  • -
  • vampires no longer burn in the chapel if they signed up as the chaplain
  • -
GoonStation 13 Development Team diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 21084be59e..ddc88f8afc 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -29164,3 +29164,6 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - balance: triple fire breath for the lava swoop only happens below half health now - bugfix: The arena attack not making safespots when you fight it in a mech +2021-04-25: + DrPainis: + - spellcheck: Bubblegum is now capitalized. diff --git a/html/changelogs/AutoChangeLog-pr-14634.yml b/html/changelogs/AutoChangeLog-pr-14634.yml deleted file mode 100644 index 508a2515a1..0000000000 --- a/html/changelogs/AutoChangeLog-pr-14634.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "DrPainis" -delete-after: True -changes: - - spellcheck: "Bubblegum is now capitalized." From 90661d36879ab877fd8ce5eb7da04501a4185b80 Mon Sep 17 00:00:00 2001 From: SandPoot Date: Sat, 24 Apr 2021 21:37:01 -0300 Subject: [PATCH 130/135] upload files --- code/__HELPERS/icons.dm | 4 ++-- code/modules/admin/verbs/selectequipment.dm | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm index ce6bbf48c3..c9b011d0e4 100644 --- a/code/__HELPERS/icons.dm +++ b/code/__HELPERS/icons.dm @@ -1051,7 +1051,7 @@ GLOBAL_LIST_EMPTY(friendly_animal_types) return 0 //For creating consistent icons for human looking simple animals -/proc/get_flat_human_icon(icon_id, datum/job/J, datum/preferences/prefs, dummy_key, showDirs = GLOB.cardinals, outfit_override = null) +/proc/get_flat_human_icon(icon_id, datum/job/J, datum/preferences/prefs, dummy_key, showDirs = GLOB.cardinals, outfit_override = null, no_anim = FALSE) var/static/list/humanoid_icon_cache = list() if(!icon_id || !humanoid_icon_cache[icon_id]) var/mob/living/carbon/human/dummy/body = generate_or_wait_for_human_dummy(dummy_key) @@ -1067,7 +1067,7 @@ GLOBAL_LIST_EMPTY(friendly_animal_types) var/icon/out_icon = icon('icons/effects/effects.dmi', "nothing") COMPILE_OVERLAYS(body) for(var/D in showDirs) - var/icon/partial = getFlatIcon(body, defdir=D) + var/icon/partial = getFlatIcon(body, defdir=D, no_anim) out_icon.Insert(partial,dir=D) humanoid_icon_cache[icon_id] = out_icon diff --git a/code/modules/admin/verbs/selectequipment.dm b/code/modules/admin/verbs/selectequipment.dm index 4184fed68f..eb75df9ac1 100644 --- a/code/modules/admin/verbs/selectequipment.dm +++ b/code/modules/admin/verbs/selectequipment.dm @@ -111,7 +111,8 @@ var/icon/dummysprite = get_flat_human_icon(null, dummy_key = dummy_key, - outfit_override = selected_outfit) + outfit_override = selected_outfit, + no_anim = TRUE) data["icon64"] = icon2base64(dummysprite) data["name"] = target_mob From c2b7140ddd67147a6bcd088c46d35d1135e87112 Mon Sep 17 00:00:00 2001 From: SandPoot Date: Sat, 24 Apr 2021 21:43:12 -0300 Subject: [PATCH 131/135] upload icons.dm --- code/__HELPERS/icons.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm index c9b011d0e4..fabe70c929 100644 --- a/code/__HELPERS/icons.dm +++ b/code/__HELPERS/icons.dm @@ -1067,7 +1067,7 @@ GLOBAL_LIST_EMPTY(friendly_animal_types) var/icon/out_icon = icon('icons/effects/effects.dmi', "nothing") COMPILE_OVERLAYS(body) for(var/D in showDirs) - var/icon/partial = getFlatIcon(body, defdir=D, no_anim) + var/icon/partial = getFlatIcon(body, defdir = D, no_anim = no_anim) out_icon.Insert(partial,dir=D) humanoid_icon_cache[icon_id] = out_icon From cf69e0fb69921d43ea08843f0874e10345dae9dc Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Sun, 25 Apr 2021 04:55:46 -0600 Subject: [PATCH 132/135] Rename emergency_airless.dmm to emergency_construction.dmm (#14656) --- .../{emergency_airless.dmm => emergency_construction.dmm} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename _maps/shuttles/{emergency_airless.dmm => emergency_construction.dmm} (100%) diff --git a/_maps/shuttles/emergency_airless.dmm b/_maps/shuttles/emergency_construction.dmm similarity index 100% rename from _maps/shuttles/emergency_airless.dmm rename to _maps/shuttles/emergency_construction.dmm From 44c2a9eecdc5b062a5a8de1161f820f8a2f096f1 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 25 Apr 2021 18:10:11 -0500 Subject: [PATCH 133/135] Automatic changelog generation for PR #14642 [ci skip] --- html/changelogs/AutoChangeLog-pr-14642.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-14642.yml diff --git a/html/changelogs/AutoChangeLog-pr-14642.yml b/html/changelogs/AutoChangeLog-pr-14642.yml new file mode 100644 index 0000000000..675d5418d5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-14642.yml @@ -0,0 +1,5 @@ +author: "Trigg, stylemistake and SandPoot" +delete-after: True +changes: + - admin: "Admins just got a new TGUI Select Equipment menu +tweak: Prevents the window from creating sprites for any animated version there might be. (this guarantees consistant sprite size/amount)" From 3fac51374f709b2e6558f624495c0f61bbff2594 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Mon, 26 Apr 2021 00:06:42 +0000 Subject: [PATCH 134/135] Automatic changelog compile [ci skip] --- html/changelog.html | 38 ++++------------------ html/changelogs/.all_changelog.yml | 5 +++ html/changelogs/AutoChangeLog-pr-14642.yml | 5 --- 3 files changed, 11 insertions(+), 37 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-14642.yml diff --git a/html/changelog.html b/html/changelog.html index 3b965b74e8..13ef3c5443 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -50,6 +50,12 @@ -->
+

26 April 2021

+

Trigg, stylemistake and SandPoot updated:

+
    +
  • Admins just got a new TGUI Select Equipment menu tweak: Prevents the window from creating sprites for any animated version there might be. (this guarantees consistant sprite size/amount)
  • +
+

25 April 2021

DrPainis updated:

    @@ -812,38 +818,6 @@
    • banning panel prioritises mobs with clients now when trying to find them if they're in the game
    - -

    22 February 2021

    -

    Putnam3145 updated:

    -
      -
    • (Hexa)crocin
    • -
    • (Hexa)camphor
    • -
    • Nymphomaniac quirk
    • -
    • All climaxes and arousals are now logged, as well as genital exposure.
    • -
    -

    SandPoot updated:

    -
      -
    • Cyborg tablets and it's special app for self-management.
    • -
    • In the case of a doomsday device being created outside of an AI it will delete itself.
    • -
    • Some sprites for it have been added and the borg's hud light toggles been changed to only on-off (made by yours truly)
    • -
    • A lot of borg code was changed
    • -
    • Tools no longer use istype checks and actually check for their behavior.
    • -
    -

    Vynzill updated:

    -
      -
    • cursed rice hat that's hard to find and obtain, along with a couple other hats
    • -
    • a replacement toy gun for donksoft lmg
    • -
    • gorillas to the jungle gateway, friendly, even when attacked.
    • -
    • couple mapping errors I noticed, most importantly a missing window in the chapel.
    • -
    • shotgun and donksoft lmg removed, captain coat nerfed armor values.
    • -
    • leaper healthpool from 450 to 550 hopefully making it more of a struggle, and gives it a name.
    • -
    • leaper pit is more wider. The hidden room south is now more obvious to find
    • -
    -

    dzahlus updated:

    -
      -
    • Added pain emote to getting wounded
    • -
    • added a new pain emote sounds
    • -
GoonStation 13 Development Team diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index ddc88f8afc..d1d5cc31d6 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -29167,3 +29167,8 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. 2021-04-25: DrPainis: - spellcheck: Bubblegum is now capitalized. +2021-04-26: + Trigg, stylemistake and SandPoot: + - admin: 'Admins just got a new TGUI Select Equipment menu tweak: Prevents the window + from creating sprites for any animated version there might be. (this guarantees + consistant sprite size/amount)' diff --git a/html/changelogs/AutoChangeLog-pr-14642.yml b/html/changelogs/AutoChangeLog-pr-14642.yml deleted file mode 100644 index 675d5418d5..0000000000 --- a/html/changelogs/AutoChangeLog-pr-14642.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Trigg, stylemistake and SandPoot" -delete-after: True -changes: - - admin: "Admins just got a new TGUI Select Equipment menu -tweak: Prevents the window from creating sprites for any animated version there might be. (this guarantees consistant sprite size/amount)" From 810eba15ed9d9c06b7ca9b8eb459a24a7316fcbf Mon Sep 17 00:00:00 2001 From: Changelogs Date: Tue, 27 Apr 2021 00:06:17 +0000 Subject: [PATCH 135/135] Automatic changelog compile [ci skip] --- html/changelog.html | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index 13ef3c5443..44ed1c8e5d 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -807,17 +807,6 @@
  • xeno cube makes hostile xenos now, and drops a sentinel instead of a drone.
- -

23 February 2021

-

keronshb updated:

-
    -
  • Hyperblade to uplink with poplock
  • -
  • Removes combination of two Dragon Tooth Swords while keeping it for regular eutactics.
  • -
-

timothyteakettle updated:

-
    -
  • banning panel prioritises mobs with clients now when trying to find them if they're in the game
  • -
GoonStation 13 Development Team