Merge Conflict Fix

This commit is contained in:
Firecage
2016-01-20 14:07:14 +02:00
65 changed files with 1590 additions and 1531 deletions
+4 -4
View File
@@ -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)
+3
View File
@@ -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
View File
@@ -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
+2 -2
View File
@@ -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
+8 -17
View File
@@ -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
+24 -40
View File
@@ -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)
+11 -14
View File
@@ -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
+1 -1
View File
@@ -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")
+1 -1
View File
@@ -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>"
+3 -4
View File
@@ -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)
..()
+2 -10
View File
@@ -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
+88 -51
View File
@@ -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 -2
View File
@@ -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
+3 -20
View File
@@ -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
+2 -2
View File
@@ -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"
+9 -4
View File
@@ -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"
+1 -1
View File
@@ -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)
+2 -2
View File
@@ -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
+1 -1
View File
@@ -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)
+1 -1
View File
@@ -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)
+1 -1
View File
@@ -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)
+1 -1
View File
@@ -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)
+1 -1
View File
@@ -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)
+3 -1
View File
@@ -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)
+9 -7
View File
@@ -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>"
+12 -2
View File
@@ -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
View File
@@ -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"
+1 -1
View File
File diff suppressed because one or more lines are too long
+4 -4
View File
File diff suppressed because one or more lines are too long
+40 -34
View File
@@ -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}}'
+4 -4
View File
@@ -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}}
+1 -1
View File
@@ -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}}
+1 -1
View File
@@ -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>
+16 -15
View File
@@ -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>
-1
View File
@@ -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))
}
+4 -3
View File
@@ -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%