mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-22 03:27:05 +01:00
conflicts? apparently?
This commit is contained in:
@@ -62,8 +62,8 @@
|
||||
color = "#EBEBEB"
|
||||
|
||||
/obj/effect/decal/cleanable/flour/foam/Initialize()
|
||||
. = ..()
|
||||
QDEL_IN(src, 15 SECONDS)
|
||||
. = ..()
|
||||
QDEL_IN(src, 15 SECONDS)
|
||||
|
||||
/obj/effect/decal/cleanable/greenglow
|
||||
name = "glowing goo"
|
||||
@@ -77,8 +77,8 @@
|
||||
icon_state = "greenglow"
|
||||
|
||||
/obj/effect/decal/cleanable/greenglow/Initialize(mapload)
|
||||
. = ..()
|
||||
QDEL_IN(src, 2 MINUTES)
|
||||
. = ..()
|
||||
QDEL_IN(src, 2 MINUTES)
|
||||
|
||||
/obj/effect/decal/cleanable/cobweb
|
||||
name = "cobweb"
|
||||
@@ -201,4 +201,3 @@
|
||||
icon_state = "confetti1"
|
||||
random_icon_states = list("confetti1", "confetti2", "confetti3")
|
||||
anchored = TRUE
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@ would spawn and follow the beaker, even if it is carried or thrown.
|
||||
|
||||
/obj/effect/particle_effect
|
||||
name = "particle effect"
|
||||
mouse_opacity = 0
|
||||
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
unacidable = 1//So effects are not targeted by alien acid.
|
||||
pass_flags = PASSTABLE | PASSGRILLE
|
||||
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
icon_state = "explosion"
|
||||
opacity = 1
|
||||
anchored = 1
|
||||
mouse_opacity = 0
|
||||
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
pixel_x = -32
|
||||
pixel_y = -32
|
||||
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
anchored = 1
|
||||
layer = 99
|
||||
plane = HUD_PLANE
|
||||
mouse_opacity = 0
|
||||
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
unacidable = 1//Just to be sure.
|
||||
|
||||
/obj/effect/beam
|
||||
|
||||
@@ -58,7 +58,7 @@
|
||||
anchored = 1
|
||||
density = 1
|
||||
layer = 5
|
||||
mouse_opacity = 0
|
||||
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
|
||||
/obj/effect/overlay/wall_rot/New()
|
||||
..()
|
||||
|
||||
@@ -42,3 +42,8 @@
|
||||
name = "reinforced window spawner"
|
||||
icon_state = "rwindow_spawner"
|
||||
windowtospawn = /obj/structure/window/reinforced
|
||||
|
||||
/obj/effect/spawner/window/reinforced/plasma
|
||||
name = "reinforced plasma window spawner"
|
||||
icon_state = "pwindow_spawner"
|
||||
windowtospawn = /obj/structure/window/plasmareinforced
|
||||
|
||||
@@ -134,7 +134,7 @@
|
||||
name = mimiced_atom.name
|
||||
appearance = mimiced_atom.appearance
|
||||
setDir(mimiced_atom.dir)
|
||||
mouse_opacity = 0
|
||||
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
|
||||
/obj/effect/temp_visual/decoy/fading/New(loc, atom/mimiced_atom)
|
||||
..()
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
/obj/effect/temp_visual
|
||||
anchored = 1
|
||||
layer = ABOVE_MOB_LAYER
|
||||
mouse_opacity = 0
|
||||
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
var/duration = 10
|
||||
var/randomdir = TRUE
|
||||
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
/proc/empulse(turf/epicenter, heavy_range, light_range, log=0)
|
||||
/proc/empulse(turf/epicenter, heavy_range, light_range, log=0, cause = null)
|
||||
if(!epicenter) return
|
||||
|
||||
if(!istype(epicenter, /turf))
|
||||
epicenter = get_turf(epicenter.loc)
|
||||
|
||||
if(log)
|
||||
message_admins("EMP with size ([heavy_range], [light_range]) in area [epicenter.loc.name] [ADMIN_COORDJMP(epicenter)]</a>")
|
||||
log_game("EMP with size ([heavy_range], [light_range]) in area [epicenter.loc.name] [COORD(epicenter)]")
|
||||
message_admins("EMP with size ([heavy_range], [light_range]) in area [epicenter.loc.name] [cause ? "(Cause: [cause])": ] [ADMIN_COORDJMP(epicenter)]</a>")
|
||||
log_game("EMP with size ([heavy_range], [light_range]) in area [epicenter.loc.name] [cause ? "(Cause: [cause])" : ] [COORD(epicenter)]")
|
||||
|
||||
if(heavy_range > 1)
|
||||
new/obj/effect/temp_visual/emp/pulse(epicenter)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
//TODO: Flash range does nothing currently
|
||||
|
||||
/proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range, adminlog = 1, ignorecap = 0, flame_range = 0 ,silent = 0, smoke = 1)
|
||||
/proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range, adminlog = 1, ignorecap = 0, flame_range = 0 ,silent = 0, smoke = 1, cause = null)
|
||||
src = null //so we don't abort once src is deleted
|
||||
epicenter = get_turf(epicenter)
|
||||
|
||||
@@ -25,8 +25,8 @@
|
||||
var/list/cached_exp_block = list()
|
||||
|
||||
if(adminlog)
|
||||
message_admins("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range], [flame_range]) in area [epicenter.loc.name] ([epicenter.x],[epicenter.y],[epicenter.z]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[epicenter.x];Y=[epicenter.y];Z=[epicenter.z]'>JMP</a>)")
|
||||
log_game("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range], [flame_range]) in area [epicenter.loc.name] ([epicenter.x],[epicenter.y],[epicenter.z])")
|
||||
message_admins("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range], [flame_range]) in area [epicenter.loc.name] [cause ? "(Cause: [cause])" : ] [ADMIN_COORDJMP(epicenter)] ")
|
||||
log_game("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range], [flame_range]) in area [epicenter.loc.name] [cause ? "(Cause: [cause])" : ] [COORD(epicenter)] ")
|
||||
|
||||
// Play sounds; we want sounds to be different depending on distance so we will manually do it ourselves.
|
||||
// Stereo users will also hear the direction of the explosion!
|
||||
|
||||
@@ -232,7 +232,6 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
|
||||
var/obj/item/organ/external/affecting = H.get_organ("[user.hand ? "l" : "r" ]_arm")
|
||||
if(affecting && affecting.receive_damage(0, 5)) // 5 burn damage
|
||||
H.UpdateDamageIcon()
|
||||
H.updatehealth()
|
||||
return
|
||||
else
|
||||
extinguish()
|
||||
@@ -554,4 +553,4 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
|
||||
return TRUE
|
||||
|
||||
/obj/item/attack_hulk(mob/living/carbon/human/user)
|
||||
return FALSE
|
||||
return FALSE
|
||||
|
||||
@@ -90,7 +90,6 @@
|
||||
to_chat(AI, "Your core files are being wiped!")
|
||||
while(AI && AI.stat != DEAD)
|
||||
AI.adjustOxyLoss(2)
|
||||
AI.updatehealth()
|
||||
sleep(10)
|
||||
flush = 0
|
||||
|
||||
|
||||
@@ -632,3 +632,253 @@ REAGENT SCANNER
|
||||
if(T.cores > 1)
|
||||
user.show_message("Anomalous slime core amount detected", 1)
|
||||
user.show_message("Growth progress: [T.amount_grown]/10", 1)
|
||||
|
||||
/obj/item/bodyanalyzer
|
||||
name = "handheld body analyzer"
|
||||
icon = 'icons/obj/device.dmi'
|
||||
icon_state = "bodyanalyzer_0"
|
||||
item_state = "healthanalyser"
|
||||
desc = "A handheld scanner capable of deep-scanning an entire body."
|
||||
slot_flags = SLOT_BELT
|
||||
throwforce = 3
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
throw_speed = 5
|
||||
throw_range = 10
|
||||
origin_tech = "magnets=6;biotech=6"
|
||||
var/obj/item/stock_parts/cell/power_supply
|
||||
var/cell_type = /obj/item/stock_parts/cell/upgraded
|
||||
var/ready = TRUE // Ready to scan
|
||||
var/time_to_use = 0 // How much time remaining before next scan is available.
|
||||
var/usecharge = 750
|
||||
|
||||
/obj/item/bodyanalyzer/advanced
|
||||
cell_type = /obj/item/stock_parts/cell/upgraded/plus
|
||||
|
||||
/obj/item/bodyanalyzer/New()
|
||||
..()
|
||||
power_supply = new cell_type(src)
|
||||
power_supply.give(power_supply.maxcharge)
|
||||
update_icon()
|
||||
|
||||
/obj/item/bodyanalyzer/proc/setReady()
|
||||
ready = TRUE
|
||||
playsound(src, 'sound/machines/defib_saftyOn.ogg', 50, 0)
|
||||
update_icon()
|
||||
|
||||
/obj/item/bodyanalyzer/update_icon(printing = FALSE)
|
||||
overlays.Cut()
|
||||
var/percent = power_supply.percent()
|
||||
if(ready)
|
||||
icon_state = "bodyanalyzer_1"
|
||||
else
|
||||
icon_state = "bodyanalyzer_2"
|
||||
|
||||
var/overlayid = round(percent / 10)
|
||||
overlayid = "bodyanalyzer_charge[overlayid]"
|
||||
overlays += icon(icon, overlayid)
|
||||
|
||||
if(printing)
|
||||
overlays += icon(icon, "bodyanalyzer_printing")
|
||||
|
||||
/obj/item/bodyanalyzer/attack(mob/living/M, mob/living/carbon/human/user)
|
||||
if(user.incapacitated() || !user.Adjacent(M))
|
||||
return
|
||||
|
||||
if(!ready)
|
||||
to_chat(user, "<span class='notice'>The scanner beeps angrily at you! It's currently recharging - [round((time_to_use - world.time) * 0.1)] seconds remaining.</span>")
|
||||
playsound(user.loc, 'sound/machines/buzz-sigh.ogg', 50, 1)
|
||||
return
|
||||
|
||||
if(power_supply.charge >= usecharge)
|
||||
mobScan(M, user)
|
||||
else
|
||||
to_chat(user, "<span class='notice'>The scanner beeps angrily at you! It's out of charge!</span>")
|
||||
playsound(user.loc, 'sound/machines/buzz-sigh.ogg', 50, 1)
|
||||
|
||||
/obj/item/bodyanalyzer/proc/mobScan(mob/living/M, mob/user)
|
||||
if(ishuman(M))
|
||||
var/report = generate_printing_text(M, user)
|
||||
user.visible_message("[user] begins scanning [M] with [src].", "You begin scanning [M].")
|
||||
if(do_after(user, 100, target = M))
|
||||
var/obj/item/paper/printout = new
|
||||
printout.info = report
|
||||
printout.name = "Scan report - [M.name]"
|
||||
playsound(user.loc, 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, 1)
|
||||
user.put_in_hands(printout)
|
||||
time_to_use = world.time + 600
|
||||
power_supply.use(usecharge)
|
||||
ready = FALSE
|
||||
update_icon(TRUE)
|
||||
addtimer(CALLBACK(src, /obj/item/bodyanalyzer/.proc/setReady), 600)
|
||||
addtimer(CALLBACK(src, /obj/item/bodyanalyzer/.proc/update_icon), 20)
|
||||
|
||||
else if(iscorgi(M) && M.stat == DEAD)
|
||||
to_chat(user, "<span class='notice'>You wonder if [M.p_they()] was a good dog. <b>[src] tells you they were the best...</b></span>") // :'(
|
||||
playsound(loc, 'sound/machines/ping.ogg', 50, 0)
|
||||
ready = FALSE
|
||||
addtimer(CALLBACK(src, /obj/item/bodyanalyzer/.proc/setReady), 600)
|
||||
time_to_use = world.time + 600
|
||||
else
|
||||
to_chat(user, "<span class='notice'>Scanning error detected. Invalid specimen.</span>")
|
||||
|
||||
//Unashamedly ripped from adv_med.dm
|
||||
/obj/item/bodyanalyzer/proc/generate_printing_text(mob/living/M, mob/user)
|
||||
var/dat = ""
|
||||
var/mob/living/carbon/human/target = M
|
||||
|
||||
dat = "<font color='blue'><b>Target Statistics:</b></font><br>"
|
||||
var/t1
|
||||
switch(target.stat) // obvious, see what their status is
|
||||
if(CONSCIOUS)
|
||||
t1 = "Conscious"
|
||||
if(UNCONSCIOUS)
|
||||
t1 = "Unconscious"
|
||||
else
|
||||
t1 = "*dead*"
|
||||
dat += "[target.health > 50 ? "<font color='blue'>" : "<font color='red'>"]\tHealth %: [target.health], ([t1])</font><br>"
|
||||
|
||||
var/found_disease = FALSE
|
||||
for(var/thing in target.viruses)
|
||||
var/datum/disease/D = thing
|
||||
if(D.visibility_flags) //If any visibility flags are on.
|
||||
continue
|
||||
found_disease = TRUE
|
||||
break
|
||||
if(found_disease)
|
||||
dat += "<font color='red'>Disease detected in target.</font><BR>"
|
||||
|
||||
var/extra_font = null
|
||||
extra_font = (target.getBruteLoss() < 60 ? "<font color='blue'>" : "<font color='red'>")
|
||||
dat += "[extra_font]\t-Brute Damage %: [target.getBruteLoss()]</font><br>"
|
||||
|
||||
extra_font = (target.getOxyLoss() < 60 ? "<font color='blue'>" : "<font color='red'>")
|
||||
dat += "[extra_font]\t-Respiratory Damage %: [target.getOxyLoss()]</font><br>"
|
||||
|
||||
extra_font = (target.getToxLoss() < 60 ? "<font color='blue'>" : "<font color='red'>")
|
||||
dat += "[extra_font]\t-Toxin Content %: [target.getToxLoss()]</font><br>"
|
||||
|
||||
extra_font = (target.getFireLoss() < 60 ? "<font color='blue'>" : "<font color='red'>")
|
||||
dat += "[extra_font]\t-Burn Severity %: [target.getFireLoss()]</font><br>"
|
||||
|
||||
extra_font = (target.radiation < 10 ?"<font color='blue'>" : "<font color='red'>")
|
||||
dat += "[extra_font]\tRadiation Level %: [target.radiation]</font><br>"
|
||||
|
||||
extra_font = (target.getCloneLoss() < 1 ?"<font color='blue'>" : "<font color='red'>")
|
||||
dat += "[extra_font]\tGenetic Tissue Damage %: [target.getCloneLoss()]<br>"
|
||||
|
||||
extra_font = (target.getBrainLoss() < 1 ?"<font color='blue'>" : "<font color='red'>")
|
||||
dat += "[extra_font]\tApprox. Brain Damage %: [target.getBrainLoss()]<br>"
|
||||
|
||||
dat += "Paralysis Summary %: [target.paralysis] ([round(target.paralysis / 4)] seconds left!)<br>"
|
||||
dat += "Body Temperature: [target.bodytemperature-T0C]°C ([target.bodytemperature*1.8-459.67]°F)<br>"
|
||||
|
||||
dat += "<hr>"
|
||||
|
||||
if(target.has_brain_worms())
|
||||
dat += "Large growth detected in frontal lobe, possibly cancerous. Surgical removal is recommended.<br>"
|
||||
|
||||
var/blood_percent = round((target.blood_volume / BLOOD_VOLUME_NORMAL))
|
||||
blood_percent *= 100
|
||||
|
||||
extra_font = (target.blood_volume > 448 ? "<font color='blue'>" : "<font color='red'>")
|
||||
dat += "[extra_font]\tBlood Level %: [blood_percent] ([target.blood_volume] units)</font><br>"
|
||||
|
||||
if(target.reagents)
|
||||
dat += "Epinephrine units: [target.reagents.get_reagent_amount("Epinephrine")] units<BR>"
|
||||
dat += "Ether: [target.reagents.get_reagent_amount("ether")] units<BR>"
|
||||
|
||||
extra_font = (target.reagents.get_reagent_amount("silver_sulfadiazine") < 30 ? "<font color='black'>" : "<font color='red'>")
|
||||
dat += "[extra_font]\tSilver Sulfadiazine: [target.reagents.get_reagent_amount("silver_sulfadiazine")]</font><br>"
|
||||
|
||||
extra_font = (target.reagents.get_reagent_amount("styptic_powder") < 30 ? "<font color='black'>" : "<font color='red'>")
|
||||
dat += "[extra_font]\tStyptic Powder: [target.reagents.get_reagent_amount("styptic_powder")] units<BR>"
|
||||
|
||||
extra_font = (target.reagents.get_reagent_amount("salbutamol") < 30 ? "<font color='black'>" : "<font color='red'>")
|
||||
dat += "[extra_font]\tSalbutamol: [target.reagents.get_reagent_amount("salbutamol")] units<BR>"
|
||||
|
||||
dat += "<hr><table border='1'>"
|
||||
dat += "<tr>"
|
||||
dat += "<th>Organ</th>"
|
||||
dat += "<th>Burn Damage</th>"
|
||||
dat += "<th>Brute Damage</th>"
|
||||
dat += "<th>Other Wounds</th>"
|
||||
dat += "</tr>"
|
||||
|
||||
for(var/obj/item/organ/external/e in target.bodyparts)
|
||||
dat += "<tr>"
|
||||
var/AN = ""
|
||||
var/open = ""
|
||||
var/infected = ""
|
||||
var/robot = ""
|
||||
var/imp = ""
|
||||
var/bled = ""
|
||||
var/splint = ""
|
||||
var/internal_bleeding = ""
|
||||
var/lung_ruptured = ""
|
||||
if(e.internal_bleeding)
|
||||
internal_bleeding = "<br>Internal bleeding"
|
||||
if(istype(e, /obj/item/organ/external/chest) && target.is_lung_ruptured())
|
||||
lung_ruptured = "Lung ruptured:"
|
||||
if(e.status & ORGAN_SPLINTED)
|
||||
splint = "Splinted:"
|
||||
if(e.status & ORGAN_BROKEN)
|
||||
AN = "[e.broken_description]:"
|
||||
if(e.is_robotic())
|
||||
robot = "Robotic:"
|
||||
if(e.open)
|
||||
open = "Open:"
|
||||
switch(e.germ_level)
|
||||
if(INFECTION_LEVEL_ONE to INFECTION_LEVEL_ONE + 200)
|
||||
infected = "Mild Infection:"
|
||||
if(INFECTION_LEVEL_ONE + 200 to INFECTION_LEVEL_ONE + 300)
|
||||
infected = "Mild Infection+:"
|
||||
if(INFECTION_LEVEL_ONE + 300 to INFECTION_LEVEL_ONE + 400)
|
||||
infected = "Mild Infection++:"
|
||||
if(INFECTION_LEVEL_TWO to INFECTION_LEVEL_TWO + 200)
|
||||
infected = "Acute Infection:"
|
||||
if(INFECTION_LEVEL_TWO + 200 to INFECTION_LEVEL_TWO + 300)
|
||||
infected = "Acute Infection+:"
|
||||
if(INFECTION_LEVEL_TWO + 300 to INFECTION_LEVEL_TWO + 400)
|
||||
infected = "Acute Infection++:"
|
||||
if(INFECTION_LEVEL_THREE to INFINITY)
|
||||
infected = "Septic:"
|
||||
|
||||
var/unknown_body = 0
|
||||
for(var/I in e.embedded_objects)
|
||||
unknown_body++
|
||||
|
||||
if(unknown_body || e.hidden)
|
||||
imp += "Unknown body present:"
|
||||
if(!AN && !open && !infected & !imp)
|
||||
AN = "None:"
|
||||
dat += "<td>[e.name]</td><td>[e.burn_dam]</td><td>[e.brute_dam]</td><td>[robot][bled][AN][splint][open][infected][imp][internal_bleeding][lung_ruptured]</td>"
|
||||
dat += "</tr>"
|
||||
for(var/obj/item/organ/internal/i in target.internal_organs)
|
||||
var/mech = i.desc
|
||||
var/infection = "None"
|
||||
switch(i.germ_level)
|
||||
if(1 to INFECTION_LEVEL_ONE + 200)
|
||||
infection = "Mild Infection:"
|
||||
if(INFECTION_LEVEL_ONE + 200 to INFECTION_LEVEL_ONE + 300)
|
||||
infection = "Mild Infection+:"
|
||||
if(INFECTION_LEVEL_ONE + 300 to INFECTION_LEVEL_ONE + 400)
|
||||
infection = "Mild Infection++:"
|
||||
if(INFECTION_LEVEL_TWO to INFECTION_LEVEL_TWO + 200)
|
||||
infection = "Acute Infection:"
|
||||
if(INFECTION_LEVEL_TWO + 200 to INFECTION_LEVEL_TWO + 300)
|
||||
infection = "Acute Infection+:"
|
||||
if(INFECTION_LEVEL_TWO + 300 to INFINITY)
|
||||
infection = "Acute Infection++:"
|
||||
|
||||
dat += "<tr>"
|
||||
dat += "<td>[i.name]</td><td>N/A</td><td>[i.damage]</td><td>[infection]:[mech]</td><td></td>"
|
||||
dat += "</tr>"
|
||||
dat += "</table>"
|
||||
if(target.disabilities & BLIND)
|
||||
dat += "<font color='red'>Cataracts detected.</font><BR>"
|
||||
if(target.disabilities & COLOURBLIND)
|
||||
dat += "<font color='red'>Photoreceptor abnormalities detected.</font><BR>"
|
||||
if(target.disabilities & NEARSIGHTED)
|
||||
dat += "<font color='red'>Retinal misalignment detected.</font><BR>"
|
||||
|
||||
return dat
|
||||
|
||||
@@ -302,14 +302,12 @@
|
||||
|
||||
if(cyborg.health < cyborg.maxHealth)
|
||||
if(cyborg.health < 0)
|
||||
repair_amount = -2.5
|
||||
repair_amount = 2.5
|
||||
powercost = 30
|
||||
else
|
||||
repair_amount = -1
|
||||
repair_amount = 1
|
||||
powercost = 10
|
||||
cyborg.adjustBruteLoss(repair_amount)
|
||||
cyborg.adjustFireLoss(repair_amount)
|
||||
cyborg.updatehealth()
|
||||
cyborg.heal_overall_damage(repair_amount, repair_amount)
|
||||
cyborg.cell.use(powercost)
|
||||
else
|
||||
cyborg.cell.use(5)
|
||||
|
||||
@@ -94,9 +94,7 @@
|
||||
|
||||
hp -= Proj.damage
|
||||
if(hp <= 0)
|
||||
for(var/mob/O in oviewers())
|
||||
if((O.client && !( O.blinded )))
|
||||
to_chat(O, "<span class='warning'>[src] breaks into tiny pieces and collapses!</span>")
|
||||
visible_message("<span class='warning'>[src] breaks into tiny pieces and collapses!</span>")
|
||||
qdel(src)
|
||||
|
||||
// Create a temporary object to represent the damage
|
||||
|
||||
@@ -73,7 +73,6 @@
|
||||
|
||||
else
|
||||
M.heal_organ_damage(heal_brute, heal_burn)
|
||||
M.updatehealth()
|
||||
user.visible_message("<span class='green'>[user] applies [src] on [M].</span>", \
|
||||
"<span class='green'>You apply [src] on [M].</span>")
|
||||
use(1)
|
||||
|
||||
@@ -15,9 +15,7 @@
|
||||
if(istype(M,/mob/living/silicon/robot)) //Repairing cyborgs
|
||||
var/mob/living/silicon/robot/R = M
|
||||
if(R.getBruteLoss() || R.getFireLoss() )
|
||||
R.adjustBruteLoss(-15)
|
||||
R.adjustFireLoss(-15)
|
||||
R.updatehealth()
|
||||
R.heal_overall_damage(15, 15)
|
||||
use(1)
|
||||
user.visible_message("<span class='notice'>\The [user] applied some [src] at [R]'s damaged areas.</span>",\
|
||||
"<span class='notice'>You apply some [src] at [R]'s damaged areas.</span>")
|
||||
@@ -31,7 +29,6 @@
|
||||
if(S && S.is_robotic())
|
||||
if(S.get_damage())
|
||||
S.heal_damage(15, 15, robo_repair = 1)
|
||||
H.updatehealth()
|
||||
use(1)
|
||||
user.visible_message("<span class='notice'>\The [user] applies some nanite paste at[user != M ? " \the [M]'s" : " \the"][S.name] with \the [src].</span>",\
|
||||
"<span class='notice'>You apply some nanite paste at [user == M ? "your" : "[M]'s"] [S.name].</span>")
|
||||
|
||||
@@ -332,7 +332,6 @@
|
||||
"<span class='userdanger'>[user] has touched [H.name] with [src]!</span>")
|
||||
H.adjustStaminaLoss(50)
|
||||
H.Weaken(5)
|
||||
H.updatehealth() //forces health update before next life tick
|
||||
playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 50, 1, -1)
|
||||
H.emote("gasp")
|
||||
if(!H.undergoing_cardiac_arrest() && (prob(10) || defib.combat)) // Your heart explodes.
|
||||
@@ -479,7 +478,6 @@
|
||||
"<span class='userdanger'>[user] has touched [H.name] with [src]!</span>")
|
||||
H.adjustStaminaLoss(50)
|
||||
H.Weaken(5)
|
||||
H.updatehealth() //forces health update before next life tick
|
||||
if(!H.undergoing_cardiac_arrest() && prob(10)) // Your heart explodes.
|
||||
H.set_heartattack(TRUE)
|
||||
playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 50, 1, -1)
|
||||
|
||||
@@ -60,7 +60,7 @@
|
||||
if(nadeassembly)
|
||||
nadeassembly.attack_self(user)
|
||||
return
|
||||
var/newtime = input(usr, "Please set the timer.", "Timer", 10) as num
|
||||
var/newtime = input(usr, "Please set the timer.", "Timer", det_time) as num
|
||||
if(user.is_in_active_hand(src))
|
||||
newtime = Clamp(newtime, 10, 60000)
|
||||
det_time = newtime
|
||||
@@ -231,3 +231,38 @@
|
||||
CB.prime()
|
||||
|
||||
..()
|
||||
|
||||
/obj/item/grenade/plastic/x4/thermite
|
||||
name = "T4"
|
||||
desc = "A wall breaching charge, containing fuel, metal oxide and metal powder mixed in just the right way. One hell of a combination. Effective against walls, ineffective against airlocks..."
|
||||
det_time = 2
|
||||
icon_state = "t4breach0"
|
||||
item_state = "t4breach"
|
||||
|
||||
/obj/item/grenade/plastic/x4/thermite/prime()
|
||||
var/turf/location
|
||||
if(target)
|
||||
if(!QDELETED(target))
|
||||
location = get_turf(target)
|
||||
target.overlays -= image_overlay
|
||||
else
|
||||
location = get_turf(src)
|
||||
if(location)
|
||||
var/datum/effect_system/smoke_spread/smoke = new
|
||||
smoke.set_up(8,0, location, aim_dir)
|
||||
if(target && target.density)
|
||||
var/turf/T = get_step(location, aim_dir)
|
||||
for(var/turf/simulated/wall/W in range(1, location))
|
||||
W.thermitemelt(speed = 30)
|
||||
addtimer(CALLBACK(null, .proc/explosion, T, 0, 0, 2), 3)
|
||||
addtimer(CALLBACK(smoke, /datum/effect_system/smoke_spread/.proc/start), 3)
|
||||
else
|
||||
addtimer(CALLBACK(null, .proc/explosion, T, 0, 0, 2), 3)
|
||||
addtimer(CALLBACK(smoke, /datum/effect_system/smoke_spread/.proc/start), 3)
|
||||
|
||||
|
||||
if(isliving(target))
|
||||
var/mob/living/M = target
|
||||
M.adjust_fire_stacks(2)
|
||||
M.IgniteMob()
|
||||
qdel(src)
|
||||
|
||||
@@ -56,7 +56,6 @@
|
||||
var/obj/item/organ/external/affecting = H.get_organ("[user.hand ? "l" : "r" ]_hand")
|
||||
if(affecting.receive_damage( 0, 5 )) //INFERNO
|
||||
H.UpdateDamageIcon()
|
||||
H.updatehealth()
|
||||
user.visible_message("<span class='notice'>After a few attempts, [user] manages to light the [src], [user.p_they()] however burn[user.p_s()] [user.p_their()] finger in the process.</span>")
|
||||
|
||||
set_light(2)
|
||||
@@ -184,6 +183,7 @@
|
||||
attack_verb = list("burnt","singed")
|
||||
processing_objects.Add(src)
|
||||
update_icon()
|
||||
return TRUE
|
||||
|
||||
/obj/item/match/proc/matchburnout()
|
||||
if(lit)
|
||||
@@ -197,6 +197,7 @@
|
||||
desc = "A match. This one has seen better days."
|
||||
attack_verb = list("flicked")
|
||||
processing_objects.Remove(src)
|
||||
return TRUE
|
||||
|
||||
/obj/item/match/dropped(mob/user)
|
||||
matchburnout()
|
||||
|
||||
@@ -50,7 +50,6 @@
|
||||
to_chat(H, "<span class='warning'>[src] cuts into your hand!</span>")
|
||||
if(affecting.receive_damage(force*0.5))
|
||||
H.UpdateDamageIcon()
|
||||
H.updatehealth()
|
||||
|
||||
/obj/item/shard/attackby(obj/item/I, mob/user, params)
|
||||
if(iswelder(I))
|
||||
@@ -87,7 +86,6 @@
|
||||
H.Weaken(3)
|
||||
if(affecting.receive_damage(5, 0))
|
||||
H.UpdateDamageIcon()
|
||||
H.updatehealth()
|
||||
..()
|
||||
|
||||
/obj/item/shard/plasma
|
||||
@@ -126,4 +124,4 @@
|
||||
to_chat(usr, "You add the newly-formed plasma glass to the stack. It now contains [NG.amount] sheets.")
|
||||
qdel(src)
|
||||
else
|
||||
return ..()
|
||||
return ..()
|
||||
|
||||
@@ -246,6 +246,15 @@
|
||||
new /obj/item/grenade/flashbang(src)
|
||||
update_icon()
|
||||
|
||||
/obj/item/storage/belt/security/response_team_gamma/New()
|
||||
..()
|
||||
new /obj/item/melee/baton/loaded(src)
|
||||
new /obj/item/reagent_containers/spray/pepper(src)
|
||||
new /obj/item/flash(src)
|
||||
new /obj/item/grenade/flashbang(src)
|
||||
new /obj/item/grenade/flashbang(src)
|
||||
update_icon()
|
||||
|
||||
/obj/item/storage/belt/soulstone
|
||||
name = "soul stone belt"
|
||||
desc = "Designed for ease of access to the shards during a fight, as to not let a single enemy spirit slip away"
|
||||
|
||||
@@ -123,3 +123,13 @@
|
||||
new /obj/item/clothing/accessory/medal/conduct(src)
|
||||
new /obj/item/clothing/accessory/medal/conduct(src)
|
||||
new /obj/item/clothing/accessory/medal/gold/captain(src)
|
||||
|
||||
/obj/item/storage/lockbox/t4
|
||||
name = "lockbox (T4)"
|
||||
desc = "Contains three T4 breaching charges."
|
||||
req_access = list(access_cent_specops)
|
||||
|
||||
/obj/item/storage/lockbox/t4/New()
|
||||
..()
|
||||
for(var/i = 0, i < 3, i++)
|
||||
new /obj/item/grenade/plastic/x4/thermite(src)
|
||||
@@ -166,7 +166,7 @@
|
||||
|
||||
if(display_contents_with_number)
|
||||
for(var/datum/numbered_display/ND in display_contents)
|
||||
ND.sample_object.mouse_opacity = 2
|
||||
ND.sample_object.mouse_opacity = MOUSE_OPACITY_OPAQUE
|
||||
ND.sample_object.screen_loc = "[cx]:16,[cy]:16"
|
||||
ND.sample_object.maptext = "<font color='white'>[(ND.number > 1)? "[ND.number]" : ""]</font>"
|
||||
ND.sample_object.layer = 20
|
||||
@@ -177,7 +177,7 @@
|
||||
cy--
|
||||
else
|
||||
for(var/obj/O in contents)
|
||||
O.mouse_opacity = 2 //This is here so storage items that spawn with contents correctly have the "click around item to equip"
|
||||
O.mouse_opacity = MOUSE_OPACITY_OPAQUE //This is here so storage items that spawn with contents correctly have the "click around item to equip"
|
||||
O.screen_loc = "[cx]:16,[cy]:16"
|
||||
O.maptext = ""
|
||||
O.layer = 20
|
||||
@@ -309,7 +309,7 @@
|
||||
src.orient2hud(usr)
|
||||
if(usr.s_active)
|
||||
usr.s_active.show_to(usr)
|
||||
W.mouse_opacity = 2 //So you can click on the area around the item to equip it, instead of having to pixel hunt
|
||||
W.mouse_opacity = MOUSE_OPACITY_OPAQUE //So you can click on the area around the item to equip it, instead of having to pixel hunt
|
||||
update_icon()
|
||||
return 1
|
||||
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
var/status = 0
|
||||
var/obj/item/stock_parts/cell/high/bcell = null
|
||||
var/hitcost = 1000
|
||||
var/throw_hit_chance = 35
|
||||
|
||||
/obj/item/melee/baton/suicide_act(mob/user)
|
||||
user.visible_message("<span class='suicide'>[user] is putting the live [name] in [user.p_their()] mouth! It looks like [user.p_theyre()] trying to commit suicide.</span>")
|
||||
@@ -28,6 +29,11 @@
|
||||
QDEL_NULL(bcell)
|
||||
return ..()
|
||||
|
||||
/obj/item/melee/baton/throw_impact(atom/hit_atom)
|
||||
..()
|
||||
if(status && prob(throw_hit_chance))
|
||||
baton_stun(hit_atom)
|
||||
|
||||
/obj/item/melee/baton/loaded/New() //this one starts with a cell pre-installed.
|
||||
..()
|
||||
bcell = new(src)
|
||||
@@ -138,15 +144,17 @@
|
||||
if(H.check_shields(0, "[user]'s [name]", src, MELEE_ATTACK)) //No message; check_shields() handles that
|
||||
playsound(L, 'sound/weapons/Genhit.ogg', 50, 1)
|
||||
return
|
||||
user.lastattacked = L
|
||||
L.lastattacker = user
|
||||
|
||||
L.Stun(stunforce)
|
||||
L.Weaken(stunforce)
|
||||
L.apply_effect(STUTTER, stunforce)
|
||||
|
||||
L.visible_message("<span class='danger'>[user] has stunned [L] with [src]!</span>", \
|
||||
"<span class='userdanger'>[user] has stunned you with [src]!</span>")
|
||||
if(user)
|
||||
user.lastattacked = L
|
||||
L.lastattacker = user
|
||||
L.visible_message("<span class='danger'>[user] has stunned [L] with [src]!</span>", \
|
||||
"<span class='userdanger'>[user] has stunned you with [src]!</span>")
|
||||
add_attack_logs(user, L, "stunned")
|
||||
playsound(loc, 'sound/weapons/Egloves.ogg', 50, 1, -1)
|
||||
|
||||
if(isrobot(loc))
|
||||
@@ -160,8 +168,6 @@
|
||||
var/mob/living/carbon/human/H = L
|
||||
H.forcesay(hit_appends)
|
||||
|
||||
add_attack_logs(user, L, "Stunned with [src]")
|
||||
|
||||
/obj/item/melee/baton/emp_act(severity)
|
||||
if(bcell)
|
||||
deductcharge(1000 / severity)
|
||||
@@ -193,6 +199,7 @@
|
||||
throwforce = 5
|
||||
stunforce = 5
|
||||
hitcost = 2000
|
||||
throw_hit_chance = 10
|
||||
slot_flags = SLOT_BACK
|
||||
var/obj/item/assembly/igniter/sparkler = null
|
||||
|
||||
|
||||
@@ -315,7 +315,7 @@
|
||||
desc = "A frozen shell of ice containing nanofrost that freezes the surrounding area after activation."
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
icon_state = "frozen_smoke_capsule"
|
||||
mouse_opacity = 0
|
||||
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
pass_flags = PASSTABLE
|
||||
|
||||
/obj/effect/nanofrost_container/proc/Smoke()
|
||||
|
||||
@@ -147,7 +147,6 @@
|
||||
H.adjustBruteLoss(damage)
|
||||
|
||||
H.UpdateDamageIcon()
|
||||
H.updatehealth()
|
||||
return
|
||||
|
||||
/obj/structure/proc/can_touch(var/mob/user)
|
||||
|
||||
@@ -60,9 +60,7 @@
|
||||
if(allowed(user))
|
||||
locked = !locked
|
||||
playsound(loc, 'sound/machines/click.ogg', 15, 1, -3)
|
||||
for(var/mob/O in viewers(user, 3))
|
||||
if((O.client && !( O.blinded )))
|
||||
to_chat(O, "<span class='notice'>The locker has been [locked ? null : "un"]locked by [user].</span>")
|
||||
visible_message("<span class='notice'>The locker has been [locked ? null : "un"]locked by [user].</span>")
|
||||
update_icon()
|
||||
else
|
||||
to_chat(user, "<span class='notice'>Access Denied</span>")
|
||||
@@ -93,12 +91,11 @@
|
||||
|
||||
/obj/structure/closet/secure_closet/emag_act(mob/user)
|
||||
if(!broken)
|
||||
broken = 1
|
||||
locked = 0
|
||||
desc = "It appears to be broken."
|
||||
broken = TRUE
|
||||
locked = FALSE
|
||||
icon_state = icon_off
|
||||
flick(icon_broken, src)
|
||||
to_chat(user, "<span class='notice'>You unlock \the [src].</span>")
|
||||
to_chat(user, "<span class='notice'>You break the lock on \the [src].</span>")
|
||||
|
||||
/obj/structure/closet/secure_closet/attack_hand(mob/user)
|
||||
add_fingerprint(user)
|
||||
|
||||
@@ -270,9 +270,7 @@
|
||||
return
|
||||
if(src.allowed(user))
|
||||
src.locked = !src.locked
|
||||
for(var/mob/O in viewers(user, 3))
|
||||
if((O.client && !( O.blinded )))
|
||||
to_chat(O, "<span class='notice'>The crate has been [locked ? null : "un"]locked by [user].</span>")
|
||||
visible_message("<span class='notice'>The crate has been [locked ? null : "un"]locked by [user].</span>")
|
||||
update_icon()
|
||||
else
|
||||
to_chat(user, "<span class='notice'>Access Denied</span>")
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
var/grille_type
|
||||
var/broken_type = /obj/structure/grille/broken
|
||||
var/shockcooldown = 0
|
||||
var/my_shockcooldown = 50
|
||||
var/my_shockcooldown = 1 SECONDS
|
||||
|
||||
/obj/structure/grille/fence/
|
||||
var/width = 3
|
||||
|
||||
@@ -69,10 +69,7 @@
|
||||
if(src.destroyed)
|
||||
return
|
||||
else
|
||||
to_chat(usr, text("<span class='notice'>You kick the lab cage.</span>"))
|
||||
for(var/mob/O in oviewers())
|
||||
if((O.client && !( O.blinded )))
|
||||
to_chat(O, text("<span class='warning'>[] kicks the lab cage.</span>", usr))
|
||||
user.visible_message("<span class='warning'>[user] kicks the lab cage.</span>", "<span class='notice'>You kick the lab cage.</span>")
|
||||
src.health -= 2
|
||||
healthcheck()
|
||||
return
|
||||
@@ -82,4 +79,4 @@
|
||||
new /obj/item/clothing/mask/facehugger/lamarr(src.loc)
|
||||
occupied = 0
|
||||
update_icon()
|
||||
return
|
||||
return
|
||||
|
||||
@@ -207,9 +207,7 @@
|
||||
return
|
||||
O.forceMove(loc)
|
||||
if(user != O)
|
||||
for(var/mob/B in viewers(user, 3))
|
||||
if((B.client && !( B.blinded )))
|
||||
to_chat(B, text("<span class='warning'>[] stuffs [] into []!</span>", user, O, src))
|
||||
user.visible_message("<span class='warning'>[user] stuffs [O] into [src]!</span>")
|
||||
return
|
||||
|
||||
/obj/structure/m_tray/Destroy()
|
||||
@@ -440,9 +438,7 @@
|
||||
return
|
||||
O.forceMove(loc)
|
||||
if(user != O)
|
||||
for(var/mob/B in viewers(user, 3))
|
||||
if((B.client && !( B.blinded )))
|
||||
to_chat(B, text("<span class='warning'>[] stuffs [] into []!</span>", user, O, src))
|
||||
user.visible_message("<span class='warning'>[user] stuffs [O] into [src]!</span>")
|
||||
//Foreach goto(99)
|
||||
return
|
||||
|
||||
|
||||
@@ -278,7 +278,7 @@
|
||||
icon_state = "mist"
|
||||
layer = MOB_LAYER + 1
|
||||
anchored = 1
|
||||
mouse_opacity = 0
|
||||
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
|
||||
/obj/machinery/shower/attack_hand(mob/M as mob)
|
||||
on = !on
|
||||
|
||||
Reference in New Issue
Block a user