Merge pull request #11760 from Core0verload/selfrepair

Cyborgs update
This commit is contained in:
Razharas
2015-09-30 22:50:08 +03:00
19 changed files with 407 additions and 236 deletions
+1 -3
View File
@@ -1863,9 +1863,7 @@
if(isrobot(L))
var/mob/living/silicon/robot/R = L
if(R.module)
R.module.modules += I
I.loc = R.module
R.module.rebuild()
R.module.add_module(I)
R.activate_module(I)
@@ -1,24 +1,27 @@
/mob/living/silicon/robot/examine(mob/user)
var/msg = "<span class='info'>*---------*\nThis is \icon[src] \a <EM>[src]</EM>!\n"
if(desc)
msg += "[desc]\n"
var/obj/act_module = get_active_hand()
if(act_module)
msg += "It is holding \icon[act_module] \a [act_module].\n"
msg += "<span class='warning'>"
if (src.getBruteLoss())
if (src.getBruteLoss() < 60)
if (src.getBruteLoss() < maxHealth*0.5)
msg += "It looks slightly dented.\n"
else
msg += "<B>It looks severely dented!</B>\n"
if (src.getFireLoss())
if (src.getFireLoss() < 60)
if (src.getFireLoss() < maxHealth*0.5)
msg += "It looks slightly charred.\n"
else
msg += "<B>It looks severely burnt and heat-warped!</B>\n"
if (src.health < -50)
if (src.health < -maxHealth*0.5)
msg += "It looks barely operational.\n"
if (src.fire_stacks < 0)
msg += "It's covered in water.\n"
if (src.fire_stacks > 0)
else if (src.fire_stacks > 0)
msg += "It's coated in something flammable.\n"
msg += "</span>"
+17 -18
View File
@@ -42,21 +42,21 @@
if (..()) //Alive.
if(health <= config.health_threshold_dead) //die only once
if(health <= -maxHealth) //die only once
death()
return
if(health < 50) //Gradual break down of modules as more damage is sustained
if(health < maxHealth*0.5) //Gradual break down of modules as more damage is sustained
if(uneq_module(module_state_3))
src << "<span class='warning'>SYSTEM ERROR: Module 3 OFFLINE.</span>"
if(health < 0)
if(uneq_module(module_state_2))
src << "<span class='warning'>SYSTEM ERROR: Module 2 OFFLINE.</span>"
if(health < -50)
if(health < -maxHealth*0.5)
if(uneq_module(module_state_1))
src << "<span class='warning'>CRITICAL ERROR: All modules OFFLINE.</span>"
if(getOxyLoss() > 50)
if(getOxyLoss() > maxHealth*0.5)
Paralyse(3)
if (paralysis || stunned || weakened) //Stunned etc.
@@ -131,25 +131,24 @@
/mob/living/silicon/robot/handle_hud_icons_health()
if (healths)
if (stat != DEAD)
switch(health)
if(100 to INFINITY)
healths.icon_state = "health0"
if(50 to 100)
healths.icon_state = "health2"
if(0 to 50)
healths.icon_state = "health3"
if(-50 to 0)
healths.icon_state = "health4"
if(config.health_threshold_dead to -50)
healths.icon_state = "health5"
else
healths.icon_state = "health6"
if(health >= maxHealth)
healths.icon_state = "health0"
else if(health > maxHealth*0.5)
healths.icon_state = "health2"
else if(health > 0)
healths.icon_state = "health3"
else if(health > -maxHealth*0.5)
healths.icon_state = "health4"
else if(health > -maxHealth)
healths.icon_state = "health5"
else
healths.icon_state = "health6"
else
healths.icon_state = "health7"
/mob/living/silicon/robot/proc/update_cell()
if (cell)
var/cellcharge = src.cell.charge/src.cell.maxcharge
var/cellcharge = cell.charge/cell.maxcharge
switch(cellcharge)
if(0.75 to INFINITY)
clear_alert("charge")
+20 -15
View File
@@ -328,20 +328,20 @@
stat(null, "Time left: [max(malf.AI_win_timeleft/malf.apcs, 0)]")
if(cell)
stat(null, text("Charge Left: [cell.charge]/[cell.maxcharge]"))
stat("Charge Left:", "[cell.charge]/[cell.maxcharge]")
else
stat(null, text("No Cell Inserted!"))
stat(null, "Station Time: [worldtime2text()]")
stat("Station Time:", worldtime2text())
if(module)
internal = locate(/obj/item/weapon/tank/jetpack) in module.modules
if(internal)
stat("Internal Atmosphere Info", internal.name)
stat("Tank Pressure", internal.air_contents.return_pressure())
for (var/datum/robot_energy_storage/st in module.storages)
stat("[st.name]: [st.energy]/[st.max_energy]")
stat("Internal Atmosphere Info:", internal.name)
stat("Tank Pressure:", internal.air_contents.return_pressure())
for(var/datum/robot_energy_storage/st in module.storages)
stat("[st.name]:", "[st.energy]/[st.max_energy]")
if(connected_ai)
stat(null, text("Master AI: [connected_ai.name]"))
stat("Master AI:", connected_ai.name)
/mob/living/silicon/robot/restrained()
return 0
@@ -418,20 +418,22 @@
if (istype(W, /obj/item/weapon/restraints/handcuffs)) // fuck i don't even know why isrobot() in handcuff code isn't working so this will have to do
return
if (istype(W, /obj/item/weapon/weldingtool) && user.a_intent != "harm")
if (istype(W, /obj/item/weapon/weldingtool) && (user.a_intent != "harm" || user == src))
user.changeNext_move(CLICK_CD_MELEE)
var/obj/item/weapon/weldingtool/WT = W
if (src == user)
user << "<span class='warning'>You lack the reach to be able to repair yourself!</span>"
return
if (src.health >= src.maxHealth)
if (!getBruteLoss())
user << "<span class='warning'>[src] is already in good condition!</span>"
return
if (WT.remove_fuel(0, user)) //The welder has 1u of fuel consumed by it's afterattack, so we don't need to worry about taking any away.
if(src == user)
user << "<span class='notice'>You start fixing youself...</span>"
if(!do_after(user, 50, target = src))
return
adjustBruteLoss(-30)
updatehealth()
add_fingerprint(user)
visible_message("[user] has fixed some of the dents on [src].")
visible_message("<span class='notice'>[user] has fixed some of the dents on [src].</span>")
return
else
user << "<span class='warning'>The welder must be on for this task!</span>"
@@ -439,7 +441,11 @@
else if(istype(W, /obj/item/stack/cable_coil) && wiresexposed)
var/obj/item/stack/cable_coil/coil = W
if (fireloss > 0)
if (getFireLoss() > 0)
if(src == user)
user << "<span class='notice'>You start fixing youself...</span>"
if(!do_after(user, 50, target = src))
return
if (coil.use(1))
adjustFireLoss(-30)
updatehealth()
@@ -753,7 +759,6 @@
return update_icons()
/mob/living/silicon/robot/update_icons()
overlays.Cut()
if(stat != DEAD && !(paralysis || stunned || weakened)) //Not dead, not stunned.
var/state_name = icon_state //For easy conversion and/or different names
@@ -38,6 +38,45 @@
if((m != R.module_state_1) && (m != R.module_state_2) && (m != R.module_state_3))
. += m
/obj/item/weapon/robot_module/proc/get_or_create_estorage(var/storage_type)
for(var/datum/robot_energy_storage/S in storages)
if(istype(S, storage_type))
return S
return new storage_type(src)
/obj/item/weapon/robot_module/proc/add_module(var/obj/item/I)
if(istype(I, /obj/item/stack))
var/obj/item/stack/S = I
if(is_type_in_list(S, list(/obj/item/stack/sheet/metal, /obj/item/stack/rods, /obj/item/stack/tile/plasteel)))
if(S.materials[MAT_METAL])
S.cost = S.materials[MAT_METAL] * 0.25
S.source = get_or_create_estorage(/datum/robot_energy_storage/metal)
else if(istype(S, /obj/item/stack/sheet/glass))
S.cost = 500
S.source = get_or_create_estorage(/datum/robot_energy_storage/glass)
else if(istype(S, /obj/item/stack/medical))
S.cost = 250
S.source = get_or_create_estorage(/datum/robot_energy_storage/medical)
else if(istype(S, /obj/item/stack/cable_coil))
S.cost = 1
S.source = get_or_create_estorage(/datum/robot_energy_storage/wire)
if(S && S.source)
S.materials = list()
S.is_cyborg = 1
if(istype(I, /obj/item/weapon/restraints/handcuffs/cable))
var/obj/item/weapon/restraints/handcuffs/cable/C = I
C.wirestorage = get_or_create_estorage(/datum/robot_energy_storage/wire)
I.loc = src
modules += I
rebuild()
/obj/item/weapon/robot_module/New()
modules += new /obj/item/device/assembly/flash/cyborg(src)
@@ -46,7 +85,20 @@
return
/obj/item/weapon/robot_module/proc/respawn_consumable(mob/living/silicon/robot/R)
/obj/item/weapon/robot_module/proc/respawn_consumable(mob/living/silicon/robot/R, coeff = 1)
for(var/datum/robot_energy_storage/st in storages)
st.energy = min(st.max_energy, st.energy + coeff * st.recharge_rate)
for(var/obj/item/I in get_usable_modules())
if(istype(I, /obj/item/device/assembly/flash))
var/obj/item/device/assembly/flash/F = I
F.times_used = 0
F.crit_fail = 0
F.update_icon()
if(istype(I, /obj/item/weapon/melee/baton))
var/obj/item/weapon/melee/baton/B = I
if(B.bcell)
B.bcell.charge = B.bcell.maxcharge
return
/obj/item/weapon/robot_module/proc/rebuild()//Rebuilds the list so it's possible to add/remove items from the module
@@ -83,6 +135,7 @@
fix_modules()
/obj/item/weapon/robot_module/medical
name = "medical robot module"
@@ -102,22 +155,20 @@
modules += new /obj/item/weapon/circular_saw(src)
modules += new /obj/item/weapon/extinguisher/mini(src)
modules += new /obj/item/roller/robo(src)
emag = new /obj/item/weapon/reagent_containers/spray(src)
add_module(new /obj/item/stack/medical/gauze/cyborg())
emag = new /obj/item/weapon/reagent_containers/spray(src)
emag.reagents.add_reagent("facid", 250)
emag.name = "Fluacid spray"
var/datum/robot_energy_storage/gauze/gauzestore = new /datum/robot_energy_storage/gauze(src)
var/obj/item/stack/medical/gauze/cyborg/G = new /obj/item/stack/medical/gauze/cyborg(src)
G.source = gauzestore
modules += G
storages += gauzestore
fix_modules()
/obj/item/weapon/robot_module/medical/respawn_consumable(mob/living/silicon/robot/R, coeff = 1)
..()
if(R.emagged && istype(emag, /obj/item/weapon/reagent_containers/spray))
emag.reagents.add_reagent("facid", 2 * coeff)
/obj/item/weapon/robot_module/engineering
@@ -139,40 +190,22 @@
modules += new /obj/item/device/t_scanner(src)
modules += new /obj/item/device/analyzer(src)
var/datum/robot_energy_storage/metal/metstore = new /datum/robot_energy_storage/metal(src)
var/datum/robot_energy_storage/glass/glastore = new /datum/robot_energy_storage/glass(src)
var/datum/robot_energy_storage/wire/wirestore = new /datum/robot_energy_storage/wire(src)
var/obj/item/stack/sheet/metal/cyborg/M = new /obj/item/stack/sheet/metal/cyborg(src)
M.source = metstore
modules += M
var/obj/item/stack/sheet/glass/cyborg/Q = new /obj/item/stack/sheet/glass/cyborg(src)
Q.source = glastore
modules += Q
add_module(new /obj/item/stack/sheet/metal/cyborg())
add_module(new /obj/item/stack/sheet/glass/cyborg())
var/obj/item/stack/sheet/rglass/cyborg/G = new /obj/item/stack/sheet/rglass/cyborg(src)
G.metsource = metstore
G.glasource = glastore
modules += G
G.metsource = get_or_create_estorage(/datum/robot_energy_storage/metal)
G.glasource = get_or_create_estorage(/datum/robot_energy_storage/glass)
add_module(G)
var/obj/item/stack/rods/cyborg/R = new /obj/item/stack/rods/cyborg(src)
R.source = metstore
modules += R
add_module(new /obj/item/stack/rods/cyborg())
add_module(new /obj/item/stack/tile/plasteel/cyborg())
add_module(new /obj/item/stack/cable_coil/cyborg(src,MAXCOIL,"red"))
var/obj/item/stack/cable_coil/cyborg/W = new /obj/item/stack/cable_coil/cyborg(src,MAXCOIL,pick("red","yellow","green","blue","pink","orange","cyan","white"))
W.source = wirestore
modules += W
var/obj/item/stack/tile/plasteel/cyborg/F = new /obj/item/stack/tile/plasteel/cyborg(src) //"Plasteel" is the normal metal floor tile, Don't be confused - RR
F.source = metstore
modules += F //'F' for floor tile - RR(src)
storages += metstore
storages += glastore
storages += wirestore
fix_modules()
/obj/item/weapon/robot_module/security
name = "security robot module"
@@ -185,6 +218,18 @@
emag = new /obj/item/weapon/gun/energy/laser/cyborg(src)
fix_modules()
/obj/item/weapon/robot_module/security/respawn_consumable(mob/living/silicon/robot/R, coeff = 1)
..()
var/obj/item/weapon/gun/energy/gun/advtaser/cyborg/T = locate(/obj/item/weapon/gun/energy/gun/advtaser/cyborg) in get_usable_modules()
if(T)
if(T.power_supply.charge < T.power_supply.maxcharge)
var/obj/item/ammo_casing/energy/S = T.ammo_type[T.select]
T.power_supply.give(S.e_cost * coeff)
T.update_icon()
else
T.charge_tick = 0
/obj/item/weapon/robot_module/janitor
name = "janitorial robot module"
@@ -202,6 +247,16 @@
emag.name = "lube spray"
fix_modules()
/obj/item/weapon/robot_module/janitor/respawn_consumable(mob/living/silicon/robot/R, coeff = 1)
..()
var/obj/item/device/lightreplacer/LR = locate(/obj/item/device/lightreplacer) in get_usable_modules()
if(LR)
for(var/i = 1, i <= coeff, i++)
LR.Charge(R)
if(R.emagged && istype(emag, /obj/item/weapon/reagent_containers/spray))
emag.reagents.add_reagent("lube", 2 * coeff)
/obj/item/weapon/robot_module/butler
name = "service robot module"
@@ -214,22 +269,20 @@
modules += new /obj/item/weapon/razor(src)
modules += new /obj/item/device/instrument/violin(src)
modules += new /obj/item/device/instrument/guitar(src)
var/obj/item/weapon/rsf/M = new /obj/item/weapon/rsf(src)
M.matter = 30
modules += M
modules += new /obj/item/weapon/rsf{matter = 30}(src)
modules += new /obj/item/weapon/reagent_containers/dropper(src)
var/obj/item/weapon/lighter/L = new /obj/item/weapon/lighter(src)
L.lit = 1
modules += L
modules += new /obj/item/weapon/lighter{lit = 1}(src)
modules += new /obj/item/weapon/storage/bag/tray(src)
modules += new /obj/item/weapon/reagent_containers/borghypo/borgshaker(src)
emag = new /obj/item/weapon/reagent_containers/borghypo/borgshaker/hacked(src)
fix_modules()
/obj/item/weapon/robot_module/butler/respawn_consumable(mob/living/silicon/robot/R, coeff = 1)
..()
var/obj/item/weapon/reagent_containers/O = locate(/obj/item/weapon/reagent_containers/food/condiment/enzyme) in get_usable_modules()
if(O)
O.reagents.add_reagent("enzyme", 2 * coeff)
/obj/item/weapon/robot_module/miner
name = "miner robot module"
@@ -247,6 +300,7 @@
fix_modules()
/obj/item/weapon/robot_module/syndicate
name = "syndicate assault robot module"
@@ -257,7 +311,7 @@
modules += new /obj/item/weapon/gun/projectile/revolver/grenadelauncher/cyborg(src)
modules += new /obj/item/weapon/card/emag(src)
modules += new /obj/item/weapon/tank/jetpack/carbondioxide(src)
modules += new /obj/item/weapon/crowbar(src)
modules += new /obj/item/weapon/crowbar/red(src)
modules += new /obj/item/weapon/pinpointer/operative(src)
emag = null
fix_modules()
@@ -283,13 +337,8 @@
modules += new /obj/item/weapon/pinpointer/operative(src)
emag = null
var/datum/robot_energy_storage/gauze/gauzestore = new /datum/robot_energy_storage/gauze(src)
var/obj/item/stack/medical/gauze/cyborg/G = new /obj/item/stack/medical/gauze/cyborg(src)
G.source = gauzestore
modules += G
storages += gauzestore
add_module(new /obj/item/stack/medical/gauze/cyborg())
fix_modules()
@@ -299,8 +348,10 @@
var/recharge_rate = 1000
var/energy
/datum/robot_energy_storage/New()
/datum/robot_energy_storage/New(var/obj/item/weapon/robot_module/R = null)
energy = max_energy
if(R)
R.storages |= src
return
/datum/robot_energy_storage/proc/use_charge(amount)
@@ -326,7 +377,7 @@
recharge_rate = 2
name = "Wire Synthesizer"
/datum/robot_energy_storage/gauze
/datum/robot_energy_storage/medical
max_energy = 2500
recharge_rate = 250
name = "Gauze Synthesizer"
name = "Medical Synthesizer"
@@ -54,6 +54,7 @@
return 1
/obj/item/weapon/gun/energy/laser/cyborg
can_charge = 0
desc = "An energy-based laser gun that draws power from the cyborg's internal energy cell directly. So this is what freedom looks like?"
/obj/item/weapon/gun/energy/laser/cyborg/newshot()
@@ -290,6 +290,7 @@
icon = 'icons/obj/guns/projectile.dmi'
cell_type = "/obj/item/weapon/stock_parts/cell/secborg"
ammo_type = list(/obj/item/ammo_casing/energy/c3dbullet)
can_charge = 0
var/charge_tick = 0
var/recharge_time = 5
@@ -30,6 +30,7 @@
var/charge_tick = 0
var/recharge_time = 10
can_flashlight = 0
can_charge = 0
/obj/item/weapon/gun/energy/gun/advtaser/cyborg/New()
..()
@@ -18,7 +18,7 @@
if(!reagents.total_volume)
user << "<span class='warning'>[src] is empty!</span>"
return
if(!istype(M))
if(!iscarbon(M))
return
if(reagents.total_volume && (ignore_flags || M.can_inject(user, 1))) // Ignore flag should be checked first or there will be an error message.
@@ -69,19 +69,23 @@
flags = null
list_reagents = list("epinephrine" = 10)
/obj/item/weapon/reagent_containers/hypospray/medipen/New()
..()
update_icon()
return
/obj/item/weapon/reagent_containers/hypospray/medipen/attack(mob/M, mob/user)
if(!reagents.total_volume)
user << "<span class='warning'>[src] is empty!</span>"
return
..()
update_icon()
spawn(80)
if(isrobot(user) && !reagents.total_volume)
var/mob/living/silicon/robot/R = user
if(R.cell.use(100))
reagents.add_reagent_list(list_reagents)
update_icon()
return
/obj/item/weapon/reagent_containers/hypospray/medipen/update_icon()
if(reagents.total_volume > 0)
icon_state = "[initial(icon_state)]1"
icon_state = initial(icon_state)
else
icon_state = "[initial(icon_state)]0"
@@ -100,6 +104,10 @@
amount_per_transfer_from_this = 20
list_reagents = list("ephedrine" = 10, "coffee" = 10)
/obj/item/weapon/reagent_containers/hypospray/medipen/stimpack/traitor
desc = "A modified stimulants autoinjector for use in combat situations. Has a mild healing effect."
list_reagents = list("stimulants" = 10, "omnizine" = 10)
/obj/item/weapon/reagent_containers/hypospray/medipen/morphine
name = "morphine medipen"
desc = "A rapid way to get you out of a tight situation and fast! You'll feel rather drowsy, though."