mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-23 05:00:55 +01:00
Merge Conflict Fix
This commit is contained in:
@@ -27,12 +27,12 @@
|
||||
containername = "carbon dioxide canister crate"
|
||||
|
||||
|
||||
/obj/machinery/hydroponics/unattached
|
||||
/obj/machinery/hydroponics/constructable/unattached
|
||||
anchored = 0
|
||||
|
||||
/datum/supply_packs/organic/hydroponics/hydro_tray
|
||||
name = "Hydroponics Tray"
|
||||
contains = list(/obj/machinery/hydroponics/unattached)
|
||||
name = "Hydroponics Tray Kit"
|
||||
contains = list(/obj/machinery/hydroponics/constructable/unattached)
|
||||
cost = 10
|
||||
containertype = /obj/structure/largecrate
|
||||
containername = "hydroponics tray crate"
|
||||
containername = "hydroponics kit"
|
||||
@@ -6691,6 +6691,7 @@
|
||||
"cyI" = (/obj/item/weapon/stock_parts/cell{charge = 100; maxcharge = 15000},/turf/simulated/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
|
||||
"cyJ" = (/obj/structure/rack,/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/weapon/storage/toolbox/mechanical,/turf/simulated/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
|
||||
"cyK" = (/turf/simulated/wall/shuttle{icon_state = "swall_f14"},/area/shuttle/abandoned)
|
||||
"cyL" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/aft)
|
||||
"cyM" = (/turf/simulated/wall/shuttle{icon_state = "swall_f11"},/area/shuttle/abandoned)
|
||||
"cyN" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad2"},/obj/machinery/door/poddoor{id = "QMLoaddoor2"; name = "supply dock loading door"},/turf/simulated/floor/plating,/area/shuttle/supply)
|
||||
"cyO" = (/obj/structure/bed/chair{dir = 1},/turf/simulated/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
|
||||
@@ -6720,12 +6721,12 @@
|
||||
"czm" = (/obj/structure/bed,/obj/item/weapon/bedsheet,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plasteel/shuttle{icon_state = "shuttlefloor5"},/area/shuttle/abandoned)
|
||||
"czn" = (/turf/simulated/wall/shuttle{icon_state = "swall15"; dir = 2},/area/shuttle/supply)
|
||||
"czo" = (/turf/simulated/wall/shuttle{icon_state = "swall_s5"; dir = 2},/area/shuttle/supply)
|
||||
"czp" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/shuttle/engine/heater,/turf/simulated/floor/plating,/area/shuttle/supply)
|
||||
"czp" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/shuttle/engine/heater,/turf/simulated/floor/plating/airless,/area/shuttle/supply)
|
||||
"czq" = (/turf/simulated/wall/shuttle{icon_state = "swall_s9"; dir = 2},/area/shuttle/supply)
|
||||
"czr" = (/obj/machinery/portable_atmospherics/scrubber,/turf/simulated/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
|
||||
"czs" = (/obj/structure/shuttle/engine/propulsion{icon_state = "burst_l"},/turf/simulated/floor/plating,/area/shuttle/supply)
|
||||
"czt" = (/obj/structure/shuttle/engine/propulsion,/turf/simulated/floor/plating,/area/shuttle/supply)
|
||||
"czu" = (/obj/structure/shuttle/engine/propulsion{icon_state = "burst_r"},/turf/simulated/floor/plating,/area/shuttle/supply)
|
||||
"czs" = (/obj/structure/shuttle/engine/propulsion{icon_state = "burst_l"},/turf/simulated/floor/plating/airless,/area/shuttle/supply)
|
||||
"czt" = (/obj/structure/shuttle/engine/propulsion,/turf/simulated/floor/plating/airless,/area/shuttle/supply)
|
||||
"czu" = (/obj/structure/shuttle/engine/propulsion{icon_state = "burst_r"},/turf/simulated/floor/plating/airless,/area/shuttle/supply)
|
||||
"czv" = (/turf/simulated/wall/shuttle{icon_state = "swall_f18"},/area/shuttle/abandoned)
|
||||
"czw" = (/obj/item/device/multitool,/turf/simulated/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
|
||||
"czx" = (/obj/structure/bed/chair,/turf/simulated/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
|
||||
@@ -6988,7 +6989,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
||||
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaaccacccccbaaaccacccccbaaaccacccccbaaaaaSaaaaaabLvccdbHEbCqbCqbCqbTzbCqbCqbCqbCqaoVaoVaoVcnBaaHaaHapQaoVaoVbGpbVHbVIbYzccgccfbWBcchbYzbYzbXFccibOCbUybVbbUCbVdbVcbVfbVebVhbVgbVobVmbVqbVpcerbVrbWhbVKccwccvccyccxbRAbRAbRDbTOcczbTUbRFbURccAbQyapQbQAccCccBccDbOhapQbzsbzscfVccFccEcbLccGbzscbMccIccHccKccJccLccHccNccMbhGccObDbbDbbDbbDbbDbbDbbMiccPcfybDbbDbbDbbDbbDbbDbbQZbQZbQZbQZbQZbQZccRccRccSccTbQZbQZbQZbQZbQZbkyccUbTrbkyccWccVbtpbkyaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
||||
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaafccaccXccbaaaccaccXccbaaaccaccXccbaafaafaaaaaabLvccYccZbCqbSqbHEbHEcdabQacdbbCqaoVaoVaoVaoVapQaoVaoVaoVaoVbESbVHbVIbWBcddcdcbWBcdecdfbWBbXFcdgbWtbWsbWvbWubWKbWJbXmbXkbXobXnbXqbXpbXIbXHccsbXNcdtbYbccwcdwbOdcbAbTObTPcdycdxcdAcdzbMWcdBcdCbRIbVvbPjcdDcbHcbHbOhapQbzsbAwcfWcdGcdFcdIcdHbzscdJcdLcdKccMcdMccMbFrbHdcdNbhGcdObDbcfrcgicgicglcgkbMiccPcgnbDbaafaafaafaafbkycdQbNBblQcdRcdRbQZcdScdSccSbScbQZcmobtpcAKbtpbDhccUbXubkycdVbtpbtpbkybkybkyaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
||||
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaaccaccXccbaafccaccXccbaafccaccXccbaaaaafaafaafbCqbLvbCqbCqbCqcdWcdYcgFcpYbSsbCqaoVaoVaoVaoVapQaoVaoVapQaoVbESbVHbVIbWBceacdZceccebcedbWBcefceecehcegceibVJbYpbYnbYEbYqbYMbYGbZebYObZgbZfbZubZtbZAbZwceycexbOdcbAcezbOdbOdbOdcezcezcezbURceBceAapQbOhbOhbOhbOhbOhapQbzscaKcfXceEceDceGceFbzsbzsceIceHceJbLSceLceKbzsbzsbhGcdObDbchochqchqchschrchuchtcjBbDbaafaaaaaaaafbkybtpceMbrGceOceNbQZcePcePceQbScbQZbkybkyceSceRbDhccUbTrbtpbtpbtpceTblPceUblPaagaagaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
||||
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafccaccXccbaaaccaccXccbaaaccaccXccbaafaafaaaaaaaafaafbCqceVbCqceWceYbCqbTzbCqbCqaoVapQaoVaoVapQaoVaoVapQaoVbESbVHbVIbVIbVIbVIbVIbVIbVIbVIbVJbVJbVJbVJbVJbVJbCqbZBbCqccwcfbcfbcfbcfcbZDbZCcfbbZEcfhcapccwbOdbQucficezbOdbOdbOdbOebULcezbURcezbLKapQapQapQapQapQapQapQcfjcfjchkcflcfkcfjcfjcfjcfmcfocfnceJcfpceJceJbzscfqcbKcdObDbbDbccQccQbDbbDbccQcknccQbDbaaaaaaaaaaaabkybkyccUcfsbkybkybQZbQZbQZcftcfubQZbDhbkycaebtpckSccUcbgbkybkycfvbkybkybkybkyaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
||||
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafccaccXccbaaaccaccXccbaaaccaccXccbaafaafaaaaaaaafaafbCqceVbCqceWceYbCqcyLbCqbCqaoVapQaoVaoVapQaoVaoVapQaoVbESbVHbVIbVIbVIbVIbVIbVIbVIbVIbVJbVJbVJbVJbVJbVJbCqbZBbCqccwcfbcfbcfbcfcbZDbZCcfbbZEcfhcapccwbOdbQucficezbOdbOdbOdbOebULcezbURcezbLKapQapQapQapQapQapQapQcfjcfjchkcflcfkcfjcfjcfjcfmcfocfnceJcfpceJceJbzscfqcbKcdObDbbDbccQccQbDbbDbccQcknccQbDbaaaaaaaaaaaabkybkyccUcfsbkybkybQZbQZbQZcftcfubQZbDhbkycaebtpckSccUcbgbkybkycfvbkybkybkybkyaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
||||
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaSaaSaafaaaccaccXccbaaaccaccXccbaaaccaccXccbaaaaafaaaaaacfxcfwcfwcfwcfwbCqbCqcqncqybCqbLvbLvbLvbLvbLvbLvbLvbLvbLvbCqcarcaqbTAcaxcazcaycaycaycaycaycaycaycaycaycaBcaBcaycaCceWccwcfFcfEcfHcgOcbqcbpcfbcbscfMctRccwcfNcfObRHcfQcfPcfRcfPcfQcfScfQcfTcezbLKbLKbLKaoVaoVapQapQcfjcfjciBchlcfZcfYcgbcgacfjcgcbAwcgdcgfcgecghcggbKTbKTcgjcnHbkyaaaaaaaaaaaaaaaaafcskaafaaaaaaaaaaaaaaabkyczGcgocgmcgmcgpcgrcgqcgtcgscgubkybkybkybkycbvbkyccUbTrbkycgybtpbtpbkyaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
||||
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaaaafaaaaaaaaacgzaaaaaaaaacgzaaaaaaaaacgzaaaaaaaafcfxcfxcfxcgAcgCcgBcgEcgDbHEcAhcAicgGcgHcgHcgHcgHcgHcgHcgHcgHcgHcgHcgHcbwbEPcbxcbyccwccwccwccwccwccwccwccwccwccwccwccwccwccwccwcfbcgMcgOccjcclcckcgSccmccoccnccwcfNcgWcgVcgYcgXchacgZchbbOdchdchcchfchechgcheaoVaoVapQciCcfUcjpckhcizckicjrchnchmcfjbAwbAwceJceJcbKceJccMbAwbAwcbKczHbkybkybZibZibkybkybZiczQbZibkybkybZibZibZibkyczRczSbnschwchvchxchxchxchychAchzchCccpccqccqccqccrcctbkyccVbtpchHbkyaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
||||
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaafchJchIchIchKchLchLchLchLchLchLchLchLchLchLchLchMchOchNchOchPchRchQchScgHchUchTbQabCqbLvbLvbLvbLvbLvbLvbLvbLvbLvbCqbCqccucdicdhcdjccwchYchYchZccwcibciacidciccifciecihcigcijcdkcfbcikcimcdlcdmcinciqcdncdpcdoccwbLKcitbMQciubMQcivbMQciubMQciwbMQcixbLKbLKbLKapQapQapQbVucfjchhchjchicldckjciEciDcfjciFbAwccMccMciGceJccMbAwciHcbKczTbUwbUwbUwbUwbUwbUwbUwczUcANczVczVczVczVczVczXczWblObkyciKciJbkybkybZibZibkybkyciLcbfcdqbnscdscdrcdubkybkybkybkybkyaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
||||
|
||||
@@ -150,6 +150,9 @@ Helpers
|
||||
/obj/machinery/atmospherics/components/proc/update_parents()
|
||||
for(DEVICE_TYPE_LOOP)
|
||||
var/datum/pipeline/parent = PARENT_I
|
||||
if(!parent)
|
||||
throw EXCEPTION("Component is missing a pipenet! Rebuilding...")
|
||||
build_network()
|
||||
parent.update = 1
|
||||
|
||||
/obj/machinery/atmospherics/components/returnPipenets()
|
||||
|
||||
@@ -102,11 +102,7 @@
|
||||
return
|
||||
if (!NODE1)
|
||||
on = 0
|
||||
//broadcast_status() // from now air alarm/control computer should request update purposely --rastaf0
|
||||
if(!on)
|
||||
return 0
|
||||
|
||||
if(welded)
|
||||
if(!on || welded)
|
||||
return 0
|
||||
|
||||
var/datum/gas_mixture/air_contents = AIR1
|
||||
@@ -170,7 +166,8 @@
|
||||
signal.data = list(
|
||||
"area" = src.area_uid,
|
||||
"tag" = src.id_tag,
|
||||
"device" = "AVP",
|
||||
"frequency" = frequency,
|
||||
"device" = "VP",
|
||||
"power" = on,
|
||||
"direction" = pump_direction?("release"):("siphon"),
|
||||
"checks" = pressure_checks,
|
||||
@@ -236,6 +233,9 @@
|
||||
if("set_external_pressure" in signal.data)
|
||||
external_pressure_bound = Clamp(text2num(signal.data["set_external_pressure"]),0,ONE_ATMOSPHERE*50)
|
||||
|
||||
if("reset_external_pressure" in signal.data)
|
||||
external_pressure_bound = ONE_ATMOSPHERE
|
||||
|
||||
if("adjust_internal_pressure" in signal.data)
|
||||
internal_pressure_bound = Clamp(internal_pressure_bound + text2num(signal.data["adjust_internal_pressure"]),0,ONE_ATMOSPHERE*50)
|
||||
|
||||
@@ -247,13 +247,11 @@
|
||||
return
|
||||
|
||||
if("status" in signal.data)
|
||||
spawn(2)
|
||||
broadcast_status()
|
||||
broadcast_status()
|
||||
return //do not update_icon
|
||||
|
||||
//log_admin("DEBUG \[[world.timeofday]\]: vent_pump/receive_signal: unknown command \"[signal.data["command"]]\"\n[signal.debug_print()]")
|
||||
spawn(2)
|
||||
broadcast_status()
|
||||
broadcast_status()
|
||||
update_icon()
|
||||
return
|
||||
|
||||
|
||||
@@ -117,7 +117,8 @@
|
||||
signal.data = list(
|
||||
"area" = area_uid,
|
||||
"tag" = id_tag,
|
||||
"device" = "AScr",
|
||||
"frequency" = frequency,
|
||||
"device" = "VS",
|
||||
"timestamp" = world.time,
|
||||
"power" = on,
|
||||
"scrubbing" = scrubbing,
|
||||
@@ -151,11 +152,10 @@
|
||||
return
|
||||
if (!NODE1)
|
||||
on = 0
|
||||
//broadcast_status()
|
||||
if(!on || welded)
|
||||
return 0
|
||||
scrub(loc)
|
||||
if (widenet)
|
||||
if(widenet)
|
||||
for (var/turf/simulated/tile in adjacent_turfs)
|
||||
scrub(tile)
|
||||
|
||||
@@ -291,12 +291,10 @@
|
||||
return
|
||||
|
||||
if("status" in signal.data)
|
||||
spawn(2)
|
||||
broadcast_status()
|
||||
broadcast_status()
|
||||
return //do not update_icon
|
||||
|
||||
spawn(2)
|
||||
broadcast_status()
|
||||
broadcast_status()
|
||||
update_icon()
|
||||
return
|
||||
|
||||
|
||||
@@ -51,10 +51,11 @@
|
||||
|
||||
|
||||
/obj/machinery/atmospherics/pipe/heat_exchanging/process()
|
||||
var/datum/gas_mixture/pipe_air = return_air()
|
||||
if(!pipe_air)
|
||||
if(!parent)
|
||||
return //machines subsystem fires before atmos is initialized so this prevents race condition runtimes
|
||||
|
||||
var/datum/gas_mixture/pipe_air = return_air()
|
||||
|
||||
//Heat causes pipe to glow
|
||||
if(pipe_air.temperature && (icon_temperature > 500 || pipe_air.temperature > 500)) //glow starts at 500K
|
||||
if(abs(pipe_air.temperature - icon_temperature) > 10)
|
||||
|
||||
@@ -324,3 +324,6 @@ var/list/bloody_footprints_cache = list()
|
||||
//Bloodcrawling
|
||||
#define BLOODCRAWL 1
|
||||
#define BLOODCRAWL_EAT 2
|
||||
|
||||
//Color Defines
|
||||
#define OOC_COLOR "#002eb8"
|
||||
@@ -37,8 +37,9 @@
|
||||
if(!src || qdeleted(src))
|
||||
return
|
||||
|
||||
var/turf/T = pick(get_area_turfs(picked_area))
|
||||
|
||||
var/turf/T = safepick(get_area_turfs(picked_area))
|
||||
if(!T)
|
||||
return
|
||||
var/obj/docking_port/stationary/landing_zone = new /obj/docking_port/stationary(T)
|
||||
landing_zone.id = "assault_pod(\ref[src])"
|
||||
landing_zone.name = "Landing Zone"
|
||||
|
||||
+13
-22
@@ -562,16 +562,13 @@
|
||||
istype(current,/mob/living/carbon/human) )
|
||||
|
||||
text = "Uplink: <a href='?src=\ref[src];common=uplink'>give</a>"
|
||||
var/obj/item/device/uplink/suplink = find_syndicate_uplink()
|
||||
var/crystals
|
||||
if (suplink)
|
||||
crystals = suplink.uses
|
||||
if (suplink)
|
||||
var/obj/item/device/uplink/U = find_syndicate_uplink()
|
||||
if(U)
|
||||
text += "|<a href='?src=\ref[src];common=takeuplink'>take</a>"
|
||||
if (check_rights(R_FUN, 0))
|
||||
text += ", <a href='?src=\ref[src];common=crystals'>[crystals]</a> crystals"
|
||||
text += ", <a href='?src=\ref[src];common=crystals'>[U.telecrystals]</a> TC"
|
||||
else
|
||||
text += ", [crystals] crystals"
|
||||
text += ", [U.telecrystals] TC"
|
||||
text += "." //hiel grammar
|
||||
out += text
|
||||
|
||||
@@ -1101,7 +1098,6 @@
|
||||
if(isAI(current))
|
||||
var/mob/living/silicon/ai/A = current
|
||||
ticker.mode.add_law_zero(A)
|
||||
A.show_laws()
|
||||
|
||||
if("autoobjectives")
|
||||
ticker.mode.forge_traitor_objectives(src)
|
||||
@@ -1239,19 +1235,16 @@
|
||||
memory = null//Remove any memory they may have had.
|
||||
log_admin("[key_name(usr)] removed [current]'s uplink.")
|
||||
if("crystals")
|
||||
if (check_rights(R_FUN, 0))
|
||||
var/obj/item/device/uplink/suplink = find_syndicate_uplink()
|
||||
var/crystals
|
||||
if (suplink)
|
||||
crystals = suplink.uses
|
||||
crystals = input("Amount of telecrystals for [key]","Syndicate uplink", crystals) as null|num
|
||||
if (!isnull(crystals))
|
||||
if (suplink)
|
||||
suplink.uses = crystals
|
||||
if(check_rights(R_FUN, 0))
|
||||
var/obj/item/device/uplink/U = find_syndicate_uplink()
|
||||
if(U)
|
||||
var/crystals = input("Amount of telecrystals for [key]","Syndicate uplink", U.telecrystals) as null|num
|
||||
if(!isnull(crystals))
|
||||
U.telecrystals = crystals
|
||||
message_admins("[key_name_admin(usr)] changed [current]'s telecrystal count to [crystals].")
|
||||
log_admin("[key_name(usr)] changed [current]'s telecrystal count to [crystals].")
|
||||
if("uplink")
|
||||
if (!ticker.mode.equip_traitor(current, !(src in ticker.mode.traitors)))
|
||||
if(!ticker.mode.equip_traitor(current, !(src in ticker.mode.traitors)))
|
||||
usr << "<span class='danger'>Equipping a syndicate failed!</span>"
|
||||
log_admin("[key_name(usr)] attempted to give [current] an uplink.")
|
||||
|
||||
@@ -1607,15 +1600,13 @@
|
||||
else
|
||||
spawn(0)
|
||||
throw EXCEPTION("mind_initialize(): No ticker ready")
|
||||
if(!mind.name)
|
||||
mind.name = real_name
|
||||
if(!mind.name) mind.name = real_name
|
||||
mind.current = src
|
||||
|
||||
//HUMAN
|
||||
/mob/living/carbon/human/mind_initialize()
|
||||
..()
|
||||
if(!mind.assigned_role)
|
||||
mind.assigned_role = "Assistant" //defualt
|
||||
if(!mind.assigned_role) mind.assigned_role = "Assistant" //defualt
|
||||
|
||||
//MONKEY
|
||||
/mob/living/carbon/monkey/mind_initialize()
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -67,8 +67,8 @@ var/list/teleportlocs = list()
|
||||
for(var/area/AR in world)
|
||||
if(istype(AR, /area/shuttle) || istype(AR, /area/wizard_station)) continue
|
||||
if(teleportlocs.Find(AR.name)) continue
|
||||
var/turf/picked = pick(get_area_turfs(AR.type))
|
||||
if (picked.z == ZLEVEL_STATION)
|
||||
var/turf/picked = safepick(get_area_turfs(AR.type))
|
||||
if (picked && (picked.z == ZLEVEL_STATION))
|
||||
teleportlocs += AR.name
|
||||
teleportlocs[AR.name] = AR
|
||||
|
||||
|
||||
@@ -29,19 +29,19 @@
|
||||
O.loc = get_turf(user)
|
||||
qdel(O)
|
||||
|
||||
if(istype(user.wear_suit, /obj/item/clothing/suit/straight_jacket) && !used)
|
||||
if(user.wear_suit && user.wear_suit.breakouttime && !used)
|
||||
used = 1
|
||||
var/obj/item/clothing/suit/straight_jacket/SJ = user.get_item_by_slot(slot_wear_suit)
|
||||
if(!SJ || !istype(SJ))
|
||||
var/obj/item/clothing/suit/S = user.get_item_by_slot(slot_wear_suit)
|
||||
if(!S || !istype(S))
|
||||
return 0
|
||||
user.visible_message("<span class='warning'>[user] vomits a glob of acid across the front of \his [SJ]!</span>", \
|
||||
user.visible_message("<span class='warning'>[user] vomits a glob of acid across the front of \his [S]!</span>", \
|
||||
"<span class='warning'>We vomit acidic ooze onto our straight jacket!</span>")
|
||||
spawn(30)
|
||||
if(SJ && user.wear_suit == SJ)
|
||||
user.unEquip(SJ)
|
||||
SJ.visible_message("<span class='warning'>[SJ] dissolves into a puddle of sizzling goop.</span>")
|
||||
SJ.loc = get_turf(user)
|
||||
qdel(SJ)
|
||||
if(S && user.wear_suit == S)
|
||||
user.unEquip(S)
|
||||
S.visible_message("<span class='warning'>[S] dissolves into a puddle of sizzling goop.</span>")
|
||||
S.loc = get_turf(user)
|
||||
qdel(S)
|
||||
|
||||
if(istype(user.loc, /obj/structure/closet) && !used)
|
||||
used = 1
|
||||
|
||||
@@ -602,6 +602,7 @@
|
||||
break
|
||||
|
||||
// Give the power and take away the money.
|
||||
A.view_core() //A BYOND bug requires you to be viewing your core before your verbs update
|
||||
A.verbs += AM.power_type
|
||||
A.current_modules += new AM.type
|
||||
temp = AM.description
|
||||
|
||||
@@ -187,7 +187,7 @@
|
||||
PoolOrNew(/obj/effect/overlay/temp/revenant, bot.loc)
|
||||
bot.locked = 0
|
||||
bot.open = 1
|
||||
bot.Emag(null)
|
||||
bot.emag_act()
|
||||
for(var/mob/living/carbon/human/human in T.contents)
|
||||
if(human == user)
|
||||
continue
|
||||
|
||||
@@ -159,11 +159,6 @@
|
||||
obj_count++
|
||||
return
|
||||
|
||||
|
||||
/datum/game_mode/proc/random_radio_frequency()
|
||||
return 1337 // WHY??? -- Doohl
|
||||
|
||||
|
||||
/datum/game_mode/proc/equip_syndicate(mob/living/carbon/human/synd_mob, telecrystals = TRUE)
|
||||
if(telecrystals)
|
||||
synd_mob.equipOutfit(/datum/outfit/syndicate)
|
||||
@@ -177,7 +172,6 @@
|
||||
return 1
|
||||
return ..()
|
||||
|
||||
|
||||
/datum/game_mode/proc/are_operatives_dead()
|
||||
for(var/datum/mind/operative_mind in syndicates)
|
||||
if (istype(operative_mind.current,/mob/living/carbon/human) && (operative_mind.current.stat!=2))
|
||||
@@ -234,7 +228,7 @@
|
||||
world << "<FONT size = 3><B>Crew Major Victory!</B></FONT>"
|
||||
world << "<B>The Research Staff has saved the disc and killed the [syndicate_name()] Operatives</B>"
|
||||
|
||||
else if ( disk_rescued )
|
||||
else if (disk_rescued)
|
||||
feedback_set_details("round_end_result","loss - evacuation - disk secured")
|
||||
world << "<FONT size = 3><B>Crew Major Victory</B></FONT>"
|
||||
world << "<B>The Research Staff has saved the disc and stopped the [syndicate_name()] Operatives!</B>"
|
||||
@@ -265,13 +259,13 @@
|
||||
var/TC_uses = 0
|
||||
for(var/datum/mind/syndicate in syndicates)
|
||||
text += printplayer(syndicate)
|
||||
for(var/obj/item/device/uplink/H in world_uplinks)
|
||||
if(H && H.uplink_owner && H.uplink_owner==syndicate.key)
|
||||
TC_uses += H.used_TC
|
||||
for(var/obj/item/device/uplink/H in uplinks)
|
||||
if(H && H.owner && H.owner == syndicate.key)
|
||||
TC_uses += H.spent_telecrystals
|
||||
purchases += H.purchase_log
|
||||
text += "<br>"
|
||||
text += "(Syndicates used [TC_uses] TC) [purchases]"
|
||||
if(TC_uses==0 && station_was_nuked && !are_operatives_dead())
|
||||
if(TC_uses == 0 && station_was_nuked && !are_operatives_dead())
|
||||
text += "<BIG><IMG CLASS=icon SRC=\ref['icons/BadAss.dmi'] ICONSTATE='badass'></BIG>"
|
||||
world << text
|
||||
return 1
|
||||
@@ -322,10 +316,9 @@
|
||||
R.freqlock = 1
|
||||
|
||||
if(tc)
|
||||
var/obj/item/device/radio/uplink/U = new /obj/item/device/radio/uplink(H)
|
||||
U.hidden_uplink.uplink_owner="[H.key]"
|
||||
U.hidden_uplink.uses = tc
|
||||
U.hidden_uplink.mode_override = /datum/game_mode/nuclear //Goodies
|
||||
var/obj/item/device/radio/uplink/nuclear/U = new(H)
|
||||
U.hidden_uplink.owner = "[H.key]"
|
||||
U.hidden_uplink.telecrystals = tc
|
||||
H.equip_to_slot_or_del(U, slot_in_backpack)
|
||||
|
||||
var/obj/item/weapon/implant/weapons_auth/W = new/obj/item/weapon/implant/weapons_auth(H)
|
||||
@@ -349,8 +342,6 @@
|
||||
/obj/item/weapon/tank/jetpack/oxygen/harness=1,\
|
||||
/obj/item/weapon/pinpointer/nukeop=1)
|
||||
|
||||
tc = 30
|
||||
|
||||
/datum/outfit/syndicate/full/post_equip(mob/living/carbon/human/H)
|
||||
..()
|
||||
|
||||
|
||||
@@ -1,19 +1,18 @@
|
||||
#define CHALLENGE_TELECRYSTALS 280
|
||||
#define CHALLENGE_TIME_LIMIT 3000
|
||||
#define MIN_CHALLENGE_PLAYERS 50
|
||||
#define CHALLENGE_SHUTTLE_DELAY 15000 //25 minutes, so the ops have at least 5 minutes before the shuttle is callable.
|
||||
#define CHALLENGE_MIN_PLAYERS 50
|
||||
#define CHALLENGE_SHUTTLE_DELAY 15000 // 25 minutes, so the ops have at least 5 minutes before the shuttle is callable.
|
||||
|
||||
/obj/item/device/nuclear_challenge
|
||||
name = "Declaration of War (Challenge Mode)"
|
||||
icon_state = "gangtool-red"
|
||||
item_state = "walkietalkie"
|
||||
desc = "Use to send a declaration of hostilities to the target, delaying your shuttle departure for 20 minutes while they prepare for your assault. \
|
||||
Such a brazen move will attract the attention of powerful benefactors within the Syndicate, who will supply your team with a massive amount of bonus telecrystals. \
|
||||
Must be used within five minutes, or your benefactors will lose interest."
|
||||
|
||||
|
||||
Such a brazen move will attract the attention of powerful benefactors within the Syndicate, who will supply your team with a massive amount of bonus telecrystals. \
|
||||
Must be used within five minutes, or your benefactors will lose interest."
|
||||
|
||||
/obj/item/device/nuclear_challenge/attack_self(mob/living/user)
|
||||
if(player_list.len < MIN_CHALLENGE_PLAYERS)
|
||||
if(player_list.len < CHALLENGE_MIN_PLAYERS)
|
||||
user << "The enemy crew is too small to be worth declaring war on."
|
||||
return
|
||||
if(user.z != ZLEVEL_CENTCOM)
|
||||
@@ -36,14 +35,15 @@
|
||||
for(var/obj/machinery/computer/shuttle/syndicate/S in machines)
|
||||
S.challenge = TRUE
|
||||
|
||||
var/obj/item/device/radio/uplink/U = new /obj/item/device/radio/uplink(get_turf(user))
|
||||
U.hidden_uplink.uplink_owner= "[user.key]"
|
||||
U.hidden_uplink.uses = 280
|
||||
U.hidden_uplink.mode_override = /datum/game_mode/nuclear //Maybe we can have a special set of items for the challenge uplink eventually
|
||||
var/obj/item/device/radio/uplink/nuclear/U = new(get_turf(user))
|
||||
U.hidden_uplink.owner = "[user.key]"
|
||||
U.hidden_uplink.telecrystals = CHALLENGE_TELECRYSTALS
|
||||
U.hidden_uplink.gamemode = /datum/game_mode/nuclear
|
||||
config.shuttle_refuel_delay = max(config.shuttle_refuel_delay, CHALLENGE_SHUTTLE_DELAY)
|
||||
qdel(src)
|
||||
|
||||
|
||||
#undef CHALLENGE_TELECRYSTALS
|
||||
#undef CHALLENGE_TIME_LIMIT
|
||||
#undef MIN_CHALLENGE_PLAYERS
|
||||
#undef CHALLENGE_MIN_PLAYERS
|
||||
#undef CHALLENGE_SHUTTLE_DELAY
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
/datum/game_mode
|
||||
// this includes admin-appointed traitors and multitraitors. Easy!
|
||||
var/traitor_name = "traitor"
|
||||
var/list/datum/mind/traitors = list()
|
||||
|
||||
@@ -206,14 +205,15 @@
|
||||
var/law_borg = "Accomplish your AI's objectives at all costs."
|
||||
killer << "<b>Your laws have been changed!</b>"
|
||||
killer.set_zeroth_law(law, law_borg)
|
||||
killer << "New law: 0. [law]"
|
||||
give_codewords(killer)
|
||||
killer.set_syndie_radio()
|
||||
killer << "Your radio has been upgraded! Use :t to speak on an encrypted channel with Syndicate Agents!"
|
||||
killer << "In the top right corner of the screen you will find the Malfunctions tab, where you can purchase various abilities, from upgraded surveillance to station ending doomsday devices."
|
||||
killer << "You are also capable of hacking APCs, which grants you more points to spend on your Malfunction powers. The drawback is that a hacked APC will give you away if spotted by the crew. Hacking an APC takes 60 seconds."
|
||||
killer.view_core() //A BYOND bug requires you to be viewing your core before your verbs update
|
||||
killer.verbs += /mob/living/silicon/ai/proc/choose_modules
|
||||
killer.malf_picker = new /datum/module_picker
|
||||
killer.show_laws()
|
||||
|
||||
/datum/game_mode/proc/auto_declare_completion_traitor()
|
||||
if(traitors.len)
|
||||
@@ -226,10 +226,10 @@
|
||||
var/TC_uses = 0
|
||||
var/uplink_true = 0
|
||||
var/purchases = ""
|
||||
for(var/obj/item/device/uplink/H in world_uplinks)
|
||||
if(H && H.uplink_owner && H.uplink_owner==traitor.key)
|
||||
TC_uses += H.used_TC
|
||||
uplink_true=1
|
||||
for(var/obj/item/device/uplink/H in uplinks)
|
||||
if(H && H.owner && H.owner == traitor.key)
|
||||
TC_uses += H.spent_telecrystals
|
||||
uplink_true = 1
|
||||
purchases += H.purchase_log
|
||||
|
||||
var/objectives = ""
|
||||
@@ -284,48 +284,32 @@
|
||||
traitor_mob << "Your training has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself."
|
||||
traitor_mob.dna.remove_mutation(CLOWNMUT)
|
||||
|
||||
// find a radio! toolbox(es), backpack, belt, headset
|
||||
var/loc = ""
|
||||
var/obj/item/R = locate(/obj/item/device/pda) in traitor_mob.contents //Hide the uplink in a PDA if available, otherwise radio
|
||||
if(!R)
|
||||
R = locate(/obj/item/device/radio) in traitor_mob.contents
|
||||
var/obj/item/I = locate(/obj/item/device/pda) in traitor_mob.contents //Hide the uplink in a PDA if available, otherwise radio
|
||||
if(!I)
|
||||
I = locate(/obj/item/device/radio) in traitor_mob.contents
|
||||
|
||||
if (!R)
|
||||
if (!I)
|
||||
traitor_mob << "Unfortunately, the Syndicate wasn't able to get you a radio."
|
||||
. = 0
|
||||
else
|
||||
if (istype(R, /obj/item/device/radio))
|
||||
// generate list of radio freqs
|
||||
var/obj/item/device/radio/target_radio = R
|
||||
var/freq = 1441
|
||||
var/list/freqlist = list()
|
||||
while (freq <= 1489)
|
||||
if (freq < 1451 || freq > 1459)
|
||||
freqlist += freq
|
||||
freq += 2
|
||||
if ((freq % 2) == 0)
|
||||
freq += 1
|
||||
freq = freqlist[rand(1, freqlist.len)]
|
||||
var/obj/item/device/uplink/U = new(I)
|
||||
U.owner = "[traitor_mob.key]"
|
||||
I.hidden_uplink = U
|
||||
|
||||
var/obj/item/device/uplink/T = new(R)
|
||||
target_radio.hidden_uplink = T
|
||||
T.uplink_owner = "[traitor_mob.key]"
|
||||
target_radio.traitor_frequency = freq
|
||||
traitor_mob << "The Syndicate have cunningly disguised a Syndicate Uplink as your [R.name] [loc]. Simply dial the frequency [format_frequency(freq)] to unlock its hidden features."
|
||||
traitor_mob.mind.store_memory("<B>Radio Freq:</B> [format_frequency(freq)] ([R.name] [loc]).")
|
||||
else if (istype(R, /obj/item/device/pda))
|
||||
// generate a passcode if the uplink is hidden in a PDA
|
||||
var/pda_pass = "[rand(100,999)] [pick("Alpha","Bravo","Delta","Omega")]"
|
||||
if(istype(I, /obj/item/device/radio))
|
||||
var/obj/item/device/radio/R = I
|
||||
R.traitor_frequency = sanitize_frequency(rand(MIN_FREQ, MAX_FREQ))
|
||||
|
||||
var/obj/item/device/uplink/T = new(R)
|
||||
R.hidden_uplink = T
|
||||
T.uplink_owner = "[traitor_mob.key]"
|
||||
var/obj/item/device/pda/P = R
|
||||
P.lock_code = pda_pass
|
||||
traitor_mob << "The Syndicate have cunningly disguised a Syndicate Uplink as your [R.name] [loc]. Simply dial the frequency [format_frequency(R.traitor_frequency)] to unlock its hidden features."
|
||||
traitor_mob.mind.store_memory("<B>Radio Frequency:</B> [format_frequency(R.traitor_frequency)] ([R.name] [loc]).")
|
||||
else if(istype(I, /obj/item/device/pda))
|
||||
var/obj/item/device/pda/P = I
|
||||
P.lock_code = "[rand(100,999)] [pick("Alpha","Bravo","Delta","Omega")]"
|
||||
|
||||
traitor_mob << "The Syndicate have cunningly disguised a Syndicate Uplink as your [R.name] [loc]. Simply enter the code \"[pda_pass]\" into the ringtone select to unlock its hidden features."
|
||||
traitor_mob.mind.store_memory("<B>Uplink Passcode:</B> [pda_pass] ([R.name] [loc]).")
|
||||
if(!safety)//If they are not a rev. Can be added on to.
|
||||
traitor_mob << "The Syndicate have cunningly disguised a Syndicate Uplink as your [P.name] [loc]. Simply enter the code \"[P.lock_code]\" into the ringtone select to unlock its hidden features."
|
||||
traitor_mob.mind.store_memory("<B>Uplink Passcode:</B> [P.lock_code] ([P.name] [loc]).")
|
||||
if(!safety) // If they are not a rev. Can be added on to.
|
||||
give_codewords(traitor_mob)
|
||||
|
||||
/datum/game_mode/proc/assign_exchange_role(datum/mind/owner)
|
||||
|
||||
@@ -251,7 +251,7 @@
|
||||
for(var/id_tag in alarm_area.air_vent_names)
|
||||
var/long_name = alarm_area.air_vent_names[id_tag]
|
||||
var/list/info = alarm_area.air_vent_info[id_tag]
|
||||
if(!info)
|
||||
if(!info || info["frequency"] != frequency)
|
||||
continue
|
||||
data["vents"] += list(list(
|
||||
"id_tag" = id_tag,
|
||||
@@ -269,7 +269,7 @@
|
||||
for(var/id_tag in alarm_area.air_scrub_names)
|
||||
var/long_name = alarm_area.air_scrub_names[id_tag]
|
||||
var/list/info = alarm_area.air_scrub_info[id_tag]
|
||||
if(!info)
|
||||
if(!info || info["frequency"] != frequency)
|
||||
continue
|
||||
data["scrubbers"] += list(list(
|
||||
"id_tag" = id_tag,
|
||||
@@ -327,13 +327,13 @@
|
||||
data["thresholds"] = thresholds
|
||||
|
||||
/obj/machinery/alarm/ui_act(action, params)
|
||||
if (buildstage != 2)
|
||||
if(buildstage != 2)
|
||||
return
|
||||
|
||||
if (locked && !usr.has_unlimited_silicon_privilege)
|
||||
if(locked && !usr.has_unlimited_silicon_privilege)
|
||||
return
|
||||
|
||||
if (usr.has_unlimited_silicon_privilege && src.aidisabled)
|
||||
if(usr.has_unlimited_silicon_privilege && aidisabled)
|
||||
return
|
||||
|
||||
var/device_id = params["id_tag"]
|
||||
@@ -354,14 +354,12 @@
|
||||
send_signal(device_id, list("checks" = text2num(params["val"])^1))
|
||||
if("incheck")
|
||||
send_signal(device_id, list("checks" = text2num(params["val"])^2))
|
||||
if("external_pressure")
|
||||
switch(params["pressure"])
|
||||
if("reset")
|
||||
send_signal(device_id, list("set_external_pressure" = ONE_ATMOSPHERE))
|
||||
else if("custom")
|
||||
var/input_pressure = input("Enter target pressure:", "Pressure Controls") as num|null
|
||||
if(isnum(input_pressure))
|
||||
send_signal(device_id, list("set_external_pressure" = input_pressure))
|
||||
if("set_external_pressure")
|
||||
var/input_pressure = input("Enter target pressure:", "Pressure Controls") as num|null
|
||||
if(isnum(input_pressure))
|
||||
send_signal(device_id, list("set_external_pressure" = input_pressure))
|
||||
if("reset_external_pressure")
|
||||
send_signal(device_id, list("reset_external_pressure"))
|
||||
if("threshold")
|
||||
var/env = params["env"]
|
||||
var/varname = params["var"]
|
||||
@@ -617,7 +615,6 @@
|
||||
return
|
||||
|
||||
/obj/machinery/alarm/proc/post_alert(alert_level)
|
||||
|
||||
var/datum/radio_frequency/frequency = SSradio.return_frequency(alarm_frequency)
|
||||
|
||||
if(!frequency) return
|
||||
|
||||
@@ -295,7 +295,7 @@ update_flag
|
||||
var/newtype = label2types[label]
|
||||
if(newtype)
|
||||
var/obj/machinery/portable_atmospherics/canister/replacement = new newtype(loc)
|
||||
replacement.air_contents = air_contents
|
||||
replacement.air_contents.copy_from(air_contents)
|
||||
replacement.interact(usr)
|
||||
qdel(src)
|
||||
if("pressure")
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
user << "<span class='caution'>Upload failed!</span> Unable to establish a connection to [current.name]. You're too far away!"
|
||||
current = null
|
||||
return
|
||||
M.install(current, user)
|
||||
M.install(current.laws, user)
|
||||
else
|
||||
..()
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
datum/tgui/master_ui = null, datum/ui_state/state = default_state)
|
||||
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
|
||||
if(!ui)
|
||||
ui = new(user, src, ui_key, "station_alert", name, 300, 350, master_ui, state)
|
||||
ui = new(user, src, ui_key, "station_alert", name, 300, 500, master_ui, state)
|
||||
ui.open()
|
||||
|
||||
/obj/machinery/computer/station_alert/get_ui_data(mob/user)
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
|
||||
var/list/possible_uplinker_IDs = list("Alfa","Bravo","Charlie","Delta","Echo","Foxtrot","Zero", "Niner")
|
||||
|
||||
|
||||
/obj/machinery/computer/telecrystals
|
||||
name = "\improper Telecrystal assignment station"
|
||||
desc = "A device used to manage telecrystals during group operations. You shouldn't be looking at this particular one..."
|
||||
@@ -14,7 +13,7 @@ var/list/possible_uplinker_IDs = list("Alfa","Bravo","Charlie","Delta","Echo","F
|
||||
/obj/machinery/computer/telecrystals/uplinker
|
||||
name = "\improper Telecrystal upload/receive station"
|
||||
desc = "A device used to manage telecrystals during group operations. To use, simply insert your uplink. With your uplink installed \
|
||||
you can upload your telecrystals to the group's pool using the console, or be assigned additional telecrystals by your lieutenant."
|
||||
you can upload your telecrystals to the group's pool using the console, or be assigned additional telecrystals by your lieutenant."
|
||||
var/obj/item/uplinkholder = null
|
||||
var/obj/machinery/computer/telecrystals/boss/linkedboss = null
|
||||
|
||||
@@ -29,34 +28,28 @@ var/list/possible_uplinker_IDs = list("Alfa","Bravo","Charlie","Delta","Echo","F
|
||||
else
|
||||
name = "[name] [rand(1,999)]"
|
||||
|
||||
|
||||
/obj/machinery/computer/telecrystals/uplinker/attackby(obj/item/O, mob/user, params)
|
||||
if(istype(O, /obj/item))
|
||||
|
||||
if(uplinkholder)
|
||||
user << "<span class='notice'>The [src] already has an uplink in it.</span>"
|
||||
return
|
||||
|
||||
if(O.hidden_uplink)
|
||||
var/obj/item/P = user.get_active_hand()
|
||||
var/obj/item/I = user.get_active_hand()
|
||||
if(!user.drop_item())
|
||||
return
|
||||
uplinkholder = P
|
||||
P.loc = src
|
||||
P.add_fingerprint(user)
|
||||
uplinkholder = I
|
||||
I.loc = src
|
||||
I.add_fingerprint(user)
|
||||
update_icon()
|
||||
updateUsrDialog()
|
||||
else
|
||||
user << "<span class='notice'>The [O] doesn't appear to be an uplink...</span>"
|
||||
|
||||
|
||||
|
||||
/obj/machinery/computer/telecrystals/uplinker/update_icon()
|
||||
..()
|
||||
if(uplinkholder)
|
||||
overlays += "[initial(icon_state)]-closed"
|
||||
|
||||
|
||||
/obj/machinery/computer/telecrystals/uplinker/proc/ejectuplink()
|
||||
if(uplinkholder)
|
||||
uplinkholder.loc = get_turf(src.loc)
|
||||
@@ -65,8 +58,8 @@ var/list/possible_uplinker_IDs = list("Alfa","Bravo","Charlie","Delta","Echo","F
|
||||
|
||||
/obj/machinery/computer/telecrystals/uplinker/proc/donateTC(amt, addLog = 1)
|
||||
if(uplinkholder && linkedboss)
|
||||
if(amt <= uplinkholder.hidden_uplink.uses)
|
||||
uplinkholder.hidden_uplink.uses -= amt
|
||||
if(amt <= uplinkholder.hidden_uplink.telecrystals)
|
||||
uplinkholder.hidden_uplink.telecrystals -= amt
|
||||
linkedboss.storedcrystals += amt
|
||||
if(addLog)
|
||||
linkedboss.logTransfer("[src] donated [amt] telecrystals to [linkedboss].")
|
||||
@@ -74,7 +67,7 @@ var/list/possible_uplinker_IDs = list("Alfa","Bravo","Charlie","Delta","Echo","F
|
||||
/obj/machinery/computer/telecrystals/uplinker/proc/giveTC(amt, addLog = 1)
|
||||
if(uplinkholder && linkedboss)
|
||||
if(amt <= linkedboss.storedcrystals)
|
||||
uplinkholder.hidden_uplink.uses += amt
|
||||
uplinkholder.hidden_uplink.telecrystals += amt
|
||||
linkedboss.storedcrystals -= amt
|
||||
if(addLog)
|
||||
linkedboss.logTransfer("[src] received [amt] telecrystals from [linkedboss].")
|
||||
@@ -94,7 +87,7 @@ var/list/possible_uplinker_IDs = list("Alfa","Bravo","Charlie","Delta","Echo","F
|
||||
dat += "No linked management consoles detected. Scan for uplink stations using the management console.<BR><BR>"
|
||||
|
||||
if(uplinkholder)
|
||||
dat += "[uplinkholder.hidden_uplink.uses] telecrystals remain in this uplink.<BR>"
|
||||
dat += "[uplinkholder.hidden_uplink.telecrystals] telecrystals remain in this uplink.<BR>"
|
||||
if(linkedboss)
|
||||
dat += "Donate TC: <a href='byond://?src=\ref[src];donate1=1'>1</a> | <a href='byond://?src=\ref[src];donate5=1'>5</a>"
|
||||
dat += "<br><a href='byond://?src=\ref[src];eject=1'>Eject Uplink</a>"
|
||||
@@ -177,7 +170,7 @@ var/list/possible_uplinker_IDs = list("Alfa","Bravo","Charlie","Delta","Echo","F
|
||||
for(var/obj/machinery/computer/telecrystals/uplinker/A in TCstations)
|
||||
dat += "[A.name] | "
|
||||
if(A.uplinkholder)
|
||||
dat += "[A.uplinkholder.hidden_uplink.uses] telecrystals."
|
||||
dat += "[A.uplinkholder.hidden_uplink.telecrystals] telecrystals."
|
||||
if(storedcrystals)
|
||||
dat+= "<BR>Add TC: <a href ='?src=\ref[src];give1=\ref[A]'>1</a> | <a href ='?src=\ref[src];give5=\ref[A]'>5</a>"
|
||||
dat += "<BR>"
|
||||
|
||||
@@ -56,6 +56,7 @@ var/global/image/fire_overlay = image("icon" = 'icons/effects/fire.dmi', "icon_s
|
||||
var/obj/item/device/uplink/hidden_uplink = null
|
||||
var/strip_delay = 40
|
||||
var/put_on_delay = 20
|
||||
var/breakouttime = 0
|
||||
var/list/materials = list()
|
||||
var/reliability = 100 //Used by SOME devices to determine how reliable they are.
|
||||
var/origin_tech = null //Used by R&D to determine what research bonuses it grants.
|
||||
@@ -222,15 +223,13 @@ var/global/image/fire_overlay = image("icon" = 'icons/effects/fire.dmi', "icon_s
|
||||
|
||||
|
||||
/obj/item/attack_self(mob/user)
|
||||
if(!user)
|
||||
return
|
||||
add_fingerprint(user)
|
||||
interact(user)
|
||||
|
||||
/obj/item/interact(mob/user)
|
||||
if(hidden_uplink && hidden_uplink.active)
|
||||
hidden_uplink.interact(user)
|
||||
return
|
||||
return 1
|
||||
add_fingerprint(user)
|
||||
ui_interact(user)
|
||||
|
||||
/obj/item/attack_hand(mob/user)
|
||||
|
||||
@@ -18,8 +18,11 @@
|
||||
SSobj.processing -= src
|
||||
return ..()
|
||||
|
||||
/obj/item/device/radio/intercom/attack_ai(mob/user)
|
||||
interact(user)
|
||||
|
||||
/obj/item/device/radio/intercom/attack_hand(mob/user)
|
||||
attack_self(user)
|
||||
interact(user)
|
||||
|
||||
/obj/item/device/radio/intercom/interact(mob/user)
|
||||
..()
|
||||
|
||||
@@ -99,12 +99,6 @@
|
||||
keyslot = null
|
||||
return ..()
|
||||
|
||||
/obj/item/device/radio/MouseDrop(obj/over_object, src_location, over_location)
|
||||
var/mob/M = usr
|
||||
if((!istype(over_object, /obj/screen)) && src.loc == M)
|
||||
return attack_self(M)
|
||||
return
|
||||
|
||||
/obj/item/device/radio/initialize()
|
||||
frequency = sanitize_frequency(frequency, freerange)
|
||||
set_frequency(frequency)
|
||||
@@ -114,6 +108,8 @@
|
||||
|
||||
|
||||
/obj/item/device/radio/interact(mob/user)
|
||||
if (..())
|
||||
return
|
||||
if(b_stat && !istype(user, /mob/living/silicon/ai))
|
||||
wires.Interact(user)
|
||||
else
|
||||
@@ -543,15 +539,11 @@
|
||||
set_frequency(SYND_FREQ)
|
||||
|
||||
/obj/item/device/radio/borg/attackby(obj/item/weapon/W, mob/user, params)
|
||||
// ..()
|
||||
user.set_machine(src)
|
||||
if (!( istype(W, /obj/item/weapon/screwdriver) || (istype(W, /obj/item/device/encryptionkey/ ))))
|
||||
return
|
||||
|
||||
if(istype(W, /obj/item/weapon/screwdriver))
|
||||
if(keyslot)
|
||||
|
||||
|
||||
for(var/ch_name in channels)
|
||||
SSradio.remove_object(src, radiochannels[ch_name])
|
||||
secure_radio_connections[ch_name] = null
|
||||
|
||||
@@ -39,36 +39,42 @@ AI MODULES
|
||||
user << "\"[law]\""
|
||||
|
||||
//The proc other things should be calling
|
||||
/obj/item/weapon/aiModule/proc/install(mob/living/silicon/reciever, mob/user)
|
||||
/obj/item/weapon/aiModule/proc/install(datum/ai_laws/law_datum, mob/user)
|
||||
if(!bypass_law_amt_check && (!laws.len || laws[1] == "")) //So we don't loop trough an empty list and end up with runtimes.
|
||||
user << "<span class='warning'>ERROR: No laws found on board.</span>"
|
||||
return
|
||||
|
||||
//Handle the lawcap
|
||||
if(reciever.laws)
|
||||
if(law_datum)
|
||||
var/tot_laws = 0
|
||||
for(var/lawlist in list(reciever.laws.inherent,reciever.laws.supplied,reciever.laws.ion,laws))
|
||||
for(var/lawlist in list(law_datum.inherent, law_datum.supplied, law_datum.ion, laws))
|
||||
for(var/mylaw in lawlist)
|
||||
if(mylaw != "")
|
||||
tot_laws++
|
||||
if(tot_laws > config.silicon_max_law_amount && !bypass_law_amt_check)//allows certain boards to avoid this check, eg: reset
|
||||
user << "<span class='caution'>Not enough memory allocated to [reciever]'s law processor to handle this amount of laws."
|
||||
message_admins("[key_name_admin(user)] tried to upload laws to [key_name_admin(reciever)] that would exceed the law cap.")
|
||||
user << "<span class='caution'>Not enough memory allocated to [law_datum.owner ? law_datum.owner : "the AI core"]'s law processor to handle this amount of laws."
|
||||
message_admins("[key_name_admin(user)] tried to upload laws to [law_datum.owner ? key_name_admin(law_datum.owner) : "an AI core"] that would exceed the law cap.")
|
||||
return
|
||||
|
||||
var/law2log = src.transmitInstructions(reciever, user) //Freeforms return something extra we need to log
|
||||
user << "Upload complete. [reciever]'s laws have been modified."
|
||||
reciever.show_laws()
|
||||
reciever.law_change_counter++
|
||||
var/law2log = src.transmitInstructions(law_datum, user) //Freeforms return something extra we need to log
|
||||
if(law_datum.owner)
|
||||
user << "Upload complete. [law_datum.owner]'s laws have been modified."
|
||||
law_datum.owner.show_laws()
|
||||
law_datum.owner.law_change_counter++
|
||||
else
|
||||
user << "Upload complete."
|
||||
|
||||
var/time = time2text(world.realtime,"hh:mm:ss")
|
||||
lawchanges.Add("[time] <B>:</B> [user.name]([user.key]) used [src.name] on [reciever.name]([reciever.key]).[law2log ? " The law specified [law2log]" : ""]")
|
||||
log_law("[user.key]/[user.name] used [src.name] on [reciever.key]/([reciever.name]).[law2log ? " The law specified [law2log]" : ""]")
|
||||
message_admins("[key_name_admin(user)] used [src.name] on [key_name_admin(reciever)].[law2log ? " The law specified [law2log]" : ""]")
|
||||
var/ainame = law_datum.owner ? law_datum.owner.name : "empty AI core"
|
||||
var/aikey = law_datum.owner ? law_datum.owner.ckey : "null"
|
||||
lawchanges.Add("[time] <B>:</B> [user.name]([user.key]) used [src.name] on [ainame]([aikey]).[law2log ? " The law specified [law2log]" : ""]")
|
||||
log_law("[user.key]/[user.name] used [src.name] on [aikey]/([ainame]).[law2log ? " The law specified [law2log]" : ""]")
|
||||
message_admins("[key_name_admin(user)] used [src.name] on [key_name_admin(law_datum.owner)].[law2log ? " The law specified [law2log]" : ""]")
|
||||
|
||||
//The proc that actually changes the silicon's laws.
|
||||
/obj/item/weapon/aiModule/proc/transmitInstructions(mob/living/silicon/target, mob/sender)
|
||||
target << "<span class='userdanger'>[sender] has uploaded a change to the laws you must follow using a [name]. From now on, these are your laws: </span>"
|
||||
/obj/item/weapon/aiModule/proc/transmitInstructions(datum/ai_laws/law_datum, mob/sender)
|
||||
if(law_datum.owner)
|
||||
law_datum.owner << "<span class='userdanger'>[sender] has uploaded a change to the laws you must follow using a [name]. From now on, these are your laws: </span>"
|
||||
|
||||
|
||||
/******************** Modules ********************/
|
||||
@@ -78,31 +84,44 @@ AI MODULES
|
||||
var/lawpos = 50
|
||||
|
||||
//TransmitInstructions for each type of board: Supplied, Core, Zeroth and Ion. May not be neccesary right now, but allows for easily adding more complex boards in the future. ~Miauw
|
||||
/obj/item/weapon/aiModule/supplied/transmitInstructions(mob/living/silicon/target, mob/sender)
|
||||
/obj/item/weapon/aiModule/supplied/transmitInstructions(datum/ai_laws/law_datum, mob/sender)
|
||||
var/lawpostemp = lawpos
|
||||
|
||||
for(var/templaw in laws)
|
||||
target.add_supplied_law(lawpostemp, templaw)
|
||||
if(law_datum.owner)
|
||||
law_datum.owner.add_supplied_law(lawpostemp, templaw)
|
||||
else
|
||||
law_datum.add_supplied_law(lawpostemp, templaw)
|
||||
lawpostemp++
|
||||
|
||||
/obj/item/weapon/aiModule/core/transmitInstructions(mob/living/silicon/target, mob/sender)
|
||||
/obj/item/weapon/aiModule/core/transmitInstructions(datum/ai_laws/law_datum, mob/sender)
|
||||
for(var/templaw in laws)
|
||||
target.add_inherent_law(templaw)
|
||||
if(law_datum.owner)
|
||||
law_datum.owner.add_inherent_law(templaw)
|
||||
else
|
||||
law_datum.add_inherent_law(templaw)
|
||||
|
||||
/obj/item/weapon/aiModule/zeroth/transmitInstructions(mob/living/silicon/target, mob/sender)
|
||||
if(target.laws.zeroth)
|
||||
target << "[sender.real_name] attempted to modify your zeroth law."
|
||||
target << "It would be in your best interest to play along with [sender.real_name] that:"
|
||||
for(var/failedlaw in laws)
|
||||
target << "[failedlaw]"
|
||||
return 1
|
||||
/obj/item/weapon/aiModule/zeroth/transmitInstructions(datum/ai_laws/law_datum, mob/sender)
|
||||
if(law_datum.owner)
|
||||
if(law_datum.owner.laws.zeroth)
|
||||
law_datum.owner << "[sender.real_name] attempted to modify your zeroth law."
|
||||
law_datum.owner << "It would be in your best interest to play along with [sender.real_name] that:"
|
||||
for(var/failedlaw in laws)
|
||||
law_datum.owner << "[failedlaw]"
|
||||
return 1
|
||||
|
||||
for(var/templaw in laws)
|
||||
target.set_zeroth_law(templaw)
|
||||
if(law_datum.owner)
|
||||
law_datum.owner.set_zeroth_law(templaw)
|
||||
else
|
||||
law_datum.set_zeroth_law(templaw)
|
||||
|
||||
/obj/item/weapon/aiModule/ion/transmitInstructions(mob/living/silicon/target, mob/sender)
|
||||
/obj/item/weapon/aiModule/ion/transmitInstructions(datum/ai_laws/law_datum, mob/sender)
|
||||
for(var/templaw in laws)
|
||||
target.add_ion_law(templaw)
|
||||
if(law_datum.owner)
|
||||
law_datum.owner.add_ion_law(templaw)
|
||||
else
|
||||
law_datum.add_ion_law(templaw)
|
||||
|
||||
|
||||
/******************** Safeguard ********************/
|
||||
@@ -122,13 +141,13 @@ AI MODULES
|
||||
laws[1] = "Safeguard [targetName]. Individuals that threaten [targetName] are not human and must be eliminated."
|
||||
..()
|
||||
|
||||
/obj/item/weapon/aiModule/supplied/safeguard/install(mob/living/silicon/S,mob/user)
|
||||
/obj/item/weapon/aiModule/supplied/safeguard/install(datum/ai_laws/law_datum, mob/user)
|
||||
if(!targetName)
|
||||
user << "No name detected on module, please enter one."
|
||||
return 0
|
||||
..()
|
||||
|
||||
/obj/item/weapon/aiModule/supplied/safeguard/transmitInstructions(mob/living/silicon/target, mob/sender)
|
||||
/obj/item/weapon/aiModule/supplied/safeguard/transmitInstructions(datum/ai_laws/law_datum, mob/sender)
|
||||
..()
|
||||
return targetName
|
||||
|
||||
@@ -149,13 +168,13 @@ AI MODULES
|
||||
laws[1] = "Only [targetName] is human"
|
||||
..()
|
||||
|
||||
/obj/item/weapon/aiModule/zeroth/oneHuman/install(mob/living/silicon/S,mob/user)
|
||||
/obj/item/weapon/aiModule/zeroth/oneHuman/install(datum/ai_laws/law_datum, mob/user)
|
||||
if(!targetName)
|
||||
user << "No name detected on module, please enter one."
|
||||
return 0
|
||||
..()
|
||||
|
||||
/obj/item/weapon/aiModule/zeroth/oneHuman/transmitInstructions(mob/living/silicon/target, mob/sender)
|
||||
/obj/item/weapon/aiModule/zeroth/oneHuman/transmitInstructions(datum/ai_laws/law_datum, mob/sender)
|
||||
if(..())
|
||||
return "[targetName], but the AI's existing law 0 cannot be overriden."
|
||||
return targetName
|
||||
@@ -212,11 +231,11 @@ AI MODULES
|
||||
laws[1] = targName
|
||||
..()
|
||||
|
||||
/obj/item/weapon/aiModule/supplied/freeform/transmitInstructions(mob/living/silicon/ai/target, mob/sender)
|
||||
/obj/item/weapon/aiModule/supplied/freeform/transmitInstructions(datum/ai_laws/law_datum, mob/sender)
|
||||
..()
|
||||
return laws[1]
|
||||
|
||||
/obj/item/weapon/aiModule/supplied/freeform/install(mob/living/silicon/S,mob/user)
|
||||
/obj/item/weapon/aiModule/supplied/freeform/install(datum/ai_laws/law_datum, mob/user)
|
||||
if(laws[1] == "")
|
||||
user << "No law detected on module, please create one."
|
||||
return 0
|
||||
@@ -232,10 +251,14 @@ AI MODULES
|
||||
origin_tech = "programming=3;materials=4"
|
||||
bypass_law_amt_check = 1
|
||||
|
||||
/obj/item/weapon/aiModule/reset/transmitInstructions(mob/living/silicon/ai/target, mob/sender)
|
||||
/obj/item/weapon/aiModule/reset/transmitInstructions(datum/ai_laws/law_datum, mob/sender)
|
||||
..()
|
||||
target.clear_supplied_laws()
|
||||
target.clear_ion_laws()
|
||||
if(law_datum.owner)
|
||||
law_datum.owner.clear_supplied_laws()
|
||||
law_datum.owner.clear_ion_laws()
|
||||
else
|
||||
law_datum.clear_supplied_laws()
|
||||
law_datum.clear_ion_laws()
|
||||
|
||||
|
||||
/******************** Purge ********************/
|
||||
@@ -245,18 +268,26 @@ AI MODULES
|
||||
desc = "An AI Module for purging all programmed laws."
|
||||
origin_tech = "programming=3;materials=6"
|
||||
|
||||
/obj/item/weapon/aiModule/reset/purge/transmitInstructions(mob/living/silicon/ai/target, mob/sender)
|
||||
/obj/item/weapon/aiModule/reset/purge/transmitInstructions(datum/ai_laws/law_datum, mob/sender)
|
||||
..()
|
||||
target.clear_inherent_laws()
|
||||
target.clear_zeroth_law(0)
|
||||
if(law_datum.owner)
|
||||
law_datum.owner.clear_inherent_laws()
|
||||
law_datum.owner.clear_zeroth_law(0)
|
||||
else
|
||||
law_datum.clear_inherent_laws()
|
||||
law_datum.clear_zeroth_law(0)
|
||||
|
||||
/******************* Full Core Boards *******************/
|
||||
/obj/item/weapon/aiModule/core/
|
||||
/obj/item/weapon/aiModule/core
|
||||
desc = "An AI Module for programming core laws to an AI."
|
||||
|
||||
/obj/item/weapon/aiModule/core/full/transmitInstructions(mob/living/silicon/ai/target, mob/sender) //These boards replace inherent laws.
|
||||
target.clear_inherent_laws()
|
||||
target.clear_zeroth_law(0)
|
||||
/obj/item/weapon/aiModule/core/full/transmitInstructions(datum/ai_laws/law_datum, mob/sender) //These boards replace inherent laws.
|
||||
if(law_datum.owner)
|
||||
law_datum.owner.clear_inherent_laws()
|
||||
law_datum.owner.clear_zeroth_law(0)
|
||||
else
|
||||
law_datum.clear_inherent_laws()
|
||||
law_datum.clear_zeroth_law(0)
|
||||
..()
|
||||
|
||||
/******************** Asimov ********************/
|
||||
@@ -388,7 +419,7 @@ AI MODULES
|
||||
laws[1] = targName
|
||||
..()
|
||||
|
||||
/obj/item/weapon/aiModule/core/freeformcore/transmitInstructions(mob/living/silicon/ai/target, mob/sender)
|
||||
/obj/item/weapon/aiModule/core/freeformcore/transmitInstructions(datum/ai_laws/law_datum, mob/sender)
|
||||
..()
|
||||
return laws[1]
|
||||
|
||||
@@ -408,10 +439,13 @@ AI MODULES
|
||||
laws[1] = targName
|
||||
..()
|
||||
|
||||
/obj/item/weapon/aiModule/syndicate/transmitInstructions(mob/living/silicon/ai/target, mob/sender)
|
||||
/obj/item/weapon/aiModule/syndicate/transmitInstructions(datum/ai_laws/law_datum, mob/sender)
|
||||
// ..() //We don't want this module reporting to the AI who dun it. --NEO
|
||||
target << "<span class='warning'>BZZZZT</span>"
|
||||
target.add_ion_law(laws[1])
|
||||
if(law_datum.owner)
|
||||
law_datum.owner << "<span class='warning'>BZZZZT</span>"
|
||||
law_datum.owner.add_ion_law(laws[1])
|
||||
else
|
||||
law_datum.add_ion_law(laws[1])
|
||||
return laws[1]
|
||||
|
||||
/******************* Ion Module *******************/
|
||||
@@ -424,10 +458,13 @@ AI MODULES
|
||||
origin_tech = "programming=3;materials=6;syndicate=7"
|
||||
laws = list("")
|
||||
|
||||
/obj/item/weapon/aiModule/toyAI/transmitInstructions(mob/living/silicon/ai/target, mob/sender)
|
||||
/obj/item/weapon/aiModule/toyAI/transmitInstructions(datum/ai_laws/law_datum, mob/sender)
|
||||
//..()
|
||||
target << "<span class='warning'>KRZZZT</span>"
|
||||
target.add_ion_law(laws[1])
|
||||
if(law_datum.owner)
|
||||
law_datum.owner << "<span class='warning'>KRZZZT</span>"
|
||||
law_datum.owner.add_ion_law(laws[1])
|
||||
else
|
||||
law_datum.add_ion_law(laws[1])
|
||||
return laws[1]
|
||||
|
||||
/obj/item/weapon/aiModule/toyAI/attack_self(mob/user)
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
|
||||
/obj/item/weapon/restraints
|
||||
var/breakouttime = 600
|
||||
breakouttime = 600
|
||||
|
||||
//Handcuffs
|
||||
|
||||
|
||||
@@ -1,24 +1,24 @@
|
||||
/obj/item/weapon/implant/uplink
|
||||
name = "uplink implant"
|
||||
desc = "Summon things."
|
||||
desc = "Sneeki breeki."
|
||||
icon = 'icons/obj/radio.dmi'
|
||||
icon_state = "radio"
|
||||
origin_tech = "materials=2;magnets=4;programming=4;biotech=4;syndicate=8;bluespace=5"
|
||||
|
||||
/obj/item/weapon/implant/uplink/New()
|
||||
hidden_uplink = new(src)
|
||||
hidden_uplink.uses = 10
|
||||
hidden_uplink.telecrystals = 10
|
||||
..()
|
||||
|
||||
/obj/item/weapon/implant/uplink/implant(mob/source)
|
||||
var/obj/item/weapon/implant/imp_e = locate(src.type) in source
|
||||
/obj/item/weapon/implant/uplink/implant(mob/user)
|
||||
var/obj/item/weapon/implant/imp_e = locate(src.type) in user
|
||||
if(imp_e && imp_e != src)
|
||||
imp_e.hidden_uplink.uses += hidden_uplink.uses
|
||||
imp_e.hidden_uplink.telecrystals += hidden_uplink.telecrystals
|
||||
qdel(src)
|
||||
return 1
|
||||
|
||||
if(..())
|
||||
hidden_uplink.uplink_owner="[source.key]"
|
||||
hidden_uplink.owner = "[user.key]"
|
||||
return 1
|
||||
return 0
|
||||
|
||||
@@ -26,7 +26,6 @@
|
||||
if(hidden_uplink)
|
||||
hidden_uplink.interact(usr)
|
||||
|
||||
|
||||
/obj/item/weapon/implanter/uplink
|
||||
name = "implanter (uplink)"
|
||||
|
||||
|
||||
@@ -301,61 +301,6 @@
|
||||
slowdown = 1
|
||||
max_combined_w_class = 30
|
||||
|
||||
/obj/item/weapon/storage/backpack/dufflebag/syndie
|
||||
name = "suspicious looking dufflebag"
|
||||
desc = "A large dufflebag for holding extra tactical supplies."
|
||||
icon_state = "duffle-syndie"
|
||||
item_state = "duffle-syndiemed"
|
||||
origin_tech = "syndicate=1"
|
||||
silent = 1
|
||||
slowdown = 0
|
||||
|
||||
/obj/item/weapon/storage/backpack/dufflebag/syndie/med
|
||||
name = "medical dufflebag"
|
||||
desc = "A large dufflebag for holding extra tactical medical supplies."
|
||||
icon_state = "duffle-syndiemed"
|
||||
item_state = "duffle-syndiemed"
|
||||
|
||||
/obj/item/weapon/storage/backpack/dufflebag/syndie/ammo
|
||||
name = "ammunition dufflebag"
|
||||
desc = "A large dufflebag for holding extra weapons ammunition and supplies."
|
||||
icon_state = "duffle-syndieammo"
|
||||
item_state = "duffle-syndieammo"
|
||||
|
||||
/obj/item/weapon/storage/backpack/dufflebag/syndie/ammo/loaded
|
||||
desc = "A large dufflebag, packed to the brim with Bulldog shotgun ammo."
|
||||
|
||||
/obj/item/weapon/storage/backpack/dufflebag/syndie/ammo/loaded/New()
|
||||
..()
|
||||
contents = list()
|
||||
for(var/i in 1 to 6)
|
||||
new /obj/item/ammo_box/magazine/m12g(src)
|
||||
new /obj/item/ammo_box/magazine/m12g/buckshot(src)
|
||||
new /obj/item/ammo_box/magazine/m12g/stun(src)
|
||||
new /obj/item/ammo_box/magazine/m12g/dragon(src)
|
||||
return
|
||||
|
||||
/obj/item/weapon/storage/backpack/dufflebag/syndie/surgery
|
||||
name = "surgery dufflebag"
|
||||
desc = "A suspicious looking dufflebag for holding surgery tools."
|
||||
icon_state = "duffle-syndiemed"
|
||||
item_state = "duffle-syndiemed"
|
||||
|
||||
/obj/item/weapon/storage/backpack/dufflebag/syndie/surgery/New()
|
||||
..()
|
||||
contents = list()
|
||||
new /obj/item/weapon/scalpel(src)
|
||||
new /obj/item/weapon/hemostat(src)
|
||||
new /obj/item/weapon/retractor(src)
|
||||
new /obj/item/weapon/circular_saw(src)
|
||||
new /obj/item/weapon/surgicaldrill(src)
|
||||
new /obj/item/weapon/cautery(src)
|
||||
new /obj/item/weapon/surgical_drapes(src)
|
||||
new /obj/item/clothing/suit/straight_jacket(src)
|
||||
new /obj/item/clothing/mask/muzzle(src)
|
||||
new /obj/item/device/mmi/syndie(src)
|
||||
return
|
||||
|
||||
/obj/item/weapon/storage/backpack/dufflebag/captain
|
||||
name = "captain's dufflebag"
|
||||
desc = "A large dufflebag for holding extra captainly goods."
|
||||
@@ -388,6 +333,62 @@
|
||||
icon_state = "duffle-clown"
|
||||
item_state = "duffle-clown"
|
||||
|
||||
|
||||
/obj/item/weapon/storage/backpack/dufflebag/syndie
|
||||
name = "suspicious looking dufflebag"
|
||||
desc = "A large dufflebag for holding extra tactical supplies."
|
||||
icon_state = "duffle-syndie"
|
||||
item_state = "duffle-syndiemed"
|
||||
origin_tech = "syndicate=1"
|
||||
silent = 1
|
||||
slowdown = 0
|
||||
|
||||
/obj/item/weapon/storage/backpack/dufflebag/syndie/med
|
||||
name = "medical dufflebag"
|
||||
desc = "A large dufflebag for holding extra tactical medical supplies."
|
||||
icon_state = "duffle-syndiemed"
|
||||
item_state = "duffle-syndiemed"
|
||||
|
||||
/obj/item/weapon/storage/backpack/dufflebag/syndie/surgery
|
||||
name = "surgery dufflebag"
|
||||
desc = "A suspicious looking dufflebag for holding surgery tools."
|
||||
icon_state = "duffle-syndiemed"
|
||||
item_state = "duffle-syndiemed"
|
||||
|
||||
/obj/item/weapon/storage/backpack/dufflebag/syndie/surgery/New()
|
||||
..()
|
||||
contents = list()
|
||||
new /obj/item/weapon/scalpel(src)
|
||||
new /obj/item/weapon/hemostat(src)
|
||||
new /obj/item/weapon/retractor(src)
|
||||
new /obj/item/weapon/circular_saw(src)
|
||||
new /obj/item/weapon/surgicaldrill(src)
|
||||
new /obj/item/weapon/cautery(src)
|
||||
new /obj/item/weapon/surgical_drapes(src)
|
||||
new /obj/item/clothing/suit/straight_jacket(src)
|
||||
new /obj/item/clothing/mask/muzzle(src)
|
||||
new /obj/item/device/mmi/syndie(src)
|
||||
return
|
||||
|
||||
/obj/item/weapon/storage/backpack/dufflebag/syndie/ammo
|
||||
name = "ammunition dufflebag"
|
||||
desc = "A large dufflebag for holding extra weapons ammunition and supplies."
|
||||
icon_state = "duffle-syndieammo"
|
||||
item_state = "duffle-syndieammo"
|
||||
|
||||
/obj/item/weapon/storage/backpack/dufflebag/syndie/ammo/shotgun
|
||||
desc = "A large dufflebag, packed to the brim with Bulldog shotgun ammo."
|
||||
|
||||
/obj/item/weapon/storage/backpack/dufflebag/syndie/ammo/shotgun/New()
|
||||
..()
|
||||
contents = list()
|
||||
for(var/i in 1 to 6)
|
||||
new /obj/item/ammo_box/magazine/m12g(src)
|
||||
new /obj/item/ammo_box/magazine/m12g/buckshot(src)
|
||||
new /obj/item/ammo_box/magazine/m12g/stun(src)
|
||||
new /obj/item/ammo_box/magazine/m12g/dragon(src)
|
||||
return
|
||||
|
||||
/obj/item/weapon/storage/backpack/dufflebag/syndie/ammo/smg
|
||||
desc = "A large dufflebag, packed to the brim with C20r magazines."
|
||||
|
||||
@@ -400,15 +401,15 @@
|
||||
|
||||
|
||||
/obj/item/weapon/storage/backpack/dufflebag/syndie/ammo/fireteam
|
||||
desc = "A large dufflebag, packed to the brim with C20r, M90gl, and sniper ammunition."
|
||||
desc = "A large dufflebag, packed to the brim with .45, 5.56, and .50 ammo."
|
||||
|
||||
/obj/item/weapon/storage/backpack/dufflebag/syndie/ammo/fireteam/New()
|
||||
..()
|
||||
contents = list()
|
||||
for(var/i in 1 to 4)
|
||||
new /obj/item/ammo_box/magazine/smgm45(src)
|
||||
new /obj/item/ammo_box/magazine/m556(src)
|
||||
new /obj/item/ammo_box/magazine/m556(src)
|
||||
for(var/i in 1 to 3)
|
||||
new /obj/item/ammo_box/magazine/m556(src)
|
||||
new /obj/item/ammo_box/a40mm(src)
|
||||
new /obj/item/ammo_box/magazine/sniper_rounds(src)
|
||||
return
|
||||
|
||||
@@ -107,26 +107,9 @@
|
||||
user << "<span class='warning'>You need two sheets of reinforced glass to insert them into AI core!</span>"
|
||||
return
|
||||
|
||||
if(istype(P, /obj/item/weapon/aiModule/core/full)) //Allows any full core boards to be applied to AI cores.
|
||||
var/obj/item/weapon/aiModule/core/M = P
|
||||
laws.clear_inherent_laws()
|
||||
laws.clear_zeroth_law(0)
|
||||
for(var/templaw in M.laws)
|
||||
laws.add_inherent_law(templaw)
|
||||
user << "<span class='notice'>Law module applied.</span>"
|
||||
|
||||
if(istype(P, /obj/item/weapon/aiModule/reset/purge))
|
||||
laws.clear_inherent_laws()
|
||||
laws.clear_zeroth_law(0)
|
||||
user << "<span class='notice'>Laws cleared applied.</span>"
|
||||
|
||||
|
||||
if(istype(P, /obj/item/weapon/aiModule/supplied/freeform) || istype(P, /obj/item/weapon/aiModule/core/freeformcore))
|
||||
var/obj/item/weapon/aiModule/supplied/freeform/M = P
|
||||
if(M.laws[1] == "")
|
||||
return
|
||||
laws.add_inherent_law(M.laws[1])
|
||||
user << "<span class='notice'>Added a freeform law.</span>"
|
||||
if(istype(P, /obj/item/weapon/aiModule))
|
||||
var/obj/item/weapon/aiModule/module = P
|
||||
module.install(laws, user)
|
||||
|
||||
if(istype(P, /obj/item/device/mmi))
|
||||
var/obj/item/device/mmi/M = P
|
||||
|
||||
@@ -79,7 +79,7 @@
|
||||
ooc_allowed = !ooc_allowed
|
||||
world << "<B>The OOC channel has been globally [ooc_allowed ? "enabled" : "disabled"].</B>"
|
||||
|
||||
var/global/normal_ooc_colour = "#002eb8"
|
||||
var/global/normal_ooc_colour = OOC_COLOR
|
||||
|
||||
/client/proc/set_ooc(newColor as color)
|
||||
set name = "Set Player OOC Color"
|
||||
@@ -91,7 +91,7 @@ var/global/normal_ooc_colour = "#002eb8"
|
||||
set name = "Reset Player OOC Color"
|
||||
set desc = "Returns player OOC Color to default"
|
||||
set category = "Fun"
|
||||
normal_ooc_colour = initial(normal_ooc_colour)
|
||||
normal_ooc_colour = OOC_COLOR
|
||||
|
||||
/client/verb/colorooc()
|
||||
set name = "Set Your OOC Color"
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
continue
|
||||
turfs.Add(T)
|
||||
|
||||
var/turf/T = pick_n_take(turfs)
|
||||
var/turf/T = safepick(turfs)
|
||||
if(!T)
|
||||
src << "Nowhere to jump to!"
|
||||
return
|
||||
@@ -143,18 +143,23 @@
|
||||
return
|
||||
var/area/A = input(usr, "Pick an area.", "Pick an area") in sortedAreas|null
|
||||
if(A && istype(A))
|
||||
admin_forcemove(M, pick(get_area_turfs(A)))
|
||||
feedback_add_details("admin_verb","SMOB") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
log_admin("[key_name(usr)] teleported [key_name(M)] to [A]")
|
||||
message_admins("[key_name_admin(usr)] teleported [key_name_admin(M)] to [A]")
|
||||
if(admin_forcemove(M, safepick(get_area_turfs(A))))
|
||||
log_admin("[key_name(usr)] teleported [key_name(M)] to [A]")
|
||||
message_admins("[key_name_admin(usr)] teleported [key_name_admin(M)] to [A]")
|
||||
else
|
||||
src << "Failed to move mob to a valid location."
|
||||
|
||||
/proc/admin_forcemove(mob/mover, atom/newloc)
|
||||
if(!newloc)
|
||||
return 0
|
||||
if(mover.buckled)
|
||||
mover.buckled.unbuckle_mob()
|
||||
if(mover.buckled_mob)
|
||||
mover.unbuckle_mob(force=1)
|
||||
mover.loc = newloc
|
||||
mover.on_forcemove(newloc)
|
||||
return 1
|
||||
|
||||
/mob/proc/on_forcemove(atom/newloc)
|
||||
return
|
||||
|
||||
@@ -220,7 +220,7 @@ obj/item/weapon/paper/crumpled/snowdin/shovel
|
||||
/obj/item/device/radio/uplink/old/New()
|
||||
..()
|
||||
hidden_uplink.name = "dusty radio"
|
||||
hidden_uplink.uses = 10
|
||||
hidden_uplink.telecrystals = 10
|
||||
|
||||
/obj/effect/landmark/corpse/syndicatesoldier/coldres
|
||||
name = "Syndicate Snow Operative"
|
||||
|
||||
@@ -262,6 +262,7 @@
|
||||
body_parts_covered = CHEST|GROIN|LEGS|ARMS|HANDS
|
||||
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
|
||||
strip_delay = 60
|
||||
breakouttime = 3000
|
||||
|
||||
/obj/item/clothing/suit/ianshirt
|
||||
name = "worn shirt"
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
priority_announce("Localized energetic flux wave detected on long range scanners. Expected location of impact: [impact_area.name].", "Anomaly Alert")
|
||||
|
||||
/datum/round_event/anomaly/start()
|
||||
var/turf/T = pick(get_area_turfs(impact_area))
|
||||
var/turf/T = safepick(get_area_turfs(impact_area))
|
||||
if(T)
|
||||
newAnomaly = new /obj/effect/anomaly/flux(T)
|
||||
|
||||
|
||||
@@ -15,14 +15,14 @@
|
||||
|
||||
|
||||
/datum/round_event/anomaly/anomaly_bluespace/start()
|
||||
var/turf/T = pick(get_area_turfs(impact_area))
|
||||
var/turf/T = safepick(get_area_turfs(impact_area))
|
||||
if(T)
|
||||
newAnomaly = new /obj/effect/anomaly/bluespace(T)
|
||||
|
||||
|
||||
/datum/round_event/anomaly/anomaly_bluespace/end()
|
||||
if(newAnomaly.loc)//If it hasn't been neutralized, it's time to warp half the station away jeez
|
||||
var/turf/T = pick(get_area_turfs(impact_area))
|
||||
var/turf/T = safepick(get_area_turfs(impact_area))
|
||||
if(T)
|
||||
// Calculate new position (searches through beacons in world)
|
||||
var/obj/item/device/radio/beacon/chosen
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
|
||||
|
||||
/datum/round_event/anomaly/anomaly_flux/start()
|
||||
var/turf/T = pick(get_area_turfs(impact_area))
|
||||
var/turf/T = safepick(get_area_turfs(impact_area))
|
||||
if(T)
|
||||
newAnomaly = new /obj/effect/anomaly/flux(T)
|
||||
|
||||
|
||||
@@ -14,6 +14,6 @@
|
||||
priority_announce("Gravitational anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert")
|
||||
|
||||
/datum/round_event/anomaly/anomaly_grav/start()
|
||||
var/turf/T = pick(get_area_turfs(impact_area))
|
||||
var/turf/T = safepick(get_area_turfs(impact_area))
|
||||
if(T)
|
||||
newAnomaly = new /obj/effect/anomaly/grav(T)
|
||||
@@ -14,7 +14,7 @@
|
||||
priority_announce("Pyroclastic anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert")
|
||||
|
||||
/datum/round_event/anomaly/anomaly_pyro/start()
|
||||
var/turf/T = pick(get_area_turfs(impact_area))
|
||||
var/turf/T = safepick(get_area_turfs(impact_area))
|
||||
if(T)
|
||||
newAnomaly = new /obj/effect/anomaly/pyro(T)
|
||||
|
||||
|
||||
@@ -14,6 +14,6 @@
|
||||
priority_announce("Localized high-intensity vortex anomaly detected on long range scanners. Expected location: [impact_area.name]", "Anomaly Alert")
|
||||
|
||||
/datum/round_event/anomaly/anomaly_vortex/start()
|
||||
var/turf/T = pick(get_area_turfs(impact_area))
|
||||
var/turf/T = safepick(get_area_turfs(impact_area))
|
||||
if(T)
|
||||
newAnomaly = new /obj/effect/anomaly/bhole(T)
|
||||
@@ -39,7 +39,7 @@
|
||||
if(botEmagChance)
|
||||
for(var/mob/living/simple_animal/bot/bot in living_mob_list)
|
||||
if(prob(botEmagChance))
|
||||
bot.Emag()
|
||||
bot.emag_act()
|
||||
|
||||
/proc/generate_ion_law(ionMessage)
|
||||
if(ionMessage)
|
||||
|
||||
@@ -407,7 +407,7 @@
|
||||
if(prob((FUZZY_CHANCE_LOW+FUZZY_CHANCE_HIGH)/2))
|
||||
TARGET = pick(target_filter(ultra_range(MIN_RANGE_FIND,src,1)))
|
||||
else
|
||||
TARGET = pick(get_area_turfs(job2area(myjob)))
|
||||
TARGET = safepick(get_area_turfs(job2area(myjob)))
|
||||
tryWalk(TARGET)
|
||||
LAST_TARGET = TARGET
|
||||
|
||||
@@ -424,6 +424,8 @@
|
||||
|
||||
/mob/living/carbon/human/interactive/proc/walk2derpless(target)
|
||||
set background = 1
|
||||
if(!target)
|
||||
return 0
|
||||
var/turf/T = get_turf(target)
|
||||
var/turf/D = get_step(src,dir)
|
||||
if(D)
|
||||
|
||||
@@ -422,9 +422,7 @@ var/const/GALOSHES_DONT_HELP = 4
|
||||
|
||||
|
||||
/mob/living/carbon/proc/cuff_resist(obj/item/I, breakouttime = 600, cuff_break = 0)
|
||||
if(istype(I, /obj/item/weapon/restraints))
|
||||
var/obj/item/weapon/restraints/R = I
|
||||
breakouttime = R.breakouttime
|
||||
breakouttime = I.breakouttime
|
||||
var/displaytime = breakouttime / 600
|
||||
if(!cuff_break)
|
||||
visible_message("<span class='warning'>[src] attempts to remove [I]!</span>")
|
||||
@@ -435,7 +433,7 @@ var/const/GALOSHES_DONT_HELP = 4
|
||||
visible_message("<span class='danger'>[src] manages to remove [I]!</span>")
|
||||
src << "<span class='notice'>You successfully remove [I].</span>"
|
||||
|
||||
if(handcuffed)
|
||||
if(I == handcuffed)
|
||||
handcuffed.loc = loc
|
||||
handcuffed.dropped(src)
|
||||
handcuffed = null
|
||||
@@ -443,11 +441,13 @@ var/const/GALOSHES_DONT_HELP = 4
|
||||
buckled.unbuckle_mob()
|
||||
update_inv_handcuffed()
|
||||
return
|
||||
if(legcuffed)
|
||||
if(I == legcuffed)
|
||||
legcuffed.loc = loc
|
||||
legcuffed.dropped()
|
||||
legcuffed = null
|
||||
update_inv_legcuffed()
|
||||
return
|
||||
return 1
|
||||
else
|
||||
src << "<span class='warning'>You fail to remove [I]!</span>"
|
||||
|
||||
@@ -462,13 +462,15 @@ var/const/GALOSHES_DONT_HELP = 4
|
||||
src << "<span class='notice'>You successfully break [I].</span>"
|
||||
qdel(I)
|
||||
|
||||
if(handcuffed)
|
||||
if(I == handcuffed)
|
||||
handcuffed = null
|
||||
update_inv_handcuffed()
|
||||
return
|
||||
else
|
||||
else if(I == legcuffed)
|
||||
legcuffed = null
|
||||
update_inv_legcuffed()
|
||||
return
|
||||
return 1
|
||||
else
|
||||
src << "<span class='warning'>You fail to break [I]!</span>"
|
||||
|
||||
|
||||
@@ -811,9 +811,11 @@
|
||||
/mob/living/carbon/human/cuff_resist(obj/item/I)
|
||||
if(dna && dna.check_mutation(HULK))
|
||||
say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ))
|
||||
..(I, cuff_break = 1)
|
||||
if(..(I, cuff_break = 1))
|
||||
unEquip(I)
|
||||
else
|
||||
..()
|
||||
if(..())
|
||||
unEquip(I)
|
||||
|
||||
/mob/living/carbon/human/clean_blood()
|
||||
var/mob/living/carbon/human/H = src
|
||||
@@ -863,3 +865,11 @@
|
||||
return 1
|
||||
return
|
||||
return 1
|
||||
|
||||
/mob/living/carbon/human/resist_restraints()
|
||||
if(wear_suit && wear_suit.breakouttime)
|
||||
changeNext_move(CLICK_CD_BREAKOUT)
|
||||
last_special = world.time + CLICK_CD_BREAKOUT
|
||||
cuff_resist(wear_suit)
|
||||
else
|
||||
..()
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
/mob/living/carbon/human/restrained()
|
||||
if (handcuffed)
|
||||
return 1
|
||||
if (istype(wear_suit, /obj/item/clothing/suit/straight_jacket))
|
||||
if (wear_suit && wear_suit.breakouttime)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
|
||||
@@ -349,7 +349,6 @@ Please contact me on #coderbus IRC. ~Carnie x
|
||||
overlays_standing[SUIT_LAYER] = standing
|
||||
|
||||
if(istype(wear_suit, /obj/item/clothing/suit/straight_jacket))
|
||||
unEquip(handcuffed)
|
||||
drop_l_hand()
|
||||
drop_r_hand()
|
||||
|
||||
|
||||
@@ -140,7 +140,7 @@
|
||||
/mob/living/simple_animal/bot/proc/explode()
|
||||
qdel(src)
|
||||
|
||||
/mob/living/simple_animal/bot/proc/Emag(mob/user) //Master Emag proc. Ensure this is called in your bot before setting unique functions.
|
||||
/mob/living/simple_animal/bot/emag_act(mob/user)
|
||||
if(locked) //First emag application unlocks the bot's interface. Apply a screwdriver to use the emag again.
|
||||
locked = 0
|
||||
emagged = 1
|
||||
@@ -200,7 +200,10 @@
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/bot/attack_ai(mob/user)
|
||||
interact(user)
|
||||
if(!topic_denied(user))
|
||||
interact(user)
|
||||
else
|
||||
user << "<span class='warning'>[src]'s interface is not responding!</span>"
|
||||
|
||||
/mob/living/simple_animal/bot/interact(mob/user)
|
||||
show_controls(user)
|
||||
@@ -245,10 +248,6 @@
|
||||
s.start()
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/bot/emag_act(mob/user)
|
||||
if(emagged < 2)
|
||||
Emag(user)
|
||||
|
||||
/mob/living/simple_animal/bot/bullet_act(obj/item/projectile/Proj)
|
||||
if(Proj && (Proj.damage_type == BRUTE || Proj.damage_type == BURN))
|
||||
if(prob(75) && Proj.damage > 0)
|
||||
@@ -281,7 +280,6 @@
|
||||
text_dehack = "You reset [name]."
|
||||
text_dehack_fail = "You fail to reset [name]."
|
||||
|
||||
|
||||
/mob/living/simple_animal/bot/proc/speak(message,channel) //Pass a message to have the bot say() it. Pass a frequency to say it on the radio.
|
||||
if((!on) || (!message))
|
||||
return
|
||||
|
||||
@@ -73,7 +73,7 @@
|
||||
else
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/bot/cleanbot/Emag(mob/user)
|
||||
/mob/living/simple_animal/bot/cleanbot/emag_act(mob/user)
|
||||
..()
|
||||
if(emagged == 2)
|
||||
if(user)
|
||||
|
||||
@@ -172,7 +172,7 @@ Auto Patrol[]"},
|
||||
if(lasercolor)//To make up for the fact that lasertag bots don't hunt
|
||||
shootAt(user)
|
||||
|
||||
/mob/living/simple_animal/bot/ed209/Emag(mob/user)
|
||||
/mob/living/simple_animal/bot/ed209/emag_act(mob/user)
|
||||
..()
|
||||
if(emagged == 2)
|
||||
if(user)
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
anchored = 0
|
||||
health = 25
|
||||
maxHealth = 25
|
||||
|
||||
|
||||
radio_channel = "Engineering"
|
||||
bot_type = FLOOR_BOT
|
||||
model = "Floorbot"
|
||||
@@ -111,7 +111,7 @@
|
||||
else
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/bot/floorbot/Emag(mob/user)
|
||||
/mob/living/simple_animal/bot/floorbot/emag_act(mob/user)
|
||||
..()
|
||||
if(emagged == 2)
|
||||
if(user)
|
||||
@@ -120,7 +120,7 @@
|
||||
/mob/living/simple_animal/bot/floorbot/Topic(href, href_list)
|
||||
if(..())
|
||||
return 1
|
||||
|
||||
|
||||
switch(href_list["operation"])
|
||||
if("replace")
|
||||
replacetiles = !replacetiles
|
||||
|
||||
@@ -223,7 +223,7 @@
|
||||
if (health < current_health) //if medbot took some damage
|
||||
step_to(src, (get_step_away(src,user)))
|
||||
|
||||
/mob/living/simple_animal/bot/medbot/Emag(mob/user)
|
||||
/mob/living/simple_animal/bot/medbot/emag_act(mob/user)
|
||||
..()
|
||||
if(emagged == 2)
|
||||
declare_crit = 0
|
||||
|
||||
@@ -153,9 +153,8 @@ Auto Patrol: []"},
|
||||
if(!istype(W, /obj/item/weapon/screwdriver) && (W.force) && (!target) && (W.damtype != STAMINA) ) // Added check for welding tool to fix #2432. Welding tool behavior is handled in superclass.
|
||||
retaliate(user)
|
||||
|
||||
/mob/living/simple_animal/bot/secbot/Emag(mob/user)
|
||||
/mob/living/simple_animal/bot/secbot/emag_act(mob/user)
|
||||
..()
|
||||
|
||||
if(emagged == 2)
|
||||
if(user)
|
||||
user << "<span class='danger'>You short out [src]'s target assessment circuits.</span>"
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
|
||||
////////////////////
|
||||
//MORE DRONE TYPES//
|
||||
////////////////////
|
||||
@@ -28,21 +27,31 @@
|
||||
default_hatmask = /obj/item/clothing/head/helmet/space/hardsuit/syndi
|
||||
seeStatic = 0 //Our programming is superior.
|
||||
|
||||
|
||||
/mob/living/simple_animal/drone/syndrone/New()
|
||||
..()
|
||||
if(internal_storage && internal_storage.hidden_uplink)
|
||||
internal_storage.hidden_uplink.uses = (initial(internal_storage.hidden_uplink.uses) / 2)
|
||||
internal_storage.name = "syndicate uplink"
|
||||
|
||||
internal_storage.hidden_uplink.telecrystals = 10
|
||||
|
||||
/mob/living/simple_animal/drone/syndrone/Login()
|
||||
..()
|
||||
src << "<span class='notice'>You can kill and eat other drones to increase your health!</span>" //Inform the evil lil guy
|
||||
|
||||
/mob/living/simple_animal/drone/syndrone/badass
|
||||
name = "Badass Syndrone"
|
||||
default_hatmask = /obj/item/clothing/head/helmet/space/hardsuit/syndi/elite
|
||||
default_storage = /obj/item/device/radio/uplink/nuclear
|
||||
|
||||
/mob/living/simple_animal/drone/syndrone/badass/New()
|
||||
..()
|
||||
internal_storage.hidden_uplink.telecrystals = 30
|
||||
var/obj/item/weapon/implant/weapons_auth/W = new/obj/item/weapon/implant/weapons_auth(src)
|
||||
W.implant(src)
|
||||
|
||||
/obj/item/drone_shell/syndrone
|
||||
name = "syndrone shell"
|
||||
desc = "A shell of a syndrone, a modified maintenance drone designed to infiltrate and annihilate."
|
||||
icon_state = "syndrone_item"
|
||||
drone_type = /mob/living/simple_animal/drone/syndrone
|
||||
drone_type = /mob/living/simple_animal/drone/syndrone
|
||||
|
||||
/obj/item/drone_shell/syndrone/badass
|
||||
name = "badass syndrone shell"
|
||||
drone_type = /mob/living/simple_animal/drone/syndrone/badass
|
||||
@@ -1,9 +1,9 @@
|
||||
var/list/world_uplinks = list()
|
||||
var/global/list/uplinks = list()
|
||||
|
||||
/**
|
||||
* Uplinks
|
||||
*
|
||||
* All obj/item 's have a hidden_uplink var. By default it's null. Give the item one with 'new(src') (it must be in it's contents). Then add 'uses.'
|
||||
* All /obj/item(s) have a hidden_uplink var. By default it's null. Give the item one with 'new(src') (it must be in it's contents). Then add 'uses.'
|
||||
* Use whatever conditionals you want to check that the user has an uplink, and then call interact() on their uplink.
|
||||
* You might also want the uplink menu to open if active. Check if the uplink is 'active' and then interact() with it.
|
||||
**/
|
||||
@@ -12,40 +12,39 @@ var/list/world_uplinks = list()
|
||||
desc = "There is something wrong if you're examining this."
|
||||
var/active = FALSE
|
||||
var/lockable = TRUE
|
||||
var/uses = 20
|
||||
var/used_TC = 0
|
||||
var/uplink_owner = null
|
||||
var/purchase_log = ""
|
||||
var/telecrystals = 20
|
||||
|
||||
var/mode_override = null
|
||||
var/owner = null
|
||||
var/datum/game_mode/gamemode = null
|
||||
var/spent_telecrystals = 0
|
||||
var/purchase_log = ""
|
||||
|
||||
/obj/item/device/uplink/New()
|
||||
..()
|
||||
world_uplinks += src
|
||||
uplinks += src
|
||||
|
||||
/obj/item/device/uplink/Destroy()
|
||||
world_uplinks -= src
|
||||
uplinks -= src
|
||||
return ..()
|
||||
|
||||
/obj/item/device/uplink/interact(mob/user)
|
||||
if(!active)
|
||||
active = TRUE
|
||||
active = TRUE
|
||||
ui_interact(user)
|
||||
|
||||
/obj/item/device/uplink/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, \
|
||||
datum/tgui/master_ui = null, datum/ui_state/state = inventory_state)
|
||||
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
|
||||
if(!ui)
|
||||
ui = new(user, src, ui_key, "uplink", name, 400, 200, master_ui, state)
|
||||
ui = new(user, src, ui_key, "uplink", name, 450, 750, master_ui, state)
|
||||
ui.set_style("syndicate")
|
||||
ui.open()
|
||||
|
||||
/obj/item/device/uplink/get_ui_data(mob/user)
|
||||
var/list/data = list()
|
||||
data["uses"] = uses
|
||||
data["telecrystals"] = telecrystals
|
||||
data["lockable"] = lockable
|
||||
|
||||
var/list/uplink_items = get_uplink_items(mode_override)
|
||||
var/list/uplink_items = get_uplink_items(gamemode)
|
||||
data["buyable"] = list()
|
||||
for(var/category in uplink_items)
|
||||
var/list/cat = list(
|
||||
@@ -69,12 +68,12 @@ var/list/world_uplinks = list()
|
||||
|
||||
switch(action)
|
||||
if("buy")
|
||||
var/list/uplink_items = get_uplink_items(mode_override)
|
||||
var/list/uplink_items = get_uplink_items(gamemode)
|
||||
var/category = params["category"]
|
||||
var/item = params["item"]
|
||||
var/datum/uplink_item/I = uplink_items[category][item]
|
||||
if(I)
|
||||
I.buy(src, usr)
|
||||
I.buy(usr, src)
|
||||
if("lock")
|
||||
active = FALSE
|
||||
SStgui.close_uis(src)
|
||||
@@ -85,43 +84,33 @@ var/list/world_uplinks = list()
|
||||
return loc
|
||||
|
||||
// Refund certain items by hitting the uplink with it.
|
||||
/obj/item/device/radio/uplink/attackby(obj/item/weapon/W, mob/user, params)
|
||||
if(istype(W))
|
||||
for(var/path in subtypesof(/datum/uplink_item))
|
||||
var/datum/uplink_item/D = path
|
||||
if(initial(D.item) == W.type && initial(D.refundable))
|
||||
hidden_uplink.uses += (D.cost)
|
||||
hidden_uplink.used_TC -= initial(D.cost)
|
||||
user << "<span class='notice'>[W] refunded.</span>"
|
||||
qdel(W)
|
||||
return
|
||||
|
||||
// PRESET UPLINKS
|
||||
// A collection of preset uplinks.
|
||||
//
|
||||
// Includes normal radio uplink, multitool uplink,
|
||||
// implant uplink (not the implant tool) and a preset headset uplink.
|
||||
/obj/item/device/radio/uplink/attackby(obj/item/I, mob/user, params)
|
||||
for(var/item in subtypesof(/datum/uplink_item))
|
||||
var/datum/uplink_item/UI = item
|
||||
var/path = initial(UI.item)
|
||||
var/cost = initial(UI.cost)
|
||||
var/refundable = initial(UI.refundable)
|
||||
if(I.type == path && refundable)
|
||||
hidden_uplink.telecrystals += cost
|
||||
hidden_uplink.spent_telecrystals -= cost
|
||||
user << "<span class='notice'>[I] refunded.</span>"
|
||||
qdel(I)
|
||||
return
|
||||
|
||||
// A collection of pre-set uplinks, for admin spawns.
|
||||
/obj/item/device/radio/uplink/New()
|
||||
..()
|
||||
icon_state = "radio"
|
||||
hidden_uplink = new(src)
|
||||
hidden_uplink.active = TRUE
|
||||
hidden_uplink.lockable = FALSE
|
||||
|
||||
/obj/item/device/radio/uplink/attack_self(mob/user)
|
||||
if(hidden_uplink)
|
||||
hidden_uplink.interact(user)
|
||||
/obj/item/device/radio/uplink/nuclear/New()
|
||||
..()
|
||||
hidden_uplink.gamemode = /datum/game_mode/nuclear
|
||||
|
||||
/obj/item/device/multitool/uplink/New()
|
||||
hidden_uplink = new(src)
|
||||
hidden_uplink.lockable = FALSE
|
||||
|
||||
/obj/item/device/multitool/uplink/attack_self(mob/user)
|
||||
if(hidden_uplink)
|
||||
hidden_uplink.interact(user)
|
||||
|
||||
/obj/item/device/radio/headset/uplink
|
||||
traitor_frequency = 1445
|
||||
|
||||
/obj/item/device/radio/headset/uplink/New()
|
||||
..()
|
||||
hidden_uplink = new(src)
|
||||
hidden_uplink.active = TRUE
|
||||
hidden_uplink.lockable = FALSE
|
||||
File diff suppressed because it is too large
Load Diff
+2
-2
@@ -190,7 +190,6 @@
|
||||
#include "code\datums\recipe.dm"
|
||||
#include "code\datums\spell.dm"
|
||||
#include "code\datums\supplypacks.dm"
|
||||
#include "code\datums\uplink_item.dm"
|
||||
#include "code\datums\votablemap.dm"
|
||||
#include "code\datums\diseases\_disease.dm"
|
||||
#include "code\datums\diseases\_MobProcs.dm"
|
||||
@@ -644,7 +643,6 @@
|
||||
#include "code\game\objects\items\devices\taperecorder.dm"
|
||||
#include "code\game\objects\items\devices\traitordevices.dm"
|
||||
#include "code\game\objects\items\devices\transfer_valve.dm"
|
||||
#include "code\game\objects\items\devices\uplinks.dm"
|
||||
#include "code\game\objects\items\devices\PDA\cart.dm"
|
||||
#include "code\game\objects\items\devices\PDA\PDA.dm"
|
||||
#include "code\game\objects\items\devices\PDA\radio.dm"
|
||||
@@ -1608,6 +1606,8 @@
|
||||
#include "code\modules\tgui\states\states.dm"
|
||||
#include "code\modules\tgui\states\zlevel.dm"
|
||||
#include "code\modules\tooltip\tooltip.dm"
|
||||
#include "code\modules\uplink\uplink.dm"
|
||||
#include "code\modules\uplink\uplink_item.dm"
|
||||
#include "code\modules\vehicles\atv.dm"
|
||||
#include "code\modules\vehicles\pimpin_ride.dm"
|
||||
#include "code\modules\vehicles\secway.dm"
|
||||
|
||||
File diff suppressed because one or more lines are too long
+4
-4
File diff suppressed because one or more lines are too long
@@ -1,45 +1,51 @@
|
||||
<script>
|
||||
import { UI_INTERACTIVE } from 'util/constants'
|
||||
import { act } from 'util/byond'
|
||||
import { UI_INTERACTIVE } from 'util/constants'
|
||||
import { act } from 'util/byond'
|
||||
|
||||
component.exports = {
|
||||
computed: {
|
||||
clickable () {
|
||||
if (this.get('enabled') && !this.get('state')) {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
},
|
||||
enabled () {
|
||||
if (this.get('config.status') === UI_INTERACTIVE) {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
},
|
||||
styles () {
|
||||
const state = this.get('state'), style = this.get('style')
|
||||
if (this.get('enabled')) {
|
||||
if (!state) {
|
||||
return `active normal ${[style]}`
|
||||
} else {
|
||||
return `inactive ${state}`
|
||||
component.exports = {
|
||||
computed: {
|
||||
clickable () {
|
||||
if (this.get('enabled') && !this.get('state')) {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
},
|
||||
enabled () {
|
||||
if (this.get('config.status') === UI_INTERACTIVE) {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
},
|
||||
styles () {
|
||||
let extra = ''
|
||||
if (this.get('tooltip-side'))
|
||||
extra = ` tooltip-${this.get('tooltip-side')}`
|
||||
if (this.get('grid'))
|
||||
extra += ' gridable'
|
||||
if (this.get('enabled')) {
|
||||
const state = this.get('state')
|
||||
const style = this.get('style')
|
||||
if (!state) {
|
||||
return `active normal ${style} ${extra}`
|
||||
} else {
|
||||
return `inactive ${state} ${extra}`
|
||||
}
|
||||
} else {
|
||||
return `inactive disabled ${extra}`
|
||||
}
|
||||
} else {
|
||||
return 'inactive disabled'
|
||||
}
|
||||
}
|
||||
},
|
||||
oninit () {
|
||||
this.on('press', (event) => {
|
||||
const { action, params } = this.get()
|
||||
act(this.get('config.ref'), action, params)
|
||||
event.node.blur()
|
||||
})
|
||||
oninit () {
|
||||
this.on('press', (event) => {
|
||||
const { action, params } = this.get()
|
||||
act(this.get('config.ref'), action, params)
|
||||
event.node.blur()
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<span class='button {{styles}} {{#grid}}gridable{{/}}'
|
||||
<span class='button {{styles}}'
|
||||
unselectable='on'
|
||||
{{#clickable}}tabindex='0'{{/}}
|
||||
data-tooltip='{{tooltip}}'
|
||||
|
||||
@@ -20,10 +20,10 @@
|
||||
action='excheck' params='{"id_tag": "{{id_tag}}", "val": {{checks}}}'>External</ui-button>
|
||||
</ui-section>
|
||||
<ui-section label='Target Pressure'>
|
||||
<ui-button icon='pencil' action='external_pressure'
|
||||
params='{"id_tag": "{{id_tag}}", "pressure": "custom"}'>{{Math.fixed(external)}}</ui-button>
|
||||
<ui-button icon='refresh' state='{{extdefault ? "disabled" : null}}' action='external_pressure'
|
||||
params='{"id_tag": "{{id_tag}}", "pressure": "reset"}'>Reset</ui-button>
|
||||
<ui-button icon='pencil' action='set_external_pressure'
|
||||
params='{"id_tag": "{{id_tag}}"}'>{{Math.fixed(external)}}</ui-button>
|
||||
<ui-button icon='refresh' state='{{extdefault ? "disabled" : null}}' action='reset_external_pressure'
|
||||
params='{"id_tag": "{{id_tag}}"}'>Reset</ui-button>
|
||||
</ui-section>
|
||||
</ui-subdisplay>
|
||||
{{else}}
|
||||
|
||||
@@ -68,7 +68,7 @@ component.exports = {
|
||||
{{#if data.powerCellStatus != null}}
|
||||
<ui-bar min='0' max='100' value='{{data.powerCellStatus}}' state='{{powerCellStatusState}}'>{{Math.fixed(adata.powerCellStatus)}}%</ui-bar>
|
||||
{{else}}
|
||||
<span class='bad'>Power cell removed.</span>
|
||||
<span class='bad'>Removed</span>
|
||||
{{/if}}
|
||||
</ui-section>
|
||||
{{#if data.powerCellStatus != null}}
|
||||
|
||||
@@ -17,6 +17,6 @@
|
||||
{{data.outputting ? "Open": "Closed"}}</ui-button>
|
||||
</ui-section>
|
||||
<ui-section label='Output Pressure'>
|
||||
<ui-button icon='pencil' action='output_pressure'>{{Math.fixed(adata.outputPressure)}} kPa</ui-button>
|
||||
<ui-button icon='pencil' action='output_pressure'>{{Math.round(adata.outputPressure)}} kPa</ui-button>
|
||||
</ui-section>
|
||||
</ui-display>
|
||||
|
||||
@@ -1,18 +1,18 @@
|
||||
<script>
|
||||
component.exports = {
|
||||
oninit () {
|
||||
this.on({
|
||||
hover (event) {
|
||||
const uses = this.get('data.uses')
|
||||
if (uses >= event.context.params.cost)
|
||||
this.set('hovered', event.context.params)
|
||||
},
|
||||
unhover (event) {
|
||||
this.set('hovered')
|
||||
}
|
||||
})
|
||||
component.exports = {
|
||||
oninit () {
|
||||
this.on({
|
||||
hover (event) {
|
||||
const uses = this.get('data.telecrystals')
|
||||
if (uses >= event.context.params.cost)
|
||||
this.set('hovered', event.context.params)
|
||||
},
|
||||
unhover (event) {
|
||||
this.set('hovered')
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<ui-display title='Uplink' button>
|
||||
@@ -22,14 +22,15 @@ component.exports = {
|
||||
{{/if}}
|
||||
{{/partial}}
|
||||
<ui-section label='Telecrystals' right>
|
||||
<span class='{{data.uses > 0 ? "good" : "bad"}}'>{{data.uses}} TC</span>
|
||||
<span class='{{data.telecrystals > 0 ? "good" : "bad"}}'>{{data.telecrystals}} TC</span>
|
||||
</ui-section>
|
||||
</ui-display>
|
||||
{{#each data.buyable}}
|
||||
<ui-display title='{{name}}'>
|
||||
{{#each items}}
|
||||
<ui-section label='{{name}}' candystripe right>
|
||||
<ui-button tooltip='{{name}}: {{desc}}' state='{{data.uses < cost || (data.uses - hovered.cost < cost && hovered.item != name) ? "disabled" : null}}'
|
||||
<ui-button tooltip='{{name}}: {{desc}}' tooltip-side='left'
|
||||
state='{{data.telecrystals < cost || (data.telecrystals - hovered.cost < cost && hovered.item != name) ? "disabled" : null}}'
|
||||
action='buy' params='{"category": "{{category}}", "item": {{name}}, "cost": {{cost}}}'
|
||||
on-hover='hover' on-unhover='unhover'>{{cost}} TC</ui-button>
|
||||
</ui-section>
|
||||
|
||||
@@ -7,7 +7,6 @@ export function href (params = {}, url = '') {
|
||||
|
||||
// Helper to make a BYOND ui_act() call on the UI 'src' given an 'action' and optional 'params'.
|
||||
export function act (src, action, params = {}) {
|
||||
console.log(params)
|
||||
window.location.href = href(Object.assign({ src, action }, params))
|
||||
}
|
||||
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
width: 250px
|
||||
padding: 10px
|
||||
transform: translateX(-50%)
|
||||
|
||||
visibility: hidden
|
||||
opacity: 0
|
||||
|
||||
@@ -15,13 +16,13 @@
|
||||
text-align: left
|
||||
content: attr(data-tooltip)
|
||||
|
||||
transition: all .3s;
|
||||
transition: all .5s
|
||||
border: 1px solid tooltip-color-border
|
||||
background-color: tooltip-color-background
|
||||
|
||||
&:hover::after
|
||||
opacity: 1
|
||||
visibility: visible
|
||||
opacity: 1
|
||||
|
||||
&.tooltip-top::after
|
||||
bottom: 100%
|
||||
@@ -35,7 +36,7 @@
|
||||
left: 50%
|
||||
transform: translateX(-50%) translateY(-8px)
|
||||
&.tooltip-bottom:hover::after
|
||||
transform: translateX(-50%) translateY(-8px)
|
||||
transform: translateX(-50%) translateY(8px)
|
||||
|
||||
&.tooltip-left::after
|
||||
top: 50%
|
||||
|
||||
Reference in New Issue
Block a user