Ports a lot of stuff from all around (#23)

* shhh

* checks the thing

* please don't hurt me, it is my first time

* there, much better

* this is huge

Co-authored-by: crazyraio2 <44246096+crazyraio2@users.noreply.github.com>
This commit is contained in:
Enric Gabriel
2020-07-14 01:31:52 -03:00
committed by GitHub
co-authored by crazyraio2
parent 66dc5b5a7e
commit b5f77eeb66
57 changed files with 1810 additions and 11 deletions
+167
View File
@@ -0,0 +1,167 @@
/obj/machinery/autodoc
name = "autodoc"
desc = "An advanced machine used for inserting organs and implants into the occupant."
density = TRUE
state_open = FALSE
icon = 'sandcode/icons/obj/machines/autodoc.dmi'
icon_state = "autodoc_machine"
verb_say = "states"
idle_power_usage = 50
circuit = /obj/item/circuitboard/machine/autodoc
var/obj/item/organ/storedorgan
var/organ_type = /obj/item/organ
var/processing = FALSE
var/surgerytime = 300
/obj/machinery/autodoc/Initialize()
. = ..()
update_icon()
/obj/machinery/autodoc/RefreshParts()
var/max_time = 350
for(var/obj/item/stock_parts/L in component_parts)
max_time -= (L.rating*10)
surgerytime = max(max_time,10)
/obj/machinery/autodoc/examine(mob/user)
. = ..()
if((obj_flags & EMAGGED) && panel_open)
. += "<span class='warning'>[src]'s surgery protocols have been corrupted!</span>"
if(processing)
. += "<span class='notice'>[src] is currently inserting [storedorgan] into [occupant].</span>"
else if(storedorgan)
. += "<span class='notice'>[src] is prepared to insert [storedorgan].</span>"
/obj/machinery/autodoc/close_machine(mob/user)
..()
playsound(src, 'sound/machines/click.ogg', 50)
if(occupant)
if(!iscarbon(occupant))
occupant.forceMove(drop_location())
occupant = null
return
to_chat(occupant, "<span class='notice'>You enter [src]</span>")
dosurgery()
/obj/machinery/autodoc/proc/dosurgery()
if(!storedorgan && !(obj_flags & EMAGGED))
to_chat(occupant, "<span class='notice'>[src] currently has no implant stored.</span>")
return
occupant.visible_message("<span class='notice'>[occupant] presses a button on [src], and you hear a mechanical noise.</span>", "<span class='notice'>You feel a sharp sting as [src] starts inserting the organ into your body.</span>")
playsound(get_turf(occupant), 'sound/weapons/circsawhit.ogg', 50, 1)
processing = TRUE
update_icon()
var/mob/living/carbon/C = occupant
if(obj_flags & EMAGGED)
for(var/obj/item/bodypart/BP in reverseList(C.bodyparts)) //Chest and head are first in bodyparts, so we invert it to make them suffer more
C.emote("scream")
if(!HAS_TRAIT(C, TRAIT_NODISMEMBER))
BP.dismember()
else
C.apply_damage(40, BRUTE, BP)
sleep(5) //2 seconds to get outta there before dying
if(!processing)
return
occupant.visible_message("<span class='warning'>[src] dismembers [occupant]!", "<span class='warning'>[src] saws up your body!</span>")
else
sleep(surgerytime)
if(!processing)
return
var/obj/item/organ/currentorgan = C.getorganslot(storedorgan.slot)
if(currentorgan)
currentorgan.Remove(C)
currentorgan.forceMove(get_turf(src))
storedorgan.Insert(occupant)//insert stored organ into the user
storedorgan = null
occupant.visible_message("<span class='notice'>[src] completes the surgery procedure", "<span class='notice'>[src] inserts the organ into your body.</span>")
playsound(src, 'sound/machines/microwave/microwave-end.ogg', 100, 0)
processing = FALSE
open_machine()
/obj/machinery/autodoc/open_machine(mob/user)
if(processing)
occupant.visible_message("<span class='notice'>[user] cancels [src]'s procedure", "<span class='notice'>[src] stops inserting the organ into your body.</span>")
processing = FALSE
if(occupant)
occupant.forceMove(drop_location())
occupant = null
..(FALSE)
/obj/machinery/autodoc/interact(mob/user)
if(panel_open)
to_chat(user, "<span class='notice'>Close the maintenance panel first.</span>")
return
if(state_open)
close_machine()
return
open_machine()
/obj/machinery/autodoc/attackby(obj/item/I, mob/user, params)
if(istype(I, organ_type))
if(storedorgan)
to_chat(user, "<span class='notice'>[src] already has an implant stored.</span>")
return
if(!user.transferItemToLoc(I, src))
return
storedorgan = I
I.forceMove(src)
to_chat(user, "<span class='notice'>You insert the [I] into [src].</span>")
else
return ..()
/obj/machinery/autodoc/screwdriver_act(mob/living/user, obj/item/I)
. = TRUE
if(..())
return
if(occupant)
to_chat(user, "<span class='warning'>[src] is currently occupied!</span>")
return
if(state_open)
to_chat(user, "<span class='warning'>[src] must be closed to [panel_open ? "close" : "open"] its maintenance hatch!</span>")
return
if(default_deconstruction_screwdriver(user, icon_state, icon_state, I))
if(storedorgan)
storedorgan.forceMove(drop_location())
storedorgan = null
update_icon()
return
return FALSE
/obj/machinery/autodoc/crowbar_act(mob/living/user, obj/item/I)
if(default_deconstruction_crowbar(I))
return TRUE
/obj/machinery/autodoc/update_icon()
overlays.Cut()
if(!state_open)
if(processing)
overlays += "[icon_state]_door_on"
overlays += "[icon_state]_stack"
overlays += "[icon_state]_smoke"
overlays += "[icon_state]_green"
else
overlays += "[icon_state]_door_off"
if(occupant)
if(powered(EQUIP))
overlays += "[icon_state]_stack"
overlays += "[icon_state]_yellow"
else
overlays += "[icon_state]_red"
else if(powered(EQUIP))
overlays += "[icon_state]_red"
if(panel_open)
overlays += "[icon_state]_panel"
/obj/machinery/autodoc/emag_act(mob/user)
if(obj_flags & EMAGGED)
return
obj_flags |= EMAGGED
to_chat(user, "<span class='warning'>You reprogram [src]'s surgery procedures.</span>")
@@ -0,0 +1,98 @@
#define REWARD_DIVISOR 1000
// At the end of the game, the thing yields tetris_score/REWARD_DIVISOR prize tickets. Adjust accordingly.
/obj/machinery/computer/arcade/tetris
name = "T.E.T.R.I.S."
desc = "The pinnacle of human technology."
icon = 'icons/obj/computer.dmi'
icon_state = "arcade"
circuit = /obj/item/circuitboard/computer/arcade/tetris
light_color = LIGHT_COLOR_GREEN
/obj/machinery/computer/arcade/tetris/Topic(href, href_list)
if(..())
return 1
else
usr.set_machine(src)
if(href_list["tetrisScore"])
var/temp_score = text2num(href_list["tetrisScore"])
say("YOUR SCORE: [temp_score]!")
var/reward = round(temp_score/REWARD_DIVISOR)
prizevend(usr, reward)
return
/obj/machinery/computer/arcade/tetris/attack_ai(user as mob)
return src.attack_hand(user)
/obj/machinery/computer/arcade/tetris/attack_hand(mob/user as mob)
if(..())
return
add_fingerprint(user)
if(stat & (BROKEN|NOPOWER))
return
if(user.client)
var/datum/asset/simple/C = new/datum/asset/simple/tetris()
send_asset_list(user.client, C.assets)
var/dat = {"
<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN'>
<html><head>
<META NAME='description' content='Tetris is a PC-Game, which is a part of the '7 by one stroke' package, written in HTML and JavaScript'>
<META NAME='author' content='Lutz Tautenhahn'>
<META NAME='keywords' content='Game, Tetris, Streich, Stroke, JavaScript'>
<META HTTP-EQUIV='Content-Type' CONTENT='text/html; charset=iso-8859-1'>
<title>Telemetry Enhanced Testing and Research Informatic Simulator</title>
<script language='JavaScript'>
function submitScore(s){
window.location.href = 'byond://?src=\ref[src];tetrisScore=' + s;
}
</script>
<script language='JavaScript1.2'>
if (navigator.appName != 'Microsoft Internet Explorer')
document.captureEvents(Event.KEYDOWN)
document.onkeydown = NetscapeKeyDown;
function NetscapeKeyDown(key)
{ KeyDown(key.which);
}
</script>
<script for=document event='onkeydown()' language='JScript'>
if (window.event) KeyDown(window.event.keyCode);
</script>
<script language='JavaScript' src='tetris.js'></script>
</head>
<BODY bgcolor=#E0A060>
<form name='ScoreForm'>
<DIV ALIGN=center>
<table noborder><tr><td>
<script language='JavaScript' src='tetris2.js'></script>
</td>
<td>&nbsp;&nbsp;&nbsp;</td>
<td valign=top>
<table border=4 cellpadding=4 cellspacing=6 bgcolor=#C0B0A0><tr><td>
<table noborder cellpadding=2 cellspacing=2>
<tr><td align=center><input type=button width='70' style='width:70;' value='Pause' onClick='Pause()'></td></tr>
<tr><td>&nbsp;</td></tr>
<tr><td align=center><input type=button width='70' style='width:70;' value='New' onClick='New()'></td></tr>
<tr><td>&nbsp;</td></tr>
<tr><td align=center>Score:</td></tr>
<tr><td align=center><input type=button width='70' style='width:70; background-color:#ffffff' name='Score'></td></tr>
<tr><td align=center>Level:</td></tr>
<tr><td align=center><input type=button width='70' style='width:70; background-color:#ffffff' name='Level' onClick='IncreaseDifficulty()'></td></tr>
<tr><td align=center>Lines:</td></tr>
<tr><td align=center><input type=button width='70' style='width:70; background-color:#ffffff' name='Lines''></td></tr>
<tr><td align=center><table border=2 cellpadding=0 cellspacing=3><tr><td><img src='tetrisp0.gif' border=0></td></tr></table></td></tr>
</table></td></tr></table>
</td></tr></table>
<script language='JavaScript'>
Init(true);
</script>
</DIV>
</form>
</BODY>
</HTML>
"}
user << browse(dat, "window=tetris;size=435x550")
user.set_machine(src)
onclose(user, "tetris")
@@ -0,0 +1,146 @@
/obj/machinery/cryptominer
name = "cryptocurrency miner"
desc = "This handy-dandy machine will produce credits for your enjoyment."
icon = 'sandcode/icons/obj/machines/cryptominer.dmi'
icon_state = "off"
density = TRUE
use_power = IDLE_POWER_USE
idle_power_usage = 20
active_power_usage = 200
circuit = /obj/item/circuitboard/machine/cryptominer
var/mining = FALSE
var/miningtime = 3000
var/miningpoints = 50
var/mintemp = TCRYO // 225K equals approximately -55F or -48C
var/midtemp = T0C // 273K equals 32F or 0C
var/maxtemp = 500 // 500K equals approximately 440F or 226C
var/heatingPower = 40000
/obj/machinery/cryptominer/update_icon()
. = ..()
if(!is_operational())
icon_state = "off"
else if(mining)
icon_state = "loop"
else
icon_state = "on"
/obj/machinery/cryptominer/Destroy()
STOP_PROCESSING(SSmachines,src)
return ..()
/obj/machinery/cryptominer/deconstruct()
STOP_PROCESSING(SSmachines,src)
return ..()
/obj/machinery/cryptominer/attackby(obj/item/W, mob/user, params)
if(default_deconstruction_screwdriver(user, icon_state, icon_state, W))
return
if(default_deconstruction_crowbar(W))
return
if(default_unfasten_wrench(user, W))
return
/obj/machinery/cryptominer/process()
var/turf/T = get_turf(src)
if(!T)
return
var/datum/gas_mixture/env = T.return_air()
if(!env)
return
if(!mining)
return
if(env.return_temperature() >= maxtemp)
if(mining)
playsound(loc, 'sound/machines/beep.ogg', 50, TRUE, -1)
set_mining(FALSE)
return
if(env.return_temperature() <= maxtemp && env.return_temperature() >= midtemp)
if(mining)
produce_points(0.20)
produce_heat()
return
if(env.return_temperature() <= midtemp && env.return_temperature() >= mintemp)
if(mining)
produce_points(1)
produce_heat()
return
if(env.return_temperature() <= mintemp)
if(mining)
produce_points(3)
produce_heat()
return
/obj/machinery/cryptominer/proc/produce_points(number)
playsound(loc, 'sound/machines/ping.ogg', 50, TRUE, -1)
var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR)
if(D)
D.adjust_money(FLOOR(miningpoints * number,1))
/obj/machinery/cryptominer/proc/produce_heat()
atmos_spawn_air("co2=10;TEMP=2000")
/obj/machinery/cryptominer/attack_hand(mob/living/user)
. = ..()
if(!is_operational())
to_chat(user, "<span class='warning'>[src] has to be on to do this!</span>")
return FALSE
if(mining)
set_mining(FALSE)
visible_message("<span class='warning'>[src] slowly comes to a halt.</span>",
"<span class='warning'>You turn off [src].</span>",
runechat_popup = TRUE)
return
set_mining(TRUE)
/obj/machinery/cryptominer/proc/set_mining(new_value)
if(new_value == mining)
return //No changes
mining = new_value
if(mining)
START_PROCESSING(SSmachines, src)
else
STOP_PROCESSING(SSmachines, src)
update_icon()
/obj/machinery/cryptominer/syndie
name = "syndicate cryptocurrency miner"
desc = "This handy-dandy machine will produce credits for your enjoyment. It lasts a little longer."
icon_state = "off_syndie"
density = TRUE
use_power = IDLE_POWER_USE
idle_power_usage = 10
active_power_usage = 100
circuit = /obj/item/circuitboard/machine/cryptominer/syndie
miningtime = 6000
miningpoints = 100
/obj/machinery/cryptominer/syndie/update_icon()
. = ..()
if(!is_operational())
icon_state = "off_syndie"
else if(mining)
icon_state = "loop_syndie"
else
icon_state = "on_syndie"
/obj/machinery/cryptominer/nanotrasen
name = "nanotrasen cryptocurrency miner"
desc = "This handy-dandy machine will produce credits for your enjoyment. This doesn't turn off easily."
icon_state = "off_nano"
density = TRUE
use_power = IDLE_POWER_USE
idle_power_usage = 1
active_power_usage = 1
miningtime = 600000
miningpoints = 1000
/obj/machinery/cryptominer/nanotrasen/update_icon()
. = ..()
if(!is_operational())
icon_state = "off_nano"
else if(mining)
icon_state = "loop_nano"
else
icon_state = "on_nano"
@@ -0,0 +1,142 @@
//Power armor: now actually built!
/datum/component/construction/unordered/mecha_chassis/powerarmor
result = /datum/component/construction/mecha/powerarmor
steps = list(
/obj/item/mecha_parts/part/powerarmor_torso,
/obj/item/mecha_parts/part/powerarmor_helmet,
/obj/item/mecha_parts/part/powerarmor_left_arm,
/obj/item/mecha_parts/part/powerarmor_right_arm,
/obj/item/mecha_parts/part/powerarmor_left_leg,
/obj/item/mecha_parts/part/powerarmor_right_leg
)
/datum/component/construction/mecha/powerarmor/update_parent(step_index)
..()
var/atom/parent_atom = parent
parent_atom.icon = 'sandcode/icons/mecha/mech_construction.dmi'
/datum/component/construction/mecha/powerarmor/spawn_result()
if(!result)
return
new result(drop_location())
SSblackbox.record_feedback("tally", "mechas_created", 1, "Power Armor")
QDEL_NULL(parent)
/datum/component/construction/mecha/powerarmor
result = /obj/item/clothing/suit/space/hardsuit/powerarmor
base_icon = "powerarmor"
steps = list(
//1
list(
"key" = TOOL_WRENCH,
"desc" = "The parts are disconnected."
),
//2
list(
"key" = TOOL_WELDER,
"back_key" = TOOL_WRENCH,
"desc" = "The parts are wrenched."
),
//3
list(
"key" = /obj/item/stack/sheet/bluespace_crystal,
"amount" = 5,
"back_key" = TOOL_WELDER,
"desc" = "The parts are welded onto the chassis."
),
//4
list(
"key" = TOOL_WRENCH,
"back_key" = TOOL_SCREWDRIVER,
"desc" = "The bluespace crystals are slotted."
),
//5
list(
"key" = /obj/item/stock_parts/capacitor/quadratic,
"action" = ITEM_MOVE_INSIDE,
"back_key" = TOOL_WRENCH,
"desc" = "The bluespace crystals are secured."
),
//6
list(
"key" = TOOL_WRENCH,
"back_key" = TOOL_SCREWDRIVER,
"desc" = "The capacitor is slotted."
),
//7
list(
"key" = /obj/item/stack/cable_coil,
"amount" = 10,
"back_key" = TOOL_SCREWDRIVER,
"desc" = "The capacitor is secured."
),
//8
list(
"key" = TOOL_SCREWDRIVER,
"back_key" = TOOL_WIRECUTTER,
"desc" = "The chassis is wired."
),
//9
list(
"key" = TOOL_WELDER,
"back_key" = TOOL_SCREWDRIVER,
"desc" = "The wiring is linked to the limbs."
),
)
/datum/component/construction/mecha/powerarmor/custom_action(obj/item/I, mob/living/user, diff)
if(!..())
return FALSE
switch(index)
if(1)
user.visible_message("[user] wrenches [parent]'s parts.", "<span class='notice'>You wrench [parent]'s parts.</span>")
if(2)
if(diff==FORWARD)
user.visible_message("[user] welds [parent]'s parts.", "<span class='notice'>You weld [parent]'s parts</span>")
else
user.visible_message("[user] unwrenches [parent]'s parts.", "<span class='notice'>You unwrench [parent]'s parts.</span>")
if(3)
if(diff==FORWARD)
user.visible_message("[user] slots bluespace crystals onto [parent].", "<span class='notice'>You slot the bluespace crystals onto [parent].</span>")
else
user.visible_message("[user] unwelds [parent]'s parts.", "<span class='notice'>You unweld [parent]'s parts.</span>")
if(4)
if(diff==FORWARD)
user.visible_message("[user] secures the [parent]'s bluespace crystal slots.", "<span class='notice'>You secure the [parent]'s bluespace crystal slots</span>")
else
user.visible_message("[user] removes the bluespace crystals from [parent].", "<span class='notice'>You remove [parent]'s bluespace crystals.</span>")
if(5)
if(diff==FORWARD)
user.visible_message("[user] slots the capacitor onto [parent].", "<span class='notice'>You slot the capacitor onto [parent].</span>")
else
user.visible_message("[user] unsecures the bluespace crystal slots from [parent].", "<span class='notice'>You unsecure [parent]'s bluespace crystal slots.</span>")
if(6)
if(diff==FORWARD)
user.visible_message("[user] secures [parent]'s capacitor.", "<span class='notice'>You secure [parent]'s capacitor.</span>")
else
user.visible_message("[user] removes the [parent]'s capacitor.", "<span class='notice'>You remove the [parent]'s capacitor.</span>")
if(7)
if(diff==FORWARD)
user.visible_message("[user] wires the [parent].", "<span class='notice'>You wire the [parent].</span>")
else
user.visible_message("[user] unsecures [parent]'s capacitor.", "<span class='notice'>You unsecure [parent]'s capacitor.</span>")
if(8)
if(diff==FORWARD)
user.visible_message("[user] links [parent]'s wires to the limbs.", "<span class='notice'>You link [parent]'s wires to the limbs.</span>")
else
user.visible_message("[user] snips off [parent]'s wires.", "<span class='notice'>You snip off [parent]'s wires.</span>")
if(9)
if(diff==FORWARD)
user.visible_message("[user] welds [parent]'s external armor layer.", "<span class='notice'>You weld [parent]'s external armor layer.</span>")
else
user.visible_message("[user] unlinks [parent]'s wires from the limbs.", "<span class='notice'>You unlink [parent]'s wires from the limbs.</span>")
return TRUE
+55
View File
@@ -0,0 +1,55 @@
//////////////////////////////
//////Custom Mech Parts //////
//////////////////////////////
///////// Power Armor (Not actually a mech but meh)
/obj/item/mecha_parts/chassis/powerarmor
name = "\improper Power Armor Chassis"
desc = "A heavy steel frame, utilized in the construction of a suit of powered armor."
icon = 'sandcode/icons/mecha/mech_construct.dmi'
icon_state = "pwrarmor_skeleton"
w_class = WEIGHT_CLASS_HUGE
construct_type = /datum/component/construction/unordered/mecha_chassis/powerarmor
/obj/item/mecha_parts/part/powerarmor_torso
name = "\improper Power Armor Torso"
desc = "A torso comprised of advanced components, armored with flexible plasteel sheets."
icon = 'sandcode/icons/mecha/mech_construct.dmi'
icon_state = "pwrarmor_chest"
w_class = WEIGHT_CLASS_HUGE
/obj/item/mecha_parts/part/powerarmor_left_arm
name = "\improper Power Armor Left Arm"
desc = "A powered arm component, armored with plasteel and strengthened with integrated pseudometallic bio-enhancing servos."
icon = 'sandcode/icons/mecha/mech_construct.dmi'
icon_state = "pwrarmor_arm_L"
w_class = WEIGHT_CLASS_HUGE
/obj/item/mecha_parts/part/powerarmor_right_arm
name = "\improper Power Armor Right Arm"
desc = "A powered arm component, armored with plasteel and strengthened with integrated pseudometallic bio-enhancing servos."
icon = 'sandcode/icons/mecha/mech_construct.dmi'
icon_state = "pwrarmor_arm_R"
w_class = WEIGHT_CLASS_HUGE
/obj/item/mecha_parts/part/powerarmor_left_leg
name = "\improper Power Armor Left Leg"
desc = "A powered leg component, armored with plasteel and enhanced with integrated kinetic-absorbing materials to give a minor spring in the user's step."
icon = 'sandcode/icons/mecha/mech_construct.dmi'
icon_state = "pwrarmor_leg_L"
w_class = WEIGHT_CLASS_HUGE
/obj/item/mecha_parts/part/powerarmor_right_leg
name = "\improper Power Armor Right Leg"
desc = "A powered leg component, armored with plasteel and enhanced with integrated kinetic-absorbing materials to give a minor spring in the user's step."
icon = 'sandcode/icons/mecha/mech_construct.dmi'
icon_state = "pwrarmor_leg_R"
w_class = WEIGHT_CLASS_HUGE
/obj/item/mecha_parts/part/powerarmor_helmet
name = "\improper Power Armor Helmet"
desc = "An advanced, head-covering helmet desinged to offer maximum comfort and protection. Must be installed into a proper suit of Power Armor in order to be used, as it is quite heavy."
icon = 'sandcode/icons/mecha/mech_construct.dmi'
icon_state = "pwrarmor_helmet"
w_class = WEIGHT_CLASS_HUGE
@@ -1,3 +1,7 @@
/obj/item/circuitboard/computer/telesci_console
name = "Telescience Control Console (Computer Board)"
build_path = /obj/machinery/computer/telescience
build_path = /obj/machinery/computer/telescience
/obj/item/circuitboard/computer/arcade/tetris
name = "Tetris (Computer Board)"
build_path = /obj/machinery/computer/arcade/tetris
@@ -10,3 +10,52 @@
/obj/item/circuitboard/machine/pacman/mclunky
name = "McLunky-type Generator (Machine Board)"
build_path = /obj/machinery/power/port_gen/pacman/mclunky
/obj/item/circuitboard/machine/autodoc
name = "Autodoc (Machine Board)"
build_path = /obj/machinery/autodoc
req_components = list(/obj/item/scalpel/advanced = 1,
/obj/item/retractor/advanced = 1,
/obj/item/surgicaldrill/advanced = 1,
/obj/item/stock_parts/manipulator = 1,
/obj/item/stock_parts/micro_laser = 3,
/obj/item/stock_parts/matter_bin = 1)
/obj/item/circuitboard/machine/cryptominer
name = "Cryptocurrency Miner (Machine Board)"
build_path = /obj/machinery/cryptominer
req_components = list(
/obj/item/stock_parts/matter_bin = 2,
/obj/item/stock_parts/micro_laser = 2,
/obj/item/stock_parts/manipulator = 2,
/obj/item/stock_parts/scanning_module = 2,
/obj/item/stack/ore/bluespace_crystal = 2)
/obj/item/circuitboard/machine/cryptominer/syndie
name = "Syndicate Cryptocurrency Miner (Machine Board)"
build_path = /obj/machinery/cryptominer/syndie
req_components = list(
/obj/item/stock_parts/matter_bin = 2,
/obj/item/stock_parts/micro_laser = 2,
/obj/item/stock_parts/manipulator = 2,
/obj/item/stock_parts/scanning_module = 2,
/obj/item/stack/ore/bluespace_crystal = 2)
/obj/item/circuitboard/machine/bluespace_miner
name = "Bluespace Miner (Machine Board)"
build_path = /obj/machinery/mineral/bluespace_miner
req_components = list(
/obj/item/stock_parts/matter_bin = 5,
/obj/item/stock_parts/micro_laser = 5,
/obj/item/stock_parts/manipulator = 5,
/obj/item/stock_parts/scanning_module = 5,
/obj/item/stack/ore/bluespace_crystal = 5)
needs_anchored = FALSE
/obj/item/circuitboard/machine/telecomms/message_server
name = "Message Server (Machine Board)"
build_path = /obj/machinery/telecomms/message_server
req_components = list(
/obj/item/stock_parts/manipulator = 2,
/obj/item/stack/cable_coil = 1,
/obj/item/stock_parts/subspace/filter = 1)
@@ -0,0 +1,331 @@
#define MATH_REWARD_EASY 1
#define MATH_REWARD_MEDIUM 2.5
#define MATH_REWARD_HARD 5
#define MATH_MULTIPLIER_SCIENCE 750 // If science points and cargo points need to be balanced seperately
#define MATH_MULTIPLIER_CARGO 500 // Difficulty reward gets multiplied by these
/obj/item/computermath
icon = 'sandcode/icons/obj/computermath.dmi'
verb_say = "beeps"
var/charge_count
/obj/item/computermath/Initialize()
. = ..()
START_PROCESSING(SSobj, src)
/obj/item/computermath/Destroy()
STOP_PROCESSING(SSobj, src)
return ..()
/obj/item/computermath/proc/check_charges()
return FALSE
/obj/item/computermath/proc/consume_charges()
return FALSE
/obj/item/computermath/proc/give_question(mob/user, var/reward_type)
if(!reward_type)
say("Critical error. Program terminating.")
return
if(!check_charges()) // Out of charges!
say("No current problems available. Try again later.")
playsound(src, 'sound/machines/buzz-sigh.ogg', 30, 1)
return
var/operator
var/difficulties = list("Easy", "Medium", "Hard")
var/query = "Please select the difficulty level. Reward scales with difficulty."
var/difficulty = input(user, query, "Select Difficulty") as null|anything in difficulties
if(!difficulty)
return
switch(difficulty)
if("Easy")
operator = pick("add","subtract","multiply")
if("Medium")
operator = pick("division", "exponent", "easy algebra")
if("Hard")
operator = pick("2nd polynomial", "algebra", "line intersection")
var/correct = FALSE
switch(operator)
// Easy problems. The numbers need to be so it's doable without a calculator, yet not easy.
if("add")
var/addnum_1 = rand(1, 500)
var/addnum_2 = rand(1, 500)
var/question = "What is [addnum_1] + [addnum_2]?"
var/solution = addnum_1 + addnum_2
var/answer = input(user, question, "Math Problem") as null|num
if(isnull(answer)) // User hit the cancel button
return
if(answer == solution)
correct = TRUE
if("subtract")
var/subnum_1 = rand(-100, 100)
var/subnum_2 = rand(-100, 200)
var/question = "What is [subnum_1] - [subnum_2]?"
var/solution = subnum_1 - subnum_2
var/answer = input(user, question, "Math Problem") as null|num
if(isnull(answer)) // User hit the cancel button
return
if(answer == solution)
correct = TRUE
if("multiply")
var/multnum_1 = rand(-50, 50)
var/multnum_2 = rand(-250, 500)
var/question = "What is [multnum_1] * [multnum_2]?"
var/solution = multnum_1 * multnum_2
var/answer = input(user, question, "Math Problem") as null|num
if(isnull(answer)) // User hit the cancel button
return
if(answer == solution)
correct = TRUE
// Medium problems
if("division")
var/divnum_2 = rand(3, 12)
var/divnum_1 = rand(-50, 50) * divnum_2 // Nice numbers only.
var/question = "What is [divnum_1] / [divnum_2]? Rounded the answer down if applicable."
var/solution = round(divnum_1 / divnum_2)
var/answer = input(user, question, "Math Problem") as null|num
if(isnull(answer)) // User hit the cancel button
return
if(answer == solution)
correct = TRUE
if("exponent")
var/expnum_1 = rand(-50, 50)
var/expnum_2 = pick(list(2, 3, 1/2)) // Also square root!
var/question = "What is ([expnum_1]) ^ [expnum_2]? Answer is rounded down if applicable."
var/solution
if(expnum_2 == 1/2) // For some reason, a ** 1/2 throws a runtime error, so just use sqrt()
solution = round(sqrt(abs(expnum_1)))
else
solution = round(expnum_1 ** expnum_2)
var/answer = input(user, question, "Math Problem") as null|num
if(isnull(answer)) // User hit the cancel button
return
if(answer == solution)
correct = TRUE
if("easy algebra")
// ax + b = c ----> x = (c-b)/a
var/num_a = rand(1,5)
var/num_b = rand(-5,10)
var/num_c = rand(-10, 10)
var/question = "[num_a]x + [num_b] = [num_c]. Solve for x."
var/solution = (num_c - num_b)/num_a
var/answer = input(user, question, "Math Problem") as null|num
if(isnull(answer)) // User hit the cancel button
return
if(answer == solution)
correct = TRUE
// Hard problems, where 'hard' is high school maths
if("algebra") // everyone's favorite :)
var/answer
var/solution
if(prob(50)) // 2 variants of the question
// a/bx = c ---> x = a/bc. b and c may not be 0.
var/num_a = rand(-100, 100)
var/num_b = rand(-5, 5)
if(num_b == 0)
num_b = 12
var/num_c = rand(1, 10)
var/question = "[num_a]/([num_b]x) = [num_c]. Solve for x. Round down if applicable."
solution = round(num_a / (num_b * num_c))
answer = input(user, question, "Math Problem") as null|num
else
// (a-x)/b = x/c ----> x=ac/(b+c), b+c and b*c may not be 0
var/num_a = rand(-50, 50)
var/num_b = rand(1, 5)
var/num_c = rand(1, 10)
var/question = "([num_a]-x)/[num_b] = x/[num_c]. Solve for x. Round down if applicable."
solution = round((num_a * num_c)/(num_b + num_c))
answer = input(user, question, "Math Problem") as null|num
if(isnull(answer)) // User hit the cancel button
return
if(answer == solution)
correct = TRUE
if("2nd polynomial")
// Math part
var/num_a = rand(1, 2)
var/num_b = rand(-5, 5)
var/num_c = rand(-25, 25)
var/discriminant = num_b**2 - 4 * num_a * num_c
var/solution1
var/solution2
if(discriminant >= 0) // positive gives 2 solutions, if D=0 then sol1=sol2 anyway
// Quadratic formula
solution1 = round((-num_b+sqrt(discriminant))/(2*num_a))
solution2 = round((-num_b-sqrt(discriminant))/(2*num_a))
else
solution1 = 0
solution2 = 0
// Answering part
var/question = "[num_a]x^2 + [num_b]x + [num_c] = 0. Solve for x, give any real solution. Fill in 0 for no real solutions. Answers are rounded down. (-0.25 becomes -1)"
var/answer = input(user, question, "Math Problem") as null|num
if(isnull(answer)) // User hit the cancel button
return
if(answer == solution1 || answer == solution2)
correct = TRUE
if("line intersection")
// y1=ax+b
// y2=cx+d
// intersect: x=(d-c)/(a-b), y=a(d-c)/(a-b)+c. So a-b or c-d may never be 0.
var/num_a = rand(1,5)
var/num_b = rand(-10,-1)
var/num_c = rand(1, 10)
var/num_d = rand(-10, -1)
var/x_intersect = round((num_d-num_c)/(num_a-num_b))
var/y_intersect = round(num_a * (num_d - num_c)/(num_a - num_b) + num_c)
var/question
var/answer
if(prob(50)) // 50% chance to ask for x, or y
question = "Given the lines y=[num_a]x+[num_b] and y=[num_c]x+[num_d], what is the x-value of their intersection point? Rounded down if applicable."
answer = input(user, question, "Math Problem") as null|num
if(answer == x_intersect)
correct = TRUE
else
question = "Given the lines y=[num_a]x+[num_b] and y=[num_c]x+[num_d], what is the y-value of their intersection point? Rounded down if applicable."
answer = input(user, question, "Math Problem") as null|num
if(answer == y_intersect)
correct = TRUE
if(isnull(answer)) // User hit the cancel button
return
// An answer has been submitted, remove a charge and check if it's correct!
if(consume_charges())
handle_reward(user, reward_type, correct, difficulty)
else // Ran out of charges while answering due to multiple characters using the computers
say("Error. All available problems have been resolved in the time it took to answer. Please wait for more to become available.")
playsound(src, 'sound/machines/buzz-sigh.ogg', 30, 1)
return
/obj/item/computermath/proc/handle_reward(mob/user, var/reward_type, var/correct, var/difficulty)
var/mob/living/LM = user
// Calculate points
var/points_awarded
switch(difficulty)
if("Easy")
points_awarded = MATH_REWARD_EASY
if("Medium")
points_awarded = MATH_REWARD_MEDIUM
if("Hard")
points_awarded = MATH_REWARD_HARD
switch(reward_type)
if("Cargo")
points_awarded *= MATH_MULTIPLIER_CARGO
if("Science")
points_awarded *= MATH_MULTIPLIER_SCIENCE
// Incorrect answer is a point penalty.
if(!correct)
var/points_lost = points_awarded / 4 // Penalty for failure is 1/4th success points
say("Warning! Incorrect answer.")
switch(reward_type)
if("Science")
say("Research data has been corrupted. [points_lost] science points have been lost.")
SSresearch.science_tech.remove_point_list(list(TECHWEB_POINT_TYPE_GENERIC = points_lost))
if("Cargo")
say("To solve the resulting bureaucratic error, [points_lost] cargo points have been deducted from the balance.")
var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR)
if(D)
D.adjust_money(-points_lost)
// me fail arithmetic, me brian hurt
playsound(src, 'sound/machines/buzz-sigh.ogg', 30, 1)
if(difficulty == "Easy") // me fail arithmetic, me brian hurt
to_chat(user,"<span class='warning'>You feel lightheaded after failing such an easy question...</span>")
LM.adjustOrganLoss(ORGAN_SLOT_BRAIN, 10)
return
// Award points for a correct answer.
switch(reward_type)
if("Science")
say("Correct data received. Applying to research algorithms...")
say("Completed. [points_awarded] science points added.")
SSresearch.science_tech.add_point_list(list(TECHWEB_POINT_TYPE_GENERIC = points_awarded))
if("Cargo")
say("Correct data received. Updating cargo manifests...")
say("Completed. [points_awarded] cargo points have been added to station balance.")
var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR)
if(D)
D.adjust_money(points_awarded)
playsound(src, 'sound/machines/chime.ogg', 30, 1)
/obj/item/computermath/default
name = "Unassigned Problem Computer"
desc = "This Problem Computer has not been assigned yet. Earn points by solving math problems."
icon_state = "defaulttab"
var/static/radial_cargo = image(icon = 'sandcode/icons/obj/computermath.dmi', icon_state = "cargotab")
var/static/radial_science = image(icon = 'sandcode/icons/obj/computermath.dmi', icon_state = "sciencetab")
var/static/list/radial_options = list("cargo" = radial_cargo, "science" = radial_science)
/obj/item/computermath/default/attack_self(mob/user)
var/choice = show_radial_menu(user, src, radial_options)
switch(choice)
if("cargo")
var/obj/item/computermath/cargo/CT = new /obj/item/computermath/cargo(drop_location())
qdel(src)
user.put_in_active_hand(CT)
if("science")
var/obj/item/computermath/science/ST = new /obj/item/computermath/science(drop_location())
qdel(src)
user.put_in_active_hand(ST)
/obj/item/computermath/cargo
name = "Cargo Problem Computer"
desc = "Earn points by solving math problems."
icon_state = "cargotab"
/obj/item/computermath/cargo/attack_self(mob/user)
give_question(user, "Cargo")
/obj/item/computermath/cargo/process()
var/old_charge_count = charge_count
charge_count = SSshuttle.problem_computer_charges
if(charge_count > old_charge_count)
say("A new problem solving opportunity has become available! There are now [charge_count] problems to be solved.")
/obj/item/computermath/cargo/check_charges()
if(SSshuttle.problem_computer_charges > 0)
return TRUE
..()
/obj/item/computermath/cargo/consume_charges()
if(SSresearch.problem_computer_charges > 0)
SSshuttle.problem_computer_charges -= 1
return TRUE
..()
/obj/item/computermath/science
name = "Science Problem Computer"
desc = "Earn points by solving math problems."
icon_state = "sciencetab"
/obj/item/computermath/science/process()
var/old_charge_count = charge_count
charge_count = SSresearch.problem_computer_charges
if(charge_count > old_charge_count)
say("A new problem solving opportunity has become available! There are now [charge_count] problems to be solved.")
/obj/item/computermath/science/check_charges()
if(SSresearch.problem_computer_charges > 0)
return TRUE
..()
/obj/item/computermath/science/consume_charges()
if(SSresearch.problem_computer_charges > 0)
SSresearch.problem_computer_charges -= 1
return TRUE
..()
/obj/item/computermath/science/attack_self(mob/user)
give_question(user, "Science")
@@ -0,0 +1,21 @@
/datum/asset/simple/tetris
assets = list(
"tetris_0.gif" = 'sandcode/icons/tetris/tetris_0.gif',
"tetris_1.gif" = 'sandcode/icons/tetris/tetris_1.gif',
"tetris_2.gif" = 'sandcode/icons/tetris/tetris_2.gif',
"tetris_3.gif" = 'sandcode/icons/tetris/tetris_3.gif',
"tetris_4.gif" = 'sandcode/icons/tetris/tetris_4.gif',
"tetris_5.gif" = 'sandcode/icons/tetris/tetris_5.gif',
"tetris_6.gif" = 'sandcode/icons/tetris/tetris_6.gif',
"tetris_7.gif" = 'sandcode/icons/tetris/tetris_7.gif',
"tetrisp0.gif" = 'sandcode/icons/tetris/tetrisp0.gif',
"tetrisp1.gif" = 'sandcode/icons/tetris/tetrisp1.gif',
"tetrisp2.gif" = 'sandcode/icons/tetris/tetrisp2.gif',
"tetrisp3.gif" = 'sandcode/icons/tetris/tetrisp3.gif',
"tetrisp4.gif" = 'sandcode/icons/tetris/tetrisp4.gif',
"tetrisp5.gif" = 'sandcode/icons/tetris/tetrisp5.gif',
"tetrisp6.gif" = 'sandcode/icons/tetris/tetrisp6.gif',
"tetrisp7.gif" = 'sandcode/icons/tetris/tetrisp7.gif',
"tetris.js" = 'tgui/src/interfaces/tetris/tetris.js',
"tetris2.js" = 'tgui/src/interfaces/tetris/tetris2.js'
)
@@ -0,0 +1,124 @@
//Power armor
/obj/item/clothing/head/helmet/space/hardsuit/powerarmor
name = "Power Armor Helmet MK. I"
desc = "An advanced helmet attached to a powered exoskeleton suit. Protects well against most forms of harm, but struggles against exotic hazards."
icon = 'sandcode/icons/obj/clothing/hats.dmi'
mob_overlay_icon = 'sandcode/icons/mob/clothing/head.dmi'
anthro_mob_worn_overlay = 'sandcode/icons/mob/clothing/head_muzzled.dmi'
icon_state = "hardsuit0-powerarmor-1"
item_state = "hardsuit0-powerarmor-1"
hardsuit_type = "powerarmor"
clothing_flags = THICKMATERIAL //Ouchie oofie my bones
armor = list("melee" = 40, "bullet" = 35, "laser" = 30, "energy" = 20, "bomb" = 40, "bio" = 100, "rad" = 5, "fire" = 75, "acid" = 100)
resistance_flags = ACID_PROOF
mutantrace_variation = STYLE_MUZZLE | STYLE_NO_ANTHRO_ICON
/obj/item/clothing/head/helmet/space/hardsuit/powerarmor/Initialize()
. = ..()
AddComponent(/datum/component/spraycan_paintable)
update_icon()
/obj/item/clothing/head/helmet/space/hardsuit/powerarmor/update_overlays()
. = ..()
var/mutable_appearance/glass_overlay = mutable_appearance(icon, "hardsuit0-powerarmor-2")
if(icon_state == "hardsuit1-powerarmor-1")
glass_overlay = mutable_appearance(icon, "hardsuit1-powerarmor-2")
var/mutable_appearance/flight_overlay = mutable_appearance(icon, "hardsuit1-powerarmor-3")
flight_overlay.appearance_flags = RESET_COLOR
. += flight_overlay
glass_overlay.appearance_flags = RESET_COLOR
. += glass_overlay
/obj/item/clothing/head/helmet/space/hardsuit/powerarmor/worn_overlays(isinhands, icon_file, used_state, style_flags = NONE)
. = ..()
if(!isinhands)
var/mutable_appearance/M1 = mutable_appearance(icon_file, "hardsuit0-powerarmor-2")
if(icon_state == "hardsuit1-powerarmor-1")
M1 = mutable_appearance(icon_file, "hardsuit1-powerarmor-2")
var/mutable_appearance/M2 = mutable_appearance(icon, "hardsuit1-powerarmor-3")
M2.appearance_flags = RESET_COLOR
. += M2
M1.appearance_flags = RESET_COLOR
. += M1
/obj/item/clothing/head/helmet/space/hardsuit/powerarmor/equipped(mob/living/carbon/human/user, slot)
..()
if (slot == SLOT_HEAD)
var/datum/atom_hud/DHUD = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED]
DHUD.add_hud_to(user)
/obj/item/clothing/head/helmet/space/hardsuit/powerarmor/dropped(mob/living/carbon/human/user)
..()
if (user.head == src)
var/datum/atom_hud/DHUD = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED]
DHUD.remove_hud_from(user)
/obj/item/clothing/suit/space/hardsuit/powerarmor
name = "Power Armor MK. I"
desc = "A self-powered exoskeleton suit comprised of flexible Plasteel sheets and advanced components, designed to offer excellent protection while still allowing mobility. Does not protect against Space, and struggles against more exotic hazards."
icon = 'sandcode/icons/obj/clothing/suits.dmi'
mob_overlay_icon = 'sandcode/icons/mob/clothing/suit.dmi'
anthro_mob_worn_overlay = 'sandcode/icons/mob/clothing/suit_digi.dmi'
icon_state = "hardsuit-powerarmor-1"
item_state = "hardsuit-powerarmor-1"
slowdown = -0.1
clothing_flags = THICKMATERIAL //Not spaceproof. No, it isn't Spaceproof in Rimworld either.
armor = list("melee" = 40, "bullet" = 35, "laser" = 30, "energy" = 20, "bomb" = 40, "bio" = 100, "rad" = 5, "fire" = 75, "acid" = 100) //I was asked to buff this again. Here, fine.
resistance_flags = ACID_PROOF
var/explodioprobemp = 1
var/stamdamageemp = 200
var/brutedamageemp = 20
var/rebootdelay
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/powerarmor
mutantrace_variation = STYLE_DIGITIGRADE | STYLE_NO_ANTHRO_ICON
/obj/item/clothing/suit/space/hardsuit/powerarmor/Initialize()
. = ..()
AddComponent(/datum/component/spraycan_paintable)
update_icon()
/obj/item/clothing/suit/space/hardsuit/powerarmor/update_overlays()
. = ..()
var/mutable_appearance/black_overlay = mutable_appearance(icon, "hardsuit-powerarmor-2")
black_overlay.appearance_flags = RESET_COLOR
var/mutable_appearance/bluecore_overlay = mutable_appearance(icon, "hardsuit-powerarmor-3")
bluecore_overlay.appearance_flags = RESET_COLOR
. += black_overlay
. += bluecore_overlay
/obj/item/clothing/suit/space/hardsuit/powerarmor/worn_overlays(isinhands, icon_file, used_state, style_flags = NONE)
. = ..()
if(!isinhands)
var/mutable_appearance/M1 = mutable_appearance(icon_file, "hardsuit-powerarmor-2")
M1.appearance_flags = RESET_COLOR
var/mutable_appearance/M2 = mutable_appearance(icon_file, "hardsuit-powerarmor-3")
M2.appearance_flags = RESET_COLOR
. += M1
. += M2
/obj/item/clothing/suit/space/hardsuit/powerarmor/emp_act()
. = ..()
var/mob/living/carbon/human/user = src.loc
playsound(src.loc, 'sandcode/sound/misc/suitmalf.ogg', 60, 1, 10)
if (ishuman(user) && (user.wear_suit == src))
to_chat(user, "<span class='danger'>The motors on your armor cease to function, causing the full weight of the suit to weigh on you all at once!</span>")
user.emote("scream")
user.adjustStaminaLoss(stamdamageemp)
user.adjustBruteLoss(brutedamageemp)
if(prob(explodioprobemp))
playsound(src.loc, 'sound/effects/fuse.ogg', 60, 1, 10)
visible_message("<span class ='warning'>The power module on the [src] begins to smoke, glowing with an alarming warmth! Get away from it, now!")
addtimer(CALLBACK(src, .proc/detonate),50)
else
addtimer(CALLBACK(src, .proc/revivemessage), rebootdelay)
return
/obj/item/clothing/suit/space/hardsuit/powerarmor/proc/revivemessage() //we use this proc to add a timer, so we can have it take a while to boot
visible_message("<span class ='warning'>The power module on the [src] briefly flickers, before humming to life once more.</span>") //without causing any problems
return //that sleep() would
/obj/item/clothing/suit/space/hardsuit/powerarmor/proc/detonate()
visible_message("<span class ='danger'>The power module of the [src] overheats, causing it to destabilize and explode!")
explosion(src.loc,0,0,3,flame_range = 3)
qdel(src)
return
@@ -0,0 +1,55 @@
/obj/machinery/mineral/bluespace_miner
name = "bluespace mining machine"
desc = "A machine that uses the magic of Bluespace to slowly generate materials and add them to a linked ore silo."
icon = 'icons/obj/machines/mining_machines.dmi'
icon_state = "stacker"
density = TRUE
circuit = /obj/item/circuitboard/machine/bluespace_miner
layer = BELOW_OBJ_LAYER
var/list/ore_rates = list(/datum/material/iron = 0.3, /datum/material/glass = 0.3, /datum/material/plasma = 0.1, /datum/material/silver = 0.1, /datum/material/gold = 0.05, /datum/material/titanium = 0.05, /datum/material/uranium = 0.05, /datum/material/diamond = 0.02)
var/datum/component/remote_materials/materials
/obj/machinery/mineral/bluespace_miner/Initialize(mapload)
. = ..()
materials = AddComponent(/datum/component/remote_materials, "bsm", mapload)
/obj/machinery/mineral/bluespace_miner/Destroy()
materials = null
return ..()
/obj/machinery/mineral/bluespace_miner/multitool_act(mob/living/user, obj/item/multitool/M)
if(istype(M))
if(!M.buffer || !istype(M.buffer, /obj/machinery/ore_silo))
to_chat(user, "<span class='warning'>You need to multitool the ore silo first.</span>")
return FALSE
/obj/machinery/mineral/bluespace_miner/examine(mob/user)
. = ..()
if(!materials?.silo)
. += "<span class='notice'>No ore silo connected. Use a multi-tool to link an ore silo to this machine.</span>"
else if(materials?.on_hold())
. += "<span class='warning'>Ore silo access is on hold, please contact the quartermaster.</span>"
/obj/machinery/mineral/bluespace_miner/process()
if(!materials?.silo || materials?.on_hold())
return
var/datum/component/material_container/mat_container = materials.mat_container
if(!mat_container || panel_open || !powered())
return
var/datum/material/ore = pick(ore_rates)
mat_container.bsm_insert((ore_rates[ore] * 1000), ore)
/datum/component/material_container/proc/bsm_insert(amt, var/datum/material/mat)
if(!istype(mat))
mat = SSmaterials.GetMaterialRef(mat)
if(amt > 0 && has_space(amt))
var/total_amount_saved = total_amount
if(mat)
materials[mat] += amt
total_amount += amt
else
for(var/i in materials)
materials[i] += amt
total_amount += amt
return (total_amount - total_amount_saved)
return FALSE
@@ -39,3 +39,37 @@
build_path = /obj/item/circuitboard/machine/spaceship_navigation_beacon
category = list ("Teleportation Machinery")
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE
/datum/design/board/autodoc
name = "Machine Design (Autodoc)"
desc = "The circuit board for an Autodoc."
id = "autodoc"
build_path = /obj/item/circuitboard/machine/autodoc
category = list("Medical Machinery")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
//Cryptocurrency Miners
/datum/design/board/cryptominer
name = "Machine Design (Cryptocurrency Miner)"
desc = "The circuit board for a Cryptocurrency Miner."
id = "cryptominer"
build_path = /obj/item/circuitboard/machine/cryptominer
category = list("Misc. Machinery")
departmental_flags = DEPARTMENTAL_FLAG_CARGO
/datum/design/board/cryptominer/syndie
name = "Machine Design (Syndicate Cryptocurrency Miner)"
desc = "The circuit board for a Syndicate Cryptocurrency Miner."
id = "cryptominersyndie"
build_path = /obj/item/circuitboard/machine/cryptominer/syndie
category = list("Misc. Machinery")
departmental_flags = DEPARTMENTAL_FLAG_CARGO
//BS miner
/datum/design/board/bluespace_miner
name = "Machine Design (Bluespace Miner)"
desc = "The circuit board for a Bluespace Miner."
id = "bluespace_miner"
build_path = /obj/item/circuitboard/machine/bluespace_miner
category = list ("Misc. Machinery")
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_CARGO | DEPARTMENTAL_FLAG_ENGINEERING
@@ -0,0 +1,7 @@
/datum/design/board/tetris
name = "Computer Design (T.E.T.R.I.S.)"
desc = "Allows for the construction of circuit boards used to build a TETRIS research system."
id = "tetris"
build_path = /obj/item/circuitboard/computer/arcade/tetris
category = list("Research Machinery")
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING
@@ -6,3 +6,68 @@
materials = list(/datum/material/iron = 1000, /datum/material/glass = 1000, /datum/material/bluespace = 500)
construction_time = 100
category = list("Cyborg Upgrade Modules")
///Power Armor
/datum/design/powerarmor_skeleton
name = "Power Armor Skeleton"
id = "powerarmor_skeleton"
build_type = MECHFAB
build_path = /obj/item/mecha_parts/chassis/powerarmor
materials = list(/datum/material/iron=15000, /datum/material/plasma=5000)
construction_time = 500
category = list("Misc")
/datum/design/powerarmor_torso
name = "Power Armor Torso"
id = "powerarmor_torso"
build_type = MECHFAB
build_path = /obj/item/mecha_parts/part/powerarmor_torso
materials = list(/datum/material/iron=40000, /datum/material/plasma=10000, /datum/material/titanium=5000)
construction_time = 500
category = list("Misc")
/datum/design/powerarmor_helmet
name = "Power Armor Helmet"
id = "powerarmor_helmet"
build_type = MECHFAB
build_path = /obj/item/mecha_parts/part/powerarmor_helmet
materials = list(/datum/material/iron=20000, /datum/material/plasma=10000, /datum/material/titanium=5000, /datum/material/glass=5000)
construction_time = 500
category = list("Misc")
/datum/design/powerarmor_armL
name = "Power Armor Left Arm"
id = "powerarmor_armL"
build_type = MECHFAB
build_path = /obj/item/mecha_parts/part/powerarmor_left_arm
materials = list(/datum/material/iron=20000, /datum/material/plasma=10000, /datum/material/titanium=5000,)
construction_time = 500
category = list("Misc")
/datum/design/powerarmor_armR
name = "Power Armor Right Arm"
id = "powerarmor_armR"
build_type = MECHFAB
build_path = /obj/item/mecha_parts/part/powerarmor_right_arm
materials = list(/datum/material/iron=20000, /datum/material/plasma=10000, /datum/material/titanium=5000,)
construction_time = 500
category = list("Misc")
/datum/design/powerarmor_legL
name = "Power Armor Left Leg"
id = "powerarmor_legL"
build_type = MECHFAB
build_path = /obj/item/mecha_parts/part/powerarmor_left_leg
materials = list(/datum/material/iron=20000, /datum/material/plasma=10000, /datum/material/titanium=5000,)
construction_time = 500
category = list("Misc")
/datum/design/powerarmor_legR
name = "Power Armor Right Leg"
id = "powerarmor_legR"
build_type = MECHFAB
build_path = /obj/item/mecha_parts/part/powerarmor_right_leg
materials = list(/datum/material/iron=20000, /datum/material/plasma=10000, /datum/material/titanium=5000,)
construction_time = 500
category = list("Misc")
///End of Power Armor
@@ -0,0 +1,56 @@
///////////////////////////////////
/////Headset Encryption////////////
///////////////////////////////////
/datum/design/encryption
materials = list(/datum/material/iron = 500, /datum/material/glass = 500, /datum/material/silver = 200)
build_type = PROTOLATHE | IMPRINTER
construction_time = 50
category = list("Subspace Telecomms")
/datum/design/encryption/eng_key
name = "Engineering radio encryption key"
desc = "Encryption key for the Engineering channel."
id = "eng_key"
build_path = /obj/item/encryptionkey/headset_eng
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
/datum/design/encryption/sci_key
name = "Science radio encryption key"
desc = "Encryption key for the Science channel."
id = "sci_key"
build_path = /obj/item/encryptionkey/headset_sci
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
/datum/design/encryption/supply_key
name = "Supply radio encryption key"
desc = "Encryption key for the Supply channel."
id = "supply_key"
build_path = /obj/item/encryptionkey/headset_cargo
departmental_flags = DEPARTMENTAL_FLAG_CARGO
/datum/design/encryption/med_key
name = "Medical radio encryption key"
desc = "Encryption key for the Medical channel."
id = "med_key"
build_path = /obj/item/encryptionkey/headset_med
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
/datum/design/encryption/serv_key
name = "Service radio encryption key"
desc = "Encryption key for the Service channel."
id = "serv_key"
build_path = /obj/item/encryptionkey/headset_service
departmental_flags = DEPARTMENTAL_FLAG_SERVICE
///////////////////////////////////
////////Telecomm Server////////////
///////////////////////////////////
/datum/design/board/message_server
name = "Machine Design (Message Server)"
desc = "Allows for the construction of Message Server."
id = "message-server"
build_path = /obj/item/circuitboard/machine/telecomms/message_server
category = list("Subspace Telecomms")
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE
@@ -7,3 +7,13 @@
build_path = /obj/item/pipe_dispenser/bluespace // Skyrat edit
category = list("Tool Designs")
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
/datum/design/computermath
name = "Problem Computer"
desc = "Solve math problems. Get them correct, get credits."
id = "computermath"
build_type = PROTOLATHE
materials = list(/datum/material/iron = 250, /datum/material/glass = 250, /datum/material/plastic = 250)
build_path = /obj/item/computermath/default
category = list("Tool Designs")
departmental_flags = DEPARTMENTAL_FLAG_CARGO | DEPARTMENTAL_FLAG_SCIENCE
@@ -46,3 +46,11 @@
prereq_ids = list("alien_bio")
design_ids = list("ci-toolset-adv","ci-surgery-adv")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
/datum/techweb_node/adv_surgery/New()
design_ids += "autodoc"
. = ..()
/datum/techweb_node/computer_board_gaming/New()
design_ids += "tetris"
. = ..()
@@ -2,3 +2,43 @@
design_ids += "borg_upgrade_bsrpd"
design_ids += "bsrpd"
. = ..()
/datum/techweb_node/cryptominer
id = "cryptominer"
display_name = "Cryptocurrency Mining"
description = "Harness the power of cryptocurrency to make credits for Cargo-- slowly."
prereq_ids = list("bluespace_mining")
design_ids = list("cryptominer")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
/datum/techweb_node/cryptominersyndie
id = "cryptominersyndie"
display_name = "Illegal Cryptocurrency Mining"
description = "Harness the power of bluespace to make credits for Cargo-- slowly."
prereq_ids = list("cryptominer","syndicate_basic")
design_ids = list("cryptominersyndie")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
/datum/techweb_node/computermath
id = "computermath"
display_name = "Problem Computer"
description = "Solve problems for either cargo credits or research points."
prereq_ids = list("base")
design_ids = list("computermath")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
/datum/techweb_node/encryption
id = "encryption_key"
display_name = "Communication Encryption"
description = "Study into usage of frequencies within headsets and their repoduction."
prereq_ids = list("telecomms")
design_ids = list("eng_key", "sci_key", "med_key", "supply_key", "serv_key")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3000)
/datum/techweb_node/bs_mining
id = "bluespace_mining"
display_name = "Bluespace Mining Technology"
description = "Harness the power of bluespace to make materials out of nothing. Slowly."
prereq_ids = list("practical_bluespace", "adv_mining")
design_ids = list("bluespace_miner")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 7500)
@@ -0,0 +1,3 @@
/datum/techweb_node/telecomms/New()
. = ..()
design_ids += "message-server"
@@ -0,0 +1,7 @@
/datum/techweb_node/powerarmor
id = "powerarmor"
display_name = "Full Body Exoskeleton"
description = "Utilizing fluctuations in bluespace crystals, we can draw small amounts of energy to create self-powered body enhancing suits."
prereq_ids = list("adv_biotech", "adv_bluespace", "adv_robotics")
design_ids = list("powerarmor_skeleton","powerarmor_torso","powerarmor_helmet","powerarmor_armR","powerarmor_armL","powerarmor_legR","powerarmor_legL")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 7500)