diff --git a/code/__DEFINES/logging.dm b/code/__DEFINES/logging.dm
index fe50319295..7e385638c5 100644
--- a/code/__DEFINES/logging.dm
+++ b/code/__DEFINES/logging.dm
@@ -24,18 +24,19 @@
#define LOG_SAY (1 << 1)
#define LOG_WHISPER (1 << 2)
#define LOG_EMOTE (1 << 3)
-#define LOG_DSAY (1 << 4)
-#define LOG_PDA (1 << 5)
-#define LOG_CHAT (1 << 6)
-#define LOG_COMMENT (1 << 7)
-#define LOG_TELECOMMS (1 << 8)
-#define LOG_OOC (1 << 9)
-#define LOG_ADMIN (1 << 10)
-#define LOG_OWNERSHIP (1 << 11)
-#define LOG_GAME (1 << 12)
-#define LOG_ADMIN_PRIVATE (1 << 13)
-#define LOG_ASAY (1 << 14)
-#define LOG_VIRUS (1 << 15)
+#define LOG_SUBTLER (1 << 4)
+#define LOG_DSAY (1 << 5)
+#define LOG_PDA (1 << 6)
+#define LOG_CHAT (1 << 7)
+#define LOG_COMMENT (1 << 8)
+#define LOG_TELECOMMS (1 << 9)
+#define LOG_OOC (1 << 10)
+#define LOG_ADMIN (1 << 11)
+#define LOG_OWNERSHIP (1 << 12)
+#define LOG_GAME (1 << 13)
+#define LOG_ADMIN_PRIVATE (1 << 14)
+#define LOG_ASAY (1 << 15)
+#define LOG_VIRUS (1 << 16)
//Individual logging panel pages
#define INDIVIDUAL_ATTACK_LOG (LOG_ATTACK)
diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm
index d707f7e58a..a5bbe0e304 100644
--- a/code/__DEFINES/traits.dm
+++ b/code/__DEFINES/traits.dm
@@ -174,6 +174,7 @@
#define TRAIT_CLOWN_MENTALITY "clown_mentality" // The future is now, clownman.
#define TRAIT_FREESPRINT "free_sprinting"
#define TRAIT_NO_TELEPORT "no-teleport" //you just can't
+#define TRAIT_NO_INTERNALS "no-internals"
#define TRAIT_NO_ALCOHOL "alcohol_intolerance"
// common trait sources
diff --git a/code/__HELPERS/_logging.dm b/code/__HELPERS/_logging.dm
index db8f4a1d0d..2d53b86c57 100644
--- a/code/__HELPERS/_logging.dm
+++ b/code/__HELPERS/_logging.dm
@@ -94,6 +94,10 @@
if (CONFIG_GET(flag/log_emote))
WRITE_LOG(GLOB.world_game_log, "EMOTE: [text]")
+/proc/log_subtler(text)
+ if (CONFIG_GET(flag/log_emote))
+ WRITE_LOG(GLOB.world_game_log, "EMOTE (SUBTLER): [text]")
+
/proc/log_prayer(text)
if (CONFIG_GET(flag/log_prayer))
WRITE_LOG(GLOB.world_game_log, "PRAY: [text]")
diff --git a/code/__HELPERS/sanitize_values.dm b/code/__HELPERS/sanitize_values.dm
index 601ed966bf..faa8c22f38 100644
--- a/code/__HELPERS/sanitize_values.dm
+++ b/code/__HELPERS/sanitize_values.dm
@@ -46,19 +46,25 @@
var/start = 1 + (text2ascii(color, 1) == 35)
var/len = length(color)
var/char = ""
+ // RRGGBB -> RGB but awful
+ var/convert_to_shorthand = desired_format == 3 && length_char(color) > 3
. = ""
- for(var/i = start, i <= len, i += length(char))
+ var/i = start
+ while(i <= len)
char = color[i]
switch(text2ascii(char))
- if(48 to 57) //numbers 0 to 9
+ if(48 to 57) //numbers 0 to 9
. += char
- if(97 to 102) //letters a to f
+ if(97 to 102) //letters a to f
. += char
- if(65 to 70) //letters A to F - translates to lowercase
+ if(65 to 70) //letters A to F
. += lowertext(char)
else
break
+ i += length(char)
+ if(convert_to_shorthand && i <= len) //skip next one
+ i += length(color[i])
if(length_char(.) != desired_format)
if(default)
@@ -73,4 +79,4 @@
var/list/HSL = rgb2hsl(hex2num(copytext(color, 2, 4)), hex2num(copytext(color, 4, 6)), hex2num(copytext(color, 6, 8)))
HSL[3] = min(HSL[3],0.4)
var/list/RGB = hsl2rgb(arglist(HSL))
- return "#[num2hex(RGB[1],2)][num2hex(RGB[2],2)][num2hex(RGB[3],2)]"
\ No newline at end of file
+ return "#[num2hex(RGB[1],2)][num2hex(RGB[2],2)][num2hex(RGB[3],2)]"
diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm
index 14e1794b4d..15d1d3b717 100644
--- a/code/_onclick/hud/screen_objects.dm
+++ b/code/_onclick/hud/screen_objects.dm
@@ -291,6 +291,9 @@
icon_state = "internal0"
else
if(!C.getorganslot(ORGAN_SLOT_BREATHING_TUBE))
+ if(HAS_TRAIT(C, TRAIT_NO_INTERNALS))
+ to_chat(C, "Due to cumbersome equipment or anatomy, you are currently unable to use internals!")
+ return
var/obj/item/clothing/check
var/internals = FALSE
diff --git a/code/datums/components/slippery.dm b/code/datums/components/slippery.dm
index c7ceab671d..bf53414537 100644
--- a/code/datums/components/slippery.dm
+++ b/code/datums/components/slippery.dm
@@ -9,8 +9,7 @@
callback = _callback
RegisterSignal(parent, list(COMSIG_MOVABLE_CROSSED, COMSIG_ATOM_ENTERED), .proc/Slip)
-/datum/component/slippery/proc/Slip(datum/source, atom/movable/AM, extra_flags = NONE)
+/datum/component/slippery/proc/Slip(datum/source, atom/movable/AM)
var/mob/victim = AM
- var/lube = lube_flags | extra_flags
- if(istype(victim) && victim.slip(intensity, parent, lube) && callback)
+ if(istype(victim) && victim.slip(intensity, parent, lube_flags) && callback)
callback.Invoke(victim)
diff --git a/code/datums/diseases/advance/symptoms/vision.dm b/code/datums/diseases/advance/symptoms/vision.dm
index 6c9ad5a941..5453d6e11a 100644
--- a/code/datums/diseases/advance/symptoms/vision.dm
+++ b/code/datums/diseases/advance/symptoms/vision.dm
@@ -67,7 +67,7 @@ Bonus
eyes.applyOrganDamage(eyes.maxHealth)
else
M.visible_message("[M]'s eyes fall off their sockets!", "Your eyes fall off their sockets!")
- eyes.Remove(M)
+ eyes.Remove()
eyes.forceMove(get_turf(M))
else
to_chat(M, "Your eyes burn horrifically!")
diff --git a/code/datums/martial/rising_bass.dm b/code/datums/martial/rising_bass.dm
index 9e00c90a92..779428669c 100644
--- a/code/datums/martial/rising_bass.dm
+++ b/code/datums/martial/rising_bass.dm
@@ -1,8 +1,6 @@
#define SIDE_KICK_COMBO "DH"
#define SHOULDER_FLIP_COMBO "GHDGHH"
-#define REPULSE_PUNCH_COMBO "GHGH"
#define FOOT_SMASH_COMBO "HH"
-#define DEFT_SWITCH_COMBO "GDD"
/datum/martial_art/the_rising_bass
name = "The Rising Bass"
@@ -10,6 +8,9 @@
dodge_chance = 100
allow_temp_override = FALSE
help_verb = /mob/living/carbon/human/proc/rising_bass_help
+ var/datum/action/risingbassmove/repulsepunch = new/datum/action/risingbassmove/repulsepunch()
+ var/datum/action/risingbassmove/deftswitch = new/datum/action/risingbassmove/deftswitch()
+ var/repulsecool = 0
/datum/martial_art/the_rising_bass/proc/check_streak(mob/living/carbon/human/A, mob/living/carbon/human/D)
if(findtext(streak,SIDE_KICK_COMBO))
@@ -20,7 +21,7 @@
streak = ""
shoulderFlip(A,D)
return 1
- if(findtext(streak,REPULSE_PUNCH_COMBO))
+ if(findtext(streak,"rplse"))
streak = ""
repulsePunch(A,D)
return 1
@@ -28,13 +29,46 @@
streak = ""
footSmash(A,D)
return 1
- if(findtext(streak,DEFT_SWITCH_COMBO))
+ if(findtext(streak,"deft"))
streak = ""
deftSwitch(A,D)
return 1
return 0
+//Repulse Punch - Slams the opponent far away from you.
+/datum/action/risingbassmove
+ name = ""
+ icon_icon = 'icons/mob/actions/actions_items.dmi'
+ button_icon_state = ""
+ var/movestreak = ""
+
+/datum/action/risingbassmove/Trigger()
+ if(owner.incapacitated())
+ to_chat(owner, "You can't use [name] while you're incapacitated.")
+ return
+ var/mob/living/carbon/human/H = owner
+ if (H.mind.martial_art.streak == "[movestreak]")
+ H.mind.martial_art.streak = ""
+ to_chat(H,"You relax your muscles and return to a neutral position.")
+ else
+ if(HAS_TRAIT(H, TRAIT_PACIFISM))
+ to_chat(H, "You don't want to harm other people!")
+ return
+ to_chat(H,"You get ready to use the [name] maneuver!")
+ H.mind.martial_art.streak = "[movestreak]"
+
+/datum/action/risingbassmove/repulsepunch
+ name = "Repulse Punch"
+ button_icon_state = "repulsepunch"
+ movestreak = "rplse"
+
+/datum/action/risingbassmove/deftswitch
+ name = "Deft Switch"
+ button_icon_state = "deftswitch"
+ movestreak = "deft"
+
+
/datum/martial_art/the_rising_bass/proc/sideKick(mob/living/carbon/human/A, mob/living/carbon/human/D)
if(!D.IsKnockdown() || D.lying == 0)
var/turf/H = get_step(D, A.dir & (NORTH | SOUTH) ? pick(EAST, WEST) : pick(NORTH, SOUTH))
@@ -75,7 +109,7 @@
return basic_hit(A,D)
/datum/martial_art/the_rising_bass/proc/repulsePunch(mob/living/carbon/human/A, mob/living/carbon/human/D)
- if(!D.IsKnockdown() || !D.lying)
+ if(!D.IsKnockdown() || !D.lying || repulsecool > world.time)
A.do_attack_animation(D, ATTACK_EFFECT_PUNCH)
D.visible_message("[A] smashes [D] in the chest, throwing them away!", \
"[A] smashes you in the chest, repelling you away!")
@@ -85,6 +119,7 @@
D.apply_damage(10, BRUTE, BODY_ZONE_CHEST)
D.Knockdown(90)
log_combat(A, D, "repulse punched (Rising Bass)")
+ repulsecool = world.time + 3 SECONDS
return 1
return basic_hit(A,D)
@@ -132,6 +167,11 @@
return 1
return ..()
+/datum/martial_art/the_rising_bass/add_to_streak(element,mob/living/carbon/human/D)
+ if (streak == "deft" || streak == "rplse")
+ return
+ . = ..()
+
/mob/living/carbon/human/proc/rising_bass_help()
set name = "Recall Teachings"
set desc = "Remember the martial techniques of the Rising Bass clan."
@@ -149,10 +189,14 @@
. = ..()
if(!.)
return
+ deftswitch.Grant(H)
+ repulsepunch.Grant(H)
ADD_TRAIT(H, TRAIT_NOGUNS, RISING_BASS_TRAIT)
ADD_TRAIT(H, TRAIT_AUTO_CATCH_ITEM, RISING_BASS_TRAIT)
/datum/martial_art/the_rising_bass/on_remove(mob/living/carbon/human/H)
. = ..()
+ deftswitch.Remove(H)
+ repulsepunch.Remove(H)
REMOVE_TRAIT(H, TRAIT_NOGUNS, RISING_BASS_TRAIT)
REMOVE_TRAIT(H, TRAIT_AUTO_CATCH_ITEM, RISING_BASS_TRAIT)
\ No newline at end of file
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 960e1cc513..83117bad64 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -767,6 +767,8 @@
log_whisper(log_text)
if(LOG_EMOTE)
log_emote(log_text)
+ if(LOG_SUBTLER)
+ log_subtler(log_text)
if(LOG_DSAY)
log_dsay(log_text)
if(LOG_PDA)
@@ -869,4 +871,4 @@ Proc for attack log creation, because really why not
return TRUE
/atom/proc/intercept_zImpact(atom/movable/AM, levels = 1)
- . |= SEND_SIGNAL(src, COMSIG_ATOM_INTERCEPT_Z_FALL, AM, levels)
\ No newline at end of file
+ . |= SEND_SIGNAL(src, COMSIG_ATOM_INTERCEPT_Z_FALL, AM, levels)
diff --git a/code/game/gamemodes/clown_ops/clown_weapons.dm b/code/game/gamemodes/clown_ops/clown_weapons.dm
index af57372129..b054ff89af 100644
--- a/code/game/gamemodes/clown_ops/clown_weapons.dm
+++ b/code/game/gamemodes/clown_ops/clown_weapons.dm
@@ -67,24 +67,26 @@
heat = 0
light_color = "#ffff00"
var/next_trombone_allowed = 0
+ var/datum/component/slippery/slipper
/obj/item/melee/transforming/energy/sword/bananium/Initialize()
. = ..()
- AddComponent(/datum/component/slippery, 81, GALOSHES_DONT_HELP)
- var/datum/component/slippery/slipper = GetComponent(/datum/component/slippery)
+ slipper = LoadComponent(/datum/component/slippery, 81, GALOSHES_DONT_HELP)
slipper.signal_enabled = active
/obj/item/melee/transforming/energy/sword/bananium/attack(mob/living/M, mob/living/user)
..()
if(active)
- var/datum/component/slippery/slipper = GetComponent(/datum/component/slippery)
- slipper.Slip(src, M, FLYING_DOESNT_HELP|SLIP_WHEN_CRAWLING)
+ slipper.lube_flags |= FLYING_DOESNT_HELP|SLIP_WHEN_CRAWLING
+ slipper.Slip(src, M)
+ slipper.lube_flags &= ~(FLYING_DOESNT_HELP|SLIP_WHEN_CRAWLING)
/obj/item/melee/transforming/energy/sword/bananium/throw_impact(atom/hit_atom, throwingdatum)
. = ..()
if(active)
- var/datum/component/slippery/slipper = GetComponent(/datum/component/slippery)
- slipper.Slip(src, hit_atom, FLYING_DOESNT_HELP|SLIP_WHEN_CRAWLING)
+ slipper.lube_flags |= FLYING_DOESNT_HELP|SLIP_WHEN_CRAWLING
+ slipper.Slip(src, hit_atom)
+ slipper.lube_flags &= ~(FLYING_DOESNT_HELP|SLIP_WHEN_CRAWLING)
/obj/item/melee/transforming/energy/sword/bananium/attackby(obj/item/I, mob/living/user, params)
if((world.time > next_trombone_allowed) && istype(I, /obj/item/melee/transforming/energy/sword/bananium))
@@ -96,7 +98,6 @@
/obj/item/melee/transforming/energy/sword/bananium/transform_weapon(mob/living/user, supress_message_text)
..()
- var/datum/component/slippery/slipper = GetComponent(/datum/component/slippery)
slipper.signal_enabled = active
/obj/item/melee/transforming/energy/sword/bananium/ignition_effect(atom/A, mob/user)
@@ -106,8 +107,9 @@
if(!active)
transform_weapon(user, TRUE)
user.visible_message("[user] is [pick("slitting [user.p_their()] stomach open with", "falling on")] [src]! It looks like [user.p_theyre()] trying to commit seppuku, but the blade slips off of [user.p_them()] harmlessly!")
- var/datum/component/slippery/slipper = GetComponent(/datum/component/slippery)
- slipper.Slip(src, user, FLYING_DOESNT_HELP|SLIP_WHEN_CRAWLING)
+ slipper.lube_flags |= FLYING_DOESNT_HELP|SLIP_WHEN_CRAWLING
+ slipper.Slip(src, user)
+ slipper.lube_flags &= ~(FLYING_DOESNT_HELP|SLIP_WHEN_CRAWLING)
return SHAME
//BANANIUM SHIELD
@@ -124,16 +126,15 @@
on_force = 0
on_throwforce = 0
on_throw_speed = 1
+ var/datum/component/slippery/slipper
/obj/item/shield/energy/bananium/Initialize()
. = ..()
- AddComponent(/datum/component/slippery, 81, GALOSHES_DONT_HELP)
- var/datum/component/slippery/slipper = GetComponent(/datum/component/slippery)
+ slipper = LoadComponent(/datum/component/slippery, 81, GALOSHES_DONT_HELP)
slipper.signal_enabled = active
/obj/item/shield/energy/bananium/attack_self(mob/living/carbon/human/user)
..()
- var/datum/component/slippery/slipper = GetComponent(/datum/component/slippery)
slipper.signal_enabled = active
/obj/item/shield/energy/bananium/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback)
@@ -147,8 +148,9 @@
if(active)
var/caught = hit_atom.hitby(src, FALSE, FALSE, throwingdatum=throwingdatum)
if(iscarbon(hit_atom) && !caught)//if they are a carbon and they didn't catch it
- var/datum/component/slippery/slipper = GetComponent(/datum/component/slippery)
- slipper.Slip(src, hit_atom, FLYING_DOESNT_HELP|SLIP_WHEN_CRAWLING)
+ slipper.lube_flags |= FLYING_DOESNT_HELP|SLIP_WHEN_CRAWLING
+ slipper.Slip(src, hit_atom)
+ slipper.lube_flags &= ~(FLYING_DOESNT_HELP|SLIP_WHEN_CRAWLING)
if(thrownby && !caught)
throw_at(thrownby, throw_range+2, throw_speed, null, 1)
else
@@ -201,13 +203,18 @@
clumsy_check = GRENADE_NONCLUMSY_FUMBLE
/obj/item/grenade/chem_grenade/teargas/moustache/prime()
- var/myloc = get_turf(src)
+ var/list/check_later = list()
+ for(var/mob/living/carbon/C in get_turf(src))
+ check_later += C
. = ..()
- for(var/mob/living/carbon/M in view(6, myloc))
- if(!istype(M.wear_mask, /obj/item/clothing/mask/gas/clown_hat) && !istype(M.wear_mask, /obj/item/clothing/mask/gas/mime) )
- if(!M.wear_mask || M.dropItemToGround(M.wear_mask))
+ if(!.) //grenade did not properly prime.
+ return
+ for(var/M in check_later)
+ var/mob/living/carbon/C = M
+ if(!istype(C.wear_mask, /obj/item/clothing/mask/gas/clown_hat) && !istype(C.wear_mask, /obj/item/clothing/mask/gas/mime))
+ if(!C.wear_mask || C.dropItemToGround(C.wear_mask))
var/obj/item/clothing/mask/fakemoustache/sticky/the_stash = new /obj/item/clothing/mask/fakemoustache/sticky()
- M.equip_to_slot_or_del(the_stash, SLOT_WEAR_MASK, TRUE, TRUE, TRUE, TRUE)
+ C.equip_to_slot_or_del(the_stash, SLOT_WEAR_MASK, TRUE, TRUE, TRUE, TRUE)
/obj/item/clothing/mask/fakemoustache/sticky
var/unstick_time = 2 MINUTES
@@ -215,10 +222,16 @@
/obj/item/clothing/mask/fakemoustache/sticky/Initialize()
. = ..()
ADD_TRAIT(src, TRAIT_NODROP, STICKY_MOUSTACHE_TRAIT)
- addtimer(CALLBACK(src, .proc/unstick), unstick_time)
+ addtimer(TRAIT_CALLBACK_REMOVE(src, TRAIT_NODROP, STICKY_MOUSTACHE_TRAIT), unstick_time)
-/obj/item/clothing/mask/fakemoustache/sticky/proc/unstick()
- ADD_TRAIT(src, TRAIT_NODROP, STICKY_MOUSTACHE_TRAIT)
+/obj/item/clothing/mask/fakemoustache/sticky/equipped(mob/user, slot)
+ . = ..()
+ if(slot == SLOT_WEAR_MASK)
+ ADD_TRAIT(user, TRAIT_NO_INTERNALS, STICKY_MOUSTACHE_TRAIT)
+
+/obj/item/clothing/mask/fakemoustache/sticky/dropped(mob/user)
+ . = ..()
+ REMOVE_TRAIT(user, TRAIT_NO_INTERNALS, STICKY_MOUSTACHE_TRAIT)
//DARK H.O.N.K. AND CLOWN MECH WEAPONS
diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm
index afb882598e..62304112b2 100644
--- a/code/game/machinery/cloning.dm
+++ b/code/game/machinery/cloning.dm
@@ -61,7 +61,7 @@
QDEL_LIST(unattached_flesh)
. = ..()
-/obj/machinery/clonepod/RefreshParts()
+/obj/machinery/clonepod/RefreshParts()
speed_coeff = 0
efficiency = 0
for(var/obj/item/stock_parts/scanning_module/S in component_parts)
@@ -471,7 +471,7 @@
if(!istype(organ) || (organ.organ_flags & ORGAN_VITAL))
continue
organ.organ_flags |= ORGAN_FROZEN
- organ.Remove(H, special=TRUE)
+ organ.Remove(TRUE)
organ.forceMove(src)
unattached_flesh += organ
diff --git a/code/game/machinery/computer/dna_console.dm b/code/game/machinery/computer/dna_console.dm
index 9cf988884f..a31f6c71c8 100644
--- a/code/game/machinery/computer/dna_console.dm
+++ b/code/game/machinery/computer/dna_console.dm
@@ -294,10 +294,12 @@
if(viable_occupant)
temp_html += "
"
diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm
index f777c893f8..29921c4584 100755
--- a/code/game/machinery/recharger.dm
+++ b/code/game/machinery/recharger.dm
@@ -16,8 +16,7 @@
/obj/item/melee/baton,
/obj/item/ammo_box/magazine/recharge,
/obj/item/modular_computer,
- /obj/item/gun/ballistic/automatic/magrifle_e,
- /obj/item/gun/ballistic/automatic/pistol/mag_e))
+ /obj/item/gun/ballistic/automatic/magrifle))
/obj/machinery/recharger/RefreshParts()
for(var/obj/item/stock_parts/capacitor/C in component_parts)
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index aa4e45dee6..cdd0cf3966 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -400,12 +400,14 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
return usr.client.Click(src, src_location, src_control, params)
var/list/directaccess = usr.DirectAccess() //This, specifically, is what requires the copypaste. If this were after the adjacency check, then it'd be impossible to use items in your inventory, among other things.
//If this were before the above checks, then trying to click on items would act a little funky and signal overrides wouldn't work.
- if((usr.CanReach(src) || (src in directaccess)) && (usr.CanReach(over) || (over in directaccess)))
- if(!usr.get_active_held_item())
- usr.UnarmedAttack(src, TRUE)
- if(usr.get_active_held_item() == src)
- melee_attack_chain(usr, over)
- return TRUE //returning TRUE as a "is this overridden?" flag
+ if(iscarbon(usr))
+ var/mob/living/carbon/C = usr
+ if(C.combatmode && ((C.CanReach(src) || (src in directaccess)) && (C.CanReach(over) || (over in directaccess))))
+ if(!C.get_active_held_item())
+ C.UnarmedAttack(src, TRUE)
+ if(C.get_active_held_item() == src)
+ melee_attack_chain(C, over)
+ return TRUE //returning TRUE as a "is this overridden?" flag
if(!Adjacent(usr) || !over.Adjacent(usr))
return // should stop you from dragging through windows
diff --git a/code/game/objects/items/airlock_painter.dm b/code/game/objects/items/airlock_painter.dm
index 75a2ad3b74..e63474dd6f 100644
--- a/code/game/objects/items/airlock_painter.dm
+++ b/code/game/objects/items/airlock_painter.dm
@@ -64,7 +64,7 @@
if(!L)
return OXYLOSS
- L.Remove(user)
+ L.Remove()
// make some colorful reagent, and apply it to the lungs
L.create_reagents(10)
diff --git a/code/game/objects/items/body_egg.dm b/code/game/objects/items/body_egg.dm
index 59a5c50bf6..a311644b04 100644
--- a/code/game/objects/items/body_egg.dm
+++ b/code/game/objects/items/body_egg.dm
@@ -20,12 +20,12 @@
owner.med_hud_set_status()
INVOKE_ASYNC(src, .proc/AddInfectionImages, owner)
-/obj/item/organ/body_egg/Remove(var/mob/living/carbon/M, special = 0)
- if(owner)
+/obj/item/organ/body_egg/Remove(special = FALSE)
+ if(!QDELETED(owner))
REMOVE_TRAIT(owner, TRAIT_XENO_HOST, TRAIT_GENERIC)
owner.med_hud_set_status()
INVOKE_ASYNC(src, .proc/RemoveInfectionImages, owner)
- ..()
+ return ..()
/obj/item/organ/body_egg/on_death()
. = ..()
diff --git a/code/game/objects/items/devices/compressionkit.dm b/code/game/objects/items/devices/compressionkit.dm
index 6e62c389c7..eebe4dc69b 100644
--- a/code/game/objects/items/devices/compressionkit.dm
+++ b/code/game/objects/items/devices/compressionkit.dm
@@ -46,7 +46,7 @@
var/list/organs = M.getorganszone("head") + M.getorganszone("eyes") + M.getorganszone("mouth")
for(var/internal_organ in organs)
var/obj/item/organ/I = internal_organ
- I.Remove(M)
+ I.Remove()
I.forceMove(T)
head.drop_limb()
qdel(head)
diff --git a/code/game/objects/items/grenades/chem_grenade.dm b/code/game/objects/items/grenades/chem_grenade.dm
index cb16b558d3..afdde02e32 100644
--- a/code/game/objects/items/grenades/chem_grenade.dm
+++ b/code/game/objects/items/grenades/chem_grenade.dm
@@ -177,7 +177,7 @@
/obj/item/grenade/chem_grenade/prime()
if(stage != READY)
- return
+ return FALSE
var/list/datum/reagents/reactants = list()
for(var/obj/item/reagent_containers/glass/G in beakers)
@@ -192,7 +192,7 @@
O.forceMove(drop_location())
beakers = list()
stage_change(EMPTY)
- return
+ return FALSE
if(nadeassembly)
var/mob/M = get_mob_by_ckey(assemblyattacher)
@@ -205,6 +205,7 @@
update_mob()
qdel(src)
+ return TRUE
//Large chem grenades accept slime cores and use the appropriately.
/obj/item/grenade/chem_grenade/large
@@ -219,7 +220,7 @@
/obj/item/grenade/chem_grenade/large/prime()
if(stage != READY)
- return
+ return FALSE
for(var/obj/item/slime_extract/S in beakers)
if(S.Uses)
@@ -237,7 +238,7 @@
else
S.forceMove(get_turf(src))
no_splash = TRUE
- ..()
+ return ..()
//I tried to just put it in the allowed_containers list but
//if you do that it must have reagents. If you're going to
@@ -288,7 +289,7 @@
/obj/item/grenade/chem_grenade/adv_release/prime()
if(stage != READY)
- return
+ return FALSE
var/total_volume = 0
for(var/obj/item/reagent_containers/RC in beakers)
@@ -296,7 +297,7 @@
if(!total_volume)
qdel(src)
qdel(nadeassembly)
- return
+ return FALSE
var/fraction = unit_spread/total_volume
var/datum/reagents/reactants = new(unit_spread)
reactants.my_atom = src
@@ -313,6 +314,7 @@
else
addtimer(CALLBACK(src, .proc/prime), det_time)
log_game("A grenade detonated at [AREACOORD(DT)]")
+ return TRUE
diff --git a/code/game/objects/items/shields.dm b/code/game/objects/items/shields.dm
index c23622ad65..2e8005e631 100644
--- a/code/game/objects/items/shields.dm
+++ b/code/game/objects/items/shields.dm
@@ -1,12 +1,16 @@
/obj/item/shield
name = "shield"
+ icon = 'icons/obj/items_and_weapons.dmi'
block_chance = 50
armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 0, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 70)
+ var/transparent = FALSE // makes beam projectiles pass through the shield
+
+/obj/item/shield/proc/on_shield_block(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", damage = 0, attack_type = MELEE_ATTACK)
+ return TRUE
/obj/item/shield/riot
name = "riot shield"
desc = "A shield adept at blocking blunt objects from connecting with the torso of the shield wielder."
- icon = 'icons/obj/items_and_weapons.dmi'
icon_state = "riot"
lefthand_file = 'icons/mob/inhands/equipment/shields_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/shields_righthand.dmi'
@@ -19,6 +23,19 @@
materials = list(MAT_GLASS=7500, MAT_METAL=1000)
attack_verb = list("shoved", "bashed")
var/cooldown = 0 //shield bash cooldown. based on world.time
+ transparent = TRUE
+ max_integrity = 75
+
+/obj/item/shield/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
+ if(transparent && (hitby.pass_flags & PASSGLASS))
+ return FALSE
+ if(attack_type == THROWN_PROJECTILE_ATTACK)
+ final_block_chance += 30
+ if(attack_type == LEAP_ATTACK)
+ final_block_chance = 100
+ . = ..()
+ if(.)
+ on_shield_block(owner, hitby, attack_text, damage, attack_type)
/obj/item/shield/riot/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/melee/baton))
@@ -26,14 +43,40 @@
user.visible_message("
[user] bashes [src] with [W]!")
playsound(user.loc, 'sound/effects/shieldbash.ogg', 50, 1)
cooldown = world.time
+ else if(istype(W, /obj/item/stack/sheet/mineral/titanium))
+ if(obj_integrity >= max_integrity)
+ to_chat(user, "
[src] is already in perfect condition.")
+ else
+ var/obj/item/stack/sheet/mineral/titanium/T = W
+ T.use(1)
+ obj_integrity = max_integrity
+ to_chat(user, "
You repair [src] with [T].")
else
return ..()
-/obj/item/shield/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
- if(attack_type == THROWN_PROJECTILE_ATTACK)
- final_block_chance += 30
- if(attack_type == LEAP_ATTACK)
- final_block_chance = 100
+/obj/item/shield/riot/examine(mob/user)
+ . = ..()
+ var/healthpercent = round((obj_integrity/max_integrity) * 100, 1)
+ switch(healthpercent)
+ if(50 to 99)
+ . += "
It looks slightly damaged."
+ if(25 to 50)
+ . += "
It appears heavily damaged."
+ if(0 to 25)
+ . += "
It's falling apart!"
+
+/obj/item/shield/riot/proc/shatter(mob/living/carbon/human/owner)
+ playsound(owner, 'sound/effects/glassbr3.ogg', 100)
+ new /obj/item/shard((get_turf(src)))
+
+/obj/item/shield/riot/on_shield_block(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", damage = 0, attack_type = MELEE_ATTACK)
+ if(obj_integrity <= damage)
+ var/turf/T = get_turf(owner)
+ T.visible_message("
[hitby] destroys [src]!")
+ shatter(owner)
+ qdel(src)
+ return FALSE
+ take_damage(damage)
return ..()
/obj/item/shield/riot/roman
@@ -43,11 +86,18 @@
item_state = "roman_shield"
lefthand_file = 'icons/mob/inhands/equipment/shields_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/shields_righthand.dmi'
+ transparent = FALSE
+ max_integrity = 65
/obj/item/shield/riot/roman/fake
desc = "Bears an inscription on the inside:
\"Romanes venio domus\". It appears to be a bit flimsy."
block_chance = 0
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
+ max_integrity = 30
+
+/obj/item/shield/riot/roman/shatter(mob/living/carbon/human/owner)
+ playsound(owner, 'sound/effects/grillehit.ogg', 100)
+ new /obj/item/stack/sheet/metal(get_turf(src))
/obj/item/shield/riot/buckler
name = "wooden buckler"
@@ -59,11 +109,17 @@
materials = list()
resistance_flags = FLAMMABLE
block_chance = 30
+ transparent = FALSE
+ max_integrity = 55
+
+/obj/item/shield/riot/buckler/shatter(mob/living/carbon/human/owner)
+ playsound(owner, 'sound/effects/bang.ogg', 50)
+ new /obj/item/stack/sheet/mineral/wood(get_turf(src))
+
/obj/item/shield/energy
name = "energy combat shield"
desc = "A shield that reflects almost all energy projectiles, but is useless against physical attacks. It can be retracted, expanded, and stored anywhere."
- icon = 'icons/obj/items_and_weapons.dmi'
lefthand_file = 'icons/mob/inhands/equipment/shields_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/shields_righthand.dmi'
w_class = WEIGHT_CLASS_TINY
@@ -91,7 +147,7 @@
/obj/item/shield/energy/attack_self(mob/living/carbon/human/user)
if(clumsy_check && HAS_TRAIT(user, TRAIT_CLUMSY) && prob(50))
- to_chat(user, "
You beat yourself in the head with [src].")
+ to_chat(user, "
You beat yourself in the head with [src]!")
user.take_bodypart_damage(5)
active = !active
icon_state = "[base_icon_state][active]"
@@ -101,21 +157,20 @@
throwforce = on_throwforce
throw_speed = on_throw_speed
w_class = WEIGHT_CLASS_BULKY
- playsound(user, 'sound/weapons/saberon.ogg', 35, 1)
+ playsound(user, 'sound/weapons/saberon.ogg', 35, TRUE)
to_chat(user, "
[src] is now active.")
else
force = initial(force)
throwforce = initial(throwforce)
throw_speed = initial(throw_speed)
w_class = WEIGHT_CLASS_TINY
- playsound(user, 'sound/weapons/saberoff.ogg', 35, 1)
+ playsound(user, 'sound/weapons/saberoff.ogg', 35, TRUE)
to_chat(user, "
[src] can now be concealed.")
add_fingerprint(user)
/obj/item/shield/riot/tele
name = "telescopic shield"
desc = "An advanced riot shield made of lightweight materials that collapses for easy storage."
- icon = 'icons/obj/items_and_weapons.dmi'
icon_state = "teleriot0"
lefthand_file = 'icons/mob/inhands/equipment/shields_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/shields_righthand.dmi'
@@ -135,7 +190,7 @@
/obj/item/shield/riot/tele/attack_self(mob/living/user)
active = !active
icon_state = "teleriot[active]"
- playsound(src.loc, 'sound/weapons/batonextend.ogg', 50, 1)
+ playsound(src.loc, 'sound/weapons/batonextend.ogg', 50, TRUE)
if(active)
force = 8
diff --git a/code/game/objects/items/tanks/tanks.dm b/code/game/objects/items/tanks/tanks.dm
index 55d8c8256b..7157103f14 100644
--- a/code/game/objects/items/tanks/tanks.dm
+++ b/code/game/objects/items/tanks/tanks.dm
@@ -33,6 +33,9 @@
H.update_internals_hud_icon(0)
else
if(!H.getorganslot(ORGAN_SLOT_BREATHING_TUBE))
+ if(HAS_TRAIT(H, TRAIT_NO_INTERNALS))
+ to_chat(H, "
Due to cumbersome equipment or anatomy, you are currently unable to use internals!")
+ return
var/obj/item/clothing/check
var/internals = FALSE
diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm
index f6b2b6cd51..a6c0b22ad7 100644
--- a/code/game/objects/structures/crates_lockers/crates.dm
+++ b/code/game/objects/structures/crates_lockers/crates.dm
@@ -83,7 +83,7 @@
/obj/structure/closet/crate/coffin/examine(mob/user)
. = ..()
- if(user.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER))
+ if(user.mind?.has_antag_datum(ANTAG_DATUM_BLOODSUCKER))
. += {"
This is a coffin which you can use to regenerate your burns and other wounds faster."}
. += {"
You can also thicken your blood if you survive the day, and hide from the sun safely while inside."}
/* if(user.mind.has_antag_datum(ANTAG_DATUM_VASSAL)
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index c3ed9991d5..f23fc5c070 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -343,12 +343,12 @@ GLOBAL_PROTECT(admin_verbs_hideable)
set category = "Admin"
set name = "Aghost"
if(!holder)
- return
+ return FALSE
if(isobserver(mob))
//re-enter
var/mob/dead/observer/ghost = mob
if(!ghost.mind || !ghost.mind.current) //won't do anything if there is no body
- return
+ return FALSE
if(!ghost.can_reenter_corpse)
log_admin("[key_name(usr)] re-entered corpse")
message_admins("[key_name_admin(usr)] re-entered corpse")
@@ -357,6 +357,7 @@ GLOBAL_PROTECT(admin_verbs_hideable)
SSblackbox.record_feedback("tally", "admin_verb", 1, "Admin Reenter") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
else if(isnewplayer(mob))
to_chat(src, "
Error: Aghost: Can't admin-ghost whilst in the lobby. Join or Observe first.")
+ return FALSE
else
//ghostize
log_admin("[key_name(usr)] admin ghosted.")
@@ -366,7 +367,7 @@ GLOBAL_PROTECT(admin_verbs_hideable)
if(body && !body.key)
body.key = "@[key]" //Haaaaaaaack. But the people have spoken. If it breaks; blame adminbus
SSblackbox.record_feedback("tally", "admin_verb", 1, "Admin Ghost") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-
+ return TRUE
/client/proc/invisimin()
set name = "Invisimin"
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index 00a95cdbc7..70b25bebdd 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -1983,8 +1983,8 @@
var/atom/movable/AM = locate(href_list["adminplayerobservefollow"])
var/client/C = usr.client
- if(!isobserver(usr))
- C.admin_ghost()
+ if(!isobserver(usr) && !C.admin_ghost())
+ return
var/mob/dead/observer/A = C.mob
A.ManualFollow(AM)
@@ -2006,8 +2006,8 @@
var/z = text2num(href_list["Z"])
var/client/C = usr.client
- if(!isobserver(usr))
- C.admin_ghost()
+ if(!isobserver(usr) && !C.admin_ghost())
+ return
sleep(2)
C.jumptocoord(x,y,z)
diff --git a/code/modules/admin/verbs/manipulate_organs.dm b/code/modules/admin/verbs/manipulate_organs.dm
index a3b7e4247c..b2648735ec 100644
--- a/code/modules/admin/verbs/manipulate_organs.dm
+++ b/code/modules/admin/verbs/manipulate_organs.dm
@@ -58,7 +58,7 @@
if(isorgan(organ))
O = organ
- O.Remove(C)
+ O.Remove()
else
I = organ
I.removed(C)
diff --git a/code/modules/antagonists/abductor/equipment/abduction_surgery.dm b/code/modules/antagonists/abductor/equipment/abduction_surgery.dm
index 98164de099..971051588e 100644
--- a/code/modules/antagonists/abductor/equipment/abduction_surgery.dm
+++ b/code/modules/antagonists/abductor/equipment/abduction_surgery.dm
@@ -33,7 +33,7 @@
if(IC)
user.visible_message("[user] pulls [IC] out of [target]'s [target_zone]!", "
You pull [IC] out of [target]'s [target_zone].")
user.put_in_hands(IC)
- IC.Remove(target)
+ IC.Remove()
return 1
else
to_chat(user, "
You don't find anything in [target]'s [target_zone]!")
diff --git a/code/modules/antagonists/abductor/equipment/gland.dm b/code/modules/antagonists/abductor/equipment/gland.dm
index 82170444d0..0d30ebe992 100644
--- a/code/modules/antagonists/abductor/equipment/gland.dm
+++ b/code/modules/antagonists/abductor/equipment/gland.dm
@@ -73,13 +73,14 @@
active_mind_control = FALSE
return TRUE
-/obj/item/organ/heart/gland/Remove(mob/living/carbon/M, special = 0)
+/obj/item/organ/heart/gland/Remove(special = FALSE)
active = 0
if(initial(uses) == 1)
uses = initial(uses)
- var/datum/atom_hud/abductor/hud = GLOB.huds[DATA_HUD_ABDUCTOR]
- hud.remove_from_hud(owner)
- clear_mind_control()
+ if(!QDELETED(owner))
+ var/datum/atom_hud/abductor/hud = GLOB.huds[DATA_HUD_ABDUCTOR]
+ hud.remove_from_hud(owner)
+ clear_mind_control()
..()
/obj/item/organ/heart/gland/Insert(mob/living/carbon/M, special = 0, drop_if_replaced = TRUE)
diff --git a/code/modules/antagonists/abductor/equipment/glands/access.dm b/code/modules/antagonists/abductor/equipment/glands/access.dm
index 548650d4e3..c795233dc9 100644
--- a/code/modules/antagonists/abductor/equipment/glands/access.dm
+++ b/code/modules/antagonists/abductor/equipment/glands/access.dm
@@ -14,6 +14,7 @@
/obj/item/organ/heart/gland/access/proc/free_access(datum/source, obj/O)
return TRUE
-/obj/item/organ/heart/gland/access/Remove(mob/living/carbon/M, special = 0)
- UnregisterSignal(owner, COMSIG_MOB_ALLOWED)
- ..()
\ No newline at end of file
+/obj/item/organ/heart/gland/access/Remove(special = FALSE)
+ if(!QDELETED(owner))
+ UnregisterSignal(owner, COMSIG_MOB_ALLOWED)
+ return ..()
\ No newline at end of file
diff --git a/code/modules/antagonists/abductor/equipment/glands/electric.dm b/code/modules/antagonists/abductor/equipment/glands/electric.dm
index 63d95f8b1f..82ee77d192 100644
--- a/code/modules/antagonists/abductor/equipment/glands/electric.dm
+++ b/code/modules/antagonists/abductor/equipment/glands/electric.dm
@@ -11,9 +11,10 @@
..()
ADD_TRAIT(owner, TRAIT_SHOCKIMMUNE, "abductor_gland")
-/obj/item/organ/heart/gland/electric/Remove(mob/living/carbon/M, special = 0)
- REMOVE_TRAIT(owner, TRAIT_SHOCKIMMUNE, "abductor_gland")
- ..()
+/obj/item/organ/heart/gland/electric/Remove(special = FALSE)
+ if(!QDELETED(owner))
+ REMOVE_TRAIT(owner, TRAIT_SHOCKIMMUNE, "abductor_gland")
+ return ..()
/obj/item/organ/heart/gland/electric/activate()
owner.visible_message("
[owner]'s skin starts emitting electric arcs!",\
diff --git a/code/modules/antagonists/abductor/equipment/glands/heal.dm b/code/modules/antagonists/abductor/equipment/glands/heal.dm
index bf9a00e13c..c60ec90480 100644
--- a/code/modules/antagonists/abductor/equipment/glands/heal.dm
+++ b/code/modules/antagonists/abductor/equipment/glands/heal.dm
@@ -65,14 +65,14 @@
/obj/item/organ/heart/gland/heal/proc/reject_implant(obj/item/organ/cyberimp/implant)
owner.visible_message("
[owner] vomits up his [implant.name]!", "
You suddenly vomit up your [implant.name]!")
owner.vomit(0, TRUE, TRUE, 1, FALSE, FALSE, FALSE, TRUE)
- implant.Remove(owner)
+ implant.Remove()
implant.forceMove(owner.drop_location())
/obj/item/organ/heart/gland/heal/proc/replace_liver(obj/item/organ/liver/liver)
if(liver)
owner.visible_message("
[owner] vomits up his [liver.name]!", "
You suddenly vomit up your [liver.name]!")
owner.vomit(0, TRUE, TRUE, 1, FALSE, FALSE, FALSE, TRUE)
- liver.Remove(owner)
+ liver.Remove()
liver.forceMove(owner.drop_location())
else
to_chat(owner, "
You feel a weird rumble in your bowels...")
@@ -87,7 +87,7 @@
if(lungs)
owner.visible_message("
[owner] vomits up his [lungs.name]!", "
You suddenly vomit up your [lungs.name]!")
owner.vomit(0, TRUE, TRUE, 1, FALSE, FALSE, FALSE, TRUE)
- lungs.Remove(owner)
+ lungs.Remove()
lungs.forceMove(owner.drop_location())
else
to_chat(owner, "
You feel a weird rumble inside your chest...")
@@ -102,7 +102,7 @@
if(eyes)
owner.visible_message("
[owner]'s [eyes.name] fall out of their sockets!", "
Your [eyes.name] fall out of their sockets!")
playsound(owner, 'sound/effects/splat.ogg', 50, TRUE)
- eyes.Remove(owner)
+ eyes.Remove()
eyes.forceMove(owner.drop_location())
else
to_chat(owner, "
You feel a weird rumble behind your eye sockets...")
diff --git a/code/modules/antagonists/changeling/powers/headcrab.dm b/code/modules/antagonists/changeling/powers/headcrab.dm
index 1e06fb39de..4ef0d2f240 100644
--- a/code/modules/antagonists/changeling/powers/headcrab.dm
+++ b/code/modules/antagonists/changeling/powers/headcrab.dm
@@ -18,7 +18,7 @@
var/list/organs = user.getorganszone(BODY_ZONE_HEAD, 1)
for(var/obj/item/organ/I in organs)
- I.Remove(user, 1)
+ I.Remove(TRUE)
explosion(get_turf(user), 0, 0, 2, 0, TRUE)
for(var/mob/living/carbon/human/H in range(2,user))
diff --git a/code/modules/antagonists/changeling/powers/panacea.dm b/code/modules/antagonists/changeling/powers/panacea.dm
index 2a0451bc76..17d82ec72d 100644
--- a/code/modules/antagonists/changeling/powers/panacea.dm
+++ b/code/modules/antagonists/changeling/powers/panacea.dm
@@ -22,7 +22,7 @@
if(!istype(O))
continue
- O.Remove(user)
+ O.Remove()
if(iscarbon(user))
var/mob/living/carbon/C = user
C.vomit(0, toxic = TRUE)
diff --git a/code/modules/antagonists/clockcult/clock_items/soul_vessel.dm b/code/modules/antagonists/clockcult/clock_items/soul_vessel.dm
index d84338faea..f83afebe24 100644
--- a/code/modules/antagonists/clockcult/clock_items/soul_vessel.dm
+++ b/code/modules/antagonists/clockcult/clock_items/soul_vessel.dm
@@ -104,6 +104,6 @@
transfer_personality(H)
brainmob.fully_replace_character_name(null, "[braintype] [H.real_name]")
name = "[initial(name)] ([brainmob.name])"
- B.Remove(H)
+ B.Remove()
qdel(B)
H.update_hair()
diff --git a/code/modules/antagonists/ninja/ninja.dm b/code/modules/antagonists/ninja/ninja.dm
index 52e13bdc69..2a91f53ed4 100644
--- a/code/modules/antagonists/ninja/ninja.dm
+++ b/code/modules/antagonists/ninja/ninja.dm
@@ -52,6 +52,7 @@
if(2) //steal
var/datum/objective/steal/special/O = new /datum/objective/steal/special()
O.owner = owner
+ O.find_target()
objectives += O
if(3) //protect/kill
diff --git a/code/modules/antagonists/slaughter/slaughter.dm b/code/modules/antagonists/slaughter/slaughter.dm
index c669ff7877..c703c85762 100644
--- a/code/modules/antagonists/slaughter/slaughter.dm
+++ b/code/modules/antagonists/slaughter/slaughter.dm
@@ -100,10 +100,9 @@
if(M.mind)
M.mind.AddSpell(new /obj/effect/proc_holder/spell/bloodcrawl(null))
-/obj/item/organ/heart/demon/Remove(mob/living/carbon/M, special = 0)
- ..()
- if(M.mind)
- M.mind.RemoveSpell(/obj/effect/proc_holder/spell/bloodcrawl)
+/obj/item/organ/heart/demon/Remove(special = FALSE)
+ owner?.mind?.RemoveSpell(/obj/effect/proc_holder/spell/bloodcrawl)
+ return ..()
/obj/item/organ/heart/demon/Stop()
return 0 // Always beating.
diff --git a/code/modules/cargo/supplypod.dm b/code/modules/cargo/supplypod.dm
index 5f3d6dab0a..adfbe3308a 100644
--- a/code/modules/cargo/supplypod.dm
+++ b/code/modules/cargo/supplypod.dm
@@ -114,7 +114,7 @@
for(var/X in CM.internal_organs)
var/destination = get_edge_target_turf(T, pick(GLOB.alldirs)) //Pick a random direction to toss them in
var/obj/item/organ/O = X
- O.Remove(CM) //Note that this isn't the same proc as for lists
+ O.Remove() //Note that this isn't the same proc as for lists
O.forceMove(T) //Move the organ outta the body
O.throw_at(destination, 2, 3) //Thow the organ at a random tile 3 spots away
sleep(1)
diff --git a/code/modules/events/meteor_wave.dm b/code/modules/events/meteor_wave.dm
index d4eb6ded4c..6ecc1d9d42 100644
--- a/code/modules/events/meteor_wave.dm
+++ b/code/modules/events/meteor_wave.dm
@@ -61,6 +61,9 @@
kill()
/datum/round_event/meteor_wave/announce(fake)
+ priority_announce(generateMeteorString(startWhen,TRUE,direction), "Meteor Alert", "meteors")
+
+/proc/generateMeteorString(startWhen,syndiealert,direction)
var/directionstring
switch(direction)
if(NORTH)
@@ -71,7 +74,7 @@
directionstring = " towards starboard"
if(WEST)
directionstring = " towards port"
- priority_announce("Meteors have been detected on collision course with the station[directionstring]. Estimated time until impact: [round((startWhen * SSevents.wait) / 10, 0.1)] seconds.[GLOB.singularity_counter ? " Warning: Anomalous gravity pulse detected, Syndicate technology interference likely." : ""]", "Meteor Alert", "meteors")
+ return "Meteors have been detected on a collision course with the station[directionstring]. Estimated time until impact: [round((startWhen * SSevents.wait) / 10, 0.1)] seconds.[GLOB.singularity_counter && syndiealert ? " Warning: Anomalous gravity pulse detected, Syndicate technology interference likely." : ""]"
/datum/round_event/meteor_wave/tick()
if(ISMULTIPLE(activeFor, 3))
diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm
index 83dbad0246..150f066886 100644
--- a/code/modules/flufftext/Hallucination.dm
+++ b/code/modules/flufftext/Hallucination.dm
@@ -895,7 +895,7 @@ GLOBAL_LIST_INIT(hallucination_list, list(
SEND_SOUND(target, get_announcer_sound("aimalf"))
if("meteors") //Meteors inbound!
to_chat(target, "
Meteor Alert
")
- to_chat(target, "
Meteors have been detected on collision course with the station. Estimated time until impact: [round(rand(180,360)/60)] minutes.")
+ to_chat(target, "
[generateMeteorString(rand(60, 90),FALSE,pick(GLOB.cardinals))]")
SEND_SOUND(target, get_announcer_sound("meteors"))
if("supermatter")
SEND_SOUND(target, 'sound/magic/charge.ogg')
diff --git a/code/modules/hydroponics/seed_extractor.dm b/code/modules/hydroponics/seed_extractor.dm
index 617b980654..63b96632e6 100644
--- a/code/modules/hydroponics/seed_extractor.dm
+++ b/code/modules/hydroponics/seed_extractor.dm
@@ -59,7 +59,7 @@
/obj/machinery/seed_extractor/examine(mob/user)
. = ..()
if(in_range(user, src) || isobserver(user))
- . += "
The status display reads: Extracting [seed_multiplier] seed(s) per piece of produce.
Machine can store up to [max_seeds]% seeds."
+ . += "
The status display reads: Extracting [seed_multiplier] seed(s) per piece of produce.
Machine can store up to [max_seeds] seeds."
/obj/machinery/seed_extractor/attackby(obj/item/O, mob/user, params)
diff --git a/code/modules/mining/equipment/regenerative_core.dm b/code/modules/mining/equipment/regenerative_core.dm
index ed0fc8e9bc..e8ba72e62f 100644
--- a/code/modules/mining/equipment/regenerative_core.dm
+++ b/code/modules/mining/equipment/regenerative_core.dm
@@ -111,8 +111,8 @@
preserved(TRUE)
owner.visible_message("
[src] stabilizes as it's inserted.")
-/obj/item/organ/regenerative_core/Remove(mob/living/carbon/M, special = 0)
- if(!inert && !special)
+/obj/item/organ/regenerative_core/Remove(special = FALSE)
+ if(!inert && !special && !QDELETED(owner))
owner.visible_message("
[src] rapidly decays as it's removed.")
go_inert()
return ..()
diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm
index 15cab5fc64..a14fdb0b53 100644
--- a/code/modules/mob/living/brain/brain_item.dm
+++ b/code/modules/mob/living/brain/brain_item.dm
@@ -55,16 +55,18 @@
//Update the body's icon so it doesnt appear debrained anymore
C.update_hair()
-/obj/item/organ/brain/Remove(mob/living/carbon/C, special = 0, no_id_transfer = FALSE)
- ..()
+/obj/item/organ/brain/Remove(special = FALSE, no_id_transfer = FALSE)
+ . = ..()
+ var/mob/living/carbon/C = .
for(var/X in traumas)
var/datum/brain_trauma/BT = X
BT.on_lose(TRUE)
BT.owner = null
- if((!gc_destroyed || (owner && !owner.gc_destroyed)) && !no_id_transfer)
+ if((!QDELETED(src) || C) && !no_id_transfer)
transfer_identity(C)
- C.update_hair()
+ if(C)
+ C.update_hair()
/obj/item/organ/brain/prepare_eat()
return // Too important to eat.
diff --git a/code/modules/mob/living/carbon/alien/organs.dm b/code/modules/mob/living/carbon/alien/organs.dm
index 35751e4b86..febd0a024a 100644
--- a/code/modules/mob/living/carbon/alien/organs.dm
+++ b/code/modules/mob/living/carbon/alien/organs.dm
@@ -20,9 +20,10 @@
M.AddAbility(P)
-/obj/item/organ/alien/Remove(mob/living/carbon/M, special = 0)
- for(var/obj/effect/proc_holder/alien/P in alien_powers)
- M.RemoveAbility(P)
+/obj/item/organ/alien/Remove(special = FALSE)
+ if(owner)
+ for(var/obj/effect/proc_holder/alien/P in alien_powers)
+ owner.RemoveAbility(P)
..()
/obj/item/organ/alien/prepare_eat()
@@ -100,11 +101,11 @@
var/mob/living/carbon/alien/A = M
A.updatePlasmaDisplay()
-/obj/item/organ/alien/plasmavessel/Remove(mob/living/carbon/M, special = 0)
- ..()
- if(isalien(M))
- var/mob/living/carbon/alien/A = M
+/obj/item/organ/alien/plasmavessel/Remove(special = FALSE)
+ if(owner && isalien(owner))
+ var/mob/living/carbon/alien/A = owner
A.updatePlasmaDisplay()
+ return ..()
#define QUEEN_DEATH_DEBUFF_DURATION 2400
@@ -121,9 +122,10 @@
..()
M.faction |= ROLE_ALIEN
-/obj/item/organ/alien/hivenode/Remove(mob/living/carbon/M, special = 0)
- M.faction -= ROLE_ALIEN
- ..()
+/obj/item/organ/alien/hivenode/Remove(special = FALSE)
+ if(owner)
+ owner.faction -= ROLE_ALIEN
+ return ..()
//When the alien queen dies, all aliens suffer a penalty as punishment for failing to protect her.
/obj/item/organ/alien/hivenode/proc/queen_death()
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 6123c5b60f..113588facf 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -230,7 +230,7 @@
dat += "
Back: [back ? back : "Nothing"]"
- if(istype(wear_mask, /obj/item/clothing/mask) && istype(back, /obj/item/tank))
+ if(!HAS_TRAIT(src, TRAIT_NO_INTERNALS) && istype(wear_mask, /obj/item/clothing/mask) && istype(back, /obj/item/tank))
dat += "
[internal ? "Disable Internals" : "Set Internals"]"
if(handcuffed)
@@ -249,7 +249,7 @@
..()
//strip panel
if(usr.canUseTopic(src, BE_CLOSE, NO_DEXTERY))
- if(href_list["internal"])
+ if(href_list["internal"] && !HAS_TRAIT(src, TRAIT_NO_INTERNALS))
var/slot = text2num(href_list["internal"])
var/obj/item/ITEM = get_item_by_slot(slot)
if(ITEM && istype(ITEM, /obj/item/tank) && wear_mask && (wear_mask.clothing_flags & ALLOWINTERNALS))
@@ -533,7 +533,7 @@
break //Guess we're out of organs!
var/obj/item/organ/guts = pick(internal_organs)
var/turf/T = get_turf(src)
- guts.Remove(src)
+ guts.Remove()
guts.forceMove(T)
var/atom/throw_target = get_edge_target_turf(guts, dir)
guts.throw_at(throw_target, power, 4, src)
@@ -872,7 +872,7 @@
var/obj/item/organ/O = X
if(prob(50))
organs_amt++
- O.Remove(src)
+ O.Remove()
O.forceMove(drop_location())
if(organs_amt)
to_chat(user, "
You retrieve some of [src]\'s internal organs!")
diff --git a/code/modules/mob/living/carbon/death.dm b/code/modules/mob/living/carbon/death.dm
index 109672ab82..e0c394b2e0 100644
--- a/code/modules/mob/living/carbon/death.dm
+++ b/code/modules/mob/living/carbon/death.dm
@@ -43,7 +43,7 @@
continue
var/org_zone = check_zone(O.zone) //both groin and chest organs.
if(org_zone == BODY_ZONE_CHEST)
- O.Remove(src)
+ O.Remove()
O.forceMove(Tsec)
O.throw_at(get_edge_target_turf(src,pick(GLOB.alldirs)),rand(1,3),5)
else
@@ -55,7 +55,7 @@
if(no_organs && !istype(I, /obj/item/organ/brain))
qdel(I)
continue
- I.Remove(src)
+ I.Remove()
I.forceMove(Tsec)
I.throw_at(get_edge_target_turf(src,pick(GLOB.alldirs)),rand(1,3),5)
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index 3357cc9ffe..d85a79f943 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -189,21 +189,21 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
if(brain && (replace_current || !should_have_brain))
if(!brain.decoy_override)//Just keep it if it's fake
- brain.Remove(C,TRUE,TRUE)
+ brain.Remove(TRUE,TRUE)
QDEL_NULL(brain)
if(should_have_brain && !brain)
brain = new mutant_brain()
brain.Insert(C, TRUE, TRUE)
if(heart && (!should_have_heart || replace_current))
- heart.Remove(C,1)
+ heart.Remove(TRUE)
QDEL_NULL(heart)
if(should_have_heart && !heart)
heart = new mutant_heart()
heart.Insert(C)
if(lungs && (!should_have_lungs || replace_current))
- lungs.Remove(C,1)
+ lungs.Remove(TRUE)
QDEL_NULL(lungs)
if(should_have_lungs && !lungs)
if(mutantlungs)
@@ -213,7 +213,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
lungs.Insert(C)
if(liver && (!should_have_liver || replace_current))
- liver.Remove(C,1)
+ liver.Remove(TRUE)
QDEL_NULL(liver)
if(should_have_liver && !liver)
if(mutantliver)
@@ -223,7 +223,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
liver.Insert(C)
if(stomach && (!should_have_stomach || replace_current))
- stomach.Remove(C,1)
+ stomach.Remove(TRUE)
QDEL_NULL(stomach)
if(should_have_stomach && !stomach)
if(mutantstomach)
@@ -233,14 +233,14 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
stomach.Insert(C)
if(appendix && (!should_have_appendix || replace_current))
- appendix.Remove(C,1)
+ appendix.Remove(TRUE)
QDEL_NULL(appendix)
if(should_have_appendix && !appendix)
appendix = new()
appendix.Insert(C)
if(tail && (!should_have_tail || replace_current))
- tail.Remove(C,1)
+ tail.Remove(TRUE)
QDEL_NULL(tail)
if(should_have_tail && !tail)
tail = new mutanttail()
@@ -248,21 +248,21 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
if(C.get_bodypart(BODY_ZONE_HEAD))
if(eyes && (replace_current || !should_have_eyes))
- eyes.Remove(C,1)
+ eyes.Remove(TRUE)
QDEL_NULL(eyes)
if(should_have_eyes && !eyes)
eyes = new mutanteyes
eyes.Insert(C, TRUE)
if(ears && (replace_current || !should_have_ears))
- ears.Remove(C,1)
+ ears.Remove(TRUE)
QDEL_NULL(ears)
if(should_have_ears && !ears)
ears = new mutantears
ears.Insert(C)
if(tongue && (replace_current || !should_have_tongue))
- tongue.Remove(C,1)
+ tongue.Remove(TRUE)
QDEL_NULL(tongue)
if(should_have_tongue && !tongue)
tongue = new mutanttongue
@@ -272,7 +272,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
for(var/mutantorgan in old_species.mutant_organs)
var/obj/item/organ/I = C.getorgan(mutantorgan)
if(I)
- I.Remove(C)
+ I.Remove()
QDEL_NULL(I)
for(var/path in mutant_organs)
@@ -1601,7 +1601,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
"
\The [user] slaps \the [target]'s ass!",\
"
You slap [user == target ? "your" : "\the [target]'s"] ass!",\
"You hear a slap."
- )
+ )
return FALSE
else if(attacker_style && attacker_style.disarm_act(user,target))
return 1
diff --git a/code/modules/mob/living/carbon/human/species_types/felinid.dm b/code/modules/mob/living/carbon/human/species_types/felinid.dm
index ec58a3be9c..5801e163e5 100644
--- a/code/modules/mob/living/carbon/human/species_types/felinid.dm
+++ b/code/modules/mob/living/carbon/human/species_types/felinid.dm
@@ -88,7 +88,7 @@
if(NT)
NT.Insert(H, drop_if_replaced = FALSE)
else
- tail.Remove(H)
+ tail.Remove()
/proc/mass_purrbation()
for(var/M in GLOB.mob_list)
diff --git a/code/modules/mob/living/carbon/human/species_types/mushpeople.dm b/code/modules/mob/living/carbon/human/species_types/mushpeople.dm
index ab0962cf12..2580e3b9f0 100644
--- a/code/modules/mob/living/carbon/human/species_types/mushpeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/mushpeople.dm
@@ -31,14 +31,15 @@
/datum/species/mush/on_species_gain(mob/living/carbon/C, datum/species/old_species)
. = ..()
- if(ishuman(C))
- var/mob/living/carbon/human/H = C
- if(!H.dna.features["caps"])
- H.dna.features["caps"] = "Round"
- handle_mutant_bodyparts(H)
- H.faction |= "mushroom"
- mush = new()
- mush.teach(H, TRUE)
+ if(!ishuman(C))
+ return
+ var/mob/living/carbon/human/H = C
+ if(!H.dna.features["caps"])
+ H.dna.features["caps"] = "Round"
+ handle_mutant_bodyparts(H)
+ H.faction |= "mushroom"
+ mush = new()
+ mush.teach(H, TRUE)
RegisterSignal(C, COMSIG_MOB_ON_NEW_MIND, .proc/on_new_mind)
/datum/species/mush/proc/on_new_mind(mob/owner)
diff --git a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm
index a0291631dc..49af501942 100644
--- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm
@@ -84,10 +84,10 @@
shadowwalk = SW
-/obj/item/organ/brain/nightmare/Remove(mob/living/carbon/M, special = 0)
- if(shadowwalk)
- M.RemoveSpell(shadowwalk)
- ..()
+/obj/item/organ/brain/nightmare/Remove(special = FALSE)
+ if(shadowwalk && owner)
+ owner.RemoveSpell(shadowwalk)
+ return ..()
/obj/item/organ/heart/nightmare
@@ -120,12 +120,12 @@
blade = new/obj/item/light_eater
M.put_in_hands(blade)
-/obj/item/organ/heart/nightmare/Remove(mob/living/carbon/M, special = 0)
+/obj/item/organ/heart/nightmare/Remove(special = FALSE)
respawn_progress = 0
- if(blade && special != HEART_SPECIAL_SHADOWIFY)
- M.visible_message("
\The [blade] disintegrates!")
+ if(!QDELETED(owner) && blade && special != HEART_SPECIAL_SHADOWIFY)
+ owner.visible_message("
\The [blade] disintegrates!")
QDEL_NULL(blade)
- ..()
+ return ..()
/obj/item/organ/heart/nightmare/Stop()
return 0
@@ -146,7 +146,7 @@
owner.revive(full_heal = TRUE)
if(!(owner.dna.species.id == "shadow" || owner.dna.species.id == "nightmare"))
var/mob/living/carbon/old_owner = owner
- Remove(owner, HEART_SPECIAL_SHADOWIFY)
+ Remove(HEART_SPECIAL_SHADOWIFY)
old_owner.set_species(/datum/species/shadow)
Insert(old_owner, HEART_SPECIAL_SHADOWIFY)
to_chat(owner, "
You feel the shadows invade your skin, leaping into the center of your chest! You're alive!")
diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm
index ea9e6be78b..7d9b876876 100644
--- a/code/modules/mob/living/carbon/life.dm
+++ b/code/modules/mob/living/carbon/life.dm
@@ -334,9 +334,10 @@
var/obj/item/clothing/check
var/internals = FALSE
- for(check in GET_INTERNAL_SLOTS(src))
- if(CHECK_BITFIELD(check.clothing_flags, ALLOWINTERNALS))
- internals = TRUE
+ if(!HAS_TRAIT(src, TRAIT_NO_INTERNALS))
+ for(check in GET_INTERNAL_SLOTS(src))
+ if(CHECK_BITFIELD(check.clothing_flags, ALLOWINTERNALS))
+ internals = TRUE
if(internal)
if(internal.loc != src)
internal = null
diff --git a/code/modules/mob/living/simple_animal/hostile/cat_butcher.dm b/code/modules/mob/living/simple_animal/hostile/cat_butcher.dm
index a9e167c6e6..5181e920d7 100644
--- a/code/modules/mob/living/simple_animal/hostile/cat_butcher.dm
+++ b/code/modules/mob/living/simple_animal/hostile/cat_butcher.dm
@@ -38,7 +38,7 @@
var/obj/item/organ/tail/cat/tail = L.getorgan(/obj/item/organ/tail/cat)
if(!QDELETED(tail))
visible_message("[src] severs [L]'s tail in one swift swipe!", "
You sever [L]'s tail in one swift swipe.")
- tail.Remove(L)
+ tail.Remove()
var/obj/item/organ/tail/cat/dropped_tail = new(target.drop_location())
dropped_tail.color = L.hair_color
return 1
diff --git a/code/modules/mob/living/simple_animal/hostile/headcrab.dm b/code/modules/mob/living/simple_animal/hostile/headcrab.dm
index 80e0172f45..cc225f4bac 100644
--- a/code/modules/mob/living/simple_animal/hostile/headcrab.dm
+++ b/code/modules/mob/living/simple_animal/hostile/headcrab.dm
@@ -61,7 +61,7 @@
time++
if(time >= EGG_INCUBATION_TIME)
Pop()
- Remove(owner)
+ Remove()
qdel(src)
/obj/item/organ/body_egg/changeling_egg/proc/Pop()
diff --git a/code/modules/mob/say_vr.dm b/code/modules/mob/say_vr.dm
index 38438b97ce..74cc0c2e77 100644
--- a/code/modules/mob/say_vr.dm
+++ b/code/modules/mob/say_vr.dm
@@ -87,7 +87,7 @@ proc/get_top_level_mob(var/mob/S)
to_chat(user, "You cannot send IC messages (muted).")
return FALSE
else if(!params)
- var/subtle_emote = stripped_multiline_input("Choose an emote to display.", "Subtle", null, MAX_MESSAGE_LEN)
+ var/subtle_emote = stripped_multiline_input(user, "Choose an emote to display.", "Subtle", null, MAX_MESSAGE_LEN)
if(subtle_emote && !check_invalid(user, subtle_emote))
var/type = input("Is this a visible or hearable emote?") as null|anything in list("Visible", "Hearable")
switch(type)
@@ -109,7 +109,7 @@ proc/get_top_level_mob(var/mob/S)
if(!can_run_emote(user))
return FALSE
- user.log_message(message, INDIVIDUAL_EMOTE_LOG)
+ user.log_message(message, LOG_EMOTE)
message = "
[user] " + "
[message]"
for(var/mob/M in GLOB.dead_mob_list)
@@ -123,10 +123,7 @@ proc/get_top_level_mob(var/mob/S)
user.audible_message(message=message,hearing_distance=1)
else
user.visible_message(message=message,self_message=message,vision_distance=1)
- log_emote("[key_name(user)] : [message]")
- message = null
- emote_type = EMOTE_VISIBLE
///////////////// SUBTLE 2: NO GHOST BOOGALOO
@@ -173,16 +170,13 @@ proc/get_top_level_mob(var/mob/S)
if(!can_run_emote(user))
return FALSE
- user.log_message(message, INDIVIDUAL_EMOTE_LOG)
+ user.log_message(message, LOG_SUBTLER)
message = "
[user] " + "
[message]"
if(emote_type == EMOTE_AUDIBLE)
user.audible_message(message=message,hearing_distance=1, ignored_mobs = GLOB.dead_mob_list)
else
user.visible_message(message=message,self_message=message,vision_distance=1, ignored_mobs = GLOB.dead_mob_list)
- log_emote("[key_name(user)] : (SUBTLER) [message]")
-
- message = null
///////////////// VERB CODE
/mob/living/verb/subtle()
diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm
index ffe82ec1bd..dfbc0f483e 100644
--- a/code/modules/mob/transform_procs.dm
+++ b/code/modules/mob/transform_procs.dm
@@ -90,7 +90,7 @@
if(tr_flags & TR_KEEPORGANS)
for(var/X in O.internal_organs)
var/obj/item/organ/I = X
- I.Remove(O, 1)
+ I.Remove(TRUE)
if(mind)
mind.transfer_to(O)
@@ -103,7 +103,7 @@
for(var/X in internal_organs)
var/obj/item/organ/I = X
int_organs += I
- I.Remove(src, 1)
+ I.Remove(TRUE)
for(var/X in int_organs)
var/obj/item/organ/I = X
@@ -250,7 +250,7 @@
if(tr_flags & TR_KEEPORGANS)
for(var/X in O.internal_organs)
var/obj/item/organ/I = X
- I.Remove(O, 1)
+ I.Remove(TRUE)
if(mind)
mind.transfer_to(O)
@@ -262,7 +262,7 @@
for(var/X in internal_organs)
var/obj/item/organ/I = X
int_organs += I
- I.Remove(src, 1)
+ I.Remove(TRUE)
for(var/X in int_organs)
var/obj/item/organ/I = X
diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm
index d89eeb7e3d..120303d4d7 100644
--- a/code/modules/power/cell.dm
+++ b/code/modules/power/cell.dm
@@ -13,6 +13,7 @@
w_class = WEIGHT_CLASS_SMALL
var/charge = 0 // note %age conveted to actual charge in New
var/maxcharge = 1000
+ var/start_charged = TRUE
materials = list(MAT_METAL=700, MAT_GLASS=50)
grind_results = list(/datum/reagent/lithium = 15, /datum/reagent/iron = 5, /datum/reagent/silicon = 5)
var/rigged = FALSE // true if rigged to explode
@@ -32,7 +33,8 @@
create_reagents(5, INJECTABLE | DRAINABLE)
if (override_maxcharge)
maxcharge = override_maxcharge
- charge = maxcharge
+ if(start_charged)
+ charge = maxcharge
if(ratingdesc)
desc += " This one has a rating of [DisplayEnergy(maxcharge)], and you should not swallow it."
update_icon()
@@ -163,9 +165,8 @@
return rating * maxcharge
/* Cell variants*/
-/obj/item/stock_parts/cell/empty/Initialize()
- . = ..()
- charge = 0
+/obj/item/stock_parts/cell/empty
+ start_charged = FALSE
/obj/item/stock_parts/cell/crap
name = "\improper Nanotrasen brand rechargeable AA battery"
@@ -173,10 +174,8 @@
maxcharge = 500
materials = list(MAT_GLASS=40)
-/obj/item/stock_parts/cell/crap/empty/Initialize()
- . = ..()
- charge = 0
- update_icon()
+/obj/item/stock_parts/cell/crap/empty
+ start_charged = FALSE
/obj/item/stock_parts/cell/upgraded
name = "upgraded power cell"
@@ -195,10 +194,8 @@
maxcharge = 1250 //25/12/6 disabler/laser/taser shots.
materials = list(MAT_GLASS=40)
-/obj/item/stock_parts/cell/secborg/empty/Initialize()
- . = ..()
- charge = 0
- update_icon()
+/obj/item/stock_parts/cell/secborg/empty
+ start_charged = FALSE
/obj/item/stock_parts/cell/lascarbine
name = "laser carbine power supply"
@@ -231,10 +228,8 @@
maxcharge = 15000
chargerate = 2250
-/obj/item/stock_parts/cell/high/empty/Initialize()
- . = ..()
- charge = 0
- update_icon()
+/obj/item/stock_parts/cell/high/empty
+ start_charged = FALSE
/obj/item/stock_parts/cell/super
name = "super-capacity power cell"
@@ -243,10 +238,8 @@
materials = list(MAT_GLASS=300)
chargerate = 2000
-/obj/item/stock_parts/cell/super/empty/Initialize()
- . = ..()
- charge = 0
- update_icon()
+/obj/item/stock_parts/cell/super/empty
+ start_charged = FALSE
/obj/item/stock_parts/cell/hyper
name = "hyper-capacity power cell"
@@ -255,10 +248,8 @@
materials = list(MAT_GLASS=400)
chargerate = 3000
-/obj/item/stock_parts/cell/hyper/empty/Initialize()
- . = ..()
- charge = 0
- update_icon()
+/obj/item/stock_parts/cell/hyper/empty
+ start_charged = FALSE
/obj/item/stock_parts/cell/bluespace
name = "bluespace power cell"
@@ -268,10 +259,8 @@
materials = list(MAT_GLASS=600)
chargerate = 4000
-/obj/item/stock_parts/cell/bluespace/empty/Initialize()
- . = ..()
- charge = 0
- update_icon()
+/obj/item/stock_parts/cell/bluespace/empty
+ start_charged = FALSE
/obj/item/stock_parts/cell/infinite
name = "infinite-capacity power cell!"
@@ -321,15 +310,13 @@
maxcharge = 500
rating = 3
-/obj/item/stock_parts/cell/emproof/empty/Initialize()
- . = ..()
- charge = 0
- update_icon()
-
-/obj/item/stock_parts/cell/emproof/empty/ComponentInitialize()
+/obj/item/stock_parts/cell/emproof/ComponentInitialize()
. = ..()
AddComponent(/datum/component/empprotection, EMP_PROTECT_SELF)
+/obj/item/stock_parts/cell/emproof/empty
+ start_charged = FALSE
+
/obj/item/stock_parts/cell/emproof/corrupt()
return
@@ -364,3 +351,22 @@
//found inside the inducers ordered from cargo.
/obj/item/stock_parts/cell/inducer_supply
maxcharge = 5000
+
+/obj/item/stock_parts/cell/magnetic
+ name = "magrifle power supply"
+ maxcharge = 12000
+ chargerate = 600
+
+/obj/item/stock_parts/cell/magnetic/empty
+ start_charged = FALSE
+
+/obj/item/stock_parts/cell/magnetic/pistol
+ name = "magpistol power supply"
+ maxcharge = 6000
+
+/obj/item/stock_parts/cell/magnetic/pistol/empty
+ start_charged = FALSE
+
+/obj/item/stock_parts/cell/toymagburst
+ name = "toy mag burst rifle power supply"
+ maxcharge = 4000
diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm
index 8990ca0e3e..0b0d968919 100644
--- a/code/modules/power/supermatter/supermatter.dm
+++ b/code/modules/power/supermatter/supermatter.dm
@@ -565,7 +565,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
to_chat(C, "
That was a really dense idea.")
C.visible_message("
A bright flare of radiation is seen from [C]'s head, shortly before you hear a sickening sizzling!")
var/obj/item/organ/brain/rip_u = locate(/obj/item/organ/brain) in C.internal_organs
- rip_u.Remove(C)
+ rip_u.Remove()
qdel(rip_u)
return
return ..()
diff --git a/code/modules/power/tesla/energy_ball.dm b/code/modules/power/tesla/energy_ball.dm
index f8d25c0c9c..13f53f14d0 100644
--- a/code/modules/power/tesla/energy_ball.dm
+++ b/code/modules/power/tesla/energy_ball.dm
@@ -136,7 +136,7 @@
to_chat(C, "
That was a shockingly dumb idea.")
C.visible_message("
A bright flare of lightning is seen from [C]'s head, shortly before you hear a sickening sizzling!")
var/obj/item/organ/brain/rip_u = locate(/obj/item/organ/brain) in C.internal_organs
- rip_u.Remove(C)
+ rip_u.Remove()
qdel(rip_u)
return
return ..()
diff --git a/code/modules/projectiles/ammunition/caseless/ferromagnetic.dm b/code/modules/projectiles/ammunition/caseless/ferromagnetic.dm
new file mode 100644
index 0000000000..d984460235
--- /dev/null
+++ b/code/modules/projectiles/ammunition/caseless/ferromagnetic.dm
@@ -0,0 +1,39 @@
+/obj/item/ammo_casing/caseless/magnetic
+ desc = "A large ferromagnetic slug intended to be launched out of a compatible weapon."
+ caliber = "mag"
+ icon_state = "mag-casing-live"
+ click_cooldown_override = 2.5
+ delay = 3
+ var/energy_cost = 200
+
+/obj/item/ammo_casing/caseless/magnetic
+ projectile_type = /obj/item/projectile/bullet/magnetic
+
+/obj/item/ammo_casing/caseless/magnetic/disabler
+ desc = "A large, specialized ferromagnetic slug designed with a less-than-lethal payload."
+ projectile_type = /obj/item/projectile/bullet/magnetic/disabler
+
+/obj/item/ammo_casing/caseless/magnetic/weak
+ desc = "A ferromagnetic slug intended to be launched out of a compatible weapon."
+ projectile_type = /obj/item/projectile/bullet/magnetic/weak
+ energy_cost = 125
+
+/obj/item/ammo_casing/caseless/magnetic/weak/disabler
+ desc = "A specialized ferromagnetic slug designed with a less-than-lethal payload."
+ projectile_type = /obj/item/projectile/bullet/magnetic/weak/disabler
+ energy_cost = 125
+
+/obj/item/ammo_casing/caseless/magnetic/hyper
+ desc = "A large block of speciallized ferromagnetic material designed to be fired out of the experimental Hyper-Burst Rifle."
+ caliber = "hypermag"
+ icon_state = "hyper-casing-live"
+ projectile_type = /obj/item/projectile/bullet/magnetic/hyper
+ pellets = 8
+ variance = 30
+ energy_cost = 1500
+
+/obj/item/ammo_casing/caseless/magnetic/hyper/inferno
+ projectile_type = /obj/item/projectile/bullet/incendiary/mag_inferno
+ pellets = 1
+ variance = 0
+
diff --git a/code/modules/projectiles/ammunition/caseless/foam.dm b/code/modules/projectiles/ammunition/caseless/foam.dm
index 1040c08d87..dd29f075f1 100644
--- a/code/modules/projectiles/ammunition/caseless/foam.dm
+++ b/code/modules/projectiles/ammunition/caseless/foam.dm
@@ -63,3 +63,8 @@
projectile_type = /obj/item/projectile/bullet/reusable/foam_dart/riot
icon_state = "foamdart_riot"
materials = list(MAT_METAL = 1125)
+
+/obj/item/ammo_casing/caseless/foam_dart/mag
+ name = "magfoam dart"
+ desc = "A foam dart with fun light-up projectiles powered by magnets!"
+ projectile_type = /obj/item/projectile/bullet/reusable/foam_dart/mag
diff --git a/code/modules/projectiles/ammunition/energy/laser.dm b/code/modules/projectiles/ammunition/energy/laser.dm
index f0aa9eae1f..174645dd11 100644
--- a/code/modules/projectiles/ammunition/energy/laser.dm
+++ b/code/modules/projectiles/ammunition/energy/laser.dm
@@ -62,6 +62,14 @@
/obj/item/ammo_casing/energy/laser/redtag/hitscan/holy
projectile_type = /obj/item/projectile/beam/lasertag/redtag/hitscan/holy
+/obj/item/ammo_casing/energy/laser/magtag
+ projectile_type = /obj/item/projectile/beam/lasertag/mag
+ select_name = "magtag"
+ pellets = 3
+ variance = 30
+ e_cost = 1000
+ fire_sound = 'sound/weapons/magburst.ogg'
+
/obj/item/ammo_casing/energy/xray
projectile_type = /obj/item/projectile/beam/xray
e_cost = 50
diff --git a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm
index ba6a8e2454..2842f13db5 100644
--- a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm
+++ b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm
@@ -87,7 +87,14 @@
max_ammo = 40
materials = list(MAT_METAL = 500)
+/obj/item/ammo_box/foambox/mag
+ name = "ammo box (Magnetic Foam Darts)"
+ icon = 'icons/obj/guns/toy.dmi'
+ icon_state = "foambox"
+ ammo_type = /obj/item/ammo_casing/caseless/foam_dart/mag
+ max_ammo = 42
+
/obj/item/ammo_box/foambox/riot
icon_state = "foambox_riot"
ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
- materials = list(MAT_METAL = 50000)
\ No newline at end of file
+ materials = list(MAT_METAL = 50000)
diff --git a/code/modules/projectiles/boxes_magazines/external/magweapon.dm b/code/modules/projectiles/boxes_magazines/external/magweapon.dm
new file mode 100644
index 0000000000..fa90170ace
--- /dev/null
+++ b/code/modules/projectiles/boxes_magazines/external/magweapon.dm
@@ -0,0 +1,34 @@
+/obj/item/ammo_box/magazine/mmag
+ icon_state = "mediummagmag"
+ ammo_type = /obj/item/ammo_casing/caseless/magnetic/disabler
+ caliber = "mag"
+ max_ammo = 24
+ multiple_sprites = 2
+
+/obj/item/ammo_box/magazine/mmag/lethal
+ name = "magrifle magazine (lethal)"
+ ammo_type = /obj/item/ammo_casing/caseless/magnetic
+
+/obj/item/ammo_box/magazine/mmag/small
+ name = "magpistol magazine (non-lethal disabler)"
+ icon_state = "smallmagmag"
+ ammo_type = /obj/item/ammo_casing/caseless/magnetic/weak/disabler
+ max_ammo = 15
+
+/obj/item/ammo_box/magazine/mmag/small/lethal
+ name = "magpistol magazine (lethal)"
+ ammo_type = /obj/item/ammo_casing/caseless/magnetic/weak
+
+/obj/item/ammo_box/magazine/mhyper
+ name = "hyper-burst rifle magazine"
+ icon_state = "hypermag"
+ ammo_type = /obj/item/ammo_casing/caseless/magnetic/hyper
+ caliber = "hypermag"
+ desc = "A magazine for the Hyper-Burst Rifle. Loaded with a special slug that fragments into 6 smaller shards which can absolutely puncture anything, but has rather short effective range."
+ max_ammo = 4
+ multiple_sprites = 4
+
+/obj/item/ammo_box/magazine/mhyper/inferno
+ name = "hyper-burst rifle magazine (inferno)"
+ ammo_type = /obj/item/ammo_casing/caseless/magnetic/hyper/inferno
+ desc = "A magazine for the Hyper-Burst Rifle. Loaded with a special slug that violently reacts with whatever surface it strikes, generating massive amount of heat and light."
diff --git a/code/modules/projectiles/boxes_magazines/external/toy.dm b/code/modules/projectiles/boxes_magazines/external/toy.dm
index b9e1ec9615..04bcad284d 100644
--- a/code/modules/projectiles/boxes_magazines/external/toy.dm
+++ b/code/modules/projectiles/boxes_magazines/external/toy.dm
@@ -57,3 +57,11 @@
/obj/item/ammo_box/magazine/toy/m762/riot
icon_state = "a762-riot"
ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
+
+/obj/item/ammo_box/magazine/toy/foamag
+ name = "foam force magrifle magazine"
+ icon_state = "foamagmag"
+ max_ammo = 24
+ multiple_sprites = 2
+ ammo_type = /obj/item/ammo_casing/caseless/foam_dart/mag
+ materials = list(MAT_METAL = 200)
diff --git a/code/modules/projectiles/boxes_magazines/internal/toy.dm b/code/modules/projectiles/boxes_magazines/internal/toy.dm
index 7a520c6a1f..6de018c6af 100644
--- a/code/modules/projectiles/boxes_magazines/internal/toy.dm
+++ b/code/modules/projectiles/boxes_magazines/internal/toy.dm
@@ -5,3 +5,7 @@
/obj/item/ammo_box/magazine/internal/shot/toy/crossbow
max_ammo = 5
+
+/obj/item/ammo_box/magazine/internal/shot/toy/mag
+ ammo_type = /obj/item/ammo_casing/caseless/foam_dart/mag
+ max_ammo = 14
diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm
index fd40f437ca..9ea50562dd 100644
--- a/code/modules/projectiles/guns/ballistic.dm
+++ b/code/modules/projectiles/guns/ballistic.dm
@@ -163,7 +163,7 @@
user.visible_message("
[user] blows [user.p_their()] brain[user.p_s()] out with [src]!")
playsound(src, 'sound/weapons/dink.ogg', 30, 1)
var/turf/target = get_ranged_target_turf(user, turn(user.dir, 180), BRAINS_BLOWN_THROW_RANGE)
- B.Remove(user)
+ B.Remove()
B.forceMove(T)
if(iscarbon(user))
var/mob/living/carbon/C = user
diff --git a/code/modules/projectiles/guns/ballistic/magweapon.dm b/code/modules/projectiles/guns/ballistic/magweapon.dm
new file mode 100644
index 0000000000..f366063a74
--- /dev/null
+++ b/code/modules/projectiles/guns/ballistic/magweapon.dm
@@ -0,0 +1,103 @@
+/obj/item/gun/ballistic/automatic/magrifle
+ name = "\improper Magnetic Rifle"
+ desc = "A simple upscalling of the technologies used in the magpistol, the magrifle is capable of firing slightly larger slugs in bursts. Compatible with the magpistol's slugs."
+ icon_state = "magrifle"
+ item_state = "arg"
+ force = 10
+ slot_flags = NONE
+ mag_type = /obj/item/ammo_box/magazine/mmag
+ fire_sound = 'sound/weapons/magrifle.ogg'
+ can_suppress = FALSE
+ burst_size = 1
+ actions_types = null
+ fire_delay = 3
+ spread = 0
+ recoil = 0.1
+ casing_ejector = FALSE
+ inaccuracy_modifier = 0.5
+ dualwield_spread_mult = 1.4
+ weapon_weight = WEAPON_MEDIUM
+ var/obj/item/stock_parts/cell/cell
+ var/cell_type = /obj/item/stock_parts/cell/magnetic
+
+/obj/item/gun/ballistic/automatic/magrifle/Initialize()
+ . = ..()
+ if(cell_type)
+ cell = new cell_type(src)
+ else
+ cell = new(src)
+
+/obj/item/gun/ballistic/automatic/magrifle/examine(mob/user)
+ . = ..()
+ if(cell)
+ . += "
[src]'s cell is [round(cell.charge / cell.maxcharge, 0.1) * 100]% full."
+ else
+ . += "
[src] doesn't seem to have a cell!"
+
+/obj/item/gun/ballistic/automatic/magrifle/can_shoot()
+ if(QDELETED(cell))
+ return 0
+
+ var/obj/item/ammo_casing/caseless/magnetic/shot = chambered
+ if(!shot)
+ return 0
+ if(cell.charge < shot.energy_cost * burst_size)
+ return 0
+ . = ..()
+
+/obj/item/gun/ballistic/automatic/magrifle/shoot_live_shot()
+ var/obj/item/ammo_casing/caseless/magnetic/shot = chambered
+ cell.use(shot.energy_cost)
+ . = ..()
+
+/obj/item/gun/ballistic/automatic/magrifle/emp_act(severity)
+ . = ..()
+ if(!(. & EMP_PROTECT_CONTENTS))
+ cell.use(round(cell.charge / severity))
+
+/obj/item/gun/ballistic/automatic/magrifle/get_cell()
+ return cell
+
+/obj/item/gun/ballistic/automatic/magrifle/nopin
+ pin = null
+ spawnwithmagazine = FALSE
+ cell_type = /obj/item/stock_parts/cell/magnetic/empty
+
+/obj/item/gun/ballistic/automatic/magrifle/hyperburst
+ name = "\improper Hyper-Burst Rifle"
+ desc = "An extremely beefed up version of a stolen Nanotrasen weapon prototype, this 'rifle' is more like a cannon, with an extremely large bore barrel capable of generating several smaller magnetic 'barrels' to simultaneously launch multiple projectiles at once."
+ icon_state = "hyperburst"
+ item_state = "arg"
+ mag_type = /obj/item/ammo_box/magazine/mhyper
+ fire_sound = 'sound/weapons/magburst.ogg'
+ fire_delay = 40
+ recoil = 2
+ weapon_weight = WEAPON_HEAVY
+
+/obj/item/gun/ballistic/automatic/magrifle/hyperburst/update_icon()
+ ..()
+ icon_state = "hyperburst[magazine ? "-[get_ammo()]" : ""][chambered ? "" : "-e"]"
+
+///magpistol///
+
+/obj/item/gun/ballistic/automatic/magrifle/pistol
+ name = "magpistol"
+ desc = "A handgun utilizing maglev technologies to propel a ferromagnetic slug to extreme velocities."
+ icon_state = "magpistol"
+ fire_sound = 'sound/weapons/magpistol.ogg'
+ mag_type = /obj/item/ammo_box/magazine/mmag/small
+ fire_delay = 2
+ inaccuracy_modifier = 0.25
+ cell_type = /obj/item/stock_parts/cell/magnetic/pistol
+
+/obj/item/gun/ballistic/automatic/magrifle/pistol/update_icon()
+ ..()
+ cut_overlays()
+ if(magazine)
+ add_overlay("magpistol-magazine")
+ icon_state = "[initial(icon_state)][chambered ? "" : "-e"]"
+
+/obj/item/gun/ballistic/automatic/magrifle/pistol/nopin
+ pin = null
+ spawnwithmagazine = FALSE
+ cell_type = /obj/item/stock_parts/cell/magnetic/pistol/empty
diff --git a/code/modules/projectiles/guns/ballistic/toy.dm b/code/modules/projectiles/guns/ballistic/toy.dm
index 8b358832b0..4060a02c0f 100644
--- a/code/modules/projectiles/guns/ballistic/toy.dm
+++ b/code/modules/projectiles/guns/ballistic/toy.dm
@@ -109,3 +109,36 @@
/obj/item/gun/ballistic/automatic/l6_saw/toy/unrestricted/riot
mag_type = /obj/item/ammo_box/magazine/toy/m762/riot
+
+/obj/item/gun/ballistic/automatic/toy/magrifle
+ name = "foamag rifle"
+ desc = "A foam launching magnetic rifle. Ages 8 and up."
+ icon_state = "foamagrifle"
+ obj_flags = NONE
+ mag_type = /obj/item/ammo_box/magazine/toy/foamag
+ fire_sound = 'sound/weapons/magrifle.ogg'
+ burst_size = 1
+ actions_types = null
+ fire_delay = 3
+ spread = 60
+ recoil = 0.1
+ can_suppress = FALSE
+ inaccuracy_modifier = 0.5
+ weapon_weight = WEAPON_MEDIUM
+ dualwield_spread_mult = 1.4
+ w_class = WEIGHT_CLASS_BULKY
+
+/obj/item/gun/ballistic/shotgun/toy/mag
+ name = "foam force magpistol"
+ desc = "A fancy toy sold alongside light-up foam force darts. Ages 8 and up."
+ icon_state = "toymag"
+ item_state = "gun"
+ mag_type = /obj/item/ammo_box/magazine/internal/shot/toy/mag
+ fire_sound = 'sound/weapons/magpistol.ogg'
+ fire_delay = 2
+ recoil = 0.1
+ inaccuracy_modifier = 0.25
+ dualwield_spread_mult = 1.4
+ slot_flags = SLOT_BELT
+ w_class = WEIGHT_CLASS_NORMAL
+ weapon_weight = WEAPON_MEDIUM
diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm
index 1e1af62d5a..32f3416faf 100644
--- a/code/modules/projectiles/guns/energy/laser.dm
+++ b/code/modules/projectiles/guns/energy/laser.dm
@@ -16,6 +16,19 @@
clumsy_check = 0
item_flags = NONE
+/obj/item/gun/energy/laser/practice/hyperburst
+ name = "toy hyper-burst launcher"
+ desc = "A toy laser with a unique beam shaping lens that projects harmless bolts capable of going through objects. Compatible with existing laser tag systems."
+ ammo_type = list(/obj/item/ammo_casing/energy/laser/magtag)
+ icon_state = "toyburst"
+ obj_flags = NONE
+ fire_delay = 40
+ weapon_weight = WEAPON_HEAVY
+ selfcharge = EGUN_SELFCHARGE
+ charge_delay = 2
+ recoil = 2
+ cell_type = /obj/item/stock_parts/cell/toymagburst
+
/obj/item/gun/energy/laser/retro
name ="retro laser gun"
icon_state = "retro"
diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm
index d71e081dac..389bf84904 100644
--- a/code/modules/projectiles/projectile/beams.dm
+++ b/code/modules/projectiles/projectile/beams.dm
@@ -146,6 +146,15 @@
if(M.wear_suit.type in suit_types)
M.adjustStaminaLoss(34)
+/obj/item/projectile/beam/lasertag/mag //the projectile, compatible with regular laser tag armor
+ icon_state = "magjectile-toy"
+ name = "lasertag magbolt"
+ movement_type = FLYING | UNSTOPPABLE //for penetration memes
+ range = 5 //so it isn't super annoying
+ light_range = 2
+ light_color = LIGHT_COLOR_YELLOW
+ eyeblur = 0
+
/obj/item/projectile/beam/lasertag/redtag
icon_state = "laser"
suit_types = list(/obj/item/clothing/suit/bluetag)
diff --git a/code/modules/projectiles/projectile/bullets/ferromagnetic.dm b/code/modules/projectiles/projectile/bullets/ferromagnetic.dm
new file mode 100644
index 0000000000..2d66e25256
--- /dev/null
+++ b/code/modules/projectiles/projectile/bullets/ferromagnetic.dm
@@ -0,0 +1,49 @@
+/obj/item/projectile/bullet/magnetic
+ icon_state = "magjectile"
+ damage = 20
+ armour_penetration = 20
+ light_range = 3
+ speed = 0.6
+ range = 35
+ light_color = LIGHT_COLOR_RED
+
+/obj/item/projectile/bullet/magnetic/disabler
+ icon_state = "magjectile-nl" //nl stands for non-lethal
+ damage = 2
+ armour_penetration = 10
+ stamina = 20
+ light_color = LIGHT_COLOR_BLUE
+
+/obj/item/projectile/bullet/magnetic/weak
+ damage = 15
+ armour_penetration = 10
+ light_range = 2
+ range = 25
+
+/obj/item/projectile/bullet/magnetic/weak/disabler
+ damage = 2
+ stamina = 20
+
+/obj/item/projectile/bullet/magnetic/hyper
+ damage = 10
+ armour_penetration = 20
+ stamina = 10
+ movement_type = FLYING | UNSTOPPABLE
+ range = 6
+ light_range = 1
+ light_color = LIGHT_COLOR_RED
+
+/obj/item/projectile/bullet/incendiary/mag_inferno
+ icon_state = "magjectile-large"
+ damage = 10
+ armour_penetration = 20
+ movement_type = FLYING | UNSTOPPABLE
+ range = 20
+ speed = 0.8
+ light_range = 4
+ light_color = LIGHT_COLOR_RED
+
+/obj/item/projectile/bullet/incendiary/mag_inferno/on_hit(atom/target, blocked = FALSE)
+ ..()
+ explosion(target, -1, 0, 0, 1, 2, flame_range = 2)
+ return BULLET_ACT_HIT
diff --git a/code/modules/projectiles/projectile/reusable/foam_dart.dm b/code/modules/projectiles/projectile/reusable/foam_dart.dm
index 42f6218b6c..7d21f663c2 100644
--- a/code/modules/projectiles/projectile/reusable/foam_dart.dm
+++ b/code/modules/projectiles/projectile/reusable/foam_dart.dm
@@ -39,3 +39,10 @@
icon_state = "foamdart_riot_proj"
ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
stamina = 25
+
+/obj/item/projectile/bullet/reusable/foam_dart/mag
+ name = "magfoam dart"
+ icon_state = "magjectile-toy"
+ ammo_type = /obj/item/ammo_casing/caseless/foam_dart/mag
+ light_range = 2
+ light_color = LIGHT_COLOR_YELLOW
diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
index 103f7cb28f..810124b2ba 100644
--- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
@@ -197,7 +197,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
var/obj/item/organ/eyes/eyes = M.getorganslot(ORGAN_SLOT_EYES)
if(HAS_TRAIT(M, TRAIT_BLIND))
if(eyes)
- eyes.Remove(M)
+ eyes.Remove()
eyes.forceMove(get_turf(M))
to_chat(M, "
You double over in pain as you feel your eyeballs liquify in your head!")
M.emote("scream")
diff --git a/code/modules/reagents/reagent_containers/dropper.dm b/code/modules/reagents/reagent_containers/dropper.dm
index cbfe5173dd..9feec362a4 100644
--- a/code/modules/reagents/reagent_containers/dropper.dm
+++ b/code/modules/reagents/reagent_containers/dropper.dm
@@ -64,12 +64,7 @@
reagents.reaction(target, TOUCH, fraction)
var/mob/M = target
- var/R
- if(reagents)
- for(var/datum/reagent/A in src.reagents.reagent_list)
- R += A.type + " ("
- R += num2text(A.volume) + "),"
- log_combat(user, M, "squirted", R)
+ log_combat(user, M, "squirted", reagents.log_list())
trans = src.reagents.trans_to(target, amount_per_transfer_from_this)
to_chat(user, "
You transfer [trans] unit\s of the solution.")
diff --git a/code/modules/research/designs/autoylathe_designs.dm b/code/modules/research/designs/autoylathe_designs.dm
index 1773286e6b..d54dce9e8a 100644
--- a/code/modules/research/designs/autoylathe_designs.dm
+++ b/code/modules/research/designs/autoylathe_designs.dm
@@ -584,7 +584,7 @@
id = "foam_magrifle"
build_type = AUTOYLATHE
materials = list(MAT_PLASTIC = 4000, MAT_METAL = 500)
- build_path = /obj/item/gun/ballistic/automatic/magrifle/toy
+ build_path = /obj/item/gun/ballistic/automatic/toy/magrifle
category = list("initial", "Rifles")
/datum/design/foam_hyperburst
diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm
index e6f4670f87..1d65edbe9a 100644
--- a/code/modules/research/designs/weapon_designs.dm
+++ b/code/modules/research/designs/weapon_designs.dm
@@ -47,6 +47,44 @@
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+//////////////////
+//Mag-Rifle Mags//
+//////////////////
+
+/datum/design/mag_magrifle
+ name = "Magrifle Magazine (Lethal)"
+ desc = "A 24-round magazine for the Magrifle."
+ id = "mag_magrifle"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 8000, MAT_SILVER = 1000)
+ build_path = /obj/item/ammo_box/magazine/mmag/lethal
+ category = list("Ammo")
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+
+/datum/design/mag_magrifle/nl
+ name = "Magrifle Magazine (Non-Lethal)"
+ desc = "A 24- round non-lethal magazine for the Magrifle."
+ id = "mag_magrifle_nl"
+ materials = list(MAT_METAL = 6000, MAT_SILVER = 500, MAT_TITANIUM = 500)
+ build_path = /obj/item/ammo_box/magazine/mmag
+
+/datum/design/mag_magpistol
+ name = "Magpistol Magazine"
+ desc = "A 14 round magazine for the Magpistol."
+ id = "mag_magpistol"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 4000, MAT_SILVER = 500)
+ build_path = /obj/item/ammo_box/magazine/mmag/small/lethal
+ category = list("Ammo")
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+
+/datum/design/mag_magpistol/nl
+ name = "Magpistol Magazine (Non-Lethal)"
+ desc = "A 14 round non-lethal magazine for the Magpistol."
+ id = "mag_magpistol_nl"
+ materials = list(MAT_METAL = 3000, MAT_SILVER = 250, MAT_TITANIUM = 250)
+ build_path = /obj/item/ammo_box/magazine/mmag/small
+
//////////////
//WT550 Mags//
//////////////
@@ -323,6 +361,26 @@
category = list("Weapons")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+/datum/design/magpistol
+ name = "Magpistol"
+ desc = "A weapon which fires ferromagnetic slugs."
+ id = "magpistol"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 7500, MAT_GLASS = 1000, MAT_URANIUM = 1000, MAT_TITANIUM = 5000, MAT_SILVER = 2000)
+ build_path = /obj/item/gun/ballistic/automatic/magrifle/pistol/nopin
+ category = list("Weapons")
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+
+/datum/design/magrifle
+ name = "Magrifle"
+ desc = "An upscaled Magpistol in rifle form."
+ id = "magrifle"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 10000, MAT_GLASS = 2000, MAT_URANIUM = 2000, MAT_TITANIUM = 10000, MAT_SILVER = 4000, MAT_GOLD = 2000)
+ build_path = /obj/item/gun/ballistic/automatic/magrifle/nopin
+ category = list("Weapons")
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+
///////////
//Grenades/
///////////
diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm
index 9556e3853b..15e88fc811 100644
--- a/code/modules/research/techweb/all_nodes.dm
+++ b/code/modules/research/techweb/all_nodes.dm
@@ -231,6 +231,7 @@
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3000)
export_price = 5000
+/*
/datum/techweb_node/basic_meteor_defense
id = "basic_meteor_defense"
display_name = "Meteor Defense Research"
@@ -239,6 +240,7 @@
design_ids = list("meteor_defence", "meteor_console")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
export_price = 5000
+*/
//datum/techweb_node/adv_meteor_defense
//id = "adv_meteor_defense"
@@ -695,6 +697,15 @@
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
export_price = 5000
+/datum/techweb_node/magnetic_weapons
+ id = "magnetic_weapons"
+ display_name = "Magnetic Weapons"
+ description = "Weapons using magnetic technology"
+ prereq_ids = list("weaponry", "adv_weaponry", "emp_adv")
+ design_ids = list("magrifle", "magpistol", "mag_magrifle", "mag_magrifle_nl", "mag_magpistol", "mag_magpistol_nl")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+ export_price = 5000
+
/datum/techweb_node/medical_weapons
id = "medical_weapons"
display_name = "Medical Weaponry"
diff --git a/code/modules/spells/spell_types/lichdom.dm b/code/modules/spells/spell_types/lichdom.dm
index 0cbb3a8272..86597d5d2e 100644
--- a/code/modules/spells/spell_types/lichdom.dm
+++ b/code/modules/spells/spell_types/lichdom.dm
@@ -144,7 +144,7 @@
C.dropItemToGround(W)
for(var/X in C.internal_organs)
var/obj/item/organ/I = X
- I.Remove(C)
+ I.Remove()
I.forceMove(body_turf)
var/wheres_wizdo = dir2text(get_dir(body_turf, item_turf))
if(wheres_wizdo)
diff --git a/code/modules/spells/spell_types/summonitem.dm b/code/modules/spells/spell_types/summonitem.dm
index 7d9823e29b..c4b184cc9b 100644
--- a/code/modules/spells/spell_types/summonitem.dm
+++ b/code/modules/spells/spell_types/summonitem.dm
@@ -58,7 +58,7 @@
if(organ.owner)
// If this code ever runs I will be happy
log_combat(L, organ.owner, "magically removed [organ.name] from", addition="INTENT: [uppertext(L.a_intent)]")
- organ.Remove(organ.owner)
+ organ.Remove()
else
while(!isturf(item_to_retrieve.loc) && infinite_recursion < 10) //if it's in something you get the whole thing.
if(isitem(item_to_retrieve.loc))
diff --git a/code/modules/surgery/bodyparts/dismemberment.dm b/code/modules/surgery/bodyparts/dismemberment.dm
index 31fc90cb04..61811cdafc 100644
--- a/code/modules/surgery/bodyparts/dismemberment.dm
+++ b/code/modules/surgery/bodyparts/dismemberment.dm
@@ -62,7 +62,7 @@
var/org_zone = check_zone(O.zone)
if(org_zone != BODY_ZONE_CHEST)
continue
- O.Remove(C)
+ O.Remove()
O.forceMove(T)
organ_spilled = 1
. += X
@@ -141,11 +141,11 @@
//when a limb is dropped, the internal organs are removed from the mob and put into the limb
/obj/item/organ/proc/transfer_to_limb(obj/item/bodypart/LB, mob/living/carbon/C)
- Remove(C)
+ Remove()
forceMove(LB)
/obj/item/organ/brain/transfer_to_limb(obj/item/bodypart/head/LB, mob/living/carbon/human/C)
- Remove(C) //Changeling brain concerns are now handled in Remove
+ Remove() //Changeling brain concerns are now handled in Remove
forceMove(LB)
LB.brain = src
if(brainmob)
diff --git a/code/modules/surgery/nutcracker.dm b/code/modules/surgery/nutcracker.dm
index 9722d8af87..d5827df084 100644
--- a/code/modules/surgery/nutcracker.dm
+++ b/code/modules/surgery/nutcracker.dm
@@ -17,7 +17,7 @@
var/list/organs = M.getorganszone("head") + M.getorganszone("eyes") + M.getorganszone("mouth")
for(var/internal_organ in organs)
var/obj/item/organ/I = internal_organ
- I.Remove(M)
+ I.Remove()
I.forceMove(T)
head.drop_limb()
qdel(head)
diff --git a/code/modules/surgery/organ_manipulation.dm b/code/modules/surgery/organ_manipulation.dm
index 699b3f7f24..f493137424 100644
--- a/code/modules/surgery/organ_manipulation.dm
+++ b/code/modules/surgery/organ_manipulation.dm
@@ -136,7 +136,7 @@
"[user] successfully extracts [I] from [target]'s [parse_zone(target_zone)]!",
"[user] successfully extracts something from [target]'s [parse_zone(target_zone)]!")
log_combat(user, target, "surgically removed [I.name] from", addition="INTENT: [uppertext(user.a_intent)]")
- I.Remove(target)
+ I.Remove()
I.forceMove(get_turf(target))
else
display_results(user, target, "
You can't extract anything from [target]'s [parse_zone(target_zone)]!",
diff --git a/code/modules/surgery/organs/appendix.dm b/code/modules/surgery/organs/appendix.dm
index 8ea4ea855d..feace77018 100644
--- a/code/modules/surgery/organs/appendix.dm
+++ b/code/modules/surgery/organs/appendix.dm
@@ -27,10 +27,11 @@
icon_state = "appendix"
name = "appendix"
-/obj/item/organ/appendix/Remove(mob/living/carbon/M, special = 0)
- for(var/datum/disease/appendicitis/A in M.diseases)
- A.cure()
- inflamed = TRUE
+/obj/item/organ/appendix/Remove(special = FALSE)
+ if(owner)
+ for(var/datum/disease/appendicitis/A in owner.diseases)
+ A.cure()
+ inflamed = TRUE
update_icon()
..()
diff --git a/code/modules/surgery/organs/augments_arms.dm b/code/modules/surgery/organs/augments_arms.dm
index 503bf4ddd0..792facd360 100644
--- a/code/modules/surgery/organs/augments_arms.dm
+++ b/code/modules/surgery/organs/augments_arms.dm
@@ -54,7 +54,7 @@
to_chat(user, "
You modify [src] to be installed on the [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm.")
update_icon()
-/obj/item/organ/cyberimp/arm/Remove(mob/living/carbon/M, special = 0)
+/obj/item/organ/cyberimp/arm/Remove(special = FALSE)
Retract()
..()
diff --git a/code/modules/surgery/organs/augments_chest.dm b/code/modules/surgery/organs/augments_chest.dm
index b2beeebe78..8426440bbb 100644
--- a/code/modules/surgery/organs/augments_chest.dm
+++ b/code/modules/surgery/organs/augments_chest.dm
@@ -147,10 +147,10 @@
ion_trail = new
ion_trail.set_up(M)
-/obj/item/organ/cyberimp/chest/thrusters/Remove(mob/living/carbon/M, special = 0)
+/obj/item/organ/cyberimp/chest/thrusters/Remove(special = FALSE)
if(on)
- toggle(silent = TRUE)
- ..()
+ toggle(TRUE)
+ return ..()
/obj/item/organ/cyberimp/chest/thrusters/ui_action_click()
toggle()
@@ -170,10 +170,11 @@
to_chat(owner, "
You turn your thrusters set on.")
else
ion_trail.stop()
- UnregisterSignal(owner, COMSIG_MOVABLE_MOVED)
- owner.remove_movespeed_modifier(MOVESPEED_ID_CYBER_THRUSTER)
- if(!silent)
- to_chat(owner, "
You turn your thrusters set off.")
+ if(!QDELETED(owner))
+ UnregisterSignal(owner, COMSIG_MOVABLE_MOVED)
+ owner.remove_movespeed_modifier(MOVESPEED_ID_CYBER_THRUSTER)
+ if(!silent)
+ to_chat(owner, "
You turn your thrusters set off.")
on = FALSE
update_icon()
diff --git a/code/modules/surgery/organs/augments_eyes.dm b/code/modules/surgery/organs/augments_eyes.dm
index 86732ae2eb..be9120cdfa 100644
--- a/code/modules/surgery/organs/augments_eyes.dm
+++ b/code/modules/surgery/organs/augments_eyes.dm
@@ -20,11 +20,11 @@
var/datum/atom_hud/H = GLOB.huds[HUD_type]
H.add_hud_to(M)
-/obj/item/organ/cyberimp/eyes/hud/Remove(var/mob/living/carbon/M, var/special = 0)
- if(HUD_type)
+/obj/item/organ/cyberimp/eyes/hud/Remove(special = FALSE)
+ if(!QDELETED(owner) && HUD_type)
var/datum/atom_hud/H = GLOB.huds[HUD_type]
- H.remove_hud_from(M)
- ..()
+ H.remove_hud_from(owner)
+ return ..()
/obj/item/organ/cyberimp/eyes/hud/medical
name = "Medical HUD implant"
diff --git a/code/modules/surgery/organs/augments_internal.dm b/code/modules/surgery/organs/augments_internal.dm
index f487e61d38..01cd4acbed 100644
--- a/code/modules/surgery/organs/augments_internal.dm
+++ b/code/modules/surgery/organs/augments_internal.dm
@@ -89,10 +89,10 @@
stored_items = list()
-/obj/item/organ/cyberimp/brain/anti_drop/Remove(var/mob/living/carbon/M, special = 0)
+/obj/item/organ/cyberimp/brain/anti_drop/Remove(special = FALSE)
if(active)
ui_action_click()
- ..()
+ return ..()
/obj/item/organ/cyberimp/brain/anti_stun
diff --git a/code/modules/surgery/organs/ears.dm b/code/modules/surgery/organs/ears.dm
index 0d3002915e..65847042a1 100644
--- a/code/modules/surgery/organs/ears.dm
+++ b/code/modules/surgery/organs/ears.dm
@@ -104,13 +104,14 @@
H.dna.features["ears"] = "Cat"
H.update_body()
-/obj/item/organ/ears/cat/Remove(mob/living/carbon/human/H, special = 0)
- ..()
- if(istype(H))
+/obj/item/organ/ears/cat/Remove(special = FALSE)
+ if(!QDELETED(owner) && ishuman(owner))
+ var/mob/living/carbon/human/H = owner
color = H.hair_color
H.dna.features["ears"] = "None"
H.dna.species.mutant_bodyparts -= "ears"
H.update_body()
+ return ..()
/obj/item/organ/ears/bronze
name = "tin ears"
diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm
index 0c242a67d3..dfbf4ee21e 100644
--- a/code/modules/surgery/organs/eyes.dm
+++ b/code/modules/surgery/organs/eyes.dm
@@ -47,17 +47,19 @@
M.update_tint()
owner.update_sight()
-/obj/item/organ/eyes/Remove(mob/living/carbon/M, special = 0)
+/obj/item/organ/eyes/Remove(special = FALSE)
clear_eye_trauma()
. = ..()
- if(ishuman(M) && eye_color)
- var/mob/living/carbon/human/H = M
- H.eye_color = old_eye_color
+ var/mob/living/carbon/C = .
+ if(C)
+ if(ishuman(C) && eye_color)
+ var/mob/living/carbon/human/H = C
+ H.eye_color = old_eye_color
+ if(!special)
+ H.dna.species.handle_body()
if(!special)
- H.dna.species.handle_body()
- if(!special)
- M.update_tint()
- M.update_sight()
+ C.update_tint()
+ C.update_sight()
/obj/item/organ/eyes/on_life()
..()
@@ -185,13 +187,13 @@
eye.update_brightness(M)
M.become_blind("flashlight_eyes")
-
-/obj/item/organ/eyes/robotic/flashlight/Remove(var/mob/living/carbon/M, special = FALSE)
- eye.on = FALSE
- eye.update_brightness(M)
- eye.forceMove(src)
- M.cure_blind("flashlight_eyes")
- ..()
+/obj/item/organ/eyes/robotic/flashlight/Remove(special = FALSE)
+ if(!QDELETED(owner))
+ eye.on = FALSE
+ eye.update_brightness(owner)
+ eye.forceMove(src)
+ owner.cure_blind("flashlight_eyes")
+ return ..()
// Welding shield implant
/obj/item/organ/eyes/robotic/shield
@@ -227,7 +229,7 @@
terminate_effects()
. = ..()
-/obj/item/organ/eyes/robotic/glow/Remove(mob/living/carbon/M, special = FALSE)
+/obj/item/organ/eyes/robotic/glow/Remove(special = FALSE)
terminate_effects()
. = ..()
@@ -236,7 +238,6 @@
deactivate(TRUE)
active = FALSE
clear_visuals(TRUE)
- STOP_PROCESSING(SSfastprocess, src)
/obj/item/organ/eyes/robotic/glow/ui_action_click(owner, action)
if(istype(action, /datum/action/item_action/organ_action/toggle))
@@ -255,6 +256,8 @@
if(!C || QDELETED(src) || QDELETED(user) || QDELETED(owner) || owner != user)
return
var/range = input(user, "Enter range (0 - [max_light_beam_distance])", "Range Select", 0) as null|num
+ if(!isnum(range))
+ return
set_distance(CLAMP(range, 0, max_light_beam_distance))
assume_rgb(C)
diff --git a/code/modules/surgery/organs/heart.dm b/code/modules/surgery/organs/heart.dm
index 2d70f44e06..77aa302f8c 100644
--- a/code/modules/surgery/organs/heart.dm
+++ b/code/modules/surgery/organs/heart.dm
@@ -28,10 +28,10 @@
else
icon_state = "[icon_base]-off"
-/obj/item/organ/heart/Remove(mob/living/carbon/M, special = 0)
- ..()
+/obj/item/organ/heart/Remove(special = FALSE)
if(!special)
- addtimer(CALLBACK(src, .proc/stop_if_unowned), 120)
+ addtimer(CALLBACK(src, .proc/stop_if_unowned), 12 SECONDS)
+ return ..()
/obj/item/organ/heart/proc/stop_if_unowned()
if(!owner)
@@ -145,9 +145,9 @@ obj/item/organ/heart/slime
if(owner)
to_chat(owner, "
Your heart has been replaced with a cursed one, you have to pump this one manually otherwise you'll die!")
-/obj/item/organ/heart/cursed/Remove(mob/living/carbon/M, special = 0)
- ..()
- M.remove_client_colour(/datum/client_colour/cursed_heart_blood)
+/obj/item/organ/heart/cursed/Remove(special = FALSE)
+ owner.remove_client_colour(/datum/client_colour/cursed_heart_blood)
+ return ..()
/datum/action/item_action/organ_action/cursed_heart
name = "Pump your blood"
diff --git a/code/modules/surgery/organs/liver.dm b/code/modules/surgery/organs/liver.dm
index fc70e64a82..680d2389de 100755
--- a/code/modules/surgery/organs/liver.dm
+++ b/code/modules/surgery/organs/liver.dm
@@ -58,12 +58,12 @@
return S
//Just in case
-/obj/item/organ/liver/Remove(mob/living/carbon/M, special = 0)
- ..()
- if(!QDELETED(M))
- M.remove_movespeed_modifier(LIVER_SWELLING_MOVE_MODIFY)
- M.ResetBloodVol() //At the moment, this shouldn't allow application twice. You either have this OR a thirsty ferret.
- sizeMoveMod(1, M)
+/obj/item/organ/liver/Remove(special = FALSE)
+ if(!QDELETED(owner))
+ owner.remove_movespeed_modifier(LIVER_SWELLING_MOVE_MODIFY)
+ owner.ResetBloodVol() //At the moment, this shouldn't allow application twice. You either have this OR a thirsty ferret.
+ sizeMoveMod(1, owner)
+ return ..()
//Applies some of the effects to the patient.
/obj/item/organ/liver/proc/pharmacokinesis()
diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm
index fcbed13d94..b091af0f92 100644
--- a/code/modules/surgery/organs/organ_internal.dm
+++ b/code/modules/surgery/organs/organ_internal.dm
@@ -33,7 +33,7 @@
var/obj/item/organ/replaced = M.getorganslot(slot)
if(replaced)
- replaced.Remove(M, special = 1)
+ replaced.Remove(TRUE)
if(drop_if_replaced)
replaced.forceMove(get_turf(M))
else
@@ -54,21 +54,20 @@
return TRUE
//Special is for instant replacement like autosurgeons
-/obj/item/organ/proc/Remove(mob/living/carbon/M, special = FALSE)
+/obj/item/organ/proc/Remove(special = FALSE)
+ if(owner)
+ owner.internal_organs -= src
+ if(owner.internal_organs_slot[slot] == src)
+ owner.internal_organs_slot.Remove(slot)
+ if((organ_flags & ORGAN_VITAL) && !special && !(owner.status_flags & GODMODE))
+ owner.death()
+ for(var/X in actions)
+ var/datum/action/A = X
+ A.Remove(owner)
+ . = owner //for possible subtypes specific post-removal code.
owner = null
- if(M)
- M.internal_organs -= src
- if(M.internal_organs_slot[slot] == src)
- M.internal_organs_slot.Remove(slot)
- if((organ_flags & ORGAN_VITAL) && !special && !(M.status_flags & GODMODE))
- M.death()
- for(var/X in actions)
- var/datum/action/A = X
- A.Remove(M)
START_PROCESSING(SSobj, src)
- return TRUE
-
/obj/item/organ/proc/on_find(mob/living/finder)
return
@@ -185,7 +184,7 @@
if(owner)
// The special flag is important, because otherwise mobs can die
// while undergoing transformation into different mobs.
- Remove(owner, TRUE)
+ Remove(TRUE)
return ..()
/obj/item/organ/attack(mob/living/carbon/M, mob/user)
@@ -338,7 +337,7 @@
T = new dna.species.mutanttongue()
else
T = new()
- oT.Remove(src)
+ oT.Remove()
qdel(oT)
T.Insert(src)
diff --git a/code/modules/surgery/organs/stomach.dm b/code/modules/surgery/organs/stomach.dm
index 93210fe3ff..94f88cbe67 100755
--- a/code/modules/surgery/organs/stomach.dm
+++ b/code/modules/surgery/organs/stomach.dm
@@ -80,9 +80,9 @@
H.throw_alert("disgust", /obj/screen/alert/disgusted)
SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "disgust", /datum/mood_event/disgusted)
-/obj/item/organ/stomach/Remove(mob/living/carbon/M, special = 0)
+/obj/item/organ/stomach/Remove(special = FALSE)
var/mob/living/carbon/human/H = owner
- if(istype(H))
+ if(H && istype(H))
H.clear_alert("disgust")
SEND_SIGNAL(H, COMSIG_CLEAR_MOOD_EVENT, "disgust")
..()
diff --git a/code/modules/surgery/organs/tails.dm b/code/modules/surgery/organs/tails.dm
index b6701643a9..fe881df221 100644
--- a/code/modules/surgery/organs/tails.dm
+++ b/code/modules/surgery/organs/tails.dm
@@ -8,10 +8,10 @@
slot = ORGAN_SLOT_TAIL
var/tail_type = "None"
-/obj/item/organ/tail/Remove(mob/living/carbon/human/H, special = 0)
- ..()
- if(H && H.dna && H.dna.species)
- H.dna.species.stop_wagging_tail(H)
+/obj/item/organ/tail/Remove(special = FALSE)
+ if(owner?.dna?.species)
+ owner.dna.species.stop_wagging_tail(owner)
+ return ..()
/obj/item/organ/tail/cat
name = "cat tail"
@@ -26,13 +26,14 @@
H.dna.features["tail_human"] = tail_type
H.update_body()
-/obj/item/organ/tail/cat/Remove(mob/living/carbon/human/H, special = 0)
- ..()
- if(istype(H))
+/obj/item/organ/tail/cat/Remove(special = FALSE)
+ if(!QDELETED(owner) && ishuman(owner))
+ var/mob/living/carbon/human/H = owner
H.dna.features["tail_human"] = "None"
H.dna.species.mutant_bodyparts -= "tail_human"
color = H.hair_color
H.update_body()
+ return ..()
/obj/item/organ/tail/lizard
name = "lizard tail"
@@ -54,12 +55,13 @@
H.dna.species.mutant_bodyparts |= "spines"
H.update_body()
-/obj/item/organ/tail/lizard/Remove(mob/living/carbon/human/H, special = 0)
- ..()
- if(istype(H))
+/obj/item/organ/tail/lizard/Remove(special = FALSE)
+ if(!QDELETED(owner) && ishuman(owner))
+ var/mob/living/carbon/human/H = owner
H.dna.species.mutant_bodyparts -= "tail_lizard"
H.dna.species.mutant_bodyparts -= "spines"
color = "#" + H.dna.features["mcolor"]
tail_type = H.dna.features["tail_lizard"]
spines = H.dna.features["spines"]
H.update_body()
+ return ..()
diff --git a/code/modules/surgery/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm
index 52bd0d4628..013d8f7205 100644
--- a/code/modules/surgery/organs/tongue.dm
+++ b/code/modules/surgery/organs/tongue.dm
@@ -71,12 +71,13 @@
RegisterSignal(M, COMSIG_MOB_SAY, .proc/handle_speech)
M.UnregisterSignal(M, COMSIG_MOB_SAY)
-/obj/item/organ/tongue/Remove(mob/living/carbon/M, special = 0)
- ..()
- if(say_mod && M.dna && M.dna.species)
- M.dna.species.say_mod = initial(M.dna.species.say_mod)
- UnregisterSignal(M, COMSIG_MOB_SAY, .proc/handle_speech)
- M.RegisterSignal(M, COMSIG_MOB_SAY, /mob/living/carbon/.proc/handle_tongueless_speech)
+/obj/item/organ/tongue/Remove(special = FALSE)
+ if(!QDELETED(owner))
+ if(say_mod && owner.dna?.species)
+ owner.dna.species.say_mod = initial(owner.dna.species.say_mod)
+ UnregisterSignal(owner, COMSIG_MOB_SAY, .proc/handle_speech)
+ owner.RegisterSignal(owner, COMSIG_MOB_SAY, /mob/living/carbon/.proc/handle_tongueless_speech)
+ return ..()
/obj/item/organ/tongue/could_speak_in_language(datum/language/dt)
return is_type_in_typecache(dt, languages_possible)
diff --git a/code/modules/uplink/uplink_items/uplink_explosives.dm b/code/modules/uplink/uplink_items/uplink_explosives.dm
index 4db8643a66..c52651fee9 100644
--- a/code/modules/uplink/uplink_items/uplink_explosives.dm
+++ b/code/modules/uplink/uplink_items/uplink_explosives.dm
@@ -145,7 +145,7 @@
/datum/uplink_item/explosives/tearstache
name = "Teachstache Grenade"
desc = "A teargas grenade that launches sticky moustaches onto the face of anyone not wearing a clown or mime mask. The moustaches will \
- remain attached to the face of all targets for one minute, preventing the use of breath masks and other such devices."
+ remain attached to the face of all targets for two minutes, preventing the use of breath masks and other such devices."
item = /obj/item/grenade/chem_grenade/teargas/moustache
cost = 3
surplus = 0
diff --git a/code/modules/zombie/organs.dm b/code/modules/zombie/organs.dm
index ccadca56e5..59c6a321e6 100644
--- a/code/modules/zombie/organs.dm
+++ b/code/modules/zombie/organs.dm
@@ -27,13 +27,14 @@
. = ..()
START_PROCESSING(SSobj, src)
-/obj/item/organ/zombie_infection/Remove(mob/living/carbon/M, special = 0)
+/obj/item/organ/zombie_infection/Remove(special = FALSE)
+ if(owner)
+ if(iszombie(owner) && old_species)
+ owner.set_species(old_species)
+ if(timer_id)
+ deltimer(timer_id)
. = ..()
- STOP_PROCESSING(SSobj, src)
- if(iszombie(M) && old_species)
- M.set_species(old_species)
- if(timer_id)
- deltimer(timer_id)
+ STOP_PROCESSING(SSobj, src) //Required to be done after the parent call to avoid conflicts with organ decay.
/obj/item/organ/zombie_infection/on_find(mob/living/finder)
to_chat(finder, "
Inside the head is a disgusting black \
@@ -44,7 +45,7 @@
if(!owner)
return
if(!(src in owner.internal_organs))
- Remove(owner)
+ Remove()
if (causes_damage && !iszombie(owner) && owner.stat != DEAD)
owner.adjustToxLoss(1)
if (prob(10))
diff --git a/html/changelogs/AutoChangeLog-pr-10801.yml b/html/changelogs/AutoChangeLog-pr-10801.yml
new file mode 100644
index 0000000000..36db98e9e1
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-10801.yml
@@ -0,0 +1,4 @@
+author: "Seris02"
+delete-after: True
+changes:
+ - balance: "rebalanced rising bass"
diff --git a/html/changelogs/AutoChangeLog-pr-10847.yml b/html/changelogs/AutoChangeLog-pr-10847.yml
new file mode 100644
index 0000000000..3e18420cb3
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-10847.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Fixed space ninjas \"Nothing\" objective. Now you gotta steal some dandy stuff such as corgi meat and pinpointers as a ninja too."
diff --git a/html/changelogs/AutoChangeLog-pr-10852.yml b/html/changelogs/AutoChangeLog-pr-10852.yml
new file mode 100644
index 0000000000..5d6edfba1b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-10852.yml
@@ -0,0 +1,4 @@
+author: "MrJWhit"
+delete-after: True
+changes:
+ - rscdel: "Removed meteor defense tech node"
diff --git a/html/changelogs/AutoChangeLog-pr-10854.yml b/html/changelogs/AutoChangeLog-pr-10854.yml
new file mode 100644
index 0000000000..b01532daf4
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-10854.yml
@@ -0,0 +1,4 @@
+author: "Seris02"
+delete-after: True
+changes:
+ - bugfix: "meteor hallucinations (again)"
diff --git a/html/changelogs/AutoChangeLog-pr-10860.yml b/html/changelogs/AutoChangeLog-pr-10860.yml
new file mode 100644
index 0000000000..5de723e73b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-10860.yml
@@ -0,0 +1,4 @@
+author: "Bhijn"
+delete-after: True
+changes:
+ - tweak: "Click-dragging will now only perform the quick item usage behavior if you're in combat mode."
diff --git a/html/changelogs/AutoChangeLog-pr-10862.yml b/html/changelogs/AutoChangeLog-pr-10862.yml
new file mode 100644
index 0000000000..0e08046d07
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-10862.yml
@@ -0,0 +1,4 @@
+author: "Hatterhat"
+delete-after: True
+changes:
+ - tweak: "fiddles with the seed extractor upgrade examine to make it not shit"
diff --git a/html/changelogs/AutoChangeLog-pr-10865.yml b/html/changelogs/AutoChangeLog-pr-10865.yml
new file mode 100644
index 0000000000..a929bab8a1
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-10865.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - balance: "Nerfed magnetic rifles/pistols by re(?)adding power cell requirements for it. These firearms must be recharged after firing 2 magazines worth of projectiles and are slightly more susceptible to EMPs."
diff --git a/html/changelogs/AutoChangeLog-pr-10867.yml b/html/changelogs/AutoChangeLog-pr-10867.yml
new file mode 100644
index 0000000000..3e3b1c460f
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-10867.yml
@@ -0,0 +1,5 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Fixed the tearstache nade not properly working."
+ - balance: "Buffed it against space helmet internals."
diff --git a/html/changelogs/AutoChangeLog-pr-10872.yml b/html/changelogs/AutoChangeLog-pr-10872.yml
new file mode 100644
index 0000000000..4a61daa9bb
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-10872.yml
@@ -0,0 +1,4 @@
+author: "Arturlang"
+delete-after: True
+changes:
+ - balance: "Shields will no longer block lasers, and will break if they take too much damage."
diff --git a/html/changelogs/AutoChangeLog-pr-10873.yml b/html/changelogs/AutoChangeLog-pr-10873.yml
new file mode 100644
index 0000000000..0e9bca3f95
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-10873.yml
@@ -0,0 +1,4 @@
+author: "Putnam3145"
+delete-after: True
+changes:
+ - tweak: "Relief valve now has a TGUI-next UI"
diff --git a/html/changelogs/AutoChangeLog-pr-10876.yml b/html/changelogs/AutoChangeLog-pr-10876.yml
new file mode 100644
index 0000000000..9347a655cc
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-10876.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Fixed slipping."
diff --git a/icons/mob/actions/actions_items.dmi b/icons/mob/actions/actions_items.dmi
index 43c9d20a93..f5ba86c0fa 100644
Binary files a/icons/mob/actions/actions_items.dmi and b/icons/mob/actions/actions_items.dmi differ
diff --git a/icons/obj/ammo.dmi b/icons/obj/ammo.dmi
index 6282e555fa..55cbcc66e0 100644
Binary files a/icons/obj/ammo.dmi and b/icons/obj/ammo.dmi differ
diff --git a/icons/obj/guns/energy.dmi b/icons/obj/guns/energy.dmi
index c30e8aa6bd..c68728a91f 100644
Binary files a/icons/obj/guns/energy.dmi and b/icons/obj/guns/energy.dmi differ
diff --git a/icons/obj/guns/projectile.dmi b/icons/obj/guns/projectile.dmi
index 24ec5797d4..b85c769bcd 100644
Binary files a/icons/obj/guns/projectile.dmi and b/icons/obj/guns/projectile.dmi differ
diff --git a/icons/obj/guns/toy.dmi b/icons/obj/guns/toy.dmi
index f41c289746..56fa76b41b 100644
Binary files a/icons/obj/guns/toy.dmi and b/icons/obj/guns/toy.dmi differ
diff --git a/icons/obj/projectiles.dmi b/icons/obj/projectiles.dmi
index a434994846..668f3388ce 100644
Binary files a/icons/obj/projectiles.dmi and b/icons/obj/projectiles.dmi differ
diff --git a/modular_citadel/code/modules/arousal/genitals.dm b/modular_citadel/code/modules/arousal/genitals.dm
index 3cbf906d67..ca01ef46cb 100644
--- a/modular_citadel/code/modules/arousal/genitals.dm
+++ b/modular_citadel/code/modules/arousal/genitals.dm
@@ -35,8 +35,6 @@
/obj/item/organ/genital/Destroy()
if(linked_organ)
update_link(TRUE)//this should remove any other links it has
- if(owner)
- Remove(owner, TRUE)//this should remove references to it, so it can be GCd correctly
return ..()
/obj/item/organ/genital/proc/set_aroused_state(new_state)
@@ -203,10 +201,9 @@
RegisterSignal(owner, COMSIG_MOB_DEATH, .proc/update_appearance)
/obj/item/organ/genital/Remove(mob/living/carbon/M, special = FALSE, drop_if_replaced = TRUE)
- . = ..()
- if(.)
- update(TRUE)
- UnregisterSignal(M, COMSIG_MOB_DEATH)
+ update(TRUE)
+ if(!QDELETED(owner))
+ UnregisterSignal(owner, COMSIG_MOB_DEATH)
//proc to give a player their genitals and stuff when they log in
/mob/living/carbon/human/proc/give_genitals(clean = FALSE)//clean will remove all pre-existing genitals. proc will then give them any genitals that are enabled in their DNA
diff --git a/modular_citadel/code/modules/projectiles/guns/ballistic/magweapon.dm b/modular_citadel/code/modules/projectiles/guns/ballistic/magweapon.dm
deleted file mode 100644
index 9779b47b15..0000000000
--- a/modular_citadel/code/modules/projectiles/guns/ballistic/magweapon.dm
+++ /dev/null
@@ -1,470 +0,0 @@
-///////XCOM X9 AR///////
-
-/obj/item/gun/ballistic/automatic/x9 //will be adminspawn only so ERT or something can use them
- name = "\improper X9 Assault Rifle"
- desc = "A rather old design of a cheap, reliable assault rifle made for combat against unknown enemies. Uses 5.56mm ammo."
- icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
- icon_state = "x9"
- item_state = "arg"
- slot_flags = 0
- mag_type = /obj/item/ammo_box/magazine/m556 //Uses the m90gl's magazine, just like the NT-ARG
- fire_sound = 'sound/weapons/gunshot_smg.ogg'
- can_suppress = 0
- burst_size = 6 //in line with XCOMEU stats. This can fire 5 bursts from a full magazine.
- fire_delay = 1
- spread = 30 //should be 40 for XCOM memes, but since its adminspawn only, might as well make it useable
- recoil = 1
-
-///toy memes///
-
-/obj/item/ammo_box/magazine/toy/x9
- name = "foam force X9 magazine"
- icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
- icon_state = "toy9magazine"
- max_ammo = 30
- multiple_sprites = 2
- materials = list(MAT_METAL = 200)
-
-/obj/item/gun/ballistic/automatic/x9/toy
- name = "\improper Foam Force X9"
- desc = "An old but reliable assault rifle made for combat against unknown enemies. Appears to be hastily converted. Ages 8 and up."
- icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
- icon_state = "toy9"
- can_suppress = 0
- obj_flags = 0
- mag_type = /obj/item/ammo_box/magazine/toy/x9
- casing_ejector = 0
- spread = 90 //MAXIMUM XCOM MEMES (actually that'd be 180 spread)
- w_class = WEIGHT_CLASS_BULKY
- weapon_weight = WEAPON_HEAVY
-
-////////XCOM2 Magpistol/////////
-
-//////projectiles//////
-
-/obj/item/projectile/bullet/mags
- icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
- icon_state = "magjectile"
- damage = 15
- armour_penetration = 10
- light_range = 2
- speed = 0.6
- range = 25
- light_color = LIGHT_COLOR_RED
-
-/obj/item/projectile/bullet/nlmags //non-lethal boolets
- icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
- icon_state = "magjectile-nl"
- damage = 2
- knockdown = 0
- stamina = 20
- light_range = 2
- speed = 0.6
- range = 25
- light_color = LIGHT_COLOR_BLUE
-
-
-/////actual ammo/////
-
-/obj/item/ammo_casing/caseless/amags
- desc = "A ferromagnetic slug intended to be launched out of a compatible weapon."
- caliber = "mags"
- icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
- icon_state = "mag-casing-live"
- projectile_type = /obj/item/projectile/bullet/mags
-
-/obj/item/ammo_casing/caseless/anlmags
- desc = "A specialized ferromagnetic slug designed with a less-than-lethal payload."
- caliber = "mags"
- icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
- icon_state = "mag-casing-live"
- projectile_type = /obj/item/projectile/bullet/nlmags
-
-//////magazines/////
-
-/obj/item/ammo_box/magazine/mmag/small
- name = "magpistol magazine (non-lethal disabler)"
- icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
- icon_state = "smallmagmag"
- ammo_type = /obj/item/ammo_casing/caseless/anlmags
- caliber = "mags"
- max_ammo = 15
- multiple_sprites = 2
-
-/obj/item/ammo_box/magazine/mmag/small/lethal
- name = "magpistol magazine (lethal)"
- icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
- icon_state = "smallmagmag"
- ammo_type = /obj/item/ammo_casing/caseless/amags
-
-//////the gun itself//////
-
-/obj/item/gun/ballistic/automatic/pistol/mag
- name = "magpistol"
- desc = "A handgun utilizing maglev technologies to propel a ferromagnetic slug to extreme velocities."
- icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
- icon_state = "magpistol"
- force = 10
- fire_sound = 'sound/weapons/magpistol.ogg'
- mag_type = /obj/item/ammo_box/magazine/mmag/small
- can_suppress = 0
- casing_ejector = FALSE
- fire_delay = 2
- recoil = 0.1
- inaccuracy_modifier = 0.25
-
-/obj/item/gun/ballistic/automatic/pistol/mag/update_icon()
- ..()
- if(magazine)
- cut_overlays()
- add_overlay("magpistol-magazine")
- else
- cut_overlays()
- icon_state = "[initial(icon_state)][chambered ? "" : "-e"]"
-
-///research memes///
-/obj/item/gun/ballistic/automatic/pistol/mag/nopin
- pin = null
- spawnwithmagazine = FALSE
-
-/datum/design/magpistol
- name = "Magpistol"
- desc = "A weapon which fires ferromagnetic slugs."
- id = "magpisol"
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 7500, MAT_GLASS = 1000, MAT_URANIUM = 1000, MAT_TITANIUM = 5000, MAT_SILVER = 2000)
- build_path = /obj/item/gun/ballistic/automatic/pistol/mag/nopin
- category = list("Weapons")
- departmental_flags = DEPARTMENTAL_FLAG_SECURITY
-
-/datum/design/mag_magpistol
- name = "Magpistol Magazine"
- desc = "A 14 round magazine for the Magpistol."
- id = "mag_magpistol"
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 4000, MAT_SILVER = 500)
- build_path = /obj/item/ammo_box/magazine/mmag/small/lethal
- category = list("Ammo")
- departmental_flags = DEPARTMENTAL_FLAG_SECURITY
-
-/datum/design/mag_magpistol/nl
- name = "Magpistol Magazine (Non-Lethal)"
- desc = "A 14 round non-lethal magazine for the Magpistol."
- id = "mag_magpistol_nl"
- materials = list(MAT_METAL = 3000, MAT_SILVER = 250, MAT_TITANIUM = 250)
- build_path = /obj/item/ammo_box/magazine/mmag/small
- departmental_flags = DEPARTMENTAL_FLAG_SECURITY
-
-//////toy memes/////
-
-/obj/item/projectile/bullet/reusable/foam_dart/mag
- name = "magfoam dart"
- icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
- icon_state = "magjectile-toy"
- ammo_type = /obj/item/ammo_casing/caseless/foam_dart/mag
- light_range = 2
- light_color = LIGHT_COLOR_YELLOW
-
-/obj/item/ammo_casing/caseless/foam_dart/mag
- name = "magfoam dart"
- desc = "A foam dart with fun light-up projectiles powered by magnets!"
- projectile_type = /obj/item/projectile/bullet/reusable/foam_dart/mag
-
-/obj/item/ammo_box/magazine/internal/shot/toy/mag
- ammo_type = /obj/item/ammo_casing/caseless/foam_dart/mag
- max_ammo = 14
-
-/obj/item/gun/ballistic/shotgun/toy/mag
- name = "foam force magpistol"
- desc = "A fancy toy sold alongside light-up foam force darts. Ages 8 and up."
- icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
- icon_state = "toymag"
- item_state = "gun"
- mag_type = /obj/item/ammo_box/magazine/internal/shot/toy/mag
- fire_sound = 'sound/weapons/magpistol.ogg'
- slot_flags = SLOT_BELT
- w_class = WEIGHT_CLASS_SMALL
-
-/obj/item/ammo_box/foambox/mag
- name = "ammo box (Magnetic Foam Darts)"
- icon = 'icons/obj/guns/toy.dmi'
- icon_state = "foambox"
- ammo_type = /obj/item/ammo_casing/caseless/foam_dart/mag
- max_ammo = 42
-
-//////Magrifle//////
-
-///projectiles///
-
-/obj/item/projectile/bullet/magrifle
- icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
- icon_state = "magjectile-large"
- damage = 20
- armour_penetration = 20
- light_range = 3
- speed = 0.6
- range = 35
- light_color = LIGHT_COLOR_RED
-
-/obj/item/projectile/bullet/nlmagrifle //non-lethal boolets
- icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
- icon_state = "magjectile-large-nl"
- damage = 2
- knockdown = 0
- stamina = 20
- armour_penetration = 10
- light_range = 3
- speed = 0.6
- range = 35
- light_color = LIGHT_COLOR_BLUE
-
-///ammo casings///
-
-/obj/item/ammo_casing/caseless/amagm
- desc = "A large ferromagnetic slug intended to be launched out of a compatible weapon."
- caliber = "magm"
- icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
- icon_state = "mag-casing-live"
- projectile_type = /obj/item/projectile/bullet/magrifle
- click_cooldown_override = 2.5
- delay = 3
-
-/obj/item/ammo_casing/caseless/anlmagm
- desc = "A large, specialized ferromagnetic slug designed with a less-than-lethal payload."
- caliber = "magm"
- icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
- icon_state = "mag-casing-live"
- projectile_type = /obj/item/projectile/bullet/nlmagrifle
- click_cooldown_override = 2.5
- delay = 3
-
-///magazines///
-
-/obj/item/ammo_box/magazine/mmag
- name = "magrifle magazine (non-lethal disabler)"
- icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
- icon_state = "mediummagmag"
- ammo_type = /obj/item/ammo_casing/caseless/anlmagm
- caliber = "magm"
- max_ammo = 24
- multiple_sprites = 2
-
-/obj/item/ammo_box/magazine/mmag/lethal
- name = "magrifle magazine (lethal)"
- icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
- icon_state = "mediummagmag"
- ammo_type = /obj/item/ammo_casing/caseless/amagm
- max_ammo = 24
-
-///the gun itself///
-
-/obj/item/gun/ballistic/automatic/magrifle
- name = "\improper Magnetic Rifle"
- desc = "A simple upscalling of the technologies used in the magpistol, the magrifle is capable of firing slightly larger slugs in bursts. Compatible with the magpistol's slugs."
- icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
- icon_state = "magrifle"
- item_state = "arg"
- slot_flags = NONE
- mag_type = /obj/item/ammo_box/magazine/mmag
- fire_sound = 'sound/weapons/magrifle.ogg'
- can_suppress = 0
- burst_size = 1
- actions_types = null
- fire_delay = 3
- spread = 0
- recoil = 0.1
- casing_ejector = FALSE
- inaccuracy_modifier = 0.5
- weapon_weight = WEAPON_MEDIUM
- dualwield_spread_mult = 1.4
-
-//research///
-
-/obj/item/gun/ballistic/automatic/magrifle/nopin
- pin = null
- spawnwithmagazine = FALSE
-
-/datum/design/magrifle
- name = "Magrifle"
- desc = "An upscaled Magpistol in rifle form."
- id = "magrifle"
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 10000, MAT_GLASS = 2000, MAT_URANIUM = 2000, MAT_TITANIUM = 10000, MAT_SILVER = 4000, MAT_GOLD = 2000)
- build_path = /obj/item/gun/ballistic/automatic/magrifle/nopin
- category = list("Weapons")
- departmental_flags = DEPARTMENTAL_FLAG_SECURITY
-
-/datum/design/mag_magrifle
- name = "Magrifle Magazine (Lethal)"
- desc = "A 24-round magazine for the Magrifle."
- id = "mag_magrifle"
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 8000, MAT_SILVER = 1000)
- build_path = /obj/item/ammo_box/magazine/mmag/lethal
- category = list("Ammo")
- departmental_flags = DEPARTMENTAL_FLAG_SECURITY
-
-/datum/design/mag_magrifle/nl
- name = "Magrifle Magazine (Non-Lethal)"
- desc = "A 24- round non-lethal magazine for the Magrifle."
- id = "mag_magrifle_nl"
- materials = list(MAT_METAL = 6000, MAT_SILVER = 500, MAT_TITANIUM = 500)
- build_path = /obj/item/ammo_box/magazine/mmag
- departmental_flags = DEPARTMENTAL_FLAG_SECURITY
-
-///foamagrifle///
-
-/obj/item/ammo_box/magazine/toy/foamag
- name = "foam force magrifle magazine"
- icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
- icon_state = "foamagmag"
- max_ammo = 24
- multiple_sprites = 2
- ammo_type = /obj/item/ammo_casing/caseless/foam_dart/mag
- materials = list(MAT_METAL = 200)
-
-/obj/item/gun/ballistic/automatic/magrifle/toy
- name = "foamag rifle"
- desc = "A foam launching magnetic rifle. Ages 8 and up."
- icon_state = "foamagrifle"
- obj_flags = 0
- mag_type = /obj/item/ammo_box/magazine/toy/foamag
- casing_ejector = FALSE
- spread = 60
- w_class = WEIGHT_CLASS_BULKY
- weapon_weight = WEAPON_HEAVY
-// TECHWEBS IMPLEMENTATION
-//
-
-/datum/techweb_node/magnetic_weapons
- id = "magnetic_weapons"
- display_name = "Magnetic Weapons"
- description = "Weapons using magnetic technology"
- prereq_ids = list("weaponry", "adv_weaponry", "emp_adv")
- design_ids = list("magrifle", "magpisol", "mag_magrifle", "mag_magrifle_nl", "mag_magpistol", "mag_magpistol_nl")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
-
-//////Hyper-Burst Rifle//////
-
-///projectiles///
-
-/obj/item/projectile/bullet/mags/hyper
- icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
- icon_state = "magjectile"
- damage = 10
- armour_penetration = 10
- stamina = 10
- movement_type = FLYING | UNSTOPPABLE
- range = 6
- light_range = 1
- light_color = LIGHT_COLOR_RED
-
-/obj/item/projectile/bullet/mags/hyper/inferno
- icon_state = "magjectile-large"
- stamina = 0
- movement_type = FLYING | UNSTOPPABLE
- range = 25
- light_range = 4
-
-/obj/item/projectile/bullet/mags/hyper/inferno/on_hit(atom/target, blocked = FALSE)
- ..()
- explosion(target, -1, 1, 2, 4, 5)
- return BULLET_ACT_HIT
-
-///ammo casings///
-
-/obj/item/ammo_casing/caseless/ahyper
- desc = "A large block of speciallized ferromagnetic material designed to be fired out of the experimental Hyper-Burst Rifle."
- caliber = "hypermag"
- icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
- icon_state = "hyper-casing-live"
- projectile_type = /obj/item/projectile/bullet/mags/hyper
- pellets = 12
- variance = 40
-
-/obj/item/ammo_casing/caseless/ahyper/inferno
- projectile_type = /obj/item/projectile/bullet/mags/hyper/inferno
- pellets = 1
- variance = 0
-
-///magazines///
-
-/obj/item/ammo_box/magazine/mhyper
- name = "hyper-burst rifle magazine"
- icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
- icon_state = "hypermag-4"
- ammo_type = /obj/item/ammo_casing/caseless/ahyper
- caliber = "hypermag"
- desc = "A magazine for the Hyper-Burst Rifle. Loaded with a special slug that fragments into 12 smaller shards which can absolutely puncture anything, but has rather short effective range."
- max_ammo = 4
-
-/obj/item/ammo_box/magazine/mhyper/update_icon()
- ..()
- icon_state = "hypermag-[ammo_count() ? "4" : "0"]"
-
-/obj/item/ammo_box/magazine/mhyper/inferno
- name = "hyper-burst rifle magazine (inferno)"
- ammo_type = /obj/item/ammo_casing/caseless/ahyper/inferno
- desc = "A magazine for the Hyper-Burst Rifle. Loaded with a special slug that violently reacts with whatever surface it strikes, generating a massive amount of heat and light."
-
-///gun itself///
-
-/obj/item/gun/ballistic/automatic/hyperburst
- name = "\improper Hyper-Burst Rifle"
- desc = "An extremely beefed up version of a stolen Nanotrasen weapon prototype, this 'rifle' is more like a cannon, with an extremely large bore barrel capable of generating several smaller magnetic 'barrels' to simultaneously launch multiple projectiles at once."
- icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
- icon_state = "hyperburst"
- item_state = "arg"
- slot_flags = 0
- mag_type = /obj/item/ammo_box/magazine/mhyper
- fire_sound = 'sound/weapons/magburst.ogg'
- can_suppress = 0
- burst_size = 1
- fire_delay = 40
- recoil = 2
- casing_ejector = 0
- weapon_weight = WEAPON_HEAVY
-
-/obj/item/gun/ballistic/automatic/hyperburst/update_icon()
- ..()
- icon_state = "hyperburst[magazine ? "-[get_ammo()]" : ""][chambered ? "" : "-e"]"
-
-///toy memes///
-
-/obj/item/projectile/beam/lasertag/mag //the projectile, compatible with regular laser tag armor
- icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
- icon_state = "magjectile-toy"
- name = "lasertag magbolt"
- movement_type = FLYING | UNSTOPPABLE //for penetration memes
- range = 5 //so it isn't super annoying
- light_range = 2
- light_color = LIGHT_COLOR_YELLOW
- eyeblur = 0
-
-/obj/item/ammo_casing/energy/laser/magtag
- projectile_type = /obj/item/projectile/beam/lasertag/mag
- select_name = "magtag"
- pellets = 3
- variance = 30
- e_cost = 1000
- fire_sound = 'sound/weapons/magburst.ogg'
-
-/obj/item/gun/energy/laser/practice/hyperburst
- name = "toy hyper-burst launcher"
- desc = "A toy laser with a unique beam shaping lens that projects harmless bolts capable of going through objects. Compatible with existing laser tag systems."
- ammo_type = list(/obj/item/ammo_casing/energy/laser/magtag)
- icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
- icon_state = "toyburst"
- clumsy_check = FALSE
- obj_flags = 0
- fire_delay = 40
- weapon_weight = WEAPON_HEAVY
- selfcharge = EGUN_SELFCHARGE
- charge_delay = 2
- recoil = 2
- cell_type = /obj/item/stock_parts/cell/toymagburst
-
-/obj/item/stock_parts/cell/toymagburst
- name = "toy mag burst rifle power supply"
- maxcharge = 4000
diff --git a/modular_citadel/code/modules/projectiles/guns/ballistic/magweapon_energy.dm b/modular_citadel/code/modules/projectiles/guns/ballistic/magweapon_energy.dm
deleted file mode 100644
index f847d04e9e..0000000000
--- a/modular_citadel/code/modules/projectiles/guns/ballistic/magweapon_energy.dm
+++ /dev/null
@@ -1,293 +0,0 @@
-///ammo///
-
-/obj/item/ammo_casing/caseless/mag_e
- var/energy_cost = 0
-
-/obj/item/ammo_casing/caseless/mag_e/amagm_e
- desc = "A large ferromagnetic slug intended to be launched out of a compatible weapon."
- caliber = "mag_e"
- icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
- icon_state = "mag-casing-live"
- projectile_type = /obj/item/projectile/bullet/magrifle
- energy_cost = 200
-
-/obj/item/ammo_casing/caseless/mag_e/anlmagm_e
- desc = "A large, specialized ferromagnetic slug designed with a less-than-lethal payload."
- caliber = "mag_e"
- icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
- icon_state = "mag-casing-live"
- projectile_type = /obj/item/projectile/bullet/nlmagrifle
- energy_cost = 200
-
-/obj/item/ammo_casing/caseless/mag_e/amags
- desc = "A ferromagnetic slug intended to be launched out of a compatible weapon."
- caliber = "mag_e"
- icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
- icon_state = "mag-casing-live"
- projectile_type = /obj/item/projectile/bullet/mags
- energy_cost = 125
-
-/obj/item/ammo_casing/caseless/mag_e/anlmags
- desc = "A specialized ferromagnetic slug designed with a less-than-lethal payload."
- caliber = "mag_e"
- icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
- icon_state = "mag-casing-live"
- projectile_type = /obj/item/projectile/bullet/nlmags
- energy_cost = 125
-
-///magazines///
-
-/obj/item/ammo_box/magazine/mmag_e/
- name = "magrifle magazine (non-lethal disabler)"
- icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
- icon_state = "mediummagmag"
- ammo_type = /obj/item/ammo_casing/caseless/mag_e/anlmagm_e
- caliber = "mag_e"
- max_ammo = 24
- multiple_sprites = 2
-
-/obj/item/ammo_box/magazine/mmag_e/lethal
- name = "magrifle magazine (lethal)"
- icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
- icon_state = "mediummagmag"
- ammo_type = /obj/item/ammo_casing/caseless/mag_e/amagm_e
- max_ammo = 24
-
-/obj/item/ammo_box/magazine/mmag_e/small
- name = "magpistol magazine (non-lethal disabler)"
- icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
- icon_state = "smallmagmag"
- ammo_type = /obj/item/ammo_casing/caseless/mag_e/anlmags
- caliber = "mag_e"
- max_ammo = 16
- multiple_sprites = 2
-
-/obj/item/ammo_box/magazine/mmag_e/small/lethal
- name = "magpistol magazine (lethal)"
- icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
- icon_state = "smallmagmag"
- ammo_type = /obj/item/ammo_casing/caseless/mag_e/amags
- max_ammo = 16
-
-///cells///
-
-/obj/item/stock_parts/cell/magrifle_e
- name = "magrifle power supply"
- maxcharge = 14400
- chargerate = 3520
-
-/obj/item/stock_parts/cell/magpistol_e
- name = "magpistol power supply"
- maxcharge = 6000
- chargerate = 1000
-
-///sci designs///
-
-/datum/design/magrifle_e
- name = "Magrifle"
- desc = "An upscaled Magpistol in rifle form."
- id = "magrifle_e"
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 10000, MAT_GLASS = 2000, MAT_URANIUM = 2000, MAT_TITANIUM = 10000, MAT_SILVER = 4000, MAT_GOLD = 2000)
- build_path = /obj/item/gun/ballistic/automatic/magrifle_e/nopin
- category = list("Weapons")
- departmental_flags = DEPARTMENTAL_FLAG_SECURITY
-
-/datum/design/mag_magrifle_e
- name = "Magrifle Magazine (Lethal)"
- desc = "A 24-round magazine for the Magrifle."
- id = "mag_magrifle_e"
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 8000, MAT_SILVER = 1000)
- build_path = /obj/item/ammo_box/magazine/mmag_e/lethal
- category = list("Ammo")
- departmental_flags = DEPARTMENTAL_FLAG_SECURITY
-
-/datum/design/mag_magrifle_e/nl
- name = "Magrifle Magazine (Non-Lethal)"
- desc = "A 24- round non-lethal magazine for the Magrifle."
- id = "mag_magrifle_e_nl"
- materials = list(MAT_METAL = 6000, MAT_SILVER = 500, MAT_TITANIUM = 500)
- build_path = /obj/item/ammo_box/magazine/mmag_e
- departmental_flags = DEPARTMENTAL_FLAG_SECURITY
-
-/datum/design/magpistol_e
- name = "Magpistol"
- desc = "A weapon which fires ferromagnetic slugs."
- id = "magpistol_e"
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 7500, MAT_GLASS = 1000, MAT_URANIUM = 1000, MAT_TITANIUM = 5000, MAT_SILVER = 2000)
- build_path = /obj/item/gun/ballistic/automatic/pistol/mag_e/nopin
- category = list("Weapons")
- departmental_flags = DEPARTMENTAL_FLAG_SECURITY
-
-/datum/design/mag_magpistol_e
- name = "Magpistol Magazine"
- desc = "A 14 round magazine for the Magpistol."
- id = "mag_magpistol_e"
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 4000, MAT_SILVER = 500)
- build_path = /obj/item/ammo_box/magazine/mmag_e/small/lethal
- category = list("Ammo")
- departmental_flags = DEPARTMENTAL_FLAG_SECURITY
-
-/datum/design/mag_magpistol_e/nl
- name = "Magpistol Magazine (Non-Lethal)"
- desc = "A 14 round non-lethal magazine for the Magpistol."
- id = "mag_magpistol_e_nl"
- materials = list(MAT_METAL = 3000, MAT_SILVER = 250, MAT_TITANIUM = 250)
- build_path = /obj/item/ammo_box/magazine/mmag_e/small
- departmental_flags = DEPARTMENTAL_FLAG_SECURITY
-
-/*
-// TECHWEBS IMPLEMENTATION
-*/
-
-/*
-/datum/techweb_node/magnetic_weapons
- id = "magnetic_weapons"
- display_name = "Magnetic Weapons"
- description = "Weapons using magnetic technology"
- prereq_ids = list("weaponry", "adv_weaponry", "emp_adv")
- design_ids = list("magrifle_e", "magpistol_e", "mag_magrifle_e", "mag_magrifle_e_nl", "mag_magpistol_e", "mag_magpistol_e_nl")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
-*/
-
-///magrifle///
-
-/obj/item/gun/ballistic/automatic/magrifle_e
- name = "\improper Magnetic Rifle"
- desc = "A simple upscalling of the technologies used in the magpistol, the magrifle is capable of firing slightly larger slugs in bursts. Compatible with the magpistol's slugs."
- icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
- icon_state = "magrifle"
- item_state = "arg"
- slot_flags = 0
- mag_type = /obj/item/ammo_box/magazine/mmag_e
- fire_sound = 'sound/weapons/magrifle.ogg'
- can_suppress = 0
- burst_size = 3
- fire_delay = 2
- spread = 5
- recoil = 0.15
- casing_ejector = 0
- var/obj/item/stock_parts/cell/cell
- var/cell_type = /obj/item/stock_parts/cell/magrifle_e
- var/dead_cell = FALSE
-
-/obj/item/gun/ballistic/automatic/magrifle_e/examine(mob/user)
- . = ..()
- if(cell)
- . += "[src]'s cell is [round(cell.charge / cell.maxcharge, 0.1) * 100]% full."
- else
- . += "[src] doesn't seem to have a cell!"
-
-/obj/item/gun/ballistic/automatic/magrifle_e/can_shoot()
- if(QDELETED(cell))
- return 0
-
- var/obj/item/ammo_casing/caseless/mag_e/shot = chambered
- if(!shot)
- return 0
- if(cell.charge < shot.energy_cost*burst_size)
- return 0
- . = ..()
-
-/obj/item/gun/ballistic/automatic/magrifle_e/shoot_live_shot()
- var/obj/item/ammo_casing/caseless/mag_e/shot = chambered
- cell.use(shot.energy_cost)
- . = ..()
-
-/obj/item/gun/ballistic/automatic/magrifle_e/emp_act(severity)
- . = ..()
- if(!(. & EMP_PROTECT_CONTENTS))
- cell.use(round(cell.charge / severity))
-
-/obj/item/gun/ballistic/automatic/magrifle_e/get_cell()
- return cell
-
-/obj/item/gun/ballistic/automatic/magrifle_e/Initialize()
- . = ..()
- if(cell_type)
- cell = new cell_type(src)
- else
- cell = new(src)
-
- if(!dead_cell)
- cell.give(cell.maxcharge)
-
-/obj/item/gun/ballistic/automatic/magrifle_e/nopin
- pin = null
- spawnwithmagazine = FALSE
-
-///magpistol///
-
-/obj/item/gun/ballistic/automatic/pistol/mag_e
- name = "magpistol"
- desc = "A handgun utilizing maglev technologies to propel a ferromagnetic slug to extreme velocities."
- icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
- icon_state = "magpistol"
- force = 10
- fire_sound = 'sound/weapons/magpistol.ogg'
- mag_type = /obj/item/ammo_box/magazine/mmag_e/small
- can_suppress = 0
- casing_ejector = 0
- fire_delay = 2
- recoil = 0.2
- var/obj/item/stock_parts/cell/cell
- var/cell_type = /obj/item/stock_parts/cell/magpistol_e
- var/dead_cell = FALSE
-
-/obj/item/gun/ballistic/automatic/pistol/mag_e/examine(mob/user)
- . = ..()
- if(cell)
- . += "[src]'s cell is [round(cell.charge / cell.maxcharge, 0.1) * 100]% full."
- else
- . += "[src] doesn't seem to have a cell!"
-
-/obj/item/gun/ballistic/automatic/pistol/mag_e/can_shoot()
- if(QDELETED(cell))
- return 0
-
- var/obj/item/ammo_casing/caseless/mag_e/shot = chambered
- if(!shot)
- return 0
- if(cell.charge < shot.energy_cost)
- return 0
- . = ..()
-
-/obj/item/gun/ballistic/automatic/pistol/mag_e/shoot_live_shot()
- var/obj/item/ammo_casing/caseless/mag_e/shot = chambered
- cell.use(shot.energy_cost)
- . = ..()
-
-/obj/item/gun/ballistic/automatic/pistol/mag_e/emp_act(severity)
- . = ..()
- if(!(. & EMP_PROTECT_CONTENTS))
- cell.use(round(cell.charge / severity))
-
-/obj/item/gun/ballistic/automatic/pistol/mag_e/get_cell()
- return cell
-
-/obj/item/gun/ballistic/automatic/pistol/mag_e/Initialize()
- . = ..()
- if(cell_type)
- cell = new cell_type(src)
- else
- cell = new(src)
-
- if(!dead_cell)
- cell.give(cell.maxcharge)
-
-/obj/item/gun/ballistic/automatic/pistol/mag_e/update_icon()
- ..()
- if(magazine)
- cut_overlays()
- add_overlay("magpistol-magazine")
- else
- cut_overlays()
- icon_state = "[initial(icon_state)][chambered ? "" : "-e"]"
-
-/obj/item/gun/ballistic/automatic/pistol/mag_e/nopin
- pin = null
- spawnwithmagazine = FALSE
diff --git a/modular_citadel/code/modules/projectiles/guns/ballistic/rifles.dm b/modular_citadel/code/modules/projectiles/guns/ballistic/rifles.dm
index 024669757a..37198e87cf 100644
--- a/modular_citadel/code/modules/projectiles/guns/ballistic/rifles.dm
+++ b/modular_citadel/code/modules/projectiles/guns/ballistic/rifles.dm
@@ -16,6 +16,29 @@
spread = 30 //should be 40 for XCOM memes, but since its adminspawn only, might as well make it useable
recoil = 1
+///toy memes///
+
+/obj/item/ammo_box/magazine/toy/x9
+ name = "foam force X9 magazine"
+ icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
+ icon_state = "toy9magazine"
+ max_ammo = 30
+ multiple_sprites = 2
+ materials = list(MAT_METAL = 200)
+
+/obj/item/gun/ballistic/automatic/x9/toy
+ name = "\improper Foam Force X9"
+ desc = "An old but reliable assault rifle made for combat against unknown enemies. Appears to be hastily converted. Ages 8 and up."
+ icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
+ icon_state = "toy9"
+ can_suppress = 0
+ obj_flags = 0
+ mag_type = /obj/item/ammo_box/magazine/toy/x9
+ casing_ejector = 0
+ spread = 90 //MAXIMUM XCOM MEMES (actually that'd be 180 spread)
+ w_class = WEIGHT_CLASS_BULKY
+ weapon_weight = WEAPON_HEAVY
+
///////security rifles special ammo///////
/obj/item/ammo_casing/c46x30mm/rubber
diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm
index f935fc5092..2364c617f0 100644
--- a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm
+++ b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm
@@ -191,7 +191,7 @@ Creating a chem with a low purity will make you permanently fall in love with so
var/obj/item/organ/vocal_cords/Vc = M.getorganslot(ORGAN_SLOT_VOICE)
var/obj/item/organ/vocal_cords/nVc = new /obj/item/organ/vocal_cords/velvet
if(Vc)
- Vc.Remove(M)
+ Vc.Remove()
nVc.Insert(M)
qdel(Vc)
to_chat(M, "You feel your vocal chords tingle you speak in a more charasmatic and sultry tone.")
diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm
index 87615ccb68..5f9ea5924d 100644
--- a/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm
+++ b/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm
@@ -94,7 +94,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
//I seriously wonder if anyone will ever use this function.
if(M.getorganslot(ORGAN_SLOT_ZOMBIE))//sure, it "treats" it, but "you've" still got it. Doesn't always work as well; needs a ghost.
var/obj/item/organ/zombie_infection/ZI = M.getorganslot(ORGAN_SLOT_ZOMBIE)
- ZI.Remove(M)
+ ZI.Remove()
ZI.Insert(SM)
log_game("FERMICHEM: [M] ckey: [M.key]'s zombie_infection has been transferred to their clone")
diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm
index e9c5733584..fb5574855e 100644
--- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm
+++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm
@@ -129,7 +129,7 @@
if(16)
T = M.getorganslot(ORGAN_SLOT_TONGUE)
var/obj/item/organ/tongue/nT = new /obj/item/organ/tongue/fluffy
- T.Remove(M)
+ T.Remove()
nT.Insert(M)
T.moveToNullspace()//To valhalla
to_chat(M, "Your tongue feels... weally fwuffy!!")
@@ -152,7 +152,7 @@
/datum/reagent/fermi/furranium/on_mob_delete(mob/living/carbon/M)
if(cached_purity < 0.95)//Only permanent if you're a good chemist.
nT = M.getorganslot(ORGAN_SLOT_TONGUE)
- nT.Remove(M)
+ nT.Remove()
qdel(nT)
T.Insert(M)
to_chat(M, "You feel your tongue.... unfluffify...?")
diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm
index 8668ef76f0..d98ec7059d 100644
--- a/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm
+++ b/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm
@@ -29,7 +29,7 @@
nT = new C.dna.species.mutanttongue()
else
nT = new()
- T.Remove(C)
+ T.Remove()
qdel(T)
nT.Insert(C)
to_chat(C, "You feel your tongue.... unfluffify...?")
@@ -57,7 +57,7 @@
T = new C.dna.species.mutanttongue()
else
T = new()
- oT.Remove(C)
+ oT.Remove()
qdel(oT)
T.Insert(C)
to_chat(C, "You feel your tongue.... unfluffify...?")
diff --git a/modular_citadel/icons/obj/guns/cit_guns.dmi b/modular_citadel/icons/obj/guns/cit_guns.dmi
index bd48d8edbd..79b54d27fb 100644
Binary files a/modular_citadel/icons/obj/guns/cit_guns.dmi and b/modular_citadel/icons/obj/guns/cit_guns.dmi differ
diff --git a/tgstation.dme b/tgstation.dme
index b5f5442d67..75312c3879 100755
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -2577,6 +2577,7 @@
#include "code\modules\projectiles\ammunition\ballistic\smg.dm"
#include "code\modules\projectiles\ammunition\ballistic\sniper.dm"
#include "code\modules\projectiles\ammunition\caseless\_caseless.dm"
+#include "code\modules\projectiles\ammunition\caseless\ferromagnetic.dm"
#include "code\modules\projectiles\ammunition\caseless\foam.dm"
#include "code\modules\projectiles\ammunition\caseless\misc.dm"
#include "code\modules\projectiles\ammunition\caseless\rocket.dm"
@@ -2596,6 +2597,7 @@
#include "code\modules\projectiles\boxes_magazines\ammo_boxes.dm"
#include "code\modules\projectiles\boxes_magazines\external\grenade.dm"
#include "code\modules\projectiles\boxes_magazines\external\lmg.dm"
+#include "code\modules\projectiles\boxes_magazines\external\magweapon.dm"
#include "code\modules\projectiles\boxes_magazines\external\pistol.dm"
#include "code\modules\projectiles\boxes_magazines\external\rechargable.dm"
#include "code\modules\projectiles\boxes_magazines\external\rifle.dm"
@@ -2617,6 +2619,7 @@
#include "code\modules\projectiles\guns\ballistic\automatic.dm"
#include "code\modules\projectiles\guns\ballistic\laser_gatling.dm"
#include "code\modules\projectiles\guns\ballistic\launchers.dm"
+#include "code\modules\projectiles\guns\ballistic\magweapon.dm"
#include "code\modules\projectiles\guns\ballistic\pistol.dm"
#include "code\modules\projectiles\guns\ballistic\revolver.dm"
#include "code\modules\projectiles\guns\ballistic\shotgun.dm"
@@ -2647,6 +2650,7 @@
#include "code\modules\projectiles\projectile\bullets\_incendiary.dm"
#include "code\modules\projectiles\projectile\bullets\dart_syringe.dm"
#include "code\modules\projectiles\projectile\bullets\dnainjector.dm"
+#include "code\modules\projectiles\projectile\bullets\ferromagnetic.dm"
#include "code\modules\projectiles\projectile\bullets\grenade.dm"
#include "code\modules\projectiles\projectile\bullets\lmg.dm"
#include "code\modules\projectiles\projectile\bullets\pistol.dm"
@@ -3176,8 +3180,6 @@
#include "modular_citadel\code\modules\projectiles\guns\pumpenergy.dm"
#include "modular_citadel\code\modules\projectiles\guns\toys.dm"
#include "modular_citadel\code\modules\projectiles\guns\ballistic\handguns.dm"
-#include "modular_citadel\code\modules\projectiles\guns\ballistic\magweapon.dm"
-#include "modular_citadel\code\modules\projectiles\guns\ballistic\magweapon_energy.dm"
#include "modular_citadel\code\modules\projectiles\guns\ballistic\rifles.dm"
#include "modular_citadel\code\modules\projectiles\guns\ballistic\spinfusor.dm"
#include "modular_citadel\code\modules\projectiles\guns\energy\energy_gun.dm"
diff --git a/tgui-next/packages/tgui/interfaces/AtmosRelief.js b/tgui-next/packages/tgui/interfaces/AtmosRelief.js
new file mode 100644
index 0000000000..4654ec6582
--- /dev/null
+++ b/tgui-next/packages/tgui/interfaces/AtmosRelief.js
@@ -0,0 +1,54 @@
+import { useBackend } from '../backend';
+import { Button, LabeledList, NumberInput, Section } from '../components';
+
+export const AtmosRelief = props => {
+ const { act, data } = useBackend(props);
+ return (
+
+
+
+ act('open_pressure', {
+ open_pressure: value,
+ })} />
+
+
+ act('close_pressure', {
+ close_pressure: value,
+ })} />
+
+
+
+ );
+};
diff --git a/tgui-next/packages/tgui/routes.js b/tgui-next/packages/tgui/routes.js
index 6193d4e062..4563d0e95b 100644
--- a/tgui-next/packages/tgui/routes.js
+++ b/tgui-next/packages/tgui/routes.js
@@ -88,6 +88,7 @@ import { ThermoMachine } from './interfaces/ThermoMachine';
import { TurbineComputer } from './interfaces/TurbineComputer';
import { VaultController } from './interfaces/VaultController';
import { Wires } from './interfaces/Wires';
+import { AtmosRelief } from './interfaces/AtmosRelief';
const ROUTES = {
achievements: {
@@ -130,6 +131,10 @@ const ROUTES = {
component: () => AtmosPump,
scrollable: false,
},
+ atmos_relief: {
+ component: () => AtmosRelief,
+ scrollable: false,
+ },
bepis: {
component: () => Bepis,
scrollable: false,