Ports Venom Bite / Injection from Rogue Star (#16060)

* Ports Venom Bite from Rogue Star

And adds a few extras

Venomous bite trait is Feature Complete. (Bulk of code was ported from Rogue Star.)
Additions:
Added a 'Chemical Refresher' button that tells you each chem and what it does.
Added all the gender TF chems to the bite.
Added Stoxin to the list of injectable chems.
Added three new chems: 'Rainbow Toxin' 'Paralysis Toxin' and 'Pain Enzyme'.
Rainbow toxin: Makes you druggy like ambrosia, without the stuttering/vomiting/random walking.
Paralysis Toxin: Does exactly what it says on the tin.
Pain Enzyme: Acts as a reverse numbing enzyme. Pain is AMPLIFIED by 200. One bite and you're going to be whimpering on the floor.

* that isn't warmth :3

* whoops typo

* A few bugfixes

* Descriptions!

* Allows biting synths
This commit is contained in:
C.L
2024-06-21 06:04:56 +10:00
committed by GitHub
parent 8ff0932889
commit e1f88e992e
4 changed files with 241 additions and 0 deletions
@@ -1529,3 +1529,145 @@
if(Adjacent(target)) //We leapt at them but we didn't manage to hit them, let's see if we're next to them
target.Weaken(2) //get knocked down, idiot
/mob/living/proc/injection() // Allows the user to inject reagents into others somehow, like stinging, or biting.
set name = "Injection"
set category = "Abilities"
set desc = "Inject another being with something!"
if(stat || paralysis || weakened || stunned || world.time < last_special) //Epic copypasta from tongue grabbing.
to_chat(src, "<span class='warning'>You can't do that in your current state.</span>")
return
last_special = world.time + 10 //Anti-spam.
var/list/choices = list("Inject")
if(trait_injection_reagents.len > 1) //Should never happen, but who knows!
choices += "Change reagent"
else if(!trait_injection_selected)
trait_injection_selected = trait_injection_reagents[1]
choices += "Change amount"
choices += "Change verb"
choices += "Chemical Refresher"
var/choice = tgui_alert(src, "Do you wish to inject somebody, or adjust settings?", "Selection List", choices)
if(choice == "Change reagent")
var/reagent_choice = tgui_input_list(usr, "Choose which reagent to inject!", "Select reagent", trait_injection_reagents)
if(reagent_choice)
trait_injection_selected = reagent_choice
to_chat(src, "<span class='notice'>You prepare to inject [trait_injection_amount] units of [trait_injection_selected ? "[trait_injection_selected]" : "...nothing. Select a reagent before trying to inject anything."]</span>")
return
if(choice == "Change amount")
var/amount_choice = tgui_input_number(usr, "How much of the reagent do you want to inject? (Up to 5 units) (Can select 0 for a bite that doesn't inject venom!)", "How much?", trait_injection_amount, 5, 0)
if(amount_choice >= 0)
trait_injection_amount = amount_choice
to_chat(src, "<span class='notice'>You prepare to inject [trait_injection_amount] units of [trait_injection_selected ? "[trait_injection_selected]" : "...nothing. Select a reagent before trying to inject anything."]</span>")
return
if(choice == "Change verb")
var/verb_choice = tgui_input_text(usr, "Choose the percieved manner of injection, such as 'bites' or 'stings', don't be misleading or abusive. This will show up in game as ('X' 'Verb' 'Y'. Example: X bites Y.)", "How are you injecting?", trait_injection_verb, max_length = 60) //Whoaa there cowboy don't put a novel in there.
if(verb_choice)
trait_injection_verb = verb_choice
to_chat(src, "<span class='notice'>You will [trait_injection_verb] your targets.</span>")
return
if(choice == "Chemical Refresher")
var/output = {"<B>Chemical Refresher!</B><HR>
<B>Options for venoms</B><BR>
<BR>
<B>Size Chemicals</B><BR>
Microcillin: Will make someone shrink. <br>
Macrocillin: Will make someone grow. <br>
Normalcillin: Will make someone normal size. <br>
Note: 1 unit = 100% size diff. 0.01 unit = 1% size diff. <br>
Note: Normacillin stops at 100% size. <br>
<br>
<B>Gender Chemicals</B><BR>
Androrovir: Will transform someone's sex to male. <br>
Gynorovir: Will transform someone's sex to female. <br>
Androgynorovir: Will transform someone's sex to plural. <br>
<br>
<B>Special Chemicals</B><BR>
Stoxin: Will make someone drowsy. <br>
Rainbow Toxin: Will make someone see rainbows. <br>
Paralysis Toxin: Will make someone paralyzed. <br>
Numbing Enzyme: Will make someone unable to feel pain. <br>
Pain Enzyme: Will make someone feel amplified pain. <br>
<br>
<B>Side Notes</B><BR>
You can select a value of 0 to inject nothing! <br>
Overdose threshold for most chemicals is 30 units. <br>
Exceptions to OD is: (Numbing Enzyme:20)<br>
You can also bite synthetics, but due to how synths work, they won't have anything injected into them.
<br>
"}
usr << browse(output,"window=chemicalrefresher")
return
else
var/list/targets = list() //IF IT IS NOT BROKEN. DO NOT FIX IT. AND KEEP COPYPASTING IT (Pointing Rick Dalton: "That's my code!" ~CL)
for(var/mob/living/carbon/L in living_mobs(1, TRUE)) //Noncarbons don't even process reagents so don't bother listing others.
if(!istype(L, /mob/living/carbon))
continue
if(L == src) //no getting high off your own supply, get a nif or something, nerd.
continue
if(!L.resizable && (trait_injection_selected == "macrocillin" || trait_injection_selected == "microcillin" || trait_injection_selected == "normalcillin")) // If you're using a size reagent, ignore those with pref conflicts.
continue
if(!L.allow_spontaneous_tf && (trait_injection_selected == "androrovir" || trait_injection_selected == "gynorovir" || trait_injection_selected == "androgynorovir")) // If you're using a TF reagent, ignore those with pref conflicts.
continue
targets += L
if(!(targets.len))
to_chat(src, "<span class='notice'>No eligible targets found.</span>")
return
var/mob/living/target = tgui_input_list(src, "Please select a target.", "Victim", targets)
if(!target)
return
if(!istype(target, /mob/living/carbon)) //Safety.
to_chat(src, "<span class='warning'>That won't work on that kind of creature! (Only works on crew/monkeys)</span>")
return
var/synth = 0
if(target.isSynthetic())
synth = 1
if(!trait_injection_selected)
to_chat(src, "<span class='notice'>You need to select a reagent.</span>")
return
if(!trait_injection_verb)
to_chat(src, "<span class='notice'>Somehow, you forgot your means of injecting. (Select a verb!)</span>")
return
if(do_after(src, 50, target)) //A decent enough timer.
add_attack_logs(src,target,"Injection trait ([trait_injection_selected], [trait_injection_amount])")
if(target.reagents && (trait_injection_amount > 0) && !synth)
target.reagents.add_reagent(trait_injection_selected, trait_injection_amount)
var/ourmsg = "<span class='warning'>[usr] [trait_injection_verb] [target] "
switch(zone_sel.selecting)
if(BP_HEAD)
ourmsg += "on the head!"
if(BP_TORSO)
ourmsg += "on the chest!"
if(BP_GROIN)
ourmsg += "on the groin!"
if(BP_R_ARM, BP_L_ARM)
ourmsg += "on the arm!"
if(BP_R_HAND, BP_L_HAND)
ourmsg += "on the hand!"
if(BP_R_LEG, BP_L_LEG)
ourmsg += "on the leg!"
if(BP_R_FOOT, BP_L_FOOT)
ourmsg += "on the foot!"
if("mouth")
ourmsg += "on the mouth!"
if("eyes")
ourmsg += "on the eyes!"
ourmsg += "</span>"
visible_message(ourmsg)
@@ -143,6 +143,45 @@
H.verbs |= /mob/living/carbon/human/proc/succubus_drain_finalize
H.verbs |= /mob/living/carbon/human/proc/succubus_drain_lethal
/datum/trait/neutral/venom_bite
name = "Venomous Injection"
desc = "Allows for injecting prey through one method or another to inject them with a variety of chemicals with varying effects!"
tutorial = "This trait allows you to bite prey with varying effects! <br> \
Options for venoms: <br> \
=====Size Chemicals ===== <br> \
Microcillin: Will make someone shrink. (This is 1% per 0.01 units. So 1 unit = 100% size change) <br> \
Macrocillin: Will make someone grow. (This is 1% per 0.01 units. So 1 unit = 100% size change) <br> \
Normalcillin: Will make someone normal size. (This is 1% per 0.01 units. So 1 unit = 100% size change) Stops at 100% size. <br> \
===== Gender Chemicals ===== <br> \
Androrovir: Will transform someone's sex to male. <br> \
Gynorovir: Will transform someone's sex to female. <br> \
Androgynorovir: Will transform someone's sex to pleural. <br> \
===== Special Chemicals ===== <br> \
Stoxin: Will make someone drowsy. <br> \
Rainbow Toxin: Will make someone see rainbows. <br> \
Paralysis Toxin: Will make someone paralyzed. <br> \
Numbing Enzyme: Will make someone unable to feel pain. <br> \
Pain Enzyme: Will make someone feel pain, amplifieed <br> \
===== Side Notes ===== <br> \
You aren't required to inject anything if you prefer to just use it as a normal bite!"
cost = 0
custom_only = FALSE
/datum/trait/neutral/venom_bite/apply(var/datum/species/S,var/mob/living/carbon/human/H)
..()
H.verbs |= /mob/living/proc/injection
H.trait_injection_reagents += "microcillin" // get small
H.trait_injection_reagents += "macrocillin" // get BIG
H.trait_injection_reagents += "normalcillin" // normal
H.trait_injection_reagents += "numbenzyme" // no feelings
H.trait_injection_reagents += "androrovir" // -> MALE
H.trait_injection_reagents += "gynorovir" // -> FEMALE
H.trait_injection_reagents += "androgynorovir" // -> PLURAL
H.trait_injection_reagents += "stoxin" // night night chem
H.trait_injection_reagents += "rainbowtoxin" // Funny flashing lights.
H.trait_injection_reagents += "paralysistoxin" // Paralysis!
H.trait_injection_reagents += "painenzyme" // Pain INCREASER
/datum/trait/neutral/long_vore
name = "Long Predatorial Reach"
desc = "Makes you able to use an unspecified appendage to grab creatures."