Skip to content
This repository was archived by the owner on May 22, 2025. It is now read-only.

Commit 03a35da

Browse files
committed
TGS Test Merge (#18502)
2 parents 8ba7d4f + 3b348cd commit 03a35da

File tree

8 files changed

+189
-4
lines changed

8 files changed

+189
-4
lines changed

code/datums/diseases/gastrolisis.dm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@
6666
if(isopenturf(OT))
6767
OT.MakeSlippery(TURF_WET_LUBE, 100)
6868

69-
/datum/disease/gastrolosis/cure()
69+
/datum/disease/gastrolosis/cure(add_resistance = TRUE)
7070
. = ..()
7171
if(!is_species(affected_mob, /datum/species/snail)) //undo all the snail fuckening
7272
var/mob/living/carbon/human/H = affected_mob

code/datums/diseases/parrotpossession.dm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
if(parrot.speech_buffer.len)
2424
affected_mob.say(pick(parrot.speech_buffer), forced = "parrot possession")
2525

26-
/datum/disease/parrot_possession/cure()
26+
/datum/disease/parrot_possession/cure(add_resistance = TRUE)
2727
if(parrot && parrot.loc == affected_mob)
2828
parrot.forceMove(affected_mob.drop_location())
2929
affected_mob.visible_message(span_danger("[parrot] is violently driven out of [affected_mob]!"), span_userdanger("[parrot] bursts out of your chest!"))

code/datums/diseases/transformation.dm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@
138138
if(prob(3))
139139
affected_mob.say(pick("Eeek, ook ook!", "Eee-eeek!", "Eeee!", "Ungh, ungh."), forced = "jungle fever")
140140

141-
/datum/disease/transformation/jungle_fever/cure()
141+
/datum/disease/transformation/jungle_fever/cure(add_resistance = TRUE)
142142
remove_monkey(affected_mob.mind)
143143
..()
144144

Lines changed: 172 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,172 @@
1+
/obj/item/sentient_disease_injector
2+
name = "\improper CVS recipient injector"
3+
desc = "It doesn't look like it prints receipts..."
4+
5+
icon = 'yogstation/icons/obj/syringe.dmi'
6+
icon_state = "cvs"
7+
8+
var/uses = 3
9+
10+
var/obj/item/reagent_containers/glass/bottle/vial/stored_vial
11+
12+
resistance_flags = ACID_PROOF
13+
slot_flags = ITEM_SLOT_BELT
14+
15+
/obj/item/sentient_disease_injector/Initialize()
16+
. = ..()
17+
update_icon()
18+
19+
/obj/item/sentient_disease_injector/update_icon()
20+
21+
. = ..()
22+
23+
cut_overlays()
24+
25+
if(uses > 0)
26+
add_overlay(
27+
image(
28+
icon = icon,
29+
icon_state = "[icon_state]_virus[min(uses,3)]"
30+
)
31+
)
32+
33+
if(stored_vial)
34+
if(stored_vial.reagents.total_volume > 0)
35+
var/mutable_appearance/filling = mutable_appearance(icon,"[icon_state]_reagents")
36+
filling.color = mix_color_from_reagents(stored_vial.reagents.reagent_list)
37+
add_overlay(filling)
38+
add_overlay(
39+
image(
40+
icon = icon,
41+
icon_state = "[icon_state]_vial]"
42+
)
43+
)
44+
45+
/obj/item/sentient_disease_injector/examine(mob/user)
46+
. = ..()
47+
if(stored_vial)
48+
. += span_notice("It has a [stored_vial] inserted.")
49+
if(uses > 0)
50+
. += span_notice("It has [uses] [uses == 1 ? "use" : "uses"] remaining.")
51+
else
52+
. += span_notice("It is spent.")
53+
54+
/obj/item/sentient_disease_injector/attackby(obj/item/I, mob/user, params)
55+
56+
if(!istype(I,/obj/item/reagent_containers))
57+
return ..() //Something else.
58+
59+
if(stored_vial) //Already exists.
60+
to_chat(user, span_warning("There is already \a [stored_vial] inside."))
61+
return
62+
63+
if(!istype(I, /obj/item/reagent_containers/glass/bottle/vial))
64+
to_chat(user, span_warning("\The [stored_vial] won't fit inside."))
65+
return
66+
67+
var/datum/reagent/R = I.reagents.get_master_reagent()
68+
69+
if(!R)
70+
to_chat(user, span_warning("\The [I] is empty!"))
71+
return
72+
73+
if(!length(R.data) || !length(R.data["viruses"]))
74+
to_chat(user, span_warning("\The [src] can't seem to detect any viruses inside \the [I]..."))
75+
return
76+
77+
stored_vial = I
78+
stored_vial.forceMove(src)
79+
80+
to_chat(user, span_notice("You insert \the [I] into \the [src]."))
81+
82+
update_icon()
83+
84+
return TRUE
85+
86+
/obj/item/sentient_disease_injector/attack_self(mob/user)
87+
88+
if(!stored_vial)
89+
return
90+
91+
stored_vial.forceMove(user.loc)
92+
user.put_in_hands(stored_vial)
93+
to_chat(user, span_notice("You eject \the [stored_vial] from \the [src]."))
94+
stored_vial = null
95+
96+
update_icon()
97+
98+
return TRUE
99+
100+
/obj/item/sentient_disease_injector/attack(obj/item/I, mob/user, params)
101+
return //Prevents damage.
102+
103+
/obj/item/sentient_disease_injector/afterattack(atom/target, mob/user, proximity)
104+
105+
if(!proximity || !iscarbon(target))
106+
return ..()
107+
108+
if(uses <= 0)
109+
to_chat(user, span_warning("\The [src] is spent!"))
110+
return
111+
112+
var/mob/living/carbon/C = target
113+
114+
if(!C.can_inject(user, 1, user.zone_selected, TRUE))
115+
to_chat(user, span_warning("You can't seem to inject \the [C] that way!"))
116+
117+
if(ishuman(C))
118+
var/obj/item/bodypart/affecting = C.get_bodypart(check_zone(user.zone_selected))
119+
if(!affecting)
120+
to_chat(user, span_warning("\The [src] can't inject a missing limb!"))
121+
return
122+
if(affecting.status != BODYPART_ORGANIC)
123+
to_chat(user, span_warning("\The [src] won't work on a robotic limb!"))
124+
return
125+
126+
to_chat(user, span_notice("You stealthily inject \the [C] with \the [src]."))
127+
128+
uses -= 1
129+
130+
for(var/datum/disease/D as anything in C.diseases) //Cure all existing diseases
131+
D.cure(add_resistance = FALSE)
132+
133+
if(stored_vial && stored_vial.reagents.total_volume) //If there is a stored vial, inject.
134+
var/list/injected = list()
135+
for(var/datum/reagent/R as anything in stored_vial.reagents.reagent_list)
136+
injected += R.name
137+
log_combat(user, C, "attempted to inject", src, "([english_list(injected)])")
138+
stored_vial.reagents.reaction(C, INJECT, 1)
139+
stored_vial.reagents.trans_to(C, stored_vial.reagents.total_volume, transfered_by = user)
140+
else
141+
log_combat(user, C, "attempted to inject", src)
142+
143+
if(length(C.diseases))
144+
INVOKE_ASYNC(src, PROC_REF(create_sentient_virus), target, user)
145+
146+
update_icon()
147+
148+
return TRUE
149+
150+
/obj/item/sentient_disease_injector/Destroy()
151+
QDEL_NULL(stored_vial)
152+
. = ..()
153+
154+
/obj/item/sentient_disease_injector/proc/create_sentient_virus(mob/living/carbon/target,mob/user)
155+
156+
var/list/candidates = pollGhostCandidates("Do you wish to be considered for the special role of 'custom sentient disease'?", ROLE_ALIEN, null, ROLE_ALIEN)
157+
if(!length(candidates))
158+
return FALSE //No candidates.
159+
160+
var/mob/dead/observer/selected = pick_n_take(candidates)
161+
var/mob/camera/disease/virus = new/mob/camera/disease(get_turf(target))
162+
virus.key = selected.key
163+
message_admins("[ADMIN_LOOKUPFLW(virus)] has been made into a sentient disease by [ADMIN_LOOKUPFLW(usr)]'s [src].")
164+
log_game("[key_name(virus)] was spawned as a sentient disease by [ADMIN_LOOKUPFLW(usr)]'s [src].")
165+
//Mix and cure all existing diseases.
166+
for(var/datum/disease/D as anything in target.diseases)
167+
if(D == virus)
168+
continue
169+
virus.disease_template.Mix(D)
170+
D.cure(add_resistance = FALSE)
171+
172+
return virus.force_infect(target)

code/modules/antagonists/revenant/revenant_blight.dm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
var/stagedamage = 0 //Highest stage reached.
1616
var/finalstage = 0 //Because we're spawning off the cure in the final stage, we need to check if we've done the final stage's effects.
1717

18-
/datum/disease/revblight/cure()
18+
/datum/disease/revblight/cure(add_resistance = TRUE)
1919
if(affected_mob)
2020
affected_mob.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, "#1d2953")
2121
if(affected_mob.dna && affected_mob.dna.species)

yogstation.dme

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1156,6 +1156,7 @@
11561156
#include "code\game\objects\items\RPD.dm"
11571157
#include "code\game\objects\items\RSF.dm"
11581158
#include "code\game\objects\items\scrolls.dm"
1159+
#include "code\game\objects\items\sentient_disease_injector.dm"
11591160
#include "code\game\objects\items\sharpener.dm"
11601161
#include "code\game\objects\items\shields.dm"
11611162
#include "code\game\objects\items\shooting_range.dm"

yogstation/code/modules/uplink/uplink_item.dm

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,18 @@
2828
category = "Conspicuous Weapons"
2929
include_objectives = list(/datum/objective/hijack, /datum/objective/martyr, /datum/objective/nuclear)
3030

31+
/datum/uplink_item/stealthy_weapons/sentient_disease_injector
32+
name = "CVS recipient injector"
33+
desc = "The Contagion Viral Supplementor injector is a state of the art Syndicate hyposyringe that can inject the target with a \
34+
sentient virus. A vial can be inserted with a virus sample to give that sentient virus those symptoms. Single use. Doesn't come with a miniprinter."
35+
item = /obj/item/sentient_disease_injector
36+
cost = 20
37+
surplus = 0 //Hijack-only, don't let this exist in surplus
38+
cant_discount = TRUE
39+
include_objectives = list(/datum/objective/hijack) //Hijack only.
40+
exclude_modes = list(/datum/game_mode/infiltration) // yogs: infiltration
41+
restricted_roles = list("Virologist","Chief Medical Officer")
42+
3143
/datum/uplink_item/stealthy_weapons/soap_clusterbang
3244
category = "Conspicuous Weapons"
3345

yogstation/icons/obj/syringe.dmi

607 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)