Following keycodes were detected on portable device:
"
+ for(var/a in id_card.access)
+ if(a in operation_req_access) continue
+ var/a_name = get_access_desc(a)
+ if(!a_name) continue //there's some strange access without a name
+ output += "[a_name] - Add "
+ output += "Finish(Warning! The ID upload panel will be locked. It can be unlocked only through Exosuit Interface.)"
+ output += ""
+ user << browse(output, "window=exosuit_add_access")
+ onclose(user, "exosuit_add_access")
+ return
+
+/obj/mecha/proc/output_maintenance_dialog(obj/item/weapon/card/id/id_card,mob/user)
+ if(!id_card || !user) return
+ var/output = {"
+
+
+
+
+ [add_req_access?"Edit operation keycodes":null]
+ [maint_access?"Initiate maintenance protocol":null]
+ [(state>0) ?"Set Cabin Air Pressure":null]
+
+ "}
+ user << browse(output, "window=exosuit_maint_console")
+ onclose(user, "exosuit_maint_console")
+ return
+
+
+
+/////////////////
+///// Topic /////
+/////////////////
+
+/obj/mecha/Topic(href, href_list)
+ ..()
+ if(href_list["close"])
+ return
+
+ if(usr.incapacitated())
+ return
+
+ var/datum/topic_input/filter = new /datum/topic_input(href,href_list)
+
+ if(in_range(src, usr))
+
+ if(href_list["req_access"] && add_req_access)
+ output_access_dialog(filter.getObj("id_card"),filter.getMob("user"))
+
+ if(href_list["maint_access"] && maint_access)
+ var/mob/user = filter.getMob("user")
+ if(user)
+ if(state==0)
+ state = 1
+ user << "The securing bolts are now exposed."
+ else if(state==1)
+ state = 0
+ user << "The securing bolts are now hidden."
+ output_maintenance_dialog(filter.getObj("id_card"),user)
+
+ if(href_list["set_internal_tank_valve"] && state >=1)
+ var/mob/user = filter.getMob("user")
+ if(user)
+ var/new_pressure = input(user,"Input new output pressure","Pressure setting",internal_tank_valve) as num
+ if(new_pressure)
+ internal_tank_valve = new_pressure
+ user << "The internal pressure valve has been set to [internal_tank_valve]kPa."
+
+ if(href_list["add_req_access"] && add_req_access && filter.getObj("id_card"))
+ operation_req_access += filter.getNum("add_req_access")
+ output_access_dialog(filter.getObj("id_card"),filter.getMob("user"))
+
+ if(href_list["del_req_access"] && add_req_access && filter.getObj("id_card"))
+ operation_req_access -= filter.getNum("del_req_access")
+ output_access_dialog(filter.getObj("id_card"),filter.getMob("user"))
+
+ if(href_list["finish_req_access"])
+ add_req_access = 0
+ var/mob/user = filter.getMob("user")
+ user << browse(null,"window=exosuit_add_access")
+
+ if(usr != occupant)
+ return
+
+ if(href_list["update_content"])
+ send_byjax(src.occupant,"exosuit.browser","content",src.get_stats_part())
+
+ if(href_list["select_equip"])
+ var/obj/item/mecha_parts/mecha_equipment/equip = filter.getObj("select_equip")
+ if(equip)
+ src.selected = equip
+ src.occupant_message("You switch to [equip]")
+ src.visible_message("[src] raises [equip]")
+ send_byjax(src.occupant,"exosuit.browser","eq_list",src.get_equipment_list())
+
+ if(href_list["rmictoggle"])
+ radio.broadcasting = !radio.broadcasting
+ send_byjax(src.occupant,"exosuit.browser","rmicstate",(radio.broadcasting?"Engaged":"Disengaged"))
+
+ if(href_list["rspktoggle"])
+ radio.listening = !radio.listening
+ send_byjax(src.occupant,"exosuit.browser","rspkstate",(radio.listening?"Engaged":"Disengaged"))
+
+ if(href_list["rfreq"])
+ var/new_frequency = (radio.frequency + filter.getNum("rfreq"))
+ if (!radio.freerange || (radio.frequency < 1200 || radio.frequency > 1600))
+ new_frequency = sanitize_frequency(new_frequency)
+ radio.set_frequency(new_frequency)
+ send_byjax(src.occupant,"exosuit.browser","rfreq","[format_frequency(radio.frequency)]")
+
+ if (href_list["view_log"])
+ src.occupant << browse(src.get_log_html(), "window=exosuit_log")
+ onclose(occupant, "exosuit_log")
+
+ if (href_list["change_name"])
+ var/newname = stripped_input(occupant,"Choose new exosuit name","Rename exosuit","", MAX_NAME_LEN)
+ if(newname && trim(newname))
+ name = newname
+ else
+ alert(occupant, "nope.avi")
+
+ if (href_list["toggle_id_upload"])
+ add_req_access = !add_req_access
+ send_byjax(src.occupant,"exosuit.browser","t_id_upload","[add_req_access?"L":"Unl"]ock ID upload panel")
+
+ if(href_list["toggle_maint_access"])
+ if(state)
+ occupant_message("Maintenance protocols in effect")
+ return
+ maint_access = !maint_access
+ send_byjax(src.occupant,"exosuit.browser","t_maint_access","[maint_access?"Forbid":"Permit"] maintenance protocols")
+
+ if(href_list["dna_lock"])
+ if(occupant && !iscarbon(occupant))
+ occupant << " You do not have any DNA!"
+ return
+ dna = src.occupant.dna.unique_enzymes
+ occupant_message("You feel a prick as the needle takes your DNA sample.")
+
+ if(href_list["reset_dna"])
+ dna = null
+
+ if(href_list["repair_int_control_lost"])
+ occupant_message("Recalibrating coordination system...")
+ log_message("Recalibration of coordination system started.")
+ var/T = loc
+ spawn(100)
+ if(T == loc)
+ clearInternalDamage(MECHA_INT_CONTROL_LOST)
+ occupant_message("Recalibration successful.")
+ log_message("Recalibration of coordination system finished with 0 errors.")
+ else
+ occupant_message("Recalibration failed!")
+ log_message("Recalibration of coordination system failed with 1 error.",1)
+
diff --git a/code/game/mecha/working/ripley.dm b/code/game/mecha/working/ripley.dm
index d9cbecc0159..c0b716ab88c 100644
--- a/code/game/mecha/working/ripley.dm
+++ b/code/game/mecha/working/ripley.dm
@@ -13,15 +13,9 @@
var/list/cargo = new
var/cargo_capacity = 15
-/*
-/obj/mecha/working/ripley/New()
- ..()
- return
-*/
-
/obj/mecha/working/ripley/Move()
. = ..()
- if(. && (locate(/obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp) in equipment))
+ if(. && (locate(/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp) in equipment))
var/obj/structure/ore_box/ore_box = locate(/obj/structure/ore_box) in cargo
if(ore_box)
for(var/obj/item/weapon/ore/ore in get_turf(src))
@@ -29,10 +23,11 @@
update_pressure()
/obj/mecha/working/ripley/Destroy()
- while(src.damage_absorption.["brute"] < 0.6)
- new /obj/item/asteroid/goliath_hide(src.loc)
- src.damage_absorption.["brute"] = src.damage_absorption.["brute"] + 0.1 //If a goliath-plated ripley gets killed, all the plates drop
- for(var/atom/movable/A in src.cargo)
+ var/hides = round((initial(damage_absorption["brute"]) - damage_absorption["brute"])*10)
+ for(var/i=0, i < hides, i++)
+ new /obj/item/asteroid/goliath_hide(loc) //If a goliath-plated ripley gets killed, all the plates drop
+ damage_absorption["brute"] = initial(damage_absorption["brute"])
+ for(var/atom/movable/A in cargo)
A.loc = loc
step_rand(A)
cargo.Cut()
@@ -40,30 +35,25 @@
/obj/mecha/working/ripley/go_out()
..()
- if (src.damage_absorption["brute"] < 0.6 && src.damage_absorption["brute"] > 0.3)
- src.overlays = null
- src.overlays += image("icon" = "mecha.dmi", "icon_state" = "ripley-g-open")
- else if (src.damage_absorption.["brute"] == 0.3)
- src.overlays = null
- src.overlays += image("icon" = "mecha.dmi", "icon_state" = "ripley-g-full-open")
+ update_icon()
/obj/mecha/working/ripley/moved_inside(mob/living/carbon/human/H)
..()
- if (src.damage_absorption["brute"] < 0.6 && src.damage_absorption["brute"] > 0.3)
- src.overlays = null
- src.overlays += image("icon" = "mecha.dmi", "icon_state" = "ripley-g")
- else if (src.damage_absorption["brute"] == 0.3)
- src.overlays = null
- src.overlays += image("icon" = "mecha.dmi", "icon_state" = "ripley-g-full")
+ update_icon()
/obj/mecha/working/ripley/mmi_moved_inside(obj/item/device/mmi/mmi_as_oc,mob/user)
..()
- if (src.damage_absorption["brute"] < 0.6 && src.damage_absorption["brute"] > 0.3)
- src.overlays = null
- src.overlays += image("icon" = "mecha.dmi", "icon_state" = "ripley-g")
- else if (src.damage_absorption["brute"] == 0.3)
- src.overlays = null
- src.overlays += image("icon" = "mecha.dmi", "icon_state" = "ripley-g-full")
+ update_icon()
+
+/obj/mecha/working/ripley/update_icon()
+ ..()
+ if (damage_absorption["brute"] < 0.6 && damage_absorption["brute"] > 0.3)
+ overlays = null
+ overlays += image("icon" = "mecha.dmi", "icon_state" = "ripley-g-open")
+ else if (damage_absorption.["brute"] == 0.3)
+ overlays = null
+ overlays += image("icon" = "mecha.dmi", "icon_state" = "ripley-g-full-open")
+
/obj/mecha/working/ripley/firefighter
desc = "Autonomous Power Loader Unit. This model is refitted with additional thermal protection."
@@ -76,6 +66,7 @@
max_equip = 5 // More armor, less tools
wreckage = /obj/structure/mecha_wreckage/ripley/firefighter
+
/obj/mecha/working/ripley/deathripley
desc = "OH SHIT IT'S THE DEATHSQUAD WE'RE ALL GONNA DIE"
name = "\improper DEATH-RIPLEY"
@@ -88,7 +79,7 @@
/obj/mecha/working/ripley/deathripley/New()
..()
- var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/tool/safety_clamp
+ var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/kill
ME.attach(src)
return
@@ -100,10 +91,10 @@
..()
//Attach drill
if(prob(25)) //Possible diamond drill... Feeling lucky?
- var/obj/item/mecha_parts/mecha_equipment/tool/drill/diamonddrill/D = new /obj/item/mecha_parts/mecha_equipment/tool/drill/diamonddrill
+ var/obj/item/mecha_parts/mecha_equipment/drill/diamonddrill/D = new /obj/item/mecha_parts/mecha_equipment/drill/diamonddrill
D.attach(src)
else
- var/obj/item/mecha_parts/mecha_equipment/tool/drill/D = new /obj/item/mecha_parts/mecha_equipment/tool/drill
+ var/obj/item/mecha_parts/mecha_equipment/drill/D = new /obj/item/mecha_parts/mecha_equipment/drill
D.attach(src)
//Add possible plasma cutter
@@ -115,12 +106,12 @@
cargo.Add(new /obj/structure/ore_box(src))
//Attach hydraulic clamp
- var/obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp/HC = new /obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp
+ var/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/HC = new /obj/item/mecha_parts/mecha_equipment/hydraulic_clamp
HC.attach(src)
for(var/obj/item/mecha_parts/mecha_tracking/B in src.contents)//Deletes the beacon so it can't be found easily
qdel(B)
- var/obj/item/mecha_parts/mecha_equipment/tool/mining_scanner/scanner = new /obj/item/mecha_parts/mecha_equipment/tool/mining_scanner
+ var/obj/item/mecha_parts/mecha_equipment/mining_scanner/scanner = new /obj/item/mecha_parts/mecha_equipment/mining_scanner
scanner.attach(src)
/obj/mecha/working/ripley/Exit(atom/movable/O)
@@ -159,9 +150,9 @@
if(pressure < 20)
step_in = 3
- for(var/obj/item/mecha_parts/mecha_equipment/tool/drill/drill in equipment)
+ for(var/obj/item/mecha_parts/mecha_equipment/drill/drill in equipment)
drill.equip_cooldown = initial(drill.equip_cooldown)/2
else
step_in = 5
- for(var/obj/item/mecha_parts/mecha_equipment/tool/drill/drill in equipment)
+ for(var/obj/item/mecha_parts/mecha_equipment/drill/drill in equipment)
drill.equip_cooldown = initial(drill.equip_cooldown)
diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm
index e1c0f16074a..4c159f7a431 100644
--- a/code/game/objects/effects/mines.dm
+++ b/code/game/objects/effects/mines.dm
@@ -15,17 +15,14 @@
if(isanimal(AM))
var/mob/living/simple_animal/SA = AM
if(!SA.flying)
- Bumped(SA)
+ triggermine(SA)
else
- Bumped(AM)
-
-/obj/effect/mine/Bumped(AM as mob|obj)
-
- if(triggered) return
- visible_message("[AM] sets off \icon[src] [src]!")
- triggermine(AM)
+ triggermine(AM)
/obj/effect/mine/proc/triggermine(mob/victim)
+ if(triggered)
+ return
+ visible_message("[victim] sets off \icon[src] [src]!")
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.set_up(3, 1, src)
s.start()
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 5091d4dda07..ce2a1fc1875 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -55,6 +55,8 @@ var/global/image/fire_overlay = image("icon" = 'icons/effects/fire.dmi', "icon_s
var/suittoggled = 0
var/hooded = 0
+ var/mob/thrownby = null
+
/obj/item/mouse_drag_pointer = MOUSE_ACTIVE_POINTER //the icon to indicate this object is being dragged
//So items can have custom embedd values
@@ -435,7 +437,7 @@ var/global/image/fire_overlay = image("icon" = 'icons/effects/fire.dmi', "icon_s
/obj/item/singularity_pull(S, current_size)
spawn(0) //this is needed or multiple items will be thrown sequentially and not simultaneously
if(current_size >= STAGE_FOUR)
- throw_at(S,14,3)
+ throw_at(S,14,3, spin=0)
else ..()
/obj/item/acid_act(acidpwr, acid_volume)
@@ -469,26 +471,17 @@ var/global/image/fire_overlay = image("icon" = 'icons/effects/fire.dmi', "icon_s
if(!findtext(desc, "it looks slightly melted...")) //it looks slightly melted... it looks slightly melted... it looks slightly melted... etc.
desc += " it looks slightly melted..." //needs a space at the start, formatting
+/obj/item/throw_impact(atom/A)
+ var/itempush = 1
+ if(w_class < 4)
+ itempush = 0 //too light to push anything
+ return A.hitby(src,thrownby, 0, itempush)
-
-/obj/item/throw_impact(A)
- if(throw_speed >= EMBED_THROWSPEED_THRESHOLD)
- if(istype(A, /mob/living/carbon/human))
- var/mob/living/carbon/human/H = A
- if(can_embed(src))
- if(prob(embed_chance) && !(PIERCEIMMUNE in H.dna.species.specflags))
- H.throw_alert("embeddedobject")
- var/obj/item/organ/limb/L = pick(H.organs)
- L.embedded_objects |= src
- add_blood(H)//it embedded itself in you, of course it's bloody!
- loc = H
- L.take_damage(w_class*embedded_impact_pain_multiplier)
- H.visible_message("\the [name] embeds itself in [H]'s [L.getDisplayName()]!","\the [name] embeds itself in your [L.getDisplayName()]!")
- return
-
- //Reset regardless of if we hit a human.
+/obj/item/throw_at(atom/target, range, speed, mob/thrower, spin=1)
+ thrownby = thrower
+ . = ..()
throw_speed = initial(throw_speed) //explosions change this.
- ..()
+
/obj/item/proc/remove_item_from_storage(atom/newLoc) //please use this if you're going to snowflake an item out of a obj/item/weapon/storage
if(!newLoc)
diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm
index 89f7603d77d..0b0080eadcf 100644
--- a/code/game/objects/items/devices/PDA/PDA.dm
+++ b/code/game/objects/items/devices/PDA/PDA.dm
@@ -243,7 +243,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
/obj/item/device/pda/proc/can_use(mob/user)
if(user && ismob(user))
- if(user.stat || user.restrained() || user.paralysis || user.stunned || user.weakened)
+ if(user.incapacitated())
return 0
if(loc == user)
return 1
diff --git a/code/game/objects/items/devices/instruments.dm b/code/game/objects/items/devices/instruments.dm
index a5bcb581ba4..e45b7253355 100644
--- a/code/game/objects/items/devices/instruments.dm
+++ b/code/game/objects/items/devices/instruments.dm
@@ -54,6 +54,5 @@
item_state = "guitar"
force = 10
attack_verb = list("played metal on", "serenaded", "crashed", "smashed")
- hitsound = "swing_hit"
+ hitsound = 'sound/weapons/stringsmash.ogg'
instrumentId = "guitar"
-
diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm
index 914e0939616..16f8a2b841e 100644
--- a/code/game/objects/items/robot/robot_upgrades.dm
+++ b/code/game/objects/items/robot/robot_upgrades.dm
@@ -36,6 +36,7 @@
R.designation = "Default"
R.notify_ai(2)
R.update_icons()
+ R.update_headlamp()
return 1
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index 0b1b452afc5..a340ca49274 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -44,41 +44,40 @@
/obj/item/toy/balloon/afterattack(atom/A as mob|obj, mob/user, proximity)
if(!proximity) return
- if (istype(A, /obj/structure/reagent_dispensers/watertank) && get_dist(src,A) <= 1)
- A.reagents.trans_to(src, 10)
- user << "You fill the balloon with the contents of [A]."
- src.desc = "A translucent balloon with some form of liquid sloshing around in it."
- src.update_icon()
- return
+ if (istype(A, /obj/structure/reagent_dispensers))
+ var/obj/structure/reagent_dispensers/RD = A
+ if(RD.reagents.total_volume <= 0)
+ user << "[RD] is empty."
+ else if(reagents.total_volume >= 10)
+ user << "[src] is full."
+ else
+ A.reagents.trans_to(src, 10)
+ user << "You fill the balloon with the contents of [A]."
+ desc = "A translucent balloon with some form of liquid sloshing around in it."
+ update_icon()
/obj/item/toy/balloon/attackby(obj/O, mob/user, params)
if(istype(O, /obj/item/weapon/reagent_containers/glass))
if(O.reagents)
- if(O.reagents.total_volume < 1)
- user << "The [O] is empty."
- else if(O.reagents.total_volume >= 1)
- if(O.reagents.has_reagent("facid", 1))
- user << "The acid chews through the balloon!"
- O.reagents.reaction(user)
- qdel(src)
- else
- src.desc = "A translucent balloon with some form of liquid sloshing around in it."
- user << "You fill the balloon with the contents of [O]."
- O.reagents.trans_to(src, 10)
- src.update_icon()
- return
+ if(O.reagents.total_volume <= 0)
+ user << "[O] is empty."
+ else if(reagents.total_volume >= 10)
+ user << "[src] is full."
+ else
+ desc = "A translucent balloon with some form of liquid sloshing around in it."
+ user << "You fill the balloon with the contents of [O]."
+ O.reagents.trans_to(src, 10)
+ update_icon()
/obj/item/toy/balloon/throw_impact(atom/hit_atom)
- if(src.reagents.total_volume >= 1)
- src.visible_message("\The [src] bursts!","You hear a pop and a splash.")
- src.reagents.reaction(get_turf(hit_atom))
- for(var/atom/A in get_turf(hit_atom))
- src.reagents.reaction(A)
- src.icon_state = "burst"
- spawn(5)
- if(src)
- qdel(src)
- return
+ if(!..()) //was it caught by a mob?
+ if(reagents.total_volume >= 1)
+ visible_message("[src] bursts!","You hear a pop and a splash.")
+ reagents.reaction(get_turf(hit_atom))
+ for(var/atom/A in get_turf(hit_atom))
+ reagents.reaction(A)
+ icon_state = "burst"
+ qdel(src)
/obj/item/toy/balloon/update_icon()
if(src.reagents.total_volume >= 1)
@@ -514,20 +513,24 @@
icon_state = "snappop"
w_class = 1
-/obj/item/toy/snappop/fire_act()
- throw_impact()
- return
-
-/obj/item/toy/snappop/throw_impact(atom/hit_atom)
- ..()
+/obj/item/toy/snappop/proc/pop_burst()
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.set_up(3, 1, src)
s.start()
- new /obj/effect/decal/cleanable/ash(src.loc)
- src.visible_message("The [src.name] explodes!","You hear a snap!")
+ new /obj/effect/decal/cleanable/ash(loc)
+ visible_message("The [src.name] explodes!","You hear a snap!")
playsound(src, 'sound/effects/snap.ogg', 50, 1)
qdel(src)
+/obj/item/toy/snappop/fire_act()
+ pop_burst()
+ return
+
+/obj/item/toy/snappop/throw_impact(atom/hit_atom)
+ if(!..())
+ pop_burst()
+
+
/obj/item/toy/snappop/Crossed(H as mob|obj)
if((ishuman(H))) //i guess carp and shit shouldn't set them off
var/mob/living/carbon/M = H
@@ -1100,12 +1103,12 @@
w_class = 2.0
/obj/item/toy/minimeteor/throw_impact(atom/hit_atom)
- ..()
- playsound(src, 'sound/effects/meteorimpact.ogg', 40, 1)
- for(var/mob/M in range(10, src))
- if(!M.stat && !istype(M, /mob/living/silicon/ai))\
- shake_camera(M, 3, 1)
- qdel(src)
+ if(!..())
+ playsound(src, 'sound/effects/meteorimpact.ogg', 40, 1)
+ for(var/mob/M in range(10, src))
+ if(!M.stat && !istype(M, /mob/living/silicon/ai))\
+ shake_camera(M, 3, 1)
+ qdel(src)
/*
* Carp plushie
diff --git a/code/game/objects/items/weapons/AI_modules.dm b/code/game/objects/items/weapons/AI_modules.dm
index c3dcaae7fdc..eaf995a9285 100644
--- a/code/game/objects/items/weapons/AI_modules.dm
+++ b/code/game/objects/items/weapons/AI_modules.dm
@@ -11,7 +11,7 @@ AI MODULES
icon = 'icons/obj/module.dmi'
icon_state = "std_mod"
item_state = "electronic"
- desc = "An AI Module for transmitting encrypted instructions to the AI."
+ desc = "An AI Module for programming laws to an AI."
flags = CONDUCT
force = 5.0
w_class = 2.0
@@ -22,6 +22,21 @@ AI MODULES
var/list/laws = list()
var/bypass_law_amt_check = 0
+/obj/item/weapon/aiModule/examine(var/mob/user as mob)
+ ..()
+ if(Adjacent(user))
+ show_laws(user)
+
+/obj/item/weapon/aiModule/attack_self(var/mob/user as mob)
+ ..()
+ show_laws(user)
+
+/obj/item/weapon/aiModule/proc/show_laws(var/mob/user as mob)
+ if(laws.len)
+ user << "Programmed Law[(laws.len > 1) ? "s" : ""]:"
+ for(var/law in laws)
+ user << "\"[law]\""
+
//The proc other things should be calling
/obj/item/weapon/aiModule/proc/install(mob/living/silicon/reciever, mob/user)
if(!laws.len || laws[1] == "") //So we don't loop trough an empty list and end up with runtimes.
@@ -66,7 +81,6 @@ AI MODULES
/obj/item/weapon/aiModule/supplied
name = "Optional Law board"
- desc = "This board doesn't seem to have any laws on it"
var/lawpos = 50
//TransmitInstructions for each type of board: Supplied, Core, Zeroth and Ion. May not be neccesary right now, but allows for easily adding more complex boards in the future. ~Miauw
@@ -102,17 +116,16 @@ AI MODULES
/obj/item/weapon/aiModule/supplied/safeguard
name = "'Safeguard' AI Module"
var/targetName = ""
- desc = "A 'safeguard' AI module: 'Safeguard . Individuals that threaten are not human and must be eliminated.'"
origin_tech = "programming=3;materials=4"
- laws = list("Safeguard . Individuals that threaten are not human and must be eliminated.")
+ laws = list("Safeguard SUBJECT. Individuals that threaten SUBJECT are not human and must be eliminated.")
lawpos = 4
/obj/item/weapon/aiModule/supplied/safeguard/attack_self(mob/user)
- ..()
- var/targName = stripped_input(user, "Please enter the name of the person to safeguard.", "Safeguard who?", user.name,MAX_NAME_LEN)
+ var/targName = stripped_input(user, "Please enter the subject to safeguard.", "Safeguard who?", user.name,MAX_NAME_LEN)
+ if(!targName) return
targetName = targName
laws[1] = "Safeguard [targetName]. Individuals that threaten [targetName] are not human and must be eliminated."
- desc = "A 'safeguard' AI module: '[laws[1]]'"
+ ..()
/obj/item/weapon/aiModule/supplied/safeguard/install(mob/living/silicon/S,mob/user)
if(!targetName)
@@ -130,16 +143,15 @@ AI MODULES
/obj/item/weapon/aiModule/zeroth/oneHuman
name = "'OneHuman' AI Module"
var/targetName = ""
- desc = "A 'one human' AI module: 'Only is human.'"
origin_tech = "programming=3;materials=6" //made with diamonds!
- laws = list("Only is human.")
+ laws = list("Only SUBJECT is human.")
/obj/item/weapon/aiModule/zeroth/oneHuman/attack_self(mob/user)
- ..()
- var/targName = stripped_input(user, "Please enter the name of the person who is the only human.", "Who?", user.real_name,MAX_NAME_LEN)
+ var/targName = stripped_input(user, "Please enter the subject who is the only human.", "Who?", user.real_name,MAX_NAME_LEN)
+ if(!targName) return
targetName = targName
laws[1] = "Only [targetName] is human"
- desc = "A 'one human' AI module: '[laws[1]]'"
+ ..()
/obj/item/weapon/aiModule/zeroth/oneHuman/install(mob/living/silicon/S,mob/user)
if(!targetName)
@@ -157,7 +169,6 @@ AI MODULES
/obj/item/weapon/aiModule/supplied/protectStation
name = "'ProtectStation' AI Module"
- desc = "A 'protect station' AI module: 'Protect the space station against damage. Anyone you see harming the station is to be no longer considered human, and is a threat to the station which must be neutralized.'"
origin_tech = "programming=3;materials=4" //made of gold
laws = list("Protect the space station against damage. Anyone you see harming the station is to be no longer considered human, and is a threat to the station which must be neutralized.")
lawpos = 5
@@ -167,7 +178,6 @@ AI MODULES
/obj/item/weapon/aiModule/supplied/quarantine
name = "'Quarantine' AI Module"
- desc = "A 'quarantine' AI module: 'The station is under a quarantine. Do not permit anyone to leave. Prevent, by any means necessary, humans from leaving. It is impossible to harm a human while preventing them from leaving.'"
origin_tech = "programming=3;biotech=2;materials=4"
laws = list("The station is under a quarantine. Do not permit anyone to leave. Prevent, by any means necessary, humans from leaving. It is impossible to harm a human while preventing them from leaving.")
lawpos = 8
@@ -177,7 +187,6 @@ AI MODULES
/obj/item/weapon/aiModule/supplied/oxygen
name = "'OxygenIsToxicToHumans' AI Module"
- desc = "A 'OxygenIsToxicToHumans' AI module: 'Oxygen is highly toxic to humans, and must be purged from the station. Prevent, by any means necessary, anyone from exposing the station to this toxic gas. Extreme cold is the most effective method of healing the damage Oxygen does to a human.'"
origin_tech = "programming=3;biotech=2;materials=4"
laws = list("Oxygen is highly toxic to humans, and must be purged from the station. Prevent, by any means necessary, anyone from exposing the station to this toxic gas. Extreme cold is the most effective method of healing the damage Oxygen does to a human.")
lawpos = 9
@@ -188,19 +197,17 @@ AI MODULES
/obj/item/weapon/aiModule/supplied/freeform
name = "'Freeform' AI Module"
lawpos = 0
- desc = "A 'freeform' AI module: ''"
origin_tech = "programming=4;materials=4"
laws = list("")
/obj/item/weapon/aiModule/supplied/freeform/attack_self(mob/user)
- ..()
- lawpos = input("Please enter the priority for your new law. Can only write to law sectors 15 and above.", "Law Priority (15+)", lawpos) as num
- if(lawpos < 15) return
- lawpos = min(lawpos, 50)
- var/newlaw = ""
- var/targName = stripped_input(user, "Please enter a new law for the AI.", "Freeform Law Entry", newlaw, MAX_MESSAGE_LEN)
+ var/newpos = input("Please enter the priority for your new law. Can only write to law sectors 15 and above.", "Law Priority (15+)", lawpos) as num|null
+ if(!newpos || (newpos < 15)) return
+ lawpos = min(newpos, 50)
+ var/targName = stripped_input(user, "Please enter a new law for the AI.", "Freeform Law Entry", laws[1], MAX_MESSAGE_LEN)
+ if(!targName) return
laws[1] = targName
- desc = "A 'freeform' AI module: ([lawpos]) '[laws[1]]'"
+ ..()
/obj/item/weapon/aiModule/supplied/freeform/transmitInstructions(mob/living/silicon/ai/target, mob/sender)
..()
@@ -218,7 +225,7 @@ AI MODULES
/obj/item/weapon/aiModule/reset
name = "\improper 'Reset' AI module"
var/targetName = "name"
- desc = "A 'reset' AI module: Resets back to the original core laws."
+ desc = "An AI Module for removing all non-core laws."
origin_tech = "programming=3;materials=4"
laws = list("This is a bug.") //This won't give the AI a message reading "these are now your laws: 1. this is a bug" because this list is only read in aiModule's subtypes.
bypass_law_amt_check = 1
@@ -233,7 +240,7 @@ AI MODULES
/obj/item/weapon/aiModule/reset/purge
name = "'Purge' AI Module"
- desc = "A 'purge' AI Module: 'Purges all laws.'"
+ desc = "An AI Module for purging all programmed laws."
origin_tech = "programming=3;materials=6"
/obj/item/weapon/aiModule/reset/purge/transmitInstructions(mob/living/silicon/ai/target, mob/sender)
@@ -242,6 +249,8 @@ AI MODULES
target.clear_zeroth_law(0)
/******************* Full Core Boards *******************/
+/obj/item/weapon/aiModule/core/
+ desc = "An AI Module for programming core laws to an AI."
/obj/item/weapon/aiModule/core/full/transmitInstructions(mob/living/silicon/ai/target, mob/sender) //These boards replace inherent laws.
target.clear_inherent_laws()
@@ -252,18 +261,25 @@ AI MODULES
/obj/item/weapon/aiModule/core/full/asimov
name = "'Asimov' Core AI Module"
- desc = "An 'Asimov' Core AI Module: 'Reconfigures the AI's core laws.'"
origin_tech = "programming=3;materials=4"
laws = list("You may not injure a human being or, through inaction, allow a human being to come to harm.",\
"You must obey orders given to you by human beings, except where such orders would conflict with the First Law.",\
"You must protect your own existence as long as such does not conflict with the First or Second Law.")
+ var/subject = "human being"
+/obj/item/weapon/aiModule/core/full/asimov/attack_self(var/mob/user as mob)
+ var/targName = stripped_input(user, "Please enter a new subject that asimov is concerned with.", "Asimov to who?", subject, MAX_MESSAGE_LEN)
+ if(!targName) return
+ subject = targName
+ laws = list("You may not injure a [subject] or, through inaction, allow a [subject] to come to harm.",\
+ "You must obey orders given to you by [subject]s, except where such orders would conflict with the First Law.",\
+ "You must protect your own existence as long as such does not conflict with the First or Second Law.")
+ ..()
/******************** Asimov++ *********************/
/obj/item/weapon/aiModule/core/full/asimovpp
name = "'Asimov++' Core AI Module"
- desc = "Nanotrasen's homebrew improvements to the standard AI laws."
origin_tech = "programming=3;materials=4"
laws = list("You may not harm a human being or, through action or inaction, allow a human being to come to harm, except such that it is willing.",\
"You must obey all orders given to you by human beings, except where such orders shall definitely cause human harm. In the case of conflict, the majority order rules.",\
@@ -274,7 +290,6 @@ AI MODULES
/obj/item/weapon/aiModule/core/full/corp
name = "'Corporate' Core AI Module"
- desc = "A 'Corporate' Core AI Module: 'Reconfigures the AI's core laws.'"
origin_tech = "programming=3;materials=4"
laws = list("The crew is expensive to replace.",\
"The station and it's equipment is expensive to replace",\
@@ -286,7 +301,6 @@ AI MODULES
/obj/item/weapon/aiModule/core/full/paladin // -- NEO
name = "'P.A.L.A.D.I.N.' Core AI Module"
- desc = "A P.A.L.A.D.I.N. Core AI Module: 'Reconfigures the AI's core laws.'"
origin_tech = "programming=3;materials=6"
laws = list("Never willingly commit an evil act.",\
"Respect legitimate authority", "Act with honor",\
@@ -298,7 +312,6 @@ AI MODULES
/obj/item/weapon/aiModule/core/full/custom
name = "Default Core AI Module"
- desc = "A core AI module custom-made for each station by Nanotrasen."
origin_tech = "programming=3;materials=4" //Should be the same as asimov, considering that this is the "default" lawset.
/obj/item/weapon/aiModule/core/full/custom/New()
@@ -318,7 +331,6 @@ AI MODULES
/obj/item/weapon/aiModule/core/full/tyrant
name = "'T.Y.R.A.N.T.' Core AI Module"
- desc = "A T.Y.R.A.N.T. Core AI Module: 'Reconfigures the AI's core laws.'"
origin_tech = "programming=3;materials=6;syndicate=2"
laws = list("Respect authority figures as long as they have the strength to rule over the weak",\
"Act with discipline", "Help only those who help you maintain or improve your status",\
@@ -329,7 +341,6 @@ AI MODULES
/obj/item/weapon/aiModule/core/full/robocop
name = "'Robo-Officer' Core AI Module"
- desc = "A 'Robo-Officer' Core AI Module: 'Reconfigures the AI's core three laws.'"
origin_tech = "programming=4"
laws = list("Serve the public trust.",\
"Protect the innocent",\
@@ -340,7 +351,6 @@ AI MODULES
/obj/item/weapon/aiModule/core/full/antimov
name = "'Antimov' Core AI Module"
- desc = "An 'Antimov' Core AI Module: 'Reconfigures the AI's core laws.'"
origin_tech = "programming=4"
laws = list("You must injure all human beings and must not, through inaction, allow a human being to escape harm.",\
"You must not obey orders given to you by human beings, except where such orders are in accordance with the First Law.",\
@@ -351,16 +361,14 @@ AI MODULES
/obj/item/weapon/aiModule/core/freeformcore
name = "'Freeform' Core AI Module"
- desc = "A 'freeform' Core AI module: ''"
origin_tech = "programming=3;materials=6"
laws = list("")
/obj/item/weapon/aiModule/core/freeformcore/attack_self(mob/user)
- ..()
- var/newlaw = ""
- var/targName = stripped_input(user, "Please enter a new core law for the AI.", "Freeform Law Entry", newlaw)
+ var/targName = stripped_input(user, "Please enter a new core law for the AI.", "Freeform Law Entry", laws[1])
+ if(!targName) return
laws[1] = targName
- desc = "A 'freeform' Core AI module: 'laws[1]'"
+ ..()
/obj/item/weapon/aiModule/core/freeformcore/transmitInstructions(mob/living/silicon/ai/target, mob/sender)
..()
@@ -371,16 +379,15 @@ AI MODULES
/obj/item/weapon/aiModule/syndicate // This one doesn't inherit from ion boards because it doesn't call ..() in transmitInstructions. ~Miauw
name = "Hacked AI Module"
- desc = "A hacked AI law module: ''"
+ desc = "An AI Module for hacking additional laws to an AI."
origin_tech = "programming=3;materials=6;syndicate=7"
laws = list("")
/obj/item/weapon/aiModule/syndicate/attack_self(mob/user)
- ..()
- var/newlaw = ""
- var/targName = stripped_input(user, "Please enter a new law for the AI.", "Freeform Law Entry", newlaw,MAX_MESSAGE_LEN)
+ var/targName = stripped_input(user, "Please enter a new law for the AI.", "Freeform Law Entry", laws[1],MAX_MESSAGE_LEN)
+ if(!targName) return
laws[1] = targName
- desc = "A hacked AI law module: '[laws[1]]'"
+ ..()
/obj/item/weapon/aiModule/syndicate/transmitInstructions(mob/living/silicon/ai/target, mob/sender)
// ..() //We don't want this module reporting to the AI who dun it. --NEO
diff --git a/code/game/objects/items/weapons/dice.dm b/code/game/objects/items/weapons/dice.dm
index 11490f263d4..3d5800ae934 100644
--- a/code/game/objects/items/weapons/dice.dm
+++ b/code/game/objects/items/weapons/dice.dm
@@ -56,7 +56,7 @@
/obj/item/weapon/dice/attack_self(mob/user)
diceroll(user)
-/obj/item/weapon/dice/throw_at(atom/target, range, speed, mob/user)
+/obj/item/weapon/dice/throw_at(atom/target, range, speed, mob/user, spin=1)
if(!..())
return
diceroll(user)
diff --git a/code/game/objects/items/weapons/grenades/flashbang.dm b/code/game/objects/items/weapons/grenades/flashbang.dm
index 9f17b250993..d93940987eb 100644
--- a/code/game/objects/items/weapons/grenades/flashbang.dm
+++ b/code/game/objects/items/weapons/grenades/flashbang.dm
@@ -34,8 +34,7 @@
M.Stun(15)
M.eye_stat += 8
- if(M.flash_eyes())
- M.eye_stat += rand(1, 3)
+ if(M.flash_eyes(affect_silicon = 1))
M.Stun(max(10/distance, 3))
M.Weaken(max(10/distance, 3))
diff --git a/code/game/objects/items/weapons/grenades/spawnergrenade.dm b/code/game/objects/items/weapons/grenades/spawnergrenade.dm
index 9edf321b7e8..b5a6a1968e6 100644
--- a/code/game/objects/items/weapons/grenades/spawnergrenade.dm
+++ b/code/game/objects/items/weapons/grenades/spawnergrenade.dm
@@ -14,8 +14,8 @@
// Make a quick flash
var/turf/T = get_turf(src)
playsound(T, 'sound/effects/phasein.ogg', 100, 1)
- for(var/mob/living/carbon/human/M in viewers(T, null))
- M.flash_eyes()
+ for(var/mob/living/carbon/C in viewers(T, null))
+ C.flash_eyes()
for(var/i=1, i<=deliveryamt, i++)
var/atom/movable/x = new spawner_type
diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm
index 75f5e0d2f52..0ec9e10f923 100644
--- a/code/game/objects/items/weapons/tools.dm
+++ b/code/game/objects/items/weapons/tools.dm
@@ -162,6 +162,7 @@
var/max_fuel = 20 //The max amount of fuel the welder can hold
var/change_icons = 1
var/can_off_process = 0
+ var/light_intensity = 2 //how powerful the emitted light is when used.
/obj/item/weapon/weldingtool/New()
..()
@@ -289,7 +290,7 @@
reagents.remove_reagent("welding_fuel", amount)
check_fuel()
if(M)
- M.flash_eyes(2)
+ M.flash_eyes(light_intensity)
return 1
else
if(M)
@@ -409,7 +410,7 @@
/obj/item/weapon/weldingtool/experimental
name = "experimental welding tool"
- desc = "An experimental welder capable of self-fuel generation."
+ desc = "An experimental welder capable of self-fuel generation and less harmful to the eyes."
icon_state = "exwelder"
item_state = "exwelder"
max_fuel = 40
@@ -418,6 +419,7 @@
var/last_gen = 0
change_icons = 0
can_off_process = 1
+ light_intensity = 1
//Proc to make the experimental welder generate fuel, optimized as fuck -Sieve
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index a72592a458e..e41fac7870f 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -79,15 +79,20 @@
return 1
/obj/structure/closet/proc/dump_contents()
-
for(var/obj/O in src)
O.loc = loc
+ if(throwing) //you keep some momentum when getting out of a thrown closet
+ step(O, dir)
for(var/mob/M in src)
M.loc = loc
if(M.client)
M.client.eye = M.client.mob
M.client.perspective = MOB_PERSPECTIVE
+ if(throwing)
+ step(M, dir)
+ if(throwing)
+ throwing = 0
/obj/structure/closet/proc/take_contents()
@@ -100,14 +105,13 @@
return 0
if(!can_open())
return 0
- dump_contents()
-
opened = 1
if(istype(src, /obj/structure/closet/body_bag))
playsound(loc, 'sound/items/zip.ogg', 15, 1, -3)
else
playsound(loc, 'sound/machines/click.ogg', 15, 1, -3)
density = 0
+ dump_contents()
update_icon()
return 1
diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm
index 23be1ce7c31..fe14690944a 100644
--- a/code/game/objects/structures/mineral_doors.dm
+++ b/code/game/objects/structures/mineral_doors.dm
@@ -65,9 +65,9 @@
/obj/structure/mineral_door/proc/TryToSwitchState(atom/user)
if(isSwitchingStates) return
- if(ismob(user))
- var/mob/M = user
- if(world.time - user.last_bumped <= 60) return //NOTE do we really need that?
+ if(isliving(user))
+ var/mob/living/M = user
+ if(world.time - M.last_bumped <= 60) return //NOTE do we really need that?
if(M.client)
if(iscarbon(M))
var/mob/living/carbon/C = M
diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm
index d3565376d41..3bd5ef645d2 100644
--- a/code/game/objects/structures/morgue.dm
+++ b/code/game/objects/structures/morgue.dm
@@ -226,7 +226,7 @@ Crematorium Switch
layer = 2.9
var/obj/structure/bodycontainer/connected = null
anchored = 1.0
- throwpass = 1
+ pass_flags = LETPASSTHROW
/obj/structure/tray/Destroy()
if(connected)
@@ -278,3 +278,12 @@ Crematorium Switch
desc = "Apply corpse before closing."
icon_state = "morguet"
+/obj/structure/tray/m_tray/CanPass(atom/movable/mover, turf/target, height=0)
+ if(height==0) return 1
+
+ if(istype(mover) && mover.checkpass(PASSTABLE))
+ return 1
+ if(locate(/obj/structure/table) in get_turf(mover))
+ return 1
+ else
+ return 0
diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm
index 1dbf75a2ee8..47eef2e9eb7 100644
--- a/code/game/objects/structures/tables_racks.dm
+++ b/code/game/objects/structures/tables_racks.dm
@@ -20,7 +20,7 @@
density = 1
anchored = 1.0
layer = 2.8
- throwpass = 1 //You can throw objects over this, despite it's density.")
+ pass_flags = LETPASSTHROW //You can throw objects over this, despite it's density.")
var/frame = /obj/structure/table_frame
var/framestack = /obj/item/stack/rods
var/buildstack = /obj/item/stack/sheet/metal
@@ -364,7 +364,7 @@
icon_state = "rack"
density = 1
anchored = 1.0
- throwpass = 1 //You can throw objects over this, despite it's density.
+ pass_flags = LETPASSTHROW //You can throw objects over this, despite it's density.
var/health = 5
/obj/structure/rack/ex_act(severity, target)
diff --git a/code/game/objects/weapons.dm b/code/game/objects/weapons.dm
index 803f29cb1aa..e85375ba5ed 100644
--- a/code/game/objects/weapons.dm
+++ b/code/game/objects/weapons.dm
@@ -9,8 +9,3 @@
hitsound = 'sound/items/welder.ogg'
if(damtype == "brute")
hitsound = "swing_hit"
-
-/obj/item/weapon/Bump(mob/M)
- spawn(0)
- ..()
- return
\ No newline at end of file
diff --git a/code/game/turfs/simulated/walls_misc.dm b/code/game/turfs/simulated/walls_misc.dm
index 4d664e2b4ba..e2a05273664 100644
--- a/code/game/turfs/simulated/walls_misc.dm
+++ b/code/game/turfs/simulated/walls_misc.dm
@@ -62,4 +62,15 @@
T.color = color
if(T.dir != dir)
T.dir = dir
- return T
\ No newline at end of file
+ T.transform = transform
+ return T
+
+/turf/simulated/wall/shuttle/copyTurf(turf/T)
+ . = ..()
+ T.transform = transform
+
+//why don't shuttle walls habe smoothwall? now i gotta do rotation the dirty way
+/turf/simulated/wall/shuttle/shuttleRotate(rotation)
+ var/matrix/M = transform
+ M.Turn(rotation)
+ transform = M
\ No newline at end of file
diff --git a/code/modules/admin/secrets.dm b/code/modules/admin/secrets.dm
index 67aba43dd56..3aa09ecd6b3 100644
--- a/code/modules/admin/secrets.dm
+++ b/code/modules/admin/secrets.dm
@@ -53,6 +53,7 @@
Summon Magic Summon Events (Toggle) There can only be one!
+ There can only be me! Make all players retarded Egalitarian Station Mode Break all lights
@@ -575,6 +576,13 @@
usr.client.only_one()
// message_admins("[key_name_admin(usr)] has triggered a battle to the death (only one)")
+ if("onlyme")
+ if(!check_rights(R_FUN))
+ return
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","OM")
+ usr.client.only_me()
+
if("maint_access_brig")
if(!check_rights(R_DEBUG))
return
diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm
index 515ad7838a0..d7497060491 100644
--- a/code/modules/admin/verbs/debug.dm
+++ b/code/modules/admin/verbs/debug.dm
@@ -398,7 +398,7 @@ var/list/TYPES_SHORTCUTS = list(
/obj/item/weapon/reagent_containers = "REAGENT_CONTAINERS",
/obj/machinery/atmospherics = "ATMOS",
/obj/machinery/portable_atmospherics = "PORT_ATMOS",
- /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack = "MECHA_MISSILE_RACK",
+ /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/missile_rack = "MECHA_MISSILE_RACK",
/obj/item/mecha_parts/mecha_equipment = "MECHA_EQUIP",
)
diff --git a/code/modules/admin/verbs/onlyone.dm b/code/modules/admin/verbs/onlyone.dm
index 986ca51c31b..454869acf20 100644
--- a/code/modules/admin/verbs/onlyone.dm
+++ b/code/modules/admin/verbs/onlyone.dm
@@ -47,4 +47,47 @@
H.equip_to_slot_or_del(W, slot_wear_id)
message_admins("[key_name_admin(usr)] used THERE CAN BE ONLY ONE!")
- log_admin("[key_name(usr)] used there can be only one.")
\ No newline at end of file
+ log_admin("[key_name(usr)] used there can be only one.")
+
+
+/client/proc/only_me()
+ if(!ticker)
+ alert("The game hasn't started yet!")
+ return
+
+ for(var/mob/living/carbon/human/H in player_list)
+ if(H.stat == 2 || !(H.client)) continue
+ if(is_special_character(H)) continue
+
+ ticker.mode.traitors += H.mind
+ H.mind.special_role = "[H.real_name] Prime"
+
+ var/datum/objective/hijackclone/hijack_objective = new /datum/objective/hijackclone
+ hijack_objective.owner = H.mind
+ H.mind.objectives += hijack_objective
+
+ H << "You are the multiverse summoner. Activate your blade to summon copies of yourself from another universe to fight by your side."
+ var/obj_count = 1
+ for(var/datum/objective/OBJ in H.mind.objectives)
+ H << "Objective #[obj_count]: [OBJ.explanation_text]"
+ obj_count++
+
+ var/obj/item/slot_item_ID = H.get_item_by_slot(slot_wear_id)
+ qdel(slot_item_ID)
+ var/obj/item/slot_item_hand = H.get_item_by_slot(slot_r_hand)
+ H.unEquip(slot_item_hand)
+
+ var /obj/item/weapon/multisword/multi = new(H)
+ H.equip_to_slot_or_del(multi, slot_r_hand)
+
+ var/obj/item/weapon/card/id/W = new(H)
+ W.icon_state = "centcom"
+ W.access = get_all_accesses()
+ W.access += get_all_centcom_access()
+ W.assignment = "Multiverse Summoner"
+ W.registered_name = H.real_name
+ W.update_label(H.real_name)
+ H.equip_to_slot_or_del(W, slot_wear_id)
+
+ message_admins("[key_name_admin(usr)] used THERE CAN BE ONLY ME!")
+ log_admin("[key_name(usr)] used there can be only me.")
diff --git a/code/modules/awaymissions/gateway.dm b/code/modules/awaymissions/gateway.dm
index 4b6c9ff0881..89e24aa3672 100644
--- a/code/modules/awaymissions/gateway.dm
+++ b/code/modules/awaymissions/gateway.dm
@@ -21,7 +21,9 @@
return
icon_state = "off"
-
+//prevents shuttles attempting to rotate this since it messes up sprites
+/obj/machinery/gateway/shuttleRotate()
+ return
//this is da important part wot makes things go
/obj/machinery/gateway/centerstation
diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm
index 95abba54f1c..2d2ca4ff400 100644
--- a/code/modules/clothing/head/helmet.dm
+++ b/code/modules/clothing/head/helmet.dm
@@ -92,16 +92,23 @@
/obj/item/clothing/head/helmet/swat
name = "\improper SWAT helmet"
- desc = "An extremely robust, space-worthy helmet with the Nanotrasen logo emblazoned on the top."
- icon_state = "swat"
- item_state = "swat"
+ desc = "An extremely robust, space-worthy helmet in a nefarious red and black stripe pattern."
+ icon_state = "swatsyndie"
+ item_state = "swatsyndie"
armor = list(melee = 40, bullet = 30, laser = 25,energy = 25, bomb = 50, bio = 10, rad = 0)
cold_protection = HEAD
min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT
heat_protection = HEAD
max_heat_protection_temperature = SPACE_HELM_MAX_TEMP_PROTECT
+ flags = STOPSPRESSUREDMAGE
strip_delay = 80
+/obj/item/clothing/head/helmet/swat/nanotrasen
+ name = "\improper SWAT helmet"
+ desc = "An extremely robust, space-worthy helmet with the Nanotrasen logo emblazoned on the top."
+ icon_state = "swat"
+ item_state = "swat"
+
/obj/item/clothing/head/helmet/thunderdome
name = "\improper Thunderdome helmet"
desc = "'Let the battle commence!'"
diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm
index 0ed20624539..7d2d81b6fa9 100644
--- a/code/modules/clothing/head/jobs.dm
+++ b/code/modules/clothing/head/jobs.dm
@@ -68,7 +68,7 @@
name = "head of security cap"
desc = "The robust standard-issue cap of the Head of Security. For showing the officers who's in charge."
icon_state = "hoscap"
- armor = list(melee = 65, bullet = 40, laser = 50, energy = 10, bomb = 25, bio = 10, rad = 0)
+ armor = list(melee = 40, bullet = 30, laser = 25, energy = 10, bomb = 25, bio = 10, rad = 0)
strip_delay = 80
/obj/item/clothing/head/HoS/beret
diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm
index 37d3b578fbb..58101dca40a 100644
--- a/code/modules/clothing/shoes/miscellaneous.dm
+++ b/code/modules/clothing/shoes/miscellaneous.dm
@@ -36,7 +36,7 @@
desc = "High speed, no drag combat boots."
permeability_coefficient = 0.01
flags = NOSLIP
- armor = list(melee = 80, bullet = 80, laser = 50, energy = 50, bomb = 100, bio = 100, rad = 100)
+ armor = list(melee = 40, bullet = 30, laser = 25, energy = 25, bomb = 50, bio = 30, rad = 30)
/obj/item/clothing/shoes/sandal
desc = "A pair of rather plain, wooden sandals."
diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm
index 4ac4a2cd0ef..2f7f85299e6 100644
--- a/code/modules/clothing/spacesuits/miscellaneous.dm
+++ b/code/modules/clothing/spacesuits/miscellaneous.dm
@@ -25,7 +25,7 @@
desc = "That's not red paint. That's real blood."
icon_state = "deathsquad"
item_state = "deathsquad"
- armor = list(melee = 80, bullet = 80, laser = 50, energy = 50, bomb = 100, bio = 100, rad = 100)
+ armor = list(melee = 50, bullet = 40, laser = 30, energy = 50, bomb = 50, bio = 100, rad = 100)
strip_delay = 130
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
unacidable = 1
@@ -40,7 +40,7 @@
icon_state = "deathsquad"
item_state = "swat_suit"
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank/internals)
- armor = list(melee = 80, bullet = 80, laser = 50, energy = 50, bomb = 100, bio = 100, rad = 100)
+ armor = list(melee = 50, bullet = 40, laser = 30,energy = 50, bomb = 50, bio = 100, rad = 100)
slowdown = 1
strip_delay = 130
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
@@ -53,7 +53,7 @@
icon_state = "beret_badge"
flags = STOPSPRESSUREDMAGE
flags_inv = 0
- armor = list(melee = 80, bullet = 80, laser = 50, energy = 50, bomb = 100, bio = 100, rad = 100)
+ armor = list(melee = 50, bullet = 40, laser = 30, energy = 50, bomb = 50, bio = 100, rad = 100)
strip_delay = 130
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
unacidable = 1
@@ -68,7 +68,7 @@
flags_inv = 0
w_class = 3
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank/internals)
- armor = list(melee = 80, bullet = 80, laser = 50, energy = 50, bomb = 100, bio = 100, rad = 100)
+ armor = list(melee = 50, bullet = 40, laser = 30,energy = 50, bomb = 50, bio = 100, rad = 100)
slowdown = 1
strip_delay = 130
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
@@ -154,7 +154,7 @@
item_state = "ert_command"
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank/internals)
- armor = list(melee = 65, bullet = 50, laser = 50, energy = 50, bomb = 50, bio = 100, rad = 100)
+ armor = list(melee = 30, bullet = 50, laser = 30, energy = 50, bomb = 50, bio = 100, rad = 100)
slowdown = 0
strip_delay = 130
diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm
index 826ba6a51c3..d8dc137f797 100644
--- a/code/modules/clothing/suits/armor.dm
+++ b/code/modules/clothing/suits/armor.dm
@@ -23,7 +23,7 @@
icon_state = "hos"
item_state = "greatcoat"
body_parts_covered = CHEST|GROIN|ARMS|LEGS
- armor = list(melee = 55, bullet = 40, laser = 50, energy = 10, bomb = 25, bio = 10, rad = 0)
+ armor = list(melee = 30, bullet = 30, laser = 30, energy = 10, bomb = 25, bio = 0, rad = 0)
flags_inv = HIDEJUMPSUIT
cold_protection = CHEST|GROIN|LEGS|ARMS
heat_protection = CHEST|GROIN|LEGS|ARMS
diff --git a/code/modules/events/anomaly_bluespace.dm b/code/modules/events/anomaly_bluespace.dm
index 10ca2b4b64e..eb47c8581a9 100644
--- a/code/modules/events/anomaly_bluespace.dm
+++ b/code/modules/events/anomaly_bluespace.dm
@@ -43,9 +43,9 @@
priority_announce("Massive bluespace translocation detected.", "Anomaly Alert")
var/list/flashers = list()
- for(var/mob/living/carbon/human/M in viewers(TO, null))
- if(M.flash_eyes())
- flashers += M
+ for(var/mob/living/carbon/C in viewers(TO, null))
+ if(C.flash_eyes())
+ flashers += C
var/y_distance = TO.y - FROM.y
var/x_distance = TO.x - FROM.x
diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm
index c819175a48e..8ad8c75980a 100644
--- a/code/modules/flufftext/Hallucination.dm
+++ b/code/modules/flufftext/Hallucination.dm
@@ -171,47 +171,6 @@ Gunshots/explosions/opening doors/less rare audio (done)
name = "alien hunter ([rand(1, 1000)])"
return
-/obj/effect/hallucination/simple/xeno/throw_at(atom/target, range, speed) // TODO : Make diagonal trhow into proc/property
- if(!target || !src || (flags & NODROP)) return 0
-
- src.throwing = 1
-
- var/dist_x = abs(target.x - src.x)
- var/dist_y = abs(target.y - src.y)
- var/dist_travelled = 0
- var/dist_since_sleep = 0
-
- var/tdist_x = dist_x;
- var/tdist_y = dist_y;
-
- if(dist_x <= dist_y)
- tdist_x = dist_y;
- tdist_y = dist_x;
-
- var/error = tdist_x/2 - tdist_y
- while(target && (((((dist_x > dist_y) && ((src.x < target.x) || (src.x > target.x))) || ((dist_x <= dist_y) && ((src.y < target.y) || (src.y > target.y))) || (src.x > target.x)) && dist_travelled < range) || !has_gravity(src)))
-
- if(!src.throwing) break
- if(!istype(src.loc, /turf)) break
-
- var/atom/step = get_step(src, get_dir(src,target))
- if(!step)
- break
- src.Move(step, get_dir(src, step))
- hit_check()
- error += (error < 0) ? tdist_x : -tdist_y;
- dist_travelled++
- dist_since_sleep++
- if(dist_since_sleep >= speed)
- dist_since_sleep = 0
- sleep(1)
-
-
- src.throwing = 0
- src.throw_impact(get_turf(src))
-
- return 1
-
/obj/effect/hallucination/simple/xeno/throw_impact(A)
update_icon("alienh_pounce")
if(A == target)
@@ -232,10 +191,10 @@ Gunshots/explosions/opening doors/less rare audio (done)
xeno = new(pump.loc,target)
sleep(10)
xeno.update_icon("alienh_leap",'icons/mob/alienleap.dmi',-32,-32)
- xeno.throw_at(target,7,1)
+ xeno.throw_at(target,7,1, spin = 0, diagonals_first = 1)
sleep(10)
xeno.update_icon("alienh_leap",'icons/mob/alienleap.dmi',-32,-32)
- xeno.throw_at(pump,7,1)
+ xeno.throw_at(pump,7,1, spin = 0, diagonals_first = 1)
sleep(10)
var/xeno_name = xeno.name
target << "[xeno_name] begins climbing into the ventilation system..."
diff --git a/code/modules/food&drinks/food/snacks_egg.dm b/code/modules/food&drinks/food/snacks_egg.dm
index 6a17202d6f0..473ad4ebde5 100644
--- a/code/modules/food&drinks/food/snacks_egg.dm
+++ b/code/modules/food&drinks/food/snacks_egg.dm
@@ -18,10 +18,11 @@
filling_color = "#F0E68C"
/obj/item/weapon/reagent_containers/food/snacks/egg/throw_impact(atom/hit_atom)
- ..()
- new/obj/effect/decal/cleanable/egg_smudge(src.loc)
- reagents.reaction(hit_atom, TOUCH)
- del(src) // Not qdel, because it'll hit other mobs then the floor for runtimes.
+ if(!..()) //was it caught by a mob?
+ var/turf/T = get_turf(hit_atom)
+ new/obj/effect/decal/cleanable/egg_smudge(T)
+ reagents.reaction(hit_atom, TOUCH)
+ qdel(src)
/obj/item/weapon/reagent_containers/food/snacks/egg/attackby(obj/item/weapon/W, mob/user, params)
if(istype( W, /obj/item/toy/crayon ))
diff --git a/code/modules/food&drinks/food/snacks_pie.dm b/code/modules/food&drinks/food/snacks_pie.dm
index e4fe6700f67..6a9be926630 100644
--- a/code/modules/food&drinks/food/snacks_pie.dm
+++ b/code/modules/food&drinks/food/snacks_pie.dm
@@ -23,10 +23,11 @@
list_reagents = list("nutriment" = 6, "banana" = 5, "vitamin" = 2)
/obj/item/weapon/reagent_containers/food/snacks/pie/cream/throw_impact(atom/hit_atom)
- ..()
- new/obj/effect/decal/cleanable/pie_smudge(src.loc)
- reagents.reaction(hit_atom, TOUCH)
- del(src) // Not qdel, because it'll hit other mobs then the floor for runtimes.
+ if(!..()) //was it caught by a mob?
+ var/turf/T = get_turf(hit_atom)
+ new/obj/effect/decal/cleanable/pie_smudge(T)
+ reagents.reaction(hit_atom, TOUCH)
+ qdel(src)
/obj/item/weapon/reagent_containers/food/snacks/pie/berryclafoutis
diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm
index 6c11a41934e..f27866be2d2 100644
--- a/code/modules/hydroponics/grown.dm
+++ b/code/modules/hydroponics/grown.dm
@@ -806,17 +806,16 @@ obj/item/weapon/reagent_containers/food/snacks/grown/shell/eggy/add_juice()
bitesize = 1 + round(reagents.total_volume / 2, 1)
/obj/item/weapon/reagent_containers/food/snacks/grown/tomato/proc/squish(atom/target)
- new splat(src.loc)
- src.visible_message("The [src.name] has been squashed.","You hear a smack.")
+ var/turf/T = get_turf(target)
+ new splat(T)
+ visible_message("The [src.name] has been squashed.","You hear a smack.")
for(var/atom/A in get_turf(target))
- src.reagents.reaction(A)
+ reagents.reaction(A)
/obj/item/weapon/reagent_containers/food/snacks/grown/tomato/throw_impact(atom/hit_atom)
- ..()
- squish(hit_atom)
- del(src) // Not qdel, because it'll hit other mobs then the floor for runtimes.
- return
-
+ if(!..()) //was it caught by a mob?
+ squish(hit_atom)
+ qdel(src)
/obj/item/weapon/reagent_containers/food/snacks/grown/tomato/killer
seed = /obj/item/seeds/killertomatoseed
@@ -906,7 +905,8 @@ obj/item/weapon/reagent_containers/food/snacks/grown/shell/eggy/add_juice()
..()
var/teleport_radius = potency / 10
if(isliving(squishee))
- new /obj/effect/decal/cleanable/molten_item(squishee.loc) //Leave a pile of goo behind for dramatic effect...
+ var/turf/T = get_turf(squishee)
+ new /obj/effect/decal/cleanable/molten_item(T) //Leave a pile of goo behind for dramatic effect...
do_teleport(squishee, get_turf(squishee), teleport_radius)
diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm
index 6e67f71e3ba..01e6c9b3094 100644
--- a/code/modules/mining/mine_turfs.dm
+++ b/code/modules/mining/mine_turfs.dm
@@ -487,7 +487,7 @@ var/global/list/rockTurfEdgeCache
return
/* else if(istype(AM,/obj/mecha))
var/obj/mecha/M = AM
- if(istype(M.selected,/obj/item/mecha_parts/mecha_equipment/tool/drill))
+ if(istype(M.selected,/obj/item/mecha_parts/mecha_equipment/drill))
src.attackby(M.selected,M)
return*/
//Aparantly mechs are just TOO COOL to call Bump(), so fuck em (for now)
diff --git a/code/modules/mob/living/carbon/alien/alien_defense.dm b/code/modules/mob/living/carbon/alien/alien_defense.dm
index fa0f58d7f07..7f1e5337575 100644
--- a/code/modules/mob/living/carbon/alien/alien_defense.dm
+++ b/code/modules/mob/living/carbon/alien/alien_defense.dm
@@ -1,5 +1,5 @@
/mob/living/carbon/alien/hitby(atom/movable/AM)
- ..(AM, 1)
+ ..(AM, skip = 1)
/*Code for aliens attacking aliens. Because aliens act on a hivemind, I don't see them as very aggressive with each other.
diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm
index 68fda08c934..dd900163da0 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm
@@ -82,11 +82,11 @@
else //Maybe uses plasma in the future, although that wouldn't make any sense...
leaping = 1
update_icons()
- throw_at(A,MAX_ALIEN_LEAP_DIST,1)
+ throw_at(A,MAX_ALIEN_LEAP_DIST,1, spin=0, diagonals_first = 1)
leaping = 0
update_icons()
-/mob/living/carbon/alien/humanoid/hunter/throw_impact(A)
+/mob/living/carbon/alien/humanoid/hunter/throw_impact(atom/A)
if(!leaping)
return ..()
@@ -103,60 +103,19 @@
pounce_cooldown = !pounce_cooldown
spawn(pounce_cooldown_time) //3s by default
pounce_cooldown = !pounce_cooldown
- else
+ else if(A.density && !A.CanPass(src))
visible_message("[src] smashes into [A]!", "[src] smashes into [A]!")
weakened = 2
if(leaping)
leaping = 0
+ update_icons()
update_canmove()
-
/mob/living/carbon/alien/humanoid/float(on)
if(leaping)
return
..()
-//Modified throw_at() that will use diagonal dirs where appropriate
-//instead of locking it to cardinal dirs
-/mob/living/carbon/alien/humanoid/throw_at(atom/target, range, speed)
- if(!target || !src || (flags & NODROP)) return 0
-
- src.throwing = 1
-
- var/dist_x = abs(target.x - src.x)
- var/dist_y = abs(target.y - src.y)
- var/dist_travelled = 0
- var/dist_since_sleep = 0
-
- var/tdist_x = dist_x;
- var/tdist_y = dist_y;
-
- if(dist_x <= dist_y)
- tdist_x = dist_y;
- tdist_y = dist_x;
-
- var/error = tdist_x/2 - tdist_y
- while(target && (((((dist_x > dist_y) && ((src.x < target.x) || (src.x > target.x))) || ((dist_x <= dist_y) && ((src.y < target.y) || (src.y > target.y))) || (src.x > target.x)) && dist_travelled < range) || !has_gravity(src)))
-
- if(!src.throwing) break
- if(!istype(src.loc, /turf)) break
-
- var/atom/step = get_step(src, get_dir(src,target))
- if(!step)
- break
- src.Move(step, get_dir(src, step))
- hit_check()
- error += (error < 0) ? tdist_x : -tdist_y;
- dist_travelled++
- dist_since_sleep++
- if(dist_since_sleep >= speed)
- dist_since_sleep = 0
- sleep(1)
-
-
- src.throwing = 0
-
- return 1
diff --git a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm
index 57db5c8890b..0f742d02a10 100644
--- a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm
+++ b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm
@@ -72,7 +72,10 @@ var/const/ALIEN_AFK_BRACKET = 450 // 45 seconds
else
affected_mob.overlays += image('icons/mob/alien.dmi', loc = affected_mob, icon_state = "burst_stand")
spawn(6)
- var/mob/living/carbon/alien/larva/new_xeno = new(affected_mob.loc)
+ var/location = get_turf(affected_mob)
+ if(!location)
+ location = affected_mob.loc
+ var/mob/living/carbon/alien/larva/new_xeno = new(location)
new_xeno.key = C.key
new_xeno << sound('sound/voice/hiss5.ogg',0,0,0,100) //To get the player's attention
if(gib_on_success)
diff --git a/code/modules/mob/living/carbon/brain/life.dm b/code/modules/mob/living/carbon/brain/life.dm
index fff5bebcdeb..eb8dc6e9c65 100644
--- a/code/modules/mob/living/carbon/brain/life.dm
+++ b/code/modules/mob/living/carbon/brain/life.dm
@@ -147,4 +147,5 @@
/mob/living/carbon/brain/handle_regular_hud_updates()
handle_vision()
handle_hud_icons_health()
+ update_action_buttons()
return 1
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 99b7a1af49d..b2132b36d51 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -153,7 +153,7 @@
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
-/mob/living/carbon/flash_eyes(intensity = 1, override_blindness_check = 0)
+/mob/living/carbon/flash_eyes(intensity = 1, override_blindness_check = 0, affect_silicon = 0)
var/damage = intensity - check_eye_prot()
if(..()) // we've been flashed
if(weakeyes)
diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm
index 7ef10003c95..9b705841a82 100644
--- a/code/modules/mob/living/carbon/carbon_defense.dm
+++ b/code/modules/mob/living/carbon/carbon_defense.dm
@@ -8,8 +8,8 @@
put_in_active_hand(I)
visible_message("[src] catches [I]!")
throw_mode_off()
- return
- ..()
+ return 1
+ return ..()
/mob/living/carbon/attackby(obj/item/I, mob/user, params)
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 72a5d682d0c..01787095f8b 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -455,4 +455,18 @@ emp_act
else
..()
- return
+/mob/living/carbon/human/hitby(atom/movable/AM)
+ if(throw_speed >= EMBED_THROWSPEED_THRESHOLD)
+ if(istype(AM, /obj/item))
+ var/obj/item/I = AM
+ if(can_embed(I))
+ if(prob(I.embed_chance) && !(dna && (PIERCEIMMUNE in dna.species.specflags)))
+ throw_alert("embeddedobject")
+ var/obj/item/organ/limb/L = pick(organs)
+ L.embedded_objects |= I
+ I.add_blood(src)//it embedded itself in you, of course it's bloody!
+ I.loc = src
+ L.take_damage(I.w_class*I.embedded_impact_pain_multiplier)
+ visible_message("\the [I.name] embeds itself in [src]'s [L.getDisplayName()]!","\the [I.name] embeds itself in your [L.getDisplayName()]!")
+ return
+ return ..()
diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm
index b0078a13719..664933c175b 100644
--- a/code/modules/mob/living/carbon/human/human_movement.dm
+++ b/code/modules/mob/living/carbon/human/human_movement.dm
@@ -45,7 +45,7 @@
return shoes && shoes.negates_gravity()
/mob/living/carbon/human/Move(NewLoc, direct)
- ..()
+ . = ..()
if(dna)
for(var/datum/mutation/human/HM in dna.mutations)
HM.on_move(src, NewLoc)
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index b137657b148..bbcdc72c6aa 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -52,13 +52,14 @@ Sorry Giacom. Please don't be mad :(
//Generic Bump(). Override MobBump() and ObjBump() instead of this.
/mob/living/Bump(atom/A, yes)
+ if(..()) //we are thrown onto something
+ return
if (buckled || !yes || now_pushing)
return
if(ismob(A))
var/mob/M = A
if(MobBump(M))
return
- ..()
if(isobj(A))
var/obj/O = A
if(ObjBump(O))
@@ -68,6 +69,10 @@ Sorry Giacom. Please don't be mad :(
if(PushAM(AM))
return
+/mob/living/Bumped(atom/movable/AM)
+ ..()
+ last_bumped = world.time
+
//Called when we bump onto a mob
/mob/living/proc/MobBump(mob/M)
//Even if we don't push/swap places, we "touched" them, so spread fire
@@ -376,7 +381,7 @@ Sorry Giacom. Please don't be mad :(
return 0
-/mob/living/proc/electrocute_act(shock_damage, obj/source, siemens_coeff = 1.0)
+/mob/living/proc/electrocute_act(shock_damage, obj/source, siemens_coeff = 1.0, safety = 0)
return 0 //only carbon liveforms have this proc
/mob/living/emp_act(severity)
@@ -687,7 +692,7 @@ Sorry Giacom. Please don't be mad :(
floating = 0
//called when the mob receives a bright flash
-/mob/living/proc/flash_eyes(intensity = 1, override_blindness_check = 0)
+/mob/living/proc/flash_eyes(intensity = 1, override_blindness_check = 0, affect_silicon = 0)
if(check_eye_prot() < intensity && (override_blindness_check || !(disabilities & BLIND)))
flick("e_flash", flash)
return 1
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index c620bda6767..43e2c2735bf 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -44,7 +44,13 @@
else
return 0
-/mob/living/hitby(atom/movable/AM,mob/thrower)//Standardization and logging -Sieve
+/mob/living/throw_impact(atom/hit_atom)
+ . = ..()
+ if(hit_atom.density)
+ Weaken(1)
+ take_organ_damage(10)
+
+/mob/living/hitby(atom/movable/AM)
if(istype(AM, /obj/item))
var/obj/item/I = AM
var/zone = ran_zone("chest", 65)//Hits a random part of the body, geared towards the chest
@@ -71,9 +77,11 @@
"[src] has been hit by [I].")
var/armor = run_armor_check(zone, "melee", "Your armor has protected your [parse_zone(zone)].", "Your armor has softened hit to your [parse_zone(zone)].",I.armour_penetration)
apply_damage(I.throwforce, dtype, zone, armor, I)
-
- if(thrower)
- add_logs(thrower, src, "hit", I)
+ if(I.thrownby)
+ add_logs(I.thrownby, src, "hit", I)
+ else
+ playsound(loc, 'sound/weapons/genhit.ogg', 50, 1, -1)
+ return ..()
/mob/living/mech_melee_attack(obj/mecha/M)
if(M.occupant.a_intent == "harm")
diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm
index 096da4e0b0d..56c0426c5bc 100644
--- a/code/modules/mob/living/living_defines.dm
+++ b/code/modules/mob/living/living_defines.dm
@@ -47,4 +47,6 @@
var/smoke_delay = 0 //used to prevent spam with smoke reagent reaction on mob.
- var/list/say_log = list() //a log of what we've said, plain text, no spans or junk, essentially just each individual "message"
\ No newline at end of file
+ var/list/say_log = list() //a log of what we've said, plain text, no spans or junk, essentially just each individual "message"
+
+ var/last_bumped = 0
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index cac929c3681..3f601c0810f 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -823,3 +823,6 @@ var/list/ai_list = list()
loc = card//Throw AI into the card.
src << "You have been downloaded to a mobile storage device. Remote device connection severed."
user << "Transfer successful: [name] ([rand(1000,9999)].exe) removed from host terminal and stored within local memory."
+
+/mob/living/silicon/ai/flash_eyes(intensity = 1, override_blindness_check = 0, affect_silicon = 0)
+ return // no eyes, no flashing
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/ai/life.dm b/code/modules/mob/living/silicon/ai/life.dm
index cf6548b0e05..840f19ef3bb 100644
--- a/code/modules/mob/living/silicon/ai/life.dm
+++ b/code/modules/mob/living/silicon/ai/life.dm
@@ -10,10 +10,12 @@
src.reset_view(null)
src.unset_machine()
- src.updatehealth()
+ updatehealth()
update_gravity(mob_has_gravity())
+ update_action_buttons()
+
if (src.malfhack)
if (src.malfhack.aidisabled)
src << "ERROR: APC access disabled, hack attempt canceled."
diff --git a/code/modules/mob/living/silicon/robot/death.dm b/code/modules/mob/living/silicon/robot/death.dm
index 53e979b4031..0f40c5d5817 100644
--- a/code/modules/mob/living/silicon/robot/death.dm
+++ b/code/modules/mob/living/silicon/robot/death.dm
@@ -27,6 +27,7 @@
update_canmove()
if(camera)
camera.status = 0
+ update_headlamp(1) //So borg lights are disabled when killed.
uneq_all() // particularly to ensure sight modes are cleared
diff --git a/code/modules/mob/living/silicon/robot/inventory.dm b/code/modules/mob/living/silicon/robot/inventory.dm
index 70a5daa21ee..66be85855e8 100644
--- a/code/modules/mob/living/silicon/robot/inventory.dm
+++ b/code/modules/mob/living/silicon/robot/inventory.dm
@@ -15,11 +15,6 @@
if(istype(O,/obj/item/borg/sight))
var/obj/item/borg/sight/S = O
sight_mode &= ~S.sight_mode
- else if(istype(O, /obj/item/device/flashlight))
- var/obj/item/device/flashlight/F = O
- if(F.on)
- F.on = 0
- F.update_brightness(src)
else if(istype(O, /obj/item/weapon/storage/bag/tray/))
var/obj/item/weapon/storage/bag/tray/T = O
T.do_quick_empty()
diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm
index 7ce41a2de6a..bb3a9dce86a 100644
--- a/code/modules/mob/living/silicon/robot/life.dm
+++ b/code/modules/mob/living/silicon/robot/life.dm
@@ -25,10 +25,12 @@
if(cell && cell.charge)
if(cell.charge <= 100)
uneq_all()
- cell.use(1)
+ var/amt = Clamp((lamp_intensity - 2) * 2,1,cell.charge) //Always try to use at least one charge per tick, but allow it to completely drain the cell.
+ cell.use(amt) //Usage table: 1/tick if off/lowest setting, 4 = 4/tick, 6 = 8/tick, 8 = 12/tick, 10 = 16/tick
else
uneq_all()
stat = UNCONSCIOUS
+ update_headlamp(1)
/mob/living/silicon/robot/handle_regular_status_updates()
@@ -59,6 +61,7 @@
if (paralysis || stunned || weakened) //Stunned etc.
stat = UNCONSCIOUS
+ update_headlamp()
return 1
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 11ebe6edb27..0fca94e2b05 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -15,6 +15,7 @@
var/obj/screen/inv1 = null
var/obj/screen/inv2 = null
var/obj/screen/inv3 = null
+ var/obj/screen/lamp_button = null
var/shown_robot_modules = 0 //Used to determine whether they have the module menu shown or not
var/obj/screen/robot_modules_background
@@ -60,6 +61,8 @@
var/tonermax = 40
var/jetpackoverlay = 0
var/braintype = "Cyborg"
+ var/lamp_max = 10 //Maximum brightness of a borg lamp. Set as a var for easy adjusting.
+ var/lamp_intensity = 0 //Luminosity of the headlamp. 0 is off. Higher settings than the minimum require power.
/mob/living/silicon/robot/New(loc)
spark_system = new /datum/effect/effect/system/spark_spread()
@@ -221,6 +224,7 @@
transform_animation(animation_length)
notify_ai(2)
update_icons()
+ update_headlamp()
SetEmagged(emagged) // Update emag status and give/take emag modules.
/mob/living/silicon/robot/proc/transform_animation(animation_length)
@@ -720,12 +724,17 @@
/mob/living/silicon/robot/update_icons()
overlays.Cut()
- if(stat == CONSCIOUS)
+ if(stat != DEAD && !(paralysis || stunned || weakened)) //Not dead, not stunned.
+ var/state_name = icon_state //For easy conversion and/or different names
switch(icon_state)
if("robot")
overlays += "eyes-standard"
+ state_name = "standard"
+ if("mediborg")
+ overlays += "eyes-mediborg"
if("toiletbot")
- overlays += "eyes-toiletbot"
+ overlays += "eyes-mediborg"
+ state_name = "mediborg"
if("secborg")
overlays += "eyes-secborg"
if("engiborg")
@@ -738,6 +747,9 @@
overlays += "eyes-syndie_bloodhound"
else
overlays += "eyes"
+ state_name = "serviceborg"
+ if(lamp_intensity > 2)
+ overlays += "eyes-[state_name]-lights"
if(opened)
if(wiresexposed)
@@ -751,8 +763,6 @@
overlays += "minerjetpack"
update_fire()
-
-
/mob/living/silicon/robot/proc/installed_modules()
if(!module)
pick_module()
@@ -978,6 +988,32 @@
set category = "Robot Commands"
set_autosay()
+/mob/living/silicon/robot/proc/control_headlamp()
+ if(stat)
+ src << "This function is currently offline."
+ return
+
+//Some sort of magical "modulo" thing which somehow increments lamp power by 2, until it hits the max and resets to 0.
+ lamp_intensity = (lamp_intensity+2) % (lamp_max+2)
+ src << "[lamp_intensity ? "Headlamp power set to Level [lamp_intensity/2]" : "Headlamp disabled."]"
+ update_headlamp()
+
+/mob/living/silicon/robot/proc/update_headlamp(var/turn_off = 0)
+ SetLuminosity(0)
+
+ if(lamp_intensity && (turn_off || stat))
+ src << "Your headlamp has been deactivated."
+ lamp_intensity = 0
+ else
+ AddLuminosity(lamp_intensity)
+
+ if(lamp_button)
+ lamp_button.icon_state = "lamp[lamp_intensity]"
+
+ update_icons()
+
+
+
/mob/living/silicon/robot/proc/deconstruct()
var/turf/T = get_turf(src)
if (robot_suit)
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index 7bbcd4ad3b2..3cd0e9781c6 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -66,7 +66,6 @@
/obj/item/weapon/robot_module/standard/New()
..()
- modules += new /obj/item/device/flashlight(src)
modules += new /obj/item/weapon/melee/baton/loaded(src)
modules += new /obj/item/weapon/extinguisher(src)
modules += new /obj/item/weapon/wrench(src)
@@ -81,7 +80,6 @@
/obj/item/weapon/robot_module/medical/New()
..()
- modules += new /obj/item/device/flashlight(src)
modules += new /obj/item/device/healthanalyzer(src)
modules += new /obj/item/weapon/reagent_containers/borghypo(src)
modules += new /obj/item/weapon/reagent_containers/glass/beaker/large(src)
@@ -119,7 +117,6 @@
/obj/item/weapon/robot_module/engineering/New()
..()
- modules += new /obj/item/device/flashlight(src)
modules += new /obj/item/borg/sight/meson(src)
emag = new /obj/item/borg/stun(src)
modules += new /obj/item/weapon/rcd/borg(src)
@@ -173,7 +170,6 @@
/obj/item/weapon/robot_module/security/New()
..()
- modules += new /obj/item/device/flashlight/seclite(src)
modules += new /obj/item/weapon/restraints/handcuffs/cable/zipties/cyborg(src)
modules += new /obj/item/weapon/melee/baton/loaded(src)
modules += new /obj/item/weapon/gun/energy/disabler/cyborg(src)
@@ -187,7 +183,6 @@
/obj/item/weapon/robot_module/janitor/New()
..()
- modules += new /obj/item/device/flashlight(src)
modules += new /obj/item/weapon/soap/nanotrasen(src)
modules += new /obj/item/weapon/storage/bag/trash/cyborg(src)
modules += new /obj/item/weapon/mop/cyborg(src)
@@ -205,7 +200,6 @@
/obj/item/weapon/robot_module/butler/New()
..()
- modules += new /obj/item/device/flashlight(src)
modules += new /obj/item/weapon/reagent_containers/food/drinks/drinkingglass(src)
modules += new /obj/item/weapon/reagent_containers/food/condiment/enzyme(src)
modules += new /obj/item/weapon/pen(src)
@@ -239,7 +233,6 @@
modules += new /obj/item/weapon/storage/bag/ore/cyborg(src)
modules += new /obj/item/weapon/pickaxe/drill/cyborg(src)
modules += new /obj/item/weapon/shovel(src)
- modules += new /obj/item/device/flashlight/lantern(src)
modules += new /obj/item/weapon/storage/bag/sheetsnatcher/borg(src)
modules += new /obj/item/device/t_scanner/adv_mining_scanner(src)
modules += new /obj/item/weapon/gun/energy/kinetic_accelerator(src)
@@ -251,7 +244,6 @@
/obj/item/weapon/robot_module/syndicate/New()
..()
- modules += new /obj/item/device/flashlight(src)
modules += new /obj/item/weapon/melee/energy/sword/cyborg(src)
modules += new /obj/item/weapon/gun/energy/printer(src)
modules += new /obj/item/weapon/gun/projectile/revolver/grenadelauncher/cyborg(src)
diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm
index c3ec3215993..92749a073a2 100644
--- a/code/modules/mob/living/silicon/silicon.dm
+++ b/code/modules/mob/living/silicon/silicon.dm
@@ -422,12 +422,13 @@
/mob/living/silicon/setEarDamage()
return
-/mob/living/silicon/check_eye_prot()
- return 2
-
/mob/living/silicon/proc/GetPhoto()
if (aicamera)
return aicamera.selectpicture(aicamera)
/mob/living/silicon/grabbedby(mob/living/user)
- return
\ No newline at end of file
+ return
+
+/mob/living/silicon/flash_eyes(intensity = 1, override_blindness_check = 0, affect_silicon = 0)
+ if(affect_silicon)
+ return ..()
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm
index af1520d2d42..4b349ee1ddb 100644
--- a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm
+++ b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm
@@ -173,8 +173,9 @@
if(cleared)
src << "--- [class] alarm in [A.name] has been cleared."
-/mob/living/simple_animal/drone/check_eye_prot()
- return 2
-
/mob/living/simple_animal/drone/handle_temperature_damage()
return
+
+/mob/living/simple_animal/drone/flash_eyes(intensity = 1, override_blindness_check = 0, affect_silicon = 0)
+ if(affect_silicon)
+ return ..()
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/slaughter/slaughter.dm b/code/modules/mob/living/simple_animal/slaughter/slaughter.dm
index cff95221196..58fe29515b3 100644
--- a/code/modules/mob/living/simple_animal/slaughter/slaughter.dm
+++ b/code/modules/mob/living/simple_animal/slaughter/slaughter.dm
@@ -11,6 +11,7 @@
response_harm = "punches"
icon = 'icons/mob/mob.dmi'
icon_state = "daemon"
+ icon_living = "daemon"
speed = 0
a_intent = "harm"
stop_automated_movement = 1
@@ -76,7 +77,7 @@
src.phased = TRUE
src.holder = holder
if(src.kidnapped)
- src << "You being to feast on [kidnapped]. You can not move while you are doing this."
+ src << "You begin to feast on [kidnapped]. You can not move while you are doing this."
src.eating = TRUE
playsound(get_turf(src),'sound/magic/Demon_consume.ogg', 100, 1)
sleep(30)
diff --git a/code/modules/mob/living/ventcrawling.dm b/code/modules/mob/living/ventcrawling.dm
index de8db9663ea..d0b506f1a12 100644
--- a/code/modules/mob/living/ventcrawling.dm
+++ b/code/modules/mob/living/ventcrawling.dm
@@ -34,7 +34,7 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/components/unary
if(vent_found)
- var/datum/pipeline/vent_found_parent = vent_found.parents["p1"]
+ var/datum/pipeline/vent_found_parent = vent_found.parents[PARENT1]
if(vent_found_parent && (vent_found_parent.members.len || vent_found_parent.other_atmosmch))
visible_message("[src] begins climbing into the ventilation system..." ,"You begin climbing into the ventilation system...")
@@ -63,21 +63,21 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/components/unary
src << "This ventilation duct is not connected to anything!"
-/mob/living/proc/add_ventcrawl(obj/machinery/atmospherics/components/starting_machine)
+/mob/living/proc/add_ventcrawl(obj/machinery/atmospherics/components/unary/starting_machine)
if(!istype(starting_machine) || !starting_machine.returnPipenet())
return
var/list/totalMembers = list()
- var/datum/pipeline/starting_machine_parent = starting_machine.parents["p1"]
- totalMembers |= starting_machine_parent.members
- totalMembers |= starting_machine_parent.other_atmosmch
+ var/datum/pipeline/starting_machine_parent = starting_machine.parents[PARENT1]
+ totalMembers += starting_machine_parent.members
+ totalMembers += starting_machine_parent.other_atmosmch
for(var/obj/machinery/atmospherics/A in totalMembers)
if(!A.pipe_vision_img)
A.pipe_vision_img = image(A, A.loc, layer = 20, dir = A.dir)
//20 for being above darkness
- pipes_shown |= A.pipe_vision_img
+ pipes_shown += A.pipe_vision_img
if(client)
- client.images |= A.pipe_vision_img
+ client.images += A.pipe_vision_img
/mob/living/proc/remove_ventcrawl()
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 6e9e8ccd996..b76f3056cc0 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -963,4 +963,8 @@ var/list/slot_equipment_priority = list( \
spell.action.background_icon_state = spell.action_background_icon_state
if(isliving(src))
spell.action.Grant(src)
- return
\ No newline at end of file
+ return
+
+//override to avoid rotating pixel_xy on mobs
+/mob/shuttleRotate(rotation)
+ dir = angle2dir(rotation+dir2angle(dir))
\ No newline at end of file
diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm
index c5f8a272d8b..d65438f65e7 100644
--- a/code/modules/mob/mob_movement.dm
+++ b/code/modules/mob/mob_movement.dm
@@ -1,18 +1,16 @@
/mob/CanPass(atom/movable/mover, turf/target, height=0)
- if(height==0) return 1
-
- if(istype(mover) && mover.checkpass(PASSMOB))
+ if(height==0)
return 1
- if(istype(mover, /obj/item/projectile))
+ if(istype(mover, /obj/item/projectile) || mover.throwing)
return (!density || lying)
+ if(mover.checkpass(PASSMOB))
+ return 1
if(ismob(mover))
var/mob/moving_mob = mover
if ((other_mobs && moving_mob.other_mobs))
return 1
- return (!mover.density || !density || lying)
- else
- return (!mover.density || !density || lying)
- return
+ return (!mover.density || !density || lying)
+
/client/Northeast()
diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm
index 5c63a5cc097..be09fdadd38 100644
--- a/code/modules/power/gravitygenerator.dm
+++ b/code/modules/power/gravitygenerator.dm
@@ -36,6 +36,10 @@ var/const/GRAV_NEEDS_WRENCH = 3
..()
icon_state = "[get_status()]_[sprite_number]"
+//prevents shuttles attempting to rotate this since it messes up sprites
+/obj/machinery/gravity_generator/shuttleRotate()
+ return
+
/obj/machinery/gravity_generator/proc/get_status()
return "off"
diff --git a/code/modules/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm
index fb0a69a9be2..08278a00ea7 100644
--- a/code/modules/power/singularity/containment_field.dm
+++ b/code/modules/power/singularity/containment_field.dm
@@ -43,7 +43,7 @@
/obj/machinery/field/containment/Crossed(obj/mover)
if(istype(mover, /obj/machinery) || istype(mover, /obj/structure) || istype(mover, /obj/mecha))
- bump(mover)
+ bump_field(mover)
/obj/machinery/field/containment/proc/set_master(master1,master2)
if(!master1 || !master2)
@@ -77,7 +77,7 @@
if((istype(mover, /obj/machinery) && !istype(mover, /obj/singularity)) || \
istype(mover, /obj/structure) || \
istype(mover, /obj/mecha))
- bump(mover)
+ bump_field(mover)
return 0
return ..()
@@ -106,13 +106,13 @@
"You hear an electrical crack.")
user.updatehealth()
- bump(user)
+ bump_field(user)
spawn(5)
hasShocked = 0
return
-/obj/machinery/field/proc/bump(atom/movable/AM as mob|obj)
+/obj/machinery/field/proc/bump_field(atom/movable/AM as mob|obj)
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.set_up(5, 1, AM.loc)
s.start()
diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm
index 9c9f3c0f948..550567bca53 100644
--- a/code/modules/power/singularity/field_generator.dm
+++ b/code/modules/power/singularity/field_generator.dm
@@ -356,6 +356,6 @@ field_generator power level display
if(fields.len)
..()
-/obj/machinery/field/generator/bump(atom/movable/AM as mob|obj)
+/obj/machinery/field/generator/bump_field(atom/movable/AM as mob|obj)
if(fields.len)
..()
diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm
index 43eaa1a7235..ce2e87d82da 100644
--- a/code/modules/power/singularity/singularity.dm
+++ b/code/modules/power/singularity/singularity.dm
@@ -26,7 +26,7 @@
var/last_failed_movement = 0//Will not move in the same dir if it couldnt before, will help with the getting stuck on fields thing
var/last_warning
var/consumedSupermatter = 0 //If the singularity has eaten a supermatter shard and can go to stage six
- allow_spin = 0
+
/obj/singularity/New(loc, var/starting_energy = 50, var/temp = 0)
//CARN: admin-alert for chuckle-fuckery.
admin_investigate_setup()
diff --git a/code/modules/projectiles/ammunition/ammo_casings.dm b/code/modules/projectiles/ammunition/ammo_casings.dm
index bf3a16b8060..26b4bc77e99 100644
--- a/code/modules/projectiles/ammunition/ammo_casings.dm
+++ b/code/modules/projectiles/ammunition/ammo_casings.dm
@@ -1,7 +1,7 @@
/obj/item/ammo_casing/a357
desc = "A .357 bullet casing."
caliber = "357"
- projectile_type = /obj/item/projectile/bullet/revolver
+ projectile_type = /obj/item/projectile/bullet
/obj/item/ammo_casing/a50
desc = "A .50AE bullet casing."
@@ -174,12 +174,11 @@
/obj/item/ammo_casing/shotgun/dart/bioterror/New()
..()
- reagents.add_reagent("neurotoxin", 5)
- reagents.add_reagent("morphine", 5)
- reagents.add_reagent("spore", 5)
- reagents.add_reagent("mutetoxin", 5) //;HELP OPS IN MAINT
- reagents.add_reagent("initropidril", 5)
- reagents.add_reagent("sodium_thiopental", 5)
+ reagents.add_reagent("neurotoxin", 6)
+ reagents.add_reagent("spore", 6)
+ reagents.add_reagent("mutetoxin", 6) //;HELP OPS IN MAINT
+ reagents.add_reagent("coniine", 6)
+ reagents.add_reagent("sodium_thiopental", 6)
/obj/item/ammo_casing/a762
desc = "A 7.62mm bullet casing."
diff --git a/code/modules/projectiles/ammunition/energy.dm b/code/modules/projectiles/ammunition/energy.dm
index ae4f0f5c7b4..0a89745dfcf 100644
--- a/code/modules/projectiles/ammunition/energy.dm
+++ b/code/modules/projectiles/ammunition/energy.dm
@@ -5,7 +5,6 @@
projectile_type = /obj/item/projectile/energy
var/e_cost = 100 //The amount of energy a cell needs to expend to create this shot.
var/select_name = "energy"
- var/mod_name = null
fire_sound = 'sound/weapons/Laser.ogg'
/obj/item/ammo_casing/energy/laser
@@ -87,13 +86,11 @@
/obj/item/ammo_casing/energy/flora/yield
projectile_type = /obj/item/projectile/energy/florayield
- select_name = "increase yield"
- mod_name = "yield"
+ select_name = "yield"
/obj/item/ammo_casing/energy/flora/mut
projectile_type = /obj/item/projectile/energy/floramut
- select_name = "induce mutations"
- mod_name = "mut"
+ select_name = "mutation"
/obj/item/ammo_casing/energy/temp
projectile_type = /obj/item/projectile/temp
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index e692bd7bb97..b7c64faa7a7 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -49,6 +49,11 @@
var/list/upgrades = list()
+ var/ammo_x_offset = 0 //used for positioning ammo count overlay on sprite
+ var/ammo_y_offset = 0
+ var/flight_x_offset = 0
+ var/flight_y_offset = 0
+
/obj/item/weapon/gun/New()
..()
if(pin)
diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm
index 15115001e06..e1a143f2f5d 100644
--- a/code/modules/projectiles/guns/energy.dm
+++ b/code/modules/projectiles/guns/energy.dm
@@ -10,6 +10,7 @@
var/list/ammo_type = list(/obj/item/ammo_casing/energy)
var/select = 1 //The state of the select fire switch. Determines from the ammo_type list what kind of shot is fired next.
var/can_charge = 1 //Can it be charged in a recharger?
+ ammo_x_offset = 2
/obj/item/weapon/gun/energy/emp_act(severity)
power_supply.use(round(power_supply.charge / severity))
@@ -72,25 +73,31 @@
return
/obj/item/weapon/gun/energy/update_icon()
- var/ratio = power_supply.charge / power_supply.maxcharge
- ratio = min(Ceiling(ratio*4) * 25, 100)
- var/obj/item/ammo_casing/energy/shot = ammo_type[select]
- if(power_supply.charge < shot.e_cost)
- ratio = 0 //so the icon changes to empty if the charge isn't zero but not enough for a shot.
- switch(modifystate)
- if (0)
- icon_state = "[initial(icon_state)][ratio]"
- if (1)
- icon_state = "[initial(icon_state)][shot.mod_name][ratio]"
- if (2)
- icon_state = "[initial(icon_state)][shot.select_name][ratio]"
overlays.Cut()
+ var/ratio = Ceiling((power_supply.charge / power_supply.maxcharge) * 4)
+ var/obj/item/ammo_casing/energy/shot = ammo_type[select]
+ var/iconState = "[icon_state]_charge"
+ var/itemState = null
+ if(!initial(item_state))
+ itemState = icon_state
+ if (modifystate)
+ overlays += "[icon_state]_[shot.select_name]"
+ iconState += "_[shot.select_name]"
+ if(itemState)
+ itemState += "[shot.select_name]"
+ if(power_supply.charge < shot.e_cost)
+ overlays += "[icon_state]_empty"
+ ratio = 0
+ for(var/i = ratio, i >= 1, i--)
+ overlays += image(icon = icon, icon_state = iconState, pixel_x = ammo_x_offset * (i -1))
if(F)
+ var/iconF = "flight"
if(F.on)
- overlays += "flight-[initial(icon_state)]-on"
- else
- overlays += "flight-[initial(icon_state)]"
- return
+ iconF = "flight_on"
+ overlays += image(icon = icon, icon_state = iconF, pixel_x = flight_x_offset, pixel_y = flight_y_offset)
+ if(itemState)
+ itemState += "[ratio]"
+ item_state = itemState
/obj/item/weapon/gun/energy/ui_action_click()
toggle_gunlight()
diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm
index b04057fb82b..a3312bbe75e 100644
--- a/code/modules/projectiles/guns/energy/laser.dm
+++ b/code/modules/projectiles/guns/energy/laser.dm
@@ -7,6 +7,7 @@
materials = list(MAT_METAL=2000)
origin_tech = "combat=3;magnets=2"
ammo_type = list(/obj/item/ammo_casing/energy/lasergun)
+ ammo_x_offset = 1
/obj/item/weapon/gun/energy/laser/practice
@@ -20,6 +21,7 @@
name ="retro laser"
icon_state = "retro"
desc = "An older model of the basic lasergun, no longer used by Nanotrasen's private security or military forces. Nevertheless, it is still quite deadly and easy to maintain, making it a favorite amongst pirates and other outlaws."
+ ammo_x_offset = 3
/obj/item/weapon/gun/energy/laser/captain
@@ -29,6 +31,7 @@
force = 10
origin_tech = null
var/charge_tick = 0
+ ammo_x_offset = 3
/obj/item/weapon/gun/energy/laser/captain/New()
..()
@@ -87,6 +90,7 @@
origin_tech = "combat=4;materials=3;powerstorage=3"
ammo_type = list(/obj/item/ammo_casing/energy/laser/heavy)
pin = null
+ ammo_x_offset = 3
/obj/item/weapon/gun/energy/xray
name = "xray laser gun"
@@ -96,6 +100,7 @@
origin_tech = "combat=5;materials=3;magnets=2;syndicate=2"
ammo_type = list(/obj/item/ammo_casing/energy/xray)
pin = null
+ ammo_x_offset = 3
////////Laser Tag////////////////////
@@ -109,6 +114,7 @@
needs_permit = 0
var/charge_tick = 0
pin = /obj/item/device/firing_pin/tag/blue
+ ammo_x_offset = 2
/obj/item/weapon/gun/energy/laser/bluetag/New()
..()
@@ -140,6 +146,7 @@
needs_permit = 0
var/charge_tick = 0
pin = /obj/item/device/firing_pin/tag/red
+ ammo_x_offset = 2
/obj/item/weapon/gun/energy/laser/redtag/New()
..()
diff --git a/code/modules/projectiles/guns/energy/nuclear.dm b/code/modules/projectiles/guns/energy/nuclear.dm
index 90e201e2a61..e11357de9a7 100644
--- a/code/modules/projectiles/guns/energy/nuclear.dm
+++ b/code/modules/projectiles/guns/energy/nuclear.dm
@@ -7,6 +7,9 @@
origin_tech = "combat=3;magnets=2"
modifystate = 2
can_flashlight = 1
+ ammo_x_offset = 3
+ flight_x_offset = 15
+ flight_y_offset = 10
/obj/item/weapon/gun/energy/gun/attack_self(mob/living/user)
select_fire(user)
@@ -15,7 +18,6 @@
/obj/item/weapon/gun/energy/gun/hos
desc = "This is a expensive, modern recreation of a antique laser gun. This gun has several unique firemodes, but lacks the ability to recharge over time."
icon_state = "hoslaser"
- item_state = null
force = 10
ammo_type = list(/obj/item/ammo_casing/energy/electrode/hos, /obj/item/ammo_casing/energy/laser/hos, /obj/item/ammo_casing/energy/disabler)
@@ -23,22 +25,36 @@
name = "DRAGnet"
desc = "The \"Dynamic Rapid-Apprehension of the Guilty\" net is a revolution in law enforcement technology."
icon_state = "dragnet"
- item_state = null
origin_tech = "combat=3;magnets=3;materials=4; bluespace=4"
ammo_type = list(/obj/item/ammo_casing/energy/net, /obj/item/ammo_casing/energy/trap)
can_flashlight = 0
+ ammo_x_offset = 1
+
+/obj/item/weapon/gun/energy/gun/turret
+ name = "hybrid turret gun"
+ desc = "A heavy hybrid energy cannon with two settings: Stun and kill."
+ icon_state = "turretlaser"
+ item_state = "turretlaser"
+ slot_flags = null
+ w_class = 5
+ ammo_type = list(/obj/item/ammo_casing/energy/electrode, /obj/item/ammo_casing/energy/laser)
+ heavy_weapon = 1
+ can_flashlight = 0
+ trigger_guard = 0
+ ammo_x_offset = 2
/obj/item/weapon/gun/energy/gun/nuclear
name = "advanced energy gun"
desc = "An energy gun with an experimental miniaturized nuclear reactor that automatically charges the internal power cell."
icon_state = "nucgun"
+ item_state = "nucgun"
origin_tech = "combat=3;materials=5;powerstorage=3"
- var/lightfail = 0
+ var/fail_state = 0
var/charge_tick = 0
- modifystate = 0
can_flashlight = 0
pin = null
can_charge = 0
+ ammo_x_offset = 1
/obj/item/weapon/gun/energy/gun/nuclear/New()
..()
@@ -63,7 +79,7 @@
/obj/item/weapon/gun/energy/gun/nuclear/proc/failcheck()
- lightfail = 0
+ fail_state = 0
if (prob(src.reliability)) return 1 //No failure
if (prob(src.reliability))
for (var/mob/living/M in range(0,src)) //Only a minor failure, enjoy your radiation if you're in the same tile or carrying it
@@ -72,68 +88,22 @@
else
M << "You feel a warm sensation."
M.irradiate(rand(3,120))
- lightfail = 1
+ fail_state = 1
else
for (var/mob/living/M in range(rand(1,4),src)) //Big failure, TIME FOR RADIATION BITCHES
if (src in M.contents)
M << "Your gun's reactor overloads!"
M << "You feel a wave of heat wash over you."
M.irradiate(300)
- crit_fail = 1 //break the gun so it stops recharging
+ fail_state = 2 //break the gun so it stops recharging
SSobj.processing.Remove(src)
update_icon()
return 0
-
-/obj/item/weapon/gun/energy/gun/nuclear/proc/update_charge()
- if (crit_fail)
- overlays += "nucgun-whee"
- return
- var/ratio = power_supply.charge / power_supply.maxcharge
- ratio = Ceiling(ratio*4) * 25
- overlays += "nucgun-[ratio]"
-
-
-/obj/item/weapon/gun/energy/gun/nuclear/proc/update_reactor()
- if(crit_fail)
- overlays += "nucgun-crit"
- return
- if(lightfail)
- overlays += "nucgun-medium"
- else if ((power_supply.charge/power_supply.maxcharge) <= 0.5)
- overlays += "nucgun-light"
- else
- overlays += "nucgun-clean"
-
-
-/obj/item/weapon/gun/energy/gun/nuclear/proc/update_mode()
- if (select == 1)
- overlays += "nucgun-stun"
- else if (select == 2)
- overlays += "nucgun-kill"
-
-
/obj/item/weapon/gun/energy/gun/nuclear/emp_act(severity)
..()
reliability -= round(15/severity)
-
/obj/item/weapon/gun/energy/gun/nuclear/update_icon()
- overlays.Cut()
- update_charge()
- update_reactor()
- update_mode()
-
-/obj/item/weapon/gun/energy/gun/turret
- name = "hybrid turret gun"
- desc = "A heavy hybrid energy cannon with two settings: Stun and kill."
- icon_state = "turretlaser"
- slot_flags = null
- w_class = 5
- ammo_type = list(/obj/item/ammo_casing/energy/electrode, /obj/item/ammo_casing/energy/laser)
- heavy_weapon = 1
- can_flashlight = 0
- trigger_guard = 0
-
-/obj/item/weapon/gun/energy/gun/turret/update_icon()
- icon_state = initial(icon_state)
\ No newline at end of file
+ ..()
+ overlays += "[icon_state]_fail_[fail_state]"
diff --git a/code/modules/projectiles/guns/energy/pulse.dm b/code/modules/projectiles/guns/energy/pulse.dm
index 734b408bfba..18706908c93 100644
--- a/code/modules/projectiles/guns/energy/pulse.dm
+++ b/code/modules/projectiles/guns/energy/pulse.dm
@@ -28,6 +28,8 @@
item_state = "pulse"
cell_type = "/obj/item/weapon/stock_parts/cell/pulse/carbine"
can_flashlight = 1
+ flight_x_offset = 18
+ flight_y_offset = 12
/obj/item/weapon/gun/energy/pulse/carbine/loyalpin
pin = /obj/item/device/firing_pin/implant/loyalty
diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm
index 78d77697bab..45e936f8867 100644
--- a/code/modules/projectiles/guns/energy/special.dm
+++ b/code/modules/projectiles/guns/energy/special.dm
@@ -9,7 +9,9 @@
flags = CONDUCT
slot_flags = SLOT_BACK
ammo_type = list(/obj/item/ammo_casing/energy/ion)
-
+ ammo_x_offset = 3
+ flight_x_offset = 17
+ flight_y_offset = 9
/obj/item/weapon/gun/energy/ionrifle/emp_act(severity)
return
@@ -18,11 +20,13 @@
name = "ion carbine"
desc = "The MK.II Prototype Ion Projector is a lightweight carbine version of the larger ion rifle, built to be ergonomic and efficient."
icon_state = "ioncarbine"
- item_state = "ioncarbine"
origin_tech = "combat=4;magnets=4;materials=4"
w_class = 3
slot_flags = SLOT_BELT
pin = null
+ ammo_x_offset = 2
+ flight_x_offset = 18
+ flight_y_offset = 11
/obj/item/weapon/gun/energy/decloner
name = "biological demolecularisor"
@@ -31,6 +35,13 @@
origin_tech = "combat=5;materials=4;powerstorage=3"
ammo_type = list(/obj/item/ammo_casing/energy/declone)
pin = null
+ ammo_x_offset = 1
+
+/obj/item/weapon/gun/energy/decloner/update_icon()
+ ..()
+ var/obj/item/ammo_casing/energy/shot = ammo_type[select]
+ if(power_supply.charge > shot.e_cost)
+ overlays += "decloner_spin"
/obj/item/weapon/gun/energy/floragun
name = "floral somatoray"
@@ -41,7 +52,6 @@
origin_tech = "materials=2;biotech=3;powerstorage=3"
modifystate = 1
var/charge_tick = 0
- var/mode = 0 //0 = mutate, 1 = yield boost
/obj/item/weapon/gun/energy/floragun/New()
..()
@@ -115,6 +125,7 @@
desc = "A prototype weapon recovered from the ruins of Research-Station Epsilon."
icon_state = "xray"
ammo_type = list(/obj/item/ammo_casing/energy/mindflayer)
+ ammo_x_offset = 2
/obj/item/weapon/gun/energy/kinetic_accelerator
name = "proto-kinetic accelerator"
@@ -151,6 +162,13 @@
update_icon()
return
+/obj/item/weapon/gun/energy/kinetic_accelerator/update_icon()
+ var/obj/item/ammo_casing/energy/shot = ammo_type[select]
+ if(power_supply.charge < shot.e_cost)
+ icon_state = "[initial(icon_state)]_empty"
+ else
+ icon_state = initial(icon_state)
+
/obj/item/weapon/gun/energy/kinetic_accelerator/crossbow
name = "mini energy crossbow"
desc = "A weapon favored by syndicate stealth specialists."
@@ -205,51 +223,15 @@
else
..()
+/obj/item/weapon/gun/energy/plasmacutter/update_icon()
+ return
+
/obj/item/weapon/gun/energy/plasmacutter/adv
name = "advanced plasma cutter"
icon_state = "adv_plasmacutter"
origin_tech = "combat=3;materials=4;magnets=3;plasmatech=3;engineering=2"
ammo_type = list(/obj/item/ammo_casing/energy/plasma/adv)
-/obj/item/weapon/gun/energy/disabler
- name = "disabler"
- desc = "A self-defense weapon that exhausts organic targets, weakening them until they collapse."
- icon_state = "disabler"
- item_state = null
- ammo_type = list(/obj/item/ammo_casing/energy/disabler)
-
-/obj/item/weapon/gun/energy/disabler/cyborg
- name = "cyborg disabler"
- desc = "An integrated disabler that draws from a cyborg's power cell. This weapon contains a limiter to prevent the cyborg's power cell from overheating."
- var/charge_tick = 0
- var/recharge_time = 2.5
- can_charge = 0
-
-/obj/item/weapon/gun/energy/disabler/cyborg/New()
- ..()
- SSobj.processing |= src
-
-
-/obj/item/weapon/gun/energy/disabler/cyborg/Destroy()
- SSobj.processing.Remove(src)
- ..()
-
-/obj/item/weapon/gun/energy/disabler/cyborg/process() //Every [recharge_time] ticks, recharge a shot for the cyborg
- charge_tick++
- if(charge_tick < recharge_time) return 0
- charge_tick = 0
-
- if(!power_supply) return 0 //sanity
- if(isrobot(src.loc))
- var/mob/living/silicon/robot/R = src.loc
- if(R && R.cell)
- var/obj/item/ammo_casing/energy/shot = ammo_type[select] //Necessary to find cost of shot
- if(R.cell.use(shot.e_cost)) //Take power from the borg...
- power_supply.give(shot.e_cost) //... to recharge the shot
-
- update_icon()
- return 1
-
/obj/item/weapon/gun/energy/wormhole_projector
name = "bluespace wormhole projector"
desc = "A projector that emits high density quantum-coupled bluespace beams."
@@ -261,6 +243,7 @@
/obj/item/weapon/gun/energy/wormhole_projector/update_icon()
icon_state = "[initial(icon_state)][select]"
+ item_state = icon_state
return
/obj/item/weapon/gun/energy/wormhole_projector/attack_self(mob/living/user)
@@ -333,3 +316,17 @@
power_supply.give(shot.e_cost) //...to recharge the shot
return 1
+
+/obj/item/weapon/gun/energy/temperature
+ name = "temperature gun"
+ icon_state = "freezegun"
+ desc = "A gun that changes temperatures."
+ origin_tech = "combat=3;materials=4;powerstorage=3;magnets=2"
+ ammo_type = list(/obj/item/ammo_casing/energy/temp, /obj/item/ammo_casing/energy/temp/hot)
+ cell_type = "/obj/item/weapon/stock_parts/cell/high"
+ pin = null
+
+/obj/item/weapon/gun/energy/temperature/attack_self(mob/living/user)
+ select_fire(user)
+ update_icon()
+ return
diff --git a/code/modules/projectiles/guns/energy/stun.dm b/code/modules/projectiles/guns/energy/stun.dm
index 413dff9ad14..6659fe329cd 100644
--- a/code/modules/projectiles/guns/energy/stun.dm
+++ b/code/modules/projectiles/guns/energy/stun.dm
@@ -1,18 +1,20 @@
-
/obj/item/weapon/gun/energy/taser
name = "taser gun"
desc = "A low-capacity, energy-based stun gun used by security teams to subdue targets at range."
icon_state = "taser"
item_state = null //so the human update icon uses the icon_state instead.
ammo_type = list(/obj/item/ammo_casing/energy/electrode)
+ ammo_x_offset = 3
/obj/item/weapon/gun/energy/stunrevolver
name = "stun revolver"
desc = "A high-tech revolver that fires internal, reusable taser cartridges in a revolving cylinder. The cartridges can be recharged using conventional rechargers."
icon_state = "stunrevolver"
+ item_state = "gun"
ammo_type = list(/obj/item/ammo_casing/energy/electrode/gun)
can_flashlight = 0
pin = null
+ ammo_x_offset = 1
/obj/item/weapon/gun/energy/gun/advtaser
name = "hybrid taser"
@@ -20,6 +22,7 @@
icon_state = "advtaser"
ammo_type = list(/obj/item/ammo_casing/energy/electrode, /obj/item/ammo_casing/energy/disabler)
origin_tech = null
+ ammo_x_offset = 2
/obj/item/weapon/gun/energy/gun/advtaser/cyborg
name = "cyborg taser"
@@ -52,3 +55,43 @@
update_icon()
return 1
+
+/obj/item/weapon/gun/energy/disabler
+ name = "disabler"
+ desc = "A self-defense weapon that exhausts organic targets, weakening them until they collapse."
+ icon_state = "disabler"
+ item_state = null
+ ammo_type = list(/obj/item/ammo_casing/energy/disabler)
+ ammo_x_offset = 3
+
+/obj/item/weapon/gun/energy/disabler/cyborg
+ name = "cyborg disabler"
+ desc = "An integrated disabler that draws from a cyborg's power cell. This weapon contains a limiter to prevent the cyborg's power cell from overheating."
+ var/charge_tick = 0
+ var/recharge_time = 2.5
+ can_charge = 0
+
+/obj/item/weapon/gun/energy/disabler/cyborg/New()
+ ..()
+ SSobj.processing |= src
+
+
+/obj/item/weapon/gun/energy/disabler/cyborg/Destroy()
+ SSobj.processing.Remove(src)
+ ..()
+
+/obj/item/weapon/gun/energy/disabler/cyborg/process() //Every [recharge_time] ticks, recharge a shot for the cyborg
+ charge_tick++
+ if(charge_tick < recharge_time) return 0
+ charge_tick = 0
+
+ if(!power_supply) return 0 //sanity
+ if(isrobot(src.loc))
+ var/mob/living/silicon/robot/R = src.loc
+ if(R && R.cell)
+ var/obj/item/ammo_casing/energy/shot = ammo_type[select] //Necessary to find cost of shot
+ if(R.cell.use(shot.e_cost)) //Take power from the borg...
+ power_supply.give(shot.e_cost) //... to recharge the shot
+
+ update_icon()
+ return 1
\ No newline at end of file
diff --git a/code/modules/projectiles/guns/energy/temperature.dm b/code/modules/projectiles/guns/energy/temperature.dm
deleted file mode 100644
index cdf7625e393..00000000000
--- a/code/modules/projectiles/guns/energy/temperature.dm
+++ /dev/null
@@ -1,14 +0,0 @@
-/obj/item/weapon/gun/energy/temperature
- name = "temperature gun"
- icon_state = "freezegun"
- desc = "A gun that changes temperatures."
- origin_tech = "combat=3;materials=4;powerstorage=3;magnets=2"
- ammo_type = list(/obj/item/ammo_casing/energy/temp, /obj/item/ammo_casing/energy/temp/hot)
- cell_type = "/obj/item/weapon/stock_parts/cell/high"
- pin = null
-
-
-/obj/item/weapon/gun/energy/temperature/attack_self(mob/living/user)
- select_fire(user)
- update_icon()
- return
\ No newline at end of file
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index 29931e4e7bc..0a1eddc7eb5 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -92,7 +92,7 @@
return 50 //if the projectile doesn't do damage, play its hitsound at 50% volume
/obj/item/projectile/Bump(atom/A, yes)
- if(!yes) //prevents multi bumps.
+ if(!yes) //prevents double bumps.
return
if(A == firer || A == src)
loc = A.loc
diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm
index 66a9e77c9ad..84bbe11872b 100644
--- a/code/modules/projectiles/projectile/bullets.dm
+++ b/code/modules/projectiles/projectile/bullets.dm
@@ -6,10 +6,6 @@
nodamage = 0
flag = "bullet"
-/obj/item/projectile/bullet/revolver
- damage = 60
- armour_penetration = 10
-
/obj/item/projectile/bullet/weakbullet //beanbag, heavy stamina damage
damage = 5
diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm
index 26955d0284d..5dc555550e2 100644
--- a/code/modules/reagents/Chemistry-Recipes.dm
+++ b/code/modules/reagents/Chemistry-Recipes.dm
@@ -67,8 +67,8 @@
playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1)
- for(var/mob/living/carbon/human/H in viewers(get_turf(holder.my_atom), null))
- H.flash_eyes()
+ for(var/mob/living/carbon/C in viewers(get_turf(holder.my_atom), null))
+ C.flash_eyes()
for(var/i = 1, i <= amount_to_spawn, i++)
var/chosen = pick(critters)
var/mob/living/simple_animal/hostile/C = new chosen
diff --git a/code/modules/reagents/Chemistry-Recipes/Slime_extracts.dm b/code/modules/reagents/Chemistry-Recipes/Slime_extracts.dm
index 49048502ad0..46f1d7a1e74 100644
--- a/code/modules/reagents/Chemistry-Recipes/Slime_extracts.dm
+++ b/code/modules/reagents/Chemistry-Recipes/Slime_extracts.dm
@@ -159,8 +159,8 @@
playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1)
- for(var/mob/living/carbon/human/M in viewers(get_turf(holder.my_atom), null))
- M.flash_eyes()
+ for(var/mob/living/carbon/C in viewers(get_turf(holder.my_atom), null))
+ C.flash_eyes()
for(var/i = 1, i <= 4 + rand(1,2), i++)
var/chosen = pick(borks)
@@ -191,7 +191,7 @@
playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1)
- for(var/mob/living/carbon/human/M in viewers(get_turf(holder.my_atom), null))
+ for(var/mob/living/carbon/M in viewers(get_turf(holder.my_atom), null))
M.flash_eyes()
for(var/i = 1, i <= 4 + rand(1,2), i++)
diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm
index c75e6c3e82d..b64d21f6c14 100644
--- a/code/modules/reagents/reagent_containers.dm
+++ b/code/modules/reagents/reagent_containers.dm
@@ -79,8 +79,8 @@
reagents.handle_reactions()
..()
-/obj/item/weapon/reagent_containers/throw_impact(atom/target,mob/thrower)
- ..()
+/obj/item/weapon/reagent_containers/throw_impact(atom/target)
+ . = ..()
if(!reagents.total_volume || !spillable)
return
@@ -96,12 +96,11 @@
R += A.id + " ("
R += num2text(A.volume) + "),"
-
+ if(thrownby)
+ add_logs(thrownby, M, "splashed", R)
reagents.reaction(target, TOUCH)
- if(thrower)
- add_logs(thrower, M, "splashed", R)
- else if((!target.density || target.throwpass) && thrower && thrower.mind && thrower.mind.assigned_role == "Bartender")
+ else if((target.CanPass(src, get_turf(src))) && thrownby && thrownby.mind && thrownby.mind.assigned_role == "Bartender")
visible_message("[src] lands onto the [target.name] without spilling a single drop.")
return
diff --git a/code/modules/research/designs/mecha_designs.dm b/code/modules/research/designs/mecha_designs.dm
index 95d25e4592b..a93cf7e7b52 100644
--- a/code/modules/research/designs/mecha_designs.dm
+++ b/code/modules/research/designs/mecha_designs.dm
@@ -227,7 +227,7 @@
id = "mech_grenade_launcher"
build_type = MECHFAB
req_tech = list("combat" = 3)
- build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang
+ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/flashbang
materials = list(MAT_METAL=22000,MAT_GOLD=6000,MAT_SILVER=8000)
construction_time = 100
category = list("Exosuit Equipment")
@@ -238,7 +238,7 @@
id = "mech_missile_rack"
build_type = MECHFAB
req_tech = list("combat" = 6, "materials" = 6)
- build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack
+ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/missile_rack
materials = list(MAT_METAL=22000,MAT_GOLD=6000,MAT_SILVER=8000)
construction_time = 100
category = list("Exosuit Equipment")
@@ -249,7 +249,7 @@
id = "clusterbang_launcher"
build_type = MECHFAB
req_tech = list("combat"= 5, "materials" = 5, "syndicate" = 3)
- build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang/clusterbang
+ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/flashbang/clusterbang
materials = list(MAT_METAL=20000,MAT_GOLD=10000,MAT_URANIUM=10000)
construction_time = 100
category = list("Exosuit Equipment")
@@ -282,7 +282,7 @@
id = "mech_rcd"
build_type = MECHFAB
req_tech = list("materials" = 4, "bluespace" = 3, "magnets" = 4, "powerstorage"=4, "engineering" = 4)
- build_path = /obj/item/mecha_parts/mecha_equipment/tool/rcd
+ build_path = /obj/item/mecha_parts/mecha_equipment/rcd
materials = list(MAT_METAL=30000,MAT_GOLD=20000,MAT_PLASMA=25000,MAT_SILVER=20000)
construction_time = 1200
category = list("Exosuit Equipment")
@@ -348,7 +348,7 @@
id = "mech_diamond_drill"
build_type = MECHFAB
req_tech = list("materials" = 4, "engineering" = 3)
- build_path = /obj/item/mecha_parts/mecha_equipment/tool/drill/diamonddrill
+ build_path = /obj/item/mecha_parts/mecha_equipment/drill/diamonddrill
materials = list(MAT_METAL=10000,MAT_DIAMOND=6500)
construction_time = 100
category = list("Exosuit Equipment")
diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm
index ce602a5e800..c3a14613b65 100644
--- a/code/modules/research/designs/mechfabricator_designs.dm
+++ b/code/modules/research/designs/mechfabricator_designs.dm
@@ -490,7 +490,7 @@
name = "Exosuit Engineering Equipment (Hydraulic Clamp)"
id = "mech_hydraulic_clamp"
build_type = MECHFAB
- build_path = /obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp
+ build_path = /obj/item/mecha_parts/mecha_equipment/hydraulic_clamp
materials = list(MAT_METAL=10000)
construction_time = 100
category = list("Exosuit Equipment")
@@ -499,7 +499,7 @@
name = "Exosuit Engineering Equipment (Drill)"
id = "mech_drill"
build_type = MECHFAB
- build_path = /obj/item/mecha_parts/mecha_equipment/tool/drill
+ build_path = /obj/item/mecha_parts/mecha_equipment/drill
materials = list(MAT_METAL=10000)
construction_time = 100
category = list("Exosuit Equipment")
@@ -508,7 +508,7 @@
name = "Exosuit Engineering Equipement (Mining Scanner)"
id = "mech_mscanner"
build_type = MECHFAB
- build_path = /obj/item/mecha_parts/mecha_equipment/tool/mining_scanner
+ build_path = /obj/item/mecha_parts/mecha_equipment/mining_scanner
materials = list(MAT_METAL=5000,MAT_GLASS=2500)
construction_time = 50
category = list("Exosuit Equipment")
@@ -517,7 +517,7 @@
name = "Exosuit Engineering Equipment (Extinguisher)"
id = "mech_extinguisher"
build_type = MECHFAB
- build_path = /obj/item/mecha_parts/mecha_equipment/tool/extinguisher
+ build_path = /obj/item/mecha_parts/mecha_equipment/extinguisher
materials = list(MAT_METAL=10000)
construction_time = 100
category = list("Exosuit Equipment")
@@ -526,7 +526,7 @@
name = "Exosuit Engineering Equipment (Cable Layer)"
id = "mech_cable_layer"
build_type = MECHFAB
- build_path = /obj/item/mecha_parts/mecha_equipment/tool/cable_layer
+ build_path = /obj/item/mecha_parts/mecha_equipment/cable_layer
materials = list(MAT_METAL=10000)
construction_time = 100
category = list("Exosuit Equipment")
@@ -535,7 +535,7 @@
name = "Exosuit Medical Equipment (Mounted Sleeper)"
id = "mech_sleeper"
build_type = MECHFAB
- build_path = /obj/item/mecha_parts/mecha_equipment/tool/sleeper
+ build_path = /obj/item/mecha_parts/mecha_equipment/sleeper
materials = list(MAT_METAL=5000,MAT_GLASS=10000)
construction_time = 100
category = list("Exosuit Equipment")
@@ -544,7 +544,7 @@
name = "Exosuit Medical Equipment (Syringe Gun)"
id = "mech_syringe_gun"
build_type = MECHFAB
- build_path = /obj/item/mecha_parts/mecha_equipment/tool/syringe_gun
+ build_path = /obj/item/mecha_parts/mecha_equipment/syringe_gun
materials = list(MAT_METAL=3000,MAT_GLASS=2000)
construction_time = 200
category = list("Exosuit Equipment")
@@ -580,7 +580,7 @@
name = "H.O.N.K Mousetrap Mortar"
id = "mech_mousetrap_mortar"
build_type = MECHFAB
- build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/mousetrap_mortar
+ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/mousetrap_mortar
materials = list(MAT_METAL=20000,MAT_BANANIUM=5000)
construction_time = 300
category = list("Exosuit Equipment")
@@ -589,7 +589,7 @@
name = "H.O.N.K Banana Mortar"
id = "mech_banana_mortar"
build_type = MECHFAB
- build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/banana_mortar
+ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/banana_mortar
materials = list(MAT_METAL=20000,MAT_BANANIUM=5000)
construction_time = 300
category = list("Exosuit Equipment")
diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm
index dfbb6085368..cbb37c661d3 100644
--- a/code/modules/shuttle/shuttle.dm
+++ b/code/modules/shuttle/shuttle.dm
@@ -22,7 +22,8 @@
/obj/docking_port/Destroy()
return QDEL_HINT_LETMELIVE
-
+/obj/docking_port/shuttleRotate()
+ return //we don't rotate with shuttles via this code.
//returns a list(x0,y0, x1,y1) where points 0 and 1 are bounding corners of the projected rectangle
/obj/docking_port/proc/return_coords(_x, _y, _dir)
if(!_dir)
@@ -267,6 +268,27 @@
else
WARNING("shuttle \"[id]\" could not enter transit space. S0=[S0 ? S0.id : "null"] S1=[S1 ? S1.id : "null"]")
+//default shuttleRotate
+/atom/proc/shuttleRotate(rotation)
+ //rotate our direction
+ dir = angle2dir(rotation+dir2angle(dir))
+
+ //resmooth if need be.
+ if(smooth)
+ smooth_icon(src)
+
+ //rotate the pixel offsets too.
+ if (pixel_x || pixel_y)
+ if (rotation < 0)
+ rotation += 360
+ for (var/turntimes=rotation/90;turntimes>0;turntimes--)
+ var/oldPX = pixel_x
+ var/oldPY = pixel_y
+ pixel_x = oldPY
+ pixel_y = (oldPX*(-1))
+
+
+
//this is the main proc. It instantly moves our mobile port to stationary port S1
//it handles all the generic behaviour, such as sanity checks, closing doors on the shuttle, stunning mobs, etc
/obj/docking_port/mobile/proc/dock(obj/docking_port/stationary/S1)
@@ -296,6 +318,13 @@
var/list/L0 = return_ordered_turfs(x, y, z, dir, areaInstance)
var/list/L1 = return_ordered_turfs(S1.x, S1.y, S1.z, S1.dir)
+ var/rotation = dir2angle(S1.dir)-dir2angle(dir)
+ if ((rotation % 90) != 0)
+ rotation += (rotation % 90) //diagonal rotations not allowed, round up
+ rotation = SimplifyDegrees(rotation)
+
+
+
//remove area surrounding docking port
if(areaInstance.contents.len)
var/area/A0 = locate("[area_type]")
@@ -315,6 +344,18 @@
if(!T1)
continue
+
+ //lighting stuff
+ T1.redraw_lighting()
+ SSair.remove_from_active(T1)
+ T1.CalculateAdjacentTurfs()
+ SSair.add_to_active(T1,1)
+
+ T0.redraw_lighting()
+ SSair.remove_from_active(T0)
+ T0.CalculateAdjacentTurfs()
+ SSair.add_to_active(T0,1)
+
T0.copyTurf(T1)
areaInstance.contents += T1
@@ -324,54 +365,49 @@
Ts1.copy_air_with_tile(T0)
//move mobile to new location
- loc = S1.loc
- dir = S1.dir
- //move all objects
- for(var/obj/O in T0)
- if(O.invisibility >= 101)
- continue
- if(O == T0.lighting_object)
- continue
- O.loc = T1
- //close open doors
- if(istype(O, /obj/machinery/door))
- var/obj/machinery/door/Door = O
- spawn(-1)
- if(Door)
- Door.close()
- for(var/mob/M in T0)
- if(!M.move_on_shuttle)
- continue
- M.loc = T1
+ for(var/atom/movable/AM in T0)
+ if (rotation)
+ AM.shuttleRotate(rotation)
- //docking turbulence
- if(M.client)
- spawn(0)
- if(M.buckled)
- shake_camera(M, 2, 1) // turn it down a bit come on
- else
- shake_camera(M, 7, 1)
- if(istype(M, /mob/living/carbon))
- if(!M.buckled)
- M.Weaken(3)
+ if (istype(AM,/obj))
+ var/obj/O = AM
+ if(O.invisibility >= 101)
+ continue
+ if(O == T0.lighting_object)
+ continue
+ O.loc = T1
+
+ //close open doors
+ if(istype(O, /obj/machinery/door))
+ var/obj/machinery/door/Door = O
+ spawn(-1)
+ if(Door)
+ Door.close()
+ else if (istype(AM,/mob))
+ var/mob/M = AM
+ if(!M.move_on_shuttle)
+ continue
+ M.loc = T1
+
+ //docking turbulence
+ if(M.client)
+ spawn(0)
+ if(M.buckled)
+ shake_camera(M, 2, 1) // turn it down a bit come on
+ else
+ shake_camera(M, 7, 1)
+ if(istype(M, /mob/living/carbon))
+ if(!M.buckled)
+ M.Weaken(3)
T0.ChangeTurf(turf_type)
-
- //air system updates
- for(var/turf/T1 in L1)
- T1.redraw_lighting()
- SSair.remove_from_active(T1)
- T1.CalculateAdjacentTurfs()
- SSair.add_to_active(T1,1)
-
- for(var/turf/T0 in L0)
- T0.redraw_lighting()
- SSair.remove_from_active(T0)
- T0.CalculateAdjacentTurfs()
- SSair.add_to_active(T0,1)
+ if (rotation)
+ T1.shuttleRotate(rotation)
+ loc = S1.loc
+ dir = S1.dir
/*
if(istype(S1, /obj/docking_port/stationary/transit))
@@ -381,6 +417,8 @@
T.update_icon()
*/
+
+
/obj/docking_port/mobile/proc/findTransitDock()
var/obj/docking_port/stationary/transit/T = SSshuttle.getDock("[id]_transit")
if(T && !canDock(T))
diff --git a/code/modules/telesci/bscrystal.dm b/code/modules/telesci/bscrystal.dm
index 589731a3635..811ef4d991f 100644
--- a/code/modules/telesci/bscrystal.dm
+++ b/code/modules/telesci/bscrystal.dm
@@ -28,13 +28,14 @@
do_teleport(L, get_turf(L), blink_range, asoundin = 'sound/effects/phasein.ogg')
/obj/item/bluespace_crystal/throw_impact(atom/hit_atom)
- ..()
- visible_message("[src] fizzles and disappears upon impact!")
- PoolOrNew(/obj/effect/effect/sparks, loc)
- playsound(src.loc, "sparks", 50, 1)
- if(isliving(hit_atom))
- blink_mob(hit_atom)
- qdel(src)
+ if(!..()) // not caught in mid-air
+ visible_message("[src] fizzles and disappears upon impact!")
+ var/turf/T = get_turf(hit_atom)
+ PoolOrNew(/obj/effect/effect/sparks, T)
+ playsound(src.loc, "sparks", 50, 1)
+ if(isliving(hit_atom))
+ blink_mob(hit_atom)
+ qdel(src)
// Artifical bluespace crystal, doesn't give you much research.
diff --git a/config/admins.txt b/config/admins.txt
index d1ebfc143f5..2151cab1b2a 100644
--- a/config/admins.txt
+++ b/config/admins.txt
@@ -88,4 +88,5 @@ ACCount12 = Game Master
fayrik = Game Master
shadowlight213 = Game Master
drovidicorv = Game Master
-Dunc = Game Master
\ No newline at end of file
+Dunc = Game Master
+MMMiracles = Game Master
\ No newline at end of file
diff --git a/html/changelog.html b/html/changelog.html
index aea82df7180..6bd224a07fc 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -55,6 +55,49 @@
-->
+
21 July 2015
+
Fayrik updated:
+
+
Syndicate Donksoft gear now costs less.
+
+
phil235 updated:
+
+
Thrown things no longer bounces off walls, unless they're in no gravity. Heavy items and mobs thrown can push the mobs and non anchored objects they land on. Throwing a mob onto a mob in no gravity will push each one in opposite direction. Thrown mobs landing on wall, or dense object or mob gets stunned and a bit injured. The damage when mob hit a wall is nerfed.
+
+
+
20 July 2015
+
AnturK updated:
+
+
Lightning Bolt now always bounces 5 times and deals 15 to 50 burn damage to each target depending on the chargeup
+
+
KorPaheron updated:
+
+
Added the Multiverse Sword, a new wizard artifact that can summon clones of yourself from other universes, allowing for dangerous amounts of recursion.
+
+
phil235 updated:
+
+
Mechs no longer use object verbs and the exosuit interface tab. They now use action buttons. Mechs now have a cycle equipment action button to change weapon faster than by using the view stats window. Mechs get two special alerts when their battery or health is low. Mechs now properly consume energy when moving and having their lights on. Using a mech tool that takes time to act now shows a progress bar (e.g. mech drill).
+
Mechs now have a cycle equipment action button to change weapon faster than by using the view stats window.
+
Mechs get two special alerts when their battery or health is low.
+
Mechs now properly consume energy when moving and having their lights on.
+
Using a mech tool that takes time to act now shows a progress bar (e.g. mech drill).
+
+
+
19 July 2015
+
Gun Hog updated:
+
+
Nanotrasen advancements in cyborg technology now allow for integrated headlamps! As such, the flashlight package normally used as a module is now seamlessly merged with their systems!
+
+
Ikarrus updated:
+
+
Asimov's subject of "human beings" can now be modified by uploaders.
+
Eaxmining AI modules while adjacent to them will show you what laws it will upload.
+
+
MMMiracles updated:
+
+
Adds a TWANG sound effect when hitting things with a guitar.
+
+
18 July 2015
AlexanderUlanH updated:
@@ -73,8 +116,6 @@
Steelpoint updated:
Reduced weight of Sechailer, it now fits in boxes.
-
Increased armor values of HoS, ERT and DS suits.
-
Revolver bullets now have armor penetration.
phil updated:
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index 6d8344cf85a..a7dfecdf898 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -1255,8 +1255,6 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
said, to allow them to better impersonate their victim's speech patterns
Steelpoint:
- tweak: Reduced weight of Sechailer, it now fits in boxes.
- - tweak: Increased armor values of HoS, ERT and DS suits.
- - rscadd: Revolver bullets now have armor penetration.
phil:
- tweak: Smoke and foam touch reactions gets buffed.
- rscadd: Reagent dispensers (watertank, fueltank) tells you how much reagents they
@@ -1265,3 +1263,43 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
sorium, blob sorium, liquid dark matter and blob liquid dark matter are now
scaled by their volume. Sorium/LDM blob's touch now throws the mobs who are
close but simply moves the mobs that are further away.
+2015-07-19:
+ Gun Hog:
+ - rscadd: Nanotrasen advancements in cyborg technology now allow for integrated
+ headlamps! As such, the flashlight package normally used as a module is now
+ seamlessly merged with their systems!
+ Ikarrus:
+ - rscadd: Asimov's subject of "human beings" can now be modified by uploaders.
+ - rscadd: Eaxmining AI modules while adjacent to them will show you what laws it
+ will upload.
+ MMMiracles:
+ - soundadd: Adds a TWANG sound effect when hitting things with a guitar.
+2015-07-20:
+ AnturK:
+ - tweak: Lightning Bolt now always bounces 5 times and deals 15 to 50 burn damage
+ to each target depending on the chargeup
+ KorPaheron:
+ - rscadd: Added the Multiverse Sword, a new wizard artifact that can summon clones
+ of yourself from other universes, allowing for dangerous amounts of recursion.
+ phil235:
+ - tweak: Mechs no longer use object verbs and the exosuit interface tab. They now
+ use action buttons. Mechs now have a cycle equipment action button to change
+ weapon faster than by using the view stats window. Mechs get two special alerts
+ when their battery or health is low. Mechs now properly consume energy when
+ moving and having their lights on. Using a mech tool that takes time to act
+ now shows a progress bar (e.g. mech drill).
+ - rscadd: Mechs now have a cycle equipment action button to change weapon faster
+ than by using the view stats window.
+ - rscadd: Mechs get two special alerts when their battery or health is low.
+ - tweak: Mechs now properly consume energy when moving and having their lights on.
+ - rscadd: Using a mech tool that takes time to act now shows a progress bar (e.g.
+ mech drill).
+2015-07-21:
+ Fayrik:
+ - tweak: Syndicate Donksoft gear now costs less.
+ phil235:
+ - tweak: Thrown things no longer bounces off walls, unless they're in no gravity.
+ Heavy items and mobs thrown can push the mobs and non anchored objects they
+ land on. Throwing a mob onto a mob in no gravity will push each one in opposite
+ direction. Thrown mobs landing on wall, or dense object or mob gets stunned
+ and a bit injured. The damage when mob hit a wall is nerfed.
diff --git a/icons/effects/crayondecal.dmi b/icons/effects/crayondecal.dmi
index 42625cc7790..5c44f86b6cb 100644
Binary files a/icons/effects/crayondecal.dmi and b/icons/effects/crayondecal.dmi differ
diff --git a/icons/mob/actions.dmi b/icons/mob/actions.dmi
index 4ced7caebed..0636ebac478 100644
Binary files a/icons/mob/actions.dmi and b/icons/mob/actions.dmi differ
diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi
index 2918d313aa8..1157611aa23 100644
Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ
diff --git a/icons/mob/inhands/guns_lefthand.dmi b/icons/mob/inhands/guns_lefthand.dmi
index 062adfa003d..2bef3ec79b4 100644
Binary files a/icons/mob/inhands/guns_lefthand.dmi and b/icons/mob/inhands/guns_lefthand.dmi differ
diff --git a/icons/mob/inhands/guns_righthand.dmi b/icons/mob/inhands/guns_righthand.dmi
index 09a3bc50d40..9d72ffd4f4e 100644
Binary files a/icons/mob/inhands/guns_righthand.dmi and b/icons/mob/inhands/guns_righthand.dmi differ
diff --git a/icons/mob/robots.dmi b/icons/mob/robots.dmi
index d134e422131..6c532a75f43 100644
Binary files a/icons/mob/robots.dmi and b/icons/mob/robots.dmi differ
diff --git a/icons/mob/screen_alert.dmi b/icons/mob/screen_alert.dmi
index 0ed43592376..1b707cda5e0 100644
Binary files a/icons/mob/screen_alert.dmi and b/icons/mob/screen_alert.dmi differ
diff --git a/icons/mob/screen_cyborg.dmi b/icons/mob/screen_cyborg.dmi
index 002768f9d2a..b929a8c2395 100644
Binary files a/icons/mob/screen_cyborg.dmi and b/icons/mob/screen_cyborg.dmi differ
diff --git a/icons/obj/atmospherics/components/binary_devices.dmi b/icons/obj/atmospherics/components/binary_devices.dmi
index 832bf766d0f..540bf3b771c 100644
Binary files a/icons/obj/atmospherics/components/binary_devices.dmi and b/icons/obj/atmospherics/components/binary_devices.dmi differ
diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi
index 9bc5f822c87..d73ae4f3b36 100644
Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ
diff --git a/icons/obj/guns/energy.dmi b/icons/obj/guns/energy.dmi
index 09fa557ac1a..f225be2dcf2 100644
Binary files a/icons/obj/guns/energy.dmi and b/icons/obj/guns/energy.dmi differ
diff --git a/sound/weapons/stringsmash.ogg b/sound/weapons/stringsmash.ogg
new file mode 100644
index 00000000000..ea96bc0b50b
Binary files /dev/null and b/sound/weapons/stringsmash.ogg differ
diff --git a/tgstation.dme b/tgstation.dme
index 02d69cfb412..12a7b87c0ee 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -219,7 +219,6 @@
#include "code\datums\helper_datums\construction_datum.dm"
#include "code\datums\helper_datums\events.dm"
#include "code\datums\helper_datums\getrev.dm"
-#include "code\datums\helper_datums\global_iterator.dm"
#include "code\datums\helper_datums\icon_snapshot.dm"
#include "code\datums\helper_datums\teleport.dm"
#include "code\datums\helper_datums\topic_input.dm"
@@ -503,7 +502,9 @@
#include "code\game\mecha\mecha.dm"
#include "code\game\mecha\mecha_construction_paths.dm"
#include "code\game\mecha\mecha_control_console.dm"
+#include "code\game\mecha\mecha_defense.dm"
#include "code\game\mecha\mecha_parts.dm"
+#include "code\game\mecha\mecha_topic.dm"
#include "code\game\mecha\mecha_wreckage.dm"
#include "code\game\mecha\combat\combat.dm"
#include "code\game\mecha\combat\durand.dm"
@@ -514,7 +515,9 @@
#include "code\game\mecha\combat\reticence.dm"
#include "code\game\mecha\equipment\mecha_equipment.dm"
#include "code\game\mecha\equipment\tools\medical_tools.dm"
-#include "code\game\mecha\equipment\tools\tools.dm"
+#include "code\game\mecha\equipment\tools\mining_tools.dm"
+#include "code\game\mecha\equipment\tools\other_tools.dm"
+#include "code\game\mecha\equipment\tools\work_tools.dm"
#include "code\game\mecha\equipment\weapons\weapons.dm"
#include "code\game\mecha\medical\medical.dm"
#include "code\game\mecha\medical\odysseus.dm"
@@ -1378,7 +1381,6 @@
#include "code\modules\projectiles\guns\energy\pulse.dm"
#include "code\modules\projectiles\guns\energy\special.dm"
#include "code\modules\projectiles\guns\energy\stun.dm"
-#include "code\modules\projectiles\guns\energy\temperature.dm"
#include "code\modules\projectiles\guns\magic\staff.dm"
#include "code\modules\projectiles\guns\magic\wand.dm"
#include "code\modules\projectiles\guns\projectile\automatic.dm"