Files
Bubberstation/code/game/objects/items/inducer.dm
nightred 395bebcdcc [READY] Space Suits use cells and warm the wearer (#49028)
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.
2020-02-15 11:32:54 +13:00

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