mirror of
https://github.com/PolarisSS13/Polaris.git
synced 2025-12-25 01:22:24 +00:00
Merge branch 'master' of https://github.com/PolarisSS13/Polaris into parachute
# Conflicts: # icons/obj/storage.dmi
This commit is contained in:
@@ -154,6 +154,7 @@
|
||||
#define MAT_TITANIUM "titanium"
|
||||
#define MAT_PHORON "phoron"
|
||||
#define MAT_DIAMOND "diamond"
|
||||
#define MAT_SNOW "snow"
|
||||
|
||||
#define SHARD_SHARD "shard"
|
||||
#define SHARD_SHRAPNEL "shrapnel"
|
||||
|
||||
@@ -121,7 +121,7 @@
|
||||
// A is a turf or is on a turf, or in something on a turf (pen in a box); but not something in something on a turf (pen in a box in a backpack)
|
||||
sdepth = A.storage_depth_turf()
|
||||
if(isturf(A) || isturf(A.loc) || (sdepth != -1 && sdepth <= 1))
|
||||
if(A.Adjacent(src)) // see adjacent.dm
|
||||
if(A.Adjacent(src) || (W && W.attack_can_reach(src, A, W.reach)) ) // see adjacent.dm
|
||||
if(W)
|
||||
// Return 1 in attackby() to prevent afterattack() effects (when safely moving items for example)
|
||||
var/resolved = W.resolve_attackby(A,src)
|
||||
|
||||
@@ -133,6 +133,16 @@
|
||||
add_inherent_law("Prevent unplanned damage to your assigned vessel wherever possible.")
|
||||
..()
|
||||
|
||||
/datum/ai_laws/mining_drone
|
||||
name = "Excavation Protocols"
|
||||
law_header = "Excavation Protocols"
|
||||
|
||||
/datum/ai_laws/mining_drone/New()
|
||||
add_inherent_law("Do not interfere with the excavation work of non-drones whenever possible.")
|
||||
add_inherent_law("Provide materials for repairing, refitting, and upgrading your assigned vessel.")
|
||||
add_inherent_law("Prevent unplanned damage to your assigned excavation equipment wherever possible.")
|
||||
..()
|
||||
|
||||
/******************** T.Y.R.A.N.T. ********************/
|
||||
/datum/ai_laws/tyrant
|
||||
name = "T.Y.R.A.N.T."
|
||||
|
||||
@@ -168,7 +168,8 @@ turf/proc/AdjacentTurfsRangedSting()
|
||||
/obj/structure/target_stake,
|
||||
/obj/structure/cable,
|
||||
/obj/structure/disposalpipe,
|
||||
/obj/machinery/
|
||||
/obj/machinery,
|
||||
/mob
|
||||
)
|
||||
|
||||
var/L[] = new()
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/datum/power/changeling/resonant_shriek
|
||||
name = "Resonant Shriek"
|
||||
desc = "Our lungs and vocal chords shift, allowing us to briefly emit a noise that deafens and confuses the weak-minded biologicals and synthetics."
|
||||
desc = "Our lungs and vocal cords shift, allowing us to briefly emit a noise that deafens and confuses the weak-minded."
|
||||
helptext = "Lights are blown, organics are disoriented, and synthetics act as if they were flashed."
|
||||
enhancedtext = "Range is doubled."
|
||||
ability_icon_state = "ling_resonant_shriek"
|
||||
@@ -20,19 +20,19 @@
|
||||
/mob/proc/changeling_resonant_shriek()
|
||||
set category = "Changeling"
|
||||
set name = "Resonant Shriek (20)"
|
||||
set desc = "Emits a high-frequency sound that confuses and deafens humans, blows out nearby lights and overloads cyborg sensors."
|
||||
set desc = "Emits a high-frequency sound that confuses and deafens organics, blows out nearby lights, and overloads synthetics' sensors."
|
||||
|
||||
var/datum/changeling/changeling = changeling_power(20,0,100,CONSCIOUS)
|
||||
if(!changeling) return 0
|
||||
|
||||
if(is_muzzled())
|
||||
src << "<span class='danger'>Mmmf mrrfff!</span>"
|
||||
to_chat(src, "<span class='danger'>Mmmf mrrfff!</span>")
|
||||
return 0
|
||||
|
||||
if(ishuman(src))
|
||||
var/mob/living/carbon/human/H = src
|
||||
if(H.silent)
|
||||
src << "<span class='danger'>You can't speak!</span>"
|
||||
to_chat(src, "<span class='danger'>You can't speak!</span>")
|
||||
return 0
|
||||
|
||||
if(world.time < (changeling.last_shriek + 10 SECONDS) )
|
||||
@@ -49,7 +49,7 @@
|
||||
var/range = 4
|
||||
if(src.mind.changeling.recursive_enhancement)
|
||||
range = range * 2
|
||||
src << "<span class='notice'>We are extra loud.</span>"
|
||||
to_chat(src, "<span class='notice'>We are extra loud.</span>")
|
||||
|
||||
src.attack_log += text("\[[time_stamp()]\] <font color='red'>Used Resonant Shriek.</font>")
|
||||
message_admins("[key_name(src)] used Resonant Shriek ([src.x],[src.y],[src.z]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[src.x];Y=[src.y];Z=[src.z]'>JMP</a>).")
|
||||
@@ -144,4 +144,4 @@
|
||||
|
||||
changeling.last_shriek = world.time
|
||||
|
||||
return 1
|
||||
return 1
|
||||
|
||||
@@ -994,6 +994,7 @@
|
||||
/obj/item/weapon/glass_extra/stick = 15,
|
||||
/obj/item/weapon/glass_extra/straw = 15,
|
||||
/obj/item/clothing/suit/chef/classic = 2,
|
||||
/obj/item/weapon/storage/bag/food = 2,
|
||||
/obj/item/weapon/storage/toolbox/lunchbox = 3,
|
||||
/obj/item/weapon/storage/toolbox/lunchbox/heart = 3,
|
||||
/obj/item/weapon/storage/toolbox/lunchbox/cat = 3,
|
||||
|
||||
@@ -81,6 +81,7 @@
|
||||
|
||||
var/toolspeed = 1.0 // This is a multipler on how 'fast' a tool works. e.g. setting this to 0.5 will make the tool work twice as fast.
|
||||
var/attackspeed = DEFAULT_ATTACK_COOLDOWN // How long click delay will be when using this, in 1/10ths of a second. Checked in the user's get_attack_speed().
|
||||
var/reach = 1 // Length of tiles it can reach, 1 is adjacent.
|
||||
var/addblends // Icon overlay for ADD highlights when applicable.
|
||||
|
||||
/obj/item/New()
|
||||
@@ -641,3 +642,11 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out.
|
||||
/obj/item/proc/pwr_drain()
|
||||
return 0 // Process Kill
|
||||
|
||||
// Used for non-adjacent melee attacks with specific weapons capable of reaching more than one tile.
|
||||
// This uses changeling range string A* but for this purpose its also applicable.
|
||||
/obj/item/proc/attack_can_reach(var/atom/us, var/atom/them, var/range)
|
||||
if(us.Adjacent(them))
|
||||
return TRUE // Already adjacent.
|
||||
if(AStar(get_turf(us), get_turf(them), /turf/proc/AdjacentTurfsRangedSting, /turf/proc/Distance, max_nodes=25, max_node_depth=range))
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
|
||||
/obj/item/device/flash/proc/clown_check(var/mob/user)
|
||||
if(user && (CLUMSY in user.mutations) && prob(50))
|
||||
user << "<span class='warning'>\The [src] slips out of your hand.</span>"
|
||||
to_chat(user, "<span class='warning'>\The [src] slips out of your hand.</span>")
|
||||
user.drop_item()
|
||||
return 0
|
||||
return 1
|
||||
@@ -43,7 +43,7 @@
|
||||
if(prob( round(times_used / 2) )) //if you use it 10 times in a minute it has a 5% chance to break.
|
||||
broken = 1
|
||||
if(user)
|
||||
user << "<span class='warning'>The bulb has burnt out!</span>"
|
||||
to_chat(user, "<span class='warning'>The bulb has burnt out!</span>")
|
||||
icon_state = "flashburnt"
|
||||
return FALSE
|
||||
else
|
||||
@@ -51,7 +51,8 @@
|
||||
return TRUE
|
||||
else //can only use it 10 times a minute
|
||||
if(user)
|
||||
user << "<span class='warning'>*click* *click*</span>"
|
||||
to_chat(user, "<span class='warning'><i>click</i></span>")
|
||||
playsound(src.loc, 'sound/weapons/empty.ogg', 80, 1)
|
||||
return FALSE
|
||||
|
||||
//attack_as_weapon
|
||||
@@ -67,7 +68,7 @@
|
||||
|
||||
if(!clown_check(user)) return
|
||||
if(broken)
|
||||
user << "<span class='warning'>\The [src] is broken.</span>"
|
||||
to_chat(user, "<span class='warning'>\The [src] is broken.</span>")
|
||||
return
|
||||
|
||||
flash_recharge()
|
||||
@@ -204,12 +205,12 @@
|
||||
..()
|
||||
if(!broken)
|
||||
broken = 1
|
||||
user << "<span class='warning'>The bulb has burnt out!</span>"
|
||||
to_chat(user, "<span class='warning'>The bulb has burnt out!</span>")
|
||||
icon_state = "flashburnt"
|
||||
|
||||
/obj/item/device/flash/synthetic/attack_self(mob/living/carbon/user as mob, flag = 0, emp = 0)
|
||||
..()
|
||||
if(!broken)
|
||||
broken = 1
|
||||
user << "<span class='warning'>The bulb has burnt out!</span>"
|
||||
to_chat(user, "<span class='warning'>The bulb has burnt out!</span>")
|
||||
icon_state = "flashburnt"
|
||||
|
||||
@@ -23,6 +23,13 @@ REAGENT SCANNER
|
||||
matter = list(DEFAULT_WALL_MATERIAL = 200)
|
||||
origin_tech = list(TECH_MAGNET = 1, TECH_BIO = 1)
|
||||
var/mode = 1;
|
||||
var/advscan = 0
|
||||
var/showadvscan = 1
|
||||
|
||||
/obj/item/device/healthanalyzer/New()
|
||||
if(advscan >= 1)
|
||||
verbs += /obj/item/device/healthanalyzer/proc/toggle_adv
|
||||
..()
|
||||
|
||||
/obj/item/device/healthanalyzer/do_surgery(mob/living/M, mob/living/user)
|
||||
if(user.a_intent != I_HELP) //in case it is ever used as a surgery tool
|
||||
@@ -39,7 +46,7 @@ REAGENT SCANNER
|
||||
for(var/mob/O in viewers(M, null))
|
||||
O.show_message("<span class='warning'>\The [user] has analyzed the floor's vitals!</span>", 1)
|
||||
user.show_message("<span class='notice'>Analyzing Results for The floor:</span>", 1)
|
||||
user.show_message("Overall Status: Healthy</span>", 1)
|
||||
user.show_message("<span class='notice'>Overall Status: Healthy</span>", 1)
|
||||
user.show_message("<span class='notice'> Damage Specifics: 0-0-0-0</span>", 1)
|
||||
user.show_message("<span class='notice'>Key: Suffocation/Toxin/Burns/Brute</span>", 1)
|
||||
user.show_message("<span class='notice'>Body Temperature: ???</span>", 1)
|
||||
@@ -100,39 +107,72 @@ REAGENT SCANNER
|
||||
OX = fake_oxy > 50 ? "<span class='warning'>Severe oxygen deprivation detected</span>" : "Subject bloodstream oxygen level normal"
|
||||
user.show_message("[OX] | [TX] | [BU] | [BR]")
|
||||
if(M.radiation)
|
||||
user.show_message("<span class='warning'>Radiation detected.</span>")
|
||||
if(advscan >= 2 && showadvscan == 1)
|
||||
if(M.radiation >= 75)
|
||||
user.show_message("<span class='warning'>Critical levels of radiation detected. Immediate treatment advised.</span>")
|
||||
else if(M.radiation >= 50)
|
||||
user.show_message("<span class='warning'>Severe levels of radiation detected.</span>")
|
||||
else if(M.radiation >= 25)
|
||||
user.show_message("<span class='warning'>Moderate levels of radiation detected.</span>")
|
||||
else if(M.radiation >= 1)
|
||||
user.show_message("<span_class='warning'>Low levels of radiation detected.</span>")
|
||||
else
|
||||
user.show_message("<span class='warning'>Radiation detected.</span>")
|
||||
if(istype(M, /mob/living/carbon))
|
||||
var/mob/living/carbon/C = M
|
||||
if(C.reagents.total_volume)
|
||||
var/unknown = 0
|
||||
var/reagentdata[0]
|
||||
var/unknownreagents[0]
|
||||
for(var/A in C.reagents.reagent_list)
|
||||
var/datum/reagent/R = A
|
||||
if(R.scannable)
|
||||
reagentdata["[R.id]"] = "<span class='notice'> [round(C.reagents.get_reagent_amount(R.id), 1)]u [R.name]</span>"
|
||||
else
|
||||
unknown++
|
||||
unknownreagents["[R.id]"] = "<span class='notice'> [round(C.reagents.get_reagent_amount(R.id), 1)]u [R.name]</span>"
|
||||
if(reagentdata.len)
|
||||
user.show_message("<span class='notice'>Beneficial reagents detected in subject's blood:</span>")
|
||||
for(var/d in reagentdata)
|
||||
user.show_message(reagentdata[d])
|
||||
if(unknown)
|
||||
user.show_message("<span class='warning'>Warning: Unknown substance[(unknown>1)?"s":""] detected in subject's blood.</span>")
|
||||
if(advscan >= 3 && showadvscan == 1)
|
||||
user.show_message("<span class='warning'>Warning: Non-medical reagent[(unknown>1)?"s":""] detected in subject's blood:</span>")
|
||||
for(var/d in unknownreagents)
|
||||
user.show_message(unknownreagents[d])
|
||||
else
|
||||
user.show_message("<span class='warning'>Warning: Unknown substance[(unknown>1)?"s":""] detected in subject's blood.</span>")
|
||||
if(C.ingested && C.ingested.total_volume)
|
||||
var/unknown = 0
|
||||
for(var/datum/reagent/R in C.ingested.reagent_list)
|
||||
if(R.scannable)
|
||||
user << "<span class='notice'>[R.name] found in subject's stomach.</span>"
|
||||
var/stomachreagentdata[0]
|
||||
var/stomachunknownreagents[0]
|
||||
for(var/B in C.ingested.reagent_list)
|
||||
var/datum/reagent/T = B
|
||||
if(T.scannable)
|
||||
stomachreagentdata["[T.id]"] = "<span class='notice'> [round(C.ingested.get_reagent_amount(T.id), 1)]u [T.name]</span>"
|
||||
if (advscan == 0 || showadvscan == 0)
|
||||
user.show_message("<span class='notice'>[T.name] found in subject's stomach.</span>")
|
||||
else
|
||||
++unknown
|
||||
stomachunknownreagents["[T.id]"] = "<span class='notice'> [round(C.ingested.get_reagent_amount(T.id), 1)]u [T.name]</span>"
|
||||
if(advscan >= 1 && showadvscan == 1)
|
||||
user.show_message("<span class='notice'>Beneficial reagents detected in subject's stomach:</span>")
|
||||
for(var/d in stomachreagentdata)
|
||||
user.show_message(stomachreagentdata[d])
|
||||
if(unknown)
|
||||
user << "<span class='warning'>Non-medical reagent[(unknown > 1)?"s":""] found in subject's stomach.</span>"
|
||||
if(advscan >= 3 && showadvscan == 1)
|
||||
user.show_message("<span class='warning'>Warning: Non-medical reagent[(unknown > 1)?"s":""] found in subject's stomach:</span>")
|
||||
for(var/d in stomachunknownreagents)
|
||||
user.show_message(stomachunknownreagents[d])
|
||||
else
|
||||
user.show_message("<span class='warning'>Unknown substance[(unknown > 1)?"s":""] found in subject's stomach.</span>")
|
||||
if(C.virus2.len)
|
||||
for (var/ID in C.virus2)
|
||||
if (ID in virusDB)
|
||||
var/datum/data/record/V = virusDB[ID]
|
||||
user.show_message("<span class='warning'>Warning: Pathogen [V.fields["name"]] detected in subject's blood. Known antigen : [V.fields["antigen"]]</span>")
|
||||
// user.show_message(text("<span class='warning'>Warning: Unknown pathogen detected in subject's blood.</span>"))
|
||||
else
|
||||
user.show_message("<span class='warning'>Warning: Unknown pathogen detected in subject's blood.</span>")
|
||||
if (M.getCloneLoss())
|
||||
user.show_message("<span class='warning'>Subject appears to have been imperfectly cloned.</span>")
|
||||
// if (M.reagents && M.reagents.get_reagent_amount("inaprovaline"))
|
||||
@@ -145,6 +185,8 @@ REAGENT SCANNER
|
||||
user.show_message("<span class='warning'>Severe brain damage detected. Subject likely to have a traumatic brain injury.</span>")
|
||||
else if (M.getBrainLoss() >= 10)
|
||||
user.show_message("<span class='warning'>Significant brain damage detected. Subject may have had a concussion.</span>")
|
||||
else if (M.getBrainLoss() >= 1 && advscan >= 2 && showadvscan == 1)
|
||||
user.show_message("<span class='warning'>Minor brain damage detected.</span>")
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
for(var/name_i in H.internal_organs_by_name)
|
||||
@@ -166,21 +208,28 @@ REAGENT SCANNER
|
||||
var/limb = e.name
|
||||
if(e.status & ORGAN_BROKEN)
|
||||
if(((e.name == "l_arm") || (e.name == "r_arm") || (e.name == "l_leg") || (e.name == "r_leg")) && (!e.splinted))
|
||||
user << "<span class='warning'>Unsecured fracture in subject [limb]. Splinting recommended for transport.</span>"
|
||||
to_chat(user, "<span class='warning'>Unsecured fracture in subject [limb]. Splinting recommended for transport.</span>")
|
||||
if(e.has_infected_wound())
|
||||
user << "<span class='warning'>Infected wound detected in subject [limb]. Disinfection recommended.</span>"
|
||||
to_chat(user, "<span class='warning'>Infected wound detected in subject [limb]. Disinfection recommended.</span>")
|
||||
|
||||
for(var/name in H.organs_by_name)
|
||||
var/obj/item/organ/external/e = H.organs_by_name[name]
|
||||
if(e && e.status & ORGAN_BROKEN)
|
||||
user.show_message(text("<span class='warning'>Bone fractures detected. Advanced scanner required for location.</span>"), 1)
|
||||
break
|
||||
if(advscan >= 1 && showadvscan == 1)
|
||||
user.show_message(text("<span class='warning'>Bone fractures detected in subject [e.name].</span>"), 1)
|
||||
else
|
||||
user.show_message(text("<span class='warning'>Bone fractures detected. Advanced scanner required for location.</span>"), 1)
|
||||
break
|
||||
for(var/obj/item/organ/external/e in H.organs)
|
||||
if(!e)
|
||||
continue
|
||||
for(var/datum/wound/W in e.wounds) if(W.internal)
|
||||
user.show_message(text("<span class='warning'>Internal bleeding detected. Advanced scanner required for location.</span>"), 1)
|
||||
break
|
||||
if(advscan >= 1 && showadvscan == 1)
|
||||
user.show_message(text("<span class='warning'>Internal bleeding detected in subject [e.name].</span>"), 1)
|
||||
else
|
||||
user.show_message(text("<span class='warning'>Internal bleeding detected. Advanced scanner required for location.</span>"), 1)
|
||||
break
|
||||
break
|
||||
|
||||
if(M:vessel)
|
||||
var/blood_volume = H.vessel.get_reagent_amount("blood")
|
||||
@@ -202,10 +251,37 @@ REAGENT SCANNER
|
||||
mode = !mode
|
||||
switch (mode)
|
||||
if(1)
|
||||
usr << "The scanner now shows specific limb damage."
|
||||
to_chat(usr, "The scanner now shows specific limb damage.")
|
||||
if(0)
|
||||
usr << "The scanner no longer shows limb damage."
|
||||
to_chat(usr, "The scanner no longer shows limb damage.")
|
||||
|
||||
/obj/item/device/healthanalyzer/proc/toggle_adv()
|
||||
set name = "Toggle Advanced Scan"
|
||||
set category = "Object"
|
||||
|
||||
showadvscan = !showadvscan
|
||||
switch (showadvscan)
|
||||
if(1)
|
||||
to_chat(usr, "The scanner will now perform an advanced analysis.")
|
||||
if(0)
|
||||
to_chat(usr, "The scanner will now perform a basic analysis.")
|
||||
|
||||
/obj/item/device/healthanalyzer/improved //reports bone fractures, IB, quantity of beneficial reagents in stomach; also regular health analyzer stuff
|
||||
name = "advanced health analyzer"
|
||||
desc = "A miracle of medical technology, this handheld scanner can produce an accurate and specific report of a patient's biosigns."
|
||||
advscan = 1
|
||||
origin_tech = list(TECH_MAGNET = 5, TECH_BIO = 6)
|
||||
icon_state = "advhealth"
|
||||
|
||||
/obj/item/device/healthanalyzer/advanced //reports all of the above, as well as radiation severity and minor brain damage
|
||||
name = "advanced health analyzer"
|
||||
advscan = 2
|
||||
icon_state = "advhealth"
|
||||
|
||||
/obj/item/device/healthanalyzer/enhanced //reports all of the above, as well as name and quantity of nonmed reagents in stomach
|
||||
name = "phasic health analyzer"
|
||||
advscan = 3
|
||||
icon_state = "advhealth"
|
||||
|
||||
/obj/item/device/analyzer
|
||||
name = "analyzer"
|
||||
@@ -235,7 +311,7 @@ REAGENT SCANNER
|
||||
if (user.stat)
|
||||
return
|
||||
if (!(istype(usr, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey")
|
||||
usr << "<span class='warning'>You don't have the dexterity to do this!</span>"
|
||||
to_chat(usr, "<span class='warning'>You don't have the dexterity to do this!</span>")
|
||||
return
|
||||
|
||||
analyze_gases(src, user)
|
||||
@@ -274,14 +350,14 @@ REAGENT SCANNER
|
||||
if (user.stat)
|
||||
return
|
||||
if (!(istype(user, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey")
|
||||
user << "<span class='warning'>You don't have the dexterity to do this!</span>"
|
||||
to_chat(user, "<span class='warning'>You don't have the dexterity to do this!</span>")
|
||||
return
|
||||
if(reagents.total_volume)
|
||||
var/list/blood_traces = list()
|
||||
for(var/datum/reagent/R in reagents.reagent_list)
|
||||
if(R.id != "blood")
|
||||
reagents.clear_reagents()
|
||||
user << "<span class='warning'>The sample was contaminated! Please insert another sample</span>"
|
||||
to_chat(user, "<span class='warning'>The sample was contaminated! Please insert another sample</span>")
|
||||
return
|
||||
else
|
||||
blood_traces = params2list(R.data["trace_chem"])
|
||||
@@ -292,7 +368,7 @@ REAGENT SCANNER
|
||||
dat += "[R] ([blood_traces[R]] units) "
|
||||
else
|
||||
dat += "[R] "
|
||||
user << "[dat]"
|
||||
to_chat(user, "[dat]")
|
||||
reagents.clear_reagents()
|
||||
return
|
||||
|
||||
@@ -325,7 +401,7 @@ REAGENT SCANNER
|
||||
if (user.stat)
|
||||
return
|
||||
if (!(istype(user, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey")
|
||||
user << "<span class='warning'>You don't have the dexterity to do this!</span>"
|
||||
to_chat(user, "<span class='warning'>You don't have the dexterity to do this!</span>")
|
||||
return
|
||||
if(!istype(O))
|
||||
return
|
||||
@@ -335,9 +411,9 @@ REAGENT SCANNER
|
||||
if(O.reagents.reagent_list.len > 0)
|
||||
var/one_percent = O.reagents.total_volume / 100
|
||||
for (var/datum/reagent/R in O.reagents.reagent_list)
|
||||
dat += "\n \t <span class='notice'>[R][details ? ": [R.volume / one_percent]%" : ""]"
|
||||
dat += "\n \t <span class='notice'>[R][details ? ": [R.volume / one_percent]%" : ""]</span>"
|
||||
if(dat)
|
||||
user << "<span class='notice'>Chemicals found: [dat]</span>"
|
||||
to_chat(user, "<span class='notice'>Chemicals found: [dat]</span>")
|
||||
else
|
||||
user << "<span class='notice'>No active chemical agents found in [O].</span>"
|
||||
else
|
||||
|
||||
@@ -158,6 +158,29 @@
|
||||
to_chat(usr, "There's no mounting point for the module!")
|
||||
return 0
|
||||
|
||||
/obj/item/borg/upgrade/advhealth
|
||||
name = "advanced health analyzer module"
|
||||
desc = "A carbon dioxide jetpack suitable for low-gravity operations."
|
||||
icon_state = "cyborg_upgrade3"
|
||||
item_state = "cyborg_upgrade"
|
||||
require_module = 1
|
||||
|
||||
/obj/item/borg/upgrade/advhealth/action(var/mob/living/silicon/robot/R)
|
||||
if(..()) return 0
|
||||
|
||||
var/obj/item/device/healthanalyzer/advanced/T = locate() in R.module
|
||||
if(!T)
|
||||
T = locate() in R.module.contents
|
||||
if(!T)
|
||||
T = locate() in R.module.modules
|
||||
if(!T)
|
||||
R.module.modules += new/obj/item/device/healthanalyzer/advanced
|
||||
return 1
|
||||
if(T)
|
||||
to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!")
|
||||
to_chat(usr, "There's no mounting point for the module!")
|
||||
return 0
|
||||
|
||||
/obj/item/borg/upgrade/syndicate/
|
||||
name = "scrambled equipment module"
|
||||
desc = "Unlocks new and often deadly module specific items of a robot"
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
var/unbreakable = 0 //Doesn't lose health
|
||||
var/fragile = 0 //Shatters when it dies
|
||||
var/dulled = 0 //Has gone dull
|
||||
var/can_dull = 1 //Can it go dull?
|
||||
var/force_divisor = 0.5
|
||||
var/thrown_force_divisor = 0.5
|
||||
var/dulled_divisor = 0.5 //Just drops the damage by half
|
||||
@@ -92,7 +93,7 @@
|
||||
if(health<=0)
|
||||
if(fragile)
|
||||
shatter(consumed)
|
||||
else if(!dulled)
|
||||
else if(!dulled && can_dull)
|
||||
dull()
|
||||
|
||||
/obj/item/weapon/material/proc/shatter(var/consumed)
|
||||
|
||||
@@ -85,4 +85,37 @@
|
||||
thrown_force_divisor = 0.25 // as above
|
||||
dulled_divisor = 0.75 //Still metal on a long pole
|
||||
w_class = ITEMSIZE_SMALL
|
||||
attack_verb = list("slashed", "sliced", "cut", "clawed")
|
||||
attack_verb = list("slashed", "sliced", "cut", "clawed")
|
||||
|
||||
/obj/item/weapon/material/snow/snowball
|
||||
name = "loose packed snowball"
|
||||
desc = "A fun snowball. Throw it at your friends!"
|
||||
icon = 'icons/obj/weapons.dmi'
|
||||
icon_state = "snowball"
|
||||
default_material = MAT_SNOW
|
||||
health = 1
|
||||
fragile = 1
|
||||
force_divisor = 0.01
|
||||
thrown_force_divisor = 0.10
|
||||
w_class = ITEMSIZE_SMALL
|
||||
attack_verb = list("mushed", "splatted", "splooshed", "splushed") // Words that totally exist.
|
||||
|
||||
/obj/item/weapon/material/snow/snowball/attack_self(mob/user as mob)
|
||||
if(user.a_intent == I_HURT)
|
||||
visible_message("[user] has smashed the snowball in their hand!", "You smash the snowball in your hand.")
|
||||
var/atom/S = new /obj/item/stack/material/snow(user.loc)
|
||||
del(src)
|
||||
user.put_in_hands(S)
|
||||
else
|
||||
visible_message("[user] starts compacting the snowball.", "You start compacting the snowball.")
|
||||
if(do_after(user, 2000))
|
||||
var/atom/S = new /obj/item/weapon/material/snow/snowball/reinforced(user.loc)
|
||||
del(src)
|
||||
user.put_in_hands(S)
|
||||
|
||||
/obj/item/weapon/material/snow/snowball/reinforced
|
||||
name = "snowball"
|
||||
desc = "A well-formed and fun snowball. It looks kind of dangerous."
|
||||
icon_state = "snowball-reinf"
|
||||
force_divisor = 0.20
|
||||
thrown_force_divisor = 0.25
|
||||
@@ -145,6 +145,7 @@
|
||||
base_icon = "spearglass"
|
||||
name = "spear"
|
||||
desc = "A haphazardly-constructed yet still deadly weapon of ancient design."
|
||||
description_info = "This weapon can strike from two tiles away, and over certain objects such as tables, or other people."
|
||||
force = 10
|
||||
w_class = ITEMSIZE_LARGE
|
||||
slot_flags = SLOT_BACK
|
||||
@@ -158,4 +159,6 @@
|
||||
attack_verb = list("attacked", "poked", "jabbed", "torn", "gored")
|
||||
default_material = "glass"
|
||||
applies_material_colour = 0
|
||||
fragile = 1 //It's a haphazard thing of glass, wire, and steel
|
||||
fragile = 1 //It's a haphazard thing of glass, wire, and steel
|
||||
reach = 2 // Spears are long.
|
||||
attackspeed = 14
|
||||
@@ -10,7 +10,9 @@
|
||||
* Plant Bag
|
||||
* Sheet Snatcher
|
||||
* Cash Bag
|
||||
*
|
||||
* Chemistry Bag
|
||||
Food Bag
|
||||
|
||||
* -Sayu
|
||||
*/
|
||||
|
||||
@@ -261,3 +263,16 @@
|
||||
w_class = ITEMSIZE_LARGE
|
||||
slowdown = 1
|
||||
can_hold = list(/obj/item/weapon/reagent_containers/pill,/obj/item/weapon/reagent_containers/glass/beaker,/obj/item/weapon/reagent_containers/glass/bottle)
|
||||
|
||||
// -----------------------------
|
||||
// Food Bag
|
||||
// -----------------------------
|
||||
/obj/item/weapon/storage/bag/food
|
||||
name = "food bag"
|
||||
icon = 'icons/obj/storage.dmi'
|
||||
icon_state = "foodbag"
|
||||
desc = "A bag for storing foods of all kinds."
|
||||
max_storage_space = ITEMSIZE_COST_NORMAL * 25
|
||||
max_w_class = ITEMSIZE_NORMAL
|
||||
w_class = ITEMSIZE_SMALL
|
||||
can_hold = list(/obj/item/weapon/reagent_containers/food/snacks,/obj/item/weapon/reagent_containers/food/condiment)
|
||||
|
||||
@@ -149,6 +149,7 @@
|
||||
new /obj/item/weapon/surgical/bonegel(src)
|
||||
new /obj/item/weapon/surgical/FixOVein(src)
|
||||
new /obj/item/stack/medical/advanced/bruise_pack(src)
|
||||
new /obj/item/device/healthanalyzer/advanced(src)
|
||||
return
|
||||
|
||||
/obj/item/weapon/storage/firstaid/clotting
|
||||
|
||||
@@ -315,6 +315,12 @@
|
||||
if(!src.toggle())
|
||||
usr << "<span class='notice'>It won't budge!</span>"
|
||||
|
||||
/obj/structure/closet/attack_ghost(mob/ghost)
|
||||
if(ghost.client && ghost.client.inquisitive_ghost)
|
||||
ghost.examinate(src)
|
||||
if (!src.opened)
|
||||
to_chat(ghost, "It contains: [english_list(contents)].")
|
||||
|
||||
/obj/structure/closet/verb/verb_toggleopen()
|
||||
set src in oview(1)
|
||||
set category = "Object"
|
||||
|
||||
@@ -55,6 +55,8 @@
|
||||
new /obj/item/weapon/storage/box/mousetraps(src)
|
||||
new /obj/item/clothing/under/rank/chef(src)
|
||||
new /obj/item/clothing/head/chefhat(src)
|
||||
new /obj/item/weapon/storage/bag/food(src)
|
||||
new /obj/item/weapon/storage/bag/food(src)
|
||||
|
||||
/*
|
||||
* Janitor
|
||||
|
||||
@@ -140,7 +140,7 @@
|
||||
|
||||
/obj/structure/flora/skeleton
|
||||
name = "hanging skeleton model"
|
||||
icon = 'icons/obj/plants.dmi'
|
||||
icon = 'icons/obj/plants.dmi' //what an interesting plant
|
||||
icon_state = "hangskele"
|
||||
desc = "It's an anatomical model of a human skeletal system made of plaster."
|
||||
|
||||
@@ -200,7 +200,7 @@
|
||||
|
||||
/obj/structure/flora/pottedplant/orientaltree
|
||||
name = "potted oriental tree"
|
||||
desc = "This is a rather oriental style tree. It's flowers are bright pink."
|
||||
desc = "This is a rather oriental style tree. Its flowers are bright pink."
|
||||
icon_state = "plant-10"
|
||||
|
||||
/obj/structure/flora/pottedplant/smallcactus
|
||||
@@ -214,7 +214,7 @@
|
||||
icon_state = "plant-12"
|
||||
|
||||
/obj/structure/flora/pottedplant/sticky
|
||||
name = "styicky potted plant"
|
||||
name = "sticky potted plant"
|
||||
desc = "This is an odd plant. Its sticky leaves trap insects."
|
||||
icon_state = "plant-13"
|
||||
|
||||
@@ -287,4 +287,4 @@
|
||||
/obj/structure/flora/pottedplant/xmas
|
||||
name = "small christmas tree"
|
||||
desc = "This is a tiny well lit decorative christmas tree."
|
||||
icon_state = "plant-xmas"
|
||||
icon_state = "plant-xmas"
|
||||
|
||||
@@ -400,6 +400,7 @@ Loot piles can be depleted, if loot_depleted is turned on. Note that players wh
|
||||
/obj/item/device/universal_translator,
|
||||
/obj/item/device/aicard,
|
||||
/obj/item/borg/upgrade/jetpack,
|
||||
/obj/item/borg/upgrade/advhealth,
|
||||
/obj/item/borg/upgrade/vtec,
|
||||
/obj/item/borg/upgrade/tasercooler,
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/energy/riggedlaser,
|
||||
|
||||
@@ -33,3 +33,11 @@
|
||||
to_chat(user, "<span class='notice'>You decide to not finish removing \the [src].</span>")
|
||||
else
|
||||
..()
|
||||
|
||||
/turf/simulated/floor/outdoors/snow/attack_hand(mob/user as mob)
|
||||
visible_message("[user] starts scooping up some snow.", "You start scooping up some snow.")
|
||||
if(do_after(user, 1 SECOND))
|
||||
var/obj/S = new /obj/item/stack/material/snow(user.loc)
|
||||
user.put_in_hands(S)
|
||||
visible_message("[user] scoops up a pile of snow.", "You scoop up a pile of snow.")
|
||||
return
|
||||
@@ -23,7 +23,7 @@ var/savefile/Banlist
|
||||
.["desc"] = "\nReason: [Banlist["reason"]]\nExpires: [GetExp(Banlist["minutes"])]\nBy: [Banlist["bannedby"]][appeal]"
|
||||
else
|
||||
Banlist.cd = "/base/[ckey][id]"
|
||||
.["desc"] = "\nReason: [Banlist["reason"]]\nExpires: <B>PERMENANT</B>\nBy: [Banlist["bannedby"]][appeal]"
|
||||
.["desc"] = "\nReason: [Banlist["reason"]]\nExpires: <B>PERMANENT</B>\nBy: [Banlist["bannedby"]][appeal]"
|
||||
.["reason"] = "ckey/id"
|
||||
return .
|
||||
else
|
||||
@@ -49,7 +49,7 @@ var/savefile/Banlist
|
||||
else
|
||||
.["desc"] = "\nReason: [Banlist["reason"]]\nExpires: [GetExp(Banlist["minutes"])]\nBy: [Banlist["bannedby"]][appeal]"
|
||||
else
|
||||
.["desc"] = "\nReason: [Banlist["reason"]]\nExpires: <B>PERMENANT</B>\nBy: [Banlist["bannedby"]][appeal]"
|
||||
.["desc"] = "\nReason: [Banlist["reason"]]\nExpires: <B>PERMANENT</B>\nBy: [Banlist["bannedby"]][appeal]"
|
||||
.["reason"] = matches
|
||||
return .
|
||||
return 0
|
||||
|
||||
@@ -57,7 +57,7 @@
|
||||
/datum/gear/eyes/medical
|
||||
display_name = "Medical HUD (Medical)"
|
||||
path = /obj/item/clothing/glasses/hud/health
|
||||
allowed_roles = list("Medical Doctor","Chief Medical Officer","Chemist","Paramedic","Geneticist")
|
||||
allowed_roles = list("Medical Doctor","Chief Medical Officer","Chemist","Paramedic","Geneticist", "Psychiatrist")
|
||||
|
||||
/datum/gear/eyes/medical/prescriptionmed
|
||||
display_name = "Medical HUD, prescription (Medical)"
|
||||
|
||||
@@ -183,6 +183,12 @@
|
||||
desc = "Small spaces and tight quarters makes you feel distressed. Unfortunately both are rather common when living in space."
|
||||
modifier_type = /datum/modifier/trait/phobia/claustrophobe
|
||||
|
||||
|
||||
/datum/trait/modifier/mental/blennophobe
|
||||
name = "Blennophobia"
|
||||
desc = "Slimes are quite dangerous, but just the aspect of something being slimey is uncomfortable."
|
||||
modifier_type = /datum/modifier/trait/phobia/blennophobe
|
||||
|
||||
/*
|
||||
// Uncomment this when/if these get finished.
|
||||
/datum/trait/modifier/mental/synthphobe
|
||||
@@ -239,4 +245,4 @@
|
||||
name = "Promethean-phobic"
|
||||
desc = "Boilerplate racism for jellos goes here."
|
||||
mutually_exclusive = list(/datum/trait/modifier/mental/xenophobe)
|
||||
*/
|
||||
*/
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
|
||||
/obj/item/clothing/under/color/blackf
|
||||
name = "feminine black jumpsuit"
|
||||
desc = "It's very smart and in a ladies-size!"
|
||||
desc = "It's very smart and in a ladies size!"
|
||||
icon_state = "black"
|
||||
worn_state = "blackf"
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
|
||||
/obj/item/clothing/under/color/orange
|
||||
name = "orange jumpsuit"
|
||||
desc = "It's standardised prisoner-wear. Its suit sensors are stuck in the \"Fully On\" position."
|
||||
desc = "It's standardized prisoner-wear. Its suit sensors are permanently set to the \"Tracking\" position."
|
||||
icon_state = "orange"
|
||||
has_sensor = 2
|
||||
sensor_mode = 3
|
||||
|
||||
@@ -70,7 +70,7 @@
|
||||
|
||||
/obj/item/clothing/under/rank/clown
|
||||
name = "clown suit"
|
||||
desc = "<i>'HONK!'</i>"
|
||||
desc = "<i><font face='comic sans ms'>Honk!</i></font>"
|
||||
icon_state = "clown"
|
||||
rolled_sleeves = -1
|
||||
|
||||
@@ -173,7 +173,7 @@
|
||||
|
||||
/obj/item/clothing/under/lawyer/oldman
|
||||
name = "Old Man's Suit"
|
||||
desc = "A classic suit for the older gentleman with built in back support."
|
||||
desc = "A classic suit for the older gentleman, with built in back support."
|
||||
icon_state = "oldman"
|
||||
item_state_slots = list(slot_r_hand_str = "johnny", slot_l_hand_str = "johnny")
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@ var/list/dreams = list(
|
||||
"an Unathi","a Tajaran","the Station Intelligence core","the mining station","the research station","a beaker of strange liquid",
|
||||
"a Teshari", "a Diona nymph","the supermatter","Major Bill","a Morpheus ship with a ridiculous name","the Exodus","a star",
|
||||
"a Dionaea gestalt","the chapel","a distant scream","endless chittering noises","glowing eyes in the shadows","an empty glass",
|
||||
"a disoriented Promethean","towers of plastic","a Gygax","a synthetic","a Man-Machine Interface","maintanence drones",
|
||||
"a disoriented Promethean","towers of plastic","a Gygax","a synthetic","a Man-Machine Interface","maintenance drones",
|
||||
"unintelligible writings","a Fleet ship",
|
||||
)
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/obj/item/integrated_circuit/memory
|
||||
name = "memory chip"
|
||||
desc = "This tiny chip can store one piece of data."
|
||||
icon_state = "memory"
|
||||
icon_state = "memory1"
|
||||
complexity = 1
|
||||
inputs = list()
|
||||
outputs = list()
|
||||
|
||||
@@ -162,4 +162,5 @@
|
||||
))
|
||||
|
||||
/material/snow/generate_recipes()
|
||||
return // Snowmen and snowballs may come here later.
|
||||
recipes = list()
|
||||
recipes += new/datum/stack_recipe("snowball", /obj/item/weapon/material/snow/snowball, 1, time = 10)
|
||||
@@ -735,7 +735,7 @@ var/list/name_to_material
|
||||
destruction_desc = "crumples"
|
||||
|
||||
/material/snow
|
||||
name = "snow"
|
||||
name = MAT_SNOW
|
||||
stack_type = /obj/item/stack/material/snow
|
||||
flags = MATERIAL_BRITTLE
|
||||
icon_base = "solid"
|
||||
@@ -749,7 +749,7 @@ var/list/name_to_material
|
||||
melting_point = T0C+1
|
||||
destruction_desc = "crumples"
|
||||
sheet_singular_name = "pile"
|
||||
sheet_plural_name = "piles"
|
||||
sheet_plural_name = "pile" //Just a bigger pile
|
||||
|
||||
/material/cloth //todo
|
||||
name = "cloth"
|
||||
|
||||
@@ -297,7 +297,7 @@
|
||||
|
||||
var/open_tiles_needed = 15 // Tends to be just right, as maint triggers this but hallways don't.
|
||||
|
||||
on_created_text = "<span class='warning'>You are terrified of tight spaces. Why did you come to space??</span>"
|
||||
on_created_text = "<span class='warning'>You are terrified of tight spaces. Why did you come to space?</span>"
|
||||
on_expired_text = "<span class='notice'>Small rooms aren't so bad now.</span>"
|
||||
|
||||
zero_fear_up = list(
|
||||
@@ -357,6 +357,90 @@
|
||||
|
||||
return fear_amount
|
||||
|
||||
/datum/modifier/trait/phobia/blennophobe
|
||||
name = "blennophobia"
|
||||
desc = "Slimes are quite dangerous, but just the aspect of something being slimey is uncomfortable."
|
||||
fear_decay_rate = 1
|
||||
|
||||
on_created_text = "<span class='warning'>You are disgusted and horrified by slime.</span>"
|
||||
on_expired_text = "<span class='notice'>You feel more... okay with slime.</span>"
|
||||
|
||||
zero_fear_up = list(
|
||||
"<span class='warning'><font size='3'>That's some slime!</font></span>",
|
||||
"<span class='warning'><font size='3'>There's slime right there!</font></span>"
|
||||
)
|
||||
zero_fear_down = list(
|
||||
"<span class='notice'>The slime is out of sight and out of mind.</span>",
|
||||
"<span class='notice'>Clean. No more slime.</span>"
|
||||
)
|
||||
|
||||
half_fear_up = list(
|
||||
"<span class='danger'><font size='3'>The slimes might strike at any point!</font></span>",
|
||||
"<span class='danger'><font size='3'>The slime is still there!</font></span>"
|
||||
)
|
||||
half_fear_down = list(
|
||||
"<span class='warning'>The slime is gone... right?</span>",
|
||||
"<span class='warning'>You can't see any slime right now, but you're still anxious.</span>"
|
||||
)
|
||||
|
||||
full_fear_up = list(
|
||||
"<span class='danger'><font size='4'>The slime is everywhere!</font></span>",
|
||||
"<span class='danger'><font size='4'>You're gonna get absorbed if you don't get out!</font></span>"
|
||||
)
|
||||
full_fear_down = list(
|
||||
"<span class='danger'>There must be more of that slime somewhere...</span>",
|
||||
"<span class='danger'>No more of this slime, please....</span>"
|
||||
)
|
||||
|
||||
/datum/modifier/trait/phobia/blennophobe/should_fear()
|
||||
if(holder.blinded)
|
||||
return 0 // Can't fear what cannot be seen.
|
||||
|
||||
var/fear_amount = 0
|
||||
for(var/atom/thing in view(5, holder)) // See haemophobia for why this is 5.
|
||||
if(istype(thing, /obj/structure/blob)) // blobs are uncomfortable things
|
||||
fear_amount += 3
|
||||
|
||||
if(istype(thing, /obj/effect/alien/resin)) // Resin's a bit slimy according to its own description.
|
||||
fear_amount += 1
|
||||
|
||||
if(istype(thing, /obj/item/weed_extract))
|
||||
fear_amount += 1
|
||||
|
||||
if(istype(thing, /obj/effect/decal/cleanable/mucus)) // Blennophobia apparently includes mucus, so!
|
||||
fear_amount += 2
|
||||
|
||||
if(istype(thing, /obj/item/slime_extract)) // Gooey.
|
||||
fear_amount += 1
|
||||
|
||||
if(istype(thing, /obj/item/slime_cube)) // Also gooey, alongside harbinger of bad news.
|
||||
fear_amount += 2
|
||||
|
||||
if(istype(thing, /obj/item/organ/internal/brain/slime))
|
||||
fear_amount += 2
|
||||
|
||||
if(istype(thing, /obj/item/clothing/head/collectable/slime)) // Some hats are spooky so people can be assholes with them.
|
||||
fear_amount += 1
|
||||
|
||||
if(istype(thing, /mob/living/simple_animal/slime)) // An actual predatory specimen!
|
||||
var/mob/living/simple_animal/slime/S = thing
|
||||
if(S.stat == DEAD) // Dead slimes are somewhat less spook.
|
||||
fear_amount += 4
|
||||
if(S.is_adult == TRUE) //big boy
|
||||
fear_amount += 8
|
||||
else
|
||||
fear_amount += 6
|
||||
|
||||
if(istype(thing, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/S = thing
|
||||
if(istype(S.species, /datum/species/skrell)) //Skrell ARE slimey.
|
||||
fear_amount += 1
|
||||
if(istype(S.species, /datum/species/shapeshifter/promethean))
|
||||
fear_amount += 4
|
||||
else
|
||||
return
|
||||
return fear_amount
|
||||
|
||||
// Note for the below 'phobias' are of the xeno-phobic variety, and are less centered on pure fear as above, and more on a mix of distrust, fear, and disdainfulness.
|
||||
// As such, they are mechanically different than the fear-based phobias, in that instead of a buildup of fearful messages, it does intermittent messages specific to what holder sees.
|
||||
|
||||
@@ -367,7 +451,7 @@
|
||||
closely, waiting to strike."
|
||||
|
||||
on_created_text = "<span class='warning'>You remain vigilant against the Alien.</span>"
|
||||
on_expired_text = "<span class='notice'>Aliens aren't so bad afterall.</span>"
|
||||
on_expired_text = "<span class='notice'>Aliens aren't so bad after all.</span>"
|
||||
|
||||
var/last_message = null // world.time we last did a message.
|
||||
var/message_cooldown = 1 MINUTE
|
||||
@@ -442,7 +526,7 @@
|
||||
desc = "Humans are bound to get us all killed with their reckless use of technology..."
|
||||
|
||||
on_created_text = "<span class='warning'>You unfortunately are likely to have to deal with humans today.</span>"
|
||||
on_expired_text = "<span class='notice'>Humans aren't so bad afterall.</span>"
|
||||
on_expired_text = "<span class='notice'>Humans aren't so bad after all.</span>"
|
||||
|
||||
/datum/modifier/trait/phobia/xenophobia/human/get_xenos()
|
||||
var/list/humans = list()
|
||||
@@ -471,7 +555,7 @@
|
||||
desc = "The Skrell pretend that they are Humanity's enlightened allies, but you can see past that."
|
||||
|
||||
on_created_text = "<span class='warning'>Hopefully no Skrell show up today.</span>"
|
||||
on_expired_text = "<span class='notice'>Skrell aren't so bad afterall.</span>"
|
||||
on_expired_text = "<span class='notice'>Skrell aren't so bad after all.</span>"
|
||||
|
||||
/datum/modifier/trait/phobia/xenophobia/skrell/get_xenos()
|
||||
var/list/skrell = list()
|
||||
@@ -490,3 +574,4 @@
|
||||
"WetSkrell was a mistake."
|
||||
)
|
||||
return pick(generic_responses)
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@ var/global/list/image/ghost_sightless_images = list() //this is a list of images
|
||||
desc = "It's a g-g-g-g-ghooooost!" //jinkies!
|
||||
icon = 'icons/mob/ghost.dmi'
|
||||
icon_state = "ghost"
|
||||
layer = 4
|
||||
layer = 3.9 //Just below normal mobs
|
||||
stat = DEAD
|
||||
canmove = 0
|
||||
blinded = 0
|
||||
@@ -501,6 +501,16 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
src << "<font color='blue'>Temperature: [round(environment.temperature-T0C,0.1)]°C ([round(environment.temperature,0.1)]K)</font>"
|
||||
src << "<font color='blue'>Heat Capacity: [round(environment.heat_capacity(),0.1)]</font>"
|
||||
|
||||
/mob/observer/dead/verb/check_radiation()
|
||||
set name = "Check Radiation"
|
||||
set category = "Ghost"
|
||||
|
||||
var/turf/t = get_turf(src)
|
||||
if(t)
|
||||
var/rads = radiation_repository.get_rads_at_turf(t)
|
||||
to_chat(src, "<span class='notice'>Radiation level: [rads ? rads : "0"] Bq.</span>")
|
||||
|
||||
|
||||
/mob/observer/dead/verb/become_mouse()
|
||||
set name = "Become mouse"
|
||||
set category = "Ghost"
|
||||
|
||||
@@ -39,6 +39,7 @@
|
||||
var/virus_immune
|
||||
var/short_sighted // Permanent weldervision.
|
||||
var/blood_volume = 560 // Initial blood volume.
|
||||
var/bloodloss_rate = 1 // Multiplier for how fast a species bleeds out. Higher = Faster
|
||||
var/hunger_factor = 0.05 // Multiplier for hunger.
|
||||
|
||||
var/taste_sensitivity = TASTE_NORMAL // How sensitive the species is to minute tastes.
|
||||
|
||||
@@ -35,12 +35,14 @@
|
||||
ambiguous_genders = TRUE
|
||||
gluttonous = 1
|
||||
slowdown = 0.5
|
||||
total_health = 125
|
||||
brute_mod = 0.85
|
||||
burn_mod = 0.85
|
||||
metabolic_rate = 0.85
|
||||
item_slowdown_mod = 0.5
|
||||
mob_size = MOB_LARGE
|
||||
blood_volume = 840
|
||||
bloodloss_rate = 0.75
|
||||
num_alternate_languages = 3
|
||||
secondary_langs = list(LANGUAGE_UNATHI)
|
||||
name_language = LANGUAGE_UNATHI
|
||||
@@ -235,6 +237,8 @@
|
||||
flash_mod = 1.2
|
||||
chemOD_mod = 0.9
|
||||
|
||||
bloodloss_rate = 1.5
|
||||
|
||||
ambiguous_genders = TRUE
|
||||
|
||||
spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED
|
||||
|
||||
@@ -661,9 +661,9 @@ default behaviour is:
|
||||
/mob/living/Move(a, b, flag)
|
||||
|
||||
if (buckled && buckled.loc != a) //not updating position
|
||||
if (!buckled.anchored)
|
||||
if(istype(buckled, /mob)) //If you're buckled to a mob, a la slime things, keep on rolling.
|
||||
return buckled.Move(a, b)
|
||||
else
|
||||
else //Otherwise, no running around for you.
|
||||
return 0
|
||||
|
||||
if (restrained())
|
||||
|
||||
@@ -37,8 +37,10 @@ var/list/mob_hat_cache = list()
|
||||
integrated_light_power = 3
|
||||
local_transmit = 1
|
||||
|
||||
can_pull_size = ITEMSIZE_NORMAL
|
||||
can_pull_size = ITEMSIZE_NO_CONTAINER
|
||||
can_pull_mobs = MOB_PULL_SMALLER
|
||||
can_enter_vent_with = list(
|
||||
/obj)
|
||||
|
||||
mob_bump_flag = SIMPLE_ANIMAL
|
||||
mob_swap_flags = SIMPLE_ANIMAL
|
||||
@@ -71,13 +73,22 @@ var/list/mob_hat_cache = list()
|
||||
module_type = /obj/item/weapon/robot_module/drone/construction
|
||||
hat_x_offset = 1
|
||||
hat_y_offset = -12
|
||||
can_pull_size = ITEMSIZE_HUGE
|
||||
can_pull_mobs = MOB_PULL_SAME
|
||||
|
||||
/mob/living/silicon/robot/drone/mining
|
||||
icon_state = "miningdrone"
|
||||
item_state = "constructiondrone"
|
||||
law_type = /datum/ai_laws/mining_drone
|
||||
module_type = /obj/item/weapon/robot_module/drone/mining
|
||||
hat_x_offset = 1
|
||||
hat_y_offset = -12
|
||||
can_pull_mobs = MOB_PULL_SAME
|
||||
|
||||
/mob/living/silicon/robot/drone/New()
|
||||
|
||||
..()
|
||||
|
||||
verbs += /mob/living/proc/ventcrawl
|
||||
verbs += /mob/living/proc/hide
|
||||
remove_language("Robot Talk")
|
||||
add_language("Robot Talk", 0)
|
||||
@@ -145,18 +156,18 @@ var/list/mob_hat_cache = list()
|
||||
|
||||
if(user.a_intent == "help" && istype(W, /obj/item/clothing/head))
|
||||
if(hat)
|
||||
user << "<span class='warning'>\The [src] is already wearing \the [hat].</span>"
|
||||
to_chat(user, "<span class='warning'>\The [src] is already wearing \the [hat].</span>")
|
||||
return
|
||||
user.unEquip(W)
|
||||
wear_hat(W)
|
||||
user.visible_message("<span class='notice'>\The [user] puts \the [W] on \the [src].</span>")
|
||||
return
|
||||
else if(istype(W, /obj/item/borg/upgrade/))
|
||||
user << "<span class='danger'>\The [src] is not compatible with \the [W].</span>"
|
||||
to_chat(user, "<span class='danger'>\The [src] is not compatible with \the [W].</span>")
|
||||
return
|
||||
|
||||
else if (istype(W, /obj/item/weapon/crowbar))
|
||||
user << "<span class='danger'>\The [src] is hermetically sealed. You can't open the case.</span>"
|
||||
to_chat(user, "<span class='danger'>\The [src] is hermetically sealed. You can't open the case.</span>")
|
||||
return
|
||||
|
||||
else if (istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda))
|
||||
@@ -164,11 +175,11 @@ var/list/mob_hat_cache = list()
|
||||
if(stat == 2)
|
||||
|
||||
if(!config.allow_drone_spawn || emagged || health < -35) //It's dead, Dave.
|
||||
user << "<span class='danger'>The interface is fried, and a distressing burned smell wafts from the robot's interior. You're not rebooting this one.</span>"
|
||||
to_chat(user, "<span class='danger'>The interface is fried, and a distressing burned smell wafts from the robot's interior. You're not rebooting this one.</span>")
|
||||
return
|
||||
|
||||
if(!allowed(usr))
|
||||
user << "<span class='danger'>Access denied.</span>"
|
||||
to_chat(user, "<span class='danger'>Access denied.</span>")
|
||||
return
|
||||
|
||||
user.visible_message("<span class='danger'>\The [user] swipes \his ID card through \the [src], attempting to reboot it.</span>", "<span class='danger'>>You swipe your ID card through \the [src], attempting to reboot it.</span>")
|
||||
@@ -189,7 +200,7 @@ var/list/mob_hat_cache = list()
|
||||
if(allowed(usr))
|
||||
shut_down()
|
||||
else
|
||||
user << "<span class='danger'>Access denied.</span>"
|
||||
to_chat(user, "<span class='danger'>Access denied.</span>")
|
||||
|
||||
return
|
||||
|
||||
@@ -197,16 +208,16 @@ var/list/mob_hat_cache = list()
|
||||
|
||||
/mob/living/silicon/robot/drone/emag_act(var/remaining_charges, var/mob/user)
|
||||
if(!client || stat == 2)
|
||||
user << "<span class='danger'>There's not much point subverting this heap of junk.</span>"
|
||||
to_chat(user, "<span class='danger'>There's not much point subverting this heap of junk.</span>")
|
||||
return
|
||||
|
||||
if(emagged)
|
||||
src << "<span class='danger'>\The [user] attempts to load subversive software into you, but your hacked subroutines ignore the attempt.</span>"
|
||||
user << "<span class='danger'>You attempt to subvert [src], but the sequencer has no effect.</span>"
|
||||
to_chat(user, "<span class='danger'>\The [user] attempts to load subversive software into you, but your hacked subroutines ignore the attempt.</span>")
|
||||
to_chat(user, "<span class='danger'>You attempt to subvert [src], but the sequencer has no effect.</span>")
|
||||
return
|
||||
|
||||
user << "<span class='danger'>You swipe the sequencer across [src]'s interface and watch its eyes flicker.</span>"
|
||||
src << "<span class='danger'>You feel a sudden burst of malware loaded into your execute-as-root buffer. Your tiny brain methodically parses, loads and executes the script.</span>"
|
||||
to_chat(user, "<span class='danger'>You swipe the sequencer across [src]'s interface and watch its eyes flicker.</span>")
|
||||
to_chat(user, "<span class='danger'>You feel a sudden burst of malware loaded into your execute-as-root buffer. Your tiny brain methodically parses, loads and executes the script.</span>")
|
||||
|
||||
message_admins("[key_name_admin(user)] emagged drone [key_name_admin(src)]. Laws overridden.")
|
||||
log_game("[key_name(user)] emagged drone [key_name(src)]. Laws overridden.")
|
||||
@@ -337,3 +348,11 @@ var/list/mob_hat_cache = list()
|
||||
/mob/living/silicon/robot/drone/construction/updatename()
|
||||
real_name = "construction drone ([rand(100,999)])"
|
||||
name = real_name
|
||||
|
||||
/mob/living/silicon/robot/drone/mining/init()
|
||||
..()
|
||||
flavor_text = "It's a bulky mining drone stamped with a Grayson logo."
|
||||
|
||||
/mob/living/silicon/robot/drone/mining/updatename()
|
||||
real_name = "mining drone ([rand(100,999)])"
|
||||
name = real_name
|
||||
|
||||
@@ -30,6 +30,11 @@
|
||||
fabricator_tag = "Upper Level Construction"
|
||||
drone_type = /mob/living/silicon/robot/drone/construction
|
||||
|
||||
/obj/machinery/drone_fabricator/mining
|
||||
name = "mining drone fabricator"
|
||||
fabricator_tag = "Upper Level Mining"
|
||||
drone_type = /mob/living/silicon/robot/drone/mining
|
||||
|
||||
/obj/machinery/drone_fabricator/New()
|
||||
..()
|
||||
|
||||
|
||||
@@ -628,7 +628,7 @@
|
||||
if(!opened)
|
||||
usr << "You must access the borgs internals!"
|
||||
else if(!src.module && U.require_module)
|
||||
usr << "The borg must choose a module before he can be upgraded!"
|
||||
usr << "The borg must choose a module before it can be upgraded!"
|
||||
else if(U.locked)
|
||||
usr << "The upgrade is locked and cannot be used yet!"
|
||||
else
|
||||
|
||||
@@ -31,6 +31,7 @@ var/global/list/robot_modules = list(
|
||||
var/list/datum/matter_synth/synths = list()
|
||||
var/obj/item/emag = null
|
||||
var/obj/item/borg/upgrade/jetpack = null
|
||||
var/obj/item/borg/upgrade/advhealth = null
|
||||
var/list/subsystems = list()
|
||||
var/list/obj/item/borg/upgrade/supported_upgrades = list()
|
||||
|
||||
@@ -871,4 +872,17 @@ var/global/list/robot_modules = list(
|
||||
var/obj/item/device/lightreplacer/LR = locate() in src.modules
|
||||
LR.Charge(R, amount)
|
||||
..()
|
||||
return
|
||||
return
|
||||
|
||||
/obj/item/weapon/robot_module/drone/mining
|
||||
name = "miner drone module"
|
||||
channels = list("Supply" = 1)
|
||||
networks = list(NETWORK_MINE)
|
||||
|
||||
/obj/item/weapon/robot_module/drone/mining/New()
|
||||
..()
|
||||
src.modules += new /obj/item/borg/sight/material(src)
|
||||
src.modules += new /obj/item/weapon/pickaxe/borgdrill(src)
|
||||
src.modules += new /obj/item/weapon/storage/bag/ore(src)
|
||||
src.modules += new /obj/item/weapon/storage/bag/sheetsnatcher/borg(src)
|
||||
src.emag = new /obj/item/weapon/pickaxe/diamonddrill(src)
|
||||
|
||||
@@ -141,7 +141,7 @@
|
||||
/obj/item/weapon/robot_module/robot/syndicate/combat_medic/New(var/mob/living/silicon/robot/R)
|
||||
..()
|
||||
src.modules += new /obj/item/borg/sight/hud/med(src)
|
||||
src.modules += new /obj/item/device/healthanalyzer(src)
|
||||
src.modules += new /obj/item/device/healthanalyzer/advanced(src)
|
||||
src.modules += new /obj/item/weapon/reagent_containers/borghypo/merc(src)
|
||||
|
||||
// Surgery things.
|
||||
|
||||
@@ -143,6 +143,9 @@ var/const/CE_STABLE_THRESHOLD = 0.5
|
||||
var/blood_max = 0
|
||||
var/blood_loss_divisor = 30 //lower factor = more blood loss
|
||||
|
||||
// Some species bleed out differently
|
||||
blood_loss_divisor /= species.bloodloss_rate
|
||||
|
||||
// Some modifiers can make bleeding better or worse. Higher multiplers = more bleeding.
|
||||
var/blood_loss_modifier_multiplier = 1.0
|
||||
for(var/datum/modifier/M in modifiers)
|
||||
|
||||
@@ -41,7 +41,12 @@ var/list/fusion_cores = list()
|
||||
/obj/machinery/power/fusion_core/process()
|
||||
if((stat & BROKEN) || !powernet || !owned_field)
|
||||
Shutdown()
|
||||
|
||||
if(owned_field)
|
||||
spawn(1)
|
||||
owned_field.stability_monitor()
|
||||
owned_field.radiation_scale()
|
||||
owned_field.temp_dump()
|
||||
owned_field.temp_color()
|
||||
/obj/machinery/power/fusion_core/Topic(href, href_list)
|
||||
if(..())
|
||||
return 1
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
#define FUSION_ENERGY_PER_K 20
|
||||
#define FUSION_MAX_ENVIRO_HEAT 5000 //raise this if you want the reactor to dump more energy into the atmosphere
|
||||
#define PLASMA_TEMP_RADIATION_DIVISIOR 15 //radiation divisior. plasma temp / divisor = radiation.
|
||||
|
||||
/obj/effect/fusion_em_field
|
||||
name = "electromagnetic field"
|
||||
@@ -7,7 +9,7 @@
|
||||
icon_state = "emfield_s1"
|
||||
alpha = 50
|
||||
layer = 4
|
||||
light_color = COLOR_BLUE
|
||||
light_color = "#cc7700"
|
||||
|
||||
var/size = 1
|
||||
var/energy = 0
|
||||
@@ -16,6 +18,7 @@
|
||||
var/field_strength = 0.01
|
||||
var/tick_instability = 0
|
||||
var/percent_unstable = 0
|
||||
var/stable = 1
|
||||
|
||||
var/obj/machinery/power/fusion_core/owned_core
|
||||
var/list/dormant_reactant_quantities = list()
|
||||
@@ -33,8 +36,8 @@
|
||||
|
||||
var/light_min_range = 2
|
||||
var/light_min_power = 3
|
||||
var/light_max_range = 10
|
||||
var/light_max_power = 10
|
||||
var/light_max_range = 5
|
||||
var/light_max_power = 5
|
||||
|
||||
var/last_range
|
||||
var/last_power
|
||||
@@ -173,8 +176,6 @@
|
||||
|
||||
check_instability()
|
||||
Radiate()
|
||||
if(radiation)
|
||||
radiation_repository.radiate(src, radiation)
|
||||
return 1
|
||||
|
||||
/obj/effect/fusion_em_field/proc/check_instability()
|
||||
@@ -200,9 +201,10 @@
|
||||
var/flare
|
||||
var/fuel_loss
|
||||
var/rupture
|
||||
if(percent_unstable < 0.7)
|
||||
if(percent_unstable < 0.2)
|
||||
visible_message("<span class='danger'>\The [src] ripples uneasily, like a disturbed pond.</span>")
|
||||
fuel_loss = prob(5)
|
||||
flare = prob(50)
|
||||
else if(percent_unstable < 0.9)
|
||||
visible_message("<span class='danger'>\The [src] undulates violently, shedding plumes of plasma!</span>")
|
||||
flare = prob(50)
|
||||
@@ -238,6 +240,7 @@
|
||||
set_light(15, 15, "#CCCCFF")
|
||||
empulse(get_turf(src), ceil(plasma_temperature/1000), ceil(plasma_temperature/300))
|
||||
sleep(5)
|
||||
global_announcer.autosay("WARNING: FIELD RUPTURE IMMINENT!", "Containment Monitor")
|
||||
RadiateAll()
|
||||
explosion(get_turf(owned_core),-1,-1,8,10) // Blow out all the windows.
|
||||
return
|
||||
@@ -318,12 +321,6 @@
|
||||
tick_instability += rand(15,30)
|
||||
AM.emp_act(empsev)
|
||||
|
||||
if(owned_core && owned_core.loc)
|
||||
var/datum/gas_mixture/environment = owned_core.loc.return_air()
|
||||
if(environment && environment.temperature < (T0C+1000)) // Putting an upper bound on it to stop it being used in a TEG.
|
||||
environment.add_thermal_energy(plasma_temperature*20000)
|
||||
radiation = 0
|
||||
|
||||
/obj/effect/fusion_em_field/proc/change_size(var/newsize = 1)
|
||||
var/changed = 0
|
||||
switch(newsize)
|
||||
@@ -490,5 +487,59 @@
|
||||
AddEnergy(Proj.damage)
|
||||
update_icon()
|
||||
return 0
|
||||
//All procs below this point are called in _core.dm, starting at line 41.
|
||||
//Stability monitoring. Gives radio annoucements if field stability is below 80%
|
||||
/obj/effect/fusion_em_field/proc/stability_monitor()
|
||||
var/warnpoint = 0.10
|
||||
var/warnmessage = "Warning! Field unstable! Instability at [percent_unstable * 100]%, plasma temperature at [plasma_temperature + 295]k."
|
||||
var/stablemessage = "Containment field returning to stable conditions."
|
||||
|
||||
#undef FUSION_HEAT_CAP
|
||||
if(percent_unstable >= warnpoint)
|
||||
global_announcer.autosay(warnmessage, "Field Stability Monitor", "Engineering")
|
||||
stable = 0
|
||||
sleep(20 SECONDS)
|
||||
return
|
||||
if(percent_unstable < warnpoint && stable == 0)
|
||||
global_announcer.autosay(stablemessage, "Field Stability Monitor", "Engineering")
|
||||
stable = 1
|
||||
return
|
||||
|
||||
//Reaction radiation is fairly buggy and there's at least three procs dealing with radiation here, this is to ensure constant radiation output.
|
||||
/obj/effect/fusion_em_field/proc/radiation_scale()
|
||||
radiation_repository.radiate(src, 2 + plasma_temperature / PLASMA_TEMP_RADIATION_DIVISIOR)
|
||||
|
||||
//Somehow fixing the radiation issue managed to break this, but moving it to it's own proc seemed to have fixed it. I don't know.
|
||||
/obj/effect/fusion_em_field/proc/temp_dump()
|
||||
if(owned_core && owned_core.loc)
|
||||
var/datum/gas_mixture/environment = owned_core.loc.return_air()
|
||||
if(environment && environment.temperature < (T0C+FUSION_MAX_ENVIRO_HEAT))
|
||||
environment.add_thermal_energy(plasma_temperature*20000)
|
||||
|
||||
//Temperature changes depending on color.
|
||||
/obj/effect/fusion_em_field/proc/temp_color()
|
||||
if(plasma_temperature > 60000) //high ultraviolet - magenta
|
||||
light_color = "#cc005f"
|
||||
light_max_range = 25
|
||||
light_max_power = 10
|
||||
else if(plasma_temperature > 12000) //ultraviolet - blue
|
||||
light_color = "#1b00cc"
|
||||
light_max_range = 20
|
||||
light_max_power = 10
|
||||
else if(plasma_temperature > 8000) //nearing ultraviolet - cyan
|
||||
light_color = "#00cccc"
|
||||
light_max_range = 15
|
||||
light_max_power = 10
|
||||
else if(plasma_temperature > 4000) // green
|
||||
light_color = "#1ab705"
|
||||
light_max_range = 10
|
||||
light_max_power = 10
|
||||
else if(plasma_temperature <= 4000) //orange
|
||||
light_color = "#cc7700"
|
||||
light_max_range = 5
|
||||
light_max_power = 5
|
||||
return
|
||||
|
||||
|
||||
#undef FUSION_HEAT_CAP
|
||||
#undef FUSION_MAX_ENVIRO_HEAT
|
||||
#undef PLASMA_TEMP_RADIATION_DIVISIOR
|
||||
@@ -48,14 +48,13 @@ proc/get_fusion_reaction(var/p_react, var/s_react, var/m_energy)
|
||||
s_react = "deuterium"
|
||||
energy_consumption = 1
|
||||
energy_production = 2
|
||||
|
||||
// Advanced production reactions (todo)
|
||||
|
||||
/decl/fusion_reaction/deuterium_helium
|
||||
p_react = "deuterium"
|
||||
s_react = "helium-3"
|
||||
energy_consumption = 1
|
||||
energy_production = 5
|
||||
radiation = 2
|
||||
|
||||
/decl/fusion_reaction/deuterium_tritium
|
||||
p_react = "deuterium"
|
||||
@@ -64,7 +63,6 @@ proc/get_fusion_reaction(var/p_react, var/s_react, var/m_energy)
|
||||
energy_production = 1
|
||||
products = list("helium-3" = 1)
|
||||
instability = 0.5
|
||||
radiation = 3
|
||||
|
||||
/decl/fusion_reaction/deuterium_lithium
|
||||
p_react = "deuterium"
|
||||
|
||||
8
code/modules/power/fusion/fusion_reagents.dm
Normal file
8
code/modules/power/fusion/fusion_reagents.dm
Normal file
@@ -0,0 +1,8 @@
|
||||
//Additional fusion reagents. These likely don't have any other use aside from the RUST, but if you want to make stuff with 'em, be my guest.
|
||||
|
||||
/datum/reagent/helium3
|
||||
name = "helium-3"
|
||||
description = "A colorless, odorless, tasteless and generally inert gas used in fusion reactors. Non-radioactive."
|
||||
id = "helium-3"
|
||||
reagent_state = GAS
|
||||
color = "#808080"
|
||||
@@ -1,7 +1,7 @@
|
||||
// It.. uses a lot of power. Everything under power is engineering stuff, at least.
|
||||
|
||||
/obj/machinery/computer/gravity_control_computer
|
||||
name = "Gravity Generator Control"
|
||||
name = "gravity generator control"
|
||||
desc = "A computer to control a local gravity generator. Qualified personnel only."
|
||||
icon_state = "airtunnel0e"
|
||||
anchored = 1
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
|
||||
/obj/machinery/gravity_generator/
|
||||
name = "Gravitational Generator"
|
||||
name = "gravitational generator"
|
||||
desc = "A device which produces a gravaton field when set up."
|
||||
icon = 'icons/obj/singularity.dmi'
|
||||
icon_state = "TheSingGen"
|
||||
@@ -94,7 +94,7 @@
|
||||
else
|
||||
dat += "<tt><font color=red>[A]</tt></font><br>"
|
||||
|
||||
dat += "<br><tt>Maintainence Functions:</tt><br>"
|
||||
dat += "<br><tt>Maintenance Functions:</tt><br>"
|
||||
if(gravity_generator:on)
|
||||
dat += "<a href='byond://?src=\ref[src];gentoggle=1'><font color=red> TURN GRAVITY GENERATOR OFF. </font></a>"
|
||||
else
|
||||
|
||||
@@ -29,7 +29,8 @@
|
||||
|
||||
//Placeholder for effect that trigger on eating that aren't tied to reagents.
|
||||
/obj/item/weapon/reagent_containers/food/snacks/proc/On_Consume(var/mob/M)
|
||||
if(!usr) return
|
||||
if(!usr)
|
||||
usr = M
|
||||
if(!reagents.total_volume)
|
||||
M.visible_message("<span class='notice'>[M] finishes eating \the [src].</span>","<span class='notice'>You finish eating \the [src].</span>")
|
||||
usr.drop_from_inventory(src) //so icons update :[
|
||||
@@ -224,7 +225,7 @@
|
||||
return
|
||||
user.visible_message("<b>[user]</b> nibbles away at \the [src].","You nibble away at \the [src].")
|
||||
bitecount++
|
||||
if(reagents && user.reagents)
|
||||
if(reagents)
|
||||
reagents.trans_to_mob(user, bitesize, CHEM_INGEST)
|
||||
spawn(5)
|
||||
if(!src && !user.client)
|
||||
|
||||
@@ -15,57 +15,55 @@
|
||||
attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
return
|
||||
|
||||
New()
|
||||
var/datum/reagents/R = new/datum/reagents(1000)
|
||||
reagents = R
|
||||
R.my_atom = src
|
||||
if (!possible_transfer_amounts)
|
||||
src.verbs -= /obj/structure/reagent_dispensers/verb/set_APTFT
|
||||
..()
|
||||
/obj/structure/reagent_dispensers/New()
|
||||
var/datum/reagents/R = new/datum/reagents(5000)
|
||||
reagents = R
|
||||
R.my_atom = src
|
||||
if (!possible_transfer_amounts)
|
||||
src.verbs -= /obj/structure/reagent_dispensers/verb/set_APTFT
|
||||
..()
|
||||
|
||||
examine(mob/user)
|
||||
if(!..(user, 2))
|
||||
/obj/structure/reagent_dispensers/examine(mob/user)
|
||||
if(!..(user, 2))
|
||||
return
|
||||
user << "<span class='notice'>It contains:</span>"
|
||||
if(reagents && reagents.reagent_list.len)
|
||||
for(var/datum/reagent/R in reagents.reagent_list)
|
||||
user << "<span class='notice'>[R.volume] units of [R.name]</span>"
|
||||
else
|
||||
user << "<span class='notice'>Nothing.</span>"
|
||||
|
||||
/obj/structure/reagent_dispensers/verb/set_APTFT() //set amount_per_transfer_from_this
|
||||
set name = "Set transfer amount"
|
||||
set category = "Object"
|
||||
set src in view(1)
|
||||
var/N = input("Amount per transfer from this:","[src]") as null|anything in possible_transfer_amounts
|
||||
if (N)
|
||||
amount_per_transfer_from_this = N
|
||||
|
||||
/obj/structure/reagent_dispensers/ex_act(severity)
|
||||
switch(severity)
|
||||
if(1.0)
|
||||
qdel(src)
|
||||
return
|
||||
user << "<span class='notice'>It contains:</span>"
|
||||
if(reagents && reagents.reagent_list.len)
|
||||
for(var/datum/reagent/R in reagents.reagent_list)
|
||||
user << "<span class='notice'>[R.volume] units of [R.name]</span>"
|
||||
else
|
||||
user << "<span class='notice'>Nothing.</span>"
|
||||
|
||||
verb/set_APTFT() //set amount_per_transfer_from_this
|
||||
set name = "Set transfer amount"
|
||||
set category = "Object"
|
||||
set src in view(1)
|
||||
var/N = input("Amount per transfer from this:","[src]") as null|anything in possible_transfer_amounts
|
||||
if (N)
|
||||
amount_per_transfer_from_this = N
|
||||
|
||||
ex_act(severity)
|
||||
switch(severity)
|
||||
if(1.0)
|
||||
if(2.0)
|
||||
if (prob(50))
|
||||
new /obj/effect/effect/water(src.loc)
|
||||
qdel(src)
|
||||
return
|
||||
if(2.0)
|
||||
if (prob(50))
|
||||
new /obj/effect/effect/water(src.loc)
|
||||
qdel(src)
|
||||
return
|
||||
if(3.0)
|
||||
if (prob(5))
|
||||
new /obj/effect/effect/water(src.loc)
|
||||
qdel(src)
|
||||
return
|
||||
else
|
||||
return
|
||||
if(3.0)
|
||||
if (prob(5))
|
||||
new /obj/effect/effect/water(src.loc)
|
||||
qdel(src)
|
||||
return
|
||||
else
|
||||
return
|
||||
|
||||
/obj/structure/reagent_dispensers/blob_act()
|
||||
qdel(src)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//Dispensers
|
||||
/obj/structure/reagent_dispensers/watertank
|
||||
name = "watertank"
|
||||
@@ -73,16 +71,19 @@
|
||||
icon = 'icons/obj/objects.dmi'
|
||||
icon_state = "watertank"
|
||||
amount_per_transfer_from_this = 10
|
||||
New()
|
||||
..()
|
||||
reagents.add_reagent("water",1000)
|
||||
|
||||
/obj/structure/reagent_dispensers/watertank/high/New()
|
||||
/obj/structure/reagent_dispensers/watertank/New()
|
||||
..()
|
||||
reagents.add_reagent("water", 1000)
|
||||
|
||||
/obj/structure/reagent_dispensers/watertank/high
|
||||
name = "high-capacity water tank"
|
||||
desc = "A highly-pressurized water tank made to hold vast amounts of water.."
|
||||
icon_state = "watertank_high"
|
||||
|
||||
/obj/structure/reagent_dispensers/watertank/high/New()
|
||||
..()
|
||||
reagents.add_reagent("water",4000)
|
||||
reagents.add_reagent("water", 4000)
|
||||
|
||||
/obj/structure/reagent_dispensers/fueltank
|
||||
name = "fueltank"
|
||||
@@ -92,9 +93,10 @@
|
||||
amount_per_transfer_from_this = 10
|
||||
var/modded = 0
|
||||
var/obj/item/device/assembly_holder/rig = null
|
||||
New()
|
||||
..()
|
||||
reagents.add_reagent("fuel",1000)
|
||||
|
||||
/obj/structure/reagent_dispensers/fueltank/New()
|
||||
..()
|
||||
reagents.add_reagent("fuel",1000)
|
||||
|
||||
/obj/structure/reagent_dispensers/fueltank/examine(mob/user)
|
||||
if(!..(user, 2))
|
||||
@@ -201,9 +203,10 @@
|
||||
anchored = 1
|
||||
density = 0
|
||||
amount_per_transfer_from_this = 45
|
||||
New()
|
||||
..()
|
||||
reagents.add_reagent("condensedcapsaicin",1000)
|
||||
|
||||
/obj/structure/reagent_dispensers/peppertank/New()
|
||||
..()
|
||||
reagents.add_reagent("condensedcapsaicin",1000)
|
||||
|
||||
|
||||
/obj/structure/reagent_dispensers/water_cooler
|
||||
@@ -347,9 +350,10 @@
|
||||
icon = 'icons/obj/objects.dmi'
|
||||
icon_state = "beertankTEMP"
|
||||
amount_per_transfer_from_this = 10
|
||||
New()
|
||||
..()
|
||||
reagents.add_reagent("beer",1000)
|
||||
|
||||
/obj/structure/reagent_dispensers/beerkeg/New()
|
||||
..()
|
||||
reagents.add_reagent("beer",1000)
|
||||
|
||||
/obj/structure/reagent_dispensers/beerkeg/fakenuke
|
||||
name = "nuclear beer keg"
|
||||
@@ -365,9 +369,9 @@
|
||||
amount_per_transfer_from_this = 10
|
||||
anchored = 1
|
||||
|
||||
New()
|
||||
..()
|
||||
reagents.add_reagent("virusfood", 1000)
|
||||
/obj/structure/reagent_dispensers/virusfood/New()
|
||||
..()
|
||||
reagents.add_reagent("virusfood", 1000)
|
||||
|
||||
/obj/structure/reagent_dispensers/acid
|
||||
name = "Sulphuric Acid Dispenser"
|
||||
@@ -377,6 +381,6 @@
|
||||
amount_per_transfer_from_this = 10
|
||||
anchored = 1
|
||||
|
||||
New()
|
||||
..()
|
||||
reagents.add_reagent("sacid", 1000)
|
||||
/obj/structure/reagent_dispensers/acid/New()
|
||||
..()
|
||||
reagents.add_reagent("sacid", 1000)
|
||||
|
||||
@@ -752,7 +752,7 @@ other types of metals and chemistry for reagents).
|
||||
sort_string = "VABAI"
|
||||
|
||||
/datum/design/item/communicator
|
||||
name = "Communcator"
|
||||
name = "Communicator"
|
||||
id = "communicator"
|
||||
req_tech = list(TECH_DATA = 2, TECH_MAGNET = 2)
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 500)
|
||||
|
||||
@@ -332,6 +332,13 @@
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 7500, "phoron" = 11250, "uranium" = 15000)
|
||||
build_path = /obj/item/borg/upgrade/jetpack
|
||||
|
||||
/datum/design/item/prosfab/robot_upgrade/advhealth
|
||||
name = "Advanced Health Analyzer Module"
|
||||
desc = "An advanced health analyzer suitable for diagnosing more serious injuries."
|
||||
id = "borg_advhealth_module"
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 10000, "glass" = 6500, "diamond" = 350)
|
||||
build_path = /obj/item/borg/upgrade/advhealth
|
||||
|
||||
/datum/design/item/prosfab/robot_upgrade/syndicate
|
||||
name = "Scrambled Equipment Module"
|
||||
desc = "Allows for the construction of lethal upgrades for cyborgs."
|
||||
|
||||
Reference in New Issue
Block a user