and finally, the modules folder. Now I can publish and take a break

This commit is contained in:
deathride58
2018-07-02 01:19:37 -04:00
parent 91805b8789
commit b1688405d9
380 changed files with 2204 additions and 1588 deletions
@@ -8,8 +8,9 @@
w_class = WEIGHT_CLASS_SMALL
icon = 'icons/obj/assemblies/electronic_setups.dmi'
icon_state = "setup_small"
flags_1 = NOBLUDGEON_1
item_flags = NOBLUDGEON
materials = list() // To be filled later
datum_flags = DF_USE_TAG
var/list/assembly_components = list()
var/list/ckeys_allowed_to_scan = list() // Players who built the circuit can scan it as a ghost.
var/max_components = IC_MAX_SIZE_BASE
@@ -30,6 +31,8 @@
var/combat_circuits = 0 //number of combat cicuits in the assembly, used for diagnostic hud
var/long_range_circuits = 0 //number of long range cicuits in the assembly, used for diagnostic hud
var/prefered_hud_icon = "hudstat" // Used by the AR circuit to change the hud icon.
var/creator // circuit creator if any
var/static/next_assembly_id = 0
hud_possible = list(DIAG_STAT_HUD, DIAG_BATT_HUD, DIAG_TRACK_HUD, DIAG_CIRCUIT_HUD) //diagnostic hud overlays
max_integrity = 50
pass_flags = 0
@@ -56,14 +59,17 @@
COLOR_ASSEMBLY_PURPLE
)
/obj/item/electronic_assembly/GenerateTag()
tag = "assembly_[next_assembly_id++]"
/obj/item/electronic_assembly/examine(mob/user)
. = ..()
if(can_anchor)
to_chat(user, "<span class='notice'>The anchoring bolts [anchored ? "are" : "can be"] <b>wrenched</b> in place and the maintainence panel [opened ? "can be" : "is"] <b>screwed</b> in place.</span>")
to_chat(user, "<span class='notice'>The anchoring bolts [anchored ? "are" : "can be"] <b>wrenched</b> in place and the maintenance panel [opened ? "can be" : "is"] <b>screwed</b> in place.</span>")
else
to_chat(user, "<span class='notice'>The maintainence panel [opened ? "can be" : "is"] <b>screwed</b> in place.</span>")
to_chat(user, "<span class='notice'>The maintenance panel [opened ? "can be" : "is"] <b>screwed</b> in place.</span>")
if(isobserver(user) && ckeys_allowed_to_scan[user.ckey])
if((isobserver(user) && ckeys_allowed_to_scan[user.ckey]) || IsAdminGhost(user))
to_chat(user, "You can <a href='?src=[REF(src)];ghostscan=1'>scan</a> this circuit.");
/obj/item/electronic_assembly/proc/check_interactivity(mob/user)
@@ -186,7 +192,7 @@
return 1
if(href_list["ghostscan"])
if(isobserver(usr) && ckeys_allowed_to_scan[usr.ckey])
if((isobserver(usr) && ckeys_allowed_to_scan[usr.ckey]) || IsAdminGhost(usr))
if(assembly_components.len)
var/saved = "On circuit printers with cloning enabled, you may use the code below to clone the circuit:<br><br><code>[SScircuit.save_electronic_assembly(src)]</code>"
usr << browse(saved, "window=circuit_scan;size=500x600;border=1;can_resize=1;can_close=1;can_minimize=1")
@@ -194,6 +200,9 @@
to_chat(usr, "<span class='warning'>The circuit is empty!</span>")
return
if(!check_interactivity(usr))
return
if(href_list["rename"])
rename(usr)
@@ -348,6 +357,7 @@
to_chat(user, "<span class='notice'>You slide [IC] inside [src].</span>")
playsound(src, 'sound/items/Deconstruct.ogg', 50, 1)
add_allowed_scanner(user.ckey)
investigate_log("had [IC]([IC.type]) inserted by [key_name(user)].", INVESTIGATE_CIRCUIT)
add_component(IC)
return TRUE
@@ -387,6 +397,7 @@
playsound(src, 'sound/items/crowbar.ogg', 50, 1)
user.put_in_hands(IC)
add_allowed_scanner(user.ckey)
investigate_log("had [IC]([IC.type]) removed by [key_name(user)].", INVESTIGATE_CIRCUIT)
return TRUE
@@ -4,7 +4,8 @@
settings to specific circuits, or for debugging purposes. It can also pulse activation pins."
icon = 'icons/obj/assemblies/electronic_tools.dmi'
icon_state = "debugger"
flags_1 = CONDUCT_1 | NOBLUDGEON_1
flags_1 = CONDUCT_1
item_flags = NOBLUDGEON
w_class = WEIGHT_CLASS_SMALL
var/data_to_write = null
var/accepting_refs = FALSE
@@ -3,7 +3,8 @@
desc = "A combination autopainter and flash anodizer designed to give electronic assemblies a colorful, wear-resistant finish."
icon = 'icons/obj/assemblies/electronic_tools.dmi'
icon_state = "detailer"
flags_1 = CONDUCT_1 | NOBLUDGEON_1
flags_1 = CONDUCT_1
item_flags = NOBLUDGEON
w_class = WEIGHT_CLASS_SMALL
var/data_to_write = null
var/accepting_refs = FALSE
@@ -44,4 +45,4 @@
if(!in_range(src, user))
return
detail_color = color_list[color_choice]
update_icon()
update_icon()
@@ -24,7 +24,7 @@
var/category_text = "NO CATEGORY THIS IS A BUG" // To show up on circuit printer, and perhaps other places.
var/removable = TRUE // Determines if a circuit is removable from the assembly.
var/displayed_name = ""
/*
Integrated circuits are essentially modular machines. Each circuit has a specific function, and combining them inside Electronic Assemblies allows
a creative player the means to solve many problems. Circuits are held inside an electronic assembly, and are wired using special tools.
@@ -209,6 +209,7 @@ D [1]/ ||
write_data_to_pin(new_data)
/datum/integrated_io/activate/ask_for_pin_data(mob/user) // This just pulses the pin.
holder.investigate_log(" was manually pulsed by [key_name(user)].", INVESTIGATE_CIRCUIT)
holder.check_then_do_work(ord,ignore_power = TRUE)
to_chat(user, "<span class='notice'>You pulse \the [holder]'s [src] pin.</span>")
@@ -12,7 +12,6 @@
var/debug = FALSE // If it's upgraded and can clone, even without config settings.
var/current_category = null
var/cloning = FALSE // If the printer is currently creating a circuit
var/clone_countdown = 0 // Timestamp for when to print the circuit
var/recycling = FALSE // If an assembly is being emptied into this printer
var/list/program // Currently loaded save, in form of list
@@ -29,26 +28,22 @@
debug = TRUE
upgraded = TRUE
can_clone = TRUE
fast_clone = TRUE
w_class = WEIGHT_CLASS_TINY
/obj/item/integrated_circuit_printer/Initialize()
. = ..()
AddComponent(/datum/component/material_container, list(MAT_METAL), MINERAL_MATERIAL_AMOUNT * 25, TRUE, list(/obj/item/stack, /obj/item/integrated_circuit, /obj/item/electronic_assembly))
/obj/item/integrated_circuit_printer/Destroy()
STOP_PROCESSING(SSprocessing, src)
return ..()
/obj/item/integrated_circuit_printer/process()
/obj/item/integrated_circuit_printer/proc/print_program(mob/user)
if(!cloning)
STOP_PROCESSING(SSprocessing, src)
if(world.time >= clone_countdown || fast_clone)
var/turf/T = get_turf(src)
T.visible_message("<span class='notice'>[src] has finished printing its assembly!</span>")
playsound(get_turf(T), 'sound/items/poster_being_created.ogg', 50, TRUE)
SScircuit.load_electronic_assembly(T, program)
cloning = FALSE
STOP_PROCESSING(SSprocessing, src)
return
visible_message("<span class='notice'>[src] has finished printing its assembly!</span>")
playsound(src, 'sound/items/poster_being_created.ogg', 50, TRUE)
var/obj/item/electronic_assembly/assembly = SScircuit.load_electronic_assembly(get_turf(src), program)
assembly.creator = key_name(user)
assembly.investigate_log("was printed by [assembly.creator].", INVESTIGATE_CIRCUIT)
cloning = FALSE
/obj/item/integrated_circuit_printer/attackby(obj/item/O, mob/user)
if(istype(O, /obj/item/disk/integrated_circuit/upgrade/advanced))
@@ -141,7 +136,7 @@
if(!program)
HTML += " {[fast_clone ? "Print" : "Begin Printing"] Assembly}"
else if(cloning)
HTML += " <A href='?src=[REF(src)];print=cancel'>{Cancel Print}</a> - [DisplayTimeText(max(0, clone_countdown - world.time))] remaining until completion"
HTML += " <A href='?src=[REF(src)];print=cancel'>{Cancel Print}</a>"
else
HTML += " <A href='?src=[REF(src)];print=print'>{[fast_clone ? "Print" : "Begin Printing"] Assembly}</a>"
@@ -206,6 +201,7 @@
if(istype(built, /obj/item/electronic_assembly))
var/obj/item/electronic_assembly/E = built
E.creator = key_name(usr)
E.opened = TRUE
E.update_icon()
//reupdate diagnostic hud because it was put_in_hands() and not pickup()'ed
@@ -213,6 +209,7 @@
E.diag_hud_set_circuitcell()
E.diag_hud_set_circuitstat()
E.diag_hud_set_circuittracking()
E.investigate_log("was printed by [E.creator].", INVESTIGATE_CIRCUIT)
to_chat(usr, "<span class='notice'>[capitalize(built.name)] printed.</span>")
playsound(src, 'sound/items/jaws_pry.ogg', 50, TRUE)
@@ -226,8 +223,10 @@
return
switch(href_list["print"])
if("load")
if(cloning)
return
var/input = input("Put your code there:", "loading", null, null) as message | null
if(!check_interactivity(usr))
if(!check_interactivity(usr) || cloning)
return
if(!input)
program = null
@@ -254,7 +253,7 @@
to_chat(usr, "<span class='notice'>Metal cost: [program["metal_cost"]].</span>")
if("print")
if(!program)
if(!program || cloning)
return
if(program["requires_upgrades"] && !upgraded && !debug)
@@ -263,12 +262,11 @@
if(program["unsupported_circuit"] && !debug)
to_chat(usr, "<span class='warning'>This program uses components not supported by the specified assembly. Please change the assembly type in the save file to a supported one.</span>")
return
else if(fast_clone || debug)
else if(fast_clone)
var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
if(debug || materials.use_amount_type(program["metal_cost"], MAT_METAL))
var/obj/item/assembly = SScircuit.load_electronic_assembly(get_turf(src), program)
to_chat(usr, "<span class='notice'>[assembly] has been printed from the provided template!</span>")
playsound(src, 'sound/items/poster_being_created.ogg', 50, TRUE)
cloning = TRUE
print_program(usr)
else
to_chat(usr, "<span class='warning'>You need [program["metal_cost"]] metal to build that!</span>")
else
@@ -279,11 +277,10 @@
var/cloning_time = round(program["metal_cost"] / 15)
cloning_time = min(cloning_time, MAX_CIRCUIT_CLONE_TIME)
cloning = TRUE
clone_countdown = world.time + cloning_time
to_chat(usr, "<span class='notice'>You begin printing a custom assembly. This will take approximately [DisplayTimeText(cloning_time)]. You can still print \
off normal parts during this time.</span>")
playsound(src, 'sound/items/poster_being_created.ogg', 50, TRUE)
START_PROCESSING(SSprocessing, src)
addtimer(CALLBACK(src, .proc/print_program, usr), cloning_time)
if("cancel")
if(!cloning || !program)
@@ -291,7 +288,6 @@
to_chat(usr, "<span class='notice'>Cloning has been canceled. Metal cost has been refunded.</span>")
cloning = FALSE
clone_countdown = FALSE
var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
materials.use_amount_type(-program["metal_cost"], MAT_METAL) //use negative amount to regain the cost
@@ -763,7 +763,7 @@
data.standard_format_data(message, text, key)
ntnet_send(data)
/obj/item/integrated_circuit/input/ntnet_recieve(datum/netdata/data)
/obj/item/integrated_circuit/input/ntnet_receive(datum/netdata/data)
set_pin_data(IC_OUTPUT, 1, data.sender_id)
set_pin_data(IC_OUTPUT, 2, data.data["data"])
set_pin_data(IC_OUTPUT, 3, data.data["data_secondary"])
@@ -774,7 +774,7 @@
activate_pin(2)
/obj/item/integrated_circuit/input/ntnet_advanced
name = "Low level NTNet transreciever"
name = "Low level NTNet transreceiver"
desc = "Enables the sending and receiving of messages over NTNet via packet data protocol. Allows advanced control of message contents and signalling. Must use associative lists. Outputs associative list. Has a slower transmission rate than normal NTNet circuits, due to increased data processing complexity."
extended_desc = "Data can be sent or received using the second pin on each side, \
with additonal data reserved for the third pin. When a message is received, the second activation pin \
@@ -787,7 +787,7 @@
"target NTNet addresses"= IC_PINTYPE_STRING,
"data" = IC_PINTYPE_LIST,
)
outputs = list("recieved data" = IC_PINTYPE_LIST, "is_broadcast" = IC_PINTYPE_BOOLEAN)
outputs = list("received data" = IC_PINTYPE_LIST, "is_broadcast" = IC_PINTYPE_BOOLEAN)
activators = list("send data" = IC_PINTYPE_PULSE_IN, "on data received" = IC_PINTYPE_PULSE_OUT)
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
action_flags = IC_ACTION_LONG_RANGE
@@ -811,7 +811,7 @@
data.data = message
ntnet_send(data)
/obj/item/integrated_circuit/input/ntnet_advanced/ntnet_recieve(datum/netdata/data)
/obj/item/integrated_circuit/input/ntnet_advanced/ntnet_receive(datum/netdata/data)
set_pin_data(IC_OUTPUT, 1, data.data)
set_pin_data(IC_OUTPUT, 2, data.broadcast)
push_data()
@@ -1123,6 +1123,67 @@
else
activate_pin(3)
/obj/item/integrated_circuit/input/atmospheric_analyzer
name = "atmospheric analyzer"
desc = "A miniaturized analyzer which can scan anything that contains gases. Leave target as NULL to scan the air around the assembly."
extended_desc = "The nth element of gas amounts is the number of moles of the \
nth gas in gas list. \
Pressure is in kPa, temperature is in Kelvin. \
Due to programming limitations, scanning an object that does \
not contain a gas will return the air around it instead."
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
inputs = list(
"target" = IC_PINTYPE_REF
)
outputs = list(
"gas list" = IC_PINTYPE_LIST,
"gas amounts" = IC_PINTYPE_LIST,
"total moles" = IC_PINTYPE_NUMBER,
"pressure" = IC_PINTYPE_NUMBER,
"temperature" = IC_PINTYPE_NUMBER,
"volume" = IC_PINTYPE_NUMBER
)
activators = list(
"scan" = IC_PINTYPE_PULSE_IN,
"on success" = IC_PINTYPE_PULSE_OUT,
"on failure" = IC_PINTYPE_PULSE_OUT
)
power_draw_per_use = 5
/obj/item/integrated_circuit/input/atmospheric_analyzer/do_work()
for(var/i=1 to 6)
set_pin_data(IC_OUTPUT, i, null)
var/atom/target = get_pin_data_as_type(IC_INPUT, 1, /atom)
var/atom/movable/acting_object = get_object()
if(!target)
target = acting_object.loc
if(!target.Adjacent(acting_object))
activate_pin(3)
return
var/datum/gas_mixture/air_contents = target.return_air()
if(!air_contents)
activate_pin(3)
return
var/list/gases = air_contents.gases
var/list/gas_names = list()
var/list/gas_amounts = list()
for(var/id in gases)
var/name = gases[id][GAS_META][META_GAS_NAME]
var/amt = round(gases[id][MOLES], 0.001)
gas_names.Add(name)
gas_amounts.Add(amt)
set_pin_data(IC_OUTPUT, 1, gas_names)
set_pin_data(IC_OUTPUT, 2, gas_amounts)
set_pin_data(IC_OUTPUT, 3, round(air_contents.total_moles(), 0.001))
set_pin_data(IC_OUTPUT, 4, round(air_contents.return_pressure(), 0.001))
set_pin_data(IC_OUTPUT, 5, round(air_contents.temperature, 0.001))
set_pin_data(IC_OUTPUT, 6, round(air_contents.return_volume(), 0.001))
push_data()
activate_pin(2)
/obj/item/integrated_circuit/input/data_card_reader
name = "data card reader"
desc = "A circuit that can read from and write to data cards."
@@ -367,12 +367,12 @@
var/atom/movable/acting_object = get_object()
var/turf/T = get_turf(acting_object)
var/obj/item/AM = get_pin_data_as_type(IC_INPUT, 1, /obj/item)
if(AM)
if(!QDELETED(AM) && !istype(AM, /obj/item/electronic_assembly) && !istype(AM, /obj/item/transfer_valve) && !istype(AM, /obj/item/twohanded) && !istype(assembly.loc, /obj/item/implant/storage))
var/mode = get_pin_data(IC_INPUT, 2)
if(mode == 1)
if(check_target(AM))
var/weightcheck = FALSE
if (AM.w_class < max_w_class)
if (AM.w_class <= max_w_class)
weightcheck = TRUE
else
weightcheck = FALSE
@@ -496,7 +496,10 @@
var/target_y_rel = round(get_pin_data(IC_INPUT, 2))
var/obj/item/A = get_pin_data_as_type(IC_INPUT, 3, /obj/item)
if(!A || A.anchored || A.throwing || A == assembly)
if(!A || A.anchored || A.throwing || A == assembly || istype(A, /obj/item/twohanded) || istype(A, /obj/item/transfer_valve))
return
if (istype(assembly.loc, /obj/item/implant/storage)) //Prevents the more abusive form of chestgun.
return
if(max_w_class && (A.w_class > max_w_class))
@@ -527,6 +530,7 @@
var/range = round(CLAMP(sqrt(target_x_rel*target_x_rel+target_y_rel*target_y_rel),0,8),1)
assembly.visible_message("<span class='danger'>[assembly] has thrown [A]!</span>")
log_attack("[assembly] [REF(assembly)] has thrown [A].")
A.forceMove(drop_location())
A.throw_at(locate(x_abs, y_abs, T.z), range, 3)
@@ -46,6 +46,10 @@
for(var/mob/M in nearby_things)
var/obj/O = assembly ? assembly : src
to_chat(M, "<span class='notice'>[icon2html(O.icon, world, O.icon_state)] [stuff_to_display]</span>")
if(assembly)
assembly.investigate_log("displayed \"[html_encode(stuff_to_display)]\" with [type].", INVESTIGATE_CIRCUIT)
else
investigate_log("displayed \"[html_encode(stuff_to_display)]\" as [type].", INVESTIGATE_CIRCUIT)
/obj/item/integrated_circuit/output/screen/large
name = "large screen"
@@ -58,6 +62,10 @@
..()
var/obj/O = assembly ? get_turf(assembly) : loc
O.visible_message("<span class='notice'>[icon2html(O.icon, world, O.icon_state)] [stuff_to_display]</span>")
if(assembly)
assembly.investigate_log("displayed \"[html_encode(stuff_to_display)]\" with [type].", INVESTIGATE_CIRCUIT)
else
investigate_log("displayed \"[html_encode(stuff_to_display)]\" as [type].", INVESTIGATE_CIRCUIT)
/obj/item/integrated_circuit/output/light
name = "light"
@@ -151,6 +159,10 @@
return
vol = CLAMP(vol ,0 , 100)
playsound(get_turf(src), selected_sound, vol, freq, -1)
if(assembly)
assembly.investigate_log("played a sound ([selected_sound]) with [type].", INVESTIGATE_CIRCUIT)
else
investigate_log("played a sound ([selected_sound]) as [type].", INVESTIGATE_CIRCUIT)
/obj/item/integrated_circuit/output/sound/on_data_written()
power_draw_per_use = get_pin_data(IC_INPUT, 2) * 15
@@ -234,8 +246,12 @@
text = get_pin_data(IC_INPUT, 1)
if(!isnull(text))
var/atom/movable/A = get_object()
A.say(sanitize(text))
var/sanitized_text = sanitize(text)
A.say(sanitized_text)
if (assembly)
log_say("[assembly] [REF(assembly)] : [sanitized_text]")
else
log_say("[name] ([type]) : [sanitized_text]")
/obj/item/integrated_circuit/output/video_camera
name = "video camera circuit"
@@ -24,7 +24,7 @@
/obj/item/integrated_circuit/power/transmitter/large
name = "large power transmission circuit"
desc = "This can wirelessly transmit a lot of electricity from an assembly's battery towards a nearby machine. <b>Warning:</b> Do not operate in flammable enviroments."
desc = "This can wirelessly transmit a lot of electricity from an assembly's battery towards a nearby machine. <b>Warning:</b> Do not operate in flammable environments."
extended_desc = "This circuit transmits 20 kJ of electricity every time the activator pin is pulsed. The input pin must be \
a reference to a machine to send electricity to. This can be a battery, or anything containing a battery. The machine can exist \
inside the assembly, or adjacent to it. The power is sourced from the assembly's power cell. If the target is outside of the assembly, \
@@ -186,7 +186,7 @@
//Always log attemped injections for admins
var/contained = reagents.log_list()
add_logs(src, L, "attemped to inject", addition="which had [contained]")
add_logs(src, L, "attempted to inject", addition="which had [contained]")
L.visible_message("<span class='danger'>[acting_object] is trying to inject [L]!</span>", \
"<span class='userdanger'>[acting_object] is trying to inject you!</span>")
busy = TRUE