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
+9 -3
View File
@@ -745,7 +745,7 @@ RLD
if(istype(A, /obj/machinery/light/))
if(checkResource(deconcost, user))
to_chat(user, "<span class='notice'>You start deconstructing [A]...</span>")
user.Beam(A,icon_state="nzcrentrs_power",time=15)
user.Beam(A,icon_state="light_beam",time=15)
playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
if(do_after(user, decondelay, target = A))
if(!useResource(deconcost, user))
@@ -759,7 +759,7 @@ RLD
var/turf/closed/wall/W = A
if(checkResource(floorcost, user))
to_chat(user, "<span class='notice'>You start building a wall light...</span>")
user.Beam(A,icon_state="nzcrentrs_power",time=15)
user.Beam(A,icon_state="light_beam",time=15)
playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
playsound(src.loc, 'sound/effects/light_flicker.ogg', 50, 0)
if(do_after(user, floordelay, target = A))
@@ -805,7 +805,7 @@ RLD
var/turf/open/floor/F = A
if(checkResource(floorcost, user))
to_chat(user, "<span class='notice'>You start building a floor light...</span>")
user.Beam(A,icon_state="nzcrentrs_power",time=15)
user.Beam(A,icon_state="light_beam",time=15)
playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
playsound(src.loc, 'sound/effects/light_flicker.ogg', 50, 1)
if(do_after(user, floordelay, target = A))
@@ -834,6 +834,12 @@ RLD
return TRUE
return FALSE
/obj/item/construction/rld/mini
name = "mini-rapid-light-device (MRLD)"
desc = "A device used to rapidly provide lighting sources to an area. Reload with metal, plasteel, glass or compressed matter cartridges."
matter = 100
max_matter = 100
/obj/item/rcd_upgrade
name = "RCD advanced design disk"
desc = "It seems to be empty."
+2 -2
View File
@@ -7,7 +7,7 @@ RSF
name = "\improper Rapid-Service-Fabricator"
desc = "A device used to rapidly deploy service items."
icon = 'icons/obj/tools.dmi'
icon_state = "rcd"
icon_state = "rsf"
lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
opacity = 0
@@ -110,7 +110,7 @@ RSF
name = "Cookie Synthesizer"
desc = "A self-recharging device used to rapidly deploy cookies."
icon = 'icons/obj/tools.dmi'
icon_state = "rcd"
icon_state = "rsf"
lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
var/matter = 10
+109
View File
@@ -125,3 +125,112 @@
user.put_in_hands(ink)
to_chat(user, "<span class='notice'>You remove [ink] from [src].</span>")
ink = null
/obj/item/airlock_painter/decal
name = "decal painter"
desc = "An airlock painter, reprogramed to use a different style of paint in order to apply decals for floor tiles as well, in addition to repainting doors. Decals break when the floor tiles are removed. Alt-Click to change design."
icon = 'icons/obj/objects.dmi'
icon_state = "decal_sprayer"
item_state = "decalsprayer"
custom_materials = list(/datum/material/iron=2000, /datum/material/glass=500)
var/stored_dir = 2
var/stored_color = ""
var/stored_decal = "warningline"
var/stored_decal_total = "warningline"
var/color_list = list("","red","white")
var/dir_list = list(1,2,4,8)
var/decal_list = list(list("Warning Line","warningline"),
list("Warning Line Corner","warninglinecorner"),
list("Caution Label","caution"),
list("Directional Arrows","arrows"),
list("Stand Clear Label","stand_clear"),
list("Box","box"),
list("Box Corner","box_corners"),
list("Delivery Marker","delivery"),
list("Warning Box","warn_full"))
/obj/item/airlock_painter/decal/afterattack(atom/target, mob/user, proximity)
. = ..()
var/turf/open/floor/F = target
if(!proximity)
to_chat(user, "<span class='notice'>You need to get closer!</span>")
return
if(use_paint(user) && isturf(F))
F.AddComponent(/datum/component/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)
if((ink) && (ink.charges >= 1))
to_chat(user, "<span class='notice'>[src] beeps to prevent you from removing the toner until out of charges.</span>")
return
. = ..()
/obj/item/airlock_painter/decal/AltClick(mob/user)
. = ..()
ui_interact(user)
/obj/item/airlock_painter/decal/Initialize()
. = ..()
ink = new /obj/item/toner/large(src)
/obj/item/airlock_painter/decal/proc/update_decal_path()
var/yellow_fix = "" //This will have to do until someone refactor's markings.dm
if (stored_color)
yellow_fix = "_"
stored_decal_total = "[stored_decal][yellow_fix][stored_color]"
return
/obj/item/airlock_painter/decal/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, "decal_painter", name, 500, 400, master_ui, state)
ui.open()
/obj/item/airlock_painter/decal/ui_data(mob/user)
var/list/data = list()
data["decal_direction"] = stored_dir
data["decal_color"] = stored_color
data["decal_style"] = stored_decal
data["decal_list"] = list()
data["color_list"] = list()
data["dir_list"] = list()
for(var/i in decal_list)
data["decal_list"] += list(list(
"name" = i[1],
"decal" = i[2]
))
for(var/j in color_list)
data["color_list"] += list(list(
"colors" = j
))
for(var/k in dir_list)
data["dir_list"] += list(list(
"dirs" = k
))
return data
/obj/item/airlock_painter/decal/ui_act(action,list/params)
if(..())
return
switch(action)
//Lists of decals and designs
if("select decal")
var/selected_decal = params["decals"]
stored_decal = selected_decal
if("select color")
var/selected_color = params["colors"]
stored_color = selected_color
if("selected direction")
var/selected_direction = text2num(params["dirs"])
stored_dir = selected_direction
update_decal_path()
. = TRUE
/obj/item/airlock_painter/decal/debug
name = "extreme decal painter"
icon_state = "decal_sprayer_ex"
/obj/item/airlock_painter/decal/debug/Initialize()
. = ..()
ink = new /obj/item/toner/extreme(src)
@@ -707,6 +707,10 @@
def_components = list(/obj/item/stock_parts/cell = /obj/item/stock_parts/cell/high)
needs_anchored = FALSE
/obj/item/circuitboard/machine/sleeper/party
name = "Party Pod (Machine Board)"
build_path = /obj/machinery/sleeper/party
/obj/item/circuitboard/machine/smoke_machine
name = "Smoke Machine (Machine Board)"
build_path = /obj/machinery/smoke_machine
@@ -884,6 +888,16 @@
name = "Departmental Protolathe - Service (Machine Board)"
build_path = /obj/machinery/rnd/production/protolathe/department/service
/obj/item/circuitboard/machine/bepis
name = "BEPIS Chamber (Machine Board)"
build_path = /obj/machinery/rnd/bepis
req_components = list(
/obj/item/stack/cable_coil = 5,
/obj/item/stock_parts/capacitor = 1,
/obj/item/stock_parts/manipulator = 1,
/obj/item/stock_parts/micro_laser = 1,
/obj/item/stock_parts/scanning_module = 1)
/obj/item/circuitboard/machine/techfab
name = "\improper Techfab (Machine Board)"
build_path = /obj/machinery/rnd/production/techfab
@@ -1068,3 +1082,12 @@
/obj/item/stock_parts/matter_bin = 3,
/obj/item/stock_parts/manipulator = 1,
/obj/item/stack/sheet/glass = 1)
/obj/item/circuitboard/machine/hypnochair
name = "Enhanced Interrogation Chamber (Machine Board)"
icon_state = "security"
build_path = /obj/machinery/hypnochair
req_components = list(
/obj/item/stock_parts/micro_laser = 2,
/obj/item/stock_parts/scanning_module = 2
)
@@ -0,0 +1,52 @@
/obj/item/stack/circuit_stack
name = "polycircuit aggregate"
desc = "A dense, overdesigned cluster of electronics which attempted to function as a multipurpose circuit electronic. Circuits can be removed from it... if you don't bleed out in the process."
icon_state = "circuit_mess"
item_state = "rods"
w_class = WEIGHT_CLASS_TINY
max_amount = 8
var/circuit_type = /obj/item/electronics/airlock
var/chosen_circuit = "airlock"
/obj/item/stack/circuit_stack/attack_self(mob/user)// Prevents the crafting menu, and tells you how to use it.
to_chat(user, "<span class='warning'>You can't use [src] by itself, you'll have to try and remove one of these circuits by hand... carefully.</span>")
/obj/item/stack/circuit_stack/attack_hand(mob/user)
var/mob/living/carbon/human/H = user
if(!user.get_inactive_held_item() == src)
return ..()
else
if(zero_amount())
return
chosen_circuit = input("What type of circuit would you like to remove?", "Choose a Circuit Type", chosen_circuit) in list("airlock","firelock","fire alarm","air alarm","APC")
if(zero_amount())
return
switch(chosen_circuit)
if("airlock")
circuit_type = /obj/item/electronics/airlock
if("firelock")
circuit_type = /obj/item/electronics/firelock
if("fire alarm")
circuit_type = /obj/item/electronics/firealarm
if("air alarm")
circuit_type = /obj/item/electronics/airalarm
if("APC")
circuit_type = /obj/item/electronics/apc
to_chat(user, "<span class='notice'>You spot your circuit, and carefully attempt to remove it from [src], hold still!</span>")
if(do_after(user, 30, target = user))
if(!src || QDELETED(src))//Sanity Check.
return
var/returned_circuit = new circuit_type(src)
user.put_in_hands(returned_circuit)
use(1)
if(!amount)
to_chat(user, "<span class='notice'>You navigate the sharp edges of circuitry and remove the last board.</span>")
else
to_chat(user, "<span class='notice'>You navigate the sharp edges of circuitry and remove a single board from [src]</span>")
else
H.apply_damage(15, BRUTE, pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM))
to_chat(user, "<span class='warning'>You give yourself a wicked cut on [src]'s many sharp corners and edges!</span>")
..()
/obj/item/stack/circuit_stack/full
amount = 8
+6
View File
@@ -71,3 +71,9 @@
icon_state = "spacecash1000"
singular_name = "one thousand credit bill"
value = 1000
/obj/item/stack/spacecash/c10000
icon_state = "spacecash10000"
singular_name = "ten thousand credit bill"
value = 10000
+16
View File
@@ -89,3 +89,19 @@ GLOBAL_LIST_INIT(rod_recipes, list ( \
/obj/item/stack/rods/fifty
amount = 50
/obj/item/stack/rods/lava
name = "heat resistant rod"
desc = "Treated, specialized metal rods. When exposed to the vaccum of space their coating breaks off, but they can hold up against the extreme heat of active lava."
singular_name = "heat resistant rod"
icon_state = "rods"
item_state = "rods"
color = "#5286b9ff"
flags_1 = CONDUCT_1
w_class = WEIGHT_CLASS_NORMAL
custom_materials = list(/datum/material/iron=1000, /datum/material/plasma=500, /datum/material/titanium=2000)
max_amount = 30
resistance_flags = FIRE_PROOF | LAVA_PROOF
/obj/item/stack/rods/lava/thirty
amount = 30
@@ -62,7 +62,7 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \
new/datum/stack_recipe("floor tile", /obj/item/stack/tile/plasteel, 1, 4, 20), \
new/datum/stack_recipe("metal rod", /obj/item/stack/rods, 1, 2, 60), \
null, \
new/datum/stack_recipe("wall girders", /obj/structure/girder, 2, time = 40, one_per_turf = TRUE, on_floor = TRUE), \
new/datum/stack_recipe("wall girders", /obj/structure/girder, 2, time = 40, one_per_turf = TRUE, on_floor = TRUE, trait_booster = TRAIT_QUICK_BUILD, trait_modifier = 0.75), \
null, \
new/datum/stack_recipe("computer frame", /obj/structure/frame/computer, 5, time = 25, one_per_turf = TRUE, on_floor = TRUE), \
new/datum/stack_recipe("modular console", /obj/machinery/modular_computer/console/buildable/, 10, time = 25, one_per_turf = TRUE, on_floor = TRUE), \
+11 -2
View File
@@ -201,8 +201,13 @@
if(!building_checks(R, multiplier))
return
if (R.time)
var/adjusted_time = 0
usr.visible_message("<span class='notice'>[usr] starts building [R.title].</span>", "<span class='notice'>You start building [R.title]...</span>")
if (!do_after(usr, R.time, target = usr))
if(HAS_TRAIT(usr, R.trait_booster))
adjusted_time = (R.time * R.trait_modifier)
else
adjusted_time = R.time
if (!do_after(usr, adjusted_time, target = usr))
return
if(!building_checks(R, multiplier))
return
@@ -457,8 +462,10 @@
var/window_checks = FALSE
var/placement_checks = FALSE
var/applies_mats = FALSE
var/trait_booster = null
var/trait_modifier = 1
/datum/stack_recipe/New(title, result_type, req_amount = 1, res_amount = 1, max_res_amount = 1,time = 0, one_per_turf = FALSE, on_floor = FALSE, window_checks = FALSE, placement_checks = FALSE, applies_mats = FALSE)
/datum/stack_recipe/New(title, result_type, req_amount = 1, res_amount = 1, max_res_amount = 1,time = 0, one_per_turf = FALSE, on_floor = FALSE, window_checks = FALSE, placement_checks = FALSE, applies_mats = FALSE, trait_booster = null, trait_modifier = 1)
src.title = title
@@ -472,6 +479,8 @@
src.window_checks = window_checks
src.placement_checks = placement_checks
src.applies_mats = applies_mats
src.trait_booster = trait_booster
src.trait_modifier = trait_modifier
/*
* Recipe list datum
*/
+53 -11
View File
@@ -16,7 +16,7 @@
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 50, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 80)
var/stamforce = 35
var/status = FALSE
var/turned_on = FALSE
var/knockdown = TRUE
var/obj/item/stock_parts/cell/cell
var/hitcost = 750
@@ -49,7 +49,7 @@
/obj/item/melee/baton/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
..()
//Only mob/living types have stun handling
if(status && prob(throw_hit_chance) && iscarbon(hit_atom))
if(turned_on && prob(throw_hit_chance) && iscarbon(hit_atom))
baton_stun(hit_atom)
/obj/item/melee/baton/loaded //this one starts with a cell pre-installed.
@@ -66,16 +66,16 @@
copper_top.use(min(chrgdeductamt, copper_top.charge), explode)
if(QDELETED(src))
return FALSE
if(status && (!copper_top || !copper_top.charge || (chargecheck && copper_top.charge < (hitcost * STUNBATON_CHARGE_LENIENCY))))
if(turned_on && (!copper_top || !copper_top.charge || (chargecheck && copper_top.charge < (hitcost * STUNBATON_CHARGE_LENIENCY))))
//we're below minimum, turn off
switch_status(FALSE)
/obj/item/melee/baton/proc/switch_status(new_status = FALSE, silent = FALSE)
if(status != new_status)
status = new_status
if(turned_on != new_status)
turned_on = new_status
if(!silent)
playsound(loc, "sparks", 75, 1, -1)
if(status)
if(turned_on)
START_PROCESSING(SSobj, src)
else
STOP_PROCESSING(SSobj, src)
@@ -85,7 +85,7 @@
deductcharge(round(hitcost * STUNBATON_DEPLETION_RATE), FALSE, FALSE)
/obj/item/melee/baton/update_icon_state()
if(status)
if(turned_on)
icon_state = "[initial(name)]_active"
else if(!cell)
icon_state = "[initial(name)]_nocell"
@@ -134,8 +134,8 @@
else
to_chat(user, "<span class='warning'>[src] is out of charge.</span>")
else
switch_status(!status)
to_chat(user, "<span class='notice'>[src] is now [status ? "on" : "off"].</span>")
switch_status(!turned_on)
to_chat(user, "<span class='notice'>[src] is now [turned_on ? "on" : "off"].</span>")
add_fingerprint(user)
/obj/item/melee/baton/attack(mob/M, mob/living/carbon/human/user)
@@ -151,7 +151,7 @@
/obj/item/melee/baton/proc/common_baton_melee(mob/M, mob/living/user, disarming = FALSE)
if(iscyborg(M) || !isliving(M)) //can't baton cyborgs
return FALSE
if(status && HAS_TRAIT(user, TRAIT_CLUMSY) && prob(50))
if(turned_on && HAS_TRAIT(user, TRAIT_CLUMSY) && prob(50))
clowning_around(user)
if(IS_STAMCRIT(user)) //CIT CHANGE - makes it impossible to baton in stamina softcrit
to_chat(user, "<span class='danger'>You're too exhausted for that.</span>")
@@ -160,7 +160,7 @@
var/mob/living/carbon/human/L = M
if(check_martial_counter(L, user))
return TRUE
if(status)
if(turned_on)
if(baton_stun(M, user, disarming))
user.do_attack_animation(M)
user.adjustStaminaLossBuffered(getweight(user, STAM_COST_BATON_MOB_MULT))
@@ -292,6 +292,48 @@
sparkler?.activate()
. = ..()
/obj/item/melee/baton/boomerang
name = "\improper OZtek Boomerang"
desc = "A device invented in 2486 for the great Space Emu War by the confederacy of Australicus, these high-tech boomerangs also work exceptionally well at stunning crewmembers. Just be careful to catch it when thrown!"
throw_speed = 1
icon_state = "boomerang"
item_state = "boomerang"
force = 5
throwforce = 5
throw_range = 5
hitcost = 2000
throw_hit_chance = 99 //Have you prayed today?
custom_materials = list(/datum/material/iron = 10000, /datum/material/glass = 4000, /datum/material/silver = 10000, /datum/material/gold = 2000)
/obj/item/melee/baton/boomerang/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, force)
if(turned_on)
if(ishuman(thrower))
var/mob/living/carbon/human/H = thrower
H.throw_mode_off() //so they can catch it on the return.
return ..()
/obj/item/melee/baton/boomerang/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
if(turned_on)
var/caught = hit_atom.hitby(src, FALSE, FALSE, throwingdatum=throwingdatum)
if(ishuman(hit_atom) && !caught && prob(throw_hit_chance))//if they are a carbon and they didn't catch it
baton_stun(hit_atom)
if(thrownby && !caught)
sleep(1)
if(!QDELETED(src))
throw_at(thrownby, throw_range+2, throw_speed, null, TRUE)
else
return ..()
/obj/item/melee/baton/boomerang/update_icon()
if(turned_on)
icon_state = "[initial(icon_state)]_active"
else if(!cell)
icon_state = "[initial(icon_state)]_nocell"
else
icon_state = "[initial(icon_state)]"
/obj/item/melee/baton/boomerang/loaded //Same as above, comes with a cell.
preload_cell_type = /obj/item/stock_parts/cell/high
#undef STUNBATON_CHARGE_LENIENCY
#undef STUNBATON_DEPLETION_RATE