Porting the BEPIS research machinery. (#12277)

* Initial B.E.P.I.S port.

* All nodes but sticky tape are in. Sweet.

* Mapping the BEPIS :DDD

* ah

* deers.
This commit is contained in:
Ghom
2020-05-24 22:05:15 +02:00
committed by GitHub
parent e9068f05eb
commit ab5d65a454
82 changed files with 1620 additions and 163 deletions
+58
View File
@@ -13,6 +13,53 @@
custom_price = 1200
custom_premium_price = 1200
/obj/item/toy/sprayoncan
name = "spray-on insulation applicator"
desc = "What is the number one problem facing our station today?"
icon = 'icons/obj/clothing/gloves.dmi'
icon_state = "sprayoncan"
/obj/item/toy/sprayoncan/afterattack(atom/target, mob/living/carbon/user, proximity)
if(iscarbon(target) && proximity)
var/mob/living/carbon/C = target
var/mob/living/carbon/U = user
var/success = C.equip_to_slot_if_possible(new /obj/item/clothing/gloves/color/yellow/sprayon, ITEM_SLOT_GLOVES, TRUE, TRUE)
if(success)
if(C == user)
C.visible_message("<span class='notice'>[U] sprays their hands with glittery rubber!</span>")
else
C.visible_message("<span class='warning'>[U] sprays glittery rubber on the hands of [C]!</span>")
else
C.visible_message("<span class='warning'>The rubber fails to stick to [C]'s hands!</span>")
qdel(src)
/obj/item/clothing/gloves/color/yellow/sprayon
desc = "How're you gonna get 'em off, nerd?"
name = "spray-on insulated gloves"
icon_state = "sprayon"
item_state = "sprayon"
permeability_coefficient = 0
resistance_flags = ACID_PROOF
var/shocks_remaining = 10
/obj/item/clothing/gloves/color/yellow/sprayon/Initialize()
.=..()
ADD_TRAIT(src, TRAIT_NODROP, GLOVE_TRAIT)
/obj/item/clothing/gloves/color/yellow/sprayon/equipped(mob/user, slot)
. = ..()
RegisterSignal(user, COMSIG_LIVING_SHOCK_PREVENTED, .proc/Shocked)
/obj/item/clothing/gloves/color/yellow/sprayon/proc/Shocked()
shocks_remaining--
if(shocks_remaining < 0)
qdel(src) //if we run out of uses, the gloves crumble away into nothing, just like my dreams after working with .dm
/obj/item/clothing/gloves/color/yellow/sprayon/dropped()
.=..()
qdel(src) //loose nodrop items bad
/obj/item/clothing/gloves/color/fyellow //Cheap Chinese Crap
desc = "These gloves are cheap knockoffs of the coveted ones - no way this can end badly."
name = "budget insulated gloves"
@@ -202,6 +249,17 @@
permeability_coefficient = 0.3
resistance_flags = FIRE_PROOF | ACID_PROOF
/obj/item/clothing/gloves/color/latex/engineering
name = "tinker's gloves"
desc = "Overdesigned engineering gloves that have automated construction subrutines dialed in, allowing for faster construction while worn."
icon = 'icons/obj/clothing/clockwork_garb.dmi'
icon_state = "clockwork_gauntlets"
item_state = "clockwork_gauntlets"
siemens_coefficient = 0.8
permeability_coefficient = 0.3
carrytrait = TRAIT_QUICK_BUILD
custom_materials = list(/datum/material/iron=2000, /datum/material/silver=1500, /datum/material/gold = 1000)
/obj/item/clothing/gloves/color/white
name = "white gloves"
desc = "These look pretty fancy."
+10
View File
@@ -60,6 +60,16 @@
cold_protection = HEAD
min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT
/obj/item/clothing/head/hardhat/red/upgraded
name = "workplace-ready firefighter helmet"
desc = "By applying state of the art lighting technology to a fire helmet, and using photo-chemical hardening methods, this hardhat will protect you from robust workplace hazards."
icon_state = "hardhat0_purple"
item_state = "hardhat0_purple"
brightness_on = 5
resistance_flags = FIRE_PROOF | ACID_PROOF
custom_materials = list(/datum/material/iron = 4000, /datum/material/glass = 1000, /datum/material/plastic = 3000, /datum/material/silver = 500)
hat_type = "purple"
/obj/item/clothing/head/hardhat/white
icon_state = "hardhat0_white"
item_state = "hardhat0_white"
+1
View File
@@ -40,6 +40,7 @@
/datum/reagent/pax,
/datum/reagent/consumable/laughter,
/datum/reagent/concentrated_barbers_aid,
/datum/reagent/baldium,
/datum/reagent/colorful_reagent,
/datum/reagent/peaceborg_confuse,
/datum/reagent/peaceborg_tire,
+10 -10
View File
@@ -137,11 +137,11 @@
if(cached_Bdamage <= HEALTH_THRESHOLD_DEAD) //Fixing dead brains yeilds a trauma
if((cached_Bdamage <= HEALTH_THRESHOLD_DEAD) && (brainmob.health > HEALTH_THRESHOLD_DEAD))
if(prob(80))
gain_trauma_type(BRAIN_TRAUMA_MILD)
gain_trauma_type(BRAIN_TRAUMA_MILD, natural_gain = TRUE)
else if(prob(50))
gain_trauma_type(BRAIN_TRAUMA_SEVERE)
gain_trauma_type(BRAIN_TRAUMA_SEVERE, natural_gain = TRUE)
else
gain_trauma_type(BRAIN_TRAUMA_SPECIAL)
gain_trauma_type(BRAIN_TRAUMA_SPECIAL, natural_gain = TRUE)
return
if((organ_flags & ORGAN_FAILING) && O.is_drainable() && O.reagents.has_reagent(/datum/reagent/medicine/mannitol)) //attempt to heal the brain
@@ -253,16 +253,16 @@
damage_delta = damage - prev_damage
if(damage > BRAIN_DAMAGE_MILD)
if(prob(damage_delta * (1 + max(0, (damage - BRAIN_DAMAGE_MILD)/100)))) //Base chance is the hit damage; for every point of damage past the threshold the chance is increased by 1% //learn how to do your bloody math properly goddamnit
gain_trauma_type(BRAIN_TRAUMA_MILD)
gain_trauma_type(BRAIN_TRAUMA_MILD, natural_gain = TRUE)
if(prev_damage <= BRAIN_DAMAGE_MILD && owner)
var/datum/skill_modifier/S
ADD_SKILL_MODIFIER_BODY(/datum/skill_modifier/brain_damage, null, owner, S)
if(damage > BRAIN_DAMAGE_SEVERE)
if(prob(damage_delta * (1 + max(0, (damage - BRAIN_DAMAGE_SEVERE)/100)))) //Base chance is the hit damage; for every point of damage past the threshold the chance is increased by 1%
if(prob(20))
gain_trauma_type(BRAIN_TRAUMA_SPECIAL)
gain_trauma_type(BRAIN_TRAUMA_SPECIAL, natural_gain = TRUE)
else
gain_trauma_type(BRAIN_TRAUMA_SEVERE)
gain_trauma_type(BRAIN_TRAUMA_SEVERE, natural_gain = TRUE)
if(prev_damage <= BRAIN_DAMAGE_SEVERE && owner)
var/datum/skill_modifier/S
ADD_SKILL_MODIFIER_BODY(/datum/skill_modifier/heavy_brain_damage, null, owner, S)
@@ -308,7 +308,7 @@
if(istype(BT, brain_trauma_type) && (BT.resilience <= resilience))
. += BT
/obj/item/organ/brain/proc/can_gain_trauma(datum/brain_trauma/trauma, resilience)
/obj/item/organ/brain/proc/can_gain_trauma(datum/brain_trauma/trauma, resilience, natural_gain = FALSE)
if(!ispath(trauma))
trauma = trauma.type
if(!initial(trauma.can_gain))
@@ -341,7 +341,7 @@
if(TRAUMA_RESILIENCE_ABSOLUTE)
max_traumas = TRAUMA_LIMIT_ABSOLUTE
if(resilience_tier_count >= max_traumas)
if(natural_gain && resilience_tier_count >= max_traumas)
return FALSE
return TRUE
@@ -381,11 +381,11 @@
return actual_trauma
//Add a random trauma of a certain subtype
/obj/item/organ/brain/proc/gain_trauma_type(brain_trauma_type = /datum/brain_trauma, resilience)
/obj/item/organ/brain/proc/gain_trauma_type(brain_trauma_type = /datum/brain_trauma, resilience, natural_gain = FALSE)
var/list/datum/brain_trauma/possible_traumas = list()
for(var/T in subtypesof(brain_trauma_type))
var/datum/brain_trauma/BT = T
if(can_gain_trauma(BT, resilience) && initial(BT.random_gain))
if(can_gain_trauma(BT, resilience, natural_gain) && initial(BT.random_gain))
possible_traumas += BT
if(!LAZYLEN(possible_traumas))
@@ -500,3 +500,33 @@
user.visible_message("[user] milks [src] using \the [O].", "<span class='notice'>You milk [src] using \the [O].</span>")
else
to_chat(user, "<span class='danger'>The udder is dry. Wait a bit longer...</span>")
/mob/living/simple_animal/deer
name = "doe"
desc = "A gentle, peaceful forest animal. How did this get into space?"
icon_state = "deer-doe"
icon_living = "deer-doe"
icon_dead = "deer-doe-dead"
gender = FEMALE
mob_biotypes = MOB_ORGANIC|MOB_BEAST
speak = list("Weeeeeeee?","Weeee","WEOOOOOOOOOO")
speak_emote = list("grunts","grunts lowly")
emote_hear = list("brays.")
emote_see = list("shakes its head.")
speak_chance = 1
turns_per_move = 5
see_in_dark = 6
butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 3)
response_help_continuous = "pets"
response_help_simple = "pet"
response_disarm_continuous = "gently nudges"
response_disarm_simple = "gently nudge"
response_harm_continuous = "kicks"
response_harm_simple = "kick"
attack_verb_continuous = "bucks"
attack_verb_simple = "buck"
attack_sound = 'sound/weapons/punch1.ogg'
health = 75
maxHealth = 75
blood_volume = BLOOD_VOLUME_NORMAL
footstep_type = FOOTSTEP_MOB_SHOE
@@ -84,8 +84,33 @@
crusher_loot = /obj/item/crusher_trophy/watcher_wing
loot = list()
butcher_results = list(/obj/item/stack/ore/diamond = 2, /obj/item/stack/sheet/sinew = 2, /obj/item/stack/sheet/bone = 1)
search_objects = 1
wanted_objects = list(/obj/item/pen/survival, /obj/item/stack/ore/diamond)
field_of_vision_type = FOV_270_DEGREES //Obviously, it's one eyeball.
/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/Life()
. = ..()
if(stat == CONSCIOUS)
consume_bait()
/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/proc/consume_bait()
var/obj/item/stack/ore/diamond/diamonds = locate(/obj/item/stack/ore/diamond) in oview(src, 9)
var/obj/item/pen/survival/bait = locate(/obj/item/pen/survival) in oview(src, 9)
if(!diamonds && !bait)
return
if(diamonds)
var/distanced = 0
distanced = get_dist(loc,diamonds.loc)
if(distanced <= 1 && diamonds)
qdel(diamonds)
src.visible_message("<span class='notice'>[src] consumes [diamonds], and it disappears! ...At least, you think.</span>")
if(bait)
var/distanceb = 0
distanceb = get_dist(loc,bait.loc)
if(distanceb <= 1 && bait)
qdel(bait)
visible_message("<span class='notice'>[src] examines [bait] closer, and telekinetically shatters the pen.</span>")
/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/random/Initialize()
. = ..()
if(prob(1))
+14
View File
@@ -220,3 +220,17 @@
item_state = initial(item_state)
lefthand_file = initial(lefthand_file)
righthand_file = initial(righthand_file)
/obj/item/pen/survival
name = "survival pen"
desc = "The latest in portable survival technology, this pen was designed as a miniature diamond pickaxe. Watchers find them very desirable for their diamond exterior."
icon = 'icons/obj/bureaucracy.dmi'
icon_state = "digging_pen"
item_state = "pen"
force = 3
w_class = WEIGHT_CLASS_TINY
custom_materials = list(/datum/material/iron=10, /datum/material/diamond=100, /datum/material/titanium = 10)
pressure_resistance = 2
grind_results = list(/datum/reagent/iron = 2, /datum/reagent/iodine = 1)
tool_behaviour = TOOL_MINING //For the classic "digging out of prison with a spoon but you're in space so this analogy doesn't work" situation.
toolspeed = 10 //You will never willingly choose to use one of these over a shovel.
+12
View File
@@ -337,3 +337,15 @@
grind_results = list(/datum/reagent/iodine = 40, /datum/reagent/iron = 10)
var/charges = 5
var/max_charges = 5
/obj/item/toner/large
name = "large toner cartridge"
grind_results = list(/datum/reagent/iodine = 90, /datum/reagent/iron = 10)
charges = 15
max_charges = 15
/obj/item/toner/extreme
name = "extremely large toner cartridge"
desc = "Why would ANYONE need THIS MUCH TONER?"
charges = 200
max_charges = 200
+4
View File
@@ -227,6 +227,7 @@
icon_state = "h+cell"
maxcharge = 15000
chargerate = 2250
rating = 2
/obj/item/stock_parts/cell/high/empty
start_charged = FALSE
@@ -237,6 +238,7 @@
maxcharge = 20000
custom_materials = list(/datum/material/glass=300)
chargerate = 2000
rating = 3
/obj/item/stock_parts/cell/super/empty
start_charged = FALSE
@@ -247,6 +249,7 @@
maxcharge = 30000
custom_materials = list(/datum/material/glass=400)
chargerate = 3000
rating = 4
/obj/item/stock_parts/cell/hyper/empty
start_charged = FALSE
@@ -258,6 +261,7 @@
maxcharge = 40000
custom_materials = list(/datum/material/glass=600)
chargerate = 4000
rating = 5
/obj/item/stock_parts/cell/bluespace/empty
start_charged = FALSE
+1
View File
@@ -310,6 +310,7 @@
if(H.gloves)
var/obj/item/clothing/gloves/G = H.gloves
if(G.siemens_coefficient == 0)
SEND_SIGNAL(M, COMSIG_LIVING_SHOCK_PREVENTED, power_source, source, siemens_coeff, dist_check)
return 0 //to avoid spamming with insulated glvoes on
var/area/source_area
+22 -20
View File
@@ -13,11 +13,16 @@
var/pin_removeable = 0 // Can be replaced by any pin.
var/obj/item/gun/gun
/obj/item/firing_pin/New(newloc)
..()
/obj/item/firing_pin/Initialize(newloc)
. = ..()
if(istype(newloc, /obj/item/gun))
gun = newloc
/obj/item/firing_pin/Destroy()
if(gun)
gun.pin = null
return ..()
/obj/item/firing_pin/afterattack(atom/target, mob/user, proximity_flag)
. = ..()
if(proximity_flag)
@@ -224,24 +229,6 @@
suit_requirement = /obj/item/clothing/suit/bluetag
tagcolor = "blue"
/obj/item/firing_pin/Destroy()
if(gun)
gun.pin = null
return ..()
//Station Locked
/obj/item/firing_pin/away
name = "station locked pin"
desc = "A firing pin that only will fire when off the station."
/obj/item/firing_pin/away/pin_auth(mob/living/user)
var/area/station_area = get_area(src)
if(!station_area || is_station_level(station_area.z))
to_chat(user, "<span class='warning'>The pin beeps, refusing to fire.</span>")
return FALSE
return TRUE
/obj/item/firing_pin/security_level
name = "security level firing pin"
desc = "A sophisticated firing pin that authorizes operation based on its settings and current security level."
@@ -325,3 +312,18 @@
/obj/item/firing_pin/security_level/pin_auth(mob/living/user)
return (only_lethals && !(gun.chambered?.harmful)) || ISINRANGE(GLOB.security_level, min_sec_level, max_sec_level)
// Explorer Firing Pin- Prevents use on station Z-Level, so it's justifiable to give Explorers guns that don't suck.
/obj/item/firing_pin/explorer
name = "outback firing pin"
desc = "A firing pin used by the austrailian defense force, retrofit to prevent weapon discharge on the station."
icon_state = "firing_pin_explorer"
fail_message = "<span class='warning'>CANNOT FIRE WHILE ON STATION, MATE!</span>"
// This checks that the user isn't on the station Z-level.
/obj/item/firing_pin/explorer/pin_auth(mob/living/user)
var/turf/station_check = get_turf(user)
if(!station_check||is_station_level(station_check.z))
to_chat(user, "<span class='warning'>You cannot use your weapon while on the station!</span>")
return FALSE
return TRUE
@@ -1735,6 +1735,22 @@
H.facial_hair_style = "Very Long Beard"
H.update_hair()
/datum/reagent/baldium
name = "Baldium"
description = "A major cause of hair loss across the world."
reagent_state = LIQUID
color = "#ecb2cf"
taste_description = "bitterness"
/datum/reagent/baldium/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
if(method == TOUCH || method == VAPOR)
if(M && ishuman(M))
var/mob/living/carbon/human/H = M
to_chat(H, "<span class='danger'>Your hair is falling out in clumps!</span>")
H.hair_style = "Bald"
H.facial_hair_style = "Shaved"
H.update_hair()
/datum/reagent/saltpetre
name = "Saltpetre"
description = "Volatile. Controversial. Third Thing."
@@ -1019,3 +1019,20 @@
to_chat(M, "<span class='notice'>[tox_message]</span>")
. = 1
..()
/datum/reagent/toxin/leadacetate
name = "Lead Acetate"
description = "Used hundreds of years ago as a sweetener, before it was realized that it's incredibly poisonous."
reagent_state = SOLID
color = "#2b2b2b" // rgb: 127, 132, 0
toxpwr = 0.5
taste_mult = 1.3
taste_description = "sugary sweetness"
/datum/reagent/toxin/leadacetate/on_mob_life(mob/living/carbon/M)
M.adjustOrganLoss(ORGAN_SLOT_EARS,1)
M.adjustOrganLoss(ORGAN_SLOT_BRAIN,1)
if(prob(1))
to_chat(M, "<span class='notice'>Ah, what was that? You thought you heard something...</span>")
M.confused += 5
return ..()
@@ -631,6 +631,11 @@
results = list(/datum/reagent/concentrated_barbers_aid = 2)
required_reagents = list(/datum/reagent/barbers_aid = 1, /datum/reagent/toxin/mutagen = 1)
/datum/chemical_reaction/baldium
results = list(/datum/reagent/baldium = 1)
required_reagents = list(/datum/reagent/radium = 1, /datum/reagent/toxin/acid = 1, /datum/reagent/lye = 1)
required_temp = 395
/datum/chemical_reaction/saltpetre
name = "saltpetre"
id = /datum/reagent/saltpetre
@@ -0,0 +1,117 @@
/obj/item/reagent_containers/glass/maunamug
name = "mauna mug"
desc = "A drink served in a classy mug. Now with built-in heating!"
icon = 'icons/obj/mauna_mug.dmi'
icon_state = "maunamug"
spillable = TRUE
reagent_flags = OPENCONTAINER
// fill_icon_state = "maunafilling"
// fill_icon_thresholds = list(25)
var/obj/item/stock_parts/cell/cell
var/open = FALSE
var/on = FALSE
/obj/item/reagent_containers/glass/maunamug/Initialize(mapload, vol)
. = ..()
cell = new /obj/item/stock_parts/cell(src)
/obj/item/reagent_containers/glass/maunamug/examine(mob/user)
. = ..()
. += "<span class='notice'>The status display reads: Current temperature: <b>[reagents.chem_temp]K</b> Current Charge:[cell ? "[cell.charge / cell.maxcharge * 100]%" : "No cell found"].</span>"
if(open)
. += "<span class='notice'>The battery case is open.</span>"
/obj/item/reagent_containers/glass/maunamug/update_overlays()
. = ..()
if(reagents.total_volume >= 25)
. += mutable_appearance('icons/obj/reagentfillings.dmi', "maunafilling25", color = mix_color_from_reagents(reagents.reagent_list))
/obj/item/reagent_containers/glass/maunamug/process()
..()
if(on && (!cell || cell.charge <= 0)) //Check if we ran out of power
change_power_status(FALSE)
return FALSE
cell.use(10) //Basic cell goes for like 200 seconds, bluespace for 8000
if(!reagents.total_volume)
return FALSE
var/max_temp = min(500 + (500 * (0.2 * cell.rating)), 1000) // 373 to 1000
reagents.adjust_thermal_energy(0.8 * cell.maxcharge * reagents.total_volume, max_temp = max_temp) // 4 kelvin every tick on a basic cell. 160k on bluespace
reagents.handle_reactions()
update_icon()
if(reagents.chem_temp >= max_temp)
change_power_status(FALSE)
audible_message("<span class='notice'>The Mauna Mug lets out a happy beep and turns off!</span>")
playsound(src, 'sound/machines/chime.ogg', 50)
/obj/item/reagent_containers/glass/maunamug/Destroy()
if(cell)
QDEL_NULL(cell)
STOP_PROCESSING(SSobj, src)
. = ..()
/obj/item/reagent_containers/glass/maunamug/attack_self(mob/user)
if(on)
change_power_status(FALSE)
else
if(!cell || cell.charge <= 0)
return FALSE //No power, so don't turn on
change_power_status(TRUE)
/obj/item/reagent_containers/glass/maunamug/proc/change_power_status(status)
on = status
if(on)
START_PROCESSING(SSobj, src)
else
STOP_PROCESSING(SSobj, src)
update_icon()
/obj/item/reagent_containers/glass/maunamug/screwdriver_act(mob/living/user, obj/item/I)
. = ..()
open = !open
to_chat(user, "<span class='notice'>You screw the battery case on [src] [open ? "open" : "closed"] .</span>")
update_icon()
/obj/item/reagent_containers/glass/maunamug/attackby(obj/item/I, mob/user, params)
add_fingerprint(user)
if(!istype(I, /obj/item/stock_parts/cell))
return ..()
if(!open)
to_chat(user, "<span class='warning'>The battery case must be open to insert a power cell!</span>")
return FALSE
if(cell)
to_chat(user, "<span class='warning'>There is already a power cell inside!</span>")
return FALSE
else if(!user.transferItemToLoc(I, src))
return
cell = I
user.visible_message("<span class='notice'>[user] inserts a power cell into [src].</span>", "<span class='notice'>You insert the power cell into [src].</span>")
update_icon()
/obj/item/reagent_containers/glass/maunamug/attack_hand(mob/living/user)
if(cell && open)
cell.update_icon()
user.put_in_hands(cell)
cell = null
to_chat(user, "<span class='notice'>You remove the power cell from [src].</span>")
on = FALSE
update_icon()
return TRUE
return ..()
/obj/item/reagent_containers/glass/maunamug/update_icon()
..()
if(open)
if(cell)
icon_state = "maunamug_bat"
else
icon_state = "maunamug_no_bat"
else if(on)
icon_state = "maunamug_on"
else
icon_state = "maunamug"
if(reagents.total_volume && reagents.chem_temp >= 400)
var/intensity = (reagents.chem_temp - 400) * 1 / 600 //Get the opacity of the incandescent overlay. Ranging from 400 to 1000
var/mutable_appearance/mug_glow = mutable_appearance(icon, "maunamug_incand")
mug_glow.alpha = 255 * intensity
add_overlay(mug_glow)
+270
View File
@@ -0,0 +1,270 @@
//This system is designed to act as an in-between for cargo and science, and the first major money sink in the game outside of just buying things from cargo (As of 10/9/19, anyway).
//economics defined values, subject to change should anything be too high or low in practice.
#define MACHINE_OPERATION 100000
#define MACHINE_OVERLOAD 500000
#define MAJOR_THRESHOLD 5500
#define MINOR_THRESHOLD 3500
#define STANDARD_DEVIATION 1000
/obj/machinery/rnd/bepis
name = "\improper B.E.P.I.S. Chamber"
desc = "A high fidelity testing device which unlocks the secrets of the known universe using the two most powerful substances available to man: excessive amounts of electricity and capital."
icon = 'icons/obj/machines/bepis.dmi'
icon_state = "chamber"
density = TRUE
layer = ABOVE_MOB_LAYER
use_power = IDLE_POWER_USE
active_power_usage = 1500
circuit = /obj/item/circuitboard/machine/bepis
var/banking_amount = 100
var/banked_cash = 0 //stored player cash
var/datum/bank_account/account //payer's account.
var/account_name //name of the payer's account.
var/error_cause = null
//Vars related to probability and chance of success for testing
var/major_threshold = MAJOR_THRESHOLD
var/minor_threshold = MINOR_THRESHOLD
var/std = STANDARD_DEVIATION //That's Standard Deviation, what did you think it was?
//Stock part variables
var/power_saver = 1
var/inaccuracy_percentage = 1.5
var/positive_cash_offset = 0
var/negative_cash_offset = 0
var/minor_rewards = list(/obj/item/stack/circuit_stack/full, //To add a new minor reward, add it here.
/obj/item/airlock_painter/decal,
/obj/item/pen/survival,
/obj/item/circuitboard/machine/sleeper/party,
/obj/item/toy/sprayoncan)
var/static/list/item_list = list()
/obj/machinery/rnd/bepis/attackby(obj/item/O, mob/user, params)
if(default_deconstruction_screwdriver(user, "chamber_open", "chamber", O))
update_icon_state()
return
if(default_deconstruction_crowbar(O))
return
if(!is_operational())
to_chat(user, "<span class='notice'>[src] can't accept money when it's not functioning.</span>")
return
if(istype(O, /obj/item/holochip) || istype(O, /obj/item/stack/spacecash))
var/deposit_value = O.get_item_credit_value()
banked_cash += deposit_value
qdel(O)
say("Deposited [deposit_value] credits into storage.")
update_icon_state()
return
if(istype(O, /obj/item/card/id))
var/obj/item/card/id/Card = O
if(Card.registered_account)
account = Card.registered_account
account_name = Card.registered_name
say("New account detected. Console Updated.")
else
say("No account detected on card. Aborting.")
return
return ..()
/obj/machinery/rnd/bepis/RefreshParts()
var/C = 0
var/M = 0
var/L = 0
var/S = 0
for(var/obj/item/stock_parts/capacitor/Cap in component_parts)
C += ((Cap.rating - 1) * 0.1)
power_saver = 1 - C
for(var/obj/item/stock_parts/manipulator/Manip in component_parts)
M += ((Manip.rating - 1) * 250)
positive_cash_offset = M
for(var/obj/item/stock_parts/micro_laser/Laser in component_parts)
L += ((Laser.rating - 1) * 250)
negative_cash_offset = L
for(var/obj/item/stock_parts/scanning_module/Scan in component_parts)
S += ((Scan.rating - 1) * 0.25)
inaccuracy_percentage = (1.5 - S)
/obj/machinery/rnd/bepis/proc/depositcash()
var/deposit_value = 0
deposit_value = banking_amount
if(deposit_value == 0)
update_icon_state()
say("Attempting to deposit 0 credits. Aborting.")
return
deposit_value = clamp(round(deposit_value, 1), 1, 15000)
if(!account)
say("Cannot find user account. Please swipe a valid ID.")
return
if(!account.has_money(deposit_value))
say("You do not possess enough credits.")
return
account.adjust_money(-deposit_value) //The money vanishes, not paid to any accounts.
SSblackbox.record_feedback("amount", "BEPIS_credits_spent", deposit_value)
banked_cash += deposit_value
use_power(1000 * power_saver)
say("Cash deposit successful. There is [banked_cash] in the chamber.")
update_icon_state()
return
/obj/machinery/rnd/bepis/proc/withdrawcash()
var/withdraw_value = 0
withdraw_value = banking_amount
if(withdraw_value > banked_cash)
say("Cannot withdraw more than stored funds. Aborting.")
else
banked_cash -= withdraw_value
new /obj/item/holochip(src.loc, withdraw_value)
say("Withdrawing [withdraw_value] credits from the chamber.")
update_icon_state()
return
/obj/machinery/rnd/bepis/proc/calcsuccess()
var/turf/dropturf = null
var/gauss_major = 0
var/gauss_minor = 0
var/gauss_real = 0
var/list/turfs = block(locate(x-1,y-1,z),locate(x+1,y+1,z)) //NO MORE DISCS IN WINDOWS
while(length(turfs))
var/turf/T = pick_n_take(turfs)
if(is_blocked_turf(T, exclude_mobs=TRUE))
continue
else
dropturf = T
break
if (!dropturf)
dropturf = drop_location()
gauss_major = (gaussian(major_threshold, std) - negative_cash_offset) //This is the randomized profit value that this experiment has to surpass to unlock a tech.
gauss_minor = (gaussian(minor_threshold, std) - negative_cash_offset) //And this is the threshold to instead get a minor prize.
gauss_real = (gaussian(banked_cash, std*inaccuracy_percentage) + positive_cash_offset) //this is the randomized profit value that your experiment expects to give.
say("Real: [gauss_real]. Minor: [gauss_minor]. Major: [gauss_major].")
flick("chamber_flash",src)
update_icon_state()
banked_cash = 0
if((gauss_real >= gauss_major) && (SSresearch.techweb_nodes_experimental.len > 0)) //Major Success.
say("Experiment concluded with major success. New technology node discovered on technology disc.")
new /obj/item/disk/tech_disk/major(dropturf,1)
if(SSresearch.techweb_nodes_experimental.len == 0)
say("Expended all available experimental technology nodes. Resorting to minor rewards.")
return
if(gauss_real >= gauss_minor) //Minor Success.
var/reward = pick(minor_rewards)
new reward(dropturf)
say("Experiment concluded with partial success. Dispensing compiled research efforts.")
return
if(gauss_real <= -1) //Critical Failure
say("ERROR: CRITICAL MACHIME MALFUNCTI- ON. CURRENCY IS NOT CRASH. CANNOT COMPUTE COMMAND: 'make bucks'") //not a typo, for once.
new /mob/living/simple_animal/deer(dropturf, 1)
use_power(MACHINE_OVERLOAD * power_saver) //To prevent gambling at low cost and also prevent spamming for infinite deer.
return
//Minor Failure
error_cause = pick("attempted to sell grey products to American dominated market.","attempted to sell gray products to British dominated market.","placed wild assumption that PDAs would go out of style.","simulated product #76 damaged brand reputation mortally.","simulated business model resembled 'pyramid scheme' by 98.7%.","product accidently granted override access to all station doors.")
say("Experiment concluded with zero product viability. Cause of error: [error_cause]")
return
/obj/machinery/rnd/bepis/update_icon_state()
if(panel_open == TRUE)
icon_state = "chamber_open"
return
if((use_power == ACTIVE_POWER_USE) && (banked_cash > 0) && (is_operational()))
icon_state = "chamber_active_loaded"
return
if (((use_power == IDLE_POWER_USE) && (banked_cash > 0)) || (banked_cash > 0) && (!is_operational()))
icon_state = "chamber_loaded"
return
if(use_power == ACTIVE_POWER_USE && is_operational())
icon_state = "chamber_active"
return
if(((use_power == IDLE_POWER_USE) && (banked_cash == 0)) || (!is_operational()))
icon_state = "chamber"
return
/obj/machinery/rnd/bepis/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
ui = new(user, src, ui_key, "bepis", name, 500, 480, master_ui, state)
ui.open()
RefreshParts()
/obj/machinery/rnd/bepis/ui_data(mob/user)
var/list/data = list()
var/powered = FALSE
var/zvalue = (banked_cash - (major_threshold - positive_cash_offset - negative_cash_offset))/(std)
var/std_success = 0
var/prob_success = 0
//Admittedly this is messy, but not nearly as messy as the alternative, which is jury-rigging an entire Z-table into the code, or making an adaptive z-table.
var/z = abs(zvalue)
if(z > 0 && z <= 0.5)
std_success = 19.1
else if(z > 0.5 && z <= 1.0)
std_success = 34.1
else if(z > 1.0 && z <= 1.5)
std_success = 43.3
else if(z > 1.5 && z <= 2.0)
std_success = 47.7
else if(z > 2.0 && z <= 2.5)
std_success = 49.4
else
std_success = 50
if(zvalue > 0)
prob_success = 50 + std_success
else if(zvalue == 0)
prob_success = 50
else
prob_success = 50 - std_success
if(use_power == ACTIVE_POWER_USE)
powered = TRUE
data["account_owner"] = account_name
data["amount"] = banking_amount
data["stored_cash"] = banked_cash
data["mean_value"] = (major_threshold - positive_cash_offset - negative_cash_offset)
data["error_name"] = error_cause
data["power_saver"] = power_saver
data["accuracy_percentage"] = inaccuracy_percentage * 100
data["positive_cash_offset"] = positive_cash_offset
data["negative_cash_offset"] = negative_cash_offset
data["manual_power"] = powered ? FALSE : TRUE
data["silicon_check"] = issilicon(user)
data["success_estimate"] = prob_success
return data
/obj/machinery/rnd/bepis/ui_act(action,params)
if(..())
return
switch(action)
if("deposit_cash")
if(use_power == IDLE_POWER_USE)
return
depositcash()
if("withdraw_cash")
if(use_power == IDLE_POWER_USE)
return
withdrawcash()
if("begin_experiment")
if(use_power == IDLE_POWER_USE)
return
if(banked_cash == 0)
say("Please deposit funds to begin testing.")
return
calcsuccess()
use_power(MACHINE_OPERATION * power_saver) //This thing should eat your APC battery if you're not careful.
use_power = IDLE_POWER_USE //Machine shuts off after use to prevent spam and look better visually.
update_icon_state()
if("amount")
var/input = text2num(params["amount"])
if(input)
banking_amount = input
if("toggle_power")
if(use_power == ACTIVE_POWER_USE)
use_power = IDLE_POWER_USE
else
use_power = ACTIVE_POWER_USE
update_icon_state()
if("account_reset")
if(use_power == IDLE_POWER_USE)
return
account_name = ""
account = null
say("Account settings reset.")
. = TRUE
@@ -122,3 +122,11 @@
build_path = /obj/item/circuitboard/machine/autolathe/toy
departmental_flags = DEPARTMENTAL_FLAG_ALL
category = list("Misc. Machinery")
/datum/design/board/hypnochair
name = "Machine Design (Enhanced Interrogation Chamber)"
desc = "Allows for the construction of circuit boards used to build an Enhanced Interrogation Chamber."
id = "hypnochair"
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
build_path = /obj/item/circuitboard/machine/hypnochair
category = list("Misc. Machinery")
@@ -66,6 +66,14 @@
category = list("Research Machinery")
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
/datum/design/board/bepis
name = "Machine Design (B.E.P.I.S. Board)"
desc = "The circuit board for a B.E.P.I.S."
id = "bepis"
build_path = /obj/item/circuitboard/machine/bepis
category = list("Research Machinery")
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
/datum/design/board/protolathe
name = "Machine Design (Protolathe Board)"
desc = "The circuit board for a protolathe."
@@ -206,6 +206,35 @@
category = list("Equipment")
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING
/datum/design/bright_helmet
name = "Workplace-Ready Firefighter Helmet"
desc = "By applying state of the art lighting technology to a fire helmet with industry standard photo-chemical hardening methods, this hardhat will protect you from robust workplace hazards."
id = "bright_helmet"
build_type = PROTOLATHE
materials = list(/datum/material/iron = 4000, /datum/material/glass = 1000, /datum/material/plastic = 3000, /datum/material/silver = 500)
build_path = /obj/item/clothing/head/hardhat/red/upgraded
category = list("Equipment")
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_CARGO
/datum/design/mauna_mug
name = "Mauna Mug"
desc = "This awesome mug will ensure your coffee never stays cold!"
id = "mauna_mug"
build_type = PROTOLATHE
materials = list(/datum/material/iron = 1000, /datum/material/glass = 100)
build_path = /obj/item/reagent_containers/glass/maunamug
category = list("Equipment")
/datum/design/rolling_table
name = "Rolly poly"
desc = "We duct-taped some wheels to the bottom of a table. It's goddamn science alright?"
id = "rolling_table"
build_type = PROTOLATHE
materials = list(/datum/material/iron = 4000)
build_path = /obj/structure/table/rolling
category = list("Equipment")
departmental_flags = DEPARTMENTAL_FLAG_ALL
/datum/design/portaseeder
name = "Portable Seed Extractor"
desc = "For the enterprising botanist on the go. Less efficient than the stationary model, it creates one seed per plant."
@@ -285,6 +314,25 @@
build_path = /obj/item/vending_refill/donksoft
category = list("Equipment")
/datum/design/eng_gloves
name = "Tinkers Gloves"
desc = "Overdesigned engineering gloves that have automated construction subroutines dialed in, allowing for faster construction while worn."
id = "eng_gloves"
build_type = PROTOLATHE
materials = list(/datum/material/iron=2000, /datum/material/silver=1500, /datum/material/gold = 1000)
build_path = /obj/item/clothing/gloves/color/latex/engineering
category = list("Equipment")
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
/datum/design/lavarods
name = "Lava-Resistant Metal Rods"
id = "lava_rods"
build_type = PROTOLATHE
materials = list(/datum/material/iron=1000, /datum/material/plasma=500, /datum/material/titanium=2000)
build_path = /obj/item/stack/rods/lava
category = list("initial", "Stock Parts")
departmental_flags = DEPARTMENTAL_FLAG_CARGO | DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING
/////////////////////////////////////////
////////////Janitor Designs//////////////
/////////////////////////////////////////
@@ -72,6 +72,16 @@
category = list("Tool Designs")
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING
/datum/design/rld_mini
name = "Mini Rapid Light Device (MRLD)"
desc = "A tool that can portable and standing lighting orbs and glowsticks."
id = "rld_mini"
build_type = PROTOLATHE
materials = list(/datum/material/iron = 20000, /datum/material/glass = 10000, /datum/material/plastic = 8000, /datum/material/gold = 2000)
build_path = /obj/item/construction/rld/mini
category = list("Tool Designs")
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_CARGO
/////////////////////////////////////////
//////////////Alien Tools////////////////
/////////////////////////////////////////
@@ -234,13 +234,13 @@
category = list("Firing Pins")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
/datum/design/pin_away
name = "Station Locked Pin"
desc = "This is a security firing pin which only authorizes users who are off station."
id = "pin_away"
/datum/design/pin_explorer
name = "Outback Firing Pin"
desc = "This firing pin only shoots while ya ain't on station, fair dinkum!"
id = "pin_explorer"
build_type = PROTOLATHE
materials = list(/datum/material/iron = 1500, /datum/material/glass = 2000)
build_path = /obj/item/firing_pin/away
materials = list(/datum/material/silver = 1000, /datum/material/gold = 1000, /datum/material/iron = 500)
build_path = /obj/item/firing_pin/explorer
category = list("Firing Pins")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
@@ -500,3 +500,13 @@
materials = list(MAT_CATEGORY_RIGID = 12000)
build_path = /obj/item/melee/cleric_mace
category = list("Imported")
/datum/design/stun_boomerang
name = "OZtek Boomerang"
desc = "Uses reverse flow gravitodynamics to flip its personal gravity back to the thrower mid-flight. Also functions similar to a stun baton."
id = "stun_boomerang"
build_type = PROTOLATHE
materials = list(/datum/material/iron = 10000, /datum/material/glass = 4000, /datum/material/silver = 10000, /datum/material/gold = 2000)
build_path = /obj/item/melee/baton/boomerang
category = list("Weapons")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+10
View File
@@ -21,6 +21,16 @@
. = ..()
stored_research = new /datum/techweb/admin
/obj/item/disk/tech_disk/major
name = "Reformatted technology disk"
desc = "A disk containing a new, completed tech from the B.E.P.I.S. Upload the disk to an R&D Console to redeem the tech."
icon_state = "rndmajordisk"
custom_materials = list(/datum/material/iron=300, /datum/material/glass=100)
/obj/item/disk/tech_disk/major/Initialize()
. = ..()
stored_research = new /datum/techweb/bepis
/obj/item/disk/tech_disk/illegal
name = "Illegal technology disk"
desc = "A technology disk containing schematics for syndicate inspired equipment."
+18 -5
View File
@@ -63,6 +63,19 @@
id = "SCIENCE"
organization = "Nanotrasen"
/datum/techweb/bepis //Should contain only 1 BEPIS tech selected at random.
id = "EXPERIMENTAL"
organization = "Nanotrasen R&D"
/datum/techweb/bepis/New()
. = ..()
var/bepis_id = pick(SSresearch.techweb_nodes_experimental) //To add a new tech to the BEPIS, add the ID to this pick list.
var/datum/techweb_node/BN = (SSresearch.techweb_node_by_id(bepis_id))
hidden_nodes -= BN.id //Has to be removed from hidden nodes
research_node(BN, TRUE, FALSE, FALSE)
update_node_status(BN)
SSresearch.techweb_nodes_experimental -= bepis_id
/datum/techweb/Destroy()
researched_nodes = null
researched_designs = null
@@ -126,17 +139,17 @@
modify_point_list(l)
/datum/techweb/proc/copy_research_to(datum/techweb/receiver, unlock_hidden = TRUE) //Adds any missing research to theirs.
if(unlock_hidden)
for(var/i in receiver.hidden_nodes)
CHECK_TICK
if(!hidden_nodes[i])
receiver.hidden_nodes -= i //We can see it so let them see it too.
for(var/i in researched_nodes)
CHECK_TICK
receiver.research_node_id(i, TRUE, FALSE)
for(var/i in researched_designs)
CHECK_TICK
receiver.add_design_by_id(i)
if(unlock_hidden)
for(var/i in receiver.hidden_nodes)
CHECK_TICK
if(!hidden_nodes[i])
receiver.hidden_nodes -= i //We can see it so let them see it too.
receiver.recalculate_nodes()
/datum/techweb/proc/copy()
@@ -7,6 +7,7 @@
var/display_name = "Errored Node"
var/description = "Why are you seeing this?"
var/hidden = FALSE //Whether it starts off hidden.
var/experimental = FALSE //If the tech can be randomly granted by the BEPIS as a reward. Meant to be fully given in tech disks, not researched.
var/starting_node = FALSE //Whether it's available without any research.
var/list/prereq_ids = list()
var/list/design_ids = list()
@@ -102,6 +103,6 @@
description = "NT default research technologies."
// Default research tech, prevents bricking
design_ids = list("basic_matter_bin", "basic_cell", "basic_scanning", "basic_capacitor", "basic_micro_laser", "micro_mani", "desttagger", "handlabel", "packagewrap",
"destructive_analyzer", "circuit_imprinter", "experimentor", "rdconsole", "design_disk", "tech_disk", "rdserver", "rdservercontrol", "mechfab", "paystand",
"destructive_analyzer", "circuit_imprinter", "experimentor", "rdconsole", "bepis", "design_disk", "tech_disk", "rdserver", "rdservercontrol", "mechfab", "paystand",
"space_heater", "beaker", "large_beaker", "bucket", "xlarge_beaker", "sec_shellclip", "sec_beanbag", "sec_rshot", "sec_bshot", "sec_slug", "sec_islug", "sec_dart", "sec_38", "sec_38lethal",
"rglass","plasteel","plastitanium","plasmaglass","plasmareinforcedglass","titaniumglass","plastitaniumglass")
@@ -0,0 +1,82 @@
////////////////////////B.E.P.I.S. Locked Techs////////////////////////
/datum/techweb_node/light_apps
id = "light_apps"
display_name = "Illumination Applications"
description = "Applications of lighting and vision technology not originally thought to be commercially viable."
prereq_ids = list("base")
design_ids = list("bright_helmet", "rld_mini")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
hidden = TRUE
experimental = TRUE
/datum/techweb_node/aus_security
id = "aus_security"
display_name = "Australicus Security Protocols"
description = "It is said that security in the Australicus sector is tight, so we took some pointers from their equipment. Thankfully, our sector lacks any signs of these, 'dropbears'."
prereq_ids = list("base")
design_ids = list("pin_explorer", "stun_boomerang")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
hidden = TRUE
experimental = TRUE
/datum/techweb_node/spec_eng
id = "spec_eng"
display_name = "Specialized Engineering"
description = "Conventional wisdom has deemed these engineering products 'technically' safe, but far too dangerous to traditionally condone."
prereq_ids = list("base")
design_ids = list("lava_rods", "eng_gloves")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
hidden = TRUE
experimental = TRUE
/datum/techweb_node/rolling_table
id = "rolling_table"
display_name = "Advanced Wheel Applications"
description = "Adding wheels to things can lead to extremely beneficial outcomes."
prereq_ids = list("base")
design_ids = list("rolling_table")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
hidden = TRUE
experimental = TRUE
/datum/techweb_node/Mauna_Mug
id = "mauna_mug"
display_name = "Mauna Mug"
description = "A bored scientist was thinking to himself for very long...and then realized his coffee got cold! He made this invention to solve this extreme problem."
prereq_ids = list("base")
design_ids = list("mauna_mug")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
hidden = TRUE
experimental = TRUE
/datum/techweb_node/nanite_replication_protocols
id = "nanite_replication_protocols"
display_name = "Nanite Replication Protocols"
description = "Advanced behaviours that allow nanites to exploit certain circumstances to replicate faster."
prereq_ids = list("nanite_smart")
design_ids = list("kickstart_nanites","factory_nanites","tinker_nanites","offline_nanites","synergy_nanites")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
hidden = TRUE
experimental = TRUE
/datum/techweb_node/interrogation
id = "interrogation"
display_name = "Enhanced Interrogation Technology"
description = "By cross-referencing several declassified documents from past dictatorial regimes, we were able to develop an incredibly effective interrogation device. \
Ethical concerns about loss of free will may still apply, according to galactic law."
prereq_ids = list("base")
design_ids = list("hypnochair")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3500)
hidden = TRUE
experimental = TRUE
/datum/techweb_node/tackle_advanced
id = "tackle_advanced"
display_name = "Advanced Grapple Technology"
description = "Nanotrasen would like to remind its researching staff that it is never acceptable to \"glomp\" your coworkers, and further \"scientific trials\" on the subject \
will no longer be accepted in its academic journals."
design_ids = list("tackle_dolphin", "tackle_rocket")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
hidden = TRUE
experimental = TRUE
@@ -74,11 +74,3 @@
prereq_ids = list("nanite_harmonic", "alientech")
design_ids = list("spreading_nanites","mindcontrol_nanites","mitosis_nanites")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 10000)
/datum/techweb_node/nanite_replication_protocols
id = "nanite_replication_protocols"
display_name = "Nanite Replication Protocols"
description = "Advanced behaviours that allow nanites to exploit certain circumstances to replicate faster."
prereq_ids = list("nanite_smart")
design_ids = list("kickstart_nanites","factory_nanites","tinker_nanites","offline_nanites","synergy_nanites")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
@@ -5,7 +5,7 @@
display_name = "Weapon Development Technology"
description = "Our researchers have found new to weaponize just about everything now."
prereq_ids = list("engineering")
design_ids = list("pin_testing", "tele_shield", "lasercarbine", "pin_away")
design_ids = list("pin_testing", "tele_shield", "lasercarbine")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 7500)
/datum/techweb_node/adv_weaponry
+1 -1
View File
@@ -36,7 +36,7 @@
return FALSE
if(istype(tool, /obj/item/melee/baton))
var/obj/item/melee/baton/B = tool
if(!B.status)
if(!B.turned_on)
to_chat(user, "<span class='warning'>[B] needs to be active!</span>")
return FALSE
if(istype(tool, /obj/item/gun/energy))