Modernizing Radiation -- TL;DR: Radiation is now a status effect healed by tox healing, and contamination is removed (#62265)

Implements the Modernizing radiation design document ( https://hackmd.io/@tgstation/rJNIyeBHt ) and replaces the current radiation sources with the new system, as well as replacing/removing a bunch of old consumers of radiation that either had no reason to exist, or could be replaced by something else.

Diverges from the doc in that items radiation don't go up like explained. I was going to, but items get irradiated so easily that it just feels pretty lame. Items still get irradiated, but it's mostly just so that radiation sources look cooler (wow, lots of stuff around going green), and for things like the geiger counter.

Instead of the complicated radiation_wave system, radiation now just checks everything between the radiation source and the potential target, losing power along the way based on the radiation insulation of whats in between. If this reaches too low a point (specified by radiation_pulse consumers), then the radiation will not pass. Otherwise, will roll a chance to irradiate. Uranium structures allow a delay before irradiating, so stay away!
This commit is contained in:
Mothblocks
2021-11-01 04:20:39 -03:00
committed by GitHub
parent 9003982726
commit 0f3c4e51f7
342 changed files with 1869 additions and 2152 deletions
+1 -1
View File
@@ -24,7 +24,7 @@ RLD
w_class = WEIGHT_CLASS_NORMAL
custom_materials = list(/datum/material/iron=100000)
req_access_txt = "11"
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 50)
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 100, ACID = 50)
resistance_flags = FIRE_PROOF
var/datum/effect_system/spark_spread/spark_system
var/matter = 0
+1 -1
View File
@@ -196,7 +196,7 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list(
w_class = WEIGHT_CLASS_NORMAL
slot_flags = ITEM_SLOT_BELT
custom_materials = list(/datum/material/iron=75000, /datum/material/glass=37500)
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 50)
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 100, ACID = 50)
resistance_flags = FIRE_PROOF
///Sparks system used when changing device in the UI
var/datum/effect_system/spark_spread/spark_system
+1 -1
View File
@@ -20,7 +20,7 @@ RSF
density = FALSE
anchored = FALSE
item_flags = NOBLUDGEON
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0)
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0)
///The current matter count
var/matter = 0
///The max amount of matter in the device
+1 -1
View File
@@ -80,7 +80,7 @@
lefthand_file = 'icons/mob/inhands/equipment/idcards_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/idcards_righthand.dmi'
slot_flags = ITEM_SLOT_ID
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 100)
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 100, ACID = 100)
resistance_flags = FIRE_PROOF | ACID_PROOF
/// Cached icon that has been built for this card. Intended for use in chat.
+1 -1
View File
@@ -38,7 +38,7 @@
icon = 'icons/obj/money_machine.dmi'
icon_state = "bogdanoff"
layer = LARGE_MOB_LAYER
armor = list(MELEE = 80, BULLET = 30, LASER = 30, ENERGY = 60, BOMB = 90, BIO = 0, RAD = 0, FIRE = 100, ACID = 80)
armor = list(MELEE = 80, BULLET = 30, LASER = 30, ENERGY = 60, BOMB = 90, BIO = 0, FIRE = 100, ACID = 80)
density = TRUE
pixel_z = -8
max_integrity = 5000
+1 -1
View File
@@ -16,7 +16,7 @@
throwforce = 6
w_class = WEIGHT_CLASS_BULKY
actions_types = list(/datum/action/item_action/toggle_paddles)
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50)
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 50)
var/obj/item/shockpaddles/paddle_type = /obj/item/shockpaddles
var/on = FALSE //if the paddles are equipped (1) or on the defib (0)
+1 -21
View File
@@ -7,7 +7,6 @@ GLOBAL_LIST_EMPTY(PDAs)
#define PDA_SCANNER_MEDICAL 1
#define PDA_SCANNER_FORENSICS 2 //unused
#define PDA_SCANNER_REAGENT 3
#define PDA_SCANNER_HALOGEN 4
#define PDA_SCANNER_GAS 5
#define PDA_SPAM_DELAY 2 MINUTES
@@ -26,7 +25,7 @@ GLOBAL_LIST_EMPTY(PDAs)
w_class = WEIGHT_CLASS_TINY
slot_flags = ITEM_SLOT_ID | ITEM_SLOT_BELT
actions_types = list(/datum/action/item_action/toggle_light)
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 100)
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 100, ACID = 100)
resistance_flags = FIRE_PROOF | ACID_PROOF
light_system = MOVABLE_LIGHT_DIRECTIONAL
light_range = 2.3
@@ -321,8 +320,6 @@ GLOBAL_LIST_EMPTY(PDAs)
dat += "<li><a href='byond://?src=[REF(src)];choice=53'>[PDAIMG(notes)]Newscaster Access </a></li>"
if (cartridge.access & CART_REAGENT_SCANNER)
dat += "<li><a href='byond://?src=[REF(src)];choice=Reagent Scan'>[PDAIMG(reagent)][scanmode == 3 ? "Disable" : "Enable"] Reagent Scanner</a></li>"
if (cartridge.access & CART_ENGINE)
dat += "<li><a href='byond://?src=[REF(src)];choice=Halogen Counter'>[PDAIMG(reagent)][scanmode == 4 ? "Disable" : "Enable"] Halogen Counter</a></li>"
if (cartridge.access & CART_ATMOS)
dat += "<li><a href='byond://?src=[REF(src)];choice=Gas Scan'>[PDAIMG(reagent)][scanmode == 5 ? "Disable" : "Enable"] Gas Scanner</a></li>"
if (cartridge.access & CART_REMOTE_DOOR)
@@ -566,13 +563,6 @@ GLOBAL_LIST_EMPTY(PDAs)
scanmode = PDA_SCANNER_NONE
else if((!isnull(cartridge)) && (cartridge.access & CART_REAGENT_SCANNER))
scanmode = PDA_SCANNER_REAGENT
if("Halogen Counter")
if(scanmode == PDA_SCANNER_HALOGEN)
scanmode = PDA_SCANNER_NONE
else if((!isnull(cartridge)) && (cartridge.access & CART_ENGINE))
scanmode = PDA_SCANNER_HALOGEN
if(!silent)
playsound(src, 'sound/machines/terminal_select.ogg', 15, TRUE)
if("Honk")
if ( !(last_noise && world.time < last_noise + 20) )
playsound(src, 'sound/items/bikehorn.ogg', 50, TRUE)
@@ -1103,15 +1093,6 @@ GLOBAL_LIST_EMPTY(PDAs)
healthscan(user, C, 1)
add_fingerprint(user)
if(PDA_SCANNER_HALOGEN)
C.visible_message(span_notice("[user] analyzes [C]'s radiation levels."))
user.show_message(span_notice("Analyzing Results for [C]:"))
if(C.radiation)
user.show_message("\green Radiation Level: \black [C.radiation]")
else
user.show_message(span_notice("No radiation detected."))
/obj/item/pda/afterattack(atom/A as mob|obj|turf|area, mob/user, proximity)
. = ..()
if(!proximity)
@@ -1288,6 +1269,5 @@ GLOBAL_LIST_EMPTY(PDAs)
#undef PDA_SCANNER_MEDICAL
#undef PDA_SCANNER_FORENSICS
#undef PDA_SCANNER_REAGENT
#undef PDA_SCANNER_HALOGEN
#undef PDA_SCANNER_GAS
#undef PDA_SPAM_DELAY
@@ -103,7 +103,7 @@
mouse_opacity = MOUSE_OPACITY_OPAQUE
resistance_flags = INDESTRUCTIBLE
can_atmos_pass = ATMOS_PASS_DENSITY
armor = list(MELEE = 0, BULLET = 25, LASER = 50, ENERGY = 50, BOMB = 25, BIO = 100, RAD = 100, FIRE = 100, ACID = 100)
armor = list(MELEE = 0, BULLET = 25, LASER = 50, ENERGY = 50, BOMB = 25, BIO = 100, FIRE = 100, ACID = 100)
var/obj/item/forcefield_projector/generator
/obj/structure/projected_forcefield/Initialize(mapload, obj/item/forcefield_projector/origin)
+59 -165
View File
@@ -1,9 +1,3 @@
#define RAD_LEVEL_NORMAL 9
#define RAD_LEVEL_MODERATE 100
#define RAD_LEVEL_HIGH 400
#define RAD_LEVEL_VERY_HIGH 800
#define RAD_LEVEL_CRITICAL 1500
/obj/item/geiger_counter //DISCLAIMER: I know nothing about how real-life Geiger counters work. This will not be realistic. ~Xhuis
name = "\improper Geiger counter"
desc = "A handheld device used for detecting and measuring radiation pulses."
@@ -18,158 +12,102 @@
item_flags = NOBLUDGEON
custom_materials = list(/datum/material/iron = 150, /datum/material/glass = 150)
var/grace = RAD_GEIGER_GRACE_PERIOD
var/datum/looping_sound/geiger/soundloop
var/last_perceived_radiation_danger = null
var/scanning = FALSE
var/radiation_count = 0
var/current_tick_amount = 0
var/last_tick_amount = 0
var/fail_to_receive = 0
var/current_warning = 1
/obj/item/geiger_counter/Initialize(mapload)
. = ..()
START_PROCESSING(SSobj, src)
soundloop = new(src, FALSE)
/obj/item/geiger_counter/Destroy()
STOP_PROCESSING(SSobj, src)
QDEL_NULL(soundloop)
return ..()
/obj/item/geiger_counter/process(delta_time)
if(scanning)
radiation_count = LPFILTER(radiation_count, current_tick_amount, delta_time, RAD_GEIGER_RC)
if(current_tick_amount)
grace = RAD_GEIGER_GRACE_PERIOD
last_tick_amount = current_tick_amount
else if(!(obj_flags & EMAGGED))
grace -= delta_time
if(grace <= 0)
radiation_count = 0
current_tick_amount = 0
update_appearance()
update_sound()
RegisterSignal(src, COMSIG_IN_RANGE_OF_IRRADIATION, .proc/on_pre_potential_irradiation)
/obj/item/geiger_counter/examine(mob/user)
. = ..()
if(!scanning)
return
. += span_info("Alt-click it to clear stored radiation levels.")
if(obj_flags & EMAGGED)
. += span_warning("The display seems to be incomprehensible.")
return
switch(radiation_count)
if(-INFINITY to RAD_LEVEL_NORMAL)
switch(last_perceived_radiation_danger)
if(null)
. += span_notice("Ambient radiation level count reports that all is well.")
if(RAD_LEVEL_NORMAL + 1 to RAD_LEVEL_MODERATE)
if(PERCEIVED_RADIATION_DANGER_LOW)
. += span_alert("Ambient radiation levels slightly above average.")
if(RAD_LEVEL_MODERATE + 1 to RAD_LEVEL_HIGH)
if(PERCEIVED_RADIATION_DANGER_MEDIUM)
. += span_warning("Ambient radiation levels above average.")
if(RAD_LEVEL_HIGH + 1 to RAD_LEVEL_VERY_HIGH)
if(PERCEIVED_RADIATION_DANGER_HIGH)
. += span_danger("Ambient radiation levels highly above average.")
if(RAD_LEVEL_VERY_HIGH + 1 to RAD_LEVEL_CRITICAL)
. += span_suicide("Ambient radiation levels nearing critical level.")
if(RAD_LEVEL_CRITICAL + 1 to INFINITY)
. += span_boldannounce("Ambient radiation levels above critical level!")
. += span_notice("The last radiation amount detected was [last_tick_amount]")
if(PERCEIVED_RADIATION_DANGER_EXTREME)
. += span_suicide("Ambient radiation levels reaching critical level!")
/obj/item/geiger_counter/update_icon_state()
if(!scanning)
icon_state = "geiger_off"
return ..()
if(obj_flags & EMAGGED)
icon_state = "geiger_on_emag"
return ..()
switch(radiation_count)
if(-INFINITY to RAD_LEVEL_NORMAL)
switch(last_perceived_radiation_danger)
if(null)
icon_state = "geiger_on_1"
if(RAD_LEVEL_NORMAL + 1 to RAD_LEVEL_MODERATE)
if(PERCEIVED_RADIATION_DANGER_LOW)
icon_state = "geiger_on_2"
if(RAD_LEVEL_MODERATE + 1 to RAD_LEVEL_HIGH)
if(PERCEIVED_RADIATION_DANGER_MEDIUM)
icon_state = "geiger_on_3"
if(RAD_LEVEL_HIGH + 1 to RAD_LEVEL_VERY_HIGH)
if(PERCEIVED_RADIATION_DANGER_HIGH)
icon_state = "geiger_on_4"
if(RAD_LEVEL_VERY_HIGH + 1 to RAD_LEVEL_CRITICAL)
icon_state = "geiger_on_4"
if(RAD_LEVEL_CRITICAL + 1 to INFINITY)
if(PERCEIVED_RADIATION_DANGER_EXTREME)
icon_state = "geiger_on_5"
return ..()
/obj/item/geiger_counter/proc/update_sound()
var/datum/looping_sound/geiger/loop = soundloop
if(!scanning)
loop.stop()
return
if(!radiation_count)
loop.stop()
return
loop.last_radiation = radiation_count
loop.start()
/obj/item/geiger_counter/rad_act(amount)
. = ..()
if(amount <= RAD_BACKGROUND_RADIATION || !scanning)
return
current_tick_amount += amount
update_appearance()
/obj/item/geiger_counter/attack_self(mob/user)
scanning = !scanning
update_appearance()
if (scanning)
AddComponent(/datum/component/geiger_sound)
else
qdel(GetComponent(/datum/component/geiger_sound))
update_appearance(UPDATE_ICON)
to_chat(user, span_notice("[icon2html(src, user)] You switch [scanning ? "on" : "off"] [src]."))
/obj/item/geiger_counter/afterattack(atom/target, mob/living/user, params)
. = ..()
if(!user.combat_mode)
if(!(obj_flags & EMAGGED))
user.visible_message(span_notice("[user] scans [target] with [src]."), span_notice("You scan [target]'s radiation levels with [src]..."))
addtimer(CALLBACK(src, .proc/scan, target, user), 20, TIMER_UNIQUE) // Let's not have spamming GetAllContents
else
user.visible_message(span_notice("[user] scans [target] with [src]."), span_danger("You project [src]'s stored radiation into [target]!"))
target.rad_act(radiation_count)
radiation_count = 0
return TRUE
/obj/item/geiger_counter/proc/scan(atom/A, mob/user)
var/rad_strength = get_rad_contamination(A)
if (user.combat_mode)
return
if(isliving(A))
var/mob/living/M = A
if(!M.radiation)
to_chat(user, span_notice("[icon2html(src, user)] Radiation levels within normal boundaries."))
else
to_chat(user, span_boldannounce("[icon2html(src, user)] Subject is irradiated. Radiation levels: [M.radiation]."))
if (!CAN_IRRADIATE(target))
return
if(rad_strength)
to_chat(user, span_boldannounce("[icon2html(src, user)] Target contains radioactive contamination. Radioactive strength: [rad_strength]"))
else
to_chat(user, span_notice("[icon2html(src, user)] Target is free of radioactive contamination."))
user.visible_message(span_notice("[user] scans [target] with [src]."), span_notice("You scan [target]'s radiation levels with [src]..."))
addtimer(CALLBACK(src, .proc/scan, target, user), 20, TIMER_UNIQUE) // Let's not have spamming GetAllContents
/obj/item/geiger_counter/attackby(obj/item/I, mob/user, params)
if(I.tool_behaviour == TOOL_SCREWDRIVER && (obj_flags & EMAGGED))
if(scanning)
to_chat(user, span_warning("Turn off [src] before you perform this action!"))
return FALSE
user.visible_message(span_notice("[user] unscrews [src]'s maintenance panel and begins fiddling with its innards..."), span_notice("You begin resetting [src]..."))
if(!I.use_tool(src, user, 40, volume=50))
return FALSE
user.visible_message(span_notice("[user] refastens [src]'s maintenance panel!"), span_notice("You reset [src] to its factory settings!"))
obj_flags &= ~EMAGGED
radiation_count = 0
update_appearance()
return TRUE
else
return ..()
/obj/item/geiger_counter/equipped(mob/user, slot, initial)
. = ..()
RegisterSignal(user, COMSIG_IN_RANGE_OF_IRRADIATION, .proc/on_pre_potential_irradiation)
/obj/item/geiger_counter/dropped(mob/user, silent = FALSE)
. = ..()
UnregisterSignal(user, COMSIG_IN_RANGE_OF_IRRADIATION, .proc/on_pre_potential_irradiation)
/obj/item/geiger_counter/proc/on_pre_potential_irradiation(datum/source, datum/radiation_pulse_information/pulse_information, insulation_to_target)
SIGNAL_HANDLER
last_perceived_radiation_danger = get_perceived_radiation_danger(pulse_information, insulation_to_target)
addtimer(CALLBACK(src, .proc/reset_perceived_danger), TIME_WITHOUT_RADIATION_BEFORE_RESET, TIMER_UNIQUE | TIMER_OVERRIDE)
if (scanning)
update_appearance(UPDATE_ICON)
/obj/item/geiger_counter/proc/reset_perceived_danger()
last_perceived_radiation_danger = null
if (scanning)
update_appearance(UPDATE_ICON)
/obj/item/geiger_counter/proc/scan(atom/target, mob/user)
if (SEND_SIGNAL(target, COMSIG_GEIGER_COUNTER_SCAN, user, src) & COMSIG_GEIGER_COUNTER_SCAN_SUCCESSFUL)
return
to_chat(user, span_notice("[icon2html(src, user)] [isliving(target) ? "Subject" : "Target"] is free of radioactive contamination."))
/obj/item/geiger_counter/AltClick(mob/living/user)
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE))
@@ -177,50 +115,6 @@
if(!scanning)
to_chat(usr, span_warning("[src] must be on to reset its radiation level!"))
return
radiation_count = 0
to_chat(usr, span_notice("You flush [src]'s radiation counts, resetting it to normal."))
update_appearance()
/obj/item/geiger_counter/emag_act(mob/user)
if(obj_flags & EMAGGED)
return
if(scanning)
to_chat(user, span_warning("Turn off [src] before you perform this action!"))
return
to_chat(user, span_warning("You override [src]'s radiation storing protocols. It will now generate small doses of radiation, and stored rads are now projected into creatures you scan."))
obj_flags |= EMAGGED
/obj/item/geiger_counter/cyborg
var/mob/listeningTo
/obj/item/geiger_counter/cyborg/cyborg_unequip(mob/user)
if(!scanning)
return
scanning = FALSE
update_appearance()
/obj/item/geiger_counter/cyborg/equipped(mob/user)
. = ..()
if(listeningTo == user)
return
if(listeningTo)
UnregisterSignal(listeningTo, COMSIG_ATOM_RAD_ACT)
RegisterSignal(user, COMSIG_ATOM_RAD_ACT, .proc/redirect_rad_act)
listeningTo = user
/obj/item/geiger_counter/cyborg/proc/redirect_rad_act(datum/source, amount)
SIGNAL_HANDLER
rad_act(amount)
/obj/item/geiger_counter/cyborg/dropped()
. = ..()
if(listeningTo)
UnregisterSignal(listeningTo, COMSIG_ATOM_RAD_ACT)
#undef RAD_LEVEL_NORMAL
#undef RAD_LEVEL_MODERATE
#undef RAD_LEVEL_HIGH
#undef RAD_LEVEL_VERY_HIGH
#undef RAD_LEVEL_CRITICAL
last_perceived_radiation_danger = null
update_appearance(UPDATE_ICON)
+4 -4
View File
@@ -174,6 +174,8 @@ GENE SCANNER
render_list += "[span_info("Analyzing results for [M]:")]\n<span class='info ml-1'>Overall status: [mob_status]</span>\n"
SEND_SIGNAL(M, COMSIG_LIVING_HEALTHSCAN, render_list, advanced, user, mode)
// Husk detection
if(advanced && HAS_TRAIT_FROM(M, TRAIT_HUSK, BURN))
render_list += "<span class='alert ml-1'>Subject has been husked by severe burns.</span>\n"
@@ -238,10 +240,8 @@ GENE SCANNER
if(advanced)
render_list += "<span class='info ml-1'>Brain Activity Level: [(200 - M.getOrganLoss(ORGAN_SLOT_BRAIN))/2]%.</span>\n"
if (M.radiation)
render_list += "<span class='alert ml-1'>Subject is irradiated.</span>\n"
if(advanced)
render_list += "<span class='info ml-1'>Radiation Level: [M.radiation]%.</span>\n"
if (HAS_TRAIT(M, TRAIT_IRRADIATED))
render_list += "<span class='alert ml-1'>Subject is irradiated. Supply toxin healing.</span>\n"
if(advanced && M.hallucinating())
render_list += "<span class='info ml-1'>Subject is hallucinating.</span>\n"
@@ -97,7 +97,6 @@ effective or pretty fucking useless.
return
if(passed_intensity >= 5)
M.apply_effect(round(passed_intensity/0.075), EFFECT_UNCONSCIOUS) //to save you some math, this is a round(intensity * (4/3)) second long knockout
M.rad_act(passed_intensity*10)
/obj/item/healthanalyzer/rad_laser/proc/get_cooldown()
return round(max(10, (stealth*30 + intensity*5 - wavelength/4)))
-3
View File
@@ -22,7 +22,6 @@
/obj/item/dnainjector/proc/inject(mob/living/carbon/M, mob/user)
if(M.has_dna() && !HAS_TRAIT(M, TRAIT_GENELESS) && !HAS_TRAIT(M, TRAIT_BADDNA))
M.radiation += rand(20/(damage_coeff ** 2),50/(damage_coeff ** 2))
var/log_msg = "[key_name(user)] injected [key_name(M)] with the [name]"
for(var/HM in remove_mutations)
M.dna.remove_mutation(HM)
@@ -461,7 +460,6 @@
return FALSE
if(M.has_dna() && !(HAS_TRAIT(M, TRAIT_BADDNA)))
M.radiation += rand(20/(damage_coeff ** 2),50/(damage_coeff ** 2))
var/log_msg = "[key_name(user)] injected [key_name(M)] with the [name]"
var/endtime = world.time+duration
for(var/mutation in remove_mutations)
@@ -530,7 +528,6 @@
/obj/item/dnainjector/activator/inject(mob/living/carbon/M, mob/user)
if(M.has_dna() && !HAS_TRAIT(M, TRAIT_GENELESS) && !HAS_TRAIT(M, TRAIT_BADDNA))
M.radiation += rand(20/(damage_coeff ** 2),50/(damage_coeff ** 2))
var/log_msg = "[key_name(user)] injected [key_name(M)] with the [name]"
var/pref = ""
var/suff = ""
+1 -1
View File
@@ -24,7 +24,7 @@
attack_verb_simple = list("attack", "slash", "stab", "slice", "tear", "lacerate", "rip", "dice", "cut")
block_chance = 75
max_integrity = 200
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 70)
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 100, ACID = 70)
resistance_flags = FIRE_PROOF
wound_bonus = -10
bare_wound_bonus = 20
+1 -1
View File
@@ -17,7 +17,7 @@
hitsound = 'sound/weapons/bladeslice.ogg'
sharpness = SHARP_EDGED
max_integrity = 200
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 30)
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 100, ACID = 30)
resistance_flags = FIRE_PROOF
wound_bonus = -15
bare_wound_bonus = 20
@@ -51,7 +51,8 @@
icon_state = "bluefrag"
inhand_icon_state = "flashbang"
var/freeze_range = 4
var/rad_damage = 350
var/rad_range = 4
var/rad_threshold = RAD_EXTREME_INSULATION
var/stamina_damage = 30
var/temp_adjust = -230
@@ -59,7 +60,7 @@
. = ..()
update_mob()
playsound(loc, 'sound/effects/empulse.ogg', 50, TRUE)
radiation_pulse(src, rad_damage)
radiation_pulse(src, max_range = rad_range, threshold = rad_threshold, chance = 100)
for (var/turf/open/floor/floor in view(freeze_range, loc))
floor.MakeSlippery(TURF_WET_PERMAFROST, 6 MINUTES)
for(var/mob/living/carbon/victim in floor)
+1 -1
View File
@@ -39,7 +39,7 @@
throw_range = 5
custom_materials = list(/datum/material/iron=500)
breakouttime = 1 MINUTES
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50)
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 50)
custom_price = PAYCHECK_HARD * 0.35
///Sound that plays when starting to put handcuffs on someone
var/cuffsound = 'sound/weapons/handcuffs.ogg'
+2 -2
View File
@@ -5,7 +5,7 @@
desc = "It has the unyielding gaze of a god eternally forgotten."
icon_state = "clockwork_helmet"
inhand_icon_state = "clockwork_helmet_inhand"
armor = list(MELEE = 50, BULLET = 10, LASER = 10, ENERGY = 10, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 80)
armor = list(MELEE = 50, BULLET = 10, LASER = 10, ENERGY = 10, BOMB = 0, BIO = 0, FIRE = 80, ACID = 80)
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
strip_delay = 8 SECONDS
@@ -25,7 +25,7 @@
desc = "Deus Vult."
icon_state = "knight_templar"
inhand_icon_state = "knight_templar"
armor = list(MELEE = 50, BULLET = 10, LASER = 10, ENERGY = 10, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 80)
armor = list(MELEE = 50, BULLET = 10, LASER = 10, ENERGY = 10, BOMB = 0, BIO = 0, FIRE = 80, ACID = 80)
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
strip_delay = 80
+2 -2
View File
@@ -31,7 +31,7 @@
attack_verb_continuous = list("attacks", "stabs", "pokes")
attack_verb_simple = list("attack", "stab", "poke")
hitsound = 'sound/weapons/bladeslice.ogg'
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 30)
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 30)
sharpness = SHARP_POINTY
var/datum/reagent/forkload //used to eat omelette
custom_price = PAYCHECK_PRISONER
@@ -130,7 +130,7 @@
throw_range = 5
attack_verb_simple = list("whack", "spoon", "tap")
attack_verb_continuous = list("whacks", "spoons", "taps")
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 30)
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 30)
custom_materials = list(/datum/material/iron=120)
custom_price = PAYCHECK_PRISONER * 5
tool_behaviour = TOOL_MINING
+3 -3
View File
@@ -1,5 +1,5 @@
// Knife Template, should not appear in game normaly //
/obj/item/knife
/obj/item/knife
name = "knife"
icon = 'icons/obj/kitchen.dmi'
icon_state = "knife"
@@ -19,7 +19,7 @@
attack_verb_continuous = list("slashes", "stabs", "slices", "tears", "lacerates", "rips", "dices", "cuts")
attack_verb_simple = list("slash", "stab", "slice", "tear", "lacerate", "rip", "dice", "cut")
sharpness = SHARP_EDGED
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50)
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 50)
var/bayonet = FALSE //Can this be attached to a gun?
wound_bonus = 5
bare_wound_bonus = 15
@@ -153,7 +153,7 @@
throwforce = 12
attack_verb_continuous = list("shanks", "shivs")
attack_verb_simple = list("shank", "shiv")
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0)
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0)
custom_materials = list(/datum/material/glass=400)
/obj/item/knife/shiv/carrot
+1 -1
View File
@@ -341,7 +341,7 @@
attack_verb_continuous = list("beats")
attack_verb_simple = list("beat")
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 50, BIO = 0, RAD = 0, FIRE = 80, ACID = 80)
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 50, BIO = 0, FIRE = 80, ACID = 80)
throwforce = 7
stamina_damage = 60
+1 -1
View File
@@ -1,7 +1,7 @@
/obj/item/melee/energy
icon = 'icons/obj/transforming_energy.dmi'
max_integrity = 200
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 30)
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 100, ACID = 30)
attack_verb_continuous = list("hits", "taps", "pokes")
attack_verb_simple = list("hit", "tap", "poke")
resistance_flags = FIRE_PROOF
+1 -1
View File
@@ -19,7 +19,7 @@
hitsound = 'sound/weapons/bladeslice.ogg'
sharpness = SHARP_EDGED
max_integrity = 200
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 30)
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 100, ACID = 30)
resistance_flags = FIRE_PROOF
/obj/item/pitchfork/ComponentInitialize()
+1 -1
View File
@@ -14,7 +14,7 @@
inhand_icon_state = "bulldog"
lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi'
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 60, ACID = 50)
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 60, ACID = 50)
var/maxWeightClass = 20 //The max weight of items that can fit into the cannon
var/loadedWeightClass = 0 //The weight of items currently in the cannon
var/obj/item/tank/internals/tank = null //The gas tank that is drawn from to fire things
+1 -1
View File
@@ -12,7 +12,7 @@
throwforce = 10
throw_range = 7
w_class = WEIGHT_CLASS_NORMAL
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 40)
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 100, ACID = 40)
resistance_flags = FIRE_PROOF
var/click_delay = 1.5
var/fisto_setting = 1
+1 -1
View File
@@ -39,7 +39,7 @@
explosion_block = 3
heat_proof = TRUE
max_integrity = 600
armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 100, BIO = 100, RAD = 100, FIRE = 100, ACID = 100)
armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 100, BIO = 100, FIRE = 100, ACID = 100)
resistance_flags = INDESTRUCTIBLE | FIRE_PROOF | ACID_PROOF | LAVA_PROOF
damage_deflection = 70
/// Make sure that the key has the same puzzle_id as the keycard door!
+5 -5
View File
@@ -201,7 +201,7 @@
inspiration_available = FALSE
/obj/item/banner/engineering/special_inspiration(mob/living/carbon/human/H)
H.radiation = 0
qdel(H.GetComponent(/datum/component/irradiated))
/datum/crafting_recipe/engineering_banner
name = "Engitopia Banner"
@@ -275,7 +275,7 @@
w_class = WEIGHT_CLASS_BULKY
slowdown = 2.0 //gotta pretend we're balanced.
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
armor = list(MELEE = 50, BULLET = 50, LASER = 50, ENERGY = 50, BOMB = 60, BIO = 0, RAD = 0, FIRE = 60, ACID = 60)
armor = list(MELEE = 50, BULLET = 50, LASER = 50, ENERGY = 50, BOMB = 60, BIO = 0, FIRE = 60, ACID = 60)
/obj/item/clothing/suit/armor/plate/crusader/red
icon_state = "crusader-red"
@@ -289,7 +289,7 @@
icon_state = "crusader"
w_class = WEIGHT_CLASS_NORMAL
flags_inv = HIDEHAIR|HIDEEARS|HIDEFACE
armor = list(MELEE = 50, BULLET = 50, LASER = 50, ENERGY = 50, BOMB = 60, BIO = 0, RAD = 0, FIRE = 60, ACID = 60)
armor = list(MELEE = 50, BULLET = 50, LASER = 50, ENERGY = 50, BOMB = 60, BIO = 0, FIRE = 60, ACID = 60)
/obj/item/clothing/head/helmet/plate/crusader/blue
icon_state = "crusader-blue"
@@ -303,7 +303,7 @@
desc = "A religious-looking hat."
icon_state = null
flags_1 = 0
armor = list(MELEE = 60, BULLET = 60, LASER = 60, ENERGY = 60, BOMB = 70, BIO = 50, RAD = 50, FIRE = 60, ACID = 60) //religion protects you from disease and radiation, honk.
armor = list(MELEE = 60, BULLET = 60, LASER = 60, ENERGY = 60, BOMB = 70, BIO = 50, FIRE = 60, ACID = 60) //religion protects you from disease, honk.
worn_y_offset = 6
/obj/item/clothing/head/helmet/plate/crusader/prophet/red
@@ -362,7 +362,7 @@
desc = "Metal boots, they look heavy."
icon_state = "crusader"
w_class = WEIGHT_CLASS_NORMAL
armor = list(MELEE = 50, BULLET = 50, LASER = 50, ENERGY = 50, BOMB = 60, BIO = 0, RAD = 0, FIRE = 60, ACID = 60) //does this even do anything on boots?
armor = list(MELEE = 50, BULLET = 50, LASER = 50, ENERGY = 50, BOMB = 60, BIO = 0, FIRE = 60, ACID = 60) //does this even do anything on boots?
clothing_flags = NOSLIP
cold_protection = FEET
min_cold_protection_temperature = SHOES_MIN_TEMP_PROTECT
+2 -2
View File
@@ -2,7 +2,7 @@
name = "shield"
icon = 'icons/obj/shields.dmi'
block_chance = 50
armor = list(MELEE = 50, BULLET = 50, LASER = 50, ENERGY = 0, BOMB = 30, BIO = 0, RAD = 0, FIRE = 80, ACID = 70)
armor = list(MELEE = 50, BULLET = 50, LASER = 50, ENERGY = 0, BOMB = 30, BIO = 0, FIRE = 80, ACID = 70)
var/transparent = FALSE // makes beam projectiles pass through the shield
/obj/item/shield/proc/on_shield_block(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", damage = 0, attack_type = MELEE_ATTACK)
@@ -94,7 +94,7 @@
/obj/item/shield/riot/roman/fake
desc = "Bears an inscription on the inside: <i>\"Romanes venio domus\"</i>. It appears to be a bit flimsy."
block_chance = 0
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0)
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0)
max_integrity = 30
/obj/item/shield/riot/roman/shatter(mob/living/carbon/human/owner)
+1 -1
View File
@@ -12,7 +12,7 @@
throwforce = 15
throw_range = 1
w_class = WEIGHT_CLASS_HUGE
armor = list(MELEE = 50, BULLET = 50, LASER = 50, ENERGY = 0, BOMB = 50, BIO = 0, RAD = 0, FIRE = 100, ACID = 100)
armor = list(MELEE = 50, BULLET = 50, LASER = 50, ENERGY = 0, BOMB = 50, BIO = 0, FIRE = 100, ACID = 100)
resistance_flags = FIRE_PROOF | ACID_PROOF
force_string = "LORD SINGULOTH HIMSELF"
///Is it able to pull shit right now?
+1 -1
View File
@@ -18,7 +18,7 @@
attack_verb_simple = list("attack", "poke", "jab", "tear", "lacerate", "gore")
sharpness = SHARP_EDGED // i know the whole point of spears is that they're pointy, but edged is more devastating at the moment so
max_integrity = 200
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 30)
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 30)
var/war_cry = "AAAAARGH!!!"
var/icon_prefix = "spearglass"
wound_bonus = -15
@@ -21,7 +21,7 @@ GLOBAL_LIST_INIT(glass_recipes, list ( \
icon_state = "sheet-glass"
inhand_icon_state = "sheet-glass"
mats_per_unit = list(/datum/material/glass=MINERAL_MATERIAL_AMOUNT)
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 100)
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 100)
resistance_flags = ACID_PROOF
merge_type = /obj/item/stack/sheet/glass
grind_results = list(/datum/reagent/silicon = 20)
@@ -87,7 +87,7 @@ GLOBAL_LIST_INIT(pglass_recipes, list ( \
inhand_icon_state = "sheet-pglass"
mats_per_unit = list(/datum/material/alloy/plasmaglass=MINERAL_MATERIAL_AMOUNT)
material_type = /datum/material/alloy/plasmaglass
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 75, ACID = 100)
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 75, ACID = 100)
resistance_flags = ACID_PROOF
merge_type = /obj/item/stack/sheet/plasmaglass
grind_results = list(/datum/reagent/silicon = 20, /datum/reagent/toxin/plasma = 10)
@@ -140,7 +140,7 @@ GLOBAL_LIST_INIT(reinforced_glass_recipes, list ( \
icon_state = "sheet-rglass"
inhand_icon_state = "sheet-rglass"
mats_per_unit = list(/datum/material/iron=MINERAL_MATERIAL_AMOUNT * 0.5, /datum/material/glass=MINERAL_MATERIAL_AMOUNT)
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 70, ACID = 100)
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 70, ACID = 100)
resistance_flags = ACID_PROOF
merge_type = /obj/item/stack/sheet/rglass
grind_results = list(/datum/reagent/silicon = 20, /datum/reagent/iron = 10)
@@ -192,7 +192,7 @@ GLOBAL_LIST_INIT(prglass_recipes, list ( \
icon_state = "sheet-prglass"
inhand_icon_state = "sheet-prglass"
mats_per_unit = list(/datum/material/alloy/plasmaglass=MINERAL_MATERIAL_AMOUNT, /datum/material/iron = MINERAL_MATERIAL_AMOUNT * 0.5)
armor = list(MELEE = 20, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 100)
armor = list(MELEE = 20, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 80, ACID = 100)
resistance_flags = ACID_PROOF
material_flags = NONE
merge_type = /obj/item/stack/sheet/plasmarglass
@@ -218,7 +218,7 @@ GLOBAL_LIST_INIT(titaniumglass_recipes, list(
inhand_icon_state = "sheet-titaniumglass"
mats_per_unit = list(/datum/material/alloy/titaniumglass=MINERAL_MATERIAL_AMOUNT)
material_type = /datum/material/alloy/titaniumglass
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 100)
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 80, ACID = 100)
resistance_flags = ACID_PROOF
merge_type = /obj/item/stack/sheet/titaniumglass
tableVariant = /obj/structure/table/reinforced/titaniumglass
@@ -240,7 +240,7 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list(
inhand_icon_state = "sheet-plastitaniumglass"
mats_per_unit = list(/datum/material/alloy/plastitaniumglass=MINERAL_MATERIAL_AMOUNT)
material_type = /datum/material/alloy/plastitaniumglass
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 100)
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 80, ACID = 100)
material_flags = NONE
resistance_flags = ACID_PROOF
merge_type = /obj/item/stack/sheet/plastitaniumglass
@@ -266,7 +266,7 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list(
attack_verb_simple = list("stab", "slash", "slice", "cut")
hitsound = 'sound/weapons/bladeslice.ogg'
resistance_flags = ACID_PROOF
armor = list(MELEE = 100, BULLET = 0, LASER = 0, ENERGY = 100, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 100)
armor = list(MELEE = 100, BULLET = 0, LASER = 0, ENERGY = 100, BOMB = 0, BIO = 0, FIRE = 50, ACID = 100)
max_integrity = 40
sharpness = SHARP_EDGED
var/icon_prefix
@@ -220,7 +220,7 @@ GLOBAL_LIST_INIT(plasteel_recipes, list ( \
material_type = /datum/material/alloy/plasteel
throwforce = 10
flags_1 = CONDUCT_1
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 80)
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 100, ACID = 80)
resistance_flags = FIRE_PROOF
merge_type = /obj/item/stack/sheet/plasteel
grind_results = list(/datum/reagent/iron = 20, /datum/reagent/toxin/plasma = 20)
@@ -291,7 +291,7 @@ GLOBAL_LIST_INIT(wood_recipes, list ( \
icon = 'icons/obj/stack_objects.dmi'
mats_per_unit = list(/datum/material/wood=MINERAL_MATERIAL_AMOUNT)
sheettype = "wood"
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 0)
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 0)
resistance_flags = FLAMMABLE
merge_type = /obj/item/stack/sheet/mineral/wood
novariants = TRUE
@@ -324,7 +324,7 @@ GLOBAL_LIST_INIT(bamboo_recipes, list ( \
icon = 'icons/obj/stack_objects.dmi'
mats_per_unit = list(/datum/material/bamboo = MINERAL_MATERIAL_AMOUNT)
throwforce = 15
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 0)
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 0)
resistance_flags = FLAMMABLE
merge_type = /obj/item/stack/sheet/mineral/bamboo
grind_results = list(/datum/reagent/cellulose = 10)
@@ -9,7 +9,7 @@
throwforce = 10
flags_1 = CONDUCT_1
turf_type = /turf/open/floor/iron
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 70)
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 100, ACID = 70)
resistance_flags = FIRE_PROOF
matter_amount = 1
cost = 125
+1 -1
View File
@@ -56,7 +56,7 @@
inhand_icon_state = "holdingpack"
resistance_flags = FIRE_PROOF
item_flags = NO_MAT_REDEMPTION
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 60, ACID = 50)
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 60, ACID = 50)
component_type = /datum/component/storage/concrete/bluespace/bag_of_holding
/obj/item/storage/backpack/holding/ComponentInitialize()
-1
View File
@@ -121,7 +121,6 @@
/obj/item/storage/bag/ore/ComponentInitialize()
. = ..()
AddElement(/datum/element/rad_insulation, 0.01) //please datum mats no more cancer
var/datum/component/storage/concrete/stack/STR = GetComponent(/datum/component/storage/concrete/stack)
STR.allow_quick_empty = TRUE
STR.set_holdable(list(/obj/item/stack/ore))
+1 -1
View File
@@ -221,7 +221,7 @@
It is made out of the same material as the station's Black Box and is designed to resist all conventional weaponry. \
There appears to be a small amount of surface corrosion. It doesn't look like it could withstand much of an explosion."
can_hack_open = FALSE
armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 70, BIO = 100, RAD = 100, FIRE = 80, ACID = 70)
armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 70, BIO = 100, FIRE = 80, ACID = 70)
max_integrity = 300
color = "#ffdd33"
+1 -26
View File
@@ -24,7 +24,7 @@
throw_range = 4
custom_materials = list(/datum/material/iron = 500)
actions_types = list(/datum/action/item_action/set_internals)
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 0, RAD = 0, FIRE = 80, ACID = 30)
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 0, FIRE = 80, ACID = 30)
integrity_failure = 0.5
/// The gases this tank contains. Don't modify this directly, use return_air() to get it instead
var/datum/gas_mixture/air_contents = null
@@ -323,29 +323,4 @@
dyn_explosion(src, power, flash_range = 1.5, ignorecap = FALSE)
return ..()
/obj/item/tank/rad_act(strength)
. = ..()
var/gas_change = FALSE
var/list/cached_gases = air_contents.gases
if(cached_gases[/datum/gas/oxygen] && cached_gases[/datum/gas/carbon_dioxide] && air_contents.temperature <= PLUOXIUM_TEMP_CAP)
gas_change = TRUE
var/pulse_strength = min(strength, cached_gases[/datum/gas/oxygen][MOLES] * 1000, cached_gases[/datum/gas/carbon_dioxide][MOLES] * 2000)
cached_gases[/datum/gas/carbon_dioxide][MOLES] -= pulse_strength / 2000
cached_gases[/datum/gas/oxygen][MOLES] -= pulse_strength / 1000
ASSERT_GAS(/datum/gas/pluoxium, air_contents)
cached_gases[/datum/gas/pluoxium][MOLES] += pulse_strength / 4000
strength -= pulse_strength
if(cached_gases[/datum/gas/hydrogen])
gas_change = TRUE
var/pulse_strength = min(strength, cached_gases[/datum/gas/hydrogen][MOLES] * 1000)
cached_gases[/datum/gas/hydrogen][MOLES] -= pulse_strength / 1000
ASSERT_GAS(/datum/gas/tritium, air_contents)
cached_gases[/datum/gas/tritium][MOLES] += pulse_strength / 1000
strength -= pulse_strength
if(gas_change)
air_contents.garbage_collect()
START_PROCESSING(SSobj, src)
#undef ASSUME_AIR_DT_FACTOR
+1 -1
View File
@@ -12,7 +12,7 @@
slowdown = 1
actions_types = list(/datum/action/item_action/toggle_mister)
max_integrity = 200
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 30)
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 100, ACID = 30)
resistance_flags = FIRE_PROOF
var/obj/item/noz
+1 -1
View File
@@ -111,7 +111,7 @@
throw_speed = 3
throw_range = 5
custom_materials = list(/datum/material/iron=10000)
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 30, BIO = 0, RAD = 0, FIRE = 100, ACID = 100)
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 30, BIO = 0, FIRE = 100, ACID = 100)
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
var/list/active_portal_pairs
var/max_portal_pairs = 3
+5 -5
View File
@@ -33,7 +33,7 @@
if(cooldown < world.time - 60)
cooldown = world.time
flick(pulseicon, src)
radiation_pulse(src, 400, 2)
radiation_pulse(src, max_range = 2, threshold = RAD_EXTREME_INSULATION)
/obj/item/nuke_core/suicide_act(mob/user)
user.visible_message(span_suicide("[user] is rubbing [src] against [user.p_them()]self! It looks like [user.p_theyre()] trying to commit suicide!"))
@@ -183,7 +183,7 @@
return
else
to_chat(user, span_notice("As it touches \the [src], both \the [src] and \the [W] burst into dust!"))
radiation_pulse(user, 100)
radiation_pulse(user, max_range = 2, threshold = RAD_EXTREME_INSULATION, chance = 40)
playsound(src, 'sound/effects/supermatter.ogg', 50, TRUE)
qdel(W)
qdel(src)
@@ -206,7 +206,7 @@
span_userdanger("You're hit by [src] and everything suddenly goes silent.\n[src] flashes into dust, and soon as you can register this, you do as well."),\
span_hear("Everything suddenly goes silent."))
victim.dust()
radiation_pulse(src, 500, 2)
radiation_pulse(src, max_range = 2, threshold = RAD_EXTREME_INSULATION, chance = 40)
playsound(src, 'sound/effects/supermatter.ogg', 50, TRUE)
qdel(src)
@@ -217,7 +217,7 @@
user.visible_message(span_danger("[user] reaches out and tries to pick up [src]. [user.p_their()] body starts to glow and bursts into flames before flashing into dust!"),\
span_userdanger("You reach for [src] with your hands. That was dumb."),\
span_hear("Everything suddenly goes silent."))
radiation_pulse(user, 500, 2)
radiation_pulse(user, max_range = 2, threshold = RAD_EXTREME_INSULATION, chance = 40)
playsound(src, 'sound/effects/supermatter.ogg', 50, TRUE)
user.dust()
@@ -328,7 +328,7 @@
span_userdanger("You touch [AM] with [src], and everything suddenly goes silent.\n[AM] and [sliver] flash into dust, and soon as you can register this, you do as well."),\
span_hear("Everything suddenly goes silent."))
user.dust()
radiation_pulse(src, 500, 2)
radiation_pulse(src, max_range = 2, threshold = RAD_EXTREME_INSULATION, chance = 40)
playsound(src, 'sound/effects/supermatter.ogg', 50, TRUE)
QDEL_NULL(sliver)
update_appearance()
+1 -1
View File
@@ -19,7 +19,7 @@
attack_verb_simple = list("attack", "bash", "batter", "bludgeon", "whack")
tool_behaviour = TOOL_CROWBAR
toolspeed = 1
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 30)
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 30)
var/force_opens = FALSE
/obj/item/crowbar/suicide_act(mob/user)
+1 -1
View File
@@ -22,7 +22,7 @@
usesound = list('sound/items/screwdriver.ogg', 'sound/items/screwdriver2.ogg')
tool_behaviour = TOOL_SCREWDRIVER
toolspeed = 1
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 30)
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 30)
drop_sound = 'sound/items/handling/screwdriver_drop.ogg'
pickup_sound = 'sound/items/handling/screwdriver_pickup.ogg'
sharpness = SHARP_POINTY
+1 -1
View File
@@ -25,7 +25,7 @@
throw_speed = 3
throw_range = 5
w_class = WEIGHT_CLASS_SMALL
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 30)
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 100, ACID = 30)
resistance_flags = FIRE_PROOF
heat = 3800
tool_behaviour = TOOL_WELDER
@@ -9,55 +9,3 @@
icon_state = "wirebrush"
tool_behaviour = TOOL_RUSTSCRAPER
toolspeed = 1
/**
* An advanced form of the wirebrush that trades the safety of the user for instant rust removal.
* If the person using this is unlucky they are going to die painfully.
*/
/obj/item/wirebrush/advanced
name = "advanced wirebrush"
desc = "An advanced wirebrush; uses radiation to almost instantly liquify rust."
icon_state = "wirebrush_adv"
toolspeed = 0.1
/// The amount of radiation to give to the user of this tool; regardless of what they did with it.
var/radiation_on_use = 20
/// How likely is a critical fail?
var/crit_fail_prob = 1
/// The amount of radiation to give to the user if they roll the worst effects. Negative numbers will heal radiation instead!
var/crit_fail_rads = 50
/// The amount of damage to take in BOTH Tox and Oxy on critical fail
var/crit_fail_damage = 15
/// We only apply damage and force vomit if the user has OVER this many rads
var/crit_fail_rads_threshold = 300
/obj/item/wirebrush/advanced/examine(mob/user)
. = ..()
. += span_danger("There is a warning label that indicates extended use of [src] may result in loss of hair, yellowing skin, and death.")
/obj/item/wirebrush/advanced/pre_attack(atom/A, mob/living/user)
. = ..()
if(!istype(user))
return
if(prob(crit_fail_prob))
to_chat(user, span_danger("You feel a sharp pain as your entire body grows oddly warm."))
user.radiation += crit_fail_rads
if(user.radiation > crit_fail_rads_threshold) // If you ignore the warning signs you get punished
user.emote("vomit")
user.adjustToxLoss(crit_fail_damage, forced=TRUE)
user.adjustOxyLoss(crit_fail_damage, forced=TRUE)
return
user.radiation += radiation_on_use
if(prob(25))
user.emote("cough")
/obj/item/wirebrush/advanced/pre_attack_secondary()
return SECONDARY_ATTACK_CALL_NORMAL
+1 -1
View File
@@ -25,7 +25,7 @@
pickup_sound = 'sound/items/handling/wirecutter_pickup.ogg'
tool_behaviour = TOOL_WIRECUTTER
toolspeed = 1
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 30)
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 30)
/// If the item should be assigned a random color
var/random_color = TRUE
/// List of possible random colors
+1 -1
View File
@@ -20,7 +20,7 @@
attack_verb_simple = list("bash", "batter", "bludgeon", "whack")
tool_behaviour = TOOL_WRENCH
toolspeed = 1
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 30)
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 30)
/obj/item/wrench/suicide_act(mob/user)
user.visible_message(span_suicide("[user] is beating [user.p_them()]self to death with [src]! It looks like [user.p_theyre()] trying to commit suicide!"))
+1 -1
View File
@@ -17,7 +17,7 @@
throw_speed = 1
throw_range = 7
w_class = WEIGHT_CLASS_BULKY
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 70, ACID = 30)
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 70, ACID = 30)
// Built automatically from the corresponding vending machine.
// If null, considered to be full. Otherwise, is list(/typepath = amount).
+1 -1
View File
@@ -9,7 +9,7 @@
desc = "A machine given the thankless job of trying to sell wayfinding pinpointers. They point to common locations."
density = FALSE
layer = HIGH_OBJ_LAYER
armor = list(MELEE = 80, BULLET = 30, LASER = 30, ENERGY = 60, BOMB = 90, BIO = 0, RAD = 0, FIRE = 100, ACID = 80)
armor = list(MELEE = 80, BULLET = 30, LASER = 30, ENERGY = 60, BOMB = 90, BIO = 0, FIRE = 100, ACID = 80)
payment_department = ACCOUNT_CIV
light_power = 0.5
light_range = MINIMUM_USEFUL_LIGHT_RANGE
+3 -3
View File
@@ -12,7 +12,7 @@
attack_verb_continuous = list("bans")
attack_verb_simple = list("ban")
max_integrity = 200
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 70)
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 100, ACID = 70)
resistance_flags = FIRE_PROOF
/obj/item/banhammer/Initialize(mapload)
@@ -74,7 +74,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
block_chance = 50
sharpness = SHARP_EDGED
max_integrity = 200
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 50)
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 100, ACID = 50)
resistance_flags = FIRE_PROOF
/obj/item/claymore/Initialize(mapload)
@@ -263,7 +263,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
block_chance = 50
sharpness = SHARP_EDGED
max_integrity = 200
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 50)
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 100, ACID = 50)
resistance_flags = FIRE_PROOF
/obj/item/katana/suicide_act(mob/user)