Skip to content

Commit

Permalink
[Testmerge ready] Ports tool behaviours; refactors all tools; adds fu…
Browse files Browse the repository at this point in the history
…nctionality for self-filling reagent containers (ParadiseSS13#11700)

* Adds support for self-filling reagent containers

* Sets tool_behaviour on the default set of tools

* Fixing merge conflicts

* Refactors welder to use tool behaviour

* The refactor: part I

* The refactor: part II

* Tool Refactor Part III: Revenge of the Maint

* Tool Refactor Part IV: A New Hope

* Tool Refactor Part V: The Oldcoder Strikes Back

* Tool Refactor Part VI: Return of the Coder

* VII

* Holy shit, it compiles?!

* Nannek I completed your TODO, you owe me ice cream

* Tool helpers; telepad is compliant

* Bugtest, Round 1: Fight

Fuck refactoring disposals

* Buggfixing, Round 2: Electric Boogaloo

* Personal crafting uses tool behaviours now

* Construction datums use new tool behaviours; better way of handling fueltank refuelling; more bugfixing

* multitool_check_buffer change; removes some useless things in tool_helpers

* proc name change

* TRUE/FALSE changes

* Bugfixing, Round 3: A Good Day To Bugfix Hard

Fixes multiple issues raised by the testmerge

* Minor style changes
  • Loading branch information
Citinited authored Feb 15, 2020
1 parent 5b1941e commit fddff10
Show file tree
Hide file tree
Showing 238 changed files with 6,645 additions and 5,508 deletions.
18 changes: 9 additions & 9 deletions code/ATMOSPHERICS/components/binary_devices/circulator.dm
Original file line number Diff line number Diff line change
Expand Up @@ -98,16 +98,16 @@
else
return "South"

/obj/machinery/atmospherics/binary/circulator/attackby(obj/item/W as obj, mob/user as mob, params)
if(ismultitool(W))
if(side_inverted == 0)
side_inverted = 1
else
side_inverted = 0
to_chat(user, "<span class='notice'>You reverse the circulator's valve settings. The inlet of the circulator is now on the [get_inlet_side(dir)] side.</span>")
desc = "A gas circulator pump and heat exchanger. Its input port is on the [get_inlet_side(dir)] side, and its output port is on the [get_outlet_side(dir)] side."
/obj/machinery/atmospherics/binary/circulator/multitool_act(mob/user, obj/item/I)
. = TRUE
if(!I.use_tool(src, user, 0, volume = I.tool_volume))
return
if(!side_inverted)
side_inverted = TRUE
else
return ..()
side_inverted = FALSE
to_chat(user, "<span class='notice'>You reverse the circulator's valve settings. The inlet of the circulator is now on the [get_inlet_side(dir)] side.</span>")
desc = "A gas circulator pump and heat exchanger. Its input port is on the [get_inlet_side(dir)] side, and its output port is on the [get_outlet_side(dir)] side."

/obj/machinery/atmospherics/binary/circulator/update_icon()
..()
Expand Down
38 changes: 17 additions & 21 deletions code/ATMOSPHERICS/components/unary_devices/vent_pump.dm
Original file line number Diff line number Diff line change
Expand Up @@ -344,27 +344,6 @@
playsound(loc, 'sound/weapons/bladeslice.ogg', 100, TRUE)

/obj/machinery/atmospherics/unary/vent_pump/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/weldingtool))
var/obj/item/weldingtool/WT = W
if(WT.remove_fuel(0,user))
to_chat(user, "<span class='notice'>Now welding the vent.</span>")
if(do_after(user, 20 * WT.toolspeed, target = src))
if(!src || !WT.isOn()) return
playsound(src.loc, WT.usesound, 50, 1)
if(!welded)
user.visible_message("[user] welds the vent shut.", "You weld the vent shut.", "You hear welding.")
welded = 1
update_icon()
else
user.visible_message("[user] unwelds the vent.", "You unweld the vent.", "You hear welding.")
welded = 0
update_icon()
else
to_chat(user, "<span class='notice'>The welding tool needs to be on to start this task.</span>")
return 1
else
to_chat(user, "<span class='notice'>You need more welding fuel to complete this task.</span>")
return 1
if(istype(W, /obj/item/screwdriver))
if(!welded)
if(open)
Expand Down Expand Up @@ -400,6 +379,23 @@

return ..()

/obj/machinery/atmospherics/unary/vent_pump/welder_act(mob/user, obj/item/I)
. = TRUE
if(!I.tool_use_check(user, 0))
return
WELDER_ATTEMPT_WELD_MESSAGE
if(I.use_tool(src, user, 20, volume = I.tool_volume))
if(!welded)
welded = TRUE
visible_message("<span class='notice'>[user] welds [src] shut!</span>",\
"<span class='notice'>You weld [src] shut!</span>")
else
welded = FALSE
visible_message("<span class='notice'>[user] unwelds [src]!</span>",\
"<span class='notice'>You unweld [src]!</span>")
update_icon()


/obj/machinery/atmospherics/unary/vent_pump/attack_hand()
if(!welded)
if(open)
Expand Down
37 changes: 16 additions & 21 deletions code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm
Original file line number Diff line number Diff line change
Expand Up @@ -393,27 +393,6 @@
playsound(loc, 'sound/weapons/bladeslice.ogg', 100, TRUE)

/obj/machinery/atmospherics/unary/vent_scrubber/attackby(var/obj/item/W as obj, var/mob/user as mob, params)
if(istype(W, /obj/item/weldingtool))
var/obj/item/weldingtool/WT = W
if(WT.remove_fuel(0,user))
to_chat(user, "<span class='notice'>Now welding the scrubber.</span>")
if(do_after(user, 20 * WT.toolspeed, target = src))
if(!src || !WT.isOn()) return
playsound(get_turf(src), WT.usesound, 50, 1)
if(!welded)
user.visible_message("[user] welds the scrubber shut.", "You weld the vent scrubber.", "You hear welding.")
welded = 1
update_icon()
else
user.visible_message("[user] unwelds the scrubber.", "You unweld the scrubber.", "You hear welding.")
welded = 0
update_icon()
else
to_chat(user, "<span class='notice'>The welding tool needs to be on to start this task.</span>")
return 1
else
to_chat(user, "<span class='notice'>You need more welding fuel to complete this task.</span>")
return 1
if(istype(W, /obj/item/multitool))
update_multitool_menu(user)
return 1
Expand All @@ -423,3 +402,19 @@
return 1

return ..()

/obj/machinery/atmospherics/unary/vent_scrubber/welder_act(mob/user, obj/item/I)
. = TRUE
if(!I.tool_use_check(user, 0))
return
WELDER_ATTEMPT_WELD_MESSAGE
if(I.use_tool(src, user, 20, volume = I.tool_volume))
if(!welded)
welded = TRUE
visible_message("<span class='notice'>[user] welds [src] shut!</span>",\
"<span class='notice'>You weld [src] shut!</span>")
else
welded = FALSE
visible_message("<span class='notice'>[user] unwelds [src]!</span>",\
"<span class='notice'>You unweld [src]!</span>")
update_icon()
46 changes: 46 additions & 0 deletions code/__DEFINES/tools.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
#define TOOL_CROWBAR "crowbar"
#define TOOL_MULTITOOL "multitool"
#define TOOL_SCREWDRIVER "screwdriver"
#define TOOL_WIRECUTTER "wirecutter"
#define TOOL_WRENCH "wrench"
#define TOOL_WELDER "welder"

#define MIN_TOOL_SOUND_DELAY 20

//Crowbar messages
#define CROWBAR_ATTEMPT_PRY_CIRCUIT_MESSAGE user.visible_message("<span class='notice'>[user] begins removing the circuit board from [src]...</span>", "<span class='notice'>You begin removing the circuit board from [src]...</span>", "<span class='warning'>You hear prying noises.</span>")
#define CROWBAR_PRY_CIRCUIT_SUCCESS_MESSAGE user.visible_message("<span class='notice'>[user] pries out the circuit board from [src]!</span>", "<span class='notice'>You pry out the circuit board from [src]!</span>", "<span class='warning'>You hear prying noises.</span>")

//Screwdriver messages
#define SCREWDRIVER_SCREW_MESSAGE user.visible_message("<span class='notice'>[user] tightens the screws on [src]!</span>", "<span class='notice'>You tighten the screws on [src]!</span>", "<span class='warning'>You hear a screwdriver.</span>")
#define SCREWDRIVER_UNSCREW_MESSAGE user.visible_message("<span class='notice'>[user] loosens the screws on [src]!</span>", "<span class='notice'>You loosen the screws on [src]!</span>", "<span class='warning'>You hear a screwdriver.</span>")
#define SCREWDRIVER_OPEN_PANEL_MESSAGE user.visible_message("<span class='notice'>[user] opens the panel on [src]!</span>", "<span class='notice'>You open the panel on [src]!</span>", "<span class='warning'>You hear a screwdriver.</span>")
#define SCREWDRIVER_CLOSE_PANEL_MESSAGE user.visible_message("<span class='notice'>[user] closes the panel on [src]!</span>", "<span class='notice'>You close the panel on [src]!</span>", "<span class='warning'>You hear a screwdriver.</span>")

//Wirecutter messages
#define WIRECUTTER_SNIP_MESSAGE user.visible_message("<span class='notice'>[user] cuts the wires from [src]!</span>", "<span class='notice'>You cut the wires from [src]!</span>", "<span class='warning'>You hear snipping.</span>")
#define WIRECUTTER_ATTEMPT_DISMANTLE_MESSAGE user.visible_message("<span class='notice'>[user] begins cutting [src] apart... </span>", "<span class='notice'>You begin cutting [src] apart...</span>", "<span class='warning'>You hear snipping.</span>")
#define WIRECUTTER_DISMANTLE_SUCCESS_MESSAGE user.visible_message("<span class='notice'>[user] cuts [src] apart!</span>", "<span class='notice'>You cut [src] apart!</span>", "<span class='warning'>You hear snipping.</span>")

//Welder messages and other stuff
#define HEALPERWELD 15
#define WELDER_ATTEMPT_WELD_MESSAGE user.visible_message("<span class='notice'>[user] begins welding [src]...</span>", "<span class='notice'>You begin welding [src]...</span>", "<span class='warning'>You hear welding.</span>")
#define WELDER_WELD_SUCCESS_MESSAGE to_chat(user, "<span class='notice'>You finish welding [src]!</span>")
#define WELDER_ATTEMPT_REPAIR_MESSAGE user.visible_message("<span class='notice'>[user] begins repairing the damage on [src]...</span>", "<span class='notice'>You begin repairing [src]...</span>", "<span class='warning'>You hear welding.</span>")
#define WELDER_REPAIR_SUCCESS_MESSAGE to_chat(user, "<span class='notice'>You repair the damage on [src]!</span>")
#define WELDER_ATTEMPT_SLICING_MESSAGE user.visible_message("<span class='notice'>[user] begins slicing through [src]...</span>", "<span class='notice'>You begin slicing through [src]...</span>", "<span class='warning'>You hear welding.</span>")
#define WELDER_SLICING_SUCCESS_MESSAGE to_chat(user, "<span class='notice'>You slice clean through [src]!</span>")
#define WELDER_ATTEMPT_FLOOR_SLICE_MESSAGE user.visible_message("<span class='notice'>[user] begins slicing [src] free from [get_turf(src)]...</span>", "<span class='notice'>You begin slicing [src] free from [get_turf(src)]...</span>", "<span class='warning'>You hear welding.</span>")
#define WELDER_FLOOR_SLICE_SUCCESS_MESSAGE to_chat(user, "<span class='notice'>You slice [src] clear of [get_turf(src)]!</span>")
#define WELDER_ATTEMPT_FLOOR_WELD_MESSAGE user.visible_message("<span class='notice'>[user] begins welding [src] to [get_turf(src)]...</span>", "<span class='notice'>You begin welding [src] to [get_turf(src)]...</span>", "<span class='warning'>You hear welding.</span>")
#define WELDER_FLOOR_WELD_SUCCESS_MESSAGE to_chat(user, "<span class='notice'>You weld [src] to [get_turf(src)]!</span>")

//Wrench messages
#define WRENCH_ANCHOR_MESSAGE user.visible_message("<span class='notice'>[user] tightens the bolts on [src]!</span>", "<span class='notice'>You tighten the bolts on [src]!</span>", "<span class='warning'>You hear ratcheting.</span>")
#define WRENCH_UNANCHOR_MESSAGE user.visible_message("<span class='notice'>[user] loosens the bolts on [src]!</span>", "<span class='notice'>You loosen the bolts on [src]!</span>", "<span class='warning'>You hear ratcheting.</span>")
#define WRENCH_UNANCHOR_WALL_MESSAGE user.visible_message("<span class='notice'>[user] unwrenches [src] from the wall!</span>", "<span class='notice'>You unwrench [src] from the wall!</span>", "<span class='warning'>You hear ratcheting.</span>")
#define WRENCH_ANCHOR_TO_WALL_MESSAGE user.visible_message("<span class='notice'>[user] affixes [src] to the wall!</span>", "<span class='notice'>You affix [src] to the wall!</span>", "<span class='warning'>You hear ratcheting.</span>")

//Generic tool messages that don't correspond to any particular tool
#define TOOL_ATTEMPT_DISMANTLE_MESSAGE user.visible_message("<span class='notice'>[user] begins to disassemble [src] with [I]...</span>", "<span class='notice'>You begin to disassemble [src] with [I]...</span>", "<span class='warning'>You hear someone using some kind of tool.</span>")
#define TOOL_DISMANTLE_SUCCESS_MESSAGE user.visible_message("<span class='notice'>[user] dismantles [src]!</span>", "<span class='notice'>You dismantle [src]!</span>", "<span class='warning'>You hear someone using some kind of tool.</span>")
51 changes: 51 additions & 0 deletions code/__HELPERS/tool_helpers.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
//Quick type checks for some tools

/proc/iswrench(O)
if(istype(O, /obj/item/wrench))
return TRUE
return FALSE

/proc/iswelder(O)
if(istype(O, /obj/item/weldingtool))
return TRUE
return FALSE

/proc/iswirecutter(O)
if(istype(O, /obj/item/wirecutters))
return TRUE
return FALSE

/proc/isscrewdriver(O)
if(istype(O, /obj/item/screwdriver))
return TRUE
return FALSE

/proc/ismultitool(O)
if(istype(O, /obj/item/multitool))
return TRUE
return FALSE

/proc/iscrowbar(O)
if(istype(O, /obj/item/crowbar))
return TRUE
return FALSE

/proc/iscoil(O)
if(istype(O, /obj/item/stack/cable_coil))
return TRUE
return FALSE

/proc/ispowertool(O)//used to check if a tool can force powered doors
if(istype(O, /obj/item/crowbar/power) || istype(O, /obj/item/mecha_parts/mecha_equipment/medical/rescue_jaw))
return TRUE
return FALSE

/proc/is_surgery_tool(obj/item/W as obj)
return ( \
istype(W, /obj/item/scalpel) || \
istype(W, /obj/item/hemostat) || \
istype(W, /obj/item/retractor) || \
istype(W, /obj/item/cautery) || \
istype(W, /obj/item/bonegel) || \
istype(W, /obj/item/bonesetter)
)
80 changes: 4 additions & 76 deletions code/__HELPERS/unsorted.dm
Original file line number Diff line number Diff line change
Expand Up @@ -1142,73 +1142,11 @@ var/list/can_embed_types = typecacheof(list(
if(is_type_in_typecache(W, can_embed_types))
return 1

//Quick type checks for some tools
var/global/list/common_tools = list(
/obj/item/stack/cable_coil,
/obj/item/wrench,
/obj/item/weldingtool,
/obj/item/screwdriver,
/obj/item/wirecutters,
/obj/item/multitool,
/obj/item/crowbar)

/proc/istool(O)
if(O && is_type_in_list(O, common_tools))
return 1
return 0

/proc/iswrench(O)
if(istype(O, /obj/item/wrench))
return 1
return 0

/proc/iswelder(O)
if(istype(O, /obj/item/weldingtool))
return 1
return 0

/proc/iscoil(O)
if(istype(O, /obj/item/stack/cable_coil))
return 1
return 0

/proc/iswirecutter(O)
if(istype(O, /obj/item/wirecutters))
return 1
return 0

/proc/isscrewdriver(O)
if(istype(O, /obj/item/screwdriver))
return 1
return 0

/proc/ismultitool(O)
if(istype(O, /obj/item/multitool))
return 1
return 0

/proc/iscrowbar(O)
if(istype(O, /obj/item/crowbar))
return 1
return 0

/proc/ispowertool(O)//used to check if a tool can force powered doors
if(istype(O, /obj/item/crowbar/power) || istype(O, /obj/item/mecha_parts/mecha_equipment/medical/rescue_jaw))
return TRUE
return FALSE

/proc/iswire(O)
if(istype(O, /obj/item/stack/cable_coil))
return 1
return 0

/proc/is_hot(obj/item/W as obj)
if(istype(W, /obj/item/weldingtool))
var/obj/item/weldingtool/O = W
if(O.isOn())
return 2500
else
return 0
if(W.tool_behaviour == TOOL_WELDER && W.tool_enabled)
return 2500
else
return 0
if(istype(W, /obj/item/lighter))
var/obj/item/lighter/O = W
if(O.lit)
Expand Down Expand Up @@ -1260,16 +1198,6 @@ var/global/list/common_tools = list(
return 1
return 0

/proc/is_surgery_tool(obj/item/W as obj)
return ( \
istype(W, /obj/item/scalpel) || \
istype(W, /obj/item/hemostat) || \
istype(W, /obj/item/retractor) || \
istype(W, /obj/item/cautery) || \
istype(W, /obj/item/bonegel) || \
istype(W, /obj/item/bonesetter)
)

/proc/reverse_direction(var/dir)
switch(dir)
if(NORTH)
Expand Down
14 changes: 8 additions & 6 deletions code/_onclick/item_attack.dm
Original file line number Diff line number Diff line change
@@ -1,10 +1,17 @@
/obj/item/proc/melee_attack_chain(mob/user, atom/target, params)
if(pre_attackby(target, user, params))
if(!tool_attack_chain(user, target) && pre_attackby(target, user, params))
// Return 1 in attackby() to prevent afterattack() effects (when safely moving items for example)
var/resolved = target.attackby(src, user, params)
if(!resolved && target && !QDELETED(src))
afterattack(target, user, 1, params) // 1: clicking something Adjacent

//Checks if the item can work as a tool, calling the appropriate tool behavior on the target
//Note that if tool_act returns TRUE, then the tool won't call attack_by.
/obj/item/proc/tool_attack_chain(mob/user, atom/target)
if(!tool_behaviour)
return FALSE
return target.tool_act(user, src, tool_behaviour)

// Called when the item is in the active hand, and clicked; alternately, there is an 'activate held object' verb or you can hit pagedown.
/obj/item/proc/attack_self(mob/user)
if(SEND_SIGNAL(src, COMSIG_ITEM_ATTACK_SELF, user) & COMPONENT_NO_INTERACT)
Expand Down Expand Up @@ -51,11 +58,6 @@
else
return 1

if(isscrewdriver(src) && ismachine(M) && user.a_intent == INTENT_HELP)
if(!attempt_initiate_surgery(src, M, user))
return 0
else
return 1
if(is_sharp(src) && user.a_intent == INTENT_HELP)
if(!attempt_initiate_surgery(src, M, user))
return 0
Expand Down
Loading

0 comments on commit fddff10

Please sign in to comment.