Merge branch 'master' into dynamic-transit

This commit is contained in:
Jack Edge
2016-07-01 10:47:03 +01:00
48 changed files with 4354 additions and 3720 deletions
+18 -32
View File
@@ -9681,19 +9681,7 @@
/turf/open/floor/plasteel/black,
/area/security/brig)
"arh" = (
/obj/structure/table,
/obj/item/weapon/storage/box/prisoner,
/obj/item/weapon/razor{
pixel_x = -6
},
/obj/item/weapon/paper{
desc = "";
info = "<b>Labor Camp Facility Operation Guide</b><br><br>Hello there, proud operator of an NT-Sec Prisoner Rehabilitation Center. A solution to rising crime rates and falling productivity, these facilities are specifically designed for the safe, productive imprisonment of your most dangerous criminals. <br><br>To press a long-term prisoner into the service of the station, replace his equipment with prisoners' garb at one of the prison lockers, as per normal operating procedure. Before assigning a prisoner his ID, insert the ID into a prisoner management console and assign the prisoner a quota, based on the severity of his crime. <br>A single sheet of most materials produces five points for the prisoner, and points can be expected to be produced at a rate of about 100 per minute, though punishments as severe as forced labor should be reserved for serious crimes of sentences not less than five minutes long.<br>Once you have prepared the prisoner, place him in the secure northern half of the labor shuttle, and send him to the station. Once he meets his quota by feeding sheets to the stacker, he will be allowed to return to the station, and will be able to open the secure door to the prisoner release area.<br><br>In the case of dangerous prisoners, surveilance may be needed. To that end, there is a prisoner monitoring room on the mining station, equipped with a remote flasher and a lockdown button. The mine itself is patrolled by a securibot, so the nearby security records console can also be used to secure hostile prisoners on the mine.";
name = "Labor Camp Operating Guide"
},
/obj/structure/window/reinforced{
dir = 4
},
/obj/machinery/computer/shuttle/labor,
/turf/open/floor/plasteel/black,
/area/security/brig)
"ari" = (
@@ -10505,23 +10493,26 @@
c_tag = "Labor Shuttle Control Desk";
dir = 4
},
/obj/machinery/computer/shuttle/labor,
/obj/machinery/light{
dir = 8
},
/obj/structure/table,
/obj/item/weapon/storage/box/prisoner,
/obj/item/weapon/razor{
pixel_x = -6
},
/obj/item/weapon/paper{
desc = "";
info = "<b>Labor Camp Facility Operation Guide</b><br><br>Hello there, proud operator of an NT-Sec Prisoner Rehabilitation Center. A solution to rising crime rates and falling productivity, these facilities are specifically designed for the safe, productive imprisonment of your most dangerous criminals. <br><br>To press a long-term prisoner into the service of the station, replace his equipment with prisoners' garb at one of the prison lockers, as per normal operating procedure. Before assigning a prisoner his ID, insert the ID into a prisoner management console and assign the prisoner a quota, based on the severity of his crime. <br>A single sheet of most materials produces five points for the prisoner, and points can be expected to be produced at a rate of about 100 per minute, though punishments as severe as forced labor should be reserved for serious crimes of sentences not less than five minutes long.<br>Once you have prepared the prisoner, place him in the secure northern half of the labor shuttle, and send him to the station. Once he meets his quota by feeding sheets to the stacker, he will be allowed to return to the station, and will be able to open the secure door to the prisoner release area.<br><br>In the case of dangerous prisoners, surveilance may be needed. To that end, there is a prisoner monitoring room on the mining station, equipped with a remote flasher and a lockdown button. The mine itself is patrolled by a securibot, so the nearby security records console can also be used to secure hostile prisoners on the mine.";
name = "Labor Camp Operating Guide"
},
/obj/item/weapon/pen,
/turf/open/floor/plasteel/black,
/area/security/brig)
"asy" = (
/obj/structure/chair/office/dark{
dir = 8
},
/obj/machinery/door/window/westleft{
base_state = "right";
dir = 4;
icon_state = "right";
name = "Labor Camp Desk";
req_access_txt = "0"
},
/turf/open/floor/plasteel/black,
/area/security/brig)
"asz" = (
@@ -11484,19 +11475,11 @@
},
/area/shuttle/labor)
"atW" = (
/obj/machinery/computer/prisoner,
/obj/machinery/computer/gulag_teleporter_computer,
/turf/open/floor/plasteel/black,
/area/security/brig)
"atX" = (
/obj/structure/table,
/obj/item/weapon/paper_bin{
pixel_x = -3;
pixel_y = 7
},
/obj/item/weapon/pen,
/obj/structure/window/reinforced{
dir = 4
},
/obj/machinery/gulag_teleporter,
/turf/open/floor/plasteel/black,
/area/security/brig)
"atY" = (
@@ -15841,6 +15824,9 @@
pixel_x = 24;
pixel_y = 20
},
/obj/machinery/gulag_item_reclaimer{
pixel_y = 24
},
/turf/open/floor/plasteel/black,
/area/hallway/primary/fore)
"aBp" = (
@@ -118133,7 +118119,7 @@ aju
avw
aju
aaa
azT
aDN
aBo
aCA
aDO
+15 -12
View File
@@ -4501,14 +4501,11 @@
/turf/open/space,
/area/solar/auxport)
"ajr" = (
/obj/machinery/computer/security{
name = "Labor Camp Monitoring";
network = list("Labor")
},
/obj/machinery/computer/gulag_teleporter_computer,
/turf/open/floor/plasteel,
/area/security/processing)
"ajs" = (
/obj/machinery/computer/prisoner,
/obj/machinery/gulag_teleporter,
/turf/open/floor/plasteel,
/area/security/processing)
"ajt" = (
@@ -4516,21 +4513,24 @@
pixel_x = 32;
pixel_y = 0
},
/obj/structure/closet/emcloset,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
/obj/structure/table,
/obj/item/weapon/storage/box/prisoner,
/obj/machinery/camera{
c_tag = "Labor Shuttle Dock North"
},
/turf/open/floor/plasteel,
/area/security/processing)
"aju" = (
/obj/machinery/camera{
c_tag = "Labor Shuttle Dock North"
},
/obj/structure/table,
/obj/item/weapon/storage/box/prisoner,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 6
},
/obj/machinery/computer/security{
name = "Labor Camp Monitoring";
network = list("Labor")
},
/turf/open/floor/plasteel,
/area/security/processing)
"ajv" = (
@@ -6434,7 +6434,9 @@
},
/area/security/processing)
"ant" = (
/obj/structure/closet/emcloset,
/obj/machinery/gulag_item_reclaimer{
pixel_y = 24
},
/turf/open/floor/plasteel/warning{
dir = 9
},
@@ -6869,6 +6871,7 @@
},
/area/security/processing)
"aos" = (
/obj/structure/closet/emcloset,
/turf/open/floor/plasteel/warning{
dir = 10
},
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -57,7 +57,7 @@ var/datum/subsystem/lighting/SSlighting
if(T.lighting_changed)
T.redraw_lighting()
if (MC_TICK_CHECK)
return
break
if (i > 1)
changed_turfs.Cut(1,i)
+9 -9
View File
@@ -354,10 +354,10 @@ body
html += "<li>"
if (isnull(value))
html += "[name] = <span class='value'>null</span>"
html += "[html_encode(name)] = <span class='value'>null</span>"
else if (istext(value))
html += "[name] = <span class='value'>\"[html_encode(value)]\"</span>"
html += "[html_encode(name)] = <span class='value'>\"[html_encode(value)]\"</span>"
else if (isicon(value))
#ifdef VARSICON
@@ -365,9 +365,9 @@ body
var/rnd = rand(1,10000)
var/rname = "tmp\ref[I][rnd].png"
usr << browse_rsc(I, rname)
html += "[name] = (<span class='value'>[value]</span>) <img class=icon src=\"[rname]\">"
html += "[html_encode(name)] = (<span class='value'>[value]</span>) <img class=icon src=\"[rname]\">"
#else
html += "[name] = /icon (<span class='value'>[value]</span>)"
html += "[html_encode(name)] = /icon (<span class='value'>[value]</span>)"
#endif
/* else if (istype(value, /image))
@@ -382,19 +382,19 @@ body
#endif
*/
else if (isfile(value))
html += "[name] = <span class='value'>'[value]'</span>"
html += "[html_encode(name)] = <span class='value'>'[value]'</span>"
else if (istype(value, /datum))
var/datum/D = value
html += "<a href='?_src_=vars;Vars=\ref[value]'>[name] \ref[value]</a> = [D.type]"
html += "<a href='?_src_=vars;Vars=\ref[value]'>[html_encode(name)] \ref[value]</a> = [D.type]"
else if (istype(value, /client))
var/client/C = value
html += "<a href='?_src_=vars;Vars=\ref[value]'>[name] \ref[value]</a> = [C] [C.type]"
html += "<a href='?_src_=vars;Vars=\ref[value]'>[html_encode(name)] \ref[value]</a> = [C] [C.type]"
//
else if (istype(value, /list))
var/list/L = value
html += "[name] = /list ([L.len])"
html += "[html_encode(name)] = /list ([L.len])"
if (L.len > 0 && !(name == "underlays" || name == "overlays" || name == "vars" || L.len > 500))
// not sure if this is completely right...
@@ -414,7 +414,7 @@ body
html += "</ul>"
else
html += "[name] = <span class='value'>[html_encode(value)]</span>"
html += "[html_encode(name)] = <span class='value'>[html_encode(value)]</span>"
html += "</li>"
+20 -19
View File
@@ -538,23 +538,24 @@
/obj/item/weapon/ratvars_flame/afterattack(atom/target, mob/living/user, flag, params)
if(!visor || (visor && visor.cooldown))
qdel(src)
visor.recharging = TRUE
visor.flame = null
visor.update_status()
for(var/obj/item/clothing/glasses/judicial_visor/V in user.GetAllContents())
if(V == visor)
continue
V.recharging = TRUE //To prevent exploiting multiple visors to bypass the cooldown
V.update_status()
addtimer(V, "recharge_visor", ratvar_awakens ? 60 : 600, FALSE, user)
clockwork_say(user, "Xarry, urn'guraf!")
user.visible_message("<span class='warning'>The flame in [user]'s hand rushes to [target]!</span>", "<span class='heavy_brass'>You direct [visor]'s power to [target]. You must wait for some time before doing this again.</span>")
new/obj/effect/clockwork/judicial_marker(get_turf(target), user)
user.update_action_buttons_icon()
user.update_inv_glasses()
addtimer(visor, "recharge_visor", ratvar_awakens ? 30 : 300, FALSE, user)//Cooldown is reduced by 10x if Ratvar is up
qdel(src)
return 1
if(target in view(7, get_turf(user)))
visor.recharging = TRUE
visor.flame = null
visor.update_status()
for(var/obj/item/clothing/glasses/judicial_visor/V in user.GetAllContents())
if(V == visor)
continue
V.recharging = TRUE //To prevent exploiting multiple visors to bypass the cooldown
V.update_status()
addtimer(V, "recharge_visor", ratvar_awakens ? 60 : 600, FALSE, user)
clockwork_say(user, "Xarry, urn'guraf!")
user.visible_message("<span class='warning'>The flame in [user]'s hand rushes to [target]!</span>", "<span class='heavy_brass'>You direct [visor]'s power to [target]. You must wait for some time before doing this again.</span>")
new/obj/effect/clockwork/judicial_marker(get_turf(target), user)
user.update_action_buttons_icon()
user.update_inv_glasses()
addtimer(visor, "recharge_visor", ratvar_awakens ? 30 : 300, FALSE, user)//Cooldown is reduced by 10x if Ratvar is up
qdel(src)
return 1
/obj/item/clothing/head/helmet/clockwork //Clockwork armor: High melee protection but weak to lasers
@@ -794,8 +795,8 @@
return
var/mob/living/L = target
if(issilicon(L) || iscultist(L))
L.Stun(3)
L.Weaken(3)
L.Stun(6)
L.Weaken(6)
break_spear(T)
/obj/item/clockwork/ratvarian_spear/proc/break_spear(turf/T)
@@ -251,10 +251,13 @@
var/mania_messages = list("\"Tb ahgf.\"", "\"Gnxr n penpx ng penml.\"", "\"Znxr n ovq sbe vafnavgl.\"", "\"Trg xbbxl.\"", "\"Zbir gbjneqf znavn.\"", "\"Orpbzr orjvyqrerq.\"", "\"Jnk jvyq.\"", \
"\"Tb ebhaq gur oraq.\"", "\"Ynaq va yhanpl.\"", "\"Gel qrzragvn.\"", "\"Fgevir gb trg n fperj ybbfr.\"")
var/compel_messages = list("\"Pbzr pybfre.\"", "\"Nccebnpu gur genafzvggre.\"", "\"Gbhpu gur nagraanr.\"", "\"V nyjnlf unir gb qrny jvgu vqvbgf. Zbir gbjneqf gur znavn zbgbe.\"", \
"\"Nqinapr sbejneq naq cynpr lbhe urnq orgjrra gur nagraanr - gung'f nyy vg'f tbbq sbe.\"", "\"Vs lbh jrer fznegre, lbh'q or bire urer nyernql.\"", "\"Zbir SBEJNEQ, lbh sbby.\"")
var/convert_messages = list("\"Lbh jba'g qb. Tb gb fyrrc juvyr V gryy gurfr avgjvgf ubj gb pbaireg lbh.\"", "\"Lbh ner vafhssvpvrag. V zhfg vafgehpg gurfr vqvbgf va gur neg bs pbairefvba.\"", \
"\"Bu, bs pbhefr, fbzrbar jr pna'g pbaireg. Gurfr freinagf ner sbbyf.\"", "\"Ubj uneq vf vg gb hfr n Fvtvy, naljnl? Nyy vg gnxrf vf qenttvat fbzrbar bagb vg.\"", \
"\"Ubj qb gurl snvy gb hfr n Fvtvy bs Npprffvba, naljnl?\"", "\"Jul vf vg gung nyy freinagf ner guvf varcg?\"", "\"Vg'f abg yvxryl lbh'yy or fghpx urer ybat.\"")
"\"Nqinapr sbejneq naq cynpr lbhe urnq orgjrra gur nagraanr - gun'g'f nyy vg'f tbbq sbe.\"", "\"Vs lbh jrer fznegre, lbh'q or bire urer nyernql.\"", "\"Zbir SBEJNEQ, lbh sbby.\"")
var/convert_messages = list("\"Lbh jba'g qb. Tb gb fyrrc juvyr V gryy gur'fr avgjvgf ubj gb pbaireg lbh.\"", "\"Lbh ner vafhssvpvrag. V zhfg vafgehpg gur'fr vqvbgf va gur neg-bs pbairefvba.\"", \
"\"Bu-bs pbhefr, fbzrbar jr pna'g pbaireg. Gur'fr freinagf ner sbbyf.\"", "\"Ubj uneq vf vg gb hfr n Fvtvy, naljnl? Nyy vg gnxrf vf qenttvat fbzrbar bagb vg.\"", \
"\"Ubj qb gur'l snvy gb hfr n Fvtvy-bs Npprffvba, naljnl?\"", "\"Jul vf vg gun'g nyy freinagf ner guv'f varcg?\"", "\"Vg'f dhvgr yvxryl lbh'yy or fghpx urer sbe n juvyr.\"")
var/close_messages = list("\"Jryy, lbh pna'g ernpu gur zbgbe sebz GUR'ER, lbh zbeba.\"", "\"Vagrerfgvat ybpngvba. V'q cersre vs lbh jrag fbzrjurer lbh pbhyq NPGHNYYL GBHPU GUR NAGRAANR!\"", \
"\"Nznmvat. Lbh fbzrubj znantrq gb jrqtr lbhefrys fbzrjurer lbh pna'g npghnyyl ernpu gur zbgbe sebz.\"", "\"Fhpu n fubj-bs vqvbpl vf hacnenyyryrq. Creuncf V fubhyq chg lbh ba qvfcynl?\"", \
"\"Qvq lbh qb guv'f ba checbfr? V pna'g vzntvar lbh qbvat fb nppvqragnyyl. Bu, jnvg, V pna.\"", "\"Ubj vf vg gun'g fhpu fzneg perngherf pna fgvyy qb fbzrguv'at NF FGHCVQ NF GUV'F!\"")
/obj/structure/clockwork/powered/mania_motor/examine(mob/user)
@@ -271,11 +274,27 @@
return
if(try_use_power(mania_cost))
var/hum = get_sfx('sound/effects/screech.ogg') //like playsound, same sound for everyone affected
for(var/mob/living/carbon/human/H in view(1, src))
if(H.Adjacent(src) && try_use_power(convert_attempt_cost))
if(is_eligible_servant(H) && try_use_power(convert_cost))
H << "<span class='sevtug'>\"Lbh ner zvar-naq-uvf, abj.\"</span>"
H.playsound_local(T, hum, 80, 1)
add_servant_of_ratvar(H)
else if(!H.stat)
if(H.getBrainLoss() >= H.maxHealth)
H.Paralyse(5)
H << "<span class='sevtug'>[pick(convert_messages)]</span>"
else
H.adjustBrainLoss(100)
H.visible_message("<span class='warning'>[H] reaches out and touches [src].</span>", "<span class='sevtug'>You touch [src] involuntarily.</span>")
else
visible_message("<span class='warning'>[src]'s antennae fizzle quietly.</span>")
playsound(src, 'sound/effects/light_flicker.ogg', 50, 1)
for(var/mob/living/carbon/human/H in range(10, src))
if(!is_servant_of_ratvar(H) && !H.null_rod_check())
if(!is_servant_of_ratvar(H) && !H.null_rod_check() && H.stat == CONSCIOUS)
var/distance = get_dist(T, get_turf(H))
var/falloff_distance = (110) - distance * 10
var/sound_distance = falloff_distance * 0.4
var/falloff_distance = min((110) - distance * 10, 80)
var/sound_distance = falloff_distance * 0.5
var/targetbrainloss = H.getBrainLoss()
var/targethallu = H.hallucination
var/targetdruggy = H.druggy
@@ -289,26 +308,26 @@
H << "<span class='sevtug_small'>[pick(mania_messages)]</span>"
else
H << "<span class='sevtug'>[pick(compel_messages)]</span>"
if(targetbrainloss <= 70)
H.adjustBrainLoss(70 - targetbrainloss) //got too close had brain eaten
if(targetbrainloss <= 50)
H.adjustBrainLoss(50 - targetbrainloss) //got too close had brain eaten
if(targetdruggy <= 150)
H.adjust_drugginess(10)
H.adjust_drugginess(11)
if(targethallu <= 150)
H.hallucination += 10
H.hallucination += 11
if(4 to 5)
if(targetbrainloss <= 50)
H.adjustBrainLoss(5)
H.adjustBrainLoss(3)
if(targetdruggy <= 120)
H.adjust_drugginess(10)
H.adjust_drugginess(9)
if(targethallu <= 120)
H.hallucination += 10
H.hallucination += 9
if(6 to 7)
if(targetbrainloss <= 30)
H.adjustBrainLoss(2)
if(prob(falloff_distance) && targetdruggy <= 90)
H.adjust_drugginess(10)
H.adjust_drugginess(7)
else if(targethallu <= 90)
H.hallucination += 10
H.hallucination += 7
if(8 to 9)
if(H.getBrainLoss() <= 10)
H.adjustBrainLoss(1)
@@ -318,24 +337,23 @@
H.hallucination += 5
if(10 to INFINITY)
if(prob(falloff_distance) && targetdruggy <= 30)
H.adjust_drugginess(5)
H.adjust_drugginess(3)
else if(targethallu <= 30)
H.hallucination += 5
else //if it's a distance of 1 or they're on top of it(how'd they get on top of it???)
if(try_use_power(convert_attempt_cost))
if(is_eligible_servant(H) && try_use_power(convert_cost))
H << "<span class='sevtug'>\"Lbh ner zvar-naq-uvf, abj.\"</span>"
add_servant_of_ratvar(H)
else if(!H.stat)
if(targetbrainloss >= H.maxHealth)
H.Paralyse(5)
H << "<span class='sevtug'>[pick(convert_messages)]</span>"
H.hallucination += 3
else //if it's a distance of 1 and they can't see it/aren't adjacent or they're on top of it(how'd they get on top of it and still trigger this???)
if(targetbrainloss <= 99)
if(prob(falloff_distance))
if(prob(falloff_distance))
H << "<span class='sevtug'>[pick(compel_messages)]</span>"
else if(prob(falloff_distance))
H << "<span class='sevtug'>[pick(close_messages)]</span>"
else
H.adjustBrainLoss(100)
H.visible_message("<span class='warning'>[H] reaches out and touches [src].</span>", "<span class='sevtug'>You touch [src] involuntarily.</span>")
else
visible_message("<span class='warning'>[src]'s antennae fizzle quietly.</span>")
playsound(src, 'sound/effects/light_flicker.ogg', 50, 1)
H << "<span class='sevtug_small'>[pick(mania_messages)]</span>"
H.adjustBrainLoss(99 - targetbrainloss)
if(targetdruggy <= 200)
H.adjust_drugginess(15)
if(targethallu <= 200)
H.hallucination += 15
if(is_servant_of_ratvar(H) && (H.getBrainLoss() || H.hallucination || H.druggy)) //not an else so that newly converted servants are healed of the damage it inflicts
H.adjustBrainLoss(-H.getBrainLoss()) //heals servants of braindamage, hallucination, and druggy
@@ -170,49 +170,6 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
new object_path (get_turf(invoker))
return 1
/datum/clockwork_scripture/targeted //Accepts a name and affects that target
var/target_name //The inputted name, used to find targets
var/mob/living/target //The target mob
var/affects_servants = FALSE //If servants are valid targets
/datum/clockwork_scripture/targeted/check_special_requirements()
while(!target)
target_name = reject_bad_name(input(invoker, "Enter the actual name of a target (case-sensitive).", name), 1)
if(!target_name)
return 0
var/list/targets = find_targets()
if(targets.len)
if(targets.len == 1)
target = targets[1]
else
target = input(invoker, "Choose a target to affect.", "Target Selection") as null|anything in targets
if(!target)
return 0
if(!target.mind)
invoker << "<span class='warning'>[target] has no mind!</span>"
target = null
if(target.stat)
invoker << "<span class='warning'>[target] is dead or unconscious!</span>"
target = null
if(is_servant_of_ratvar(target) && !affects_servants)
invoker << "<span class='warning'>[target] is a servant, and [name] cannot target servants!</span>"
target = null
else
invoker << "<span class='warning'>There are no targets with that name!</span>"
return 0
return 1
/datum/clockwork_scripture/targeted/proc/find_targets()
var/list/validtargets = list()
for(var/mob/living/L in living_mob_list)
if(L.real_name == target_name)
if(is_servant_of_ratvar(L) && !affects_servants)
continue
validtargets |= L
. = validtargets
/////////////
// DRIVERS //
/////////////
@@ -817,7 +774,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
whispered = TRUE
object_path = /obj/effect/clockwork/sigil/vitality
creator_message = "<span class='brass'>A vitality matrix appears below you. It will drain life from non-servants and heal servants that cross it.</span>"
usage_tip = "To revive a servant, the sigil must have 25 vitality plus the target servant's non-oxygen damage. It will still heal dead servants if it lacks the vitality to outright revive them."
usage_tip = "To revive a servant, the sigil must have 20 vitality plus the target servant's non-oxygen damage. It will still heal dead servants if it lacks the vitality to outright revive them."
tier = SCRIPTURE_APPLICATION
one_per_tile = TRUE
@@ -887,52 +844,6 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
/datum/clockwork_scripture/targeted/justiciars_gavel //Justiciar's Gavel: Deals extreme but temporary brain damage to a target with the inputted name and knocks them out for a brief time.
descname = "Stun Designated Target"
name = "Justiciar's Gavel"
desc = "Deals massive brain damage to and knocks out a target with the inputted name. This brain damage will slowly recover itself."
invocations = list("Guvf urngura...", "...unf jebatrq lbh!")
channel_time = 40
required_components = list("belligerent_eye" = 2, "guvax_capacitor" = 2, "hierophant_ansible" = 1)
consumed_components = list("belligerent_eye" = 2, "guvax_capacitor" = 1, "hierophant_ansible" = 1)
invokers_required = 3
multiple_invokers_used = TRUE
usage_tip = "Also functions on silicon-based lifeforms, although it will not apply brain damage."
tier = SCRIPTURE_APPLICATION
/datum/clockwork_scripture/targeted/justiciars_gavel/scripture_effects()
if(!target)
return 0 //wait where'd they go
if(iscarbon(target))
if(target.null_rod_check())
var/obj/item/I = target.null_rod_check()
target.visible_message("<span class='warning'>[target]'s [I.name] glows a blazing white!</span>", "<span class='userdanger'>Your [I.name] suddenly glows with intense heat!</span>")
invoker << "<span class='userdanger'>[target] had a holy artifact and was unaffected!</span>"
playsound(target, 'sound/weapons/sear.ogg', 50, 1)
target.adjustFireLoss(10) //Still has *some* effect
return
if(iscultist(target))
target.visible_message("<span class='warning'>Blood sprays from a sudden wound on [target]'s head!</span>", \
"<span class='heavy_brass'>\"If you like wasting your own blood so much, pig, why don't you bathe in it?\"</span>\n\
<span class='userdanger'>An unbearable pain invades your mind, rupturing your head and wiping all thought.</span>")
target.apply_damage(rand(20, 30), BRUTE, "head")
else
target.visible_message("<span class='warning'>[target]'s face falls lax, their eyes dimming.</span>", \
"<span class='heavy_brass'>\"I don't think you need that brain. Not like you use it anyway.\"</span>\n\
<span class='userdanger'>A savage pain invades your mind, driving out all conscious thought.</span>")
target.adjustBrainLoss(200)
if(target.reagents)
target.reagents.add_reagent("mannitol", 25) //Enough to cure most of it but not all of it
target.Paralyse(10)
else if(issilicon(target))
target.visible_message("<span class='warning'>[target] suddenly shuts down!</span>", \
"<span class='heavy_brass'>\"NOB ZVANG-VBA! You disgust me, abomination of circuits and wires.\"</span>\n\
<span class='userdanger'>Factory reset sequence initiated by foreign signal. Entering standby mode and halting sequence.</span>")
target.Weaken(10)
return 1
/datum/clockwork_scripture/create_object/interdiction_lens //Interdiction Lens: Creates a powerful totem that disables radios and cameras and drains power into nearby sigils.
descname = "Structure, Disables Machinery"
name = "Interdiction Lens"
@@ -103,6 +103,7 @@
/obj/structure/clockwork/bullet_act(obj/item/projectile/P)
. = ..()
visible_message("<span class='danger'>[src] is hit by \a [P]!</span>")
playsound(src, P.hitsound, 50, 1)
take_damage(P.damage, P.damage_type)
/obj/structure/clockwork/proc/attack_generic(mob/user, damage = 0, damage_type = BRUTE) //used by attack_alien, attack_animal, and attack_slime
@@ -112,26 +113,30 @@
take_damage(damage, damage_type)
/obj/structure/clockwork/attack_alien(mob/living/user)
playsound(src, 'sound/weapons/bladeslice.ogg', 50, 1)
attack_generic(user, 15)
/obj/structure/clockwork/attack_animal(mob/living/simple_animal/M)
if(!M.melee_damage_upper)
return
playsound(src, 'sound/weapons/Genhit.ogg', 50, 1)
attack_generic(M, M.melee_damage_upper, M.melee_damage_type)
/obj/structure/clockwork/attack_slime(mob/living/simple_animal/slime/user)
if(!user.is_adult)
return
playsound(src, 'sound/weapons/Genhit.ogg', 50, 1)
attack_generic(user, rand(10, 15))
/obj/structure/clockwork/attacked_by(obj/item/I, mob/living/user)
. = ..()
if(I.force && takes_damage)
take_damage(I.force, I.damtype)
playsound(src, I.hitsound, 50, 1)
take_damage(I.force, I.damtype)
/obj/structure/clockwork/mech_melee_attack(obj/mecha/M)
if(..())
playsound(src, 'sound/weapons/punch4.ogg', 50, 1)
take_damage(M.force, M.damtype)
/obj/structure/clockwork/cache //Tinkerer's cache: Stores components for later use.
@@ -860,8 +865,9 @@
affects_servants = TRUE
stat_affected = DEAD
var/vitality = 0
var/base_revive_cost = 25
var/base_revive_cost = 20
var/sigil_active = FALSE
var/animation_number = 3 //each cycle increments this by 1, at 4 it produces an animation and resets
/obj/effect/clockwork/sigil/vitality/examine(mob/user)
..()
@@ -878,9 +884,12 @@
sigil_active = TRUE
//as long as they're still on the sigil and are either not a servant or they're a servant AND it has remaining vitality
while(L && (!is_servant_of_ratvar(L) && L.stat != DEAD || (is_servant_of_ratvar(L) && vitality)) && get_turf(L) == get_turf(src))
PoolOrNew(/obj/effect/overlay/temp/ratvar/sigil/vitality, get_turf(src))
if(animation_number >= 4)
PoolOrNew(/obj/effect/overlay/temp/ratvar/sigil/vitality, get_turf(src))
animation_number = 0
animation_number++
if(!is_servant_of_ratvar(L))
var/vitality_drained = L.adjustToxLoss(4)
var/vitality_drained = L.adjustToxLoss(1.5)
if(vitality_drained)
vitality += vitality_drained
else
@@ -894,14 +903,20 @@
var/total_damage = clone_to_heal + tox_to_heal + burn_to_heal + brute_to_heal + oxy_to_heal
if(L.stat == DEAD)
var/revival_cost = base_revive_cost + total_damage - oxy_to_heal //ignores oxygen damage
if(vitality >= revival_cost)
L.revive(1, 1)
L.visible_message("<span class='warning'>[L] suddenly gets back up, their mouth dripping blue ichor!</span>", "<span class='inathneq'>\"Lbh jvyy or bxnl, puvyq.\"</span>")
vitality -= revival_cost
var/mob/dead/observer/ghost = L.get_ghost(TRUE)
if(ghost)
if(vitality >= revival_cost)
ghost.reenter_corpse()
L.revive(1, 1)
playsound(L, 'sound/magic/Staff_Healing.ogg', 50, 1)
L.visible_message("<span class='warning'>[L] suddenly gets back up, their mouth dripping blue ichor!</span>", "<span class='inathneq'>\"Lbh jvyy or bxnl, puvyq.\"</span>")
vitality -= revival_cost
break
else
break
if(!total_damage)
break
var/vitality_for_cycle = min(vitality, 8)
var/vitality_for_cycle = min(vitality, 3)
if(clone_to_heal && vitality_for_cycle)
var/healing = min(vitality_for_cycle, clone_to_heal)
@@ -932,8 +947,9 @@
vitality_for_cycle -= healing
L.adjustOxyLoss(-healing)
vitality -= healing
sleep(8)
sleep(2)
animation_number = initial(animation_number)
sigil_active = FALSE
animate(src, alpha = initial(alpha), time = 20)
visible_message("<span class='warning'>[src] slowly stops glowing!</span>")
@@ -88,14 +88,14 @@
if(servants >= 5 && clockwork_caches)
return 1 //5 or more non-brain servants and any number of clockwork caches
if(SCRIPTURE_APPLICATION)
if(servants >= 8 && clockwork_caches >= 3 && clockwork_construction_value >= 50)
return 1 //8 or more non-brain servants, 3+ clockwork caches, and at least 50 CV
if(servants >= 8 && clockwork_caches >= 3 && clockwork_construction_value >= 75)
return 1 //8 or more non-brain servants, 3+ clockwork caches, and at least 75 CV
if(SCRIPTURE_REVENANT)
if(servants >= 10 && clockwork_caches >= 3 && clockwork_construction_value >= 100)
return 1 //10 or more non-brain servants, 3+ clockwork caches, and at least 100 CV
if(servants >= 10 && clockwork_caches >= 4 && clockwork_construction_value >= 150)
return 1 //10 or more non-brain servants, 4+ clockwork caches, and at least 150 CV
if(SCRIPTURE_JUDGEMENT)
if(servants >= 10 && clockwork_caches >= 3 && clockwork_construction_value >= 100 && !unconverted_ai_exists)
return 1 //10 or more non-brain servants, 3+ clockwork caches, at least 100 CV, and there are no living, non-servant ais
if(servants >= 12 && clockwork_caches >= 5 && clockwork_construction_value >= 250 && !unconverted_ai_exists)
return 1 //12 or more non-brain servants, 5+ clockwork caches, at least 250 CV, and there are no living, non-servant ais
return 0
/proc/generate_cache_component(specific_component_id) //generates a component in the global component cache, either random based on lowest or a specific component
@@ -101,6 +101,7 @@
del_on_death = 1
deathmessage = "explodes with a sharp pop!"
var/resources = 0 //Resource points, generated by consuming metal/glass
var/max_resources = 100
/mob/living/simple_animal/hostile/swarmer/Login()
..()
@@ -279,6 +280,12 @@
/obj/machinery/droneDispenser/swarmer/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
S << "<span class='warning'>This object is receiving unactivated swarmer shells to help us. Aborting.</span>"
/obj/item/device/unactivated_swarmer/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
if(S.resources + 50 > S.max_resources)
S << "<span class='warning'>We have too many resources to reconsume this shell. Aborting.</span>"
else
..()
S.resources += 49 //refund the whole thing
////END CTRL CLICK FOR SWARMERS////
@@ -294,7 +301,7 @@
return 1
/mob/living/simple_animal/hostile/swarmer/proc/Integrate(var/obj/item/target)
if(resources >= 100)
if(resources >= max_resources)
src << "<span class='warning'>We cannot hold more materials!</span>"
return
if((target.materials[MAT_METAL]) || (target.materials[MAT_GLASS]))
+16 -12
View File
@@ -462,18 +462,22 @@ This is here to make the tiles around the station mininuke change when it's arme
log_game("[src] has been moved out of bounds in ([diskturf ? "[diskturf.x], [diskturf.y] ,[diskturf.z]":"nonexistent location"]). Moving it to ([targetturf.x], [targetturf.y], [targetturf.z]).")
/obj/item/weapon/disk/nuclear/proc/relocate()
if(blobstart.len > 0)
var/turf/targetturf = get_turf(pick(blobstart))
if(ismob(loc))
var/mob/M = loc
M.remove_from_mob(src)
if(istype(loc, /obj/item/weapon/storage))
var/obj/item/weapon/storage/S = loc
S.remove_from_storage(src, targetturf)
forceMove(targetturf) //move the disc, so ghosts remain orbitting it even if it's "destroyed"
return targetturf
else
throw EXCEPTION("Unable to find a blobstart landmark")
var/targetturf = find_safe_turf(ZLEVEL_STATION)
if(!targetturf)
if(blobstart.len > 0)
targetturf = get_turf(pick(blobstart))
else
throw EXCEPTION("Unable to find a blobstart landmark")
if(ismob(loc))
var/mob/M = loc
M.remove_from_mob(src)
if(istype(loc, /obj/item/weapon/storage))
var/obj/item/weapon/storage/S = loc
S.remove_from_storage(src, targetturf)
// move the disc, so ghosts remain orbiting it even if it's "destroyed"
forceMove(targetturf)
return targetturf
/obj/item/weapon/disk/nuclear/Destroy(force)
var/turf/diskturf = get_turf(src)
@@ -270,7 +270,9 @@
/obj/item/weapon/circuitboard/computer/prisoner
name = "circuit board (Prisoner Management Console)"
build_path = /obj/machinery/computer/prisoner
/obj/item/weapon/circuitboard/computer/gulag_teleporter_console
name = "circuit board (Labor Camp teleporter console)"
build_path = /obj/machinery/computer/gulag_teleporter_computer
/obj/item/weapon/circuitboard/computer/rdconsole
name = "circuit board (RD Console)"
@@ -0,0 +1,164 @@
//computer that handle the points and teleports the prisoner
/obj/machinery/computer/gulag_teleporter_computer
name = "labor camp teleporter console"
desc = "Used to send criminals to the Labor Camp"
icon_screen = "explosive"
icon_keyboard = "security_key"
req_access = list(access_security)
circuit = /obj/item/weapon/circuitboard/computer/gulag_teleporter_console
var/default_goal = 200
var/obj/item/weapon/card/id/prisoner/id = null
var/obj/machinery/gulag_teleporter/teleporter = null
var/obj/structure/gulag_beacon/beacon = null
var/mob/living/carbon/human/prisoner = null
var/datum/data/record/temporary_record = null
/obj/machinery/computer/gulag_teleporter_computer/New()
..()
addtimer(src, "scan_machinery", 5)
/obj/machinery/computer/gulag_teleporter_computer/Destroy()
if(id)
id.forceMove(get_turf(src))
return ..()
/obj/machinery/computer/gulag_teleporter_computer/attackby(obj/item/W, mob/user)
if(istype(W, /obj/item/weapon/card/id/prisoner))
if(!id)
if(!user.drop_item())
return
W.forceMove(src)
id = W
user << "<span class='notice'>You insert [W].</span>"
return
else
user << "<span class='notice'>There's an ID inserted already.</span>"
return ..()
/obj/machinery/computer/gulag_teleporter_computer/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, \
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, "gulag_console", name, 455, 440, master_ui, state)
ui.open()
/obj/machinery/computer/gulag_teleporter_computer/ui_data(mob/user)
var/list/data = list()
var/list/prisoner_list = list()
var/can_teleport = FALSE
if(teleporter && (teleporter.occupant && ishuman(teleporter.occupant)))
prisoner = teleporter.occupant
prisoner_list["name"] = prisoner.real_name
if(id)
can_teleport = TRUE
if(!isnull(data_core.general))
for(var/r in data_core.security)
var/datum/data/record/R = r
if(R.fields["name"] == prisoner_list["name"])
temporary_record = R
prisoner_list["crimstat"] = temporary_record.fields["criminal"]
data["prisoner"] = prisoner_list
if(teleporter)
data["teleporter"] = teleporter
data["teleporter_location"] = "([teleporter.x], [teleporter.y], [teleporter.z])"
data["teleporter_lock"] = teleporter.locked
data["teleporter_state_open"] = teleporter.state_open
if(beacon)
data["beacon"] = beacon
data["beacon_location"] = "([beacon.x], [beacon.y], [beacon.z])"
if(id)
data["id"] = id
data["id_name"] = id.registered_name
data["goal"] = id.goal
data["can_teleport"] = can_teleport
return data
/obj/machinery/computer/gulag_teleporter_computer/ui_act(action, list/params)
if(..())
return
if(!allowed(usr))
usr << "<span class='warning'>Access denied.</span>"
return
switch(action)
if("scan_teleporter")
teleporter = findteleporter()
if("scan_beacon")
beacon = findbeacon()
if("handle_id")
if(id)
if(!usr.get_active_hand())
usr.put_in_hands(id)
id = null
else
id.forceMove(get_turf(src))
id = null
else
var/obj/item/I = usr.get_active_hand()
if(istype(I, /obj/item/weapon/card/id/prisoner))
if(!usr.drop_item())
return
I.forceMove(src)
id = I
if("set_goal")
var/new_goal = input("Set the amount of points:", "Points", id.goal) as num|null
if(!isnum(new_goal))
return
if(!new_goal)
new_goal = default_goal
id.goal = Clamp(new_goal, 0, 1000) //maximum 1000 points
if("toggle_open")
if(teleporter.locked)
usr << "The teleporter is locked"
return
teleporter.toggle_open()
if("teleporter_lock")
if(teleporter.state_open)
usr << "Close the teleporter before locking!"
return
teleporter.locked = !teleporter.locked
if("teleport")
if(!teleporter || !beacon)
return
addtimer(src, "teleport", 5, FALSE, usr)
/obj/machinery/computer/gulag_teleporter_computer/proc/scan_machinery()
teleporter = findteleporter()
beacon = findbeacon()
/obj/machinery/computer/gulag_teleporter_computer/proc/findteleporter()
var/obj/machinery/gulag_teleporter/teleporterf = null
for(dir in cardinal)
teleporterf = locate(/obj/machinery/gulag_teleporter, get_step(src, dir))
if(teleporterf && teleporterf.is_operational())
return teleporterf
/obj/machinery/computer/gulag_teleporter_computer/proc/findbeacon()
return locate(/obj/structure/gulag_beacon)
/obj/machinery/computer/gulag_teleporter_computer/proc/teleport(mob/user)
log_game("[user]([user.ckey] teleported [prisoner]([prisoner.ckey]) to the Labor Camp ([beacon.x], [beacon.y], [beacon.z]) for [id.goal] points.")
teleporter.handle_prisoner(id, temporary_record)
playsound(loc, "sound/weapons/emitter.ogg", 50, 1)
prisoner.forceMove(beacon)
prisoner.Weaken(2) // small travel dizziness
prisoner << "<span class='warning'>The teleportation makes you a little dizzy.</span>"
PoolOrNew(/obj/effect/particle_effect/sparks, prisoner.loc)
playsound(src.loc, "sparks", 50, 1)
if(teleporter.locked)
teleporter.locked = FALSE
teleporter.toggle_open()
id = null
temporary_record = null
+108
View File
@@ -0,0 +1,108 @@
/obj/machinery/gulag_item_reclaimer
name = "equipment reclaimer station"
desc = "Used to reclaim your items after you finish your sentence at the labor camp"
icon = 'icons/obj/terminals.dmi'
icon_state = "dorm_taken"
req_access = list(access_security) //reqaccess to access all stored items
density = 0
anchored = 1
use_power = 1
idle_power_usage = 100
active_power_usage = 2500
var/list/stored_items = list()
var/obj/item/weapon/card/id/prisoner/inserted_id = null
var/obj/machinery/gulag_teleporter/linked_teleporter = null
/obj/machinery/gulag_item_reclaimer/Destroy()
for(var/i in contents)
var/obj/item/I = i
I.forceMove(get_turf(src))
if(linked_teleporter)
linked_teleporter.linked_reclaimer = null
if(inserted_id)
inserted_id.forceMove(get_turf(src))
inserted_id = null
return ..()
/obj/machinery/gulag_item_reclaimer/emag_act(mob/user)
if(!emagged) // emagging lets anyone reclaim all the items
req_access = list()
emagged = 1
/obj/machinery/gulag_item_reclaimer/attackby(obj/item/I, mob/user)
if(istype(I, /obj/item/weapon/card/id/prisoner))
if(!inserted_id)
if(!user.drop_item())
return
I.forceMove(src)
inserted_id = I
user << "<span class='notice'>You insert [I].</span>"
return
else
user << "<span class='notice'>There's an ID inserted already.</span>"
return ..()
/obj/machinery/gulag_item_reclaimer/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, \
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, "gulag_item_reclaimer", name, 455, 440, master_ui, state)
ui.open()
/obj/machinery/gulag_item_reclaimer/ui_data(mob/user)
var/list/data = list()
var/can_reclaim = FALSE
if(inserted_id)
data["id"] = inserted_id
data["id"]["name"] = inserted_id.registered_name
if(inserted_id.points >= inserted_id.goal || allowed(user))
can_reclaim = TRUE
var/list/mobs = list()
for(var/i in stored_items)
var/mob/thismob = i
var/list/mob_info = list()
mob_info["name"] = thismob.real_name
mob_info["mob"] = "\ref[thismob]"
mobs += list(mob_info)
data["mobs"] = mobs
data["can_reclaim"] = can_reclaim
return data
/obj/machinery/gulag_item_reclaimer/ui_act(action, list/params)
switch(action)
if("handle_id")
if(inserted_id)
if(!usr.get_active_hand())
usr.put_in_hands(inserted_id)
inserted_id = null
else
inserted_id.forceMove(get_turf(src))
inserted_id = null
else
var/obj/item/I = usr.get_active_hand()
if(istype(I, /obj/item/weapon/card/id/prisoner))
if(!usr.drop_item())
return
I.forceMove(src)
inserted_id = I
if("release_items")
var/mob/M = locate(params["mobref"])
if(M == usr || allowed(usr))
drop_items(M)
else
usr << "Access denied."
/obj/machinery/gulag_item_reclaimer/proc/drop_items(mob/user)
if(!stored_items[user])
return
for(var/i in stored_items[user])
var/obj/item/W = i
stored_items[user] -= W
W.forceMove(get_turf(src))
stored_items -= user
+173
View File
@@ -0,0 +1,173 @@
/*
The gulag teleporter teleports a prisoner to the gulag outpost.
It automatically strips the prisoner and equips a prisoner ID, prisoner jumpsuit and oranges sneakers.
You can set the amount of points in the console
The console is located at computer/gulag_teleporter.dm
*/
//Gulag teleporter
/obj/machinery/gulag_teleporter
name = "labor camp teleporter"
desc = "A bluespace teleporter used for teleporting prisoners to the labor camp."
icon = 'icons/obj/machines/implantchair.dmi'
icon_state = "implantchair"
state_open = 0
density = 1
anchored = 1
use_power = 1
idle_power_usage = 200
active_power_usage = 5000
var/locked = FALSE
var/jumpsuit_type = /obj/item/clothing/under/rank/prisoner
var/shoes_type = /obj/item/clothing/shoes/sneakers/orange
var/obj/machinery/gulag_item_reclaimer/linked_reclaimer = null
/obj/machinery/gulag_teleporter/New()
..()
var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/gulag_teleporter(null)
B.apply_default_parts(src)
addtimer(src, "locate_reclaimer", 5)
/obj/machinery/gulag_teleporter/Destroy()
if(linked_reclaimer)
linked_reclaimer.linked_teleporter = null
return ..()
/obj/machinery/gulag_teleporter/power_change()
..()
update_icon()
/obj/machinery/gulag_teleporter/interact(mob/user)
if(locked)
user << "[src] is locked."
return
toggle_open()
/obj/machinery/gulag_teleporter/updateUsrDialog()
return
/obj/machinery/gulag_teleporter/attackby(obj/item/I, mob/user)
if(!occupant && default_deconstruction_screwdriver(user, "[icon_state]", "[icon_state]",I))
update_icon()
return
if(default_deconstruction_crowbar(I))
return
if(default_pry_open(I))
return
return ..()
/obj/machinery/gulag_teleporter/update_icon()
icon_state = initial(icon_state) + (state_open ? "_open" : "")
//no power or maintenance
if(stat & (NOPOWER|BROKEN))
icon_state += "_unpowered"
if((stat & MAINT) || panel_open)
icon_state += "_maintenance"
return
if((stat & MAINT) || panel_open)
icon_state += "_maintenance"
return
//running and someone in there
if(occupant)
icon_state += "_occupied"
return
/obj/machinery/gulag_teleporter/relaymove(mob/user)
if(user.stat != CONSCIOUS)
return
if(locked)
user << "[src] is locked!"
return
open_machine()
/obj/machinery/gulag_teleporter/container_resist(mob/living/user)
var/breakout_time = 600
if(!locked)
open_machine()
return
user.changeNext_move(CLICK_CD_BREAKOUT)
user.last_special = world.time + CLICK_CD_BREAKOUT
user << "<span class='notice'>You lean on the back of [src] and start pushing the door open... (this will take about a minute.)</span>"
user.visible_message("<span class='italics'>You hear a metallic creaking from [src]!</span>")
if(do_after(user,(breakout_time), target = src))
if(!user || user.stat != CONSCIOUS || user.loc != src || state_open || !locked)
return
locked = FALSE
visible_message("<span class='warning'>[user] successfully broke out of [src]!</span>")
user << "<span class='notice'>You successfully break out of [src]!</span>"
open_machine()
/obj/machinery/gulag_teleporter/proc/locate_reclaimer()
linked_reclaimer = locate(/obj/machinery/gulag_item_reclaimer)
if(linked_reclaimer)
linked_reclaimer.linked_teleporter = src
/obj/machinery/gulag_teleporter/proc/toggle_open()
if(panel_open)
usr << "<span class='notice'>Close the maintenance panel first.</span>"
return
if(state_open)
close_machine()
return
if(!locked)
open_machine()
// strips and stores all occupant's items
/obj/machinery/gulag_teleporter/proc/strip_occupant()
if(linked_reclaimer)
linked_reclaimer.stored_items[occupant] = list()
for(var/obj/item/W in occupant)
if(occupant.unEquip(W))
if(istype(W, /obj/item/weapon/restraints/handcuffs))
W.forceMove(get_turf(src))
continue
if(istype(W, /obj/item/weapon/implant/storage))
continue
if(linked_reclaimer)
linked_reclaimer.stored_items[occupant] += W
linked_reclaimer.contents += W
W.forceMove(linked_reclaimer)
else
W.forceMove(src)
/obj/machinery/gulag_teleporter/proc/handle_prisoner(obj/item/id, datum/data/record/R)
if(!ishuman(occupant))
return
strip_occupant()
var/mob/living/carbon/human/prisoner = occupant
if(jumpsuit_type)
prisoner.equip_to_appropriate_slot(new jumpsuit_type)
if(shoes_type)
prisoner.equip_to_appropriate_slot(new shoes_type)
if(id)
prisoner.equip_to_appropriate_slot(id)
if(R)
R.fields["criminal"] = "Incarcerated"
/obj/item/weapon/circuitboard/machine/gulag_teleporter
name = "circuit board (labor camp teleporter)"
build_path = /obj/machinery/gulag_teleporter
origin_tech = "programming=3;engineering=4;bluespace=4;materials=4"
req_components = list(
/obj/item/weapon/ore/bluespace_crystal = 2,
/obj/item/weapon/stock_parts/scanning_module,
/obj/item/weapon/stock_parts/manipulator)
def_components = list(/obj/item/weapon/ore/bluespace_crystal = /obj/item/weapon/ore/bluespace_crystal/artificial)
/* beacon that receives the teleported prisoner */
/obj/structure/gulag_beacon
name = "labor camp bluespace beacon"
desc = "A recieving beacon for bluespace teleportations."
icon = 'icons/turf/floors.dmi'
icon_state = "light_on-w"
+1 -1
View File
@@ -818,7 +818,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
icon_deny = "sec-deny"
req_access_txt = "1"
products = list(/obj/item/weapon/restraints/handcuffs = 8,/obj/item/weapon/restraints/handcuffs/cable/zipties = 10,/obj/item/weapon/grenade/flashbang = 4,/obj/item/device/assembly/flash/handheld = 5,
/obj/item/weapon/reagent_containers/food/snacks/donut = 12,/obj/item/weapon/storage/box/evidence = 6,/obj/item/device/flashlight/seclite = 4)
/obj/item/weapon/reagent_containers/food/snacks/donut = 12,/obj/item/weapon/storage/box/evidence = 6,/obj/item/device/flashlight/seclite = 4,/obj/item/weapon/restraints/legcuffs/bola/energy = 7)
contraband = list(/obj/item/clothing/glasses/sunglasses = 2,/obj/item/weapon/storage/fancy/donut_box = 2)
premium = list(/obj/item/weapon/coin/antagtoken = 1)
+2 -8
View File
@@ -32,18 +32,12 @@
return QDEL_HINT_PUTINPOOL
/obj/effect/overlay/temp/New()
..()
if(randomdir)
setDir(pick(cardinal))
flick("[icon_state]", src) //Because we might be pulling it from a pool, flick whatever icon it uses so it starts at the start of the icon's animation.
// Because some people are sticklers for animation accuracy, we use
// spawn() if it's not a multiple of 2 deciseconds, which is the timer
// ss accuracy
if(duration % 2) //ODD
spawn(duration)
qdel(src)
else //EVEN
QDEL_IN(src, duration)
QDEL_IN(src, duration)
/obj/effect/overlay/temp/bloodsplatter
icon = 'icons/effects/blood.dmi'
@@ -338,3 +338,18 @@
breakouttime = 70
origin_tech = "engineering=4;combat=3"
weaken = 1
/obj/item/weapon/restraints/legcuffs/bola/energy //For Security
name = "energy bola"
desc = "A specialized hard-light bola designed to ensnare fleeing criminals and aid in arrests."
icon_state = "ebola"
hitsound = 'sound/weapons/taserhit.ogg'
w_class = 2
breakouttime = 60
/obj/item/weapon/restraints/legcuffs/bola/energy/throw_impact(atom/hit_atom)
if(iscarbon(hit_atom))
var/obj/item/weapon/restraints/legcuffs/beartrap/B = new /obj/item/weapon/restraints/legcuffs/beartrap/energy/cyborg(get_turf(hit_atom))
B.Crossed(hit_atom)
qdel(src)
..()
@@ -129,7 +129,8 @@
/obj/item/device/flashlight/seclite,
/obj/item/weapon/melee/classic_baton/telescopic,
/obj/item/device/radio,
/obj/item/clothing/gloves/
/obj/item/clothing/gloves/,
/obj/item/weapon/restraints/legcuffs/bola
)
/obj/item/weapon/storage/belt/security/full/New()
+2 -1
View File
@@ -10,7 +10,7 @@
/obj/structure/mirror/attack_hand(mob/user)
if(shattered)
if(shattered || !Adjacent(user))
return
if(ishuman(user))
@@ -45,6 +45,7 @@
icon_state = "mirror_broke"
playsound(src, "shatter", 70, 1)
desc = "Oh no, seven years of bad luck!"
shattered = 1
/obj/structure/mirror/bullet_act(obj/item/projectile/P)
+43 -1
View File
@@ -1,3 +1,6 @@
#define SHOWCASE_CONSTRUCTED 1
#define SHOWCASE_SCREWDRIVERED 2
/*Completely generic structures for use by mappers to create fake objects, i.e. display rooms*/
/obj/structure/showcase
name = "showcase"
@@ -6,6 +9,7 @@
desc = "A stand with the empty body of a cyborg bolted to it."
density = 1
anchored = 1
var/deconstruction_state = SHOWCASE_CONSTRUCTED
/obj/structure/showcase/fakeid
name = "\improper Centcom identification console"
@@ -31,4 +35,42 @@
name = "horrific experiment"
desc = "Some sort of pod filled with blood and viscera. You swear you can see it moving..."
icon = 'icons/obj/cloning.dmi'
icon_state = "pod_g"
icon_state = "pod_g"
//Deconstructing
//Showcases can be any sprite, so it makes sense that they can't be constructed.
//However if a player wants to move an existing showcase or remove one, this is for that.
/obj/structure/showcase/attackby(obj/item/W, mob/user)
if(istype(W, /obj/item/weapon/screwdriver) && !anchored)
if(deconstruction_state == SHOWCASE_SCREWDRIVERED)
user << "<span class='notice'>You screw the screws back into the showcase.</span>"
playsound(loc, 'sound/items/Screwdriver.ogg', 100, 1)
deconstruction_state = SHOWCASE_CONSTRUCTED
else if (deconstruction_state == SHOWCASE_CONSTRUCTED)
user << "<span class='notice'>You unscrew the screws.</span>"
playsound(loc, 'sound/items/Screwdriver.ogg', 100, 1)
deconstruction_state = SHOWCASE_SCREWDRIVERED
if(istype(W, /obj/item/weapon/crowbar) && deconstruction_state == SHOWCASE_SCREWDRIVERED)
if(do_after(user, 20/W.toolspeed, target = src))
playsound(loc, 'sound/items/Crowbar.ogg', 100, 1)
user << "<span class='notice'>You start to crowbar the showcase apart...</span>"
new /obj/item/stack/sheet/metal (get_turf(src), 4)
qdel(src)
if(deconstruction_state == SHOWCASE_CONSTRUCTED && default_unfasten_wrench(user, W))
return
//Feedback is given in examine because showcases can basically have any sprite assigned to them
/obj/structure/showcase/examine(mob/user)
..()
switch(deconstruction_state)
if(SHOWCASE_CONSTRUCTED)
user << "The showcase is fully constructed."
if(SHOWCASE_SCREWDRIVERED)
user << "The showcase has its screws loosened."
else
user << "If you see this, something is wrong."
+11 -1
View File
@@ -6,4 +6,14 @@
/turf/closed/mineral/random/labormineral/New()
icon_state = "rock"
..()
..()
/turf/closed/mineral/random/labormineral/volcanic
environment_type = "basalt"
turf_type = /turf/open/floor/plating/asteroid/basalt/lava_land_surface
baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
initial_gas_mix = "o2=14;n2=23;TEMP=300"
defer_change = 1
mineralSpawnChanceList = list(
/turf/closed/mineral/iron/volcanic = 100, /turf/closed/mineral/uranium/volcanic = 1, /turf/closed/mineral/diamond/volcanic = 1,
/turf/closed/mineral/gold/volcanic = 1, /turf/closed/mineral/silver/volcanic = 1, /turf/closed/mineral/plasma/volcanic = 1)
+99 -105
View File
@@ -7,7 +7,7 @@
icon_state = "console"
density = 0
anchored = 1
var/obj/machinery/mineral/stacking_machine/laborstacker/machine = null
var/obj/machinery/mineral/stacking_machine/laborstacker/stacking_machine = null
var/machinedir = SOUTH
var/obj/item/weapon/card/id/prisoner/inserted_id
var/obj/machinery/door/airlock/release_door
@@ -19,50 +19,106 @@
..()
Radio = new/obj/item/device/radio(src)
Radio.listening = 0
spawn(7)
src.machine = locate(/obj/machinery/mineral/stacking_machine, get_step(src, machinedir))
var/t
for(var/obj/machinery/door/airlock/d in range(5,src))
t = d.id_tag
if(t == src.door_tag)
src.release_door = d
if (machine && release_door)
machine.CONSOLE = src
else
qdel(src)
/obj/machinery/mineral/labor_claim_console/proc/check_auth()
if(emagged) return 1 //Shuttle is emagged, let any ol' person through
return (istype(inserted_id) && inserted_id.points >= inserted_id.goal) //Otherwise, only let them out if the prisoner's reached his quota.
/obj/machinery/mineral/labor_claim_console/attack_hand(mob/user)
var/dat
dat += text("<b>Point Claim Console</b><br><br>")
if(emagged) //Shit's broken
dat += text("<b>QU&#t0A In%aL*D</b><br>")
else if(istype(inserted_id)) //There's an ID in there.
dat += text("ID: [inserted_id.registered_name] <A href='?src=\ref[src];choice=eject'>Eject ID.</A><br>")
dat += text("Points Collected:[inserted_id.points]<br>")
dat += text("Point Quota: [inserted_id.goal] - Reach your quota to earn your release<br>")
dat += text("Unclaimed Collection Points: [machine.points]. <A href='?src=\ref[src];choice=claim'>Claim points.</A><br>")
else //No ID in sight. Complain about it.
dat += text("No ID inserted. <A href='?src=\ref[src];choice=insert'>Insert ID.</A><br>")
if(check_auth())
dat += text("<A href='?src=\ref[src];choice=station'>Proceed to Station.</A><br>")
dat += text("<A href='?src=\ref[src];choice=release'>Open release door.</A><br>")
if(machine)
dat += text("<HR><b>Mineral Value List:</b><BR>[machine.get_ore_values()]")
user << browse("[dat]", "window=console_stacking_machine")
addtimer(src, "locate_stacking_machine", 7)
/obj/machinery/mineral/labor_claim_console/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/weapon/card/id))
return attack_hand(user)
if(istype(I, /obj/item/weapon/card/id/prisoner))
if(!inserted_id)
if(!user.drop_item())
return
I.forceMove(src)
inserted_id = I
user << "<span class='notice'>You insert [I].</span>"
return
else
user << "<span class='notice'>There's an ID inserted already.</span>"
return ..()
/obj/machinery/mineral/labor_claim_console/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, \
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, "labor_claim_console", name, 450, 475, master_ui, state)
ui.open()
/obj/machinery/mineral/labor_claim_console/ui_data(mob/user)
var/list/data = list()
var/can_go_home = FALSE
data["emagged"] = emagged
if(inserted_id)
data["id"] = inserted_id
data["id_name"] = inserted_id.registered_name
data["points"] = inserted_id.points
data["goal"] = inserted_id.goal
if(check_auth())
can_go_home = TRUE
var/list/ores = list()
if(stacking_machine)
data["unclaimed_points"] = stacking_machine.points
for(var/ore in stacking_machine.ore_values)
var/list/O = list()
O["ore"] = ore
O["value"] = stacking_machine.ore_values[ore]
ores += list(O)
data["ores"] = ores
data["can_go_home"] = can_go_home
return data
/obj/machinery/mineral/labor_claim_console/ui_act(action, params)
if(..())
return
switch(action)
if("handle_id")
if(inserted_id)
if(!usr.get_active_hand())
usr.put_in_hands(inserted_id)
inserted_id = null
else
inserted_id.forceMove(get_turf(src))
inserted_id = null
else
var/obj/item/I = usr.get_active_hand()
if(istype(I, /obj/item/weapon/card/id/prisoner))
if(!usr.drop_item())
return
I.forceMove(src)
inserted_id = I
if("claim_points")
inserted_id.points += stacking_machine.points
stacking_machine.points = 0
usr << "Points transferred."
if("move_shuttle")
if(!alone_in_area(get_area(src), usr))
usr << "<span class='warning'>Prisoners are only allowed to be released while alone.</span>"
else
switch(SSshuttle.moveShuttle("laborcamp","laborcamp_home"))
if(1)
usr << "<span class='notice'>Shuttle not found</span>"
if(2)
usr << "<span class='notice'>Shuttle already at station</span>"
if(3)
usr << "<span class='notice'>No permission to dock could be granted.</span>"
else
if(!emagged)
Radio.set_frequency(SEC_FREQ)
Radio.talk_into(src, "[inserted_id.registered_name] has returned to the station. Minerals and Prisoner ID card ready for retrieval.", SEC_FREQ)
usr << "<span class='notice'>Shuttle received message and will be sent shortly.</span>"
/obj/machinery/mineral/labor_claim_console/proc/check_auth()
if(emagged)
return 1 //Shuttle is emagged, let any ol' person through
return (istype(inserted_id) && inserted_id.points >= inserted_id.goal) //Otherwise, only let them out if the prisoner's reached his quota.
/obj/machinery/mineral/labor_claim_console/proc/locate_stacking_machine()
stacking_machine = locate(/obj/machinery/mineral/stacking_machine, get_step(src, machinedir))
if(stacking_machine)
stacking_machine.CONSOLE = src
else
return ..()
qdel(src)
/obj/machinery/mineral/labor_claim_console/emag_act(mob/user)
if(!emagged)
@@ -70,74 +126,12 @@
user << "<span class='warning'>PZZTTPFFFT</span>"
/obj/machinery/mineral/labor_claim_console/Topic(href, href_list)
usr.set_machine(src)
src.add_fingerprint(usr)
if(href_list["choice"])
if(istype(inserted_id)) //Sanity check against href spoofs
if(href_list["choice"] == "eject")
inserted_id.loc = loc
inserted_id.verb_pickup()
inserted_id = null
if(href_list["choice"] == "claim")
inserted_id.points += machine.points
machine.points = 0
src << "Points transferred."
else if(href_list["choice"] == "insert")
var/obj/item/weapon/card/id/prisoner/I = usr.get_active_hand()
if(istype(I))
if(!usr.drop_item())
return
I.loc = src
inserted_id = I
else usr << "<span class='warning'>Invalid ID.</span>"
if(check_auth()) //Sanity check against hef spoofs
if(href_list["choice"] == "station")
if(!alone_in_area(get_area(src), usr))
usr << "<span class='warning'>Prisoners are only allowed to be released while alone.</span>"
else
switch(SSshuttle.moveShuttle("laborcamp","laborcamp_home"))
if(1)
usr << "<span class='notice'>Shuttle not found</span>"
if(2)
usr << "<span class='notice'>Shuttle already at station</span>"
if(3)
usr << "<span class='notice'>No permission to dock could be granted.</span>"
else
Radio.set_frequency(SEC_FREQ)
Radio.talk_into(src, "[inserted_id.registered_name] has returned to the station. Minerals and Prisoner ID card ready for retrieval.", SEC_FREQ)
usr << "<span class='notice'>Shuttle received message and will be sent shortly.</span>"
if(href_list["choice"] == "release")
if(alone_in_area(get_area(loc), usr))
var/obj/docking_port/stationary/S = SSshuttle.getDock("laborcamp_home")
if(S && S.get_docked())
if(release_door && release_door.density)
release_door.open()
else
usr << "<span class='warning'>Prisoners can only be released while docked with the station.</span>"
else
usr << "<span class='warning'>Prisoners are only allowed to be released while alone.</span>"
src.updateUsrDialog()
return
/**********************Prisoner Collection Unit**************************/
/obj/machinery/mineral/stacking_machine/laborstacker
var/points = 0 //The unclaimed value of ore stacked. Value for each ore loosely relative to its rarity.
var/list/ore_values = list(("glass" = 1), ("metal" = 2), ("solid plasma" = 20), ("plasteel" = 23), ("reinforced glass" = 4), ("gold" = 20), ("silver" = 20), ("uranium" = 20), ("diamond" = 25), ("bananium" = 50))
/obj/machinery/mineral/stacking_machine/laborstacker/proc/get_ore_values()
var/dat = "<table border='0' width='200'>"
for(var/ore in ore_values)
var/value = ore_values[ore]
dat += "<tr><td>[capitalize(ore)]</td><td>[value]</td></tr>"
dat += "</table>"
return dat
var/list/ore_values = list("glass" = 1, "metal" = 2, "solid plasma" = 20, "plasteel" = 23, "reinforced glass" = 4, "gold" = 20, "silver" = 20, "uranium" = 20, "diamond" = 25, "bananium" = 50)
/obj/machinery/mineral/stacking_machine/laborstacker/process_sheet(obj/item/stack/sheet/inp)
if(istype(inp))
@@ -27,3 +27,6 @@
/area/lavaland/surface/outdoors
name = "Lavaland Wastes"
outdoors = 1
/area/lavaland/surface/outdoors/explored
name = "Lavaland Labor Camp"
@@ -23,7 +23,7 @@
if(5)
new /obj/item/clothing/glasses/godeye(src)
if(6)
new /obj/item/weapon/wingpotion(src)
new /obj/item/weapon/reagent_containers/glass/bottle/potion/flight(src)
if(7)
new /obj/item/weapon/pickaxe/diamond(src)
if(8)
@@ -411,37 +411,41 @@
vehicle_move_delay = 1
//Potion of Flight
/obj/item/weapon/wingpotion
name = "strange elixir"
desc = "A flask with an almost-holy aura emitting from it. The label on the bottle says 'erqo'hyy tvi'rf lbh jv'atf'"
/obj/item/weapon/reagent_containers/glass/bottle/potion
icon = 'icons/obj/lavaland/artefacts.dmi'
icon_state = "potionflask"
w_class = 2
var/used = FALSE
/obj/item/weapon/wingpotion/attack_self(mob/living/M)
if(used)
M << "<span class='notice'>The flask is empty, what a shame.</span>"
/obj/item/weapon/reagent_containers/glass/bottle/potion/flight
name = "strange elixir"
desc = "A flask with an almost-holy aura emitting from it. The label on the bottle says: 'erqo'hyy tvi'rf lbh jv'atf'."
list_reagents = list("flightpotion" = 5)
/obj/item/weapon/reagent_containers/glass/bottle/potion/update_icon()
if(reagents.total_volume)
icon_state = "potionflask"
else
if(iscarbon(M))
var/mob/living/carbon/C = M
CHECK_DNA_AND_SPECIES(C)
if(C.wear_mask)
C << "<span class='notice'>It's pretty hard to drink something with a mask on!</span>"
else
if(!ishumanbasic(C)) //implying xenoshumans are holy
C << "<span class='notice'>You down the elixir, noting nothing else but a terrible aftertaste.</span>"
else
C << "<span class='userdanger'>You down the elixir, a terrible pain travels down your back as wings burst out!</span>"
C.set_species(/datum/species/angel)
playsound(loc, 'sound/items/poster_ripped.ogg', 50, 1, -1)
C.adjustBruteLoss(20)
C.emote("scream")
playsound(loc, 'sound/items/drink.ogg', 50, 1, -1)
src.used = TRUE
icon_state = "potionflask_empty"
/datum/reagent/flightpotion
name = "Flight Potion"
id = "flightpotion"
description = "Strange mutagenic compound of unknown origins."
reagent_state = LIQUID
color = "#FFEBEB"
/datum/reagent/flightpotion/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1)
if(iscarbon(M) && M.stat != DEAD)
if(!ishumanbasic(M) || reac_volume < 5) // implying xenohumans are holy
if(method == INGEST && show_message)
M << "<span class='notice'><i>You feel nothing but a terrible aftertaste.</i></span>"
return ..()
M << "<span class='userdanger'>A terrible pain travels down your back as wings burst out!</span>"
M.set_species(/datum/species/angel)
playsound(M.loc, 'sound/items/poster_ripped.ogg', 50, 1, -1)
M.adjustBruteLoss(20)
M.emote("scream")
..()
+1 -1
View File
@@ -339,7 +339,7 @@
new turf_type(T)
/turf/open/floor/plating/asteroid/airless/cave/proc/SpawnMonster(turf/T)
if(prob(30))
if(istype(loc, /area/mine/explored))
if(istype(loc, /area/mine/explored) || istype(loc, /area/lavaland/surface/outdoors/explored))
return
for(var/atom/A in urange(12,T))//Lowers chance of mob clumps
if(istype(A, /mob/living/simple_animal/hostile/asteroid))
@@ -257,29 +257,7 @@
else
user << "<span class='warning'>Access denied.</span>"
else if(istype(W, /obj/item/device/paicard))
if(paicard)
user << "<span class='warning'>A [paicard] is already inserted!</span>"
else if(allow_pai && !key)
if(!locked && !open)
var/obj/item/device/paicard/card = W
if(card.pai && card.pai.mind)
if(!user.drop_item())
return
W.forceMove(src)
paicard = card
user.visible_message("[user] inserts [W] into [src]!","<span class='notice'>You insert [W] into [src].</span>")
paicard.pai.mind.transfer_to(src)
src << "<span class='notice'>You sense your form change as you are uploaded into [src].</span>"
bot_name = name
name = paicard.pai.name
faction = user.faction
add_logs(user, paicard.pai, "uploaded to [src.bot_name],")
else
user << "<span class='warning'>[W] is inactive.</span>"
else
user << "<span class='warning'>The personality slot is locked.</span>"
else
user << "<span class='warning'>[src] is not compatible with [W]</span>"
insertpai(user, W)
else if(istype(W, /obj/item/weapon/hemostat) && paicard)
if(open)
user << "<span class='warning'>Close the access panel before manipulating the personality slot!</span>"
@@ -864,6 +842,31 @@ Pass a positive integer as an argument to override a bot's default speed.
eject += "<BR>"
return eject
/mob/living/simple_animal/bot/proc/insertpai(mob/user, obj/item/device/paicard/card)
if(paicard)
user << "<span class='warning'>A [paicard] is already inserted!</span>"
else if(allow_pai && !key)
if(!locked && !open)
if(card.pai && card.pai.mind)
if(!user.drop_item())
return
card.forceMove(src)
paicard = card
user.visible_message("[user] inserts [card] into [src]!","<span class='notice'>You insert [card] into [src].</span>")
paicard.pai.mind.transfer_to(src)
src << "<span class='notice'>You sense your form change as you are uploaded into [src].</span>"
bot_name = name
name = paicard.pai.name
faction = user.faction
add_logs(user, paicard.pai, "uploaded to [bot_name],")
return 1
else
user << "<span class='warning'>[card] is inactive.</span>"
else
user << "<span class='warning'>The personality slot is locked.</span>"
else
user << "<span class='warning'>[src] is not compatible with [card]</span>"
/mob/living/simple_animal/bot/proc/ejectpai(mob/user = null, announce = 1)
if(paicard)
if(mind && paicard.pai)
@@ -918,4 +921,4 @@ Pass a positive integer as an argument to override a bot's default speed.
if(!data_hud_type)
return
var/datum/atom_hud/datahud = huds[data_hud_type]
datahud.add_hud_to(src)
datahud.add_hud_to(src)
@@ -639,11 +639,12 @@ var/global/mulebot_count = 0
if(istype(M,/mob/living/silicon/robot))
visible_message("<span class='danger'>[src] bumps into [M]!</span>")
else
add_logs(src, M, "knocked down")
visible_message("<span class='danger'>[src] knocks over [M]!</span>")
M.stop_pulling()
M.Stun(8)
M.Weaken(5)
if(!paicard)
add_logs(src, M, "knocked down")
visible_message("<span class='danger'>[src] knocks over [M]!</span>")
M.stop_pulling()
M.Stun(8)
M.Weaken(5)
return ..()
// called from mob/living/carbon/human/Crossed()
@@ -737,6 +738,10 @@ var/global/mulebot_count = 0
unload(get_dir(loc, A))
else
..()
/mob/living/simple_animal/bot/mulebot/insertpai(mob/user, obj/item/device/paicard/card)
if(..())
visible_message("[src] safeties are locked on.")
#undef SIGH
#undef ANNOYED
@@ -0,0 +1,4 @@
author: "name: Lzimann"
delete-after: True
changes:
- tweak: "Mulebots with pAI cards no longer stun people"
@@ -0,0 +1,4 @@
author: "Papa Bones"
delete-after: True
changes:
- tweak: "Security now has energy bolas available to them in their vending machines, check them out!"
@@ -0,0 +1,4 @@
author: "Joan"
delete-after: True
changes:
- tweak: "Ratvarian Spears will stun cyborgs and cultists for twice as long when thrown; on cyborgs, this should be long enough to use Guvax on them."
@@ -0,0 +1,4 @@
author: "coiax"
delete-after: True
changes:
- rscadd: "The nuke disk reappears on the station in far more random locations, but tends to re-materialise in safe pressurised areas that aren't on fire."
@@ -0,0 +1,4 @@
author: "Joan"
delete-after: True
changes:
- rscdel: "Removed the Justicar's Gavel application scripture."
@@ -0,0 +1,5 @@
author: "Joan"
delete-after: True
changes:
- tweak: "Vitality Matrices will drain and heal 50% faster, and the base cost to revive is 20% lower; 20, from 25."
- rscadd: "Vitality Matrices will not revive or heal corpses unless they can grab the ghost of the corpse, and will immediately grab the ghost when reviving."
@@ -0,0 +1,4 @@
author: "Joan"
delete-after: True
changes:
- rscadd: "Swarmers consuming swarmer shells now refunds the swarmer the entire cost of the shell instead of 2% of the shell's cost."
@@ -0,0 +1,4 @@
author: "NikNak"
delete-after: True
changes:
- tweak: "Showcases are now movable and deconstructable. Wrench them to unanchor and then screwdriver and crowbar to deconstruct."
@@ -0,0 +1,6 @@
author: "Joan"
delete-after: True
changes:
- experiment: "Application scriptures require at least 75 CV, from 50."
- experiment: "Revenant scriptures require at least 4 Caches, from 3, and at least 150 CV, from 100."
- experiment: "Judgement scripture requires at least 12 servants, from 10, 5 Caches, from 3, and at least 250 CV, from 100."
@@ -0,0 +1,4 @@
author: "Flavo"
delete-after: True
changes:
- bugfix: "fixed a bug where lights would not update."
Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.0 KiB

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.4 KiB

After

Width:  |  Height:  |  Size: 7.9 KiB

+3
View File
@@ -407,6 +407,8 @@
#include "code\game\machinery\droneDispenser.dm"
#include "code\game\machinery\firealarm.dm"
#include "code\game\machinery\flasher.dm"
#include "code\game\machinery\gulag_item_reclaimer.dm"
#include "code\game\machinery\gulag_teleporter.dm"
#include "code\game\machinery\hologram.dm"
#include "code\game\machinery\igniter.dm"
#include "code\game\machinery\iv_drip.dm"
@@ -454,6 +456,7 @@
#include "code\game\machinery\computer\computer.dm"
#include "code\game\machinery\computer\crew.dm"
#include "code\game\machinery\computer\dna_console.dm"
#include "code\game\machinery\computer\gulag_teleporter.dm"
#include "code\game\machinery\computer\law.dm"
#include "code\game\machinery\computer\medical.dm"
#include "code\game\machinery\computer\message.dm"
+1 -1
View File
File diff suppressed because one or more lines are too long
+13 -13
View File
File diff suppressed because one or more lines are too long
+49
View File
@@ -0,0 +1,49 @@
<ui-display title='Labor Camp Teleporter'>
<ui-section label='Teleporter Status'>
<span class='{{data.teleporter ? "good" : "bad"}}'>{{data.teleporter ? "Connected" : "Not connected"}}</span>
</ui-section>
{{#if data.teleporter}}
<ui-section label='Location'>
<span>{{data.teleporter_location}}</span>
</ui-section>
<ui-section label='Locked status'>
<ui-button icon='{{data.teleporter_lock ? "lock" : "unlock"}}' action="teleporter_lock">{{data.teleporter_lock ? "Locked" : "Unlocked"}}</ui-button>
<ui-button action='toggle_open'>{{data.teleporter_state_open ? "Open" : "Closed"}}</ui-button>
</ui-section>
{{else}}
<span><ui-button action="scan_teleporter">Scan Teleporter</ui-button></span>
{{/if}}
</ui-display>
<ui-display title='Labor Camp Beacon'>
<ui-section label='Beacon Status'>
<span class='{{data.beacon ? "good" : "bad"}}'>{{data.beacon ? "Connected" : "Not connected"}}</span>
</ui-section>
{{#if data.beacon}}
<ui-section label='Location'>
<span>{{data.beacon_location}}</span>
</ui-section>
{{else}}
<span><ui-button action="scan_beacon">Scan Beacon</ui-button></span>
{{/if}}
</ui-display>
<ui-display title='Prisoner details'>
<ui-section label='Prisoner ID'>
<ui-button action="handle_id">{{data.id ? data.id_name : "-------------"}}</ui-button>
</ui-section>
{{#if data.id}}
<ui-section label='Set ID goal'>
<ui-button action="set_goal">{{data.goal}}</ui-button>
</ui-section>
{{/if}}
<ui-section label='Occupant'>
<span>{{data.prisoner.name ? data.prisoner.name : "No Occupant"}}</span>
</ui-section>
{{#if data.prisoner}}
<ui-section label='Criminal Status'>
<span>{{data.prisoner.crimstat}}</span>
</ui-section>
{{/if}}
</ui-display>
<ui-display>
<center><ui-button action="teleport" state={{data.can_teleport ? null : 'disabled'}}>Process Prisoner</ui-button></center>
</ui-display>
@@ -0,0 +1,10 @@
<ui-display>
<center><ui-button action="handle_id">{{data.id ? data.id.name : "-------------"}}</ui-button></center>
</ui-display>
<ui-display title='Stored Items'>
{{#each data.mobs}}
<ui-section label='{{name}}'>
<ui-button action="release_items" params='{"mobref":{{mob}}}' state={{data.can_reclaim ? null : 'disabled'}}>Drop Items</ui-button>
</ui-section>
{{/each}}
</ui-display>
@@ -0,0 +1,29 @@
<ui-display title='Ore values'>
{{#each data.ores}}
<ui-section label='{{ore}}'>
<span>{{value}}</span>
</ui-section>
{{/each}}
</ui-display>
<ui-display title='Points'>
<ui-section label='ID'>
<ui-button action="handle_id">{{data.id ? data.id_name : "-------------"}}</ui-button>
</ui-section>
{{#if data.id}}
<ui-section label='Points collected'>
<span>{{data.points}}</span>
</ui-section>
<ui-section label='Goal'>
<span>{{data.goal}}</span>
</ui-section>
<ui-section label='Unclaimed points'>
<span>{{data.unclaimed_points}}</span>
<ui-button action="claim_points" state={{data.unclaimed_points ? null : 'disabled'}}>Claim points</ui-button>
</ui-section>
{{/if}}
</ui-display>
<ui-display>
<center>
<ui-button action="move_shuttle" state={{data.can_go_home ? null : 'disabled'}}>Move shuttle</ui-button>
</center>
</ui-display>