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