Merge branch 'master' of https://github.com/PolarisSS13/Polaris into parachute

# Conflicts:
#	icons/obj/storage.dmi
This commit is contained in:
Anewbe
2017-12-07 17:59:13 -06:00
73 changed files with 1038 additions and 171 deletions

View File

@@ -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"

View File

@@ -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)

View File

@@ -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."

View File

@@ -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()

View File

@@ -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

View File

@@ -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,

View File

@@ -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

View File

@@ -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"

View File

@@ -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

View File

@@ -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"

View File

@@ -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)

View File

@@ -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

View File

@@ -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

View File

@@ -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)

View File

@@ -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

View File

@@ -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"

View File

@@ -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

View File

@@ -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"

View File

@@ -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,

View File

@@ -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

View File

@@ -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

View File

@@ -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)"

View File

@@ -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)
*/
*/

View File

@@ -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

View File

@@ -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")

View File

@@ -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",
)

View File

@@ -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()

View File

@@ -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)

View File

@@ -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"

View File

@@ -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)

View File

@@ -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)]&deg;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"

View File

@@ -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.

View File

@@ -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

View File

@@ -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())

View File

@@ -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

View File

@@ -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()
..()

View File

@@ -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

View File

@@ -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)

View File

@@ -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.

View File

@@ -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)

View File

@@ -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

View File

@@ -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

View File

@@ -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"

View 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"

View File

@@ -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

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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."