diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm
index 82ebcb09c7..fd4fe0eb65 100644
--- a/code/__DEFINES/mobs.dm
+++ b/code/__DEFINES/mobs.dm
@@ -61,7 +61,7 @@
#define BODYPART_NANITES 4
#define HYBRID_BODYPART_DAMAGE_THRESHHOLD 25 //How much damage has to be suffered until the damage threshhold counts as passed
-#define HYBRID_BODYPART_THESHHOLD_MINDAMAGE 15 //Which damage value this limb cannot be healed out of via easy nonsurgical means if the threshhold has been passed, state resets if damage value goes below mindamage.
+#define HYBRID_BODYPART_THESHHOLD_MINDAMAGE 10 //Which damage value this limb cannot be healed out of via easy nonsurgical means if the threshhold has been passed, state resets if damage value goes below mindamage.
#define BODYPART_NOT_DISABLED 0
#define BODYPART_DISABLED_DAMAGE 1
diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm
index fad9ddcda5..e2ace84156 100644
--- a/code/__DEFINES/status_effects.dm
+++ b/code/__DEFINES/status_effects.dm
@@ -40,6 +40,9 @@
#define STATUS_EFFECT_DETERMINED /datum/status_effect/determined //currently in a combat high from being seriously wounded
+#define STATUS_EFFECT_MANTRA /datum/status_effect/mantra // a toggled self buff that makes you stronger and more resilient, but drains stamina over time
+#define STATUS_EFFECT_ASURA /datum/status_effect/asura // like a weaker version of mantra, drains HP instead of stamina and has no armor
+
/////////////
// DEBUFFS //
/////////////
diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm
index f4a53d5c72..fb6b5c9a65 100644
--- a/code/datums/status_effects/buffs.dm
+++ b/code/datums/status_effects/buffs.dm
@@ -573,13 +573,17 @@
duration = 1 MINUTES
status_type = STATUS_EFFECT_REPLACE
alert_type = /obj/screen/alert/status_effect/regenerative_core
+ var/heal_amount = 25
/datum/status_effect/regenerative_core/on_apply()
. = ..()
ADD_TRAIT(owner, TRAIT_IGNOREDAMAGESLOWDOWN, "regenerative_core")
- owner.adjustBruteLoss(-25)
+
+ if(HAS_TRAIT(owner, TRAIT_ROBOTIC_ORGANISM)) //Robots can heal from cores, but only get 1/5th of the healing. They can use this to get past the damage threshhold however, and then regularely heal from there.
+ heal_amount *= 0.2
+ owner.adjustBruteLoss(-heal_amount, only_organic = FALSE)
if(!AmBloodsucker(owner)) //use your coffin you lazy bastard
- owner.adjustFireLoss(-25)
+ owner.adjustFireLoss(-heal_amount, only_organic = FALSE)
owner.remove_CC()
owner.bodytemperature = BODYTEMP_NORMAL
return TRUE
@@ -647,3 +651,120 @@
if(D.severity == DISEASE_SEVERITY_POSITIVE)
continue
D.cure()
+
+/datum/status_effect/mantra // available to wizards and admins alone, currently
+ id = "Mantra"
+ examine_text = "Their aura is filled with yellow energy!"
+ alert_type = null
+ var/damageboost = 10
+ var/woundboost = 5
+ var/prev_hair_color
+ var/powerup
+ var/powerdown
+
+/datum/status_effect/mantra/on_apply()
+ . = ..()
+ if(iscarbon(owner))
+ var/mob/living/carbon/human/H = owner
+ playsound(H, 'sound/magic/powerup.ogg', 50, 1)
+ H.add_filter("mantra_glow", 2, list("type" = "outline", "color" = "#edfa347a", "size" = 2))
+ prev_hair_color = H.hair_color
+ H.hair_color = "ffe11e"
+ H.update_hair()
+ ADD_TRAIT(H, TRAIT_PUGILIST, "Mantra")
+ ADD_TRAIT(H, TRAIT_NOSOFTCRIT, "Mantra")
+ ADD_TRAIT(H, TRAIT_STUNIMMUNE, "Mantra")
+ ADD_TRAIT(H, TRAIT_PUSHIMMUNE, "Mantra")
+ ADD_TRAIT(H, TRAIT_NOGUNS, "Mantra")
+ H.dna.species.punchdamagehigh += damageboost
+ H.dna.species.punchdamagelow += damageboost
+ H.dna.species.punchwoundbonus += woundboost
+ H.physiology.brute_mod *= 0.9 // slightly resilient against lethal damage, but...
+ H.physiology.burn_mod *= 0.9
+ H.physiology.stamina_mod *= 0.5 // very resistant to non-lethal damage, because they're already draining stamina every second
+ to_chat(H, "Your inner mantra coalesces around you, granting you incredible strength and durability - but at what cost?")
+
+/datum/status_effect/mantra/tick()
+ . = ..()
+ if(owner.health < HEALTH_THRESHOLD_FULLCRIT)
+ owner.remove_status_effect(STATUS_EFFECT_MANTRA)
+ return
+ if(owner.combat_flags & COMBAT_FLAG_HARD_STAMCRIT)
+ owner.remove_status_effect(STATUS_EFFECT_MANTRA)
+ return
+ if(iscarbon(owner))
+ var/mob/living/carbon/human/C = owner
+ C.adjustBruteLoss(-1) // slightly resilient against lethal damage
+ C.adjustFireLoss(-1)
+ C.adjustStaminaLoss(3) // in testing i personally found that 2/sec was too minimal and 4/sec was too much
+ /*if(SEND_SIGNAL(owner, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_ACTIVE)) // turning on combat mode flares up your aura
+
+ else*/
+
+/datum/status_effect/mantra/on_remove()
+ . = ..()
+ if(iscarbon(owner))
+ var/mob/living/carbon/human/M = owner
+ playsound(M, 'sound/magic/powerdown.ogg', 50, 1)
+ M.remove_filter("mantra_glow")
+ M.hair_color = prev_hair_color
+ M.update_hair()
+ REMOVE_TRAIT(M, TRAIT_PUGILIST, "Mantra")
+ REMOVE_TRAIT(M, TRAIT_NOSOFTCRIT, "Mantra")
+ REMOVE_TRAIT(M, TRAIT_STUNIMMUNE, "Mantra")
+ REMOVE_TRAIT(M, TRAIT_PUSHIMMUNE, "Mantra")
+ REMOVE_TRAIT(M, TRAIT_NOGUNS, "Mantra")
+ M.dna.species.punchdamagehigh -= damageboost
+ M.dna.species.punchdamagelow -= damageboost
+ M.dna.species.punchwoundbonus -= woundboost
+ M.physiology.brute_mod /= 0.9
+ M.physiology.burn_mod /= 0.9
+ M.physiology.stamina_mod /= 0.5
+ to_chat(M, "Your inner mantra collapses, for now.")
+
+/datum/status_effect/asura // mfw miner gear
+ id = "Asura"
+ examine_text = "Their aura is filled with red-hot rage!"
+ alert_type = null
+ var/damageboost = 10
+ var/woundboost = 5
+
+/datum/status_effect/asura/on_apply()
+ . = ..()
+ if(iscarbon(owner))
+ var/mob/living/carbon/human/H = owner
+ playsound(H, 'sound/magic/powerup.ogg', 50, 1)
+ H.add_filter("asura_glow", 2, list("type" = "outline", "color" = "#fc21217a", "size" = 2))
+ ADD_TRAIT(H, TRAIT_PUGILIST, "Asura")
+ H.dna.species.punchdamagehigh += damageboost
+ H.dna.species.punchdamagelow += damageboost
+ H.dna.species.punchwoundbonus += woundboost
+ to_chat(H, "Your anger unleashes in a crimson blaze around you and corrosive power fills your muscles.")
+
+/datum/status_effect/asura/tick()
+ . = ..()
+ if(owner.health < HEALTH_THRESHOLD_CRIT)
+ owner.remove_status_effect(STATUS_EFFECT_ASURA)
+ return
+ if(owner.combat_flags & COMBAT_FLAG_HARD_STAMCRIT)
+ owner.remove_status_effect(STATUS_EFFECT_ASURA)
+ return
+ if(iscarbon(owner))
+ var/mob/living/carbon/human/C = owner
+ C.adjustBruteLoss(1) // drains 1 hp per second. You're gonna need some Senzu Cores.
+ C.adjustStaminaLoss(-2) // angry man punch a lot
+ /*if(SEND_SIGNAL(owner, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_ACTIVE)) // turning on combat mode flares up your aura
+
+ else*/
+
+/datum/status_effect/asura/on_remove()
+ . = ..()
+ if(iscarbon(owner))
+ var/mob/living/carbon/human/M = owner
+ playsound(M, 'sound/magic/powerdown.ogg', 50, 1)
+ M.remove_filter("asura_glow")
+ REMOVE_TRAIT(M, TRAIT_PUGILIST, "Asura")
+ M.dna.species.punchdamagehigh -= damageboost
+ M.dna.species.punchdamagelow -= damageboost
+ M.dna.species.punchwoundbonus -= woundboost
+ to_chat(M, "You calm yourself, and your unnatural strength dissipates.")
diff --git a/code/datums/status_effects/status_effect.dm b/code/datums/status_effects/status_effect.dm
index 7f1009d035..9dbbc1c469 100644
--- a/code/datums/status_effects/status_effect.dm
+++ b/code/datums/status_effects/status_effect.dm
@@ -74,13 +74,19 @@
/datum/status_effect/proc/on_remove() //Called whenever the buff expires or is removed; do note that at the point this is called, it is out of the owner's status_effects but owner is not yet null
SHOULD_CALL_PARENT(TRUE)
- REMOVE_TRAIT(owner, TRAIT_COMBAT_MODE_LOCKED, src)
- REMOVE_TRAIT(owner, TRAIT_SPRINT_LOCKED, src)
+ if(blocks_combatmode)
+ REMOVE_TRAIT(owner, TRAIT_COMBAT_MODE_LOCKED, src)
+ if(blocks_sprint)
+ REMOVE_TRAIT(owner, TRAIT_SPRINT_LOCKED, src)
return TRUE
/datum/status_effect/proc/be_replaced() //Called instead of on_remove when a status effect is replaced by itself or when a status effect with on_remove_on_mob_delete = FALSE has its mob deleted
owner.clear_alert(id)
LAZYREMOVE(owner.status_effects, src)
+ if(blocks_combatmode)
+ REMOVE_TRAIT(owner, TRAIT_COMBAT_MODE_LOCKED, src)
+ if(blocks_sprint)
+ REMOVE_TRAIT(owner, TRAIT_SPRINT_LOCKED, src)
owner = null
qdel(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
index 60c8332dc1..c2f6854eff 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
@@ -98,7 +98,7 @@
new /obj/item/tank/internals/emergency_oxygen/engi(src)
new /obj/item/analyzer(src)
new /obj/item/holosign_creator/atmos(src)
- new /obj/item/holosign_creator/firelock(src)
+ /*new /obj/item/holosign_creator/firelock(src)*/
new /obj/item/watertank/atmos(src)
new /obj/item/clothing/suit/fire/atmos(src)
new /obj/item/clothing/head/hardhat/atmos(src)
diff --git a/code/game/turfs/simulated/floor/misc_floor.dm b/code/game/turfs/simulated/floor/misc_floor.dm
index de96737d9d..6ba83302d2 100644
--- a/code/game/turfs/simulated/floor/misc_floor.dm
+++ b/code/game/turfs/simulated/floor/misc_floor.dm
@@ -193,7 +193,7 @@
if(M.client && (is_servant_of_ratvar(M) || isobserver(M) || M.stat == DEAD))
viewing += M.client
flick_overlay(I, viewing, 8)
- L.adjustToxLoss(-3, TRUE, TRUE)
+ L.adjustToxLoss(-3, TRUE, TRUE, toxins_type = TOX_OMNI)
/turf/open/floor/clockwork/try_replace_tile(obj/item/stack/tile/T, mob/user, params)
return
diff --git a/code/modules/antagonists/_common/antag_spawner.dm b/code/modules/antagonists/_common/antag_spawner.dm
index edfa9caa22..bcba1e1e1e 100644
--- a/code/modules/antagonists/_common/antag_spawner.dm
+++ b/code/modules/antagonists/_common/antag_spawner.dm
@@ -38,7 +38,7 @@
dat += "Robeless
"
dat += "Your apprentice is training to cast spells without their robes. They know Knock and Mindswap.
"
dat += "Martial Artist
"
- dat += "Your apprentice is training in ancient martial arts. They know the Plasmafist and Nuclear Fist.
"
+ dat += "Your apprentice is training in ancient martial arts. They know an Inner Mantra and the Nuclear Fist technique.
"
user << browse(dat, "window=radio")
onclose(user, "radio")
return
diff --git a/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm b/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm
index db498f0975..b868fb54c0 100644
--- a/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm
+++ b/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm
@@ -348,9 +348,9 @@
L.dust()
else if(L.health > min_drain_health)
if(!GLOB.ratvar_awakens && L.stat == CONSCIOUS)
- vitality_drained = L.adjustToxLoss(1, forced = TRUE)
+ vitality_drained = L.adjustToxLoss(1, forced = TRUE, toxins_type = TOX_OMNI)
else
- vitality_drained = L.adjustToxLoss(1.5, forced = TRUE)
+ vitality_drained = L.adjustToxLoss(1.5, forced = TRUE, toxins_type = TOX_OMNI)
if(vitality_drained)
GLOB.clockwork_vitality += vitality_drained
else
diff --git a/code/modules/antagonists/clockcult/clock_helpers/slab_abilities.dm b/code/modules/antagonists/clockcult/clock_helpers/slab_abilities.dm
index 5affcd5dec..a00019aa45 100644
--- a/code/modules/antagonists/clockcult/clock_helpers/slab_abilities.dm
+++ b/code/modules/antagonists/clockcult/clock_helpers/slab_abilities.dm
@@ -115,7 +115,7 @@
if(totaldamage)
L.heal_overall_damage(brutedamage, burndamage, only_organic = FALSE) //Maybe a machine god shouldn't murder augmented followers instead of healing them
L.adjustOxyLoss(-oxydamage)
- L.adjustToxLoss(totaldamage * 0.5, TRUE, TRUE)
+ L.adjustToxLoss(totaldamage * 0.5, TRUE, TRUE, toxins_type = TOX_OMNI)
clockwork_say(ranged_ability_user, text2ratvar("[has_holy_water ? "Heal tainted" : "Mend wounded"] flesh!"))
log_combat(ranged_ability_user, L, "healed with Sentinel's Compromise")
L.visible_message("A blue light washes over [L], [has_holy_water ? "causing [L.p_them()] to briefly glow as it mends" : " mending"] [L.p_their()] bruises and burns!", \
diff --git a/code/modules/antagonists/cult/blood_magic.dm b/code/modules/antagonists/cult/blood_magic.dm
index 4a697a6bd7..901c83b1b7 100644
--- a/code/modules/antagonists/cult/blood_magic.dm
+++ b/code/modules/antagonists/cult/blood_magic.dm
@@ -717,9 +717,9 @@
uses = 0
ratio *= -1
H.adjustOxyLoss((overall_damage*ratio) * (H.getOxyLoss() / overall_damage), 0)
- H.adjustToxLoss((overall_damage*ratio) * (H.getToxLoss() / overall_damage), 0)
- H.adjustFireLoss((overall_damage*ratio) * (H.getFireLoss() / overall_damage), 0)
- H.adjustBruteLoss((overall_damage*ratio) * (H.getBruteLoss() / overall_damage), 0)
+ H.adjustToxLoss((overall_damage*ratio) * (H.getToxLoss() / overall_damage), 0, toxins_type = TOX_OMNI)
+ H.adjustFireLoss((overall_damage*ratio) * (H.getFireLoss() / overall_damage), 0, only_organic = FALSE)
+ H.adjustBruteLoss((overall_damage*ratio) * (H.getBruteLoss() / overall_damage), 0, only_organic = FALSE)
H.updatehealth()
playsound(get_turf(H), 'sound/magic/staff_healing.ogg', 25)
new /obj/effect/temp_visual/cult/sparks(get_turf(H))
diff --git a/code/modules/antagonists/cult/cult_structures.dm b/code/modules/antagonists/cult/cult_structures.dm
index a388621c92..25fd446b06 100644
--- a/code/modules/antagonists/cult/cult_structures.dm
+++ b/code/modules/antagonists/cult/cult_structures.dm
@@ -214,8 +214,8 @@
if(L.health != L.maxHealth)
new /obj/effect/temp_visual/heal(get_turf(src), "#960000")
if(ishuman(L))
- L.adjustBruteLoss(-1, 0)
- L.adjustFireLoss(-1, 0)
+ L.adjustBruteLoss(-1, 0, only_organic = FALSE)
+ L.adjustFireLoss(-1, 0, only_organic = FALSE)
L.updatehealth()
if(isshade(L) || isconstruct(L))
var/mob/living/simple_animal/M = L
diff --git a/code/modules/antagonists/wizard/equipment/spellbook.dm b/code/modules/antagonists/wizard/equipment/spellbook.dm
index 1e98b2f753..9b2def48d7 100644
--- a/code/modules/antagonists/wizard/equipment/spellbook.dm
+++ b/code/modules/antagonists/wizard/equipment/spellbook.dm
@@ -189,6 +189,10 @@
name = "Mutate"
spell_type = /obj/effect/proc_holder/spell/targeted/genetic/mutate
+/datum/spellbook_entry/mantra
+ name = "Inner Mantra"
+ spell_type = /obj/effect/proc_holder/spell/self/mantra
+
/datum/spellbook_entry/jaunt
name = "Ethereal Jaunt"
spell_type = /obj/effect/proc_holder/spell/targeted/ethereal_jaunt
diff --git a/code/modules/antagonists/wizard/wizard.dm b/code/modules/antagonists/wizard/wizard.dm
index f217e623cc..69bd52c739 100644
--- a/code/modules/antagonists/wizard/wizard.dm
+++ b/code/modules/antagonists/wizard/wizard.dm
@@ -181,8 +181,8 @@
to_chat(owner, "Your service has not gone unrewarded, however. Studying under [master.current.real_name], you have learned stealthy, robeless spells. You are able to cast knock and mindswap.")
if(APPRENTICE_MARTIAL)
owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/touch/nuclear_fist(null))
- H.put_in_hands(new /obj/item/book/granter/martial/plasma_fist(H))
- to_chat(owner, "Your service has not gone unrewarded, however. Studying under [master.current.real_name], you have learned mystical martial abilities. You are also able to use the Nuclear Fist at will.")
+ owner.AddSpell(new /obj/effect/proc_holder/spell/self/mantra(null))
+ to_chat(owner, "Your service has not gone unrewarded, however. Studying under [master.current.real_name], you have learned to control your Inner Mantra. You are also able to use the Nuclear Fist at will.")
/datum/antagonist/wizard/apprentice/create_objectives()
var/datum/objective/protect/new_objective = new /datum/objective/protect
diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm
index b03d977aa8..f51593b590 100644
--- a/code/modules/clothing/spacesuits/miscellaneous.dm
+++ b/code/modules/clothing/spacesuits/miscellaneous.dm
@@ -508,12 +508,12 @@ Contains:
name = "paramedic EVA suit"
icon_state = "paramedic-eva"
item_state = "paramedic-eva"
- desc = "A deep blue space suit decorated with red and white crosses to indicate that the wearer is trained emergency medical personnel."
+ desc = "A deep blue space suit decorated with medical insignia to indicate that the wearer is trained emergency medical personnel."
allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/roller)
/obj/item/clothing/head/helmet/space/eva/paramedic
name = "paramedic EVA helmet"
- desc = "A deep blue space helmet with a large red cross on the faceplate to designate the wearer as trained emergency medical personnel."
+ desc = "A deep blue space helmet decorated with medical insignia to designate the wearer as trained emergency medical personnel."
icon_state = "paramedic-eva-helmet"
item_state = "paramedic-eva-helmet"
diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm
index 75989240e4..9cd203a7b9 100644
--- a/code/modules/mining/lavaland/necropolis_chests.dm
+++ b/code/modules/mining/lavaland/necropolis_chests.dm
@@ -1110,7 +1110,7 @@
if(1)
new /obj/item/mayhem(src)
if(2)
- new /obj/item/gun/ballistic/revolver/doublebarrel/super(src)
+ new /obj/item/book/granter/spell/asura(src)
if(3)
new /obj/item/guardiancreator(src)
@@ -1193,6 +1193,13 @@
unique_reskin = null
sawn_off = TRUE
+/obj/item/book/granter/spell/asura
+ spell = /obj/effect/proc_holder/spell/self/asura
+ spellname = "asuras wrath"
+ icon_state = "bookasura"
+ desc = "This crimson novel emanates rage incarnate."
+ remarks = list("Kaio-What?", "It can only be sustained for a short time...", "It's like a massive upsurge of energy...", "Takes a heavy toll on the user's body...?", "Extra arms not included...", "There's stronger levels? Why aren't they in the book...")
+
//Colossus
/obj/structure/closet/crate/necropolis/colossus
name = "colossus chest"
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm b/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm
index 6c510807b4..4e5f010964 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm
@@ -243,6 +243,10 @@
icon_state = "none"
relevant_layers = null
+/datum/sprite_accessory/insect_fluff/brown
+ name = "Brown"
+ icon_state = "brown"
+
/datum/sprite_accessory/insect_fluff/punished
name = "Burnt Off"
icon_state = "punished"
@@ -271,6 +275,10 @@
name = "Deathshead"
icon_state = "deathhead"
+/datum/sprite_accessory/insect_fluff/featherymoth
+ name = "Feathery Moth"
+ icon_state = "featherymoth"
+
/datum/sprite_accessory/insect_fluff/firewatch
name = "Firewatch"
icon_state = "firewatch"
@@ -291,18 +299,22 @@
name = "Moon Fly"
icon_state = "moonfly"
-/datum/sprite_accessory/insect_fluff/oakworm
- name = "Oak Worm"
- icon_state = "oakworm"
-
/datum/sprite_accessory/insect_fluff/plain
name = "Plain"
icon_state = "plain"
+/datum/sprite_accessory/insect_fluff/plasmafire
+ name = "Plasma Fire"
+ icon_state = "plasmafire"
+
/datum/sprite_accessory/insect_fluff/poison
name = "Poison"
icon_state = "poison"
+/datum/sprite_accessory/insect_fluff/oakworm
+ name = "Oak Worm"
+ icon_state = "oakworm"
+
/datum/sprite_accessory/insect_fluff/ragged
name = "Ragged"
icon_state = "ragged"
@@ -311,6 +323,10 @@
name = "Reddish"
icon_state = "redish"
+/datum/sprite_accessory/insect_fluff/rosy
+ name = "Rosy"
+ icon_state = "rosy"
+
/datum/sprite_accessory/insect_fluff/royal
name = "Royal"
icon_state = "royal"
@@ -325,4 +341,4 @@
/datum/sprite_accessory/insect_fluff/witchwing
name = "Witch Wing"
- icon_state = "witchwing"
+ icon_state = "witchwing"
\ No newline at end of file
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/wings.dm b/code/modules/mob/dead/new_player/sprite_accessories/wings.dm
index 0c8e6bbe55..346a7caf5e 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/wings.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/wings.dm
@@ -75,9 +75,7 @@
dimension_y = 34
relevant_layers = list(BODY_BEHIND_LAYER, BODY_ADJ_LAYER, BODY_FRONT_LAYER)
-/datum/sprite_accessory/deco_wings/atlas
- name = "Atlas"
- icon_state = "atlas"
+//nonmoth wings
/datum/sprite_accessory/deco_wings/bat
name = "Bat"
@@ -87,18 +85,76 @@
name = "Bee"
icon_state = "bee"
-/datum/sprite_accessory/deco_wings/deathhead
- name = "Deathshead"
- icon_state = "deathhead"
+/datum/sprite_accessory/deco_wings/bee2
+ name = "Small Bee"
+ icon_state = "beewings"
+
+/datum/sprite_accessory/deco_wings/dragon
+ name = "Dragon"
+ icon_state = "dragon"
+
+/datum/sprite_accessory/deco_wings/dragonfly
+ name = "Dragonfly"
+ icon_state = "dragonfly"
/datum/sprite_accessory/deco_wings/fairy
name = "Fairy"
icon_state = "fairy"
-/datum/sprite_accessory/deco_wings/feathery
+/datum/sprite_accessory/deco_wings/featheredwing
name = "Feathery"
icon_state = "feathery"
+/datum/sprite_accessory/deco_wings/featheredwingmedium
+ name = "Medium Feathered"
+ icon_state = "feathered3"
+
+/datum/sprite_accessory/deco_wings/featheredwinglarge
+ name = "Large Feathered"
+ icon_state = "feathered2"
+
+/datum/sprite_accessory/deco_wings/harpywings
+ name = "Harpy"
+ icon_state = "harpywings"
+
+/datum/sprite_accessory/deco_wings/roboticwing
+ name = "Robotic"
+ icon_state = "drago"
+
+/datum/sprite_accessory/deco_wings/succubusblack
+ name = "Succubus Black"
+ icon_state = "succubusblack"
+
+/datum/sprite_accessory/deco_wings/succubuspurple
+ name = "Succubus Purple"
+ icon_state = "succubuspurple"
+
+/datum/sprite_accessory/deco_wings/succubusred
+ name = "Succubus Red"
+ icon_state = "succubusred"
+
+/datum/sprite_accessory/deco_wings/xenobackplate
+ name = "Xenomorph Backplate"
+ icon_state = "snagbackplate"
+
+//moth wings
+
+/datum/sprite_accessory/deco_wings/atlas
+ name = "Atlas"
+ icon_state = "atlas"
+
+/datum/sprite_accessory/deco_wings/brown
+ name = "Brown"
+ icon_state = "brown"
+
+/datum/sprite_accessory/deco_wings/deathhead
+ name = "Deathshead"
+ icon_state = "deathhead"
+
+/datum/sprite_accessory/deco_wings/featherymoth
+ name = "Feathery Moth Wings"
+ icon_state = "featherymoth"
+
/datum/sprite_accessory/deco_wings/firewatch
name = "Firewatch"
icon_state = "firewatch"
@@ -107,6 +163,10 @@
name = "Gothic"
icon_state = "gothic"
+/datum/sprite_accessory/deco_wings/jungle
+ name = "Jungle"
+ icon_state = "jungle"
+
/datum/sprite_accessory/deco_wings/lovers
name = "Lovers"
icon_state = "lovers"
@@ -123,10 +183,18 @@
name = "Moon Fly"
icon_state = "moonfly"
+/datum/sprite_accessory/deco_wings/oakworm
+ name = "Oak Worm"
+ icon_state = "oakworm"
+
/datum/sprite_accessory/deco_wings/plain
name = "Plain"
icon_state = "plain"
+/datum/sprite_accessory/deco_wings/plasmafire
+ name = "Plasma Fire"
+ icon_state = "plasmafire"
+
/datum/sprite_accessory/deco_wings/poison
name = "Poison"
icon_state = "poison"
@@ -143,6 +211,10 @@
name = "Reddish"
icon_state = "redish"
+/datum/sprite_accessory/deco_wings/rosy
+ name = "Rosy"
+ icon_state = "rosy"
+
/datum/sprite_accessory/deco_wings/royal
name = "Royal"
icon_state = "royal"
@@ -155,18 +227,10 @@
name = "White Fly"
icon_state = "whitefly"
-/datum/sprite_accessory/deco_wings/oakworm
- name = "Oak Worm"
- icon_state = "oakworm"
-
/datum/sprite_accessory/deco_wings/witchwing
name = "Witch Wing"
icon_state = "witchwing"
-/datum/sprite_accessory/deco_wings/jungle
- name = "Jungle"
- icon_state = "jungle"
-
//INSECT WINGS
/datum/sprite_accessory/insect_wings
@@ -174,6 +238,69 @@
color_src = WINGCOLOR
relevant_layers = list(BODY_BEHIND_LAYER, BODY_FRONT_LAYER)
+//non insect wings
+/datum/sprite_accessory/deco_wings/bat
+ name = "Bat"
+ icon_state = "bat"
+
+/datum/sprite_accessory/insect_wings/bee
+ name = "Bee"
+ icon_state = "bee"
+
+/datum/sprite_accessory/insect_wings/bee2
+ name = "Small Bee"
+ icon_state = "beewings"
+
+/datum/sprite_accessory/insect_wings/dragon
+ name = "Dragon"
+ icon_state = "dragon"
+
+/datum/sprite_accessory/insect_wings/dragonfly
+ name = "Dragonfly"
+ icon_state = "dragonfly"
+
+/datum/sprite_accessory/insect_wings/fairy
+ name = "Fairy"
+ icon_state = "fairy"
+
+/datum/sprite_accessory/insect_wings/featheredwing
+ name = "Feathery"
+ icon_state = "feathery"
+
+/datum/sprite_accessory/insect_wings/featheredwingmedium
+ name = "Medium Feathered"
+ icon_state = "feathered3"
+
+/datum/sprite_accessory/insect_wings/featheredwinglarge
+ name = "Large Feathered"
+ icon_state = "feathered2"
+
+/datum/sprite_accessory/insect_wings/harpywings
+ name = "Harpy"
+ icon_state = "harpywings"
+
+/datum/sprite_accessory/insect_wings/roboticwing
+ name = "Robotic"
+ icon_state = "drago"
+
+/datum/sprite_accessory/insect_wings/succubusblack
+ name = "Succubus Black"
+ icon_state = "succubusblack"
+
+/datum/sprite_accessory/insect_wings/succubuspurple
+ name = "Succubus Purple"
+ icon_state = "succubuspurple"
+
+/datum/sprite_accessory/insect_wings/succubusred
+ name = "Succubus Red"
+ icon_state = "succubusred"
+
+/datum/sprite_accessory/insect_wings/xenobackplate
+ name = "Xenomorph Backplate"
+ icon_state = "snagbackplate"
+
+//moth wings
+
/datum/sprite_accessory/insect_wings/none
name = "None"
icon_state = "none"
@@ -183,25 +310,17 @@
name = "Atlas"
icon_state = "atlas"
-/datum/sprite_accessory/insect_wings/bat
- name = "Bat"
- icon_state = "bat"
-
-/datum/sprite_accessory/insect_wings/bee
- name = "Bee"
- icon_state = "bee"
+/datum/sprite_accessory/insect_wings/brown
+ name = "Brown"
+ icon_state = "brown"
/datum/sprite_accessory/insect_wings/deathhead
name = "Deathshead"
icon_state = "deathhead"
-/datum/sprite_accessory/insect_wings/fairy
- name = "Fairy"
- icon_state = "fairy"
-
-/datum/sprite_accessory/insect_wings/feathery
- name = "Feathery"
- icon_state = "feathery"
+/datum/sprite_accessory/insect_wings/featherymoth
+ name = "Feathery Moth Wings"
+ icon_state = "featherymoth"
/datum/sprite_accessory/insect_wings/firewatch
name = "Firewatch"
@@ -239,6 +358,10 @@
name = "Plain"
icon_state = "plain"
+/datum/sprite_accessory/insect_wings/plasmafire
+ name = "Plasma Fire"
+ icon_state = "plasmafire"
+
/datum/sprite_accessory/insect_wings/poison
name = "Poison"
icon_state = "poison"
@@ -255,6 +378,10 @@
name = "Reddish"
icon_state = "redish"
+/datum/sprite_accessory/insect_wings/rosy
+ name = "Rosy"
+ icon_state = "rosy"
+
/datum/sprite_accessory/insect_wings/royal
name = "Royal"
icon_state = "royal"
@@ -282,45 +409,25 @@
icon_state = "none"
relevant_layers = null
-/datum/sprite_accessory/insect_markings/reddish
- name = "Reddish"
- icon_state = "reddish"
-
-/datum/sprite_accessory/insect_markings/royal
- name = "Royal"
- icon_state = "royal"
-
-/datum/sprite_accessory/insect_markings/gothic
- name = "Gothic"
- icon_state = "gothic"
-
-/datum/sprite_accessory/insect_markings/whitefly
- name = "White Fly"
- icon_state = "whitefly"
-
-/datum/sprite_accessory/insect_markings/lovers
- name = "Lovers"
- icon_state = "lovers"
-
-/datum/sprite_accessory/insect_markings/punished
- name = "Punished"
- icon_state = "punished"
+/datum/sprite_accessory/insect_markings/deathhead
+ name = "Deathshead"
+ icon_state = "deathhead"
/datum/sprite_accessory/insect_markings/firewatch
name = "Firewatch"
icon_state = "firewatch"
-/datum/sprite_accessory/insect_markings/deathhead
- name = "Deathshead"
- icon_state = "deathhead"
+/datum/sprite_accessory/insect_markings/gothic
+ name = "Gothic"
+ icon_state = "gothic"
-/datum/sprite_accessory/insect_markings/poison
- name = "Poison"
- icon_state = "poison"
+/datum/sprite_accessory/insect_markings/jungle
+ name = "Jungle"
+ icon_state = "jungle"
-/datum/sprite_accessory/insect_markings/ragged
- name = "Ragged"
- icon_state = "ragged"
+/datum/sprite_accessory/insect_markings/lovers
+ name = "Lovers"
+ icon_state = "lovers"
/datum/sprite_accessory/insect_markings/moonfly
name = "Moon Fly"
@@ -330,10 +437,42 @@
name = "Oak Worm"
icon_state = "oakworm"
-/datum/sprite_accessory/insect_markings/jungle
- name = "Jungle"
- icon_state = "jungle"
+/datum/sprite_accessory/insect_markings/poison
+ name = "Poison"
+ icon_state = "poison"
+
+/datum/sprite_accessory/insect_markings/punished
+ name = "Punished"
+ icon_state = "punished"
+
+/datum/sprite_accessory/insect_markings/ragged
+ name = "Ragged"
+ icon_state = "ragged"
+
+/datum/sprite_accessory/insect_markings/reddish
+ name = "Reddish"
+ icon_state = "reddish"
+
+/datum/sprite_accessory/insect_markings/royal
+ name = "Royal"
+ icon_state = "royal"
+
+/datum/sprite_accessory/insect_markings/whitefly
+ name = "White Fly"
+ icon_state = "whitefly"
/datum/sprite_accessory/insect_markings/witchwing
name = "Witch Wing"
icon_state = "witchwing"
+
+//DONATOR WINGS
+
+/datum/sprite_accessory/deco_wings/eyestalks
+ name = "gazer eyestalks"
+ icon_state = "eyestalks"
+ //ckeys_allowed = list("liquidfirefly","seiga") //At request.
+
+/datum/sprite_accessory/insect_wings/eyestalks
+ name = "gazer eyestalks"
+ icon_state = "eyestalks"
+ //ckeys_allowed = list("liquidfirefly","seiga") //At request.
diff --git a/code/modules/mob/living/carbon/damage_procs.dm b/code/modules/mob/living/carbon/damage_procs.dm
index a866049d65..1f3a174d0f 100644
--- a/code/modules/mob/living/carbon/damage_procs.dm
+++ b/code/modules/mob/living/carbon/damage_procs.dm
@@ -62,8 +62,8 @@
amount += BP.burn_dam
return amount
-
-/mob/living/carbon/adjustBruteLoss(amount, updating_health = TRUE, forced = FALSE)
+//In both these procs, only_organic / only_robotic are only used for healing, not for damaging. For now at least.
+/mob/living/carbon/adjustBruteLoss(amount, updating_health = TRUE, forced = FALSE, only_robotic = FALSE, only_organic = TRUE)
if(!forced && amount < 0 && HAS_TRAIT(src,TRAIT_NONATURALHEAL))
return FALSE
if(!forced && (status_flags & GODMODE))
@@ -71,10 +71,10 @@
if(amount > 0)
take_overall_damage(amount, 0, 0, updating_health)
else
- heal_overall_damage(abs(amount), 0, 0, FALSE, TRUE, updating_health)
+ heal_overall_damage(abs(amount), 0, 0, only_robotic, only_organic, updating_health)
return amount
-/mob/living/carbon/adjustFireLoss(amount, updating_health = TRUE, forced = FALSE)
+/mob/living/carbon/adjustFireLoss(amount, updating_health = TRUE, forced = FALSE, only_robotic = FALSE, only_organic = TRUE)
if(!forced && amount < 0 && HAS_TRAIT(src,TRAIT_NONATURALHEAL)) //Vamps don't heal naturally.
return FALSE
if(!forced && (status_flags & GODMODE))
@@ -82,7 +82,7 @@
if(amount > 0)
take_overall_damage(0, amount, 0, updating_health)
else
- heal_overall_damage(0, abs(amount), 0, FALSE, TRUE, updating_health)
+ heal_overall_damage(0, abs(amount), 0, only_robotic, only_organic, updating_health)
return amount
diff --git a/code/modules/mob/living/carbon/handle_corruption.dm b/code/modules/mob/living/carbon/handle_corruption.dm
index 7b84c41e27..5ac2a2f616 100644
--- a/code/modules/mob/living/carbon/handle_corruption.dm
+++ b/code/modules/mob/living/carbon/handle_corruption.dm
@@ -80,10 +80,11 @@
if("shortlimbdisable")
var/disabled_type = pick(list(TRAIT_PARALYSIS_L_ARM, TRAIT_PARALYSIS_R_ARM, TRAIT_PARALYSIS_L_LEG, TRAIT_PARALYSIS_R_LEG))
ADD_TRAIT(src, disabled_type, CORRUPTED_SYSTEM)
+ update_disabled_bodyparts()
addtimer(CALLBACK(src, .proc/reenable_limb, disabled_type), 5 SECONDS)
to_chat(src, "Error - Limb control subsystem partially shutdown, rebooting.")
if("shortblind")
- ADD_TRAIT(src, TRAIT_BLIND, CORRUPTED_SYSTEM)
+ become_blind(CORRUPTED_SYSTEM)
addtimer(CALLBACK(src, .proc/reenable_vision), 5 SECONDS)
to_chat(src, "Visual receptor shutdown detected - Initiating reboot.")
if("shortstun")
@@ -105,10 +106,11 @@
if("longlimbdisable")
var/disabled_type = pick(list(TRAIT_PARALYSIS_L_ARM, TRAIT_PARALYSIS_R_ARM, TRAIT_PARALYSIS_L_LEG, TRAIT_PARALYSIS_R_LEG))
ADD_TRAIT(src, disabled_type, CORRUPTED_SYSTEM)
+ update_disabled_bodyparts()
addtimer(CALLBACK(src, .proc/reenable_limb, disabled_type), 25 SECONDS)
to_chat(src, "Fatal error in limb control subsystem - rebooting.")
if("blindmutedeaf")
- ADD_TRAIT(src, TRAIT_BLIND, CORRUPTED_SYSTEM)
+ become_blind(CORRUPTED_SYSTEM)
addtimer(CALLBACK(src, .proc/reenable_vision), (rand(10, 25)) SECONDS)
ADD_TRAIT(src, TRAIT_DEAF, CORRUPTED_SYSTEM)
addtimer(CALLBACK(src, .proc/reenable_hearing), (rand(15, 35)) SECONDS)
@@ -140,6 +142,7 @@
/mob/living/carbon/proc/reenable_limb(disabled_limb)
REMOVE_TRAIT(src, disabled_limb, CORRUPTED_SYSTEM)
+ update_disabled_bodyparts()
to_chat(src, "Limb control subsystem successfully rebooted.")
/mob/living/carbon/proc/reenable_hearing()
@@ -147,7 +150,7 @@
to_chat(src, "Hearing restored.")
/mob/living/carbon/proc/reenable_vision()
- REMOVE_TRAIT(src, TRAIT_BLIND, CORRUPTED_SYSTEM)
+ cure_blind(CORRUPTED_SYSTEM)
to_chat(src, "Visual receptors back online.")
/mob/living/carbon/proc/reenable_speech()
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index a0794a2a5c..e29aa2b055 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -411,15 +411,18 @@
if(isrobotic(src))
apply_status_effect(/datum/status_effect/no_combat_mode/robotic_emp, severity / 20)
severity *= 0.5
+ var/do_not_stun = FALSE
if(HAS_TRAIT(src, TRAIT_ROBOTIC_ORGANISM))
severity *= 0.5 //Robotpeople take less limb damage, but instead suffer system corruption (see carbon emp_act)
+ do_not_stun = TRUE
for(var/obj/item/bodypart/L in src.bodyparts)
if(L.is_robotic_limb())
if(!informed)
to_chat(src, "You feel a sharp pain as your robotic limbs overload.")
informed = TRUE
L.receive_damage(0,severity/10)
- Stun(severity*2)
+ if(!do_not_stun) //Tiny bit better than checking for the trait another six times in succession
+ Stun(severity*2)
/mob/living/carbon/human/acid_act(acidpwr, acid_volume, bodyzone_hit)
var/list/damaged = list()
diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm
index 44701a26b2..e7426aa1fa 100644
--- a/code/modules/mob/living/damage_procs.dm
+++ b/code/modules/mob/living/damage_procs.dm
@@ -141,7 +141,8 @@
/mob/living/proc/getBruteLoss()
return bruteloss
-/mob/living/proc/adjustBruteLoss(amount, updating_health = TRUE, forced = FALSE)
+//only_robotic and only_organic arg only relevant for carbons
+/mob/living/proc/adjustBruteLoss(amount, updating_health = TRUE, forced = FALSE, only_robotic = FALSE, only_organic = TRUE)
if(!forced && (status_flags & GODMODE))
return FALSE
bruteloss = clamp((bruteloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2)
@@ -215,7 +216,8 @@
/mob/living/proc/getFireLoss()
return fireloss
-/mob/living/proc/adjustFireLoss(amount, updating_health = TRUE, forced = FALSE)
+//only_robotic and only_organic arg only relevant for carbons
+/mob/living/proc/adjustFireLoss(amount, updating_health = TRUE, forced = FALSE, only_robotic = FALSE, only_organic = TRUE)
if(!forced && (status_flags & GODMODE))
return FALSE
fireloss = clamp((fireloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2)
diff --git a/code/modules/mob/living/silicon/pai/pai_defense.dm b/code/modules/mob/living/silicon/pai/pai_defense.dm
index c5fa5ece1f..c339aa920f 100644
--- a/code/modules/mob/living/silicon/pai/pai_defense.dm
+++ b/code/modules/mob/living/silicon/pai/pai_defense.dm
@@ -81,10 +81,10 @@
to_chat(src, "The impact degrades your holochassis!")
return amount
-/mob/living/silicon/pai/adjustBruteLoss(amount, updating_health = TRUE, forced = FALSE)
+/mob/living/silicon/pai/adjustBruteLoss(amount, updating_health = TRUE, forced = FALSE, only_robotic = FALSE, only_organic = TRUE)
return take_holo_damage(amount)
-/mob/living/silicon/pai/adjustFireLoss(amount, updating_health = TRUE, forced = FALSE)
+/mob/living/silicon/pai/adjustFireLoss(amount, updating_health = TRUE, forced = FALSE, only_robotic = FALSE, only_organic = TRUE)
return take_holo_damage(amount)
/mob/living/silicon/pai/adjustToxLoss(amount, updating_health = TRUE, forced = FALSE, toxins_type = TOX_DEFAULT)
diff --git a/code/modules/mob/living/simple_animal/damage_procs.dm b/code/modules/mob/living/simple_animal/damage_procs.dm
index 9a2921cc0e..f478458829 100644
--- a/code/modules/mob/living/simple_animal/damage_procs.dm
+++ b/code/modules/mob/living/simple_animal/damage_procs.dm
@@ -7,13 +7,13 @@
updatehealth()
return amount
-/mob/living/simple_animal/adjustBruteLoss(amount, updating_health = TRUE, forced = FALSE)
+/mob/living/simple_animal/adjustBruteLoss(amount, updating_health = TRUE, forced = FALSE, only_robotic = FALSE, only_organic = TRUE)
if(forced)
. = adjustHealth(amount * CONFIG_GET(number/damage_multiplier), updating_health, forced)
else if(damage_coeff[BRUTE])
. = adjustHealth(amount * damage_coeff[BRUTE] * CONFIG_GET(number/damage_multiplier), updating_health, forced)
-/mob/living/simple_animal/adjustFireLoss(amount, updating_health = TRUE, forced = FALSE)
+/mob/living/simple_animal/adjustFireLoss(amount, updating_health = TRUE, forced = FALSE, only_robotic = FALSE, only_organic = TRUE)
if(forced)
. = adjustHealth(amount * CONFIG_GET(number/damage_multiplier), updating_health, forced)
else if(damage_coeff[BURN])
diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm
index 1f45e57718..ab59441572 100644
--- a/code/modules/mob/living/simple_animal/slime/slime.dm
+++ b/code/modules/mob/living/simple_animal/slime/slime.dm
@@ -225,7 +225,7 @@
. += "Power Level: [powerlevel]"
-/mob/living/simple_animal/slime/adjustFireLoss(amount, updating_health = TRUE, forced = FALSE)
+/mob/living/simple_animal/slime/adjustFireLoss(amount, updating_health = TRUE, forced = FALSE, only_robotic = FALSE, only_organic = TRUE)
if(!forced)
amount = -abs(amount)
return ..() //Heals them
diff --git a/code/modules/research/designs/misc_designs.dm b/code/modules/research/designs/misc_designs.dm
index a54fe857e9..7dfe19f635 100644
--- a/code/modules/research/designs/misc_designs.dm
+++ b/code/modules/research/designs/misc_designs.dm
@@ -481,7 +481,7 @@
build_path = /obj/item/holosign_creator/atmos
category = list("Tool Designs")
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
-
+/*
/datum/design/holosignfirelock
name = "ATMOS Holofirelock Projector"
desc = "A holographic projector that creates holographic barriers that prevent changes in temperature conditions."
@@ -491,7 +491,7 @@
build_path = /obj/item/holosign_creator/firelock
category = list("Tool Designs")
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
-
+*/
/datum/design/holosigncombifan
name = "ATMOS Holo-Combifan Projector"
desc = "A holographic projector that creates holographic barriers that prevent changes in atmospheric and temperature conditions."
diff --git a/code/modules/research/techweb/nodes/misc_nodes.dm b/code/modules/research/techweb/nodes/misc_nodes.dm
index 1bdc144232..2e3324790b 100644
--- a/code/modules/research/techweb/nodes/misc_nodes.dm
+++ b/code/modules/research/techweb/nodes/misc_nodes.dm
@@ -38,7 +38,7 @@
display_name = "Electromagnetic Theory"
description = "Study into usage of frequencies in the electromagnetic spectrum."
prereq_ids = list("base")
- design_ids = list("holosign", "holosignsec", "holosignengi", "holosignatmos", "holosignfirelock", "inducer", "tray_goggles", "holopad")
+ design_ids = list("holosign", "holosignsec", "holosignengi", "holosignatmos",/* "holosignfirelock",*/ "inducer", "tray_goggles", "holopad")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
/datum/techweb_node/emp_adv
diff --git a/code/modules/spells/spell_types/togglebuff.dm b/code/modules/spells/spell_types/togglebuff.dm
new file mode 100644
index 0000000000..d1c4f55393
--- /dev/null
+++ b/code/modules/spells/spell_types/togglebuff.dm
@@ -0,0 +1,35 @@
+/obj/effect/proc_holder/spell/self/mantra
+ name = "Inner Mantra"
+ desc = "Control your Inner Mantra, gaining strength and durability for a cost."
+ clothes_req = NONE
+ mobs_whitelist = list(/mob/living/carbon/human)
+ charge_max = 100
+ antimagic_allowed = TRUE
+ invocation = "SU'UP'AH S'EI YEN"
+ invocation_type = "shout"
+ level_max = 0
+ cooldown_min = 100
+
+/obj/effect/proc_holder/spell/self/mantra/cast(mob/living/carbon/human/user)
+ if(user.has_status_effect(STATUS_EFFECT_MANTRA))
+ user.remove_status_effect(STATUS_EFFECT_MANTRA)
+ else
+ user.apply_status_effect(STATUS_EFFECT_MANTRA)
+
+/obj/effect/proc_holder/spell/self/asura
+ name = "Asura's Wrath"
+ desc = "Unleash your rage as corrosive power fills your muscles."
+ clothes_req = NONE
+ mobs_whitelist = list(/mob/living/carbon/human)
+ charge_max = 100
+ antimagic_allowed = TRUE
+ invocation = "KYE Y'O'KEN"
+ invocation_type = "shout"
+ level_max = 0
+ cooldown_min = 100
+
+/obj/effect/proc_holder/spell/self/asura/cast(mob/living/carbon/human/user)
+ if(user.has_status_effect(STATUS_EFFECT_ASURA))
+ user.remove_status_effect(STATUS_EFFECT_ASURA)
+ else
+ user.apply_status_effect(STATUS_EFFECT_ASURA)
diff --git a/code/modules/surgery/emergency_reboot.dm b/code/modules/surgery/emergency_reboot.dm
new file mode 100644
index 0000000000..046edd884c
--- /dev/null
+++ b/code/modules/surgery/emergency_reboot.dm
@@ -0,0 +1,62 @@
+//Emergency Reboot: A surgery that allows for revival of Synthetics without the need for a defib. Doesn't all all the organs like the Revival surgery though.
+
+/datum/surgery/emergency_reboot
+ name = "Emergency Reboot"
+ desc = "A surgery forcing the posibrain of a robot to begin it's reboot procedure, if their body can sustain its operation."
+ possible_locs = list(BODY_ZONE_HEAD)
+ requires_bodypart_type = BODYPART_ROBOTIC //If you are a Synth with a organic head (somehow), this won't work.
+ steps = list(/datum/surgery_step/mechanic_open, /datum/surgery_step/open_hatch, /datum/surgery_step/mechanic_unwrench, /datum/surgery_step/force_reboot, /datum/surgery_step/mechanic_wrench, /datum/surgery_step/mechanic_close)
+
+/datum/surgery/emergency_reboot/can_start(mob/user, mob/living/carbon/target, obj/item/tool)
+ if(!..())
+ return FALSE
+ if(target.stat != DEAD)
+ return FALSE
+ if(target.suiciding || HAS_TRAIT(target, TRAIT_NOCLONE) || target.hellbound)
+ return FALSE
+ if(!HAS_TRAIT(target, TRAIT_ROBOTIC_ORGANISM))
+ return FALSE
+ var/obj/item/organ/brain/B = target.getorganslot(ORGAN_SLOT_BRAIN)
+ if(!B || !istype(B, /obj/item/organ/brain/ipc))
+ return FALSE
+ return TRUE
+
+/datum/surgery_step/force_reboot
+ name = "initiate system reboot"
+ implements = list(TOOL_MULTITOOL = 100, /obj/item/borg/upgrade/restart = 100)
+ time = 100
+
+/datum/surgery_step/force_reboot/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+ display_results(user, target, "You prepare to begin rebooting [target]'s posibrain.",
+ "[user] prepares to reboot [target]'s posibrain with [tool].",
+ "[user] prepares to reboot [target]'s posibrain with [tool].")
+ target.notify_ghost_cloning("Someone is trying to reboot you! Re-enter your corpse if you want to be revived!", source = target)
+
+/datum/surgery_step/force_reboot/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+ display_results(user, target, "You successfully initiate a reboot in [target]'s posibrain...",
+ "[user] initiates a reboot in [target]'s posibrain...",
+ "[user] initiates a reboot in [target]'s posibrain...")
+ target.adjustOxyLoss(-50, 0)
+ target.updatehealth()
+ var/tplus = world.time - target.timeofdeath
+ if(target.revive())
+ target.visible_message("...[target]'s posibrain flickers to life once again!")
+ target.emote("ping")
+ var/list/policies = CONFIG_GET(keyed_list/policyconfig)
+ var/timelimit = CONFIG_GET(number/defib_cmd_time_limit) * 10 //the config is in seconds, not deciseconds
+ var/late = timelimit && (tplus > timelimit)
+ var/policy = late? policies[POLICYCONFIG_ON_DEFIB_LATE] : policies[POLICYCONFIG_ON_DEFIB_INTACT]
+ if(policy)
+ to_chat(target, policy)
+ target.log_message("revived using surgical revival, [tplus] deciseconds from time of death, considered [late? "late" : "memory-intact"] revival under configured policy limits.", LOG_GAME)
+ return TRUE
+ else
+ target.visible_message("...[target]'s posibrain flickers a few times, before the lights fade yet again...")
+ return FALSE
+
+/datum/surgery_step/force_reboot/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+ display_results(user, target, "You attempt to reboot [target]'s posibrain, but [target.p_they()] doesn't react.",
+ "[user] attempts to reboot [target]'s posibrain, but [target.p_they()] doesn't react.",
+ "[user] attempts to reboot [target]'s posibrain, but [target.p_they()] doesn't react")
+ target.adjustOrganLoss(ORGAN_SLOT_BRAIN, 15, 199)
+ return FALSE
diff --git a/code/modules/surgery/limb_augmentation.dm b/code/modules/surgery/limb_augmentation.dm
index 059a5aaa34..c65f5f11f6 100644
--- a/code/modules/surgery/limb_augmentation.dm
+++ b/code/modules/surgery/limb_augmentation.dm
@@ -31,6 +31,12 @@
target_mobtypes = list(/mob/living/carbon/human)
possible_locs = list(BODY_ZONE_R_ARM,BODY_ZONE_L_ARM,BODY_ZONE_R_LEG,BODY_ZONE_L_LEG,BODY_ZONE_CHEST,BODY_ZONE_HEAD)
requires_real_bodypart = TRUE
+
+//The augmentation surgery for synthetic limbs
+/datum/surgery/augmentation/synth
+ requires_bodypart_type = BODYPART_HYBRID
+ steps = list(/datum/surgery_step/mechanic_open, /datum/surgery_step/pry_off_plating, /datum/surgery_step/cut_wires, /datum/surgery_step/prepare_electronics, /datum/surgery_step/replace_limb)
+
//SURGERY STEP SUCCESSES
/datum/surgery_step/replace_limb/success(mob/user, mob/living/carbon/target, target_zone, obj/item/bodypart/tool, datum/surgery/surgery)
if(L)
diff --git a/code/modules/surgery/remove_embedded_object.dm b/code/modules/surgery/remove_embedded_object.dm
index f974c39bb4..dfdb1f7eca 100644
--- a/code/modules/surgery/remove_embedded_object.dm
+++ b/code/modules/surgery/remove_embedded_object.dm
@@ -2,11 +2,17 @@
name = "removal of embedded objects"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/remove_object)
possible_locs = list(BODY_ZONE_R_ARM,BODY_ZONE_L_ARM,BODY_ZONE_R_LEG,BODY_ZONE_L_LEG,BODY_ZONE_CHEST,BODY_ZONE_HEAD)
+
+/datum/surgery/embedded_removal/robot
+ requires_bodypart_type = BODYPART_ROBOTIC
+ steps = list(/datum/surgery_step/mechanic_open, /datum/surgery_step/open_hatch, /datum/surgery_step/remove_object)
+
/datum/surgery_step/remove_object
name = "remove embedded objects"
time = 32
accept_hand = 1
var/obj/item/bodypart/L = null
+
/datum/surgery_step/remove_object/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
L = surgery.operated_bodypart
if(L)
diff --git a/html/changelogs/AutoChangeLog-pr-13975.yml b/html/changelogs/AutoChangeLog-pr-13975.yml
new file mode 100644
index 0000000000..ff643cd19c
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13975.yml
@@ -0,0 +1,4 @@
+author: "zeroisthebiggay"
+delete-after: True
+changes:
+ - imageadd: "fuck the r*d cr*ss"
diff --git a/html/changelogs/AutoChangeLog-pr-14009.yml b/html/changelogs/AutoChangeLog-pr-14009.yml
new file mode 100644
index 0000000000..03a1ca39dd
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-14009.yml
@@ -0,0 +1,7 @@
+author: "shellspeed1"
+delete-after: True
+changes:
+ - rscadd: "Wings from Cit RP have been ported over"
+ - rscadd: "Moth wings from cit have been ported over"
+ - bugfix: "Cleaned up some pixels on existing moth wings."
+ - tweak: "Organized the lists for wings by if they are for moths or not and than by alphabetical."
diff --git a/html/changelogs/AutoChangeLog-pr-14015.yml b/html/changelogs/AutoChangeLog-pr-14015.yml
new file mode 100644
index 0000000000..fe507d0a1e
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-14015.yml
@@ -0,0 +1,4 @@
+author: "DeltaFire15"
+delete-after: True
+changes:
+ - balance: "Some synth damage stuff has been a bit rebalanced, see the PR for details."
diff --git a/html/changelogs/AutoChangeLog-pr-14021.yml b/html/changelogs/AutoChangeLog-pr-14021.yml
new file mode 100644
index 0000000000..aab94ae724
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-14021.yml
@@ -0,0 +1,4 @@
+author: "DeltaFire15"
+delete-after: True
+changes:
+ - bugfix: "Combat mode now will not stay permanently disabled due to status effects not working as intended."
diff --git a/html/changelogs/AutoChangeLog-pr-14025.yml b/html/changelogs/AutoChangeLog-pr-14025.yml
new file mode 100644
index 0000000000..6db185baa3
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-14025.yml
@@ -0,0 +1,7 @@
+author: "DeltaFire15"
+delete-after: True
+changes:
+ - rscadd: "A new surgery, allowing revival of synths without a defib at hand."
+ - balance: "Semi-permanent damage of Synth limbs caused by passing the damage threshold: 10 <- 15."
+ - tweak: "The embed removal surgery now has a version for Synths."
+ - balance: "EMPs no longer hardstun Synths."
diff --git a/html/changelogs/AutoChangeLog-pr-14032.yml b/html/changelogs/AutoChangeLog-pr-14032.yml
new file mode 100644
index 0000000000..67f0a80f83
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-14032.yml
@@ -0,0 +1,8 @@
+author: "kappa-sama"
+delete-after: True
+changes:
+ - rscadd: "A new spell for the wizard and his martial apprentices, the Inner Mantra technique. It makes you punch people really good and makes you durable, but drains your energy while it's active."
+ - rscadd: "A self-buffing spell for valiant bubblegum slayers that is ultimately useless on lavaland and probably overpowered for miner antagonists. Go figure. At least all it does is let you punch hard while draining your health every second."
+ - balance: "bubblegum now drops a book that makes you into an abusive father instead of a shotgun that plays like pre-nerf shotguns"
+ - soundadd: "a powerup and powerdown sound effect"
+ - imageadd: "two icons for two buff spells"
diff --git a/html/changelogs/AutoChangeLog-pr-14034.yml b/html/changelogs/AutoChangeLog-pr-14034.yml
new file mode 100644
index 0000000000..ecd0d4ca10
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-14034.yml
@@ -0,0 +1,4 @@
+author: "DeltaFire15"
+delete-after: True
+changes:
+ - bugfix: "Some edge cases causing issues with system corruption shouldn't be able to occur anymore."
diff --git a/html/changelogs/AutoChangeLog-pr-14035.yml b/html/changelogs/AutoChangeLog-pr-14035.yml
new file mode 100644
index 0000000000..b8690368a3
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-14035.yml
@@ -0,0 +1,4 @@
+author: "SiliconMain"
+delete-after: True
+changes:
+ - tweak: "hololocks (which haven't worked for god knows how long) commented out until auxmos is merged"
diff --git a/icons/mob/clothing/head.dmi b/icons/mob/clothing/head.dmi
index 62d6644311..4b0c56c4d2 100644
Binary files a/icons/mob/clothing/head.dmi and b/icons/mob/clothing/head.dmi differ
diff --git a/icons/mob/clothing/head_muzzled.dmi b/icons/mob/clothing/head_muzzled.dmi
index 0c72221833..e99f1ff6d4 100644
Binary files a/icons/mob/clothing/head_muzzled.dmi and b/icons/mob/clothing/head_muzzled.dmi differ
diff --git a/icons/mob/clothing/suit.dmi b/icons/mob/clothing/suit.dmi
index 21d2f872f1..a3d75644da 100644
Binary files a/icons/mob/clothing/suit.dmi and b/icons/mob/clothing/suit.dmi differ
diff --git a/icons/mob/clothing/suit_digi.dmi b/icons/mob/clothing/suit_digi.dmi
index 9f6e3ffb84..b109c2095e 100644
Binary files a/icons/mob/clothing/suit_digi.dmi and b/icons/mob/clothing/suit_digi.dmi differ
diff --git a/icons/mob/wings.dmi b/icons/mob/wings.dmi
index 4523403344..92de5c150c 100644
Binary files a/icons/mob/wings.dmi and b/icons/mob/wings.dmi differ
diff --git a/icons/obj/closet.dmi b/icons/obj/closet.dmi
index 3653635c56..70f5001c26 100644
Binary files a/icons/obj/closet.dmi and b/icons/obj/closet.dmi differ
diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi
index 95a31f8b9f..ee6cf90597 100644
Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ
diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi
index 935e9ead02..f9eabaa44c 100644
Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ
diff --git a/icons/obj/library.dmi b/icons/obj/library.dmi
index 6e14c4c6ca..7e3b8058b8 100644
Binary files a/icons/obj/library.dmi and b/icons/obj/library.dmi differ
diff --git a/icons/obj/magic.dmi b/icons/obj/magic.dmi
index c376dc7321..6555373ae1 100644
Binary files a/icons/obj/magic.dmi and b/icons/obj/magic.dmi differ
diff --git a/sound/magic/powerdown.ogg b/sound/magic/powerdown.ogg
new file mode 100644
index 0000000000..9d514c64ca
Binary files /dev/null and b/sound/magic/powerdown.ogg differ
diff --git a/sound/magic/powerup.ogg b/sound/magic/powerup.ogg
new file mode 100644
index 0000000000..909c2a33c7
Binary files /dev/null and b/sound/magic/powerup.ogg differ
diff --git a/tgstation.dme b/tgstation.dme
index 97ddacbd6d..db92c2ff83 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -3403,6 +3403,7 @@
#include "code\modules\spells\spell_types\taeclowndo.dm"
#include "code\modules\spells\spell_types\telepathy.dm"
#include "code\modules\spells\spell_types\the_traps.dm"
+#include "code\modules\spells\spell_types\togglebuff.dm"
#include "code\modules\spells\spell_types\touch_attacks.dm"
#include "code\modules\spells\spell_types\trigger.dm"
#include "code\modules\spells\spell_types\turf_teleport.dm"
@@ -3426,6 +3427,7 @@
#include "code\modules\surgery\dental_implant.dm"
#include "code\modules\surgery\embalming.dm"
#include "code\modules\surgery\emergency_cardioversion_recovery.dm"
+#include "code\modules\surgery\emergency_reboot.dm"
#include "code\modules\surgery\experimental_dissection.dm"
#include "code\modules\surgery\eye_surgery.dm"
#include "code\modules\surgery\graft_synthtissue.dm"