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 += "
1
" var/char = "" - var/ui_text = viable_occupant.dna.uni_identity - var/len_byte = length(ui_text) + var/se_text = viable_occupant.dna.struc_enzymes + var/len_byte = length(se_text) var/char_it = 0 for(var/byte_it = 1, byte_it <= len_byte, byte_it += length(char)) + char_it++ + char = se_text[byte_it] temp_html += "[char]" if((char_it % max_line_len) == 0) 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, + })} /> +
+ ); +}; 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,