diff --git a/code/game/gamemodes/changeling/powers/armblade.dm b/code/game/gamemodes/changeling/powers/armblade.dm
index f241f41840..139950e900 100644
--- a/code/game/gamemodes/changeling/powers/armblade.dm
+++ b/code/game/gamemodes/changeling/powers/armblade.dm
@@ -13,48 +13,66 @@
set name = "Arm Blade (20)"
if(src.mind.changeling.recursive_enhancement)
- if(changeling_generic_weapon(/obj/item/weapon/melee/arm_blade/greater))
+ if(changeling_generic_weapon(/obj/item/weapon/melee/changeling/arm_blade/greater))
src << "We prepare an extra sharp blade."
return 1
else
- if(changeling_generic_weapon(/obj/item/weapon/melee/arm_blade))
+ if(changeling_generic_weapon(/obj/item/weapon/melee/changeling/arm_blade))
return 1
return 0
-/obj/item/weapon/melee/arm_blade
- name = "arm blade"
- desc = "A grotesque blade made out of bone and flesh that cleaves through people as a hot knife through butter."
+//Claws
+/datum/power/changeling/claw
+ name = "Claw"
+ desc = "We reform one of our arms into a deadly claw."
+ helptext = "We may retract our claw by dropping it."
+ enhancedtext = "The claw will have armor peneratration."
+ ability_icon_state = "ling_claw"
+ genomecost = 1
+ verbpath = /mob/proc/changeling_claw
+
+//Grows a scary, and powerful arm blade.
+/mob/proc/changeling_claw()
+ set category = "Changeling"
+ set name = "Claw (15)"
+
+ if(src.mind.changeling.recursive_enhancement)
+ if(changeling_generic_weapon(/obj/item/weapon/melee/changeling/claw/greater, 1, 15))
+ src << "We prepare an extra sharp claw."
+ return 1
+
+ else
+ if(changeling_generic_weapon(/obj/item/weapon/melee/changeling/claw, 1, 15))
+ return 1
+ return 0
+
+/obj/item/weapon/melee/changeling
+ name = "arm weapon"
+ desc = "A grotesque weapon made out of bone and flesh that cleaves through people as a hot knife through butter."
icon = 'icons/obj/weapons.dmi'
icon_state = "arm_blade"
w_class = ITEMSIZE_HUGE
- force = 40
- sharp = 1
- edge = 1
- pry = 1
+ force = 5
anchored = 1
throwforce = 0 //Just to be on the safe side
throw_range = 0
throw_speed = 0
- attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
var/mob/living/creator //This is just like ninja swords, needed to make sure dumb shit that removes the sword doesn't make it stay around.
+ var/weapType = "weapon"
+ var/weapLocation = "arm"
-/obj/item/weapon/melee/arm_blade/greater
- name = "arm greatblade"
- desc = "A grotesque blade made out of bone and flesh that cleaves through people and armor as a hot knife through butter."
- armor_penetration = 30
-
-/obj/item/weapon/melee/arm_blade/New(location)
+/obj/item/weapon/melee/changeling/New(location)
..()
processing_objects |= src
if(ismob(loc))
- visible_message("A grotesque blade forms around [loc.name]\'s arm!",
- "Our arm twists and mutates, transforming it into a deadly blade.",
+ visible_message("A grotesque weapon forms around [loc.name]\'s arm!",
+ "Our arm twists and mutates, transforming it into a deadly weapon.",
"You hear organic matter ripping and tearing!")
src.creator = loc
-/obj/item/weapon/melee/arm_blade/dropped(mob/user)
- visible_message("With a sickening crunch, [creator] reforms their arm blade into an arm!",
+/obj/item/weapon/melee/changeling/dropped(mob/user)
+ visible_message("With a sickening crunch, [creator] reforms their arm!",
"We assimilate the weapon back into our body.",
"You hear organic matter ripping and tearing!")
playsound(src, 'sound/effects/blobattack.ogg', 30, 1)
@@ -62,16 +80,16 @@
if(src)
qdel(src)
-/obj/item/weapon/melee/arm_blade/Destroy()
+/obj/item/weapon/melee/changeling/Destroy()
processing_objects -= src
creator = null
..()
-/obj/item/weapon/melee/arm_blade/suicide_act(mob/user)
+/obj/item/weapon/melee/changeling/suicide_act(mob/user)
viewers(user) << "[user] is impaling \himself the [src.name]! It looks like \he's trying to commit suicide."
return(BRUTELOSS)
-/obj/item/weapon/melee/arm_blade/process() //Stolen from ninja swords.
+/obj/item/weapon/melee/changeling/process() //Stolen from ninja swords.
if(!creator || loc != creator || !creator.item_is_in_hands(src))
// Tidy up a bit.
if(istype(loc,/mob/living))
@@ -86,4 +104,34 @@
host.drop_from_inventory(src)
spawn(1)
if(src)
- qdel(src)
\ No newline at end of file
+ qdel(src)
+
+/obj/item/weapon/melee/changeling/arm_blade
+ name = "arm blade"
+ desc = "A grotesque blade made out of bone and flesh that cleaves through people as a hot knife through butter."
+ icon_state = "arm_blade"
+ force = 40
+ armor_penetration = 15
+ sharp = 1
+ edge = 1
+ pry = 1
+ attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
+
+/obj/item/weapon/melee/changeling/arm_blade/greater
+ name = "arm greatblade"
+ desc = "A grotesque blade made out of bone and flesh that cleaves through people and armor as a hot knife through butter."
+ armor_penetration = 30
+
+/obj/item/weapon/melee/changeling/claw
+ name = "hand claw"
+ desc = "A grotesque claw made out of bone and flesh that cleaves through people as a hot knife through butter."
+ icon_state = "ling_claw"
+ force = 15
+ sharp = 1
+ edge = 1
+ attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
+
+/obj/item/weapon/melee/changeling/claw/greater
+ name = "hand greatclaw"
+ force = 20
+ armor_penetration = 20
\ No newline at end of file
diff --git a/code/game/machinery/doors/blast_door.dm b/code/game/machinery/doors/blast_door.dm
index 41680d3de7..94d336274e 100644
--- a/code/game/machinery/doors/blast_door.dm
+++ b/code/game/machinery/doors/blast_door.dm
@@ -118,25 +118,8 @@
usr << "[src]'s motors resist your effort."
return
- if(istype(C, /obj/item/stack/material) && C.get_material_name() == "plasteel") // Repairing.
- var/amt = Ceiling((maxhealth - health)/150)
- if(!amt)
- usr << "\The [src] is already fully repaired."
- return
- var/obj/item/stack/P = C
- if(P.amount < amt)
- usr << "You don't have enough sheets to repair this! You need at least [amt] sheets."
- return
- usr << "You begin repairing [src]..."
- if(do_after(usr, 30))
- if(P.use(amt))
- usr << "You have repaired \The [src]"
- src.repair()
- else
- usr << "You don't have enough sheets to repair this! You need at least [amt] sheets."
-
- else if(src.density)
+ else if(src.density && (user.a_intent == I_HURT)) //If we can't pry it open and it's a weapon, let's hit it.
var/obj/item/weapon/W = C
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
if(W.damtype == BRUTE || W.damtype == BURN)
@@ -147,8 +130,37 @@
user.visible_message("\The [user] forcefully strikes \the [src] with \the [W]!")
playsound(src.loc, hitsound, 100, 1)
take_damage(W.force*0.35) //it's a blast door, it should take a while. -Luke
- return
+ return
+ else if(istype(C, /obj/item/stack/material) && C.get_material_name() == "plasteel") // Repairing.
+ var/amt = Ceiling((maxhealth - health)/150)
+ if(!amt)
+ usr << "\The [src] is already fully repaired."
+ return
+ var/obj/item/stack/P = C
+ if(P.amount < amt)
+ usr << "You don't have enough sheets to repair this! You need at least [amt] sheets."
+ return
+ usr << "You begin repairing [src]..."
+ if(do_after(usr, 30))
+ if(P.use(amt))
+ usr << "You have repaired \The [src]"
+ src.repair()
+ else
+ usr << "You don't have enough sheets to repair this! You need at least [amt] sheets."
+
+ else if(src.density && (user.a_intent == I_HURT)) //If we can't pry it open and it's not a weapon.... Eh, let's attack it anyway.
+ var/obj/item/weapon/W = C
+ user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
+ if(W.damtype == BRUTE || W.damtype == BURN)
+ user.do_attack_animation(src)
+ if(W.force < min_force) //No actual non-weapon item shouls have a force greater than the min_force, but let's include this just in case.
+ user.visible_message("\The [user] hits \the [src] with \the [W] with no visible effect.")
+ else
+ user.visible_message("\The [user] forcefully strikes \the [src] with \the [W]!")
+ playsound(src.loc, hitsound, 100, 1)
+ take_damage(W.force*0.15) //If the item isn't a weapon, let's make this take longer than usual to break it down.
+ return
// Proc: open()
// Parameters: None
@@ -213,4 +225,4 @@ obj/machinery/door/blast/regular/open
icon_state_opening = "shutterc0"
icon_state_closed = "shutter1"
icon_state_closing = "shutterc1"
- icon_state = "shutter1"
\ No newline at end of file
+ icon_state = "shutter1"
diff --git a/code/modules/mob/living/silicon/robot/robot_items.dm b/code/modules/mob/living/silicon/robot/robot_items.dm
index 6e5616e7b4..56081c274a 100644
--- a/code/modules/mob/living/silicon/robot/robot_items.dm
+++ b/code/modules/mob/living/silicon/robot/robot_items.dm
@@ -313,4 +313,104 @@
name = "mobility module"
desc = "By retracting limbs and tucking in its head, a combat android can roll at high speeds."
icon = 'icons/obj/decals.dmi'
- icon_state = "shock"
\ No newline at end of file
+ icon_state = "shock"
+
+/obj/item/weapon/inflatable_dispenser
+ name = "inflatables dispenser"
+ desc = "Hand-held device which allows rapid deployment and removal of inflatables."
+ icon = 'icons/obj/storage.dmi'
+ icon_state = "inf_deployer"
+ w_class = ITEMSIZE_LARGE
+
+ var/stored_walls = 5
+ var/stored_doors = 2
+ var/max_walls = 5
+ var/max_doors = 2
+ var/mode = 0 // 0 - Walls 1 - Doors
+
+/obj/item/weapon/inflatable_dispenser/robot
+ w_class = ITEMSIZE_HUGE
+ stored_walls = 10
+ stored_doors = 5
+ max_walls = 10
+ max_doors = 5
+
+/obj/item/weapon/inflatable_dispenser/examine(var/mob/user)
+ if(!..(user))
+ return
+ to_chat(user, "It has [stored_walls] wall segment\s and [stored_doors] door segment\s stored.")
+ to_chat(user, "It is set to deploy [mode ? "doors" : "walls"]")
+
+/obj/item/weapon/inflatable_dispenser/attack_self()
+ mode = !mode
+ to_chat(usr, "You set \the [src] to deploy [mode ? "doors" : "walls"].")
+
+/obj/item/weapon/inflatable_dispenser/afterattack(var/atom/A, var/mob/user)
+ ..(A, user)
+ if(!user)
+ return
+ if(!user.Adjacent(A))
+ to_chat(user, "You can't reach!")
+ return
+ if(istype(A, /turf))
+ try_deploy_inflatable(A, user)
+ if(istype(A, /obj/item/inflatable) || istype(A, /obj/structure/inflatable))
+ pick_up(A, user)
+
+/obj/item/weapon/inflatable_dispenser/proc/try_deploy_inflatable(var/turf/T, var/mob/living/user)
+ if(mode) // Door deployment
+ if(!stored_doors)
+ to_chat(user, "\The [src] is out of doors!")
+ return
+
+ if(T && istype(T))
+ new /obj/structure/inflatable/door(T)
+ stored_doors--
+
+ else // Wall deployment
+ if(!stored_walls)
+ to_chat(user, "\The [src] is out of walls!")
+ return
+
+ if(T && istype(T))
+ new /obj/structure/inflatable(T)
+ stored_walls--
+
+ playsound(T, 'sound/items/zip.ogg', 75, 1)
+ to_chat(user, "You deploy the inflatable [mode ? "door" : "wall"]!")
+
+/obj/item/weapon/inflatable_dispenser/proc/pick_up(var/obj/A, var/mob/living/user)
+ if(istype(A, /obj/structure/inflatable))
+ if(!istype(A, /obj/structure/inflatable/door))
+ if(stored_walls >= max_walls)
+ to_chat(user, "\The [src] is full.")
+ return
+ stored_walls++
+ qdel(A)
+ else
+ if(stored_doors >= max_doors)
+ to_chat(user, "\The [src] is full.")
+ return
+ stored_doors++
+ qdel(A)
+ playsound(loc, 'sound/machines/hiss.ogg', 75, 1)
+ visible_message("\The [user] deflates \the [A] with \the [src]!")
+ return
+ if(istype(A, /obj/item/inflatable))
+ if(!istype(A, /obj/item/inflatable/door))
+ if(stored_walls >= max_walls)
+ to_chat(user, "\The [src] is full.")
+ return
+ stored_walls++
+ qdel(A)
+ else
+ if(stored_doors >= max_doors)
+ to_chat(usr, "\The [src] is full!")
+ return
+ stored_doors++
+ qdel(A)
+ visible_message("\The [user] picks up \the [A] with \the [src]!")
+ return
+
+ to_chat(user, "You fail to pick up \the [A] with \the [src]")
+ return
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index 1dc391f478..3f7edaf41d 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -397,11 +397,13 @@ var/global/list/robot_modules = list(
src.modules += new /obj/item/device/lightreplacer(src)
src.modules += new /obj/item/device/pipe_painter(src)
src.modules += new /obj/item/device/floor_painter(src)
+ src.modules += new /obj/item/weapon/inflatable_dispenser/robot(src)
src.emag = new /obj/item/weapon/melee/baton/robot/arm(src)
src.modules += new /obj/item/device/geiger(src)
var/datum/matter_synth/metal = new /datum/matter_synth/metal(40000)
var/datum/matter_synth/glass = new /datum/matter_synth/glass(40000)
+ var/datum/matter_synth/plasteel = new /datum/matter_synth/plasteel(20000)
var/datum/matter_synth/wire = new /datum/matter_synth/wire()
synths += metal
synths += glass
@@ -428,6 +430,10 @@ var/global/list/robot_modules = list(
C.synths = list(wire)
src.modules += C
+ var/obj/item/stack/material/cyborg/plasteel/P = new (src)
+ P.synths = list(plasteel)
+ src.modules += P
+
var/obj/item/stack/tile/floor/cyborg/S = new /obj/item/stack/tile/floor/cyborg(src)
S.synths = list(metal)
src.modules += S
diff --git a/code/modules/tables/interactions.dm b/code/modules/tables/interactions.dm
index 35dfdc33b6..1b287294b1 100644
--- a/code/modules/tables/interactions.dm
+++ b/code/modules/tables/interactions.dm
@@ -130,7 +130,7 @@
break_to_parts()
return
- if(istype(W, /obj/item/weapon/melee/arm_blade))
+ if(istype(W, /obj/item/weapon/melee/changeling/arm_blade))
user.visible_message("\The [src] was sliced apart by [user]!")
break_to_parts()
return
diff --git a/code/modules/xenoarcheaology/tools/artifact_harvester.dm b/code/modules/xenoarcheaology/tools/artifact_harvester.dm
index 23ff59799e..ca7b43b1d3 100644
--- a/code/modules/xenoarcheaology/tools/artifact_harvester.dm
+++ b/code/modules/xenoarcheaology/tools/artifact_harvester.dm
@@ -15,10 +15,10 @@
/obj/machinery/artifact_harvester/New()
..()
- //connect to a nearby scanner pad
- owned_scanner = locate(/obj/machinery/artifact_scanpad) in get_step(src, dir)
- if(!owned_scanner)
- owned_scanner = locate(/obj/machinery/artifact_scanpad) in orange(1, src)
+ spawn(50) //Delay so the scan pad has time to actually spawn in
+ owned_scanner = locate(/obj/machinery/artifact_scanpad) in get_step(src, dir) //connect to a nearby scanner pad
+ if(!owned_scanner)
+ owned_scanner = locate(/obj/machinery/artifact_scanpad) in orange(1, src)
/obj/machinery/artifact_harvester/attackby(var/obj/I as obj, var/mob/user as mob)
if(istype(I,/obj/item/weapon/anobattery))
diff --git a/icons/mob/items/lefthand_melee.dmi b/icons/mob/items/lefthand_melee.dmi
index 93ac77c655..41f7617c3f 100644
Binary files a/icons/mob/items/lefthand_melee.dmi and b/icons/mob/items/lefthand_melee.dmi differ
diff --git a/icons/mob/items/righthand_melee.dmi b/icons/mob/items/righthand_melee.dmi
index ce37a0997e..fb7baddc29 100644
Binary files a/icons/mob/items/righthand_melee.dmi and b/icons/mob/items/righthand_melee.dmi differ
diff --git a/icons/mob/screen_spells.dmi b/icons/mob/screen_spells.dmi
index 908331c31d..c65d50880f 100644
Binary files a/icons/mob/screen_spells.dmi and b/icons/mob/screen_spells.dmi differ
diff --git a/icons/obj/food.dmi b/icons/obj/food.dmi
index 8df487ad3c..373fdcb25b 100644
Binary files a/icons/obj/food.dmi and b/icons/obj/food.dmi differ
diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi
index f870bd9672..f90a841fde 100644
Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ
diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi
index 39ed73fc3d..a933bc6a2f 100644
Binary files a/icons/obj/surgery.dmi and b/icons/obj/surgery.dmi differ
diff --git a/icons/obj/weapons.dmi b/icons/obj/weapons.dmi
index 22f52ad154..c7fd776592 100644
Binary files a/icons/obj/weapons.dmi and b/icons/obj/weapons.dmi differ