Skip to content

Commit 1f54552

Browse files
Merge pull request NebulaSS13#5144 from out-of-phaze/codequality/loyalty-implants
Improve implant code quality
2 parents fd6cd97 + 4183c05 commit 1f54552

File tree

35 files changed

+487
-596
lines changed

35 files changed

+487
-596
lines changed

code/__defines/misc.dm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@
5353
#define STATUS_HUD 2 // Alive, dead, diseased, etc.
5454
#define ID_HUD 3 // The job asigned to your ID.
5555
#define WANTED_HUD 4 // Wanted, released, paroled, security status.
56-
#define IMPLOYAL_HUD 5 // Loyality implant.
56+
#define IMPLOYAL_HUD 5 // Loyalty implant.
5757
#define IMPCHEM_HUD 6 // Chemical implant.
5858
#define IMPTRACK_HUD 7 // Tracking implant.
5959
#define SPECIALROLE_HUD 8 // AntagHUD image.

code/datums/config/config_types/config_game_world.dm

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@
2323
/decl/config/toggle/roundstart_level_generation,
2424
/decl/config/toggle/lights_start_on,
2525
/decl/config/toggle/on/cisnormativity,
26-
/decl/config/enum/colored_coating_names
26+
/decl/config/enum/colored_coating_names,
27+
/decl/config/toggle/codex_requires_implant
2728
)
2829

2930
/decl/config/num/exterior_ambient_light
@@ -145,4 +146,8 @@
145146
"none" = CONFIG_COATING_COLOR_NONE,
146147
"mixture" = CONFIG_COATING_COLOR_MIXTURE,
147148
"components" = CONFIG_COATING_COLOR_COMPONENTS
148-
)
149+
)
150+
151+
/decl/config/toggle/codex_requires_implant
152+
uid = "codex_requires_implant"
153+
desc = "If true, humans require a codex implant to access the codex."

code/datums/uplink/uplink_sources.dm

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -68,21 +68,16 @@ var/global/list/default_uplink_source_priority = list(
6868
name = "Implant"
6969
desc = "Teleports an uplink implant into your head. Costs 20% of the initial TC amount."
7070

71-
/decl/uplink_source/implant/setup_uplink_source(var/mob/living/human/H, var/amount)
72-
if(!istype(H))
71+
/decl/uplink_source/implant/setup_uplink_source(var/mob/living/human/recipient, var/amount)
72+
if(!istype(recipient))
7373
return SETUP_FAILED
7474

75-
var/obj/item/organ/external/head = GET_EXTERNAL_ORGAN(H, BP_HEAD)
75+
var/obj/item/organ/external/head = GET_EXTERNAL_ORGAN(recipient, BP_HEAD)
7676
if(!head)
7777
return SETUP_FAILED
7878

79-
var/obj/item/implant/uplink/U = new(H, round(amount * 0.8))
80-
U.imp_in = H
81-
U.implanted = TRUE
82-
U.part = head
83-
LAZYADD(head.implants, U)
84-
85-
U.implanted(H) // This proc handles the installation feedback
79+
var/obj/item/implant/uplink/uplink_implant = new(recipient, round(amount * 0.8))
80+
uplink_implant.implant_in_mob(recipient, recipient, head)
8681

8782
/decl/uplink_source/unit
8883
name = "Uplink Unit"

code/game/machinery/computer/prisoner.dm

Lines changed: 54 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -7,76 +7,86 @@
77
icon_screen = "explosive"
88
light_color = "#a91515"
99
initial_access = list(access_armory)
10-
var/screen = 0 // 0 - No Access Denied, 1 - Access allowed
10+
var/locked = FALSE
1111

1212
/obj/machinery/computer/prisoner/interface_interact(user)
1313
interact(user)
1414
return TRUE
1515

1616
/obj/machinery/computer/prisoner/interact(var/mob/user)
17-
var/dat
17+
var/dat = list()
1818
dat += "<B>Prisoner Implant Manager System</B><BR>"
19-
if(screen == 0)
19+
if(locked)
2020
dat += "<HR><A href='byond://?src=\ref[src];lock=1'>Unlock Console</A>"
21-
else if(screen == 1)
21+
else
2222
dat += "<HR>Chemical Implants<BR>"
23-
var/turf/Tr = null
24-
for(var/obj/item/implant/chem/C in global.chem_implants)
25-
Tr = get_turf(C)
26-
if((Tr) && !LEVELS_ARE_Z_CONNECTED(Tr.z, src.z)) continue // Out of range
27-
if(!C.implanted) continue
28-
dat += "[C.imp_in.name] | Remaining Units: [C.reagents.total_volume] | Inject: "
29-
dat += "<A href='byond://?src=\ref[src];inject1=\ref[C]'>(<font color=red>(1)</font>)</A>"
30-
dat += "<A href='byond://?src=\ref[src];inject5=\ref[C]'>(<font color=red>(5)</font>)</A>"
31-
dat += "<A href='byond://?src=\ref[src];inject10=\ref[C]'>(<font color=red>(10)</font>)</A><BR>"
23+
for(var/obj/item/implant/chem/chem_implant in global.chem_implants)
24+
var/turf/implant_turf = get_turf(chem_implant)
25+
if(implant_turf && !LEVELS_ARE_Z_CONNECTED(implant_turf.z, src.z))
26+
continue // Out of range
27+
if(!chem_implant.implanted)
28+
continue
29+
dat += "[chem_implant.imp_in.name] | Remaining Units: [chem_implant.reagents.total_volume] | Inject: "
30+
dat += "<A href='byond://?src=\ref[src];inject=\ref[chem_implant];amount=1'>(<font color=red>(1)</font>)</A>"
31+
dat += "<A href='byond://?src=\ref[src];inject=\ref[chem_implant];amount=5'>(<font color=red>(5)</font>)</A>"
32+
dat += "<A href='byond://?src=\ref[src];inject=\ref[chem_implant];amount=10'>(<font color=red>(10)</font>)</A><BR>"
3233
dat += "********************************<BR>"
3334
dat += "<HR>Tracking Implants<BR>"
34-
for(var/obj/item/implant/tracking/T in global.tracking_implants)
35-
Tr = get_turf(T)
36-
if((Tr) && !LEVELS_ARE_Z_CONNECTED(Tr.z, src.z)) continue // Out of range
37-
if(!T.implanted) continue
38-
var/loc_display = "Space"
39-
var/mob/living/M = T.imp_in
40-
if(!isspaceturf(M.loc))
41-
var/turf/mob_loc = get_turf(M)
42-
loc_display = mob_loc.loc
43-
if(T.malfunction)
35+
for(var/obj/item/implant/tracking/tracking_implant in global.tracking_implants)
36+
var/turf/implant_turf = get_turf(tracking_implant)
37+
if(implant_turf && !LEVELS_ARE_Z_CONNECTED(implant_turf.z, src.z))
38+
continue // Out of range
39+
if(!tracking_implant.implanted)
40+
continue
41+
var/area/tracked_area = get_area(tracking_implant)
42+
var/loc_display = tracked_area.proper_name
43+
if(tracking_implant.malfunction)
4444
loc_display = pick(teleportlocs)
45-
dat += "ID: [T.id] | Location: [loc_display]<BR>"
46-
dat += "<A href='byond://?src=\ref[src];warn=\ref[T]'>(<font color=red><i>Message Holder</i></font>)</A> |<BR>"
45+
dat += "ID: [tracking_implant.id] | Location: [loc_display]<BR>"
46+
dat += "<A href='byond://?src=\ref[src];warn=\ref[tracking_implant]'>(<font color=red><i>Message Holder</i></font>)</A> |<BR>"
4747
dat += "********************************<BR>"
4848
dat += "<HR><A href='byond://?src=\ref[src];lock=1'>Lock Console</A>"
4949

50-
show_browser(user, dat, "window=computer;size=400x500")
50+
show_browser(user, JOINTEXT(dat), "window=computer;size=400x500")
5151
onclose(user, "computer")
5252

5353
/obj/machinery/computer/prisoner/OnTopic(mob/user, href_list)
5454
if((. = ..()))
5555
return
56-
. = TOPIC_REFRESH
5756

58-
if(href_list["inject1"])
59-
var/obj/item/implant/I = locate(href_list["inject1"])
60-
if(I) I.activate(1)
61-
62-
else if(href_list["inject5"])
63-
var/obj/item/implant/I = locate(href_list["inject5"])
64-
if(I) I.activate(5)
65-
66-
else if(href_list["inject10"])
67-
var/obj/item/implant/I = locate(href_list["inject10"])
68-
if(I) I.activate(10)
57+
if(href_list["inject"])
58+
var/obj/item/implant/chem/chem_implant = locate(href_list["inject"])
59+
if(!chem_implant)
60+
return TOPIC_REFRESH // evidently their copy of the UI is out of date
61+
if(!istype(chem_implant)) // exists but is not a chem implant
62+
// warn that this is likely an href hacking attempt
63+
PRINT_STACK_TRACE("Possible HREF hacking attempt, chem implant inject called on non-chem-implant!")
64+
message_admins("Possible HREF hacking attempt, chem implant inject called on [href_list["inject"]] by [user] (ckey [(user.ckey)])!")
65+
return TOPIC_HANDLED
66+
var/amount_to_inject = clamp(text2num(href_list["amount"]), 1, 10) // don't let href hacking give more than 10 units at once
67+
chem_implant.activate(amount_to_inject)
68+
return TOPIC_HANDLED
6969

7070
else if(href_list["lock"])
7171
if(allowed(user))
72-
screen = !screen
72+
locked = !locked
73+
return TOPIC_REFRESH
7374
else
7475
to_chat(user, "Unauthorized Access.")
76+
return TOPIC_HANDLED
7577

7678
else if(href_list["warn"])
7779
var/warning = sanitize(input(user,"Message:","Enter your message here!",""))
78-
if(!warning) return TOPIC_HANDLED
79-
var/obj/item/implant/I = locate(href_list["warn"])
80-
if(I?.imp_in)
81-
var/mob/living/victim = I.imp_in
82-
to_chat(victim, "<span class='notice'>You hear a voice in your head saying: '[warning]'</span>")
80+
if(!warning)
81+
return TOPIC_HANDLED
82+
var/obj/item/implant/tracking/tracker = locate(href_list["warn"])
83+
if(!tracker)
84+
return TOPIC_REFRESH // evidently their copy of the UI is out of date
85+
if(!istype(tracker)) // exists but is not a tracking implant
86+
// warn that this is likely an href hacking attempt
87+
PRINT_STACK_TRACE("Possible HREF hacking attempt, tracking implant warn called on non-tracking-implant!")
88+
message_admins("Possible HREF hacking attempt, tracking implant warn called on [href_list["warn"]] by [user] (ckey [(user.ckey)])!")
89+
return TOPIC_HANDLED
90+
to_chat(tracker.imp_in, SPAN_NOTICE("You hear a voice in your head saying: '[warning]'"))
91+
return TOPIC_HANDLED
92+
return TOPIC_NOACTION

code/game/machinery/teleporter.dm

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -86,12 +86,13 @@
8686
for(var/obj/item/radio/beacon/radio in global.radio_beacons)
8787
if(!radio.functioning)
8888
continue
89-
var/turf/T = get_turf(radio)
90-
if (!T)
89+
var/turf/radio_turf = get_turf(radio)
90+
if (!radio_turf)
9191
continue
92-
if(!isPlayerLevel(T.z))
92+
if(!isPlayerLevel(radio_turf.z))
9393
continue
94-
var/tmpname = T.loc.name
94+
var/area/radio_area = get_area(radio)
95+
var/tmpname = radio_area.proper_name
9596
if(areaindex[tmpname])
9697
tmpname = "[tmpname] ([++areaindex[tmpname]])"
9798
else
@@ -101,22 +102,21 @@
101102
for (var/obj/item/implant/tracking/used_item in global.tracking_implants)
102103
if (!used_item.implanted || !ismob(used_item.loc))
103104
continue
105+
var/mob/victim = used_item.loc
106+
// Can only track dead people up to 10 minutes after death
107+
if (victim.stat == DEAD && world.time > victim.timeofdeath + 10 MINUTES)
108+
continue
109+
var/turf/victim_turf = get_turf(victim)
110+
if(!victim_turf)
111+
continue
112+
if(!isPlayerLevel(victim_turf.z))
113+
continue
114+
var/tmpname = victim.real_name
115+
if(areaindex[tmpname])
116+
tmpname = "[tmpname] ([++areaindex[tmpname]])"
104117
else
105-
var/mob/M = used_item.loc
106-
if (M.stat == DEAD)
107-
if (M.timeofdeath + 6000 < world.time)
108-
continue
109-
var/turf/T = get_turf(M)
110-
if(!T)
111-
continue
112-
if(!isPlayerLevel(T.z))
113-
continue
114-
var/tmpname = M.real_name
115-
if(areaindex[tmpname])
116-
tmpname = "[tmpname] ([++areaindex[tmpname]])"
117-
else
118-
areaindex[tmpname] = 1
119-
L[tmpname] = used_item
118+
areaindex[tmpname] = 1
119+
L[tmpname] = used_item
120120

121121
var/desc = input("Please select a location to lock in.", "Locking Computer") in L|null
122122
if(!desc)
@@ -127,16 +127,16 @@
127127
audible_message(SPAN_NOTICE("Locked in."))
128128
return
129129

130-
/obj/machinery/computer/teleporter/verb/set_id(t as text)
130+
/obj/machinery/computer/teleporter/verb/set_id(new_tag as text)
131131
set category = "Object"
132132
set name = "Set teleporter ID"
133133
set src in oview(1)
134134
set desc = "ID Tag:"
135135

136136
if(stat & (NOPOWER|BROKEN) || !isliving(usr))
137137
return
138-
if (t)
139-
src.id = t
138+
if (new_tag)
139+
src.id = new_tag
140140
return
141141

142142
/obj/machinery/computer/teleporter/proc/target_lost()

0 commit comments

Comments
 (0)