Merge remote-tracking branch 'citadel/master' into backend_sync
This commit is contained in:
@@ -51,3 +51,4 @@
|
|||||||
#define ORGAN_NO_SPOIL (1<<5) //Do not spoil under any circumstances
|
#define ORGAN_NO_SPOIL (1<<5) //Do not spoil under any circumstances
|
||||||
#define ORGAN_NO_DISMEMBERMENT (1<<6) //Immune to disembowelment.
|
#define ORGAN_NO_DISMEMBERMENT (1<<6) //Immune to disembowelment.
|
||||||
#define ORGAN_EDIBLE (1<<7) //is a snack? :D
|
#define ORGAN_EDIBLE (1<<7) //is a snack? :D
|
||||||
|
#define ORGAN_SYNTHETIC_EMP (1<<6) //Synthetic organ affected by an EMP. Deteriorates over time.
|
||||||
|
|||||||
@@ -68,6 +68,7 @@
|
|||||||
for(var/spath in subtypesof(/datum/species))
|
for(var/spath in subtypesof(/datum/species))
|
||||||
var/datum/species/S = new spath()
|
var/datum/species/S = new spath()
|
||||||
GLOB.species_list[S.id] = spath
|
GLOB.species_list[S.id] = spath
|
||||||
|
GLOB.species_datums[S.id] = S
|
||||||
|
|
||||||
//Surgeries
|
//Surgeries
|
||||||
for(var/path in subtypesof(/datum/surgery))
|
for(var/path in subtypesof(/datum/surgery))
|
||||||
|
|||||||
@@ -320,6 +320,8 @@ GLOBAL_LIST_INIT(nonstandard_skin_tones, list("orange"))
|
|||||||
|
|
||||||
GLOBAL_LIST_EMPTY(species_list)
|
GLOBAL_LIST_EMPTY(species_list)
|
||||||
|
|
||||||
|
GLOBAL_LIST_EMPTY(species_datums)
|
||||||
|
|
||||||
/proc/age2agedescription(age)
|
/proc/age2agedescription(age)
|
||||||
switch(age)
|
switch(age)
|
||||||
if(0 to 1)
|
if(0 to 1)
|
||||||
|
|||||||
@@ -95,3 +95,9 @@
|
|||||||
if("I'm feeling lucky")
|
if("I'm feeling lucky")
|
||||||
chosen_id = pick(subtypesof(/datum/reagent))
|
chosen_id = pick(subtypesof(/datum/reagent))
|
||||||
return chosen_id
|
return chosen_id
|
||||||
|
|
||||||
|
/proc/find_reagent_object_from_type(input)
|
||||||
|
if(GLOB.chemical_reagents_list[input]) //prefer IDs!
|
||||||
|
return GLOB.chemical_reagents_list[input]
|
||||||
|
else
|
||||||
|
return null
|
||||||
|
|||||||
@@ -61,14 +61,14 @@ SUBSYSTEM_DEF(activity)
|
|||||||
for(var/threat in threat_history)
|
for(var/threat in threat_history)
|
||||||
. = max(threat_history[threat], .)
|
. = max(threat_history[threat], .)
|
||||||
|
|
||||||
/datum/controller/subsystem/activity/proc/on_explosion(atom/epicenter, devastation_range, heavy_impact_range, light_impact_range, took, orig_dev_range, orig_heavy_range, orig_light_range)
|
/datum/controller/subsystem/activity/proc/on_explosion(datum/source, atom/epicenter, devastation_range, heavy_impact_range, light_impact_range, took, orig_dev_range, orig_heavy_range, orig_light_range)
|
||||||
if(!("explosions" in deferred_threats))
|
if(!("explosions" in deferred_threats))
|
||||||
deferred_threats["explosions"] = 0
|
deferred_threats["explosions"] = 0
|
||||||
var/area/A = get_area(epicenter)
|
var/area/A = get_area(epicenter)
|
||||||
if(is_station_level(epicenter.z) && (A.area_flags & BLOBS_ALLOWED) && !istype(A, /area/asteroid))
|
if(is_station_level(epicenter.z) && (A.area_flags & BLOBS_ALLOWED) && !istype(A, /area/asteroid))
|
||||||
deferred_threats["explosions"] += devastation_range**2 + heavy_impact_range**2 / 4 + light_impact_range**2 / 8 // 75 for a maxcap
|
deferred_threats["explosions"] += devastation_range**2 + heavy_impact_range**2 / 4 + light_impact_range**2 / 8 // 75 for a maxcap
|
||||||
|
|
||||||
/datum/controller/subsystem/activity/proc/on_death(mob/M, gibbed)
|
/datum/controller/subsystem/activity/proc/on_death(datum/source, mob/M, gibbed)
|
||||||
if(!("crew_deaths" in deferred_threats))
|
if(!("crew_deaths" in deferred_threats))
|
||||||
deferred_threats["crew_deaths"] = 0
|
deferred_threats["crew_deaths"] = 0
|
||||||
if(M?.mind && SSjob.GetJob(M.mind.assigned_role))
|
if(M?.mind && SSjob.GetJob(M.mind.assigned_role))
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
/datum/mutation/human/space_adaptation/New(class_ = MUT_OTHER, timer, datum/mutation/human/copymut)
|
/datum/mutation/human/space_adaptation/New(class_ = MUT_OTHER, timer, datum/mutation/human/copymut)
|
||||||
..()
|
..()
|
||||||
if(!(type in visual_indicators))
|
if(!(type in visual_indicators))
|
||||||
visual_indicators[type] = list(mutable_appearance('icons/effects/genetics.dmi', "fire", -MUTATIONS_LAYER))
|
visual_indicators[type] = list(mutable_appearance('icons/effects/genetics.dmi', "space_adapt", -MUTATIONS_LAYER))
|
||||||
|
|
||||||
/datum/mutation/human/space_adaptation/get_visual_indicator()
|
/datum/mutation/human/space_adaptation/get_visual_indicator()
|
||||||
return visual_indicators[type][1]
|
return visual_indicators[type][1]
|
||||||
|
|||||||
+234
-195
@@ -1,9 +1,5 @@
|
|||||||
#define LIMBGROWER_MAIN_MENU 1
|
/// The limbgrower. Makes organd and limbs with synthflesh and chems.
|
||||||
#define LIMBGROWER_CATEGORY_MENU 2
|
/// See [limbgrower_designs.dm] for everything we can make.
|
||||||
#define LIMBGROWER_CHEMICAL_MENU 3
|
|
||||||
//use these for the menu system
|
|
||||||
|
|
||||||
|
|
||||||
/obj/machinery/limbgrower
|
/obj/machinery/limbgrower
|
||||||
name = "limb grower"
|
name = "limb grower"
|
||||||
desc = "It grows new limbs using Synthflesh."
|
desc = "It grows new limbs using Synthflesh."
|
||||||
@@ -15,161 +11,235 @@
|
|||||||
active_power_usage = 100
|
active_power_usage = 100
|
||||||
circuit = /obj/item/circuitboard/machine/limbgrower
|
circuit = /obj/item/circuitboard/machine/limbgrower
|
||||||
|
|
||||||
var/operating = FALSE
|
/// The category of limbs we're browing in our UI.
|
||||||
var/disabled = FALSE
|
var/selected_category = "human"
|
||||||
|
/// If we're currently printing something.
|
||||||
var/busy = FALSE
|
var/busy = FALSE
|
||||||
var/prod_coeff = 1
|
/// How efficient our machine is. Better parts = less chemicals used and less power used. Range of 1 to 0.25.
|
||||||
|
var/production_coefficient = 1
|
||||||
|
/// How long it takes for us to print a limb. Affected by production_coefficient.
|
||||||
|
var/production_speed = 3 SECONDS
|
||||||
|
/// The design we're printing currently.
|
||||||
var/datum/design/being_built
|
var/datum/design/being_built
|
||||||
|
/// Our internal techweb for limbgrower designs.
|
||||||
var/datum/techweb/stored_research
|
var/datum/techweb/stored_research
|
||||||
var/selected_category
|
/// All the categories of organs we can print.
|
||||||
var/screen = 1
|
|
||||||
var/list/categories = list(
|
var/list/categories = list(
|
||||||
"human" = /datum/species/human,
|
"human",
|
||||||
"lizard" = /datum/species/lizard,
|
"lizard",
|
||||||
"mammal" = /datum/species/mammal,
|
"mammal",
|
||||||
"insect" = /datum/species/insect,
|
"insect",
|
||||||
"fly" = /datum/species/fly,
|
"fly",
|
||||||
"plasmaman" = /datum/species/plasmaman,
|
"plasmaman",
|
||||||
"xeno" = /datum/species/xeno,
|
"xeno",
|
||||||
"other" = /datum/species,
|
"other",
|
||||||
)
|
)
|
||||||
var/list/stored_species = list()
|
|
||||||
var/obj/item/disk/data/dna_disk
|
var/obj/item/disk/data/dna_disk
|
||||||
|
|
||||||
/obj/machinery/limbgrower/Initialize()
|
/obj/machinery/limbgrower/Initialize()
|
||||||
create_reagents(100, OPENCONTAINER)
|
create_reagents(100, OPENCONTAINER)
|
||||||
stored_research = new /datum/techweb/specialized/autounlocking/limbgrower
|
stored_research = new /datum/techweb/specialized/autounlocking/limbgrower
|
||||||
for(var/i in categories)
|
|
||||||
var/species = categories[i]
|
|
||||||
stored_species[i] = new species()
|
|
||||||
. = ..()
|
. = ..()
|
||||||
|
AddComponent(/datum/component/plumbing/simple_demand)
|
||||||
|
AddComponent(/datum/component/simple_rotation, ROTATION_WRENCH | ROTATION_CLOCKWISE, null, CALLBACK(src, .proc/can_be_rotated))
|
||||||
|
|
||||||
/obj/machinery/limbgrower/ui_interact(mob/user)
|
/obj/machinery/limbgrower/ui_interact(mob/user, datum/tgui/ui)
|
||||||
. = ..()
|
. = ..()
|
||||||
if(!is_operational())
|
ui = SStgui.try_update_ui(user, src, ui)
|
||||||
return
|
if(!ui)
|
||||||
|
ui = new(user, src, "Limbgrower", src)
|
||||||
|
ui.open()
|
||||||
|
|
||||||
var/dat = main_win(user)
|
/obj/machinery/limbgrower/ui_data(mob/user)
|
||||||
|
var/list/data = list()
|
||||||
|
|
||||||
switch(screen)
|
for(var/datum/reagent/reagent_id in reagents.reagent_list)
|
||||||
if(LIMBGROWER_MAIN_MENU)
|
var/list/reagent_data = list(
|
||||||
dat = main_win(user)
|
reagent_name = reagent_id.name,
|
||||||
if(LIMBGROWER_CATEGORY_MENU)
|
reagent_amount = reagent_id.volume,
|
||||||
dat = category_win(user,selected_category)
|
reagent_type = reagent_id.type
|
||||||
if(LIMBGROWER_CHEMICAL_MENU)
|
)
|
||||||
dat = chemical_win(user)
|
data["reagents"] += list(reagent_data)
|
||||||
|
|
||||||
var/datum/browser/popup = new(user, "Limb Grower", name, 400, 500)
|
data["total_reagents"] = reagents.total_volume
|
||||||
popup.set_content(dat)
|
data["max_reagents"] = reagents.maximum_volume
|
||||||
popup.open()
|
data["busy"] = busy
|
||||||
|
var/list/disk_data = list()
|
||||||
|
disk_data["disk"] = dna_disk //Do i, the machine, have a disk?
|
||||||
|
disk_data["name"] = dna_disk?.fields["name"] //Name for the human saved if there is one
|
||||||
|
data["disk"] = disk_data
|
||||||
|
|
||||||
|
return data
|
||||||
|
|
||||||
|
/obj/machinery/limbgrower/ui_static_data(mob/user)
|
||||||
|
var/list/data = list()
|
||||||
|
data["categories"] = list()
|
||||||
|
|
||||||
|
var/species_categories = categories.Copy()
|
||||||
|
for(var/species in species_categories)
|
||||||
|
species_categories[species] = list()
|
||||||
|
for(var/design_id in stored_research.researched_designs)
|
||||||
|
var/datum/design/limb_design = SSresearch.techweb_design_by_id(design_id)
|
||||||
|
for(var/found_category in species_categories)
|
||||||
|
if(found_category in limb_design.category)
|
||||||
|
species_categories[found_category] += limb_design
|
||||||
|
|
||||||
|
for(var/category in species_categories)
|
||||||
|
var/list/category_data = list(
|
||||||
|
name = category,
|
||||||
|
designs = list(),
|
||||||
|
)
|
||||||
|
for(var/datum/design/found_design in species_categories[category])
|
||||||
|
var/list/all_reagents = list()
|
||||||
|
for(var/reagent_typepath in found_design.reagents_list)
|
||||||
|
var/datum/reagent/reagent_id = find_reagent_object_from_type(reagent_typepath)
|
||||||
|
var/list/reagent_data = list(
|
||||||
|
name = reagent_id.name,
|
||||||
|
amount = (found_design.reagents_list[reagent_typepath] * production_coefficient),
|
||||||
|
)
|
||||||
|
all_reagents += list(reagent_data)
|
||||||
|
|
||||||
|
category_data["designs"] += list(list(
|
||||||
|
parent_category = category,
|
||||||
|
name = found_design.name,
|
||||||
|
id = found_design.id,
|
||||||
|
needed_reagents = all_reagents,
|
||||||
|
))
|
||||||
|
|
||||||
|
data["categories"] += list(category_data)
|
||||||
|
|
||||||
|
return data
|
||||||
|
|
||||||
/obj/machinery/limbgrower/on_deconstruction()
|
/obj/machinery/limbgrower/on_deconstruction()
|
||||||
for(var/obj/item/reagent_containers/glass/G in component_parts)
|
for(var/obj/item/reagent_containers/glass/our_beaker in component_parts)
|
||||||
reagents.trans_to(G, G.reagents.maximum_volume)
|
reagents.trans_to(our_beaker, our_beaker.reagents.maximum_volume)
|
||||||
..()
|
..()
|
||||||
|
|
||||||
/obj/machinery/limbgrower/attackby(obj/item/O, mob/user, params)
|
/obj/machinery/limbgrower/attackby(obj/item/user_item, mob/living/user, params)
|
||||||
if(busy)
|
if (busy)
|
||||||
to_chat(user, "<span class=\"alert\">\The [src] is busy. Please wait for completion of previous operation.</span>")
|
to_chat(user, "<span class=\"alert\">\The [src] is busy. Please wait for completion of previous operation.</span>")
|
||||||
return
|
return
|
||||||
|
|
||||||
if(default_deconstruction_screwdriver(user, "limbgrower_panelopen", "limbgrower_idleoff", O))
|
if(default_deconstruction_screwdriver(user, "limbgrower_panelopen", "limbgrower_idleoff", user_item))
|
||||||
updateUsrDialog()
|
ui_close(user)
|
||||||
return
|
return
|
||||||
|
|
||||||
if(panel_open && default_deconstruction_crowbar(O))
|
if(user_item.tool_behaviour == TOOL_WRENCH && panel_open)
|
||||||
return
|
|
||||||
|
|
||||||
if(user.a_intent == INTENT_HARM) //so we can hit the machine
|
|
||||||
return ..()
|
return ..()
|
||||||
|
|
||||||
if(istype(O, /obj/item/disk))
|
if(panel_open && default_deconstruction_crowbar(user_item))
|
||||||
|
return
|
||||||
|
|
||||||
|
if(istype(user_item, /obj/item/disk))
|
||||||
if(dna_disk)
|
if(dna_disk)
|
||||||
to_chat(user, "<span class='warning'>\The [src] already has a dna disk, take it out first!</span>")
|
to_chat(user, "<span class='warning'>\The [src] already has a dna disk, take it out first!</span>")
|
||||||
return
|
return
|
||||||
else
|
else
|
||||||
O.forceMove(src)
|
user_item.forceMove(src)
|
||||||
dna_disk = O
|
dna_disk = user_item
|
||||||
to_chat(user, "<span class='notice'>You insert \the [O] into \the [src].</span>")
|
to_chat(user, "<span class='notice'>You insert \the [user_item] into \the [src].</span>")
|
||||||
|
playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0)
|
||||||
return
|
return
|
||||||
|
|
||||||
/obj/machinery/limbgrower/Topic(href, href_list)
|
if(user.a_intent != INTENT_HELP)
|
||||||
if(..())
|
return ..()
|
||||||
|
|
||||||
|
/obj/machinery/limbgrower/proc/can_be_rotated()
|
||||||
|
if(panel_open)
|
||||||
|
return TRUE
|
||||||
|
return FALSE
|
||||||
|
|
||||||
|
/obj/machinery/limbgrower/ui_act(action, list/params)
|
||||||
|
. = ..()
|
||||||
|
if(.)
|
||||||
return
|
return
|
||||||
if (!busy)
|
|
||||||
if(href_list["menu"])
|
|
||||||
screen = text2num(href_list["menu"])
|
|
||||||
|
|
||||||
if(href_list["category"])
|
if (busy)
|
||||||
selected_category = href_list["category"]
|
to_chat(usr, "<span class='danger'>\The [src] is busy. Please wait for completion of previous operation.</span>")
|
||||||
|
return
|
||||||
|
|
||||||
if(href_list["disposeI"]) //Get rid of a reagent incase you add the wrong one by mistake
|
switch(action)
|
||||||
reagents.del_reagent(text2path(href_list["disposeI"]))
|
|
||||||
|
|
||||||
if(href_list["make"])
|
if("empty_reagent")
|
||||||
|
reagents.del_reagent(text2path(params["reagent_type"]))
|
||||||
|
. = TRUE
|
||||||
|
|
||||||
/////////////////
|
if("eject_disk")
|
||||||
//href protection
|
eject_disk(usr)
|
||||||
being_built = stored_research.isDesignResearchedID(href_list["make"]) //check if it's a valid design
|
|
||||||
|
if("make_limb")
|
||||||
|
being_built = stored_research.isDesignResearchedID(params["design_id"])
|
||||||
if(!being_built)
|
if(!being_built)
|
||||||
return
|
CRASH("[src] was passed an invalid design id!")
|
||||||
|
|
||||||
|
/// All the reagents we're using to make our organ.
|
||||||
|
var/list/consumed_reagents_list = being_built.reagents_list.Copy()
|
||||||
|
/// The amount of power we're going to use, based on how much reagent we use.
|
||||||
|
var/power = 0
|
||||||
|
|
||||||
var/synth_cost = being_built.reagents_list[/datum/reagent/medicine/synthflesh]*prod_coeff
|
for(var/reagent_id in consumed_reagents_list)
|
||||||
var/power = max(2000, synth_cost/5)
|
consumed_reagents_list[reagent_id] *= production_coefficient
|
||||||
|
if(!reagents.has_reagent(reagent_id, consumed_reagents_list[reagent_id]))
|
||||||
|
audible_message("<span class='notice'>\The [src] buzzes.</span>")
|
||||||
|
playsound(src, 'sound/machines/buzz-sigh.ogg', 50, FALSE)
|
||||||
|
return
|
||||||
|
|
||||||
if(reagents.has_reagent(/datum/reagent/medicine/synthflesh, being_built.reagents_list[/datum/reagent/medicine/synthflesh]*prod_coeff))
|
power = max(2000, (power + consumed_reagents_list[reagent_id]))
|
||||||
busy = TRUE
|
|
||||||
use_power(power)
|
|
||||||
flick("limbgrower_fill",src)
|
|
||||||
icon_state = "limbgrower_idleon"
|
|
||||||
addtimer(CALLBACK(src, .proc/build_item),32*prod_coeff)
|
|
||||||
|
|
||||||
if(href_list["dna_disk"])
|
busy = TRUE
|
||||||
var/mob/living/carbon/user = usr
|
use_power(power)
|
||||||
if(istype(user))
|
flick("limbgrower_fill",src)
|
||||||
if(!dna_disk)
|
icon_state = "limbgrower_idleon"
|
||||||
var/obj/item/disk/diskette = user.get_active_held_item()
|
selected_category = params["active_tab"]
|
||||||
if(istype(diskette))
|
addtimer(CALLBACK(src, .proc/build_item, consumed_reagents_list), production_speed * production_coefficient)
|
||||||
diskette.forceMove(src)
|
. = TRUE
|
||||||
dna_disk = diskette
|
|
||||||
to_chat(user, "<span class='notice'>You insert \the [diskette] into \the [src].</span>")
|
|
||||||
else
|
|
||||||
dna_disk.forceMove(src.loc)
|
|
||||||
user.put_in_active_hand(dna_disk)
|
|
||||||
to_chat(user, "<span class='notice'>You remove \the [dna_disk] from \the [src].</span>")
|
|
||||||
dna_disk = null
|
|
||||||
else
|
|
||||||
to_chat(user, "<span class='warning'>You are unable to grasp \the [dna_disk] disk from \the [src].</span>")
|
|
||||||
else
|
|
||||||
to_chat(usr, "<span class=\"alert\">\The [src] is busy. Please wait for completion of previous operation.</span>")
|
|
||||||
|
|
||||||
updateUsrDialog()
|
|
||||||
return
|
return
|
||||||
|
|
||||||
/obj/machinery/limbgrower/proc/build_item()
|
/*
|
||||||
if(reagents.has_reagent(/datum/reagent/medicine/synthflesh, being_built.reagents_list[/datum/reagent/medicine/synthflesh]*prod_coeff)) //sanity check, if this happens we are in big trouble
|
* The process of beginning to build a limb or organ.
|
||||||
reagents.remove_reagent(/datum/reagent/medicine/synthflesh, being_built.reagents_list[/datum/reagent/medicine/synthflesh]*prod_coeff)
|
* Goes through and sanity checks that we actually have enough reagent to build our item.
|
||||||
var/buildpath = being_built.build_path
|
* Then, remove those reagents from our reagents datum.
|
||||||
if(ispath(buildpath, /obj/item/bodypart)) //This feels like spaghetti code, but i need to initiliaze a limb somehow
|
*
|
||||||
build_limb(buildpath)
|
* After the reagents are handled, we can proceede with making the limb or organ. (Limbs are handled in a separate proc)
|
||||||
else if(ispath(buildpath, /obj/item/organ/genital)) //genitals are uhh... customizable
|
*
|
||||||
build_genital(buildpath)
|
* modified_consumed_reagents_list - the list of reagents we will consume on build, modified by the production coefficient.
|
||||||
else
|
*/
|
||||||
//Just build whatever it is
|
/obj/machinery/limbgrower/proc/build_item(list/modified_consumed_reagents_list)
|
||||||
new buildpath(loc)
|
for(var/reagent_id in modified_consumed_reagents_list)
|
||||||
else
|
if(!reagents.has_reagent(reagent_id, modified_consumed_reagents_list[reagent_id]))
|
||||||
src.visible_message("<span class=\"error\"> Something went very wrong and there isnt enough synthflesh anymore!</span>")
|
audible_message("<span class='notice'>\The [src] buzzes.</span>")
|
||||||
busy = FALSE
|
playsound(src, 'sound/machines/buzz-sigh.ogg', 50, FALSE)
|
||||||
flick("limbgrower_unfill",src)
|
break
|
||||||
icon_state = "limbgrower_idleoff"
|
|
||||||
updateUsrDialog()
|
|
||||||
|
|
||||||
/obj/machinery/limbgrower/proc/build_limb(buildpath)
|
reagents.remove_reagent(reagent_id, modified_consumed_reagents_list[reagent_id])
|
||||||
|
|
||||||
|
var/built_typepath = being_built.build_path
|
||||||
|
// If we have a bodypart, we need to initialize the limb on its own. Otherwise we can build it here.
|
||||||
|
if(ispath(built_typepath, /obj/item/bodypart))
|
||||||
|
build_limb(built_typepath)
|
||||||
|
else if(ispath(built_typepath, /obj/item/organ/genital)) //genitals are uhh... customizable
|
||||||
|
build_genital(built_typepath)
|
||||||
|
else
|
||||||
|
new built_typepath(loc)
|
||||||
|
|
||||||
|
busy = FALSE
|
||||||
|
flick("limbgrower_unfill", src)
|
||||||
|
icon_state = "limbgrower_idleoff"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The process of putting together a limb.
|
||||||
|
* This is called from after we remove the reagents, so this proc is just initializing the limb type.
|
||||||
|
*
|
||||||
|
* This proc handles skin / mutant color, greyscaling, names and descriptions, and various other limb creation steps.
|
||||||
|
*
|
||||||
|
* built_typepath - the path of the bodypart we're building.
|
||||||
|
*/
|
||||||
|
/obj/machinery/limbgrower/proc/build_limb(built_typepath)
|
||||||
//i need to create a body part manually using a set icon (otherwise it doesnt appear)
|
//i need to create a body part manually using a set icon (otherwise it doesnt appear)
|
||||||
var/obj/item/bodypart/limb
|
var/obj/item/bodypart/limb
|
||||||
var/datum/species/selected = stored_species[selected_category]
|
var/datum/species/selected = GLOB.species_datums[selected_category]
|
||||||
limb = new buildpath(loc)
|
limb = new built_typepath(loc)
|
||||||
limb.base_bp_icon = selected.icon_limbs || DEFAULT_BODYPART_ICON_ORGANIC
|
limb.base_bp_icon = selected.icon_limbs || DEFAULT_BODYPART_ICON_ORGANIC
|
||||||
limb.species_id = selected.limbs_id
|
limb.species_id = selected.limbs_id
|
||||||
limb.color_src = (MUTCOLORS in selected.species_traits ? MUTCOLORS : (selected.use_skintones ? SKINTONE : FALSE))
|
limb.color_src = (MUTCOLORS in selected.species_traits ? MUTCOLORS : (selected.use_skintones ? SKINTONE : FALSE))
|
||||||
@@ -189,135 +259,103 @@
|
|||||||
BP.name = "\improper synthetic [lowertext(selected.name)] [limb.name]"
|
BP.name = "\improper synthetic [lowertext(selected.name)] [limb.name]"
|
||||||
BP.desc = "A synthetic [selected_category] limb that will morph on its first use in surgery. This one is for the [parse_zone(limb.body_zone)]."
|
BP.desc = "A synthetic [selected_category] limb that will morph on its first use in surgery. This one is for the [parse_zone(limb.body_zone)]."
|
||||||
|
|
||||||
/obj/machinery/limbgrower/proc/build_genital(buildpath)
|
/*
|
||||||
|
* Builds genitals, modifies to be the same
|
||||||
|
* as the person's cloning data on the data disk
|
||||||
|
*/
|
||||||
|
/obj/machinery/limbgrower/proc/build_genital(built_typepath)
|
||||||
//i needed to create a way to customize gene tools using dna
|
//i needed to create a way to customize gene tools using dna
|
||||||
var/list/features = dna_disk?.fields["features"]
|
var/list/features = dna_disk?.fields["features"]
|
||||||
if(length(features))
|
if(length(features))
|
||||||
switch(buildpath)
|
switch(built_typepath)
|
||||||
if(/obj/item/organ/genital/penis)
|
if(/obj/item/organ/genital/penis)
|
||||||
var/obj/item/organ/genital/penis/penis = new(loc)
|
var/obj/item/organ/genital/penis/penis = new(loc)
|
||||||
if(features["has_cock"])
|
if(features["has_cock"])
|
||||||
penis.shape = features["cock_shape"]
|
penis.shape = features["cock_shape"]
|
||||||
penis.length = features["cock_shape"]
|
penis.length = features["cock_shape"]
|
||||||
penis.diameter_ratio = features["cock_diameter_ratio"]
|
penis.diameter_ratio = features["cock_diameter_ratio"]
|
||||||
penis.color = sanitize_hexcolor(features["cock_color"], 6)
|
penis.color = sanitize_hexcolor(features["cock_color"], 6, TRUE)
|
||||||
penis.update_icon()
|
penis.update()
|
||||||
if(/obj/item/organ/genital/testicles)
|
if(/obj/item/organ/genital/testicles)
|
||||||
var/obj/item/organ/genital/testicles/balls = new(loc)
|
var/obj/item/organ/genital/testicles/balls = new(loc)
|
||||||
if(features["has_balls"])
|
if(features["has_balls"])
|
||||||
balls.color = sanitize_hexcolor(features["balls_color"], 6)
|
balls.color = sanitize_hexcolor(features["balls_color"], 6, TRUE)
|
||||||
balls.shape = features["balls_shape"]
|
balls.shape = features["balls_shape"]
|
||||||
balls.size = features["balls_size"]
|
balls.size = features["balls_size"]
|
||||||
balls.fluid_rate = features["balls_cum_rate"]
|
balls.fluid_rate = features["balls_cum_rate"]
|
||||||
balls.fluid_mult = features["balls_cum_mult"]
|
balls.fluid_mult = features["balls_cum_mult"]
|
||||||
balls.fluid_efficiency = features["balls_efficiency"]
|
balls.fluid_efficiency = features["balls_efficiency"]
|
||||||
|
balls.update()
|
||||||
if(/obj/item/organ/genital/vagina)
|
if(/obj/item/organ/genital/vagina)
|
||||||
var/obj/item/organ/genital/vagina/vegana = new(loc)
|
var/obj/item/organ/genital/vagina/vegana = new(loc)
|
||||||
if(features["has_vagina"])
|
if(features["has_vag"])
|
||||||
vegana.color = sanitize_hexcolor(features["vag_color"], 6)
|
vegana.color = sanitize_hexcolor(features["vag_color"], 6, TRUE)
|
||||||
vegana.shape = features["vag_shape"]
|
vegana.shape = features["vag_shape"]
|
||||||
|
vegana.update()
|
||||||
if(/obj/item/organ/genital/breasts)
|
if(/obj/item/organ/genital/breasts)
|
||||||
var/obj/item/organ/genital/breasts/boobs = new(loc)
|
var/obj/item/organ/genital/breasts/boobs = new(loc)
|
||||||
if(features["has_breasts"])
|
if(features["has_breasts"])
|
||||||
boobs.color = sanitize_hexcolor(features["breasts_color"], 6)
|
boobs.color = sanitize_hexcolor(features["breasts_color"], 6, TRUE)
|
||||||
boobs.size = features["breasts_size"]
|
boobs.size = features["breasts_size"]
|
||||||
boobs.shape = features["breasts_shape"]
|
boobs.shape = features["breasts_shape"]
|
||||||
if(!features["breasts_producing"])
|
if(!features["breasts_producing"])
|
||||||
boobs.genital_flags &= ~(GENITAL_FUID_PRODUCTION|CAN_CLIMAX_WITH|CAN_MASTURBATE_WITH)
|
boobs.genital_flags &= ~(GENITAL_FUID_PRODUCTION|CAN_CLIMAX_WITH|CAN_MASTURBATE_WITH)
|
||||||
|
boobs.update()
|
||||||
else
|
else
|
||||||
new buildpath(loc)
|
new built_typepath(loc)
|
||||||
else
|
else
|
||||||
new buildpath(loc)
|
new built_typepath(loc)
|
||||||
|
|
||||||
/obj/machinery/limbgrower/RefreshParts()
|
/obj/machinery/limbgrower/RefreshParts()
|
||||||
reagents.maximum_volume = 0
|
reagents.maximum_volume = 0
|
||||||
for(var/obj/item/reagent_containers/glass/G in component_parts)
|
for(var/obj/item/reagent_containers/glass/our_beaker in component_parts)
|
||||||
reagents.maximum_volume += G.volume
|
reagents.maximum_volume += our_beaker.volume
|
||||||
G.reagents.trans_to(src, G.reagents.total_volume)
|
our_beaker.reagents.trans_to(src, our_beaker.reagents.total_volume)
|
||||||
var/T=1.2
|
production_coefficient = 1.2
|
||||||
for(var/obj/item/stock_parts/manipulator/M in component_parts)
|
for(var/obj/item/stock_parts/manipulator/our_manipulator in component_parts)
|
||||||
T -= M.rating*0.2
|
production_coefficient -= our_manipulator.rating * 0.2
|
||||||
prod_coeff = min(1,max(0,T)) // Coeff going 1 -> 0,8 -> 0,6 -> 0,4
|
production_coefficient = clamp(production_coefficient, 0, 1) // coefficient goes from 1 -> 0.8 -> 0.6 -> 0.4
|
||||||
|
|
||||||
/obj/machinery/limbgrower/examine(mob/user)
|
/obj/machinery/limbgrower/examine(mob/user)
|
||||||
. = ..()
|
. = ..()
|
||||||
|
if(!panel_open)
|
||||||
|
. += "<span class='notice'>It looks like as if the panel were open you could rotate it with a <b>wrench</b>.</span>"
|
||||||
|
else
|
||||||
|
. += "<span class='notice'>The panel is open.</span>"
|
||||||
if(in_range(user, src) || isobserver(user))
|
if(in_range(user, src) || isobserver(user))
|
||||||
. += "<span class='notice'>The status display reads: Storing up to <b>[reagents.maximum_volume]u</b> of synthflesh.<br>Synthflesh consumption at <b>[prod_coeff*100]%</b>.<span>"
|
. += "<span class='notice'>The status display reads: Storing up to <b>[reagents.maximum_volume]u</b> of reagents.<br>Reagent consumption rate at <b>[production_coefficient * 100]%</b>.</span>"
|
||||||
|
|
||||||
/obj/machinery/limbgrower/proc/main_win(mob/user)
|
/*
|
||||||
var/dat = "<div class='statusDisplay'><h3>[src] Menu:</h3><br>"
|
* Checks our reagent list to see if a design can be built.
|
||||||
dat += "<A href='?src=[REF(src)];dna_disk=1'>[dna_disk ? "Remove" : "Insert"] cloning data disk</A>"
|
*
|
||||||
dat += "<hr>"
|
* limb_design - the design we're checking for buildability.
|
||||||
dat += "<A href='?src=[REF(src)];menu=[LIMBGROWER_CHEMICAL_MENU]'>Chemical Storage</A>"
|
*
|
||||||
dat += materials_printout()
|
* returns TRUE if we have enough reagent to build it. Returns FALSE if we do not.
|
||||||
dat += "<table style='width:100%' align='center'><tr>"
|
*/
|
||||||
|
/obj/machinery/limbgrower/proc/can_build(datum/design/limb_design)
|
||||||
for(var/C in categories)
|
for(var/datum/reagent/reagent_id in limb_design.reagents_list)
|
||||||
dat += "<td><A href='?src=[REF(src)];category=[C];menu=[LIMBGROWER_CATEGORY_MENU]'>[C]</A></td>"
|
if(!reagents.has_reagent(reagent_id, limb_design.reagents_list[reagent_id] * production_coefficient))
|
||||||
dat += "</tr><tr>"
|
return FALSE
|
||||||
//one category per line
|
return TRUE
|
||||||
|
|
||||||
dat += "</tr></table></div>"
|
|
||||||
return dat
|
|
||||||
|
|
||||||
/obj/machinery/limbgrower/proc/category_win(mob/user,selected_category)
|
|
||||||
var/dat = "<A href='?src=[REF(src)];menu=[LIMBGROWER_MAIN_MENU]'>Return to main menu</A>"
|
|
||||||
dat += "<div class='statusDisplay'><h3>Browsing [selected_category]:</h3><br>"
|
|
||||||
dat += materials_printout()
|
|
||||||
|
|
||||||
for(var/v in stored_research.researched_designs)
|
|
||||||
var/datum/design/D = SSresearch.techweb_design_by_id(v)
|
|
||||||
if(!(selected_category in D.category))
|
|
||||||
continue
|
|
||||||
if(disabled || !can_build(D))
|
|
||||||
dat += "<span class='linkOff'>[D.name]</span>"
|
|
||||||
else
|
|
||||||
dat += "<a href='?src=[REF(src)];make=[D.id];multiplier=1'>[D.name]</a>"
|
|
||||||
dat += "[get_design_cost(D)]<br>"
|
|
||||||
|
|
||||||
dat += "</div>"
|
|
||||||
return dat
|
|
||||||
|
|
||||||
|
|
||||||
/obj/machinery/limbgrower/proc/chemical_win(mob/user)
|
|
||||||
var/dat = "<A href='?src=[REF(src)];menu=[LIMBGROWER_MAIN_MENU]'>Return to main menu</A>"
|
|
||||||
dat += "<div class='statusDisplay'><h3>Browsing Chemical Storage:</h3><br>"
|
|
||||||
dat += materials_printout()
|
|
||||||
|
|
||||||
for(var/datum/reagent/R in reagents.reagent_list)
|
|
||||||
dat += "[R.name]: [R.volume]"
|
|
||||||
dat += "<A href='?src=[REF(src)];disposeI=[R]'>Purge</A><BR>"
|
|
||||||
|
|
||||||
dat += "</div>"
|
|
||||||
return dat
|
|
||||||
|
|
||||||
/obj/machinery/limbgrower/proc/materials_printout()
|
|
||||||
var/dat = "<b>Total amount:></b> [reagents.total_volume] / [reagents.maximum_volume] cm<sup>3</sup><br>"
|
|
||||||
return dat
|
|
||||||
|
|
||||||
/obj/machinery/limbgrower/proc/can_build(datum/design/D)
|
|
||||||
return (reagents.has_reagent(/datum/reagent/medicine/synthflesh, D.reagents_list[/datum/reagent/medicine/synthflesh]*prod_coeff)) //Return whether the machine has enough synthflesh to produce the design
|
|
||||||
|
|
||||||
/obj/machinery/limbgrower/proc/get_design_cost(datum/design/D)
|
|
||||||
var/dat
|
|
||||||
if(D.reagents_list[/datum/reagent/medicine/synthflesh])
|
|
||||||
dat += "[D.reagents_list[/datum/reagent/medicine/synthflesh] * prod_coeff] Synthetic flesh "
|
|
||||||
return dat
|
|
||||||
|
|
||||||
|
/// Emagging a limbgrower allows you to build synthetic armblades.
|
||||||
/obj/machinery/limbgrower/emag_act(mob/user)
|
/obj/machinery/limbgrower/emag_act(mob/user)
|
||||||
. = ..()
|
. = ..()
|
||||||
if(obj_flags & EMAGGED)
|
if(obj_flags & EMAGGED)
|
||||||
return
|
return
|
||||||
for(var/id in SSresearch.techweb_designs)
|
for(var/design_id in SSresearch.techweb_designs)
|
||||||
var/datum/design/D = SSresearch.techweb_design_by_id(id)
|
var/datum/design/found_design = SSresearch.techweb_design_by_id(design_id)
|
||||||
if((D.build_type & LIMBGROWER) && ("emagged" in D.category))
|
if((found_design.build_type & LIMBGROWER) && ("emagged" in found_design.category))
|
||||||
stored_research.add_design(D)
|
stored_research.add_design(found_design)
|
||||||
to_chat(user, "<span class='warning'>A warning flashes onto the screen, stating that safety overrides have been deactivated!</span>")
|
to_chat(user, "<span class='warning'>A warning flashes onto the screen, stating that safety overrides have been deactivated!</span>")
|
||||||
obj_flags |= EMAGGED
|
obj_flags |= EMAGGED
|
||||||
return TRUE
|
update_static_data(user)
|
||||||
|
|
||||||
/obj/machinery/limbgrower/AltClick(mob/living/user)
|
/obj/machinery/limbgrower/AltClick(mob/living/user)
|
||||||
. = ..()
|
. = ..()
|
||||||
|
eject_disk(user)
|
||||||
|
|
||||||
|
/obj/machinery/limbgrower/proc/eject_disk(mob/user)
|
||||||
if(istype(user) && user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
|
if(istype(user) && user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
|
||||||
if(busy)
|
if(busy)
|
||||||
to_chat(user, "<span class=\"alert\">\The [src] is busy. Please wait for completion of previous operation.</span>")
|
to_chat(user, "<span class=\"alert\">\The [src] is busy. Please wait for completion of previous operation.</span>")
|
||||||
@@ -326,6 +364,7 @@
|
|||||||
dna_disk.forceMove(src.loc)
|
dna_disk.forceMove(src.loc)
|
||||||
user.put_in_active_hand(dna_disk)
|
user.put_in_active_hand(dna_disk)
|
||||||
to_chat(user, "<span class='notice'>You remove \the [dna_disk] from \the [src].</span>")
|
to_chat(user, "<span class='notice'>You remove \the [dna_disk] from \the [src].</span>")
|
||||||
|
playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0)
|
||||||
dna_disk = null
|
dna_disk = null
|
||||||
else
|
else
|
||||||
to_chat(user, "<span class='warning'>\The [src] has doesn't have a disk on it!")
|
to_chat(user, "<span class='warning'>\The [src] has doesn't have a disk on it!")
|
||||||
|
|||||||
@@ -157,7 +157,7 @@
|
|||||||
to_chat(user, "<span class='notice'>You need to get closer!</span>")
|
to_chat(user, "<span class='notice'>You need to get closer!</span>")
|
||||||
return
|
return
|
||||||
if(use_paint(user) && isturf(F))
|
if(use_paint(user) && isturf(F))
|
||||||
F.AddElement(/datum/element/decal, 'icons/turf/decals.dmi', stored_decal_total, turn(stored_dir, -dir2angle(F.dir)), CLEAN_STRONG, color, null, null, alpha)
|
F.AddElement(/datum/element/decal, 'icons/turf/decals.dmi', stored_decal_total, stored_dir, CLEAN_STRONG, color, null, null, alpha)
|
||||||
|
|
||||||
/obj/item/airlock_painter/decal/attack_self(mob/user)
|
/obj/item/airlock_painter/decal/attack_self(mob/user)
|
||||||
if((ink) && (ink.charges >= 1))
|
if((ink) && (ink.charges >= 1))
|
||||||
@@ -180,6 +180,11 @@
|
|||||||
stored_decal_total = "[stored_decal][yellow_fix][stored_color]"
|
stored_decal_total = "[stored_decal][yellow_fix][stored_color]"
|
||||||
return
|
return
|
||||||
|
|
||||||
|
/obj/item/airlock_painter/decal/ui_assets(mob/user)
|
||||||
|
return list(
|
||||||
|
get_asset_datum(/datum/asset/spritesheet/decals)
|
||||||
|
)
|
||||||
|
|
||||||
/obj/item/airlock_painter/decal/ui_interact(mob/user, datum/tgui/ui)
|
/obj/item/airlock_painter/decal/ui_interact(mob/user, datum/tgui/ui)
|
||||||
ui = SStgui.try_update_ui(user, src, ui)
|
ui = SStgui.try_update_ui(user, src, ui)
|
||||||
if(!ui)
|
if(!ui)
|
||||||
@@ -189,6 +194,7 @@
|
|||||||
/obj/item/airlock_painter/decal/ui_data(mob/user)
|
/obj/item/airlock_painter/decal/ui_data(mob/user)
|
||||||
var/list/data = list()
|
var/list/data = list()
|
||||||
data["decal_direction"] = stored_dir
|
data["decal_direction"] = stored_dir
|
||||||
|
data["decal_dir_text"] = dir2text(stored_dir)
|
||||||
data["decal_color"] = stored_color
|
data["decal_color"] = stored_color
|
||||||
data["decal_style"] = stored_decal
|
data["decal_style"] = stored_decal
|
||||||
data["decal_list"] = list()
|
data["decal_list"] = list()
|
||||||
|
|||||||
@@ -75,18 +75,3 @@
|
|||||||
desc = "A chromosome that reduces action based mutation cooldowns by by 50%."
|
desc = "A chromosome that reduces action based mutation cooldowns by by 50%."
|
||||||
icon_state = "energy"
|
icon_state = "energy"
|
||||||
energy_coeff = 0.5
|
energy_coeff = 0.5
|
||||||
|
|
||||||
/obj/item/chromosome/reinforcer
|
|
||||||
name = "reinforcement chromosome"
|
|
||||||
desc = "A chromosome that renders mutations immune to mutadone."
|
|
||||||
icon_state = "reinforcer"
|
|
||||||
weight = 3
|
|
||||||
|
|
||||||
/obj/item/chromosome/reinforcer/can_apply(datum/mutation/human/HM)
|
|
||||||
if(!HM || !(HM.can_chromosome == CHROMOSOME_NONE))
|
|
||||||
return FALSE
|
|
||||||
return !HM.mutadone_proof
|
|
||||||
|
|
||||||
/obj/item/chromosome/reinforcer/apply(datum/mutation/human/HM)
|
|
||||||
HM.mutadone_proof = TRUE
|
|
||||||
..()
|
|
||||||
|
|||||||
@@ -135,8 +135,8 @@
|
|||||||
/obj/item/organ/cyberimp/arm/toolset,
|
/obj/item/organ/cyberimp/arm/toolset,
|
||||||
/obj/item/organ/cyberimp/arm/surgery,
|
/obj/item/organ/cyberimp/arm/surgery,
|
||||||
/obj/item/organ/cyberimp/chest/thrusters,
|
/obj/item/organ/cyberimp/chest/thrusters,
|
||||||
/obj/item/organ/lungs/cybernetic,
|
/obj/item/organ/lungs/cybernetic/tier3,
|
||||||
/obj/item/organ/liver/cybernetic) //cyberimplants range from a nice bonus to fucking broken bullshit so no subtypesof
|
/obj/item/organ/liver/cybernetic/tier3) //cyberimplants range from a nice bonus to fucking broken bullshit so no subtypesof
|
||||||
for(var/V in templist)
|
for(var/V in templist)
|
||||||
var/atom/A = V
|
var/atom/A = V
|
||||||
augment_list[initial(A.name)] = A
|
augment_list[initial(A.name)] = A
|
||||||
|
|||||||
@@ -352,6 +352,14 @@
|
|||||||
InsertAll("", each, GLOB.alldirs)
|
InsertAll("", each, GLOB.alldirs)
|
||||||
..()
|
..()
|
||||||
|
|
||||||
|
/datum/asset/spritesheet/decals
|
||||||
|
name = "decals"
|
||||||
|
|
||||||
|
/datum/asset/spritesheet/decals/register()
|
||||||
|
for(var/each in list('icons/turf/decals.dmi'))
|
||||||
|
InsertAll("", each, GLOB.alldirs)
|
||||||
|
..()
|
||||||
|
|
||||||
/datum/asset/spritesheet/supplypods
|
/datum/asset/spritesheet/supplypods
|
||||||
name = "supplypods"
|
name = "supplypods"
|
||||||
|
|
||||||
|
|||||||
@@ -75,7 +75,7 @@
|
|||||||
cost = 250
|
cost = 250
|
||||||
unit_name = "heart"
|
unit_name = "heart"
|
||||||
export_types = list(/obj/item/organ/heart)
|
export_types = list(/obj/item/organ/heart)
|
||||||
exclude_types = list(/obj/item/organ/heart/cursed, /obj/item/organ/heart/cybernetic)
|
exclude_types = list(/obj/item/organ/heart/cursed, /obj/item/organ/heart/cybernetic/tier2, /obj/item/organ/heart/cybernetic/tier3)
|
||||||
|
|
||||||
/datum/export/organs/tongue
|
/datum/export/organs/tongue
|
||||||
cost = 75
|
cost = 75
|
||||||
@@ -92,29 +92,30 @@
|
|||||||
cost = 50 //can be replaced
|
cost = 50 //can be replaced
|
||||||
unit_name = "stomach"
|
unit_name = "stomach"
|
||||||
export_types = list(/obj/item/organ/stomach)
|
export_types = list(/obj/item/organ/stomach)
|
||||||
|
exclude_types = list(/obj/item/organ/stomach/cybernetic/tier2, /obj/item/organ/stomach/cybernetic/tier3)
|
||||||
|
|
||||||
/datum/export/organs/lungs
|
/datum/export/organs/lungs
|
||||||
cost = 150
|
cost = 150
|
||||||
unit_name = "lungs"
|
unit_name = "lungs"
|
||||||
export_types = list(/obj/item/organ/lungs)
|
export_types = list(/obj/item/organ/lungs,)
|
||||||
exclude_types = list(/obj/item/organ/lungs/cybernetic, /obj/item/organ/lungs/cybernetic/upgraded)
|
exclude_types = list(/obj/item/organ/lungs/cybernetic/tier2, /obj/item/organ/lungs/cybernetic/tier3)
|
||||||
|
|
||||||
/datum/export/organs/liver
|
/datum/export/organs/liver
|
||||||
cost = 175
|
cost = 175
|
||||||
unit_name = "liver"
|
unit_name = "liver"
|
||||||
export_types = list(/obj/item/organ/liver)
|
export_types = list(/obj/item/organ/liver)
|
||||||
exclude_types = list(/obj/item/organ/liver/cybernetic, /obj/item/organ/liver/cybernetic/upgraded)
|
exclude_types = list(/obj/item/organ/liver/cybernetic/tier2, /obj/item/organ/liver/cybernetic/tier3)
|
||||||
|
|
||||||
/datum/export/organs/cybernetic
|
/datum/export/organs/cybernetic
|
||||||
cost = 225
|
cost = 225
|
||||||
unit_name = "cybernetic organ"
|
unit_name = "cybernetic organ"
|
||||||
export_types = list(/obj/item/organ/liver/cybernetic, /obj/item/organ/lungs/cybernetic, /obj/item/organ/eyes/robotic, /obj/item/organ/heart/cybernetic)
|
export_types = list(/obj/item/organ/liver/cybernetic/tier2, /obj/item/organ/lungs/cybernetic/tier2, /obj/item/organ/eyes/robotic/shield, /obj/item/organ/eyes/robotic/glow, /obj/item/organ/stomach/cybernetic/tier2, /obj/item/organ/heart/cybernetic/tier2)
|
||||||
exclude_types = list(/obj/item/organ/lungs/cybernetic/upgraded, /obj/item/organ/liver/cybernetic/upgraded)
|
exclude_types = list(/obj/item/organ/liver/cybernetic/tier3, /obj/item/organ/lungs/cybernetic/tier3, /obj/item/organ/eyes/robotic/xray, /obj/item/organ/eyes/robotic/thermals, /obj/item/organ/stomach/cybernetic/tier3, /obj/item/organ/heart/cybernetic/tier3)
|
||||||
|
|
||||||
/datum/export/organs/upgraded
|
/datum/export/organs/upgraded
|
||||||
cost = 275
|
cost = 275
|
||||||
unit_name = "upgraded cybernetic organ"
|
unit_name = "upgraded cybernetic organ"
|
||||||
export_types = list(/obj/item/organ/lungs/cybernetic/upgraded, /obj/item/organ/liver/cybernetic/upgraded)
|
export_types = list(/obj/item/organ/liver/cybernetic/tier3, /obj/item/organ/lungs/cybernetic/tier3, /obj/item/organ/eyes/robotic/xray, /obj/item/organ/eyes/robotic/thermals, /obj/item/organ/stomach/cybernetic/tier3, /obj/item/organ/heart/cybernetic/tier3)
|
||||||
|
|
||||||
/datum/export/organs/tail // yeah have fun pulling this off someone without catching a bwoink
|
/datum/export/organs/tail // yeah have fun pulling this off someone without catching a bwoink
|
||||||
cost = 500
|
cost = 500
|
||||||
|
|||||||
@@ -80,15 +80,15 @@
|
|||||||
|
|
||||||
/datum/supply_pack/security/russianclothing
|
/datum/supply_pack/security/russianclothing
|
||||||
name = "Russian Surplus Clothing"
|
name = "Russian Surplus Clothing"
|
||||||
desc = "An old russian crate full of surplus armor that they used to use! Has two sets of bulletproff armor, a few union suits and some warm hats!"
|
desc = "An old russian crate full of surplus armor that they used to use! Has two sets of bulletproof armor, a few union suits and some warm hats!"
|
||||||
contraband = TRUE
|
contraband = TRUE
|
||||||
cost = 5750 // Its basicly sec suits, good boots/gloves
|
cost = 5750 // Its basicly sec suits, good boots/gloves
|
||||||
contains = list(/obj/item/clothing/suit/armor/navyblue/russian,
|
contains = list(/obj/item/clothing/under/syndicate/rus_army,
|
||||||
/obj/item/clothing/suit/armor/navyblue/russian,
|
/obj/item/clothing/under/syndicate/rus_army,
|
||||||
/obj/item/clothing/shoes/combat,
|
/obj/item/clothing/shoes/combat,
|
||||||
/obj/item/clothing/shoes/combat,
|
/obj/item/clothing/shoes/combat,
|
||||||
/obj/item/clothing/head/ushanka,
|
/obj/item/clothing/head/helmet/rus_helmet,
|
||||||
/obj/item/clothing/head/ushanka,
|
/obj/item/clothing/head/helmet/rus_helmet,
|
||||||
/obj/item/clothing/suit/armor/bulletproof,
|
/obj/item/clothing/suit/armor/bulletproof,
|
||||||
/obj/item/clothing/suit/armor/bulletproof,
|
/obj/item/clothing/suit/armor/bulletproof,
|
||||||
/obj/item/clothing/head/helmet/alt,
|
/obj/item/clothing/head/helmet/alt,
|
||||||
@@ -98,23 +98,21 @@
|
|||||||
/obj/item/clothing/mask/gas,
|
/obj/item/clothing/mask/gas,
|
||||||
/obj/item/clothing/mask/gas)
|
/obj/item/clothing/mask/gas)
|
||||||
crate_name = "surplus russian clothing"
|
crate_name = "surplus russian clothing"
|
||||||
crate_type = /obj/structure/closet/crate/internals
|
|
||||||
|
|
||||||
/datum/supply_pack/security/russian_partisan
|
/datum/supply_pack/security/russian_partisan
|
||||||
name = "Russian Partisan Gear"
|
name = "Russian Partisan Gear"
|
||||||
desc = "An old russian partisan equipment crate, comes with a full russian outfit, a loaded surplus rifle and a second magazine."
|
desc = "An old russian partisan equipment crate, comes with a full russian outfit, a loaded surplus rifle and a second magazine."
|
||||||
contraband = TRUE
|
contraband = TRUE
|
||||||
access = FALSE
|
|
||||||
cost = 6500
|
cost = 6500
|
||||||
contains = list(/obj/item/clothing/suit/armor/navyblue/russian,
|
contains = list(/obj/item/clothing/suit/armor/navyblue/russian,
|
||||||
/obj/item/clothing/shoes/combat,
|
/obj/item/clothing/shoes/combat,
|
||||||
/obj/item/clothing/head/ushanka,
|
/obj/item/clothing/head/helmet/rus_helmet,
|
||||||
/obj/item/clothing/suit/armor/bulletproof,
|
/obj/item/clothing/suit/armor/bulletproof,
|
||||||
/obj/item/clothing/head/helmet/alt,
|
/obj/item/clothing/head/helmet/alt,
|
||||||
/obj/item/clothing/gloves/tackler/combat/insulated,
|
/obj/item/clothing/gloves/tackler/combat/insulated,
|
||||||
|
/obj/item/clothing/under/syndicate/rus_army,
|
||||||
/obj/item/clothing/mask/gas)
|
/obj/item/clothing/mask/gas)
|
||||||
crate_name = "surplus russian gear"
|
crate_name = "surplus russian gear"
|
||||||
crate_type = /obj/structure/closet/crate/internals
|
|
||||||
|
|
||||||
/datum/supply_pack/security/russian_partisan/fill(obj/structure/closet/crate/C)
|
/datum/supply_pack/security/russian_partisan/fill(obj/structure/closet/crate/C)
|
||||||
..()
|
..()
|
||||||
@@ -241,7 +239,7 @@
|
|||||||
access = FALSE
|
access = FALSE
|
||||||
access_any = list(ACCESS_SECURITY, ACCESS_FORENSICS_LOCKERS)
|
access_any = list(ACCESS_SECURITY, ACCESS_FORENSICS_LOCKERS)
|
||||||
contains = list(/obj/item/ammo_box/c38/dumdum)
|
contains = list(/obj/item/ammo_box/c38/dumdum)
|
||||||
crate_name = ".38 match crate"
|
crate_name = ".38 dumdum crate"
|
||||||
|
|
||||||
/datum/supply_pack/security/match
|
/datum/supply_pack/security/match
|
||||||
name = ".38 Match Grade Speedloader"
|
name = ".38 Match Grade Speedloader"
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
set desc = "Authorizes your account in the panic bunker of any servers connected to this function."
|
set desc = "Authorizes your account in the panic bunker of any servers connected to this function."
|
||||||
set category = "OOC"
|
set category = "OOC"
|
||||||
|
|
||||||
if(!(prefs.db_flags & DB_FLAG_AGE_CONFIRMATION_INCOMPLETE))
|
if(prefs.db_flags & DB_FLAG_AGE_CONFIRMATION_INCOMPLETE)
|
||||||
to_chat(src, "<span class='danger'>You are not age verified.</span>")
|
to_chat(src, "<span class='danger'>You are not age verified.</span>")
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|||||||
@@ -358,6 +358,12 @@
|
|||||||
..()
|
..()
|
||||||
user.cure_blind("blindfold_[REF(src)]")
|
user.cure_blind("blindfold_[REF(src)]")
|
||||||
|
|
||||||
|
/obj/item/clothing/glasses/fakeblindfold
|
||||||
|
name = "thin blindfold"
|
||||||
|
desc = "Covers the eyes, but not thick enough to obscure vision. Mostly for aesthetic."
|
||||||
|
icon_state = "blindfoldwhite"
|
||||||
|
item_state = "blindfoldwhite"
|
||||||
|
|
||||||
/obj/item/clothing/glasses/sunglasses/blindfold/white
|
/obj/item/clothing/glasses/sunglasses/blindfold/white
|
||||||
name = "blind personnel blindfold"
|
name = "blind personnel blindfold"
|
||||||
desc = "Indicates that the wearer suffers from blindness."
|
desc = "Indicates that the wearer suffers from blindness."
|
||||||
|
|||||||
@@ -443,7 +443,7 @@ Difficulty: Hard
|
|||||||
charge(chargeat, delay, chargepast)
|
charge(chargeat, delay, chargepast)
|
||||||
|
|
||||||
/mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination
|
/mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination
|
||||||
name = "bubblegum's hallucination"
|
name = "Bubblegum's hallucination"
|
||||||
desc = "Is that really just a hallucination?"
|
desc = "Is that really just a hallucination?"
|
||||||
health = 1
|
health = 1
|
||||||
maxHealth = 1
|
maxHealth = 1
|
||||||
|
|||||||
@@ -25,7 +25,7 @@
|
|||||||
/obj/item/ammo_casing/chemgun
|
/obj/item/ammo_casing/chemgun
|
||||||
name = "dart synthesiser"
|
name = "dart synthesiser"
|
||||||
desc = "A high-power spring, linked to an energy-based dart synthesiser."
|
desc = "A high-power spring, linked to an energy-based dart synthesiser."
|
||||||
projectile_type = /obj/item/projectile/bullet/dart
|
projectile_type = /obj/item/projectile/bullet/dart/piercing
|
||||||
firing_effect_type = null
|
firing_effect_type = null
|
||||||
|
|
||||||
/obj/item/ammo_casing/chemgun/ready_proj(atom/target, mob/living/user, quiet, zone_override = "")
|
/obj/item/ammo_casing/chemgun/ready_proj(atom/target, mob/living/user, quiet, zone_override = "")
|
||||||
@@ -35,7 +35,7 @@
|
|||||||
var/obj/item/gun/chem/CG = loc
|
var/obj/item/gun/chem/CG = loc
|
||||||
if(CG.syringes_left <= 0)
|
if(CG.syringes_left <= 0)
|
||||||
return
|
return
|
||||||
CG.reagents.trans_to(BB, 15)
|
CG.reagents.trans_to(BB, 10)
|
||||||
BB.name = "chemical dart"
|
BB.name = "chemical dart"
|
||||||
CG.syringes_left--
|
CG.syringes_left--
|
||||||
..()
|
..()
|
||||||
|
|||||||
@@ -407,11 +407,11 @@
|
|||||||
fire_sound = 'sound/weapons/rifleshot.ogg'
|
fire_sound = 'sound/weapons/rifleshot.ogg'
|
||||||
weapon_weight = WEAPON_HEAVY
|
weapon_weight = WEAPON_HEAVY
|
||||||
mag_type = /obj/item/ammo_box/magazine/m10mm/rifle
|
mag_type = /obj/item/ammo_box/magazine/m10mm/rifle
|
||||||
fire_delay = 30
|
fire_delay = 10
|
||||||
burst_size = 1
|
burst_size = 1
|
||||||
can_unsuppress = TRUE
|
can_unsuppress = TRUE
|
||||||
can_suppress = TRUE
|
can_suppress = TRUE
|
||||||
w_class = WEIGHT_CLASS_HUGE
|
w_class = WEIGHT_CLASS_BULKY
|
||||||
slot_flags = ITEM_SLOT_BACK
|
slot_flags = ITEM_SLOT_BACK
|
||||||
automatic_burst_overlay = FALSE
|
automatic_burst_overlay = FALSE
|
||||||
actions_types = list()
|
actions_types = list()
|
||||||
|
|||||||
@@ -13,9 +13,9 @@
|
|||||||
custom_materials = list(/datum/material/iron=2000)
|
custom_materials = list(/datum/material/iron=2000)
|
||||||
clumsy_check = FALSE
|
clumsy_check = FALSE
|
||||||
fire_sound = 'sound/items/syringeproj.ogg'
|
fire_sound = 'sound/items/syringeproj.ogg'
|
||||||
var/time_per_syringe = 250
|
var/time_per_syringe = 300
|
||||||
var/syringes_left = 4
|
var/syringes_left = 5
|
||||||
var/max_syringes = 4
|
var/max_syringes = 5
|
||||||
var/last_synth = 0
|
var/last_synth = 0
|
||||||
|
|
||||||
/obj/item/gun/chem/Initialize()
|
/obj/item/gun/chem/Initialize()
|
||||||
|
|||||||
@@ -644,66 +644,109 @@
|
|||||||
//Cybernetic organs
|
//Cybernetic organs
|
||||||
|
|
||||||
/datum/design/cybernetic_liver
|
/datum/design/cybernetic_liver
|
||||||
name = "Cybernetic Liver"
|
name = "Basic Cybernetic Liver"
|
||||||
desc = "A cybernetic liver"
|
desc = "A basic cybernetic liver."
|
||||||
id = "cybernetic_liver"
|
id = "cybernetic_liver"
|
||||||
build_type = PROTOLATHE | MECHFAB
|
build_type = PROTOLATHE | MECHFAB
|
||||||
|
construction_time = 40
|
||||||
materials = list(/datum/material/iron = 500, /datum/material/glass = 500)
|
materials = list(/datum/material/iron = 500, /datum/material/glass = 500)
|
||||||
build_path = /obj/item/organ/liver/cybernetic
|
build_path = /obj/item/organ/liver/cybernetic
|
||||||
category = list("Misc","Medical Designs")
|
|
||||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
|
|
||||||
|
|
||||||
/datum/design/cybernetic_heart
|
|
||||||
name = "Cybernetic Heart"
|
|
||||||
desc = "A cybernetic heart"
|
|
||||||
id = "cybernetic_heart"
|
|
||||||
build_type = PROTOLATHE | MECHFAB
|
|
||||||
materials = list(/datum/material/iron = 500, /datum/material/glass = 500)
|
|
||||||
build_path = /obj/item/organ/heart/cybernetic
|
|
||||||
category = list("Misc","Medical Designs")
|
|
||||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
|
|
||||||
|
|
||||||
/datum/design/cybernetic_heart_u
|
|
||||||
name = "Upgraded Cybernetic Heart"
|
|
||||||
desc = "An upgraded cybernetic heart"
|
|
||||||
id = "cybernetic_heart_u"
|
|
||||||
build_type = PROTOLATHE | MECHFAB
|
|
||||||
construction_time = 50
|
|
||||||
materials = list(/datum/material/iron = 500, /datum/material/glass = 500, /datum/material/silver = 500)
|
|
||||||
build_path = /obj/item/organ/heart/cybernetic/upgraded
|
|
||||||
category = list("Misc", "Medical Designs")
|
category = list("Misc", "Medical Designs")
|
||||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
|
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
|
||||||
|
|
||||||
/datum/design/cybernetic_liver_u
|
/datum/design/cybernetic_liver/tier2
|
||||||
name = "Upgraded Cybernetic Liver"
|
name = "Cybernetic Liver"
|
||||||
desc = "An upgraded cybernetic liver"
|
desc = "A cybernetic liver."
|
||||||
id = "cybernetic_liver_u"
|
id = "cybernetic_liver_tier2"
|
||||||
build_type = PROTOLATHE | MECHFAB
|
|
||||||
materials = list(/datum/material/iron = 500, /datum/material/glass = 500)
|
materials = list(/datum/material/iron = 500, /datum/material/glass = 500)
|
||||||
build_path = /obj/item/organ/liver/cybernetic/upgraded
|
build_path = /obj/item/organ/liver/cybernetic/tier2
|
||||||
category = list("Misc","Medical Designs")
|
|
||||||
|
/datum/design/cybernetic_liver/tier3
|
||||||
|
name = "Upgraded Cybernetic Liver"
|
||||||
|
desc = "An upgraded cybernetic liver."
|
||||||
|
id = "cybernetic_liver_tier3"
|
||||||
|
construction_time = 50
|
||||||
|
materials = list(/datum/material/iron = 500, /datum/material/glass = 500, /datum/material/silver = 600, /datum/material/gold = 600, /datum/material/plasma = 1000, /datum/material/diamond = 2000)
|
||||||
|
build_path = /obj/item/organ/liver/cybernetic/tier3
|
||||||
|
|
||||||
|
/datum/design/cybernetic_heart
|
||||||
|
name = "Basic Cybernetic Heart"
|
||||||
|
desc = "A basic cybernetic heart."
|
||||||
|
id = "cybernetic_heart"
|
||||||
|
build_type = PROTOLATHE | MECHFAB
|
||||||
|
construction_time = 40
|
||||||
|
materials = list(/datum/material/iron = 500, /datum/material/glass = 500)
|
||||||
|
build_path = /obj/item/organ/heart/cybernetic
|
||||||
|
category = list("Misc", "Medical Designs")
|
||||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
|
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
|
||||||
|
|
||||||
|
/datum/design/cybernetic_heart/tier2
|
||||||
|
name = "Cybernetic Heart"
|
||||||
|
desc = "A cybernetic heart."
|
||||||
|
id = "cybernetic_heart_tier2"
|
||||||
|
materials = list(/datum/material/iron = 500, /datum/material/glass = 500)
|
||||||
|
build_path = /obj/item/organ/heart/cybernetic/tier2
|
||||||
|
|
||||||
|
/datum/design/cybernetic_heart/tier3
|
||||||
|
name = "Upgraded Cybernetic Heart"
|
||||||
|
desc = "An upgraded cybernetic heart."
|
||||||
|
id = "cybernetic_heart_tier3"
|
||||||
|
construction_time = 50
|
||||||
|
materials = list(/datum/material/iron = 500, /datum/material/glass = 500, /datum/material/silver = 600, /datum/material/gold = 600, /datum/material/plasma = 1000, /datum/material/diamond = 2000)
|
||||||
|
build_path = /obj/item/organ/heart/cybernetic/tier3
|
||||||
|
|
||||||
/datum/design/cybernetic_lungs
|
/datum/design/cybernetic_lungs
|
||||||
name = "Cybernetic Lungs"
|
name = "Basic Cybernetic Lungs"
|
||||||
desc = "A pair of cybernetic lungs."
|
desc = "A basic pair of cybernetic lungs."
|
||||||
id = "cybernetic_lungs"
|
id = "cybernetic_lungs"
|
||||||
build_type = PROTOLATHE | MECHFAB
|
build_type = PROTOLATHE | MECHFAB
|
||||||
|
construction_time = 40
|
||||||
materials = list(/datum/material/iron = 500, /datum/material/glass = 500)
|
materials = list(/datum/material/iron = 500, /datum/material/glass = 500)
|
||||||
build_path = /obj/item/organ/lungs/cybernetic
|
build_path = /obj/item/organ/lungs/cybernetic
|
||||||
category = list("Misc","Medical Designs")
|
category = list("Misc", "Medical Designs")
|
||||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
|
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
|
||||||
|
|
||||||
/datum/design/cybernetic_lungs_u
|
/datum/design/cybernetic_lungs/tier2
|
||||||
|
name = "Cybernetic Lungs"
|
||||||
|
desc = "A pair of cybernetic lungs."
|
||||||
|
id = "cybernetic_lungs_tier2"
|
||||||
|
materials = list(/datum/material/iron = 500, /datum/material/glass = 500)
|
||||||
|
build_path = /obj/item/organ/lungs/cybernetic/tier2
|
||||||
|
|
||||||
|
/datum/design/cybernetic_lungs/tier3
|
||||||
name = "Upgraded Cybernetic Lungs"
|
name = "Upgraded Cybernetic Lungs"
|
||||||
desc = "A pair of upgraded cybernetic lungs."
|
desc = "A pair of upgraded cybernetic lungs."
|
||||||
id = "cybernetic_lungs_u"
|
id = "cybernetic_lungs_tier3"
|
||||||
|
construction_time = 50
|
||||||
|
materials = list(/datum/material/iron = 500, /datum/material/glass = 500, /datum/material/silver = 600, /datum/material/gold = 600, /datum/material/plasma = 1000, /datum/material/diamond = 2000)
|
||||||
|
build_path = /obj/item/organ/lungs/cybernetic/tier3
|
||||||
|
|
||||||
|
/datum/design/cybernetic_stomach
|
||||||
|
name = "Basic Cybernetic Stomach"
|
||||||
|
desc = "A basic cybernetic stomach."
|
||||||
|
id = "cybernetic_stomach"
|
||||||
build_type = PROTOLATHE | MECHFAB
|
build_type = PROTOLATHE | MECHFAB
|
||||||
materials = list(/datum/material/iron = 500, /datum/material/glass = 500, /datum/material/silver = 500)
|
construction_time = 40
|
||||||
build_path = /obj/item/organ/lungs/cybernetic/upgraded
|
materials = list(/datum/material/iron = 500, /datum/material/glass = 500)
|
||||||
category = list("Misc","Medical Designs")
|
build_path = /obj/item/organ/stomach/cybernetic
|
||||||
|
category = list("Misc", "Medical Designs")
|
||||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
|
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
|
||||||
|
|
||||||
|
/datum/design/cybernetic_stomach/tier2
|
||||||
|
name = "Cybernetic Stomach"
|
||||||
|
desc = "A cybernetic stomach."
|
||||||
|
id = "cybernetic_stomach_tier2"
|
||||||
|
materials = list(/datum/material/iron = 500, /datum/material/glass = 500)
|
||||||
|
build_path = /obj/item/organ/stomach/cybernetic/tier2
|
||||||
|
|
||||||
|
/datum/design/cybernetic_stomach/tier3
|
||||||
|
name = "Upgraded Cybernetic Stomach"
|
||||||
|
desc = "An upgraded cybernetic stomach."
|
||||||
|
id = "cybernetic_stomach_tier3"
|
||||||
|
construction_time = 50
|
||||||
|
materials = list(/datum/material/iron = 500, /datum/material/glass = 500, /datum/material/silver = 600, /datum/material/gold = 600, /datum/material/plasma = 1000, /datum/material/diamond = 2000)
|
||||||
|
build_path = /obj/item/organ/stomach/cybernetic/tier3
|
||||||
|
|
||||||
/datum/design/cybernetic_tongue
|
/datum/design/cybernetic_tongue
|
||||||
name = "Cybernetic tongue"
|
name = "Cybernetic tongue"
|
||||||
desc = "A fancy cybernetic tongue."
|
desc = "A fancy cybernetic tongue."
|
||||||
@@ -711,7 +754,7 @@
|
|||||||
build_type = PROTOLATHE | MECHFAB
|
build_type = PROTOLATHE | MECHFAB
|
||||||
materials = list(/datum/material/iron = 500, /datum/material/glass = 500)
|
materials = list(/datum/material/iron = 500, /datum/material/glass = 500)
|
||||||
build_path = /obj/item/organ/tongue/cybernetic
|
build_path = /obj/item/organ/tongue/cybernetic
|
||||||
category = list("Misc","Medical Designs")
|
category = list("Misc", "Medical Designs")
|
||||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
|
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
|
||||||
|
|
||||||
/datum/design/cybernetic_ears
|
/datum/design/cybernetic_ears
|
||||||
|
|||||||
@@ -67,20 +67,27 @@
|
|||||||
design_ids = list("implanter", "implantcase", "implant_chem", "implant_tracking", "locator", "c38_trac")
|
design_ids = list("implanter", "implantcase", "implant_chem", "implant_tracking", "locator", "c38_trac")
|
||||||
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
|
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
|
||||||
|
|
||||||
|
/datum/techweb_node/basic_cyber_organs
|
||||||
|
id = "basic_cyber_organs"
|
||||||
|
starting_node = TRUE
|
||||||
|
display_name = "Basic Cybernetic Organs"
|
||||||
|
description = "We have the techinology to force him to live a disgusting halflife."
|
||||||
|
design_ids = list("cybernetic_liver", "cybernetic_heart", "cybernetic_lungs", "cybernetic_stomach")
|
||||||
|
|
||||||
/datum/techweb_node/cyber_organs
|
/datum/techweb_node/cyber_organs
|
||||||
id = "cyber_organs"
|
id = "cyber_organs"
|
||||||
display_name = "Cybernetic Organs"
|
display_name = "Cybernetic Organs"
|
||||||
description = "We have the technology to rebuild him."
|
description = "We have the technology to rebuild him."
|
||||||
prereq_ids = list("adv_biotech")
|
prereq_ids = list("biotech")
|
||||||
design_ids = list("cybernetic_ears", "cybernetic_heart", "cybernetic_liver", "cybernetic_lungs", "cybernetic_tongue")
|
design_ids = list("cybernetic_ears", "cybernetic_heart_tier2", "cybernetic_liver_tier2", "cybernetic_lungs_tier2", "cybernetic_stomach_tier2")
|
||||||
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000)
|
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000)
|
||||||
|
|
||||||
/datum/techweb_node/cyber_organs_upgraded
|
/datum/techweb_node/cyber_organs_upgraded
|
||||||
id = "cyber_organs_upgraded"
|
id = "cyber_organs_upgraded"
|
||||||
display_name = "Upgraded Cybernetic Organs"
|
display_name = "Upgraded Cybernetic Organs"
|
||||||
description = "We have the technology to upgrade him."
|
description = "We have the technology to upgrade him."
|
||||||
prereq_ids = list("cyber_organs")
|
prereq_ids = list("adv_biotech", "cyber_organs")
|
||||||
design_ids = list("cybernetic_ears_u", "cybernetic_heart_u", "cybernetic_liver_u", "cybernetic_lungs_u", "ipc_stomach")
|
design_ids = list("cybernetic_ears_u", "cybernetic_heart_tier3", "cybernetic_liver_tier3", "cybernetic_lungs_tier3", "cybernetic_stomach_tier3")
|
||||||
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1500)
|
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1500)
|
||||||
|
|
||||||
/datum/techweb_node/cyber_implants
|
/datum/techweb_node/cyber_implants
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
id = "advanced_illegal_ballistics"
|
id = "advanced_illegal_ballistics"
|
||||||
display_name = "Advanced Non-Standard Ballistics"
|
display_name = "Advanced Non-Standard Ballistics"
|
||||||
description = "Ballistic ammunition for non-standard firearms. Usually the ones you don't have nor want to be involved with."
|
description = "Ballistic ammunition for non-standard firearms. Usually the ones you don't have nor want to be involved with."
|
||||||
design_ids = list("10mm","10mmap","10mminc","10mmhp","sl357","sl357ap","pistolm9mm","m45","bolt_clip")
|
design_ids = list("10mm","10mmap","10mminc","10mmhp","sl357","sl357ap","pistolm9mm","m45","bolt_clip","m10apbox","m10firebox","m10hpbox")
|
||||||
prereq_ids = list("ballistic_weapons","syndicate_basic","explosive_weapons")
|
prereq_ids = list("ballistic_weapons","syndicate_basic","explosive_weapons")
|
||||||
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 25000) //This gives sec lethal mags/clips for guns from traitors, space, or anything in between.
|
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 25000) //This gives sec lethal mags/clips for guns from traitors, space, or anything in between.
|
||||||
|
|
||||||
|
|||||||
@@ -197,45 +197,67 @@
|
|||||||
colour = "red"
|
colour = "red"
|
||||||
|
|
||||||
/obj/item/organ/heart/cybernetic
|
/obj/item/organ/heart/cybernetic
|
||||||
name = "cybernetic heart"
|
name = "basic cybernetic heart"
|
||||||
desc = "An electronic device designed to mimic the functions of an organic human heart. Offers no benefit over an organic heart other than being easy to make."
|
desc = "A basic electronic device designed to mimic the functions of an organic human heart."
|
||||||
icon_state = "heart-c"
|
icon_state = "heart-c"
|
||||||
organ_flags = ORGAN_SYNTHETIC
|
organ_flags = ORGAN_SYNTHETIC
|
||||||
|
maxHealth = STANDARD_ORGAN_THRESHOLD*0.75 //This also hits defib timer, so a bit higher than its less important counterparts
|
||||||
|
|
||||||
|
var/dose_available = FALSE
|
||||||
|
var/rid = /datum/reagent/medicine/epinephrine
|
||||||
|
var/ramount = 10
|
||||||
|
var/emp_vulnerability = 1 //The value the severity of emps are divided by to determine the likelihood of permanent damage.
|
||||||
|
|
||||||
|
/obj/item/organ/heart/cybernetic/tier2
|
||||||
|
name = "cybernetic heart"
|
||||||
|
desc = "An electronic device designed to mimic the functions of an organic human heart. Also holds an emergency dose of epinephrine, used automatically after facing severe trauma."
|
||||||
|
icon_state = "heart-c-u"
|
||||||
|
maxHealth = 1.5 * STANDARD_ORGAN_THRESHOLD
|
||||||
|
dose_available = TRUE
|
||||||
|
emp_vulnerability = 2
|
||||||
|
|
||||||
|
/obj/item/organ/heart/cybernetic/tier3
|
||||||
|
name = "upgraded cybernetic heart"
|
||||||
|
desc = "An electronic device designed to mimic the functions of an organic human heart. Also holds an emergency dose of epinephrine, used automatically after facing severe trauma. This upgraded model can regenerate its dose after use."
|
||||||
|
icon_state = "heart-c-u2"
|
||||||
|
maxHealth = 2 * STANDARD_ORGAN_THRESHOLD
|
||||||
|
dose_available = TRUE
|
||||||
|
rid = /datum/reagent/medicine/atropine
|
||||||
|
ramount = 5
|
||||||
|
emp_vulnerability = 3
|
||||||
|
|
||||||
/obj/item/organ/heart/cybernetic/emp_act(severity)
|
/obj/item/organ/heart/cybernetic/emp_act(severity)
|
||||||
. = ..()
|
. = ..()
|
||||||
|
|
||||||
|
// If the owner doesn't need a heart, we don't need to do anything with it.
|
||||||
|
if(!owner.needs_heart())
|
||||||
|
return
|
||||||
|
|
||||||
if(. & EMP_PROTECT_SELF)
|
if(. & EMP_PROTECT_SELF)
|
||||||
return
|
return
|
||||||
Stop()
|
if(!COOLDOWN_FINISHED(src, severe_cooldown)) //So we cant just spam emp to kill people.
|
||||||
addtimer(CALLBACK(src, .proc/Restart), 0.2*severity SECONDS)
|
owner.Dizzy(10)
|
||||||
damage += severity
|
owner.losebreath += 10
|
||||||
|
COOLDOWN_START(src, severe_cooldown, 20 SECONDS)
|
||||||
|
if(prob(severity/emp_vulnerability)) //Chance of permanent effects
|
||||||
|
organ_flags |= ORGAN_SYNTHETIC_EMP //Starts organ faliure - gonna need replacing soon.
|
||||||
|
Stop()
|
||||||
|
owner.visible_message("<span class='danger'>[owner] clutches at [owner.p_their()] chest as if [owner.p_their()] heart is stopping!</span>", \
|
||||||
|
"<span class='userdanger'>You feel a terrible pain in your chest, as if your heart has stopped!</span>")
|
||||||
|
addtimer(CALLBACK(src, .proc/Restart), 10 SECONDS)
|
||||||
|
|
||||||
/obj/item/organ/heart/cybernetic/upgraded
|
/obj/item/organ/heart/cybernetic/on_life(delta_time, times_fired)
|
||||||
name = "upgraded cybernetic heart"
|
|
||||||
desc = "An electronic device designed to mimic the functions of an organic human heart. Also holds an emergency dose of epinephrine, used automatically after facing severe trauma. This upgraded model can regenerate its dose after use."
|
|
||||||
icon_state = "heart-c-u"
|
|
||||||
maxHealth = 2 * STANDARD_ORGAN_THRESHOLD
|
|
||||||
|
|
||||||
//I put it on upgraded for now.
|
|
||||||
var/dose_available = TRUE
|
|
||||||
var/rid = /datum/reagent/medicine/epinephrine
|
|
||||||
var/ramount = 10
|
|
||||||
|
|
||||||
/obj/item/organ/heart/cybernetic/upgraded/on_life()
|
|
||||||
. = ..()
|
. = ..()
|
||||||
if(!.)
|
|
||||||
return
|
|
||||||
if(dose_available && owner.health <= owner.crit_threshold && !owner.reagents.has_reagent(rid))
|
if(dose_available && owner.health <= owner.crit_threshold && !owner.reagents.has_reagent(rid))
|
||||||
owner.reagents.add_reagent(rid, ramount)
|
|
||||||
used_dose()
|
used_dose()
|
||||||
if(ramount < 10) //eats your nutrition to regen epinephrine
|
|
||||||
var/regen_amount = owner.nutrition/2000
|
|
||||||
owner.adjust_nutrition(-regen_amount)
|
|
||||||
ramount += regen_amount
|
|
||||||
|
|
||||||
/obj/item/organ/heart/cybernetic/upgraded/proc/used_dose()
|
/obj/item/organ/heart/cybernetic/proc/used_dose()
|
||||||
|
owner.reagents.add_reagent(rid, ramount)
|
||||||
|
dose_available = FALSE
|
||||||
|
|
||||||
|
/obj/item/organ/heart/cybernetic/tier3/used_dose()
|
||||||
|
. = ..()
|
||||||
addtimer(VARSET_CALLBACK(src, dose_available, TRUE), 5 MINUTES)
|
addtimer(VARSET_CALLBACK(src, dose_available, TRUE), 5 MINUTES)
|
||||||
ramount = 0
|
|
||||||
|
|
||||||
/obj/item/organ/heart/ipc
|
/obj/item/organ/heart/ipc
|
||||||
name = "IPC heart"
|
name = "IPC heart"
|
||||||
|
|||||||
@@ -98,23 +98,41 @@
|
|||||||
icon_state = "liver-c"
|
icon_state = "liver-c"
|
||||||
|
|
||||||
/obj/item/organ/liver/cybernetic
|
/obj/item/organ/liver/cybernetic
|
||||||
name = "cybernetic liver"
|
name = "basic cybernetic liver"
|
||||||
icon_state = "liver-c"
|
icon_state = "liver-c"
|
||||||
desc = "An electronic device designed to mimic the functions of a human liver. It has no benefits over an organic liver, but is easy to produce."
|
desc = "A very basic device designed to mimic the functions of a human liver. Handles toxins slightly worse than an organic liver."
|
||||||
organ_flags = ORGAN_SYNTHETIC
|
organ_flags = ORGAN_SYNTHETIC
|
||||||
maxHealth = 1.1 * STANDARD_ORGAN_THRESHOLD
|
toxTolerance = 0.3 * LIVER_DEFAULT_TOX_TOLERANCE //little less than 1u of toxin purging
|
||||||
|
toxLethality = 1.1 * LIVER_DEFAULT_TOX_LETHALITY
|
||||||
|
maxHealth = STANDARD_ORGAN_THRESHOLD*0.5
|
||||||
|
|
||||||
/obj/item/organ/liver/cybernetic/upgraded
|
var/emp_vulnerability = 1 //The value the severity of emps are divided by to determine the likelihood of permanent damage.
|
||||||
name = "upgraded cybernetic liver"
|
|
||||||
|
/obj/item/organ/liver/cybernetic/tier2
|
||||||
|
name = "cybernetic liver"
|
||||||
icon_state = "liver-c-u"
|
icon_state = "liver-c-u"
|
||||||
desc = "An upgraded version of the cybernetic liver, designed to improve upon organic livers. It is resistant to alcohol poisoning and is very robust at filtering toxins."
|
desc = "An electronic device designed to mimic the functions of a human liver. Handles toxins slightly better than an organic liver."
|
||||||
|
maxHealth = 1.5 * STANDARD_ORGAN_THRESHOLD
|
||||||
|
toxTolerance = 2 * LIVER_DEFAULT_TOX_TOLERANCE //6 units of toxin purging
|
||||||
|
toxLethality = 0.8 * LIVER_DEFAULT_TOX_LETHALITY //20% less damage than a normal liver
|
||||||
|
emp_vulnerability = 2
|
||||||
|
|
||||||
|
/obj/item/organ/liver/cybernetic/tier3
|
||||||
|
name = "upgraded cybernetic liver"
|
||||||
|
icon_state = "liver-c-u2"
|
||||||
|
desc = "An upgraded version of the cybernetic liver, designed to improve further upon organic livers. It is resistant to alcohol poisoning and is very robust at filtering toxins."
|
||||||
alcohol_tolerance = 0.001
|
alcohol_tolerance = 0.001
|
||||||
maxHealth = 2 * STANDARD_ORGAN_THRESHOLD
|
maxHealth = 2 * STANDARD_ORGAN_THRESHOLD
|
||||||
toxTolerance = 15 //can shrug off up to 15u of toxins
|
toxTolerance = 5 * LIVER_DEFAULT_TOX_TOLERANCE //15 units of toxin purging
|
||||||
toxLethality = 0.008 //20% less damage than a normal liver
|
toxLethality = 0.4 * LIVER_DEFAULT_TOX_LETHALITY //60% less damage than a normal liver
|
||||||
|
emp_vulnerability = 3
|
||||||
|
|
||||||
/obj/item/organ/liver/cybernetic/emp_act(severity)
|
/obj/item/organ/liver/cybernetic/emp_act(severity)
|
||||||
. = ..()
|
. = ..()
|
||||||
if(. & EMP_PROTECT_SELF)
|
if(. & EMP_PROTECT_SELF)
|
||||||
return
|
return
|
||||||
damage += severity
|
if(!COOLDOWN_FINISHED(src, severe_cooldown)) //So we cant just spam emp to kill people.
|
||||||
|
owner.adjustToxLoss(10)
|
||||||
|
COOLDOWN_START(src, severe_cooldown, 10 SECONDS)
|
||||||
|
if(prob(severity/emp_vulnerability)) //Chance of permanent effects
|
||||||
|
organ_flags |= ORGAN_SYNTHETIC_EMP //Starts organ faliure - gonna need replacing soon.
|
||||||
|
|||||||
@@ -547,33 +547,52 @@
|
|||||||
maxHealth = INFINITY//I don't understand how plamamen work, so I'm not going to try t give them special lungs atm
|
maxHealth = INFINITY//I don't understand how plamamen work, so I'm not going to try t give them special lungs atm
|
||||||
|
|
||||||
/obj/item/organ/lungs/cybernetic
|
/obj/item/organ/lungs/cybernetic
|
||||||
name = "cybernetic lungs"
|
name = "basic cybernetic lungs"
|
||||||
desc = "A cybernetic version of the lungs found in traditional humanoid entities. It functions the same as an organic lung and is merely meant as a replacement."
|
desc = "A basic cybernetic version of the lungs found in traditional humanoid entities."
|
||||||
icon_state = "lungs-c"
|
icon_state = "lungs-c"
|
||||||
organ_flags = ORGAN_SYNTHETIC
|
organ_flags = ORGAN_SYNTHETIC
|
||||||
maxHealth = 400
|
maxHealth = STANDARD_ORGAN_THRESHOLD * 0.5
|
||||||
safe_oxygen_min = 13
|
|
||||||
|
|
||||||
/obj/item/organ/lungs/cybernetic/emp_act()
|
var/emp_vulnerability = 1 //The value the severity of emps are divided by to determine the likelihood of permanent damage.
|
||||||
. = ..()
|
|
||||||
if(. & EMP_PROTECT_SELF)
|
|
||||||
return
|
|
||||||
owner.losebreath = 20
|
|
||||||
owner.adjustOrganLoss(ORGAN_SLOT_LUNGS, 25)
|
|
||||||
|
|
||||||
/obj/item/organ/lungs/cybernetic/upgraded
|
/obj/item/organ/lungs/cybernetic/tier2
|
||||||
name = "upgraded cybernetic lungs"
|
name = "cybernetic lungs"
|
||||||
desc = "A more advanced version of the stock cybernetic lungs. They are capable of filtering out lower levels of toxins and carbon dioxide."
|
desc = "A cybernetic version of the lungs found in traditional humanoid entities. Allows for greater intakes of oxygen than organic lungs, requiring slightly less pressure."
|
||||||
icon_state = "lungs-c-u"
|
icon_state = "lungs-c-u"
|
||||||
safe_toxins_max = 20
|
maxHealth = 1.5 * STANDARD_ORGAN_THRESHOLD
|
||||||
safe_co2_max = 20
|
safe_oxygen_min = 13
|
||||||
safe_oxygen_max = 250
|
safe_oxygen_max = 100
|
||||||
|
emp_vulnerability = 2
|
||||||
|
|
||||||
|
/obj/item/organ/lungs/cybernetic/tier3
|
||||||
|
name = "upgraded cybernetic lungs"
|
||||||
|
desc = "A more advanced version of the stock cybernetic lungs. Features the ability to filter out various airbourne toxins and carbon dioxide even at heavy levels."
|
||||||
|
icon_state = "lungs-c-u2"
|
||||||
|
maxHealth = 2 * STANDARD_ORGAN_THRESHOLD
|
||||||
|
safe_oxygen_min = 4 //You could literally be breathing the thinnest amount of oxygen and be fine
|
||||||
|
safe_oxygen_max = 250 //Or be in an enriched oxygen room for that matter
|
||||||
|
safe_toxins_max = 30
|
||||||
|
safe_co2_max = 30
|
||||||
|
SA_para_min = 30
|
||||||
|
SA_sleep_min = 50
|
||||||
|
BZ_trip_balls_min = 30
|
||||||
|
emp_vulnerability = 3
|
||||||
|
|
||||||
cold_level_1_threshold = 200
|
cold_level_1_threshold = 200
|
||||||
cold_level_2_threshold = 140
|
cold_level_2_threshold = 140
|
||||||
cold_level_3_threshold = 100
|
cold_level_3_threshold = 100
|
||||||
maxHealth = 550
|
maxHealth = 550
|
||||||
|
|
||||||
|
/obj/item/organ/lungs/cybernetic/emp_act(severity)
|
||||||
|
. = ..()
|
||||||
|
if(. & EMP_PROTECT_SELF)
|
||||||
|
return
|
||||||
|
if(!COOLDOWN_FINISHED(src, severe_cooldown)) //So we cant just spam emp to kill people.
|
||||||
|
owner.losebreath += 20
|
||||||
|
COOLDOWN_START(src, severe_cooldown, 30 SECONDS)
|
||||||
|
if(prob(severity/emp_vulnerability)) //Chance of permanent effects
|
||||||
|
organ_flags |= ORGAN_SYNTHETIC_EMP //Starts organ faliure - gonna need replacing soon.
|
||||||
|
|
||||||
/obj/item/organ/lungs/ashwalker
|
/obj/item/organ/lungs/ashwalker
|
||||||
name = "ash lungs"
|
name = "ash lungs"
|
||||||
desc = "blackened lungs identical from specimens recovered from lavaland, unsuited to higher air pressures."
|
desc = "blackened lungs identical from specimens recovered from lavaland, unsuited to higher air pressures."
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
var/decay_factor = 0 //same as above but when without a living owner, set to 0 for generic organs
|
var/decay_factor = 0 //same as above but when without a living owner, set to 0 for generic organs
|
||||||
var/high_threshold = STANDARD_ORGAN_THRESHOLD * 0.45 //when severe organ damage occurs
|
var/high_threshold = STANDARD_ORGAN_THRESHOLD * 0.45 //when severe organ damage occurs
|
||||||
var/low_threshold = STANDARD_ORGAN_THRESHOLD * 0.1 //when minor organ damage occurs
|
var/low_threshold = STANDARD_ORGAN_THRESHOLD * 0.1 //when minor organ damage occurs
|
||||||
|
var/severe_cooldown //cooldown for severe effects, used for synthetic organ emp effects.
|
||||||
|
|
||||||
///Organ variables for determining what we alert the owner with when they pass/clear the damage thresholds
|
///Organ variables for determining what we alert the owner with when they pass/clear the damage thresholds
|
||||||
var/prev_damage = 0
|
var/prev_damage = 0
|
||||||
@@ -153,6 +154,9 @@
|
|||||||
/obj/item/organ/proc/on_life() //repair organ damage if the organ is not failing or synthetic
|
/obj/item/organ/proc/on_life() //repair organ damage if the organ is not failing or synthetic
|
||||||
if(organ_flags & ORGAN_FAILING || !owner)
|
if(organ_flags & ORGAN_FAILING || !owner)
|
||||||
return FALSE
|
return FALSE
|
||||||
|
if(organ_flags & ORGAN_SYNTHETIC_EMP) //Synthetic organ has been emped, is now failing.
|
||||||
|
applyOrganDamage(maxHealth * decay_factor)
|
||||||
|
return
|
||||||
if(!is_cold() && damage)
|
if(!is_cold() && damage)
|
||||||
///Damage decrements by a percent of its maxhealth
|
///Damage decrements by a percent of its maxhealth
|
||||||
var/healing_amount = -(maxHealth * healing_factor)
|
var/healing_amount = -(maxHealth * healing_factor)
|
||||||
|
|||||||
@@ -93,6 +93,40 @@
|
|||||||
icon_state = "stomach-p"
|
icon_state = "stomach-p"
|
||||||
desc = "A strange crystal that is responsible for metabolizing the unseen energy force that feeds plasmamen."
|
desc = "A strange crystal that is responsible for metabolizing the unseen energy force that feeds plasmamen."
|
||||||
|
|
||||||
|
/obj/item/organ/stomach/cybernetic
|
||||||
|
name = "basic cybernetic stomach"
|
||||||
|
icon_state = "stomach-c"
|
||||||
|
desc = "A basic device designed to mimic the functions of a human stomach"
|
||||||
|
organ_flags = ORGAN_SYNTHETIC
|
||||||
|
maxHealth = STANDARD_ORGAN_THRESHOLD * 0.5
|
||||||
|
var/emp_vulnerability = 1 //The value the severity of emps are divided by to determine the likelihood of permanent damage.
|
||||||
|
|
||||||
|
/obj/item/organ/stomach/cybernetic/tier2
|
||||||
|
name = "cybernetic stomach"
|
||||||
|
icon_state = "stomach-c-u"
|
||||||
|
desc = "An electronic device designed to mimic the functions of a human stomach. Handles disgusting food a bit better."
|
||||||
|
maxHealth = 1.5 * STANDARD_ORGAN_THRESHOLD
|
||||||
|
disgust_metabolism = 2
|
||||||
|
emp_vulnerability = 2
|
||||||
|
|
||||||
|
/obj/item/organ/stomach/cybernetic/tier3
|
||||||
|
name = "upgraded cybernetic stomach"
|
||||||
|
icon_state = "stomach-c-u2"
|
||||||
|
desc = "An upgraded version of the cybernetic stomach, designed to improve further upon organic stomachs. Handles disgusting food very well."
|
||||||
|
maxHealth = 2 * STANDARD_ORGAN_THRESHOLD
|
||||||
|
disgust_metabolism = 3
|
||||||
|
emp_vulnerability = 3
|
||||||
|
|
||||||
|
/obj/item/organ/stomach/cybernetic/emp_act(severity)
|
||||||
|
. = ..()
|
||||||
|
if(. & EMP_PROTECT_SELF)
|
||||||
|
return
|
||||||
|
if(!COOLDOWN_FINISHED(src, severe_cooldown)) //So we cant just spam emp to kill people.
|
||||||
|
owner.vomit(stun = FALSE)
|
||||||
|
COOLDOWN_START(src, severe_cooldown, 10 SECONDS)
|
||||||
|
if(prob(severity/emp_vulnerability)) //Chance of permanent effects
|
||||||
|
organ_flags |= ORGAN_SYNTHETIC_EMP //Starts organ faliure - gonna need replacing soon.
|
||||||
|
|
||||||
/obj/item/organ/stomach/ipc
|
/obj/item/organ/stomach/ipc
|
||||||
name = "ipc cell"
|
name = "ipc cell"
|
||||||
icon_state = "stomach-ipc"
|
icon_state = "stomach-ipc"
|
||||||
|
|||||||
@@ -208,9 +208,10 @@
|
|||||||
|
|
||||||
/datum/uplink_item/role_restricted/chemical_gun
|
/datum/uplink_item/role_restricted/chemical_gun
|
||||||
name = "Reagent Dartgun"
|
name = "Reagent Dartgun"
|
||||||
desc = "A heavily modified syringe gun which is capable of synthesizing its own chemical darts using input reagents. Can hold 100u of reagents."
|
desc = "A heavily modified syringe gun which is capable of synthesizing its own chemical darts using input reagents. \
|
||||||
|
Synthesizes one piercing 10 unit dart every 30 seconds up to a maximum of five. Can hold 100u of reagents."
|
||||||
item = /obj/item/gun/chem
|
item = /obj/item/gun/chem
|
||||||
cost = 12
|
cost = 10
|
||||||
restricted_roles = list("Chemist", "Chief Medical Officer")
|
restricted_roles = list("Chemist", "Chief Medical Officer")
|
||||||
|
|
||||||
/datum/uplink_item/role_restricted/reverse_bear_trap
|
/datum/uplink_item/role_restricted/reverse_bear_trap
|
||||||
@@ -257,4 +258,4 @@
|
|||||||
item = /obj/item/storage/toolbox/emergency/turret
|
item = /obj/item/storage/toolbox/emergency/turret
|
||||||
cost = 11
|
cost = 11
|
||||||
restricted_roles = list("Station Engineer")
|
restricted_roles = list("Station Engineer")
|
||||||
|
|
||||||
|
|||||||
+10
-16
@@ -50,6 +50,16 @@
|
|||||||
-->
|
-->
|
||||||
<div class="commit sansserif">
|
<div class="commit sansserif">
|
||||||
|
|
||||||
|
<h2 class="date">29 April 2021</h2>
|
||||||
|
<h3 class="author">Putnam3145 updated:</h3>
|
||||||
|
<ul class="changes bgimages16">
|
||||||
|
<li class="bugfix">Fixed a couple runtimes in activity (threat) tracking</li>
|
||||||
|
</ul>
|
||||||
|
<h3 class="author">keronshb updated:</h3>
|
||||||
|
<ul class="changes bgimages16">
|
||||||
|
<li class="balance">Removes the Reinforcement Chromosome from Genetics.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
<h2 class="date">26 April 2021</h2>
|
<h2 class="date">26 April 2021</h2>
|
||||||
<h3 class="author">Trigg, stylemistake and SandPoot updated:</h3>
|
<h3 class="author">Trigg, stylemistake and SandPoot updated:</h3>
|
||||||
<ul class="changes bgimages16">
|
<ul class="changes bgimages16">
|
||||||
@@ -791,22 +801,6 @@
|
|||||||
<ul class="changes bgimages16">
|
<ul class="changes bgimages16">
|
||||||
<li class="code_imp">All machine-frame based tool-use actions now have state-checking callbacks.</li>
|
<li class="code_imp">All machine-frame based tool-use actions now have state-checking callbacks.</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<h2 class="date">25 February 2021</h2>
|
|
||||||
<h3 class="author">DeltaFire15 updated:</h3>
|
|
||||||
<ul class="changes bgimages16">
|
|
||||||
<li class="bugfix">Traitor / Ling objective amount should now be correct again.</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<h2 class="date">24 February 2021</h2>
|
|
||||||
<h3 class="author">SandPoot updated:</h3>
|
|
||||||
<ul class="changes bgimages16">
|
|
||||||
<li class="bugfix">Regular crowbars no longer open powered airlocks.</li>
|
|
||||||
</ul>
|
|
||||||
<h3 class="author">silicons updated:</h3>
|
|
||||||
<ul class="changes bgimages16">
|
|
||||||
<li class="balance">xeno cube makes hostile xenos now, and drops a sentinel instead of a drone.</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<b>GoonStation 13 Development Team</b>
|
<b>GoonStation 13 Development Team</b>
|
||||||
|
|||||||
@@ -29172,3 +29172,8 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
|
|||||||
- admin: 'Admins just got a new TGUI Select Equipment menu tweak: Prevents the window
|
- admin: 'Admins just got a new TGUI Select Equipment menu tweak: Prevents the window
|
||||||
from creating sprites for any animated version there might be. (this guarantees
|
from creating sprites for any animated version there might be. (this guarantees
|
||||||
consistant sprite size/amount)'
|
consistant sprite size/amount)'
|
||||||
|
2021-04-29:
|
||||||
|
Putnam3145:
|
||||||
|
- bugfix: Fixed a couple runtimes in activity (threat) tracking
|
||||||
|
keronshb:
|
||||||
|
- balance: Removes the Reinforcement Chromosome from Genetics.
|
||||||
|
|||||||
@@ -0,0 +1,4 @@
|
|||||||
|
author: "necromanceranne"
|
||||||
|
delete-after: True
|
||||||
|
changes:
|
||||||
|
- rscadd: "Fake blindfolds in the loadout. They don't obscure vision, for better or worse."
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
author: "TheObserver-sys"
|
||||||
|
delete-after: True
|
||||||
|
changes:
|
||||||
|
- bugfix: "Restores the access lock on crates that should have them, given the goods inside."
|
||||||
|
- bugfix: "Makes the 10MM Surplus Rifle a less awful thing to use."
|
||||||
|
- bugfix: "replaces unarmored things with their armored versions."
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
author: "necromanceranne"
|
||||||
|
delete-after: True
|
||||||
|
changes:
|
||||||
|
- rscadd: "Basic cybernetic organs: they're worse than organic! Basic stomachs, hearts, lungs and livers! For when you hate someone enough to not bother harvesting organs from a monkeyhuman!"
|
||||||
|
- rscadd: "Cybernetic organs have been adjusted into three tiers: 1 (basic), 2 (standard, better than organic) and 3 (absolutely better than organic but expensive to print)"
|
||||||
|
- rscadd: "Cybernetic organs that are emp'd instead suffer different effects based on the severity of the emp. The bigger the emp, the worse the effect is."
|
||||||
|
- rscadd: "Rather than outright bricking, severely emp'd cyberorgans degrade over time very quickly, requiring replacement in the near future."
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
author: "akada"
|
||||||
|
delete-after: True
|
||||||
|
changes:
|
||||||
|
- imageadd: "Changes the space adaptation sprite to something less intrusive and more subtle."
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
author: "Melbert, SandPoot"
|
||||||
|
delete-after: True
|
||||||
|
changes:
|
||||||
|
- refactor: "TGUI Limbgrower"
|
||||||
|
- refactor: "Refactored the limbgrower to modernize the code and allow for more types of designs."
|
||||||
|
- rscadd: "The limbgrower now supports plumbing ducts."
|
||||||
|
- bugfix: "Fixes genitals not actually getting data from disks."
|
||||||
|
- code_imp: "Adds two special helpers."
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
author: "SandPoot"
|
||||||
|
delete-after: True
|
||||||
|
changes:
|
||||||
|
- rscadd: "The decal painter now has visible previews for your tile painting funs."
|
||||||
|
- bugfix: "Fixes decal painter painting in the opposite direction."
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
author: "TheObserver-sys"
|
||||||
|
delete-after: True
|
||||||
|
changes:
|
||||||
|
- balance: "Illegal Tech Ammo actually is fucking reasonable, now."
|
||||||
|
- balance: "Expensive Illegal Tech Ammo Boxes are now constructible, with actually justifiable prices."
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
author: "WanderingFox95"
|
||||||
|
delete-after: True
|
||||||
|
changes:
|
||||||
|
- balance: "There's finally a reason for the reagent dart gun to exist and be used!"
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
author: "DrPainis"
|
||||||
|
delete-after: True
|
||||||
|
changes:
|
||||||
|
- spellcheck: "Bubblegum's hallucinations are capitalized."
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 23 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 44 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 55 KiB After Width: | Height: | Size: 55 KiB |
@@ -6,6 +6,10 @@
|
|||||||
name = "Blindfold"
|
name = "Blindfold"
|
||||||
path = /obj/item/clothing/glasses/sunglasses/blindfold
|
path = /obj/item/clothing/glasses/sunglasses/blindfold
|
||||||
|
|
||||||
|
/datum/gear/glasses/fakeblindfold
|
||||||
|
name = "Fake Blindfold"
|
||||||
|
path = /obj/item/clothing/glasses/fakeblindfold
|
||||||
|
|
||||||
/datum/gear/glasses/cold
|
/datum/gear/glasses/cold
|
||||||
name = "Cold goggles"
|
name = "Cold goggles"
|
||||||
path = /obj/item/clothing/glasses/cold
|
path = /obj/item/clothing/glasses/cold
|
||||||
|
|||||||
+38
-10
@@ -3,10 +3,9 @@
|
|||||||
desc = "A gun magazine. Loaded with rounds which ignite the target.."
|
desc = "A gun magazine. Loaded with rounds which ignite the target.."
|
||||||
id = "10mminc"
|
id = "10mminc"
|
||||||
build_type = PROTOLATHE
|
build_type = PROTOLATHE
|
||||||
materials = list(/datum/material/plasma = 50000, /datum/material/iron = 18000)
|
materials = list(/datum/material/plasma = 5000, /datum/material/iron = 7500)
|
||||||
reagents_list = list(/datum/reagent/toxin/plasma = 120, /datum/reagent/napalm = 240)
|
|
||||||
build_path = /obj/item/ammo_box/magazine/m10mm/fire
|
build_path = /obj/item/ammo_box/magazine/m10mm/fire
|
||||||
category = list("Weapons")
|
category = list("Ammo")
|
||||||
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
|
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
|
||||||
|
|
||||||
/datum/design/m10mm
|
/datum/design/m10mm
|
||||||
@@ -14,7 +13,7 @@
|
|||||||
desc = "A gun magazine."
|
desc = "A gun magazine."
|
||||||
id = "10mm"
|
id = "10mm"
|
||||||
build_type = PROTOLATHE
|
build_type = PROTOLATHE
|
||||||
materials = list(/datum/material/iron = 55000)
|
materials = list(/datum/material/iron = 6000)
|
||||||
build_path = /obj/item/ammo_box/magazine/m10mm
|
build_path = /obj/item/ammo_box/magazine/m10mm
|
||||||
category = list("Ammo")
|
category = list("Ammo")
|
||||||
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
|
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
|
||||||
@@ -24,8 +23,7 @@
|
|||||||
desc = "A gun magazine. Loaded with hollow-point rounds, extremely effective against unarmored targets, but nearly useless against protective clothing."
|
desc = "A gun magazine. Loaded with hollow-point rounds, extremely effective against unarmored targets, but nearly useless against protective clothing."
|
||||||
id = "10mmhp"
|
id = "10mmhp"
|
||||||
build_type = PROTOLATHE
|
build_type = PROTOLATHE
|
||||||
materials = list(/datum/material/iron = 40000, /datum/material/glass = 50000)
|
materials = list(/datum/material/iron = 7500, /datum/material/glass = 5000)
|
||||||
reagents_list = list(/datum/reagent/sonic_powder = 280)
|
|
||||||
build_path = /obj/item/ammo_box/magazine/m10mm/hp
|
build_path = /obj/item/ammo_box/magazine/m10mm/hp
|
||||||
category = list("Ammo")
|
category = list("Ammo")
|
||||||
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
|
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
|
||||||
@@ -35,7 +33,7 @@
|
|||||||
desc = "A gun magazine. Loaded with rounds which penetrate armour, but are less effective against normal targets."
|
desc = "A gun magazine. Loaded with rounds which penetrate armour, but are less effective against normal targets."
|
||||||
id = "10mmap"
|
id = "10mmap"
|
||||||
build_type = PROTOLATHE
|
build_type = PROTOLATHE
|
||||||
materials = list(/datum/material/iron = 40000, /datum/material/titanium = 60000)
|
materials = list(/datum/material/iron = 7500, /datum/material/titanium = 6500)
|
||||||
build_path = /obj/item/ammo_box/magazine/m10mm/ap
|
build_path = /obj/item/ammo_box/magazine/m10mm/ap
|
||||||
category = list("Ammo")
|
category = list("Ammo")
|
||||||
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
|
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
|
||||||
@@ -54,7 +52,7 @@
|
|||||||
name = "handgun magazine (.45)"
|
name = "handgun magazine (.45)"
|
||||||
id = "m45"
|
id = "m45"
|
||||||
build_type = PROTOLATHE
|
build_type = PROTOLATHE
|
||||||
materials = list(/datum/material/iron = 80000)
|
materials = list(/datum/material/iron = 8000)
|
||||||
build_path = /obj/item/ammo_box/magazine/m45
|
build_path = /obj/item/ammo_box/magazine/m45
|
||||||
category = list("Ammo")
|
category = list("Ammo")
|
||||||
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
|
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
|
||||||
@@ -64,7 +62,7 @@
|
|||||||
desc = "A gun magazine."
|
desc = "A gun magazine."
|
||||||
id = "pistolm9mm"
|
id = "pistolm9mm"
|
||||||
build_type = PROTOLATHE
|
build_type = PROTOLATHE
|
||||||
materials = list(/datum/material/iron = 80000)
|
materials = list(/datum/material/iron = 7500)
|
||||||
build_path = /obj/item/ammo_box/magazine/pistolm9mm
|
build_path = /obj/item/ammo_box/magazine/pistolm9mm
|
||||||
category = list("Ammo")
|
category = list("Ammo")
|
||||||
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
|
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
|
||||||
@@ -84,7 +82,37 @@
|
|||||||
desc = "A revolver speedloader. Cuts through like a hot knife through butter."
|
desc = "A revolver speedloader. Cuts through like a hot knife through butter."
|
||||||
id = "sl357ap"
|
id = "sl357ap"
|
||||||
build_type = PROTOLATHE
|
build_type = PROTOLATHE
|
||||||
materials = list(/datum/material/iron = 30000, /datum/material/titanium = 45000)
|
materials = list(/datum/material/iron = 30000, /datum/material/titanium = 5000)
|
||||||
build_path = /obj/item/ammo_box/a357/ap
|
build_path = /obj/item/ammo_box/a357/ap
|
||||||
category = list("Ammo")
|
category = list("Ammo")
|
||||||
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
|
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
|
||||||
|
|
||||||
|
/datum/design/m10apbox
|
||||||
|
name = "ammo box (10mm Armour Piercing)"
|
||||||
|
desc = "A box of ammo containing 20 rounds designed to penetrate armor, at the cost of raw damage."
|
||||||
|
id = "m10apbox"
|
||||||
|
build_type = PROTOLATHE
|
||||||
|
materials = list(/datum/material/iron = 30000, /datum/material/titanium = 6000)
|
||||||
|
build_path = /obj/item/ammo_box/c10mm/ap
|
||||||
|
category = list("Ammo")
|
||||||
|
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
|
||||||
|
|
||||||
|
/datum/design/m10firebox
|
||||||
|
name = "ammo box (10mm Incendiary)"
|
||||||
|
desc = "A box of ammo containing 20 rounds designed to set people ablaze, at the cost of raw damage."
|
||||||
|
id = "m10firebox"
|
||||||
|
build_type = PROTOLATHE
|
||||||
|
materials = list(/datum/material/iron = 30000, /datum/material/plasma = 6000)
|
||||||
|
build_path = /obj/item/ammo_box/c10mm/fire
|
||||||
|
category = list("Ammo")
|
||||||
|
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
|
||||||
|
|
||||||
|
/datum/design/m10hpbox
|
||||||
|
name = "ammo box (10mm Hollowpoint)"
|
||||||
|
desc = "A box of ammo containing 20 rounds designed to tear through unarmored opponents, while being completely ineffective against armor."
|
||||||
|
id = "m10hpbox"
|
||||||
|
build_type = PROTOLATHE
|
||||||
|
materials = list(/datum/material/iron = 30000, /datum/material/glass = 6000)
|
||||||
|
build_path = /obj/item/ammo_box/c10mm/hp
|
||||||
|
category = list("Ammo")
|
||||||
|
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import { useBackend } from '../backend';
|
import { useBackend } from '../backend';
|
||||||
import { Button, Section } from '../components';
|
import { Box, Button, Section } from '../components';
|
||||||
import { Window } from '../layouts';
|
import { Window } from '../layouts';
|
||||||
|
import { classes } from 'common/react';
|
||||||
|
|
||||||
export const DecalPainter = (props, context) => {
|
export const DecalPainter = (props, context) => {
|
||||||
const { act, data } = useBackend(context);
|
const { act, data } = useBackend(context);
|
||||||
@@ -16,11 +17,25 @@ export const DecalPainter = (props, context) => {
|
|||||||
{decal_list.map(decal => (
|
{decal_list.map(decal => (
|
||||||
<Button
|
<Button
|
||||||
key={decal.decal}
|
key={decal.decal}
|
||||||
content={decal.name}
|
style={{
|
||||||
|
width: '48px',
|
||||||
|
height: '48px',
|
||||||
|
padding: 0,
|
||||||
|
}}
|
||||||
selected={decal.decal === data.decal_style}
|
selected={decal.decal === data.decal_style}
|
||||||
|
tooltip={decal.name}
|
||||||
onClick={() => act('select decal', {
|
onClick={() => act('select decal', {
|
||||||
decals: decal.decal,
|
decals: decal.decal,
|
||||||
})} />
|
})}>
|
||||||
|
<Box
|
||||||
|
className={classes([
|
||||||
|
'decals32x32',
|
||||||
|
data.decal_dir_text + '-' + decal.decal + (data.decal_color ? '_' + data.decal_color : ''),
|
||||||
|
])}
|
||||||
|
style={{
|
||||||
|
transform: 'scale(1.5) translate(17%, 17%)',
|
||||||
|
}} />
|
||||||
|
</Button>
|
||||||
))}
|
))}
|
||||||
</Section>
|
</Section>
|
||||||
<Section title="Decal Color">
|
<Section title="Decal Color">
|
||||||
@@ -28,7 +43,12 @@ export const DecalPainter = (props, context) => {
|
|||||||
return (
|
return (
|
||||||
<Button
|
<Button
|
||||||
key={color.colors}
|
key={color.colors}
|
||||||
content={color.colors === "red"
|
style={{
|
||||||
|
width: '48px',
|
||||||
|
height: '48px',
|
||||||
|
padding: 0,
|
||||||
|
}}
|
||||||
|
tooltip={color.colors === "red"
|
||||||
? "Red"
|
? "Red"
|
||||||
: color.colors === "white"
|
: color.colors === "white"
|
||||||
? "White"
|
? "White"
|
||||||
@@ -36,7 +56,16 @@ export const DecalPainter = (props, context) => {
|
|||||||
selected={color.colors === data.decal_color}
|
selected={color.colors === data.decal_color}
|
||||||
onClick={() => act('select color', {
|
onClick={() => act('select color', {
|
||||||
colors: color.colors,
|
colors: color.colors,
|
||||||
})} />
|
})}>
|
||||||
|
<Box
|
||||||
|
className={classes([
|
||||||
|
'decals32x32',
|
||||||
|
data.decal_dir_text + '-' + data.decal_style + (color.colors ? '_' + color.colors : ''),
|
||||||
|
])}
|
||||||
|
style={{
|
||||||
|
transform: 'scale(1.5) translate(17%, 17%)',
|
||||||
|
}} />
|
||||||
|
</Button>
|
||||||
);
|
);
|
||||||
})}
|
})}
|
||||||
</Section>
|
</Section>
|
||||||
@@ -45,7 +74,12 @@ export const DecalPainter = (props, context) => {
|
|||||||
return (
|
return (
|
||||||
<Button
|
<Button
|
||||||
key={dir.dirs}
|
key={dir.dirs}
|
||||||
content={dir.dirs === 1
|
style={{
|
||||||
|
width: '48px',
|
||||||
|
height: '48px',
|
||||||
|
padding: 0,
|
||||||
|
}}
|
||||||
|
tooltip={dir.dirs === 1
|
||||||
? "North"
|
? "North"
|
||||||
: dir.dirs === 2
|
: dir.dirs === 2
|
||||||
? "South"
|
? "South"
|
||||||
@@ -55,7 +89,23 @@ export const DecalPainter = (props, context) => {
|
|||||||
selected={dir.dirs === data.decal_direction}
|
selected={dir.dirs === data.decal_direction}
|
||||||
onClick={() => act('selected direction', {
|
onClick={() => act('selected direction', {
|
||||||
dirs: dir.dirs,
|
dirs: dir.dirs,
|
||||||
})} />
|
})}>
|
||||||
|
<Box
|
||||||
|
className={classes([
|
||||||
|
'decals32x32',
|
||||||
|
(dir.dirs === 1
|
||||||
|
? "north"
|
||||||
|
: dir.dirs === 2
|
||||||
|
? "south"
|
||||||
|
: dir.dirs === 4
|
||||||
|
? "east"
|
||||||
|
: "west")
|
||||||
|
+ '-' + data.decal_style + (data.decal_color ? '_' + data.decal_color : ''),
|
||||||
|
])}
|
||||||
|
style={{
|
||||||
|
transform: 'scale(1.5) translate(17%, 17%)',
|
||||||
|
}} />
|
||||||
|
</Button>
|
||||||
);
|
);
|
||||||
})}
|
})}
|
||||||
</Section>
|
</Section>
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ export const Limbgrower = (props, context) => {
|
|||||||
max_reagents,
|
max_reagents,
|
||||||
categories = [],
|
categories = [],
|
||||||
busy,
|
busy,
|
||||||
|
disk = [],
|
||||||
} = data;
|
} = data;
|
||||||
const [tab, setTab] = useSharedState(
|
const [tab, setTab] = useSharedState(
|
||||||
context, 'category', categories[0]?.name);
|
context, 'category', categories[0]?.name);
|
||||||
@@ -20,7 +21,7 @@ export const Limbgrower = (props, context) => {
|
|||||||
return (
|
return (
|
||||||
<Window
|
<Window
|
||||||
title="Limb Grower"
|
title="Limb Grower"
|
||||||
width={400}
|
width={500}
|
||||||
height={550}>
|
height={550}>
|
||||||
{!!busy && (
|
{!!busy && (
|
||||||
<Dimmer fontSize="32px">
|
<Dimmer fontSize="32px">
|
||||||
@@ -29,6 +30,21 @@ export const Limbgrower = (props, context) => {
|
|||||||
</Dimmer>
|
</Dimmer>
|
||||||
)}
|
)}
|
||||||
<Window.Content scrollable>
|
<Window.Content scrollable>
|
||||||
|
<Section title="Data Disk" buttons={
|
||||||
|
<Button
|
||||||
|
content="Eject Disk"
|
||||||
|
icon="eject"
|
||||||
|
onClick={() => act('eject_disk')}
|
||||||
|
disabled={!disk['disk']}
|
||||||
|
/>
|
||||||
|
}>
|
||||||
|
{disk['name'] ? (
|
||||||
|
<div>
|
||||||
|
Containing data for {disk['name']},<br />
|
||||||
|
Attempting to create genitalia will use the disk's data.
|
||||||
|
</div>
|
||||||
|
) : disk['disk'] ? "No data." : "No disk."}
|
||||||
|
</Section>
|
||||||
<Section title="Reagents">
|
<Section title="Reagents">
|
||||||
<Box mb={1}>
|
<Box mb={1}>
|
||||||
{total_reagents} / {max_reagents} reagent capacity used.
|
{total_reagents} / {max_reagents} reagent capacity used.
|
||||||
@@ -41,8 +57,8 @@ export const Limbgrower = (props, context) => {
|
|||||||
buttons={(
|
buttons={(
|
||||||
<Button.Confirm
|
<Button.Confirm
|
||||||
textAlign="center"
|
textAlign="center"
|
||||||
width="120px"
|
|
||||||
content="Remove Reagent"
|
content="Remove Reagent"
|
||||||
|
icon="fill-drip"
|
||||||
color="bad"
|
color="bad"
|
||||||
onClick={() => act('empty_reagent', {
|
onClick={() => act('empty_reagent', {
|
||||||
reagent_type: reagent.reagent_type,
|
reagent_type: reagent.reagent_type,
|
||||||
@@ -73,7 +89,6 @@ export const Limbgrower = (props, context) => {
|
|||||||
buttons={(
|
buttons={(
|
||||||
<Button
|
<Button
|
||||||
content="Make"
|
content="Make"
|
||||||
color="good"
|
|
||||||
onClick={() => act('make_limb', {
|
onClick={() => act('make_limb', {
|
||||||
design_id: design.id,
|
design_id: design.id,
|
||||||
active_tab: design.parent_category,
|
active_tab: design.parent_category,
|
||||||
|
|||||||
Reference in New Issue
Block a user