diff --git a/code/defines/obj/door.dm b/code/defines/obj/door.dm
index 6bd9856bb1a..71d2ebd57b2 100644
--- a/code/defines/obj/door.dm
+++ b/code/defines/obj/door.dm
@@ -12,7 +12,7 @@
var/operating = 0
anchored = 1
var/autoclose = 0
-
+ var/glass = 0
/obj/machinery/door/firedoor
diff --git a/code/defines/procs/gamehelpers.dm b/code/defines/procs/gamehelpers.dm
index 6e16c91e4f3..3ca6b5b89bb 100644
--- a/code/defines/procs/gamehelpers.dm
+++ b/code/defines/procs/gamehelpers.dm
@@ -28,9 +28,10 @@
/proc/in_range(source, user)
if(get_dist(source, user) <= 1)
return 1
+ /*
else//TK TODO: remove this
if(istype(user, /mob/living/carbon))
- if(user:mutations & PORTALS && get_dist(source, user) <= 7)
+ if(user:mutations & TK && get_dist(source, user) <= 7)
if(user:equipped()) return 0
var/X = source:x
var/Y = source:y
@@ -48,9 +49,7 @@
flick("empdisable",O)
spawn(5)
del(O)
-
-
- return 1
+ return 1*/
return 0 //not in range and not telekinetic
diff --git a/code/game/atom_procs.dm b/code/game/atom_procs.dm
index ba5ab8d69f8..c6e11693fd0 100644
--- a/code/game/atom_procs.dm
+++ b/code/game/atom_procs.dm
@@ -579,7 +579,7 @@ var/using_new_click_proc = 0 //TODO ERRORAGE (This is temporary, while the DblCl
else
return
- // ------- 1 TILE AWAY OR TELEKINETIC -------
+ // ------- 1 TILE AWAY -------
var/t5 = in_range(src, usr) || src.loc == usr
// ------- AI CAN CLICK ANYTHING -------
@@ -729,64 +729,6 @@ var/using_new_click_proc = 0 //TODO ERRORAGE (This is temporary, while the DblCl
// ------- YOU DO NOT HAVE AN ITEM IN YOUR HAND -------
if (istype(usr, /mob/living/carbon/human))
// ------- YOU ARE HUMAN -------
- if (usr:a_intent == "help")
- // ------- YOU HAVE THE HELP INTENT SELECTED -------
- if(istype(src, /mob/living/carbon))
- // ------- YOUR TARGET IS LIVING CARBON CREATURE (NOT AI OR CYBORG OR SIMPLE ANIMAL) -------
- var/mob/living/carbon/C = src
- if(usr:mutations & HEAL)
- // ------- YOU ARE HUMAN, WITH THE HELP INTENT TARGETING A HUMAN AND HAVE THE 'HEAT' GENETIC MUTATION -------
-
- if(C.stat != 2)
- // ------- THE PERSON YOU'RE TOUCHING IS NOT DEAD -------
-
- var/t_him = "it"
- if (src.gender == MALE)
- t_him = "his"
- else if (src.gender == FEMALE)
- t_him = "her"
- var/u_him = "it"
- if (usr.gender == MALE)
- t_him = "him"
- else if (usr.gender == FEMALE)
- t_him = "her"
-
- if(src != usr)
- usr.visible_message( \
- "\blue [usr] places [u_him] palms on [src], healing [t_him]!", \
- "\blue You place your palms on [src] and heal [t_him].", \
- )
- else
- usr.visible_message( \
- "\blue [usr] places [u_him] palms on [u_him]self and heals.", \
- "\blue You place your palms on yourself and heal.", \
- )
-
- C.oxyloss = max(0, C.oxyloss-25)
- C.toxloss = max(0, C.toxloss-25)
-
- if(istype(C, /mob/living/carbon/human))
- // ------- YOUR TARGET IS HUMAN -------
- var/mob/living/carbon/human/H = C
- var/datum/organ/external/affecting = H.get_organ(check_zone(usr:zone_sel:selecting))
- if(affecting && affecting.heal_damage(25, 25))
- H.UpdateDamageIcon()
- else
- C.heal_organ_damage(25, 25)
- C.cloneloss = max(0, C.cloneloss-25)
- C.stunned = max(0, C.stunned-5)
- C.paralysis = max(0, C.paralysis-5)
- C.stuttering = max(0, C.stuttering-5)
- C.drowsyness = max(0, C.drowsyness-5)
- C.weakened = max(0, C.weakened-5)
- usr:nutrition -= rand(1,10)
- usr.next_move = world.time + 6
- else
- // ------- PERSON YOU'RE TOUCHING IS ALREADY DEAD -------
- usr << "\red [src] is dead and can't be healed."
- return
-
- // ------- IF YOU DON'T HAVE THE SILLY ABILITY ABOVE OR FAIL ON ANY OTHER CHECK, THEN YOU'RE CLICKING ON SOMETHING WITH AN EMPTY HAND. ATTACK_HAND IT IS THEN -------
src.attack_hand(usr, usr.hand)
else
// ------- YOU ARE NOT HUMAN. WHAT ARE YOU - DETERMINED HERE AND PROPER ATTACK_MOBTYPE CALLED -------
@@ -906,3 +848,69 @@ var/using_new_click_proc = 0 //TODO ERRORAGE (This is temporary, while the DblCl
/obj/proc/process()
processing_objects.Remove(src)
return 0
+
+
+/*Really why was this in the click proc of all the places you could put it
+ if (usr:a_intent == "help")
+ // ------- YOU HAVE THE HELP INTENT SELECTED -------
+ if(istype(src, /mob/living/carbon))
+ // ------- YOUR TARGET IS LIVING CARBON CREATURE (NOT AI OR CYBORG OR SIMPLE ANIMAL) -------
+ var/mob/living/carbon/C = src
+ if(usr:mutations & HEAL)
+ // ------- YOU ARE HUMAN, WITH THE HELP INTENT TARGETING A HUMAN AND HAVE THE 'HEAT' GENETIC MUTATION -------
+
+ if(C.stat != 2)
+ // ------- THE PERSON YOU'RE TOUCHING IS NOT DEAD -------
+
+ var/t_him = "it"
+ if (src.gender == MALE)
+ t_him = "his"
+ else if (src.gender == FEMALE)
+ t_him = "her"
+ var/u_him = "it"
+ if (usr.gender == MALE)
+ t_him = "him"
+ else if (usr.gender == FEMALE)
+ t_him = "her"
+
+ if(src != usr)
+ usr.visible_message( \
+ "\blue [usr] places [u_him] palms on [src], healing [t_him]!", \
+ "\blue You place your palms on [src] and heal [t_him].", \
+ )
+ else
+ usr.visible_message( \
+ "\blue [usr] places [u_him] palms on [u_him]self and heals.", \
+ "\blue You place your palms on yourself and heal.", \
+ )
+
+ C.oxyloss = max(0, C.oxyloss-25)
+ C.toxloss = max(0, C.toxloss-25)
+
+ if(istype(C, /mob/living/carbon/human))
+ // ------- YOUR TARGET IS HUMAN -------
+ var/mob/living/carbon/human/H = C
+ var/datum/organ/external/affecting = H.get_organ(check_zone(usr:zone_sel:selecting))
+ if(affecting && affecting.heal_damage(25, 25))
+ H.UpdateDamageIcon()
+ else
+ C.heal_organ_damage(25, 25)
+ C.cloneloss = max(0, C.cloneloss-25)
+ C.stunned = max(0, C.stunned-5)
+ C.paralysis = max(0, C.paralysis-5)
+ C.stuttering = max(0, C.stuttering-5)
+ C.drowsyness = max(0, C.drowsyness-5)
+ C.weakened = max(0, C.weakened-5)
+ usr:nutrition -= rand(1,10)
+ usr.next_move = world.time + 6
+ else
+ // ------- PERSON YOU'RE TOUCHING IS ALREADY DEAD -------
+ usr << "\red [src] is dead and can't be healed."
+ return
+
+ // ------- IF YOU DON'T HAVE THE SILLY ABILITY ABOVE OR FAIL ON ANY OTHER CHECK, THEN YOU'RE CLICKING ON SOMETHING WITH AN EMPTY HAND. ATTACK_HAND IT IS THEN -------
+*/
+
+
+
+
diff --git a/code/game/dna.dm b/code/game/dna.dm
index 2aa3dd8c510..9966c04d567 100644
--- a/code/game/dna.dm
+++ b/code/game/dna.dm
@@ -357,7 +357,7 @@
if (isblockon(getblock(M.dna.struc_enzymes, TELEBLOCK,3),12))
if(inj || prob(15))
M << "\blue You feel smarter."
- M.mutations |= PORTALS
+ M.mutations |= TK
if (isblockon(getblock(M.dna.struc_enzymes, DEAFBLOCK,3),13))
M.sdisabilities |= 4
M.ear_deaf = 1
diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm
index 0c9b6ce8d56..dc33f5237d9 100644
--- a/code/game/gamemodes/nuclear/nuclear.dm
+++ b/code/game/gamemodes/nuclear/nuclear.dm
@@ -221,9 +221,10 @@
synd_mob.equip_if_possible(new /obj/item/clothing/head/helmet/swat(synd_mob), synd_mob.slot_head)
synd_mob.equip_if_possible(new /obj/item/weapon/card/id/syndicate(synd_mob), synd_mob.slot_wear_id)
synd_mob.equip_if_possible(new /obj/item/weapon/storage/backpack(synd_mob), synd_mob.slot_back)
- synd_mob.equip_if_possible(new /obj/item/ammo_magazine/c45(synd_mob), synd_mob.slot_in_backpack)
+ synd_mob.equip_if_possible(new /obj/item/ammo_magazine/a12mm(synd_mob), synd_mob.slot_in_backpack)
+ synd_mob.equip_if_possible(new /obj/item/ammo_magazine/a12mm(synd_mob), synd_mob.slot_in_backpack)
synd_mob.equip_if_possible(new /obj/item/weapon/reagent_containers/pill/cyanide(synd_mob), synd_mob.slot_in_backpack)
- synd_mob.equip_if_possible(new /obj/item/weapon/gun/projectile/automatic/mini_uzi(synd_mob), synd_mob.slot_belt)
+ synd_mob.equip_if_possible(new /obj/item/weapon/gun/projectile/automatic/c20r(synd_mob), synd_mob.slot_belt)
var/obj/item/weapon/implant/explosive/E = new/obj/item/weapon/implant/explosive(synd_mob)
E.imp_in = synd_mob
E.implanted = 1
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index 9ac7e268a6b..b54a50b32d6 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -114,6 +114,7 @@ Airlock index -> wire color are { 9, 4, 6, 7, 5, 8, 1, 2, 3 }.
icon = 'Doorglass.dmi'
opacity = 0
doortype = 7
+ glass = 1
/obj/machinery/door/airlock/centcom
name = "Airlock"
@@ -132,6 +133,7 @@ Airlock index -> wire color are { 9, 4, 6, 7, 5, 8, 1, 2, 3 }.
icon = 'Door2x1glassfull.dmi'
opacity = 0
doortype = 10
+ glass = 1
/obj/machinery/door/airlock/freezer
name = "Freezer Airlock"
@@ -156,24 +158,28 @@ Airlock index -> wire color are { 9, 4, 6, 7, 5, 8, 1, 2, 3 }.
icon = 'Doorcomglass.dmi'
opacity = 0
doortype = 14
+ glass = 1
/obj/machinery/door/airlock/glass_engineering
name = "Maintenance Hatch"
icon = 'Doorengglass.dmi'
opacity = 0
doortype = 15
+ glass = 1
/obj/machinery/door/airlock/glass_security
name = "Maintenance Hatch"
icon = 'Doorsecglass.dmi'
opacity = 0
doortype = 16
+ glass = 1
/obj/machinery/door/airlock/glass_medical
name = "Maintenance Hatch"
icon = 'doormedglass.dmi'
opacity = 0
doortype = 17
+ glass = 1
/*
About the new airlock wires panel:
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index fc730443457..5c5584522ba 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -289,7 +289,7 @@
/obj/machinery/door/proc/close()
if(density)
return 1
- if (src.operating)
+ if(src.operating)
return
src.operating = 1
@@ -299,7 +299,7 @@
sleep(10)
update_icon()
- if (src.visible && (!istype(src, /obj/machinery/door/airlock/glass)))
+ if(src.visible && (!src.glass))
src.sd_SetOpacity(1)
if(operating == 1)
operating = 0
diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm
index 2315111a031..8ff52bdddda 100644
--- a/code/game/machinery/rechargestation.dm
+++ b/code/game/machinery/rechargestation.dm
@@ -82,9 +82,6 @@
// ^ makes sinle list of active (R.contents) and inactive modules (R.module.modules)
for(var/obj/O in um)
// Engineering
- if(istype(O,/obj/item/weapon/rcd))
- if(O:matter < 30)
- O:matter += 1
if(istype(O,/obj/item/stack/sheet/metal) || istype(O,/obj/item/stack/sheet/rglass) || istype(O,/obj/item/weapon/cable_coil))
if(O:amount < 50)
O:amount += 1
@@ -104,12 +101,10 @@
if(O.reagents.get_reagent_amount("enzyme") < 50)
O.reagents.add_reagent("enzyme", 1)
//Medical
- if(istype(O,/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline))
- if(O.reagents.get_reagent_amount("inaprovaline") < 30)
- O.reagents.add_reagent("inaprovaline", 1)
- if(istype(O,/obj/item/weapon/reagent_containers/glass/bottle/antitoxin))
- if(O.reagents.get_reagent_amount("anti_toxin") < 30)
- O.reagents.add_reagent("anti_toxin", 1)
+ if(istype(O,/obj/item/weapon/reagent_containers/glass/bottle/robot))
+ var/obj/item/weapon/reagent_containers/glass/bottle/robot/B = O
+ if(B.reagent && (B.reagents.get_reagent_amount(B.reagent) < B.volume))
+ B.reagents.add_reagent(B.reagent, 2)
if(R)
if(R.module)
diff --git a/code/game/objects/closets/nuclear.dm b/code/game/objects/closets/nuclear.dm
index 4deb2bb8f34..78472fd4578 100644
--- a/code/game/objects/closets/nuclear.dm
+++ b/code/game/objects/closets/nuclear.dm
@@ -1,18 +1,24 @@
/obj/structure/closet/syndicate/nuclear/New()
..()
sleep(2)
- new /obj/item/ammo_magazine/c45( src )
- new /obj/item/ammo_magazine/c45( src )
- new /obj/item/ammo_magazine/c45( src )
- new /obj/item/weapon/storage/handcuff_kit( src )
- new /obj/item/weapon/storage/flashbang_kit( src )
- new /obj/item/weapon/gun/energy/gun( src )
- new /obj/item/weapon/gun/energy/gun( src )
- new /obj/item/weapon/gun/energy/gun( src )
- new /obj/item/weapon/pinpointer( src )
- new /obj/item/weapon/pinpointer( src )
- new /obj/item/weapon/pinpointer( src )
- new /obj/item/device/pda/syndicate( src )
- var/obj/item/weapon/syndicate_uplink/U = new /obj/item/weapon/syndicate_uplink( src )
+ new /obj/item/ammo_magazine/a12mm(src)
+ new /obj/item/ammo_magazine/a12mm(src)
+ new /obj/item/ammo_magazine/a12mm(src)
+ new /obj/item/ammo_magazine/a12mm(src)
+ new /obj/item/ammo_magazine/a12mm(src)
+ new /obj/item/weapon/storage/handcuff_kit(src)
+ new /obj/item/weapon/storage/flashbang_kit(src)
+ new /obj/item/weapon/gun/energy/gun(src)
+ new /obj/item/weapon/gun/energy/gun(src)
+ new /obj/item/weapon/gun/energy/gun(src)
+ new /obj/item/weapon/gun/energy/gun(src)
+ new /obj/item/weapon/gun/energy/gun(src)
+ new /obj/item/weapon/pinpointer(src)
+ new /obj/item/weapon/pinpointer(src)
+ new /obj/item/weapon/pinpointer(src)
+ new /obj/item/weapon/pinpointer(src)
+ new /obj/item/weapon/pinpointer(src)
+ new /obj/item/device/pda/syndicate(src)
+ var/obj/item/weapon/syndicate_uplink/U = new /obj/item/weapon/syndicate_uplink(src)
U.uses = 40
return
diff --git a/code/game/objects/items/robot_items.dm b/code/game/objects/items/robot_items.dm
new file mode 100644
index 00000000000..035fe2002ab
--- /dev/null
+++ b/code/game/objects/items/robot_items.dm
@@ -0,0 +1,294 @@
+/**********************************************************************
+ Cyborg Spec Items
+***********************************************************************/
+//Might want to move this into several files later but for now it works here
+/obj/item/borg/stun
+ name = "Electrified Arm"
+ icon = 'decals.dmi'
+ icon_state = "shock"
+
+ attack(mob/M as mob, mob/living/silicon/robot/user as mob)
+ M.attack_log += text("\[[time_stamp()]\] Has been attacked with [src.name] by [user.name] ([user.ckey])")
+ user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to attack [M.name] ([M.ckey])")
+ user.cell.charge -= 30
+ if (M.weakened < 5)
+ M.weakened = 5
+ if (M.stuttering < 5)
+ M.stuttering = 5
+ if (M.stunned < 5)
+ M.stunned = 5
+ for(var/mob/O in viewers(M, null))
+ if (O.client)
+ O.show_message("\red [user] has prodded [M] with an electrically-charged arm!", 1, "\red You hear someone fall", 2)
+
+
+
+/**********************************************************************
+ HUD/SIGHT things
+***********************************************************************/
+/obj/item/borg/sight
+ icon = 'decals.dmi'
+ icon_state = "securearea"
+ var/sight_mode = null
+
+
+/obj/item/borg/sight/xray
+ name = "X-ray Vision"
+ sight_mode = BORGXRAY
+
+
+/obj/item/borg/sight/thermal
+ name = "Thermal Vision"
+ sight_mode = BORGTHERM
+
+
+/obj/item/borg/sight/meson
+ name = "Meson Vision"
+ sight_mode = BORGMESON
+
+
+/obj/item/borg/sight/hud
+ name = "Hud"
+ var/obj/item/clothing/glasses/hud/hud = null
+
+
+/obj/item/borg/sight/hud/med
+ name = "Medical Hud"
+
+
+ New()
+ ..()
+ hud = new /obj/item/clothing/glasses/hud/health(src)
+ return
+
+
+/obj/item/borg/sight/hud/sec
+ name = "Security Hud"
+
+
+ New()
+ ..()
+ hud = new /obj/item/clothing/glasses/hud/security(src)
+ return
+
+
+
+/**********************************************************************
+ Chemical things
+***********************************************************************/
+
+/obj/item/weapon/reagent_containers/glass/bottle/robot
+ amount_per_transfer_from_this = 10
+ possible_transfer_amounts = list(5,10,15)
+ flags = FPRINT | TABLEPASS | OPENCONTAINER
+ volume = 60
+ var
+ reagent = ""
+
+
+/obj/item/weapon/reagent_containers/glass/bottle/robot/inaprovaline
+ name = "internal inaprovaline bottle"
+ desc = "A small bottle. Contains inaprovaline - used to stabilize patients."
+ icon = 'chemical.dmi'
+ icon_state = "bottle16"
+ reagent = "inaprovaline"
+
+ New()
+ ..()
+ reagents.add_reagent("inaprovaline", 60)
+ return
+
+
+/obj/item/weapon/reagent_containers/glass/bottle/robot/antitoxin
+ name = "internal anti-toxin bottle"
+ desc = "A small bottle of Anti-toxins. Counters poisons, and repairs damage, a wonder drug."
+ icon = 'chemical.dmi'
+ icon_state = "bottle17"
+ reagent = "anti_toxin"
+
+ New()
+ ..()
+ reagents.add_reagent("anti_toxin", 60)
+ return
+
+
+
+/obj/item/weapon/reagent_containers/robodropper
+ name = "Industrial Dropper"
+ desc = "A larger dropper. Transfers 10 units."
+ icon = 'chemical.dmi'
+ icon_state = "dropper0"
+ amount_per_transfer_from_this = 10
+ possible_transfer_amounts = list(1,2,3,4,5,6,7,8,9,10)
+ volume = 10
+ var/filled = 0
+
+ afterattack(obj/target, mob/user , flag)
+ if(!target.reagents) return
+
+ if(filled)
+
+ if(target.reagents.total_volume >= target.reagents.maximum_volume)
+ user << "\red [target] is full."
+ return
+
+ if(!target.is_open_container() && !ismob(target) && !istype(target,/obj/item/weapon/reagent_containers/food)) //You can inject humans and food but you cant remove the shit.
+ user << "\red You cannot directly fill this object."
+ return
+
+ if(ismob(target))
+ for(var/mob/O in viewers(world.view, user))
+ O.show_message(text("\red [] drips something onto []!", user, target), 1)
+ src.reagents.reaction(target, TOUCH)
+
+ var/trans = src.reagents.trans_to(target, amount_per_transfer_from_this)
+ user << "\blue You transfer [trans] units of the solution."
+ if (src.reagents.total_volume<=0)
+ filled = 0
+ icon_state = "dropper[filled]"
+
+ else
+
+ if(!target.is_open_container() && !istype(target,/obj/structure/reagent_dispensers))
+ user << "\red You cannot directly remove reagents from [target]."
+ return
+
+ if(!target.reagents.total_volume)
+ user << "\red [target] is empty."
+ return
+
+ var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this)
+
+ user << "\blue You fill the dropper with [trans] units of the solution."
+
+ filled = 1
+ icon_state = "dropper[filled]"
+
+ return
+
+
+/**********************************************************************
+ Chemical things
+***********************************************************************/
+/obj/item/borg/rcd
+ name = "robotic rapid-construction-device"
+ desc = "A device used to rapidly build walls/floor."
+ icon = 'items.dmi'
+ icon_state = "rcd"
+ flags = FPRINT | TABLEPASS| CONDUCT
+ force = 5.0
+ w_class = 3.0
+ var
+ datum/effect/effect/system/spark_spread/spark_system
+ working = 0
+ mode = 1
+
+
+ New()
+ src.spark_system = new /datum/effect/effect/system/spark_spread
+ spark_system.set_up(5, 0, src)
+ spark_system.attach(src)
+ return
+
+
+ proc/activate()
+ spark_system.set_up(5, 0, src)
+ src.spark_system.start()
+ playsound(src.loc, 'Deconstruct.ogg', 50, 1)
+
+
+ attack_self(mob/user as mob)
+ //Change the mode
+ playsound(src.loc, 'pop.ogg', 50, 0)
+ if(mode == 1)
+ mode = 2
+ user << "Changed mode to 'Airlock'"
+ src.spark_system.start()
+ return
+ if(mode == 2)
+ mode = 3
+ user << "Changed mode to 'Deconstruct'"
+ src.spark_system.start()
+ return
+ if(mode == 3)
+ mode = 1
+ user << "Changed mode to 'Floor & Walls'"
+ src.spark_system.start()
+ return
+
+
+ afterattack(atom/A, mob/user as mob)
+ if(!isrobot(user)) return
+ if(!(istype(A, /turf) || istype(A, /obj/machinery/door/airlock))) return
+
+ var/mob/living/silicon/robot/R = user
+ var/obj/item/weapon/cell/cell = R.cell
+ if(!cell) return
+
+ if(istype(A, /turf))
+ switch(mode)
+ if(1)
+ if(istype(A, /turf/space))
+ if(!cell.use(30)) return
+ user << "Building Floor..."
+ activate()
+ A:ReplaceWithFloor()
+ return
+
+ if(istype(A, /turf/simulated/floor))
+ if(!cell.use(90)) return
+ user << "Building Wall (3)..."
+ playsound(src.loc, 'click.ogg', 50, 1)
+ if(do_after(user, 20))
+ activate()
+ A:ReplaceWithWall()
+ return
+
+ if(2)
+ if(istype(A, /turf/simulated/floor))
+ if(!cell.use(300)) return
+ user << "Building Airlock..."
+ playsound(src.loc, 'click.ogg', 50, 1)
+ if(do_after(user, 50))
+ activate()
+ if(locate(/obj/machinery/door) in get_turf(src)) return
+ var/obj/machinery/door/airlock/T = new /obj/machinery/door/airlock( A )
+ T.autoclose = 1
+ return
+
+ if(3)
+ if(istype(A, /turf/simulated/wall))
+ if(!cell.use(150)) return
+ user << "Deconstructing Wall..."
+ playsound(src.loc, 'click.ogg', 50, 1)
+ if(do_after(user, 40))
+ activate()
+ A:ReplaceWithFloor()
+ return
+
+ if(istype(A, /turf/simulated/wall/r_wall))
+ if(!cell.use(300)) return
+ user << "Deconstructing RWall..."
+ playsound(src.loc, 'click.ogg', 50, 1)
+ if(do_after(user, 60))
+ activate()
+ A:ReplaceWithWall()
+ return
+
+ if(istype(A, /turf/simulated/floor))
+ user << "Deconstructing Floor..."
+ playsound(src.loc, 'click.ogg', 50, 1)
+ if(do_after(user, 50))
+ activate()
+ A:ReplaceWithSpace()
+ return
+
+ if(istype(A, /obj/machinery/door/airlock))
+ user << "Deconstructing Airlock..."
+ playsound(src.loc, 'click.ogg', 50, 1)
+ if(do_after(user, 50))
+ playsound(src.loc, 'click.ogg', 50, 1)
+ del(A)
+ return
+ return
+
diff --git a/code/game/objects/items/tk_grab.dm b/code/game/objects/items/tk_grab.dm
new file mode 100644
index 00000000000..74bf92955d8
--- /dev/null
+++ b/code/game/objects/items/tk_grab.dm
@@ -0,0 +1,88 @@
+/obj/item/tk_grab
+ name = "Telekinetic Grab"
+ icon = 'magic.dmi'//Needs sprites
+ icon_state = "2"
+ flags = USEDELAY
+ //item_state = null
+ w_class = 10.0
+ layer = 20
+
+ var
+ last_throw = 0
+ obj/focus = null
+ mob/living/host = null
+
+
+ dropped(mob/user as mob)
+ del(src)
+ return
+
+
+ equipped(var/mob/user, var/slot)
+ del(src)
+ return
+
+
+ afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, flag)//TODO: go over this
+ if(!target || !user) return
+ if(last_throw+4 > world.time) return
+ if(!host)
+ del(src)
+ return
+ if(!host.mutations & TK)
+ del(src)
+ return
+ if(!focus)
+ focus_object(target)
+ return
+
+ if((get_dist(target, user) <= 16) && (get_dist(focus, user) <= 10))
+ apply_focus_overlay()
+ focus.throw_at(target, 10, 1)
+ last_throw = world.time
+ return
+
+
+ proc/focus_object(var/obj/target)
+ if(!istype(target,/obj)) return//Cant throw non objects atm might let it do mobs later
+ if(target.anchored) return//No throwing anchored things
+ focus = target
+ update_icon()
+ apply_focus_overlay()
+ return
+
+
+ proc/apply_focus_overlay()
+ if(!focus) return
+ var/obj/effect/overlay/O = new /obj/effect/overlay(locate(focus.x,focus.y,focus.z))
+ O.name = "sparkles"
+ O.anchored = 1
+ O.density = 0
+ O.layer = FLY_LAYER
+ O.dir = pick(cardinal)
+ O.icon = 'effects.dmi'
+ O.icon_state = "nothing"
+ flick("empdisable",O)
+ spawn(5)
+ del(O)
+ return
+
+
+ update_icon()
+ overlays = null
+ if(focus)
+ overlays += "[focus.icon_state]"
+ return
+
+//equip_if_possible(obj/item/W, slot, del_on_fail = 1)
+/*
+ if(istype(user, /mob/living/carbon))
+ if(user:mutations & TK && get_dist(source, user) <= 7)
+ if(user:equipped()) return 0
+ var/X = source:x
+ var/Y = source:y
+ var/Z = source:z
+ spawn(0)
+ //I really shouldnt put this here but i dont have a better idea
+
+*/
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/RCD.dm b/code/game/objects/items/weapons/RCD.dm
index 69416e53c06..131cd9b0993 100644
--- a/code/game/objects/items/weapons/RCD.dm
+++ b/code/game/objects/items/weapons/RCD.dm
@@ -36,8 +36,8 @@ RCD
attackby(obj/item/weapon/W as obj, mob/user as mob)
..()
- if (istype(W, /obj/item/weapon/rcd_ammo))
- if ((matter + 10) > 30)
+ if(istype(W, /obj/item/weapon/rcd_ammo))
+ if((matter + 10) > 30)
user << "The RCD cant hold any more matter."
return
del(W)
@@ -51,17 +51,17 @@ RCD
attack_self(mob/user as mob)
//Change the mode
playsound(src.loc, 'pop.ogg', 50, 0)
- if (mode == 1)
+ if(mode == 1)
mode = 2
user << "Changed mode to 'Airlock'"
src.spark_system.start()
return
- if (mode == 2)
+ if(mode == 2)
mode = 3
user << "Changed mode to 'Deconstruct'"
src.spark_system.start()
return
- if (mode == 3)
+ if(mode == 3)
mode = 1
user << "Changed mode to 'Floor & Walls'"
src.spark_system.start()
@@ -69,49 +69,39 @@ RCD
afterattack(atom/A, mob/user as mob)
- if (!(istype(A, /turf) || istype(A, /obj/machinery/door/airlock)))
+ if(!(istype(A, /turf) || istype(A, /obj/machinery/door/airlock)))
return
- if (istype(A, /turf) && mode == 1)
- if (istype(A, /turf/space) && matter >= 1)
+ if(istype(A, /turf) && mode == 1)
+ if(istype(A, /turf/space) && matter >= 1)
user << "Building Floor (1)..."
- if (!disabled)
+ if(!disabled && matter >= 1)
playsound(src.loc, 'Deconstruct.ogg', 50, 1)
spark_system.set_up(5, 0, src)
src.spark_system.start()
A:ReplaceWithFloor()
- if (isrobot(user))
- var/mob/living/silicon/robot/engy = user
- engy.cell.charge -= 30
- else
- if(!matter >= 1) return
- matter--
- user << "The RCD now holds [matter]/30 matter-units."
- desc = "A RCD. It currently holds [matter]/30 matter-units."
+ matter--
+ user << "The RCD now holds [matter]/30 matter-units."
+ desc = "A RCD. It currently holds [matter]/30 matter-units."
return
- if (istype(A, /turf/simulated/floor) && matter >= 3)
+ if(istype(A, /turf/simulated/floor) && matter >= 3)
user << "Building Wall (3)..."
playsound(src.loc, 'click.ogg', 50, 1)
if(do_after(user, 20))
- if (!disabled)
+ if(!disabled && matter >= 3)
spark_system.set_up(5, 0, src)
src.spark_system.start()
A:ReplaceWithWall()
playsound(src.loc, 'Deconstruct.ogg', 50, 1)
- if (isrobot(user))
- var/mob/living/silicon/robot/engy = user
- engy.cell.charge -= 90
- else
- if(!matter >= 3) return
- matter -= 3
- user << "The RCD now holds [matter]/30 matter-units."
- desc = "A RCD. It currently holds [matter]/30 matter-units."
+ matter -= 3
+ user << "The RCD now holds [matter]/30 matter-units."
+ desc = "A RCD. It currently holds [matter]/30 matter-units."
return
- else if (istype(A, /turf/simulated/floor) && mode == 2 && matter >= 10)
+ else if(istype(A, /turf/simulated/floor) && mode == 2 && matter >= 10)
user << "Building Airlock (10)..."
playsound(src.loc, 'click.ogg', 50, 1)
if(do_after(user, 50))
- if (!disabled)
+ if(!disabled && matter >= 10)
spark_system.set_up(5, 0, src)
src.spark_system.start()
if(locate(/obj/machinery/door) in get_turf(src)) return
@@ -122,86 +112,60 @@ RCD
T.autoclose = 1
playsound(src.loc, 'Deconstruct.ogg', 50, 1)
playsound(src.loc, 'sparks2.ogg', 50, 1)
- if (isrobot(user))
- var/mob/living/silicon/robot/engy = user
- engy.cell.charge -= 300
- else
- if(!matter >= 10) return
- matter -= 10
- user << "The RCD now holds [matter]/30 matter-units."
- desc = "A RCD. It currently holds [matter]/30 matter-units."
-
+ matter -= 10
+ user << "The RCD now holds [matter]/30 matter-units."
+ desc = "A RCD. It currently holds [matter]/30 matter-units."
return
- else if (mode == 3 && (istype(A, /turf) || istype(A, /obj/machinery/door/airlock) ) )
- if (istype(A, /turf/simulated/wall) && matter >= 5)
- user << "Deconstructing Wall (5)..."
+ else if(mode == 3 && (istype(A, /turf) || istype(A, /obj/machinery/door/airlock) ) )
+ if(istype(A, /turf/simulated/wall) && matter >= 4)
+ user << "Deconstructing Wall (4)..."
playsound(src.loc, 'click.ogg', 50, 1)
- if(do_after(user, 50))
- if (!disabled)
+ if(do_after(user, 40))
+ if(!disabled && matter >= 4)
spark_system.set_up(5, 0, src)
src.spark_system.start()
A:ReplaceWithFloor()
playsound(src.loc, 'Deconstruct.ogg', 50, 1)
- if (isrobot(user))
- var/mob/living/silicon/robot/engy = user
- engy.cell.charge -= 150
- else
- if(!matter >= 5) return
- matter -= 5
- user << "The RCD now holds [matter]/30 matter-units."
- desc = "A RCD. It currently holds [matter]/30 matter-units."
+ matter -= 4
+ user << "The RCD now holds [matter]/30 matter-units."
+ desc = "A RCD. It currently holds [matter]/30 matter-units."
return
- if (istype(A, /turf/simulated/wall/r_wall) && matter >= 5)
- user << "Deconstructing RWall (5)..."
+ if(istype(A, /turf/simulated/wall/r_wall) && matter >= 8)
+ user << "Deconstructing RWall (8)..."
playsound(src.loc, 'click.ogg', 50, 1)
- if(do_after(user, 50))
- if (!disabled)
+ if(do_after(user, 60))
+ if(!disabled && matter >= 8)
spark_system.set_up(5, 0, src)
src.spark_system.start()
A:ReplaceWithWall()
playsound(src.loc, 'Deconstruct.ogg', 50, 1)
- if (isrobot(user))
- var/mob/living/silicon/robot/engy = user
- engy.cell.charge -= 150
- else
- if(!matter >= 5) return
- matter -= 5
- user << "The RCD now holds [matter]/30 matter-units."
- desc = "A RCD. It currently holds [matter]/30 matter-units."
+ matter -= 8
+ user << "The RCD now holds [matter]/30 matter-units."
+ desc = "A RCD. It currently holds [matter]/30 matter-units."
return
- if (istype(A, /turf/simulated/floor) && matter >= 5)
+ if(istype(A, /turf/simulated/floor) && matter >= 5)
user << "Deconstructing Floor (5)..."
playsound(src.loc, 'click.ogg', 50, 1)
if(do_after(user, 50))
- if (!disabled)
+ if(!disabled && matter >= 5)
spark_system.set_up(5, 0, src)
src.spark_system.start()
A:ReplaceWithSpace()
playsound(src.loc, 'Deconstruct.ogg', 50, 1)
- if (isrobot(user))
- var/mob/living/silicon/robot/engy = user
- engy.cell.charge -= 150
- else
- if(!matter >= 5) return
- matter -= 5
- user << "The RCD now holds [matter]/30 matter-units."
- desc = "A RCD. It currently holds [matter]/30 matter-units."
+ matter -= 5
+ user << "The RCD now holds [matter]/30 matter-units."
+ desc = "A RCD. It currently holds [matter]/30 matter-units."
return
- if (istype(A, /obj/machinery/door/airlock) && matter >= 10)
+ if(istype(A, /obj/machinery/door/airlock) && matter >= 10)
user << "Deconstructing Airlock (10)..."
playsound(src.loc, 'click.ogg', 50, 1)
if(do_after(user, 50))
- if (!disabled)
+ if(!disabled && matter >= 10)
spark_system.set_up(5, 0, src)
src.spark_system.start()
del(A)
playsound(src.loc, 'Deconstruct.ogg', 50, 1)
- if (isrobot(user))
- var/mob/living/silicon/robot/engy = user
- engy.cell.charge -= 300
- else
- if(!matter >= 10) return
- matter -= 10
- user << "The RCD now holds [matter]/30 matter-units."
- desc = "A RCD. It currently holds [matter]/30 matter-units."
+ matter -= 10
+ user << "The RCD now holds [matter]/30 matter-units."
+ desc = "A RCD. It currently holds [matter]/30 matter-units."
return
diff --git a/code/game/objects/items/weapons/surgery_tools.dm b/code/game/objects/items/weapons/surgery_tools.dm
index e402842e3f0..56315cf1045 100644
--- a/code/game/objects/items/weapons/surgery_tools.dm
+++ b/code/game/objects/items/weapons/surgery_tools.dm
@@ -253,6 +253,8 @@ CIRCULAR SAW
if(!istype(M))
return ..()
+ if(M.mutations & HUSK) return ..()
+
if((user.mutations & CLUMSY) && prob(50))
M = user
return eyestab(M,user)
diff --git a/code/game/objects/storage/storage.dm b/code/game/objects/storage/storage.dm
index 866d9b6dde8..c947e2148cb 100644
--- a/code/game/objects/storage/storage.dm
+++ b/code/game/objects/storage/storage.dm
@@ -82,8 +82,7 @@
var/col_num = 0
var/row_count = min(7,storage_slots) -1 //For belts, the meanings of the two variables are inverted, so we don't have to declare new ones
if (contents.len > 7)
- if(contents.len % 7) //So having 14 items keeps them in 2 wors instead of 3
- col_num = round(contents.len / 7) // 7 is the maximum allowed column height for r_hand, l_hand and back storage items.
+ col_num = round((contents.len-1) / 7) // 7 is the maximum allowed column height for r_hand, l_hand and back storage items.
if (src == user.l_hand)
src.orient_objs(3-col_num, 3+row_count, 3, 3)
else if(src == user.r_hand)
@@ -148,7 +147,7 @@
sum_w_class += I.w_class //Adds up the combined w_classes which will be in the storage item if the item is added to it.
if(sum_w_class > max_combined_w_class)
- user << "\red The [W] cannot fit in the [src]. Remove some items or add a smaller one.."
+ user << "\red The [src] is full, make some space."
return
if ( W.w_class >= src.w_class && (istype(W, /obj/item/weapon/storage)))
@@ -172,8 +171,7 @@
var/col_num = 0
var/row_count = min(7,storage_slots) -1
if (contents.len > 7)
- if(contents.len % 7)
- col_num = round(contents.len / 7) // 7 is the maximum allowed column height for r_hand, l_hand and back storage items.
+ col_num = round((contents.len-1) / 7) // 7 is the maximum allowed column height for r_hand, l_hand and back storage items.
src.orient_objs(5, 10+col_num, 5 + row_count, 10)
return
diff --git a/code/game/throwing.dm b/code/game/throwing.dm
index 958f3bd93a4..8f8780d6eca 100644
--- a/code/game/throwing.dm
+++ b/code/game/throwing.dm
@@ -1,4 +1,14 @@
/mob/living/carbon/proc/toggle_throw_mode()
+ if(!equipped())//Not holding anything
+ if(mutations & TK)
+ if (hand)
+ l_hand = new/obj/item/tk_grab(src)
+ l_hand:host = src
+ else
+ r_hand = new/obj/item/tk_grab(src)
+ r_hand:host = src
+ return
+
if (src.in_throw_mode)
throw_mode_off()
else
diff --git a/code/modules/chemical/Chemistry-Holder.dm b/code/modules/chemical/Chemistry-Holder.dm
index 2db703bdecf..9d087001f9e 100644
--- a/code/modules/chemical/Chemistry-Holder.dm
+++ b/code/modules/chemical/Chemistry-Holder.dm
@@ -1,5 +1,6 @@
-#define TOUCH 1
-#define INGEST 2
+var/const
+ TOUCH = 1
+ INGEST = 2
///////////////////////////////////////////////////////////////////////////////////
diff --git a/code/modules/chemical/Chemistry-Tools.dm b/code/modules/chemical/Chemistry-Tools.dm
index 8b0cbf183c9..e20a033d5de 100644
--- a/code/modules/chemical/Chemistry-Tools.dm
+++ b/code/modules/chemical/Chemistry-Tools.dm
@@ -734,59 +734,6 @@
return
-/obj/item/weapon/reagent_containers/robodropper
- name = "Industrial Dropper"
- desc = "A larger dropper. Transfers 10 units."
- icon = 'chemical.dmi'
- icon_state = "dropper0"
- amount_per_transfer_from_this = 10
- possible_transfer_amounts = list(1,2,3,4,5,6,7,8,9,10)
- volume = 10
- var/filled = 0
-
- afterattack(obj/target, mob/user , flag)
- if(!target.reagents) return
-
- if(filled)
-
- if(target.reagents.total_volume >= target.reagents.maximum_volume)
- user << "\red [target] is full."
- return
-
- if(!target.is_open_container() && !ismob(target) && !istype(target,/obj/item/weapon/reagent_containers/food)) //You can inject humans and food but you cant remove the shit.
- user << "\red You cannot directly fill this object."
- return
-
- if(ismob(target))
- for(var/mob/O in viewers(world.view, user))
- O.show_message(text("\red [] drips something onto []!", user, target), 1)
- src.reagents.reaction(target, TOUCH)
-
- var/trans = src.reagents.trans_to(target, amount_per_transfer_from_this)
- user << "\blue You transfer [trans] units of the solution."
- if (src.reagents.total_volume<=0)
- filled = 0
- icon_state = "dropper[filled]"
-
- else
-
- if(!target.is_open_container() && !istype(target,/obj/structure/reagent_dispensers))
- user << "\red You cannot directly remove reagents from [target]."
- return
-
- if(!target.reagents.total_volume)
- user << "\red [target] is empty."
- return
-
- var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this)
-
- user << "\blue You fill the dropper with [trans] units of the solution."
-
- filled = 1
- icon_state = "dropper[filled]"
-
- return
-
////////////////////////////////////////////////////////////////////////////////
/// Droppers. END
////////////////////////////////////////////////////////////////////////////////
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index d0502da2081..50494ff0641 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -733,7 +733,7 @@
if (mutations & COLD_RESISTANCE)
overlays += image("icon" = 'genetics.dmi', "icon_state" = "fire[fat][!lying ? "_s" : "_l"]")
- if (mutations & PORTALS)
+ if (mutations & TK)
overlays += image("icon" = 'genetics.dmi', "icon_state" = "telekinesishead[fat][!lying ? "_s" : "_l"]")
if (mutations & LASER)
diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm
index 44a868b80e5..db1325159c2 100644
--- a/code/modules/mob/living/carbon/human/human_attackhand.dm
+++ b/code/modules/mob/living/carbon/human/human_attackhand.dm
@@ -5,7 +5,7 @@
..()
- if(check_shields(0, M.name))
+ if((M != src) && check_shields(0, M.name))
visible_message("\red [M] attempted to touch [src]!")
return 0
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index bf7922a0949..2b8c139c3f9 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -75,7 +75,7 @@ emp_act
visible_message("\red [src] has been attacked in the [hit_area] with [I.name] by [user]!")
- if(check_shields(I.force, "the [I.name]"))
+ if((user != src) && check_shields(I.force, "the [I.name]"))
return 0
var/armor = run_armor_check(affecting, "melee", "Your armor has protected you from a hit to the [hit_area].", "Your armor has softened hit to your [hit_area].")
if(armor >= 2) return 0
diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm
index c4cea38cfc5..4ca8704a733 100644
--- a/code/modules/mob/living/silicon/robot/life.dm
+++ b/code/modules/mob/living/silicon/robot/life.dm
@@ -33,7 +33,7 @@
stunned = max(min(stunned, 30),0)
paralysis = max(min(paralysis, 30), 0)
weakened = max(min(weakened, 20), 0)
- sleeping = max(min(sleeping, 5), 0)
+ sleeping = 0
bruteloss = max(bruteloss, 0)
toxloss = max(toxloss, 0)
oxyloss = max(oxyloss, 0)
@@ -177,6 +177,10 @@
src.see_in_dark = 8
src.see_invisible = 2
+ var/obj/item/borg/sight/hud/hud = (locate(/obj/item/borg/sight/hud) in src)
+ if(hud && hud.hud) hud.hud.process_hud(src)
+
+
if (src.sleep) src.sleep.icon_state = text("sleep[]", src.sleeping)
if (src.rest) src.rest.icon_state = text("rest[]", src.resting)
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index d7bd5c6d532..b43d38cce4f 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -736,19 +736,19 @@
module_state_1 = O
O.layer = 20
contents += O
- if(istype(module_state_1,/obj/item/weapon/borg/sight))
+ if(istype(module_state_1,/obj/item/borg/sight))
sight_mode |= module_state_1:sight_mode
else if(!module_state_2)
module_state_2 = O
O.layer = 20
contents += O
- if(istype(module_state_2,/obj/item/weapon/borg/sight))
+ if(istype(module_state_2,/obj/item/borg/sight))
sight_mode |= module_state_2:sight_mode
else if(!module_state_3)
module_state_3 = O
O.layer = 20
contents += O
- if(istype(module_state_3,/obj/item/weapon/borg/sight))
+ if(istype(module_state_3,/obj/item/borg/sight))
sight_mode |= module_state_3:sight_mode
else
src << "You need to disable a module first!"
@@ -777,7 +777,7 @@
if(isnull(module_active))
return
if(module_state_1 == module_active)
- if(istype(module_state_1,/obj/item/weapon/borg/sight))
+ if(istype(module_state_1,/obj/item/borg/sight))
sight_mode &= ~module_state_1:sight_mode
if (client)
client.screen -= module_state_1
@@ -786,7 +786,7 @@
module_state_1 = null
inv1.icon_state = "inv1"
else if(module_state_2 == module_active)
- if(istype(module_state_2,/obj/item/weapon/borg/sight))
+ if(istype(module_state_2,/obj/item/borg/sight))
sight_mode &= ~module_state_2:sight_mode
if (client)
client.screen -= module_state_2
@@ -795,7 +795,7 @@
module_state_2 = null
inv2.icon_state = "inv2"
else if(module_state_3 == module_active)
- if(istype(module_state_3,/obj/item/weapon/borg/sight))
+ if(istype(module_state_3,/obj/item/borg/sight))
sight_mode &= ~module_state_3:sight_mode
if (client)
client.screen -= module_state_3
@@ -808,7 +808,7 @@
module_active = null
if(module_state_1)
- if(istype(module_state_1,/obj/item/weapon/borg/sight))
+ if(istype(module_state_1,/obj/item/borg/sight))
sight_mode &= ~module_state_1:sight_mode
if (client)
client.screen -= module_state_1
@@ -816,7 +816,7 @@
module_state_1 = null
inv1.icon_state = "inv1"
if(module_state_2)
- if(istype(module_state_2,/obj/item/weapon/borg/sight))
+ if(istype(module_state_2,/obj/item/borg/sight))
sight_mode &= ~module_state_2:sight_mode
if (client)
client.screen -= module_state_2
@@ -824,7 +824,7 @@
module_state_2 = null
inv2.icon_state = "inv2"
if(module_state_3)
- if(istype(module_state_3,/obj/item/weapon/borg/sight))
+ if(istype(module_state_3,/obj/item/borg/sight))
sight_mode &= ~module_state_3:sight_mode
if (client)
client.screen -= module_state_3
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index ab90e742f4b..04ae5578da7 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -2,11 +2,13 @@
name = "robot module"
icon = 'module.dmi'
icon_state = "std_module"
- w_class = 2.0
+ w_class = 100.0
item_state = "electronic"
flags = FPRINT|TABLEPASS | CONDUCT
- var/list/modules = list()
- var/obj/item/emag
+ var
+ list/modules = list()
+ obj/item/emag = null
+
emp_act(severity)
if(modules)
@@ -15,253 +17,220 @@
if(emag)
emag.emp_act(severity)
..()
+ return
+
+
+ New()
+ src.modules += new /obj/item/device/flash(src)
+ src.emag = new /obj/item/toy/sword(src)
+ src.emag.name = "Placeholder Emag Item"
+ return
+
proc/respawn_consumable(var/mob/living/silicon/robot/R)
return
+
+
/obj/item/weapon/robot_module/standard
name = "standard robot module"
-/obj/item/weapon/robot_module/hydroborg
- name = "hydroponics robot module"
+
+ New()
+ ..()
+ src.modules += new /obj/item/weapon/melee/baton(src)
+ src.modules += new /obj/item/weapon/extinguisher(src)
+ src.modules += new /obj/item/weapon/wrench(src)
+ src.modules += new /obj/item/weapon/crowbar(src)
+ src.modules += new /obj/item/device/healthanalyzer(src)
+ src.emag = new /obj/item/weapon/melee/energy/sword(src)
+ return
+
+
/obj/item/weapon/robot_module/medical
name = "medical robot module"
+
+ New()
+ ..()
+ src.modules += new /obj/item/device/healthanalyzer(src)
+ for(var/i = 1 to 3)
+ var/obj/item/weapon/reagent_containers/syringe/S = new /obj/item/weapon/reagent_containers/syringe(src)
+ switch(i)
+ if(1) S.name = "Syringe-(Inaprovaline)"
+ if(2) S.name = "Syringe-(Anti-Toxin)"
+ if(3) S.name = "Syringe-(Mixed)"
+ src.modules += S
+
+ src.modules += new /obj/item/weapon/reagent_containers/syringe(src)
+ src.modules += new /obj/item/weapon/reagent_containers/syringe(src)
+ src.modules += new /obj/item/weapon/reagent_containers/glass/bottle/robot/inaprovaline(src)
+ src.modules += new /obj/item/weapon/reagent_containers/glass/bottle/robot/antitoxin(src)
+ for(var/i = 1 to 2)
+ src.modules += new /obj/item/weapon/reagent_containers/pill/kelotane(src)
+ for(var/i = 1 to 2)
+ src.modules += new /obj/item/weapon/reagent_containers/pill/dexalin(src)
+
+ src.modules += new /obj/item/weapon/reagent_containers/robodropper(src)
+ src.modules += new /obj/item/weapon/reagent_containers/glass/beaker(src)
+ src.modules += new /obj/item/borg/sight/hud/med(src)
+ src.emag = new /obj/item/weapon/reagent_containers/pill/cyanide(src)
+ return
+
+
+ respawn_consumable(var/mob/living/silicon/robot/R)
+ var/list/what = list (
+ /obj/item/weapon/reagent_containers/pill/kelotane,
+ /obj/item/weapon/reagent_containers/pill/kelotane,
+ /obj/item/weapon/reagent_containers/pill/dexalin,
+ /obj/item/weapon/reagent_containers/pill/dexalin
+ )
+ for (var/T in what)
+ if (!(locate(T) in src.modules))
+ src.modules -= null
+ var/O = new T(src)
+ src.modules += O
+ if (R.emagged && !src.emag) //thanks to cyborg-900 for uncovering this
+ src.emag = new /obj/item/weapon/reagent_containers/pill/cyanide(src)
+ return
+
+
+
/obj/item/weapon/robot_module/engineering
name = "engineering robot module"
+
+ New()
+ ..()
+ src.modules += new /obj/item/weapon/extinguisher(src)
+ src.modules += new /obj/item/weapon/screwdriver(src)
+ src.modules += new /obj/item/weapon/weldingtool/largetank(src)
+ src.modules += new /obj/item/weapon/wrench(src)
+ src.modules += new /obj/item/device/analyzer(src)
+ src.modules += new /obj/item/device/flashlight(src)
+ src.modules += new /obj/item/borg/rcd(src)
+ src.modules += new /obj/item/device/t_scanner(src)
+ src.modules += new /obj/item/weapon/crowbar(src)
+ src.modules += new /obj/item/weapon/wirecutters(src)
+ src.modules += new /obj/item/device/multitool(src)
+
+ var/obj/item/stack/sheet/metal/M = new /obj/item/stack/sheet/metal(src)
+ M.amount = 50
+ src.modules += M
+
+ var/obj/item/stack/sheet/rglass/G = new /obj/item/stack/sheet/rglass(src)
+ G.amount = 50
+ src.modules += G
+
+ var/obj/item/weapon/cable_coil/W = new /obj/item/weapon/cable_coil(src)
+ W.amount = 50
+ src.modules += W
+
+ src.modules += new /obj/item/borg/sight/meson(src)
+ src.emag = new /obj/item/borg/stun(src)
+ return
+
+
+ respawn_consumable(var/mob/living/silicon/robot/R)
+ var/list/what = list (
+ /obj/item/stack/sheet/metal,
+ /obj/item/stack/sheet/rglass,
+ /obj/item/weapon/cable_coil,
+ )
+ for (var/T in what)
+ if (!(locate(T) in src.modules))
+ src.modules -= null
+ var/O = new T(src)
+ src.modules += O
+ O:amount = 1
+ return
+
+
+
/obj/item/weapon/robot_module/security
name = "security robot module"
+
+ New()
+ ..()
+ src.modules += new /obj/item/weapon/melee/baton(src)
+ src.modules += new /obj/item/weapon/handcuffs/cyborg(src)
+ src.modules += new /obj/item/weapon/gun/energy/taser/cyborg(src)
+ src.modules += new /obj/item/borg/sight/hud/sec(src)
+ src.emag = new /obj/item/weapon/gun/energy/laser/cyborg(src)
+ return
+
+
+
/obj/item/weapon/robot_module/janitor
name = "janitorial robot module"
-/*
-/obj/item/weapon/robot_module/brobot
- name = "brobot robot module"
-*/
+
+ New()
+ ..()
+ src.modules += new /obj/item/weapon/cleaner(src)
+ src.modules += new /obj/item/weapon/mop(src)
+ src.modules += new /obj/item/weapon/reagent_containers/glass/bucket(src)
+ src.emag = new /obj/item/weapon/cleaner(src)
+ var/datum/reagents/R = new/datum/reagents(1000)
+ src.emag.reagents = R
+ R.my_atom = src.emag
+ R.add_reagent("lube", 1000)
+ src.emag.name = "Lube spray"
+ return
+
+
+
/obj/item/weapon/robot_module/butler
name = "service robot module"
+
+ New()
+ ..()
+ src.modules += new /obj/item/weapon/reagent_containers/food/drinks/beer(src)
+ src.modules += new /obj/item/weapon/reagent_containers/food/condiment/enzyme(src)
+ src.modules += new /obj/item/weapon/pen(src)
+
+ var/obj/item/weapon/rsf/M = new /obj/item/weapon/rsf(src)
+ M.matter = 30
+ src.modules += M
+ src.modules += new /obj/item/weapon/reagent_containers/robodropper(src)
+
+ var/obj/item/weapon/zippo/L = new /obj/item/weapon/zippo(src)
+ L.lit = 1
+ src.modules += L
+
+ src.modules += new /obj/item/weapon/tray(src)
+ src.modules += new /obj/item/weapon/reagent_containers/food/drinks/shaker(src)
+ src.emag = new /obj/item/weapon/reagent_containers/food/drinks/beer(src)
+ var/datum/reagents/R = new/datum/reagents(50)
+ src.emag.reagents = R
+ R.my_atom = src.emag
+ R.add_reagent("beer2", 50)
+ src.emag.name = "Mickey Finn's Special Brew"
+ return
+
+
+
/obj/item/weapon/robot_module/miner
name = "miner robot module"
-obj/item/weapon/robot_module/syndicate
+
+ New()
+ ..()
+ src.modules += new /obj/item/weapon/pickaxe/jackhammer(src)
+ src.modules += new /obj/item/weapon/shovel(src)
+ src.modules += new /obj/item/weapon/satchel(src)
+ src.modules += new /obj/item/borg/sight/meson(src)
+ src.emag = new /obj/item/borg/stun(src)
+ return
+
+
+/obj/item/weapon/robot_module/syndicate
name = "syndicate robot module"
-/obj/item/weapon/robot_module/New()//Shit all the mods have
- src.modules += new /obj/item/device/flash(src)
- src.emag = new /obj/item/toy/sword(src)
- src.emag.name = "Placeholder Emag Item"
-
-/obj/item/weapon/robot_module/standard/New()
- ..()
- src.modules += new /obj/item/weapon/melee/baton(src)
- src.modules += new /obj/item/weapon/extinguisher(src)
- src.modules += new /obj/item/weapon/wrench(src)
- src.modules += new /obj/item/weapon/crowbar(src)
- src.modules += new /obj/item/device/healthanalyzer(src)
- src.emag = new /obj/item/weapon/melee/energy/sword(src)
-/*
-/obj/item/weapon/robot_module/hydroborg/New()
- ..()
- src.modules += new /obj/item/weapon/minihoe(src)
- src.modules += new /obj/item/weapon/pestspray(src)
- src.modules += new /obj/item/weapon/plantbgone(src)
- src.modules += new /obj/item/nutrient/rh(src)
- src.modules += new /obj/item/nutrient/l4z(src)
- src.modules += new /obj/item/weapon/rsp(src)
- src.modules += new /obj/item/device/analyzer/plant_analyzer(src)
- src.emag = new /obj/item/weapon/grown/deathnettle(src)
-*/
-/obj/item/weapon/robot_module/engineering/New()
- ..()
- src.modules += new /obj/item/weapon/extinguisher(src)
- src.modules += new /obj/item/weapon/screwdriver(src)
- src.modules += new /obj/item/weapon/weldingtool/largetank(src)
- src.modules += new /obj/item/weapon/wrench(src)
- src.modules += new /obj/item/device/analyzer(src)
- src.modules += new /obj/item/device/flashlight(src)
-
- var/obj/item/weapon/rcd/R = new /obj/item/weapon/rcd(src)
- R.matter = 30
- src.modules += R
-
- src.modules += new /obj/item/device/t_scanner(src)
- src.modules += new /obj/item/weapon/crowbar(src)
- src.modules += new /obj/item/weapon/wirecutters(src)
- src.modules += new /obj/item/device/multitool(src)
-
- var/obj/item/stack/sheet/metal/M = new /obj/item/stack/sheet/metal(src)
- M.amount = 50
- src.modules += M
-
- var/obj/item/stack/sheet/rglass/G = new /obj/item/stack/sheet/rglass(src)
- G.amount = 50
- src.modules += G
-
- var/obj/item/weapon/cable_coil/W = new /obj/item/weapon/cable_coil(src)
- W.amount = 50
- src.modules += W
- src.modules += new /obj/item/weapon/borg/sight/meson(src)
-
- src.emag = new /obj/item/weapon/borg/stun(src)
-
-
-/obj/item/weapon/robot_module/engineering/respawn_consumable(var/mob/living/silicon/robot/R)
- var/list/what = list (
- /obj/item/stack/sheet/metal,
- /obj/item/stack/sheet/rglass,
- /obj/item/weapon/cable_coil,
- )
- for (var/T in what)
- if (!(locate(T) in src.modules))
- src.modules -= null
- var/O = new T(src)
- src.modules += O
- O:amount = 1
-
-/obj/item/weapon/robot_module/medical/respawn_consumable(var/mob/living/silicon/robot/R)
- var/list/what = list (
- /obj/item/weapon/reagent_containers/pill/kelotane,
- /obj/item/weapon/reagent_containers/pill/dexalin,
- )
- for (var/T in what)
- if (!(locate(T) in src.modules))
- src.modules -= null
- var/O = new T(src)
- src.modules += O
- if (R.emagged && !src.emag) //thanks to cyborg-900 for uncovering this
- src.emag = new /obj/item/weapon/reagent_containers/pill/cyanide(src)
-
-
-
-/obj/item/weapon/robot_module/medical/New()
- ..()
- src.modules += new /obj/item/device/healthanalyzer(src)
- src.modules += new /obj/item/weapon/reagent_containers/syringe(src)
- src.modules += new /obj/item/weapon/reagent_containers/glass/bottle/inaprovaline(src)
- src.modules += new /obj/item/weapon/reagent_containers/glass/bottle/antitoxin(src)
- src.modules += new /obj/item/weapon/reagent_containers/pill/kelotane(src)
- src.modules += new /obj/item/weapon/reagent_containers/pill/dexalin(src)
- //commented out due to law 1
- //src.modules += new /obj/item/weapon/scalpel(src)
- //src.modules += new /obj/item/weapon/circular_saw(src)
- src.modules += new /obj/item/weapon/reagent_containers/robodropper(src)
- src.modules += new /obj/item/weapon/reagent_containers/glass/beaker(src)
-
-
- src.emag = new /obj/item/weapon/reagent_containers/pill/cyanide(src)
-
-/obj/item/weapon/robot_module/butler/New()
- ..()
- src.modules += new /obj/item/weapon/reagent_containers/food/drinks/beer(src)
- src.modules += new /obj/item/weapon/reagent_containers/food/condiment/enzyme(src)
- src.modules += new /obj/item/weapon/pen(src)
-
- var/obj/item/weapon/rsf/M = new /obj/item/weapon/rsf(src)
- M.matter = 30
- src.modules += M
-
- src.modules += new /obj/item/weapon/reagent_containers/robodropper(src)
-
- var/obj/item/weapon/zippo/L = new /obj/item/weapon/zippo(src)
- L.lit = 1
- src.modules += L
-
- src.modules += new /obj/item/weapon/tray(src)
- src.modules += new /obj/item/weapon/reagent_containers/food/drinks/shaker(src)
-// src.emag = new /obj/item/weapon/reagent_containers/food/snacks/roburgerbig(src)
-// src.emag.name = "Last Meal"
- src.emag = new /obj/item/weapon/reagent_containers/food/drinks/beer(src)
- var/datum/reagents/R = new/datum/reagents(50)
- src.emag.reagents = R
- R.my_atom = src.emag
- R.add_reagent("beer2", 50)
- src.emag.name = "Mickey Finn's Special Brew"
-
-
-/obj/item/weapon/robot_module/security/New()
- ..()
- src.modules += new /obj/item/weapon/melee/baton(src)
- src.modules += new /obj/item/weapon/handcuffs/cyborg(src)
- src.modules += new /obj/item/weapon/gun/energy/taser/cyborg(src)
- src.emag = new /obj/item/weapon/gun/energy/laser/cyborg(src)
-
-
-/obj/item/weapon/robot_module/janitor/New()
- ..()
- src.modules += new /obj/item/weapon/cleaner(src)
- src.modules += new /obj/item/weapon/mop(src)
- src.modules += new /obj/item/weapon/reagent_containers/glass/bucket(src)
- src.emag = new /obj/item/weapon/cleaner(src)
- var/datum/reagents/R = new/datum/reagents(1000)
- src.emag.reagents = R
- R.my_atom = src.emag
- R.add_reagent("lube", 1000)
- src.emag.name = "Lube spray"
-
-
-/obj/item/weapon/robot_module/miner/New()
- ..()
- src.modules += new /obj/item/weapon/pickaxe/jackhammer(src)
- src.modules += new /obj/item/weapon/shovel(src)
- src.modules += new /obj/item/weapon/satchel(src)
- src.modules += new /obj/item/weapon/borg/sight/meson(src)
- src.emag = new /obj/item/weapon/borg/stun(src)
-
-/* /obj/item/weapon/robot_module/brobot/New()
- ..()
- src.modules += new /obj/item/weapon/reagent_containers/food/drinks/beer(src)
- src.modules += new /obj/item/weapon/reagent_containers/food/drinks/beer(src)
- src.modules += new /obj/item/weapon/spacecash(src)
- src.emag = new /obj/item/weapon/reagent_containers/food/drinks/beer(src)
- var/datum/reagents/R = new/datum/reagents(50)
- src.emag.reagents = R
- R.my_atom = src.emag
- R.add_reagent("beer2", 50)
- src.emag.name = "Mickey Finn's Special Brew"
-*/ //Merged with Service borg, not a death, just a transformation
-
-obj/item/weapon/robot_module/syndicate/New()
- src.modules += new /obj/item/weapon/card/emag(src)
-
-
-/obj/item/weapon/borg/stun
- name = "Electrified Arm"
- icon = 'decals.dmi'
- icon_state = "shock"
-
- attack(mob/M as mob, mob/living/silicon/robot/user as mob)
-
- M.attack_log += text("\[[time_stamp()]\] Has been attacked with [src.name] by [user.name] ([user.ckey])")
- user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to attack [M.name] ([M.ckey])")
- user.cell.charge -= 30
- if (M.weakened < 5)
- M.weakened = 5
- if (M.stuttering < 5)
- M.stuttering = 5
- if (M.stunned < 5)
- M.stunned = 5
- for(var/mob/O in viewers(M, null))
- if (O.client)
- O.show_message("\red [user] has prodded [M] with an electrically-charged arm!", 1, "\red You hear someone fall", 2)
-
-/obj/item/weapon/borg/sight
- icon = 'decals.dmi'
- icon_state = "securearea"
- var/sight_mode
-
-/obj/item/weapon/borg/sight/xray
- name = "X-ray Vision"
- sight_mode = BORGXRAY
-
-/obj/item/weapon/borg/sight/thermal
- name = "Thermal Vision"
- sight_mode = BORGTHERM
-
-/obj/item/weapon/borg/sight/meson
- name = "Meson Vision"
- sight_mode = BORGMESON
+ New()
+ src.modules += new /obj/item/weapon/card/emag(src)
+ return
diff --git a/code/modules/projectiles/ammunition/boxes.dm b/code/modules/projectiles/ammunition/boxes.dm
index 04820249abd..8012ccad7e2 100644
--- a/code/modules/projectiles/ammunition/boxes.dm
+++ b/code/modules/projectiles/ammunition/boxes.dm
@@ -46,7 +46,7 @@
/obj/item/ammo_magazine/c9mm
name = "Ammunition Box (9mm)"
icon_state = "9mm"
- origin_tech = "combat=3;materials=2"
+ origin_tech = "combat=2"
ammo_type = "/obj/item/ammo_casing/c9mm"
max_ammo = 30
@@ -55,6 +55,24 @@
/obj/item/ammo_magazine/c45
name = "Ammunition Box (.45)"
icon_state = "9mm"
- origin_tech = "combat=3;materials=2"
+ origin_tech = "combat=2"
ammo_type = "/obj/item/ammo_casing/c45"
max_ammo = 30
+
+
+
+/obj/item/ammo_magazine/a12mm
+ name = "magazine (12mm)"
+ icon_state = "12mm"
+ origin_tech = "combat=2"
+ ammo_type = "/obj/item/ammo_casing/a12mm"
+ max_ammo = 20
+ multiple_sprites = 1
+
+
+
+/obj/item/ammo_magazine/a12mm/empty
+ name = "magazine (12mm)"
+ icon_state = "12mm"
+ ammo_type = "/obj/item/ammo_casing/12mm"
+ max_ammo = 0
\ No newline at end of file
diff --git a/code/modules/projectiles/ammunition/bullets.dm b/code/modules/projectiles/ammunition/bullets.dm
index b9f118a2e84..09585d912d0 100644
--- a/code/modules/projectiles/ammunition/bullets.dm
+++ b/code/modules/projectiles/ammunition/bullets.dm
@@ -40,6 +40,12 @@
projectile_type = "/obj/item/projectile/bullet/midbullet"
+/obj/item/ammo_casing/a12mm
+ desc = "A 12mm bullet casing."
+ caliber = "12mm"
+ projectile_type = "/obj/item/projectile/bullet/midbullet"
+
+
/obj/item/ammo_casing/shotgun
name = "shotgun shell"
desc = "A 12 gauge shell."
diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm
index 89956ae9313..39031c61c75 100644
--- a/code/modules/projectiles/guns/energy/laser.dm
+++ b/code/modules/projectiles/guns/energy/laser.dm
@@ -9,7 +9,6 @@
-
/obj/item/weapon/gun/energy/laser/captain
icon_state = "caplaser"
desc = "This is an antique laser gun. All craftsmanship is of the highest quality. It is decorated with assistant leather and chrome. The object menaces with spikes of energy. On the item is an image of Space Station 13. The station is exploding."
@@ -30,7 +29,7 @@
process()
charge_tick++
- if(!charge_tick >= 5) return 0
+ if(!charge_tick >= 10) return 0
charge_tick = 0
if(!power_supply) return 0
power_supply.give(100)
@@ -38,12 +37,13 @@
return 1
+
/obj/item/weapon/gun/energy/laser/cyborg/load_into_chamber()
if(in_chamber) return 1
if(isrobot(src.loc))
var/mob/living/silicon/robot/R = src.loc
if(R && R.cell)
- R.cell.use(40)
+ R.cell.use(100)
in_chamber = new/obj/item/projectile/beam(src)
return 1
return 0
diff --git a/code/modules/projectiles/guns/energy/nuclear.dm b/code/modules/projectiles/guns/energy/nuclear.dm
index 6e61558aa85..6a8aeb8523d 100644
--- a/code/modules/projectiles/guns/energy/nuclear.dm
+++ b/code/modules/projectiles/guns/energy/nuclear.dm
@@ -51,7 +51,7 @@
process()
charge_tick++
- if(!charge_tick >= 5) return 0
+ if(!charge_tick >= 10) return 0
charge_tick = 0
if(!power_supply) return 0
if(!failcheck()) return 0
diff --git a/code/modules/projectiles/guns/energy/stun.dm b/code/modules/projectiles/guns/energy/stun.dm
index 2332c25a285..2b573450dc4 100644
--- a/code/modules/projectiles/guns/energy/stun.dm
+++ b/code/modules/projectiles/guns/energy/stun.dm
@@ -62,7 +62,7 @@
process()
charge_tick++
- if(!charge_tick >= 5) return 0
+ if(!charge_tick >= 10) return 0
charge_tick = 0
if(!power_supply) return 0
power_supply.give(100)
diff --git a/code/modules/projectiles/guns/projectile.dm b/code/modules/projectiles/guns/projectile.dm
index a5ccf826cc4..9d17671303f 100644
--- a/code/modules/projectiles/guns/projectile.dm
+++ b/code/modules/projectiles/guns/projectile.dm
@@ -11,13 +11,16 @@
ammo_type = "/obj/item/ammo_casing/a357"
list/loaded = list()
max_shells = 7
- load_method = 0 //0 = Single shells or quick loader, 1 = magazine
+ load_method = 0 //0 = Single shells or quick loader, 1 = box, 2 = magazine
+ obj/item/ammo_magazine/empty_mag = null
New()
+ ..()
for(var/i = 1, i <= max_shells, i++)
loaded += new ammo_type(src)
update_icon()
+ return
load_into_chamber()
@@ -37,6 +40,7 @@
attackby(var/obj/item/A as obj, mob/user as mob)
var/num_loaded = 0
if(istype(A, /obj/item/ammo_magazine))
+ if((load_method == 2) && loaded.len) return
var/obj/item/ammo_magazine/AM = A
for(var/obj/item/ammo_casing/AC in AM.stored_ammo)
if(loaded.len >= max_shells)
@@ -46,7 +50,11 @@
AM.stored_ammo -= AC
loaded += AC
num_loaded++
- else if(istype(A, /obj/item/ammo_casing) && !load_method)
+ if(load_method == 2)
+ user.remove_from_mob(AM)
+ empty_mag = AM
+ empty_mag.loc = src
+ if(istype(A, /obj/item/ammo_casing) && !load_method)
var/obj/item/ammo_casing/AC = A
if(AC.caliber == caliber && loaded.len < max_shells)
user.drop_item()
@@ -56,8 +64,11 @@
if(num_loaded)
user << text("\blue You load [] shell\s into the gun!", num_loaded)
A.update_icon()
+ update_icon()
return
+
update_icon()
desc = initial(desc) + text(" Has [] rounds remaining.", loaded.len)
+ return
diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm
index c2615a1cee5..074445c9946 100644
--- a/code/modules/projectiles/guns/projectile/automatic.dm
+++ b/code/modules/projectiles/guns/projectile/automatic.dm
@@ -12,7 +12,7 @@
/obj/item/weapon/gun/projectile/automatic/mini_uzi
name = "Mini-Uzi"
- desc = "A lightweight, fast firing gun, for when you REALLY need someone dead. Uses .45 rounds."
+ desc = "A lightweight, fast firing gun, for when you want someone dead. Uses .45 rounds."
icon_state = "mini-uzi"
w_class = 3.0
max_shells = 20
@@ -20,3 +20,51 @@
origin_tech = "combat=5;materials=2;syndicate=8"
ammo_type = "/obj/item/ammo_casing/c45"
+
+
+/obj/item/weapon/gun/projectile/automatic/c20r
+ name = "C-20r SMG"
+ desc = "A lightweight, fast firing gun, for when you REALLY need someone dead. Uses .12mm rounds. Has a 'Scarborough Arms - Per falcis, per pravitas' buttstamp"
+ icon_state = "c20r"
+ item_state = "c20r"
+ w_class = 3.0
+ max_shells = 20
+ caliber = "12mm"
+ origin_tech = "combat=5;materials=2;syndicate=8"
+ ammo_type = "/obj/item/ammo_casing/a12mm"
+ fire_sound = 'Gunshot_smg.ogg'
+ load_method = 2
+
+
+ New()
+ ..()
+ empty_mag = new /obj/item/ammo_magazine/a12mm/empty(src)
+ update_icon()
+ return
+
+
+ afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, flag)
+ ..()
+ if(!loaded.len && empty_mag)
+ empty_mag.loc = get_turf(src.loc)
+ empty_mag = null
+ playsound(user, 'smg_empty_alarm.ogg', 40, 1)
+ update_icon()
+ return
+
+
+ update_icon()
+ ..()
+ overlays = null
+ if(empty_mag)
+ overlays += "c20r-[round(loaded.len,4)]"
+ return
+
+
+
+
+
+
+
+
+
diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm
index c04f39a7a8e..2d7da580fe5 100644
--- a/code/modules/projectiles/projectile/bullets.dm
+++ b/code/modules/projectiles/projectile/bullets.dm
@@ -1,7 +1,6 @@
/obj/item/projectile/bullet
name = "bullet"
icon_state = "bullet"
-
damage = 60
damage_type = BRUTE
nodamage = 0
diff --git a/code/setup.dm b/code/setup.dm
index 42d28d58436..8f8c115954b 100644
--- a/code/setup.dm
+++ b/code/setup.dm
@@ -149,18 +149,25 @@
#define FULL_BODY 2047
//bitflags for mutations
-#define PORTALS 1
-#define COLD_RESISTANCE 2
-#define XRAY 4
-#define HULK 8
-#define CLUMSY 16
-#define FAT 32
-#define HUSK 64 //changeling-drained
-#define LASER 128
-#define HEAL 256
+var/const
+ TK =(1<<0)
+ COLD_RESISTANCE =(1<<1)
+ XRAY =(1<<2)
+ HULK =(1<<3)
+ CLUMSY =(1<<4)
+ FAT =(1<<5)
+ HUSK =(1<<6)
+ LASER =(1<<7)
+ HEAL =(1<<8)
+
+
+//mob/var/stat things
+var/const
+ CONSCIOUS = 0
+ UNCONSCIOUS = 1
+ DEAD = 2
// channel numbers for power
-
#define EQUIP 1
#define LIGHT 2
#define ENVIRON 3
diff --git a/html/changelog.html b/html/changelog.html
index 42b1a77daad..712855e1ea4 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -54,6 +54,15 @@ Stuff which is in development and not yet visible to players or just code relate
(ie. code improvements for expandability, etc.) should not be listed here. They
should be listed in the changelog upon commit tho. Thanks. -->
+27 October 2011
+
+ - Mport updated:
+
+ - New WIP TK system added. To activate your TK click the throw button with an empty hand. This will bring up a tkgrab item. Click on a non-anchored (currently) non mob Object to select it as your "focus". Once a focus is selected so long as you are in range of the focus you can now click somewhere to throw the focus at the target. To quit using TK just drop the tkgrab item.
+
+
+
+
21 October 2011, Tuesday:
- Errorage updated:
diff --git a/icons/mob/items_lefthand.dmi b/icons/mob/items_lefthand.dmi
index 17e71b9e4a0..d3f19588391 100644
Binary files a/icons/mob/items_lefthand.dmi and b/icons/mob/items_lefthand.dmi differ
diff --git a/icons/mob/items_righthand.dmi b/icons/mob/items_righthand.dmi
index f14bc44ec1f..5ca0f2fd8a5 100644
Binary files a/icons/mob/items_righthand.dmi and b/icons/mob/items_righthand.dmi differ
diff --git a/icons/obj/ammo.dmi b/icons/obj/ammo.dmi
index ee56d194d54..e911987632f 100644
Binary files a/icons/obj/ammo.dmi and b/icons/obj/ammo.dmi differ
diff --git a/icons/obj/gun.dmi b/icons/obj/gun.dmi
index 350e396a35e..96abe6c9526 100644
Binary files a/icons/obj/gun.dmi and b/icons/obj/gun.dmi differ
diff --git a/sound/weapons/Gunshot_smg.ogg b/sound/weapons/Gunshot_smg.ogg
new file mode 100644
index 00000000000..5c0000bb320
Binary files /dev/null and b/sound/weapons/Gunshot_smg.ogg differ
diff --git a/sound/weapons/smg_empty_alarm.ogg b/sound/weapons/smg_empty_alarm.ogg
new file mode 100644
index 00000000000..f031b4e1d88
Binary files /dev/null and b/sound/weapons/smg_empty_alarm.ogg differ
diff --git a/tgstation.dme b/tgstation.dme
index 06c7c2f667b..abc0e20a338 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -599,8 +599,10 @@
#include "code\game\objects\items\food.dm"
#include "code\game\objects\items\helper_procs.dm"
#include "code\game\objects\items\item.dm"
+#include "code\game\objects\items\robot_items.dm"
#include "code\game\objects\items\robot_parts.dm"
#include "code\game\objects\items\shock_kit.dm"
+#include "code\game\objects\items\tk_grab.dm"
#include "code\game\objects\items\trash.dm"
#include "code\game\objects\items\clothing\powerarmor.dm"
#include "code\game\objects\items\clothing\powerarmorcomponents.dm"