mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-01-27 01:21:30 +00:00
About The Pull Request
This makes space suits use a cell and warm the wearer, This was handled by the handle_environment proc in the past with an override to make the suits work. This corrects this issue, and removes the override.
All space suits will have a cell installed at round start, this cell will last 15 min on average usage.
The cell cover can be toggled by alt+clicking (press the button), or using a crowbar (just pry it open) on the suit.
With the cover open you can remove the cell by using the suit in hand, or ctrl+clicking the suit.
As well with the cover open you can use a screwdriver to set the thermal regulator's temperature. The normal range is 20 c to 45 c, do not use an emag on the suit to increase the temperature range.
Examining the suit will report the temperature setting and the cells charge, if the cover is open you will also be able to see the type of cell that is in the suit.
Suit storage units will now charge the cells in suits, they will also require power to operate properly now.
Why It's Good For The Game
Space suits should be managing the wearers temp in space not using some override.
Lizards now have a portable heater in the form of any space suit.
Now that suits need a cell it is not as easy to spend all session in a space suit.
New interactions with hardsuits and emp's give nice combat buff to an underused item.
Nuke ops can raid xeno for some nice yellow cells, or science for a big old bluespace cell.
194 lines
5.2 KiB
Plaintext
194 lines
5.2 KiB
Plaintext
/obj/item/inducer
|
|
name = "inducer"
|
|
desc = "A tool for inductively charging internal power cells."
|
|
icon = 'icons/obj/tools.dmi'
|
|
icon_state = "inducer-engi"
|
|
item_state = "inducer-engi"
|
|
lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
|
|
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
|
|
force = 7
|
|
var/powertransfer = 1000
|
|
var/opened = FALSE
|
|
var/cell_type = /obj/item/stock_parts/cell/high
|
|
var/obj/item/stock_parts/cell/cell
|
|
var/recharging = FALSE
|
|
|
|
/obj/item/inducer/Initialize()
|
|
. = ..()
|
|
if(!cell && cell_type)
|
|
cell = new cell_type
|
|
|
|
/obj/item/inducer/proc/induce(obj/item/stock_parts/cell/target, coefficient)
|
|
var/totransfer = min(cell.charge,(powertransfer * coefficient))
|
|
var/transferred = target.give(totransfer)
|
|
cell.use(transferred)
|
|
cell.update_icon()
|
|
target.update_icon()
|
|
|
|
/obj/item/inducer/get_cell()
|
|
return cell
|
|
|
|
/obj/item/inducer/emp_act(severity)
|
|
. = ..()
|
|
if(cell && !(. & EMP_PROTECT_CONTENTS))
|
|
cell.emp_act(severity)
|
|
|
|
/obj/item/inducer/attack_obj(obj/O, mob/living/carbon/user)
|
|
if(user.a_intent == INTENT_HARM)
|
|
return ..()
|
|
|
|
if(cantbeused(user))
|
|
return
|
|
|
|
if(recharge(O, user))
|
|
return
|
|
|
|
return ..()
|
|
|
|
/obj/item/inducer/proc/cantbeused(mob/user)
|
|
if(!user.IsAdvancedToolUser())
|
|
to_chat(user, "<span class='warning'>You don't have the dexterity to use [src]!</span>")
|
|
return TRUE
|
|
|
|
if(!cell)
|
|
to_chat(user, "<span class='warning'>[src] doesn't have a power cell installed!</span>")
|
|
return TRUE
|
|
|
|
if(!cell.charge)
|
|
to_chat(user, "<span class='warning'>[src]'s battery is dead!</span>")
|
|
return TRUE
|
|
return FALSE
|
|
|
|
|
|
/obj/item/inducer/attackby(obj/item/W, mob/user)
|
|
if(W.tool_behaviour == TOOL_SCREWDRIVER)
|
|
W.play_tool_sound(src)
|
|
if(!opened)
|
|
to_chat(user, "<span class='notice'>You unscrew the battery compartment.</span>")
|
|
opened = TRUE
|
|
update_icon()
|
|
return
|
|
else
|
|
to_chat(user, "<span class='notice'>You close the battery compartment.</span>")
|
|
opened = FALSE
|
|
update_icon()
|
|
return
|
|
if(istype(W, /obj/item/stock_parts/cell))
|
|
if(opened)
|
|
if(!cell)
|
|
if(!user.transferItemToLoc(W, src))
|
|
return
|
|
to_chat(user, "<span class='notice'>You insert [W] into [src].</span>")
|
|
cell = W
|
|
update_icon()
|
|
return
|
|
else
|
|
to_chat(user, "<span class='warning'>[src] already has \a [cell] installed!</span>")
|
|
return
|
|
|
|
if(cantbeused(user))
|
|
return
|
|
|
|
if(recharge(W, user))
|
|
return
|
|
|
|
return ..()
|
|
|
|
/obj/item/inducer/proc/recharge(atom/movable/A, mob/user)
|
|
if(!isturf(A) && user.loc == A)
|
|
return FALSE
|
|
if(recharging)
|
|
return TRUE
|
|
else
|
|
recharging = TRUE
|
|
var/obj/item/stock_parts/cell/C = A.get_cell()
|
|
var/obj/O
|
|
var/coefficient = 1
|
|
if(istype(A, /obj/item/gun/energy))
|
|
to_chat(user, "<span class='alert'>Error unable to interface with device.</span>")
|
|
return FALSE
|
|
if(istype(A, /obj/item/clothing/suit/space))
|
|
to_chat(user, "<span class='alert'>Error unable to interface with device.</span>")
|
|
return FALSE
|
|
if(istype(A, /obj))
|
|
O = A
|
|
if(C)
|
|
var/done_any = FALSE
|
|
if(C.charge >= C.maxcharge)
|
|
to_chat(user, "<span class='notice'>[A] is fully charged!</span>")
|
|
recharging = FALSE
|
|
return TRUE
|
|
user.visible_message("<span class='notice'>[user] starts recharging [A] with [src].</span>", "<span class='notice'>You start recharging [A] with [src].</span>")
|
|
while(C.charge < C.maxcharge)
|
|
if(do_after(user, 10, target = user) && cell.charge)
|
|
done_any = TRUE
|
|
induce(C, coefficient)
|
|
do_sparks(1, FALSE, A)
|
|
if(O)
|
|
O.update_icon()
|
|
else
|
|
break
|
|
if(done_any) // Only show a message if we succeeded at least once
|
|
user.visible_message("<span class='notice'>[user] recharged [A]!</span>", "<span class='notice'>You recharged [A]!</span>")
|
|
recharging = FALSE
|
|
return TRUE
|
|
recharging = FALSE
|
|
|
|
|
|
/obj/item/inducer/attack(mob/M, mob/user)
|
|
if(user.a_intent == INTENT_HARM)
|
|
return ..()
|
|
|
|
if(cantbeused(user))
|
|
return
|
|
|
|
if(recharge(M, user))
|
|
return
|
|
return ..()
|
|
|
|
|
|
/obj/item/inducer/attack_self(mob/user)
|
|
if(opened && cell)
|
|
user.visible_message("<span class='notice'>[user] removes [cell] from [src]!</span>", "<span class='notice'>You remove [cell].</span>")
|
|
cell.update_icon()
|
|
user.put_in_hands(cell)
|
|
cell = null
|
|
update_icon()
|
|
|
|
|
|
/obj/item/inducer/examine(mob/living/M)
|
|
. = ..()
|
|
if(cell)
|
|
. += "<span class='notice'>Its display shows: [DisplayEnergy(cell.charge)].</span>"
|
|
else
|
|
. += "<span class='notice'>Its display is dark.</span>"
|
|
if(opened)
|
|
. += "<span class='notice'>Its battery compartment is open.</span>"
|
|
|
|
/obj/item/inducer/update_overlays()
|
|
. = ..()
|
|
if(opened)
|
|
if(!cell)
|
|
. += "inducer-nobat"
|
|
else
|
|
. += "inducer-bat"
|
|
|
|
/obj/item/inducer/sci
|
|
icon_state = "inducer-sci"
|
|
item_state = "inducer-sci"
|
|
desc = "A tool for inductively charging internal power cells. This one has a science color scheme, and is less potent than its engineering counterpart."
|
|
cell_type = null
|
|
powertransfer = 500
|
|
opened = TRUE
|
|
|
|
/obj/item/inducer/sci/Initialize()
|
|
. = ..()
|
|
update_icon()
|
|
|
|
/obj/item/inducer/syndicate
|
|
icon_state = "inducer-syndi"
|
|
item_state = "inducer-syndi"
|
|
desc = "A tool for inductively charging internal power cells. This one has a suspicious colour scheme, and seems to be rigged to transfer charge at a much faster rate."
|
|
powertransfer = 2000
|
|
cell_type = /obj/item/stock_parts/cell/super
|