Adds the Aut'akh unathi (#5919)

* Base work for the unathi robot subspecies.

* Adds metabolism species, kidney vars, and the robot unathi organs.

* Moves some action buttons to organs, pretty much a bay port right now. Todo: the unathi and alien stuff should also go here.

* First autakh implant power.

* Fixes the organs action button this time.

* Finishes more implants, and interactions with flashs and vaurca.

* Prepare for great changes.

* Drops the real bomb, boss.

* He who fights with monsters.

* Far more work into augments and limb removing powers.

* Limb verbs should be good now.

* A LOT of work into the assited organ, allowing it to bleed and etc, as well adding a new chem that will stop bleeding in their case.

* Probably the last work on implants.

* Some extra touches.

* Some tweaks to the species.

* More fixes and adds kyre's sprites.

* More runtime fixes.

* Fixes the species name too.

* Fixes travis.

* Updates this file too to work with the new tools procs.

* Adds changelog

* Fixed changelog.

* Unathi hair and lore description.

* Some tweaks to this too.

* Locks away them for now, they will be released after we got all the events and etc done.

* Changes this chemical.

* Fixes an airlock runtime.

* Adds the non scan flag to the autakh, mostly due to some bizzare interactions with changelings and cloning.

* Organs removal changes; can't take out the organ if it is too damage.

* Restricts them back again.

* Robotic organs now have the proper icons and names.

* Adds sprites for their organs and some extra tweaks.

* Fixes this missing icon.

* emp should also now hurt assited organs.

* Tweaks more organ related things.

* Fixes the head not being properly set as well.

* Fixes their flags.

* fixes the flag for real this time.

* Poze's review.

* Changes the au'takh organ buttons to don't be animated.

* Helps with adminbus or something.

* Fowl's requested changes.

* Fixes a typo.

* Robotic limb's brute and burn mods are now controlled by the limb model.

* Fowl's changes once more.

* Stops some spam.

* More grammar.

* No eal.

* Skull's review.
This commit is contained in:
Alberyk
2019-01-23 19:27:44 +01:00
committed by Werner
parent b1742dd3f1
commit 76b743a986
280 changed files with 1651 additions and 874 deletions
+1 -1
View File
@@ -86,7 +86,7 @@
var/damage = W.force / 4.0
if(iswelder(W))
if(W.iswelder())
var/obj/item/weapon/weldingtool/WT = W
if(WT.remove_fuel(0, user))
+1 -1
View File
@@ -27,7 +27,7 @@
src.update_icon()
/obj/structure/banner/attackby(obj/item/W, mob/user)
if(iswrench(W))
if(W.iswrench())
switch(anchored)
if(0)
anchored = 1
@@ -221,7 +221,7 @@
return 0
if(istype(W,/obj/item/tk_grab))
return 0
if(iswelder(W))
if(W.iswelder())
var/obj/item/weapon/weldingtool/WT = W
if(WT.isOn())
user.visible_message(
@@ -262,7 +262,7 @@
user.drop_item()
else if(istype(W, /obj/item/weapon/packageWrap))
return
else if(iswelder(W))
else if(W.iswelder())
var/obj/item/weapon/weldingtool/WT = W
if(WT.isOn())
user.visible_message(
@@ -78,7 +78,7 @@
MouseDrop_T(G.affecting, user) //act like they were dragged onto the closet
else
to_chat(user, "<span class='notice'>The locker is too small to stuff [G.affecting] into!</span>")
if(iswelder(W))
if(W.iswelder())
var/obj/item/weapon/weldingtool/WT = W
if(WT.isOn())
user.visible_message(
@@ -108,7 +108,7 @@
user.drop_from_inventory(W,loc)
else
user.drop_item()
else if(isscrewdriver(W) && canbemoved)
else if(W.isscrewdriver() && canbemoved)
if(screwed)
to_chat(user, "<span class='notice'>You start to unscrew the locker from the floor...</span>")
playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1)
@@ -123,7 +123,7 @@
to_chat(user, "<span class='notice'>You screw the locker!</span>")
playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1)
screwed = 1
else if(iswrench(W) && canbemoved)
else if(W.iswrench() && canbemoved)
if(wrenched && !screwed)
to_chat(user, "<span class='notice'>You start to unfasten the bolts holding the locker in place...</span>")
playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
@@ -163,7 +163,7 @@
spark(src, 5)
playsound(loc, 'sound/weapons/blade1.ogg', 50, 1)
playsound(loc, "sparks", 50, 1)
else if(iswelder(W))
else if(W.iswelder())
var/obj/item/weapon/weldingtool/WT = W
if(WT.isOn())
user.visible_message(
@@ -93,7 +93,7 @@
return ..()
else if(istype(W, /obj/item/weapon/packageWrap))
return
else if(iscoil(W))
else if(W.iscoil())
var/obj/item/stack/cable_coil/C = W
if(rigged)
user << "<span class='notice'>[src] is already rigged!</span>"
@@ -107,7 +107,7 @@
user << "<span class='notice'>You attach [W] to [src].</span>"
user.drop_from_inventory(W,src)
return
else if(iswirecutter(W))
else if(W.iswirecutter())
if(rigged)
user << "<span class='notice'>You cut away the wiring.</span>"
playsound(loc, 'sound/items/Wirecutter.ogg', 100, 1)
@@ -10,7 +10,7 @@
return
/obj/structure/largecrate/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(iscrowbar(W))
if(W.iscrowbar())
new /obj/item/stack/material/wood(src)
var/turf/T = get_turf(src)
for(var/atom/movable/AM in contents)
@@ -34,7 +34,7 @@
icon_state = "mulecrate"
/obj/structure/largecrate/hoverpod/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(iscrowbar(W))
if(W.iscrowbar())
var/obj/item/mecha_parts/mecha_equipment/ME
var/obj/mecha/working/hoverpod/H = new (loc)
@@ -77,13 +77,13 @@
name = "chicken crate"
held_count = 5
held_type = /mob/living/simple_animal/chick
/obj/structure/largecrate/animal/dog
name = "dog carrier"
held_type = /mob/living/simple_animal/hostile/commanded/dog
/obj/structure/largecrate/animal/dog/amaskan
held_type = /mob/living/simple_animal/hostile/commanded/dog/amaskan
/obj/structure/largecrate/animal/dog/pug
held_type = /mob/living/simple_animal/hostile/commanded/dog/pug
@@ -160,7 +160,7 @@
created_name = t
return
if(iswelder(W) && ( (istext(glass)) || (glass == 1) || (!anchored) ))
if(W.iswelder() && ( (istext(glass)) || (glass == 1) || (!anchored) ))
var/obj/item/weapon/weldingtool/WT = W
if (WT.remove_fuel(0, user))
playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1)
@@ -190,7 +190,7 @@
user << "<span class='notice'>You need more welding fuel.</span>"
return
else if(iswrench(W) && state == 0)
else if(W.iswrench() && state == 0)
playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1)
if(anchored)
user.visible_message("[user] begins unsecuring the airlock assembly from the floor.", "You starts unsecuring the airlock assembly from the floor.")
@@ -202,7 +202,7 @@
user << "<span class='notice'>You [anchored? "un" : ""]secured the airlock assembly!</span>"
anchored = !anchored
else if(iscoil(W) && state == 0 && anchored)
else if(W.iscoil() && state == 0 && anchored)
var/obj/item/stack/cable_coil/C = W
if (C.get_amount() < 1)
user << "<span class='warning'>You need one length of coil to wire the airlock assembly.</span>"
@@ -213,7 +213,7 @@
src.state = 1
user << "<span class='notice'>You wire the airlock.</span>"
else if(iswirecutter(W) && state == 1 )
else if(W.iswirecutter() && state == 1 )
playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1)
user.visible_message("[user] cuts the wires from the airlock assembly.", "You start to cut the wires from airlock assembly.")
@@ -240,7 +240,7 @@
else
EL.inuse = 0
else if(iscrowbar(W) && state == 2 )
else if(W.iscrowbar() && state == 2 )
//This should never happen, but just in case I guess
if (!electronics)
user << "<span class='notice'>There was nothing to remove.</span>"
@@ -283,7 +283,7 @@
user << "<span class='notice'>You installed [material_display_name(material_name)] plating into the airlock assembly.</span>"
glass = material_name
else if(isscrewdriver(W) && state == 2 )
else if(W.isscrewdriver() && state == 2 )
playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1)
user << "<span class='notice'>Now finishing the airlock.</span>"
@@ -78,7 +78,7 @@
/obj/structure/fireaxecabinet/attackby(var/obj/item/O, var/mob/user)
if(ismultitool(O))
if(O.ismultitool())
toggle_lock(user)
return
+5 -5
View File
@@ -54,7 +54,7 @@
reinforce_girder()
/obj/structure/girder/attackby(obj/item/W as obj, mob/user as mob)
if(iswrench(W) && state == 0)
if(W.iswrench() && state == 0)
if(anchored && !reinf_material)
playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1)
user << "<span class='notice'>Now disassembling the girder...</span>"
@@ -111,7 +111,7 @@
user << "<span class='notice'>You drill through the girder!</span>"
dismantle()
else if(isscrewdriver(W))
else if(W.isscrewdriver())
if(state == 2)
playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1)
user << "<span class='notice'>Now unsecuring support struts...</span>"
@@ -124,7 +124,7 @@
reinforcing = !reinforcing
user << "<span class='notice'>\The [src] can now be [reinforcing? "reinforced" : "constructed"]!</span>"
else if(iswirecutter(W) && state == 1)
else if(W.iswirecutter() && state == 1)
playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1)
user << "<span class='notice'>Now removing support struts...</span>"
if(do_after(user,40))
@@ -134,7 +134,7 @@
reinf_material = null
reset_girder()
else if(iscrowbar(W) && state == 0 && anchored)
else if(W.iscrowbar() && state == 0 && anchored)
playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1)
user << "<span class='notice'>Now dislodging the girder...</span>"
if(do_after(user, 40))
@@ -272,7 +272,7 @@
qdel(src)
/obj/structure/girder/cult/attackby(obj/item/W as obj, mob/user as mob)
if(iswrench(W))
if(W.iswrench())
playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1)
user << "<span class='notice'>Now disassembling the girder...</span>"
if(do_after(user,40))
+2 -2
View File
@@ -93,12 +93,12 @@
spawn(0) healthcheck() //spawn to make sure we return properly if the grille is deleted
/obj/structure/grille/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(iswirecutter(W))
if(W.iswirecutter())
if(!shock(user, 100))
playsound(loc, 'sound/items/Wirecutter.ogg', 100, 1)
new /obj/item/stack/rods(get_turf(src), destroyed ? 1 : 2)
qdel(src)
else if((isscrewdriver(W)) && (istype(loc, /turf/simulated) || anchored))
else if((W.isscrewdriver()) && (istype(loc, /turf/simulated) || anchored))
if(!shock(user, 90))
playsound(loc, 'sound/items/Screwdriver.ogg', 100, 1)
anchored = !anchored
+1 -1
View File
@@ -139,7 +139,7 @@
//This return will prevent afterattack from executing if the object goes into the trashbag,
//This prevents dumb stuff like splashing the cart with the contents of a container, after putting said container into trash
else if (!has_items && (iswrench(I) || iswelder(I) || istype(I, /obj/item/weapon/gun/energy/plasmacutter)))
else if (!has_items && (I.iswrench() || I.iswelder() || istype(I, /obj/item/weapon/gun/energy/plasmacutter)))
dismantle(user)
return
..()
+3 -3
View File
@@ -42,7 +42,7 @@
var/turf/T = get_turf(src)
T.attackby(C, user) //BubbleWrap - hand this off to the underlying turf instead
return
if (iswelder(C))
if (C.iswelder())
var/obj/item/weapon/weldingtool/WT = C
if(WT.remove_fuel(0, user))
user << "<span class='notice'>Slicing lattice joints ...</span>"
@@ -73,7 +73,7 @@
layer = 2.7 // Above wires.
/obj/structure/lattice/catwalk/attackby(obj/item/C, mob/user)
if (iswelder(C))
if (C.iswelder())
var/obj/item/weapon/weldingtool/WT = C
if (do_after(user, 5, act_target = src) && WT.remove_fuel(1, user))
user << "<span class='notice'>You slice apart [src].</span>"
@@ -82,7 +82,7 @@
qdel(src)
/obj/structure/lattice/catwalk/indoor/attackby(obj/item/C, mob/user)
if (isscrewdriver(C))
if (C.isscrewdriver())
anchored = !anchored
user << "<span class='notice'>You [anchored ? "" : "un"]anchor [src].</span>"
playsound(src, 'sound/items/Screwdriver.ogg', 50, 1)
+1 -1
View File
@@ -414,7 +414,7 @@
return
/obj/structure/device/piano/attackby(obj/item/O as obj, mob/user as mob)
if (iswrench(O))
if (O.iswrench())
if (anchored)
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
user << "<span class='notice'>You begin to loosen \the [src]'s casters...</span>"
+2 -2
View File
@@ -21,7 +21,7 @@
return
/obj/structure/sign/attackby(obj/item/tool as obj, mob/user as mob) //deconstruction
if(isscrewdriver(tool) && !istype(src, /obj/structure/sign/double))
if(tool.isscrewdriver() && !istype(src, /obj/structure/sign/double))
user << "You unfasten the sign with your [tool]."
unfasten()
else ..()
@@ -44,7 +44,7 @@
var/sign_state = ""
/obj/item/sign/attackby(obj/item/tool as obj, mob/user as mob) //construction
if(isscrewdriver(tool) && isturf(user.loc))
if(tool.isscrewdriver() && isturf(user.loc))
var/direction = input("In which direction?", "Select direction.") in list("North", "East", "South", "West", "Cancel")
if(direction == "Cancel") return
var/obj/structure/sign/S = new(user.loc)
@@ -90,7 +90,7 @@
return
/obj/structure/bed/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(iswrench(W))
if(W.iswrench())
if(can_dismantle)
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
dismantle()
@@ -121,7 +121,7 @@
add_padding(padding_type)
return
else if (iswirecutter(W))
else if (W.iswirecutter())
if(!padding_material)
user << "\The [src] has no padding to remove."
return
@@ -192,7 +192,7 @@
return // Doesn't care about material or anything else.
/obj/structure/bed/roller/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(iswrench(W) || istype(W,/obj/item/stack) || iswirecutter(W))
if(W.iswrench() || istype(W,/obj/item/stack) || W.iswirecutter())
return
else if(istype(W,/obj/item/roller_holder))
if(buckled_mob)
@@ -128,7 +128,7 @@
return
/obj/structure/bed/chair/office/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W,/obj/item/stack) || iswirecutter(W))
if(istype(W,/obj/item/stack) || W.iswirecutter())
return
..()
@@ -201,7 +201,7 @@
return
/obj/structure/bed/chair/wood/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W,/obj/item/stack) || iswirecutter(W))
if(istype(W,/obj/item/stack) || W.iswirecutter())
return
..()
@@ -112,7 +112,7 @@
qdel(src)
/obj/item/weapon/stool/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(iswrench(W))
if(W.iswrench())
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
dismantle()
qdel(src)
@@ -141,7 +141,7 @@
user << "You add padding to \the [src]."
add_padding(padding_type)
return
else if (iswirecutter(W))
else if (W.iswirecutter())
if(!padding_material)
user << "\The [src] has no padding to remove."
return
@@ -19,7 +19,7 @@
buckled_mob.set_dir(dir)
/obj/structure/bed/chair/wheelchair/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(iswrench(W) || istype(W,/obj/item/stack) || iswirecutter(W))
if(W.iswrench() || istype(W,/obj/item/stack) || W.iswirecutter())
return
..()
@@ -74,7 +74,7 @@
user << "<span class='notice'>[src] is full.</span>"
updateUsrDialog()
return
if(iswrench(I))
if(I.iswrench())
if(anchored)
user << "<span class='notice'>You lean down and unwrench [src].</span>"
anchored = 0
+2 -2
View File
@@ -28,7 +28,7 @@
. = ..()
/obj/structure/bed/chair/e_chair/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(iswrench(W))
if(W.iswrench())
var/obj/structure/bed/chair/C = new /obj/structure/bed/chair(loc)
playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
C.set_dir(dir)
@@ -186,7 +186,7 @@
START_PROCESSING(SSfast_process, src)
/obj/structure/metronome/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(iswrench(W))
if(W.iswrench())
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
if(anchored)
user << "<span class='notice'>You unanchor \the [src] and it destabilizes.</span>"
+2 -2
View File
@@ -45,7 +45,7 @@
icon_state = "toilet[open][cistern]"
/obj/structure/toilet/attackby(obj/item/I as obj, mob/living/user as mob)
if(iscrowbar(I))
if(I.iscrowbar())
user << "<span class='notice'>You start to [cistern ? "replace the lid on the cistern" : "lift the lid off the cistern"].</span>"
playsound(loc, 'sound/effects/stonedoor_openclose.ogg', 50, 1)
if(do_after(user, 30))
@@ -169,7 +169,7 @@
/obj/machinery/shower/attackby(obj/item/I as obj, mob/user as mob)
if(I.type == /obj/item/device/analyzer)
user << "<span class='notice'>The water temperature seems to be [watertemp].</span>"
if(iswrench(I))
if(I.iswrench())
var/newtemp = input(user, "What setting would you like to set the temperature valve to?", "Water Temperature Valve") in temperature_settings
user << "<span class='notice'>You begin to adjust the temperature valve with \the [I].</span>"
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
@@ -69,7 +69,7 @@ obj/structure/windoor_assembly/Destroy()
//I really should have spread this out across more states but thin little windoors are hard to sprite.
switch(state)
if("01")
if(iswelder(W) && !anchored )
if(W.iswelder() && !anchored )
var/obj/item/weapon/weldingtool/WT = W
if (WT.remove_fuel(0,user))
user.visible_message("[user] dissassembles the windoor assembly.", "You start to dissassemble the windoor assembly.")
@@ -87,7 +87,7 @@ obj/structure/windoor_assembly/Destroy()
return
//Wrenching an unsecure assembly anchors it in place. Step 4 complete
if(iswrench(W) && !anchored)
if(W.iswrench() && !anchored)
playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1)
user.visible_message("[user] secures the windoor assembly to the floor.", "You start to secure the windoor assembly to the floor.")
@@ -101,7 +101,7 @@ obj/structure/windoor_assembly/Destroy()
src.name = "Anchored Windoor Assembly"
//Unwrenching an unsecure assembly un-anchors it. Step 4 undone
else if(iswrench(W) && anchored)
else if(W.iswrench() && anchored)
playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1)
user.visible_message("[user] unsecures the windoor assembly to the floor.", "You start to unsecure the windoor assembly to the floor.")
@@ -132,7 +132,7 @@ obj/structure/windoor_assembly/Destroy()
src.name = "Secure Windoor Assembly"
//Adding cable to the assembly. Step 5 complete.
else if(iscoil(W) && anchored)
else if(W.iscoil() && anchored)
user.visible_message("[user] wires the windoor assembly.", "You start to wire the windoor assembly.")
var/obj/item/stack/cable_coil/CC = W
@@ -150,7 +150,7 @@ obj/structure/windoor_assembly/Destroy()
if("02")
//Removing wire from the assembly. Step 5 undone.
if(iswirecutter(W) && !src.electronics)
if(W.iswirecutter() && !src.electronics)
playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1)
user.visible_message("[user] cuts the wires from the airlock assembly.", "You start to cut the wires from airlock assembly.")
@@ -183,7 +183,7 @@ obj/structure/windoor_assembly/Destroy()
EL.inuse = 0
//Screwdriver to remove airlock electronics. Step 6 undone.
else if(isscrewdriver(W) && src.electronics)
else if(W.isscrewdriver() && src.electronics)
playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1)
user.visible_message("[user] removes the electronics from the airlock assembly.", "You start to uninstall electronics from the airlock assembly.")
@@ -199,7 +199,7 @@ obj/structure/windoor_assembly/Destroy()
ae.forceMove(src.loc)
//Crowbar to complete the assembly, Step 7 complete.
else if(iscrowbar(W))
else if(W.iscrowbar())
if(!src.electronics)
usr << "<span class='warning'>The assembly is missing electronics.</span>"
return
+3 -3
View File
@@ -221,7 +221,7 @@
if(W.flags & NOBLUDGEON) return
if(isscrewdriver(W))
if(W.isscrewdriver())
if(reinf && state >= 1)
state = 3 - state
update_nearby_icons()
@@ -237,11 +237,11 @@
update_nearby_icons()
playsound(loc, 'sound/items/Screwdriver.ogg', 75, 1)
user << (anchored ? "<span class='notice'>You have fastened the window to the floor.</span>" : "<span class='notice'>You have unfastened the window.</span>")
else if(iscrowbar(W) && reinf && state <= 1)
else if(W.iscrowbar() && reinf && state <= 1)
state = 1 - state
playsound(loc, 'sound/items/Crowbar.ogg', 75, 1)
user << (state ? "<span class='notice'>You have pried the window into the frame.</span>" : "<span class='notice'>You have pried the window out of the frame.</span>")
else if(iswrench(W) && !anchored && (!state || !reinf))
else if(W.iswrench() && !anchored && (!state || !reinf))
if(!glasstype)
user << "<span class='notice'>You're not sure how to dismantle \the [src] properly.</span>"
else