mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-26 14:39:58 +01:00
Merge branch 'master' into dynamic-transit
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
},
|
||||
|
||||
+3342
-3307
File diff suppressed because it is too large
Load Diff
@@ -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)
|
||||
|
||||
|
||||
@@ -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>"
|
||||
|
||||
|
||||
@@ -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]))
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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"
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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."
|
||||
@@ -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)
|
||||
@@ -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")
|
||||
..()
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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 |
@@ -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"
|
||||
|
||||
File diff suppressed because one or more lines are too long
+13
-13
File diff suppressed because one or more lines are too long
@@ -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>
|
||||
Reference in New Issue
Block a user