Merge remote-tracking branch 'citadel/master' into tgsync

This commit is contained in:
silicons
2021-01-19 04:24:42 -07:00
105 changed files with 978 additions and 411 deletions
+1 -1
View File
@@ -61,7 +61,7 @@
#define BODYPART_NANITES 4
#define HYBRID_BODYPART_DAMAGE_THRESHHOLD 25 //How much damage has to be suffered until the damage threshhold counts as passed
#define HYBRID_BODYPART_THESHHOLD_MINDAMAGE 15 //Which damage value this limb cannot be healed out of via easy nonsurgical means if the threshhold has been passed, state resets if damage value goes below mindamage.
#define HYBRID_BODYPART_THESHHOLD_MINDAMAGE 10 //Which damage value this limb cannot be healed out of via easy nonsurgical means if the threshhold has been passed, state resets if damage value goes below mindamage.
#define BODYPART_NOT_DISABLED 0
#define BODYPART_DISABLED_DAMAGE 1
+3
View File
@@ -40,6 +40,9 @@
#define STATUS_EFFECT_DETERMINED /datum/status_effect/determined //currently in a combat high from being seriously wounded
#define STATUS_EFFECT_MANTRA /datum/status_effect/mantra // a toggled self buff that makes you stronger and more resilient, but drains stamina over time
#define STATUS_EFFECT_ASURA /datum/status_effect/asura // like a weaker version of mantra, drains HP instead of stamina and has no armor
/////////////
// DEBUFFS //
/////////////
+2 -2
View File
@@ -2,7 +2,7 @@
#define APPROVAL_VOTING "APPROVAL"
#define SCHULZE_VOTING "SCHULZE"
#define SCORE_VOTING "SCORE"
#define MAJORITY_JUDGEMENT_VOTING "MAJORITY_JUDGEMENT"
#define HIGHEST_MEDIAN_VOTING "HIGHEST_MEDIAN"
#define INSTANT_RUNOFF_VOTING "IRV"
#define SHOW_RESULTS (1<<0)
@@ -18,7 +18,7 @@ GLOBAL_LIST_INIT(vote_type_names,list(\
"IRV (single winner ranked choice)" = INSTANT_RUNOFF_VOTING,\
"Schulze (ranked choice, higher result=better)" = SCHULZE_VOTING,\
"Raw Score (returns results from 0 to 1, winner is 1)" = SCORE_VOTING,\
"Majority Judgement (single-winner score voting)" = MAJORITY_JUDGEMENT_VOTING,\
"Highest Median (single-winner score voting)" = HIGHEST_MEDIAN_VOTING,\
))
GLOBAL_LIST_INIT(display_vote_settings, list(\
+1 -1
View File
@@ -271,7 +271,7 @@ Turf and target are separate in case you want to teleport some distance from a t
if(skip_mindless && (!M.mind && !M.ckey))
if(!isbot(M) && !iscameramob(M) && !ismegafauna(M))
continue
if(M.client && M.client.holder && M.client.holder.fakekey) //stealthmins
if(M.client?.holder?.fakekey && isobserver(M))
continue
var/name = avoid_assoc_duplicate_keys(M.name, namecounts)
+1 -1
View File
@@ -89,7 +89,7 @@ GLOBAL_LIST_INIT(maintenance_loot, list(
/obj/effect/spawner/lootdrop/welder_tools = 3,
/obj/effect/spawner/lootdrop/low_tools = 5,
/obj/item/relic = 3,
/obj/item/weaponcrafting/improvised_parts/shotgun_receiver = 2,
/obj/item/weaponcrafting/receiver = 2,
/obj/item/clothing/head/cone = 2,
/obj/item/grenade/smokebomb = 2,
/obj/item/geiger_counter = 3,
+29 -38
View File
@@ -141,8 +141,8 @@ SUBSYSTEM_DEF(vote)
choices[choices[i]]++ // higher shortest path = better candidate, so we add to choices here
// choices[choices[i]] is the schulze ranking, here, rather than raw vote numbers
/datum/controller/subsystem/vote/proc/calculate_majority_judgement_vote(var/blackbox_text)
// https://en.wikipedia.org/wiki/Majority_judgment
/datum/controller/subsystem/vote/proc/calculate_highest_median(var/blackbox_text)
// https://en.wikipedia.org/wiki/Highest_median_voting_rules
var/list/scores_by_choice = list()
for(var/choice in choices)
scores_by_choice += "[choice]"
@@ -161,33 +161,24 @@ SUBSYSTEM_DEF(vote)
// END BALLOT GATHERING
for(var/score_name in scores_by_choice)
var/list/score = scores_by_choice[score_name]
for(var/indiv_score in score)
SSblackbox.record_feedback("nested tally","voting",1,list(blackbox_text,"Scores",score_name,GLOB.vote_score_options[indiv_score]))
if(score.len == 0)
scores_by_choice -= score_name
while(scores_by_choice.len > 1)
var/highest_median = 0
for(var/score_name in scores_by_choice) // first get highest median
var/list/score = scores_by_choice[score_name]
if(!score.len)
scores_by_choice -= score_name
continue
if(!score.len)
choices[score_name] = 0
else
var/median = score[max(1,round(score.len/2))]
if(median >= highest_median)
highest_median = median
for(var/score_name in scores_by_choice) // then, remove
var/list/score = scores_by_choice[score_name]
var/median = score[max(1,round(score.len/2))]
if(median < highest_median)
scores_by_choice -= score_name
for(var/score_name in scores_by_choice) // after removals
var/list/score = scores_by_choice[score_name]
if(score.len == 0)
choices[score_name] += 100 // we're in a tie situation--just go with the first one
return
var/median_pos = max(1,round(score.len/2))
score.Cut(median_pos,median_pos+1)
choices[score_name]++
var/p = 0 // proponents (those with higher than median)
var/q = 0 // opponents (lower than median)
var/list/this_score_list = scores_by_choice[score_name]
for(var/indiv_score in score)
SSblackbox.record_feedback("nested tally","voting",1,list(blackbox_text,"Scores",score_name,GLOB.vote_score_options[indiv_score]))
if(indiv_score < median) // this is possible to do in O(logn) but n is never more than 200 so this is fine
q += 1
else if(indiv_score > median)
p += 1
p /= this_score_list.len
q /= this_score_list.len
choices[score_name] = median + (((p - q) / (1 - p - q)) * 0.5) // usual judgement
// choices[score_name] = median + p - q // typical judgement
// choices[score_name] = median + (((p - q) / (p + q)) * 0.5) // central judgement
/datum/controller/subsystem/vote/proc/calculate_scores(var/blackbox_text)
for(var/choice in choices)
@@ -245,8 +236,8 @@ SUBSYSTEM_DEF(vote)
calculate_condorcet_votes(vote_title_text)
if(vote_system == SCORE_VOTING)
calculate_scores(vote_title_text)
if(vote_system == MAJORITY_JUDGEMENT_VOTING)
calculate_majority_judgement_vote(vote_title_text) // nothing uses this at the moment
if(vote_system == HIGHEST_MEDIAN_VOTING)
calculate_highest_median(vote_title_text) // nothing uses this at the moment
var/list/winners = vote_system == INSTANT_RUNOFF_VOTING ? get_runoff_results() : get_result()
var/was_roundtype_vote = mode == "roundtype" || mode == "dynamic"
if(winners.len > 0)
@@ -255,8 +246,8 @@ SUBSYSTEM_DEF(vote)
if(display_votes & SHOW_RESULTS)
if(vote_system == SCHULZE_VOTING)
text += "\nIt should be noted that this is not a raw tally of votes (impossible in ranked choice) but the score determined by the schulze method of voting, so the numbers will look weird!"
if(vote_system == MAJORITY_JUDGEMENT_VOTING)
text += "\nIt should be noted that this is not a raw tally of votes but the number of runoffs done by majority judgement!"
if(vote_system == HIGHEST_MEDIAN_VOTING)
text += "\nThis is the highest median score plus the tiebreaker!"
for(var/i=1,i<=choices.len,i++)
var/votes = choices[choices[i]]
if(!votes)
@@ -302,7 +293,7 @@ SUBSYSTEM_DEF(vote)
if(vote_system != SCORE_VOTING)
if(vote_system == SCHULZE_VOTING)
admintext += "\nIt should be noted that this is not a raw tally of votes (impossible in ranked choice) but the score determined by the schulze method of voting, so the numbers will look weird!"
else if(vote_system == MAJORITY_JUDGEMENT_VOTING)
else if(vote_system == HIGHEST_MEDIAN_VOTING)
admintext += "\nIt should be noted that this is not a raw tally of votes but the number of runoffs done by majority judgement!"
for(var/i=1,i<=choices.len,i++)
var/votes = choices[choices[i]]
@@ -429,7 +420,7 @@ SUBSYSTEM_DEF(vote)
voted[usr.ckey] = list()
voted[usr.ckey] += vote
saved -= usr.ckey
if(SCORE_VOTING,MAJORITY_JUDGEMENT_VOTING)
if(SCORE_VOTING,HIGHEST_MEDIAN_VOTING)
if(!(usr.ckey in voted))
voted += usr.ckey
voted[usr.ckey] = list()
@@ -584,7 +575,7 @@ SUBSYSTEM_DEF(vote)
. += "<h3>Vote any number of choices.</h3>"
if(SCHULZE_VOTING,INSTANT_RUNOFF_VOTING)
. += "<h3>Vote by order of preference. Revoting will demote to the bottom. 1 is your favorite, and higher numbers are worse.</h3>"
if(SCORE_VOTING,MAJORITY_JUDGEMENT_VOTING)
if(SCORE_VOTING,HIGHEST_MEDIAN_VOTING)
. += "<h3>Grade the candidates by how much you like them.</h3>"
. += "<h3>No-votes have no power--your opinion is only heard if you vote!</h3>"
. += "Time Left: [DisplayTimeText(end_time-world.time)]<hr><ul>"
@@ -621,7 +612,7 @@ SUBSYSTEM_DEF(vote)
. += "(Saved!)"
. += "(<a href='?src=[REF(src)];vote=load'>Load vote from save</a>)"
. += "(<a href='?src=[REF(src)];vote=reset'>Reset votes</a>)"
if(SCORE_VOTING,MAJORITY_JUDGEMENT_VOTING)
if(SCORE_VOTING,HIGHEST_MEDIAN_VOTING)
var/list/myvote = voted[C.ckey]
for(var/i=1,i<=choices.len,i++)
. += "<li><b>[choices[i]]</b>"
@@ -724,7 +715,7 @@ SUBSYSTEM_DEF(vote)
voted[usr.ckey] = SSpersistence.saved_votes[usr.ckey][mode]
if(islist(voted[usr.ckey]))
var/malformed = FALSE
if(vote_system == SCORE_VOTING || vote_system == MAJORITY_JUDGEMENT_VOTING)
if(vote_system == SCORE_VOTING || vote_system == HIGHEST_MEDIAN_VOTING)
for(var/thing in voted[usr.ckey])
if(!(thing in choices))
malformed = TRUE
@@ -738,7 +729,7 @@ SUBSYSTEM_DEF(vote)
to_chat(usr,"Your saved vote was malformed! Start over!")
voted -= usr.ckey
else
if(vote_system == SCORE_VOTING || vote_system == MAJORITY_JUDGEMENT_VOTING)
if(vote_system == SCORE_VOTING || vote_system == HIGHEST_MEDIAN_VOTING)
submit_vote(round(text2num(href_list["vote"])),round(text2num(href_list["score"])))
else
submit_vote(round(text2num(href_list["vote"])))
+6 -38
View File
@@ -2,6 +2,12 @@
/obj/item/weaponcrafting
icon = 'icons/obj/improvised.dmi'
/obj/item/weaponcrafting/receiver
name = "modular receiver"
desc = "A prototype modular receiver and trigger assembly for a firearm."
icon = 'icons/obj/improvised.dmi'
icon_state = "receiver"
/obj/item/weaponcrafting/stock
name = "rifle stock"
desc = "A classic rifle stock that doubles as a grip, roughly carved out of wood."
@@ -12,41 +18,3 @@
name = "wound thread"
desc = "A long piece of thread with some resemblance to cable coil."
icon_state = "durastring"
////////////////////////////////
// IMPROVISED WEAPON PARTS//
////////////////////////////////
/obj/item/weaponcrafting/improvised_parts
name = "Debug Improvised Gun Part"
desc = "A badly coded gun part. You should report coders if you see this."
icon = 'icons/obj/guns/gun_parts.dmi'
icon_state = "palette"
// RECEIVERS
/obj/item/weaponcrafting/improvised_parts/rifle_receiver
name = "rifle receiver"
desc = "A crudely constructed receiver to create an improvised bolt-action breechloaded rifle." // removed some text implying that the item had more uses than it does
icon_state = "receiver_rifle"
w_class = WEIGHT_CLASS_SMALL
/obj/item/weaponcrafting/improvised_parts/shotgun_receiver
name = "shotgun reciever"
desc = "An improvised receiver to create a break-action breechloaded shotgun." // removed some text implying that the item had more uses than it does
icon_state = "receiver_shotgun"
w_class = WEIGHT_CLASS_SMALL
// MISC
/obj/item/weaponcrafting/improvised_parts/trigger_assembly
name = "firearm trigger assembly"
desc = "A modular trigger assembly with a firing pin, this can be used to make a whole bunch of improvised firearss."
icon_state = "trigger_assembly"
w_class = WEIGHT_CLASS_SMALL
/obj/item/weaponcrafting/improvised_parts/wooden_body
name = "wooden firearm body"
desc = "A crudely fashioned wooden body to help keep higher calibre improvised weapons from blowing themselves apart."
icon_state = "wooden_body"
@@ -297,30 +297,15 @@
/datum/crafting_recipe/ishotgun
name = "Improvised Shotgun"
result = /obj/item/gun/ballistic/revolver/doublebarrel/improvised
reqs = list(/obj/item/pipe = 2, // putting a large amount of meaningless timegates by forcing people to turn base resources into upgraded resources kinda sucks
/obj/item/weaponcrafting/improvised_parts/shotgun_receiver = 1,
/obj/item/weaponcrafting/improvised_parts/trigger_assembly = 1,
/obj/item/weaponcrafting/improvised_parts/wooden_body = 1,
/obj/item/weaponcrafting/stock = 1,
/obj/item/stack/packageWrap = 5)
tools = list(TOOL_SCREWDRIVER)
time = 100
category = CAT_WEAPONRY
subcategory = CAT_WEAPON
/datum/crafting_recipe/irifle // larger and less versatile gun, but a bit easier to make
name = "Improvised Rifle (7.62mm)"
result = /obj/item/gun/ballistic/shotgun/boltaction/improvised
reqs = list(/obj/item/pipe = 2, // above
/obj/item/weaponcrafting/improvised_parts/rifle_receiver = 1,
/obj/item/weaponcrafting/improvised_parts/trigger_assembly = 1,
/obj/item/weaponcrafting/improvised_parts/wooden_body = 1,
reqs = list(/obj/item/pipe = 1,
/obj/item/weaponcrafting/receiver = 1,
/obj/item/weaponcrafting/stock = 1,
/obj/item/stack/packageWrap = 5)
tools = list(TOOL_SCREWDRIVER)
time = 100
category = CAT_WEAPONRY
subcategory = CAT_WEAPON
//the Improvised Rifle will not be missed. Rest in Pieces 2019-2021
//////////////////
///AMMO CRAFTING//
@@ -449,38 +434,6 @@
// PARTS CRAFTING //
////////////////////
// RECEIVERS
/datum/crafting_recipe/rifle_receiver
name = "Improvised Rifle Receiver"
result = /obj/item/weaponcrafting/improvised_parts/rifle_receiver
reqs = list(/obj/item/stack/sheet/metal = 15)
tools = list(TOOL_SCREWDRIVER, TOOL_WELDER)
time = 25
category = CAT_WEAPONRY
subcategory = CAT_PARTS
/datum/crafting_recipe/shotgun_receiver
name = "Improvised Shotgun Receiver"
result = /obj/item/weaponcrafting/improvised_parts/shotgun_receiver
reqs = list(/obj/item/stack/sheet/metal = 10) // shotgun does less damage than the rifle and can't 1shot but is more portable
tools = list(TOOL_SCREWDRIVER, TOOL_WELDER)
time = 20
category = CAT_WEAPONRY
subcategory = CAT_PARTS
// MISC
/datum/crafting_recipe/trigger_assembly
name = "Trigger Assembly"
result = /obj/item/weaponcrafting/improvised_parts/trigger_assembly
reqs = list(/obj/item/stack/sheet/metal = 3,
/obj/item/assembly/igniter = 1)
tools = list(TOOL_SCREWDRIVER, TOOL_WELDER)
time = 20
category = CAT_WEAPONRY
subcategory = CAT_PARTS
// BOKKEN CRAFTING
/datum/crafting_recipe/bokken_blade
+117
View File
@@ -651,3 +651,120 @@
if(D.severity == DISEASE_SEVERITY_POSITIVE)
continue
D.cure()
/datum/status_effect/mantra // available to wizards and admins alone, currently
id = "Mantra"
examine_text = "<span class='notice'>Their aura is filled with yellow energy!</span>"
alert_type = null
var/damageboost = 10
var/woundboost = 5
var/prev_hair_color
var/powerup
var/powerdown
/datum/status_effect/mantra/on_apply()
. = ..()
if(iscarbon(owner))
var/mob/living/carbon/human/H = owner
playsound(H, 'sound/magic/powerup.ogg', 50, 1)
H.add_filter("mantra_glow", 2, list("type" = "outline", "color" = "#edfa347a", "size" = 2))
prev_hair_color = H.hair_color
H.hair_color = "ffe11e"
H.update_hair()
ADD_TRAIT(H, TRAIT_PUGILIST, "Mantra")
ADD_TRAIT(H, TRAIT_NOSOFTCRIT, "Mantra")
ADD_TRAIT(H, TRAIT_STUNIMMUNE, "Mantra")
ADD_TRAIT(H, TRAIT_PUSHIMMUNE, "Mantra")
ADD_TRAIT(H, TRAIT_NOGUNS, "Mantra")
H.dna.species.punchdamagehigh += damageboost
H.dna.species.punchdamagelow += damageboost
H.dna.species.punchwoundbonus += woundboost
H.physiology.brute_mod *= 0.9 // slightly resilient against lethal damage, but...
H.physiology.burn_mod *= 0.9
H.physiology.stamina_mod *= 0.5 // very resistant to non-lethal damage, because they're already draining stamina every second
to_chat(H, "<span class='notice'>Your inner mantra coalesces around you, granting you incredible strength and durability - but at what cost?</span>")
/datum/status_effect/mantra/tick()
. = ..()
if(owner.health < HEALTH_THRESHOLD_FULLCRIT)
owner.remove_status_effect(STATUS_EFFECT_MANTRA)
return
if(owner.combat_flags & COMBAT_FLAG_HARD_STAMCRIT)
owner.remove_status_effect(STATUS_EFFECT_MANTRA)
return
if(iscarbon(owner))
var/mob/living/carbon/human/C = owner
C.adjustBruteLoss(-1) // slightly resilient against lethal damage
C.adjustFireLoss(-1)
C.adjustStaminaLoss(3) // in testing i personally found that 2/sec was too minimal and 4/sec was too much
/*if(SEND_SIGNAL(owner, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_ACTIVE)) // turning on combat mode flares up your aura
else*/
/datum/status_effect/mantra/on_remove()
. = ..()
if(iscarbon(owner))
var/mob/living/carbon/human/M = owner
playsound(M, 'sound/magic/powerdown.ogg', 50, 1)
M.remove_filter("mantra_glow")
M.hair_color = prev_hair_color
M.update_hair()
REMOVE_TRAIT(M, TRAIT_PUGILIST, "Mantra")
REMOVE_TRAIT(M, TRAIT_NOSOFTCRIT, "Mantra")
REMOVE_TRAIT(M, TRAIT_STUNIMMUNE, "Mantra")
REMOVE_TRAIT(M, TRAIT_PUSHIMMUNE, "Mantra")
REMOVE_TRAIT(M, TRAIT_NOGUNS, "Mantra")
M.dna.species.punchdamagehigh -= damageboost
M.dna.species.punchdamagelow -= damageboost
M.dna.species.punchwoundbonus -= woundboost
M.physiology.brute_mod /= 0.9
M.physiology.burn_mod /= 0.9
M.physiology.stamina_mod /= 0.5
to_chat(M, "<span class='notice'>Your inner mantra collapses, for now.</span>")
/datum/status_effect/asura // mfw miner gear
id = "Asura"
examine_text = "<span class='notice'>Their aura is filled with red-hot rage!</span>"
alert_type = null
var/damageboost = 10
var/woundboost = 5
/datum/status_effect/asura/on_apply()
. = ..()
if(iscarbon(owner))
var/mob/living/carbon/human/H = owner
playsound(H, 'sound/magic/powerup.ogg', 50, 1)
H.add_filter("asura_glow", 2, list("type" = "outline", "color" = "#fc21217a", "size" = 2))
ADD_TRAIT(H, TRAIT_PUGILIST, "Asura")
H.dna.species.punchdamagehigh += damageboost
H.dna.species.punchdamagelow += damageboost
H.dna.species.punchwoundbonus += woundboost
to_chat(H, "<span class='notice'>Your anger unleashes in a crimson blaze around you and corrosive power fills your muscles.</span>")
/datum/status_effect/asura/tick()
. = ..()
if(owner.health < HEALTH_THRESHOLD_CRIT)
owner.remove_status_effect(STATUS_EFFECT_ASURA)
return
if(owner.combat_flags & COMBAT_FLAG_HARD_STAMCRIT)
owner.remove_status_effect(STATUS_EFFECT_ASURA)
return
if(iscarbon(owner))
var/mob/living/carbon/human/C = owner
C.adjustBruteLoss(1) // drains 1 hp per second. You're gonna need some Senzu Cores.
C.adjustStaminaLoss(-2) // angry man punch a lot
/*if(SEND_SIGNAL(owner, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_ACTIVE)) // turning on combat mode flares up your aura
else*/
/datum/status_effect/asura/on_remove()
. = ..()
if(iscarbon(owner))
var/mob/living/carbon/human/M = owner
playsound(M, 'sound/magic/powerdown.ogg', 50, 1)
M.remove_filter("asura_glow")
REMOVE_TRAIT(M, TRAIT_PUGILIST, "Asura")
M.dna.species.punchdamagehigh -= damageboost
M.dna.species.punchdamagelow -= damageboost
M.dna.species.punchwoundbonus -= woundboost
to_chat(M, "<span class='notice'>You calm yourself, and your unnatural strength dissipates.</span>")
+8 -2
View File
@@ -74,13 +74,19 @@
/datum/status_effect/proc/on_remove() //Called whenever the buff expires or is removed; do note that at the point this is called, it is out of the owner's status_effects but owner is not yet null
SHOULD_CALL_PARENT(TRUE)
REMOVE_TRAIT(owner, TRAIT_COMBAT_MODE_LOCKED, src)
REMOVE_TRAIT(owner, TRAIT_SPRINT_LOCKED, src)
if(blocks_combatmode)
REMOVE_TRAIT(owner, TRAIT_COMBAT_MODE_LOCKED, src)
if(blocks_sprint)
REMOVE_TRAIT(owner, TRAIT_SPRINT_LOCKED, src)
return TRUE
/datum/status_effect/proc/be_replaced() //Called instead of on_remove when a status effect is replaced by itself or when a status effect with on_remove_on_mob_delete = FALSE has its mob deleted
owner.clear_alert(id)
LAZYREMOVE(owner.status_effects, src)
if(blocks_combatmode)
REMOVE_TRAIT(owner, TRAIT_COMBAT_MODE_LOCKED, src)
if(blocks_sprint)
REMOVE_TRAIT(owner, TRAIT_SPRINT_LOCKED, src)
owner = null
qdel(src)
@@ -664,9 +664,8 @@
lootcount = 1
spawn_on_turf = FALSE
loot = list("" = 50,
/obj/item/weaponcrafting/improvised_parts/rifle_receiver = 13,
/obj/item/weaponcrafting/improvised_parts/shotgun_receiver = 13,
/obj/item/weaponcrafting/improvised_parts/trigger_assembly = 12,
/obj/item/weaponcrafting/receiver = 25,
/obj/item/weaponcrafting/stock = 25,
)
/obj/effect/spawner/lootdrop/weapon_parts
@@ -674,8 +673,8 @@
lootcount = 1
spawn_on_turf = FALSE
loot = list("" = 80,
/obj/item/weaponcrafting/improvised_parts/rifle_receiver = 5,
/obj/item/weaponcrafting/improvised_parts/trigger_assembly = 5,
/obj/item/weaponcrafting/receiver = 5,
/obj/item/weaponcrafting/stock = 5,
)
/obj/effect/spawner/lootdrop/ammo
@@ -263,6 +263,7 @@
/obj/machinery/vending/cola = "Robust Softdrinks",
/obj/machinery/vending/cigarette = "ShadyCigs Deluxe",
/obj/machinery/vending/games = "\improper Good Clean Fun",
/obj/machinery/vending/kink = "KinkMate",
/obj/machinery/vending/autodrobe = "AutoDrobe",
/obj/machinery/vending/assist = "\improper Vendomat",
/obj/machinery/vending/engivend = "\improper Engi-Vend",
+1
View File
@@ -803,6 +803,7 @@
force = 4
throwforce = 0
attack_verb = list("whipped", "repented", "lashed", "flagellated")
slot_flags = ITEM_SLOT_BELT
var/praying = FALSE
var/deity_name = "Coderbus" //This is the default, hopefully won't actually appear if the religion subsystem is running properly
+48
View File
@@ -476,3 +476,51 @@
return TRUE
to_chat(user, "<span class='warning'>You can't heal [M] with the \the [src]!</span>")
/obj/item/stack/medical/nanogel
name = "nanogel"
singular_name = "nanogel"
desc = "A highly advanced gel that when applied on a sufficiently repaired robotic limb will neutralize internal damage if present, allowing further repairs without the need for surgery."
self_delay = 150 //Agonizingly slow if used on self, but, not completely forbidden because antags with robolimbs need a way to handle their thresholds.
other_delay = 30 //Pretty fast if used on others.
amount = 12
max_amount = 12 //Two synths worth of fixing, if every single bodypart of them has internal damage. Usually, probably more like 6-12.
icon_state = "nanogel"
var/being_applied = FALSE //No doafter stacking.
/obj/item/stack/medical/nanogel/try_heal(mob/living/M, mob/user, silent = FALSE)
if(being_applied)
to_chat(user, "<span class='warning'>You are already applying [src]!</span>")
return
if(!iscarbon(M))
to_chat(user, "<span class='warning'>This won't work on [M]!</span>")
return
being_applied = TRUE
..()
being_applied = FALSE
/obj/item/stack/medical/nanogel/heal(mob/living/M, mob/user)
var/mob/living/carbon/C = M //Only carbons should be able to get here
if(!C)
return
var/obj/item/bodypart/affecting = C.get_bodypart(check_zone(user.zone_selected))
if(!affecting) //Missing limb?
to_chat(user, "<span class='warning'>[C] doesn't have \a [parse_zone(user.zone_selected)]!</span>")
return
if(!affecting.is_robotic_limb())
to_chat(user, "<span class='warning'>This won't work on nonrobotic limbs!</span>")
return
if(!affecting.threshhold_brute_passed && !affecting.threshhold_burn_passed)
to_chat(user, "<span class='warning'>There is no need to use this on [affecting]</span>")
return
if(affecting.threshhold_brute_passed && affecting.brute_dam == affecting.threshhold_passed_mindamage)
. = TRUE
affecting.threshhold_brute_passed = FALSE
if(affecting.threshhold_burn_passed && affecting.burn_dam == affecting.threshhold_passed_mindamage)
. = TRUE
affecting.threshhold_burn_passed = FALSE
if(.)
user.visible_message("<span class='green'>The nanogel gets to work on [C], repairing [affecting]'s internal damage.</span>", "<span_class='green'>You watch as the nanogel gets to work on fixing the internal damage in [affecting]</span>")
return
//If it gets here: It failed, lets tell the user why.
to_chat(user, "<span class='warning'>[src] fails to work on [affecting] due to residual [(affecting.threshhold_burn_passed && affecting.threshhold_burn_passed) ? "brute and burn" : "[affecting.threshhold_burn_passed ? "burn" : "brute"]"] damage! Perform some external repairs before using this.</span>")
@@ -246,7 +246,6 @@ GLOBAL_LIST_INIT(wood_recipes, list ( \
new /datum/stack_recipe("pew (right)", /obj/structure/chair/pew/right, 3, one_per_turf = TRUE, on_floor = TRUE),\
)),
null, \
new/datum/stack_recipe("wooden firearm body", /obj/item/weaponcrafting/improvised_parts/wooden_body, 10, time = 20), \
new/datum/stack_recipe("rifle stock", /obj/item/weaponcrafting/stock, 10, time = 20), \
new/datum/stack_recipe("rolling pin", /obj/item/kitchen/rollingpin, 2, time = 30), \
new/datum/stack_recipe("wooden bucket", /obj/item/reagent_containers/glass/bucket/wood, 2, time = 30), \
@@ -391,7 +390,7 @@ GLOBAL_LIST_INIT(cloth_recipes, list ( \
new/datum/stack_recipe("construction bag", /obj/item/storage/bag/construction, 4), \
null, \
new/datum/stack_recipe("string", /obj/item/weaponcrafting/string, 1, time = 10), \
new/datum/stack_recipe("improvised gauze", /obj/item/stack/medical/gauze/improvised, 1, 2, 6), \
new/datum/stack_recipe("improvised gauze", /obj/item/stack/medical/gauze/improvised, 1, 2, 10), \
new/datum/stack_recipe("rag", /obj/item/reagent_containers/rag, 1), \
new/datum/stack_recipe("towel", /obj/item/reagent_containers/rag/towel, 3), \
new/datum/stack_recipe("bedsheet", /obj/item/bedsheet, 3), \
+4 -4
View File
@@ -193,7 +193,7 @@
return FALSE
stunpwr *= round(stuncharge/hitcost, 0.1)
if(!user.UseStaminaBuffer(getweight(user, STAM_COST_BATON_MOB_MULT), warn = TRUE))
if(user && !user.UseStaminaBuffer(getweight(user, STAM_COST_BATON_MOB_MULT), warn = TRUE))
return FALSE
if(!disarming)
@@ -314,12 +314,12 @@
/obj/item/melee/baton/boomerang
name = "\improper OZtek Boomerang"
desc = "A device invented in 2486 for the great Space Emu War by the confederacy of Australicus, these high-tech boomerangs also work exceptionally well at stunning crewmembers. Just be careful to catch it when thrown!"
throw_speed = 1
throw_speed = 1.5
icon_state = "boomerang"
item_state = "boomerang"
force = 5
throwforce = 5
throw_range = 5
throw_range = 10
hitcost = 2000
throw_hit_chance = 99 //Have you prayed today?
custom_materials = list(/datum/material/iron = 10000, /datum/material/glass = 4000, /datum/material/silver = 10000, /datum/material/gold = 2000)
@@ -328,7 +328,7 @@
if(turned_on)
if(ishuman(thrower))
var/mob/living/carbon/human/H = thrower
H.throw_mode_off() //so they can catch it on the return.
H.throw_mode_on() //so they can catch it on the return.
return ..()
/obj/item/melee/baton/boomerang/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
@@ -96,7 +96,7 @@
new /obj/item/tank/internals/emergency_oxygen/engi(src)
new /obj/item/analyzer(src)
new /obj/item/holosign_creator/atmos(src)
new /obj/item/holosign_creator/firelock(src)
new /obj/item/holosign_creator/firelock(src) //what if atmos techs could test things they are meant to test, wild, innit?
new /obj/item/watertank/atmos(src)
new /obj/item/clothing/suit/fire/atmos(src)
new /obj/item/clothing/head/hardhat/atmos(src)
+2 -1
View File
@@ -59,7 +59,7 @@ GLOBAL_LIST_INIT(freqtospan, list(
var/endspanpart = "</span>"
//Message
var/messagepart = " <span class='message'>[say_emphasis(lang_treat(speaker, message_language, raw_message, spans, message_mode))]</span></span>"
var/messagepart = " <span class='message'>[lang_treat(speaker, message_language, raw_message, spans, message_mode)]</span></span>"
var/languageicon = ""
var/datum/language/D = GLOB.language_datum_instances[message_language]
@@ -116,6 +116,7 @@ GLOBAL_LIST_INIT(freqtospan, list(
/atom/movable/proc/lang_treat(atom/movable/speaker, datum/language/language, raw_message, list/spans, message_mode, no_quote = FALSE)
if(has_language(language))
var/atom/movable/AM = speaker.GetSource()
raw_message = say_emphasis(raw_message)
if(AM) //Basically means "if the speaker is virtual"
return no_quote ? AM.quoteless_say_quote(raw_message, spans, message_mode) : AM.say_quote(raw_message, spans, message_mode)
else
@@ -38,7 +38,7 @@
dat += "<A href='byond://?src=[REF(src)];school=[APPRENTICE_ROBELESS]'>Robeless</A><BR>"
dat += "<I>Your apprentice is training to cast spells without their robes. They know Knock and Mindswap.</I><BR>"
dat += "<A href='byond://?src=[REF(src)];school=[APPRENTICE_MARTIAL]'>Martial Artist</a><BR>"
dat += "<I>Your apprentice is training in ancient martial arts. They know the Plasmafist and Nuclear Fist.</I><BR>"
dat += "<I>Your apprentice is training in ancient martial arts. They know an Inner Mantra and the Nuclear Fist technique.</I><BR>"
user << browse(dat, "window=radio")
onclose(user, "radio")
return
@@ -69,6 +69,7 @@ GLOBAL_LIST_INIT(abductor_gear, subtypesof(/datum/abductor_gear))
build_path = /obj/item/abductor_machine_beacon/chem_dispenser
category = "Advanced Gear"
/*
/datum/abductor_gear/shrink_ray
name = "Shrink Ray Blaster"
description = "This is a piece of frightening alien tech that enhances the magnetic pull of atoms in a localized space to temporarily make an object shrink. \
@@ -77,3 +78,4 @@ GLOBAL_LIST_INIT(abductor_gear, subtypesof(/datum/abductor_gear))
cost = 2
build_path = /obj/item/gun/energy/shrink_ray
category = "Advanced Gear"
*/
@@ -189,6 +189,10 @@
name = "Mutate"
spell_type = /obj/effect/proc_holder/spell/targeted/genetic/mutate
/datum/spellbook_entry/mantra
name = "Inner Mantra"
spell_type = /obj/effect/proc_holder/spell/self/mantra
/datum/spellbook_entry/jaunt
name = "Ethereal Jaunt"
spell_type = /obj/effect/proc_holder/spell/targeted/ethereal_jaunt
+2 -2
View File
@@ -181,8 +181,8 @@
to_chat(owner, "<B>Your service has not gone unrewarded, however. Studying under [master.current.real_name], you have learned stealthy, robeless spells. You are able to cast knock and mindswap.")
if(APPRENTICE_MARTIAL)
owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/touch/nuclear_fist(null))
H.put_in_hands(new /obj/item/book/granter/martial/plasma_fist(H))
to_chat(owner, "<B>Your service has not gone unrewarded, however. Studying under [master.current.real_name], you have learned mystical martial abilities. You are also able to use the Nuclear Fist at will.")
owner.AddSpell(new /obj/effect/proc_holder/spell/self/mantra(null))
to_chat(owner, "<B>Your service has not gone unrewarded, however. Studying under [master.current.real_name], you have learned to control your Inner Mantra. You are also able to use the Nuclear Fist at will.")
/datum/antagonist/wizard/apprentice/create_objectives()
var/datum/objective/protect/new_objective = new /datum/objective/protect
+1
View File
@@ -123,6 +123,7 @@ obj/item/dildo/flared/huge
desc = "THIS THING IS HUGE!"
dildo_size = 4
force = 10
hitsound = 'sound/weapons/klonk.ogg'
obj/item/dildo/custom
name = "customizable dildo"
@@ -196,7 +196,7 @@
/obj/item/dice/d20/fate/proc/effect(var/mob/living/carbon/human/user,roll)
if(!reusable)
used = 1
visible_message("<span class='userdanger'>The die flare briefly.</span>")
visible_message("<span class='userdanger'>The die flares briefly.</span>")
switch(roll)
if(1)
//Dust
@@ -510,12 +510,12 @@ Contains:
name = "paramedic EVA suit"
icon_state = "paramedic-eva"
item_state = "paramedic-eva"
desc = "A deep blue space suit decorated with red and white crosses to indicate that the wearer is trained emergency medical personnel."
desc = "A deep blue space suit decorated with medical insignia to indicate that the wearer is trained emergency medical personnel."
allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/roller)
/obj/item/clothing/head/helmet/space/eva/paramedic
name = "paramedic EVA helmet"
desc = "A deep blue space helmet with a large red cross on the faceplate to designate the wearer as trained emergency medical personnel."
desc = "A deep blue space helmet decorated with medical insignia to designate the wearer as trained emergency medical personnel."
icon_state = "paramedic-eva-helmet"
item_state = "paramedic-eva-helmet"
+6 -1
View File
@@ -55,7 +55,7 @@
/obj/item/clothing/suit/toggle/labcoat/virologist
name = "virologist labcoat"
desc = "A suit that protects against minor chemical spills. Offers slightly more protection against biohazards than the standard model. Has a green stripe on the shoulder."
desc = "A suit that protects against minor chemical spills. Has a green stripe on the shoulder."
icon_state = "labcoat_vir"
/obj/item/clothing/suit/toggle/labcoat/science
@@ -63,6 +63,11 @@
desc = "A suit that protects against minor chemical spills. Has a purple stripe on the shoulder."
icon_state = "labcoat_tox"
/obj/item/clothing/suit/toggle/labcoat/roboticist
name = "roboticist labcoat"
desc = "More like an eccentric coat than a labcoat. Helps pass off bloodstains as part of the aesthetic. Comes with red shoulder pads."
icon_state = "labcoat_robo"
// Departmental Jackets
/obj/item/clothing/suit/toggle/labcoat/depjacket
mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON
+8
View File
@@ -58,6 +58,11 @@
RemoveHood()
/obj/item/clothing/suit/hooded/proc/ToggleHood()
if(!hood)
to_chat(loc, "<span class='warning'>[src] seems to be missing its hood..</span>")
return
hood.atom_colours = atom_colours.Copy()
hood.update_atom_colour()
if(!suittoggled)
if(ishuman(src.loc))
var/mob/living/carbon/human/H = src.loc
@@ -191,7 +196,10 @@
if(!helmettype)
return
if(!helmet)
to_chat(H, "<span class='warning'>[src] seems to be missing its helmet..</span>")
return
helmet.atom_colours = atom_colours.Copy()
helmet.update_atom_colour()
if(!suittoggled)
if(ishuman(src.loc))
if(H.wear_suit != src)
@@ -596,7 +596,7 @@
name = "Buzz Fuzz"
desc = "The sister drink of Shambler's Juice! Uses real honey, making it a sweet tooth's dream drink. The slogan reads ''A Hive of Flavour'', there's also a label about how it is adddicting."
icon_state = "honeysoda_can"
list_reagents = list(/datum/reagent/consumable/buzz_fuzz = 25, /datum/reagent/consumable/honey = 5)
list_reagents = list(/datum/reagent/consumable/buzz_fuzz = 30)
foodtype = SUGAR | JUNKFOOD
/obj/item/reagent_containers/food/drinks/soda_cans/grey_bull
@@ -117,7 +117,7 @@
/obj/item/weldingtool = 3,
/obj/item/wirecutters = 2,
/obj/item/wrench = 4,
/obj/item/weaponcrafting/improvised_parts/shotgun_receiver = 1,
/obj/item/weaponcrafting/receiver = 1,
/obj/item/geiger_counter = 3,
/obj/item/reagent_containers/food/snacks/grown/citrus/orange = 5,
/obj/item/assembly/infra = 1,
+1 -1
View File
@@ -32,7 +32,7 @@
l_pocket = /obj/item/pda/roboticist
ears = /obj/item/radio/headset/headset_sci
uniform = /obj/item/clothing/under/rank/rnd/roboticist
suit = /obj/item/clothing/suit/toggle/labcoat
suit = /obj/item/clothing/suit/toggle/labcoat/roboticist
backpack = /obj/item/storage/backpack/science
satchel = /obj/item/storage/backpack/satchel/tox
@@ -1104,7 +1104,7 @@
if(1)
new /obj/item/mayhem(src)
if(2)
new /obj/item/gun/ballistic/revolver/doublebarrel/super(src)
new /obj/item/book/granter/spell/asura(src)
if(3)
new /obj/item/guardiancreator(src)
@@ -1187,6 +1187,13 @@
unique_reskin = null
sawn_off = TRUE
/obj/item/book/granter/spell/asura
spell = /obj/effect/proc_holder/spell/self/asura
spellname = "asuras wrath"
icon_state = "bookasura"
desc = "This crimson novel emanates rage incarnate."
remarks = list("Kaio-What?", "It can only be sustained for a short time...", "It's like a massive upsurge of energy...", "Takes a heavy toll on the user's body...?", "Extra arms not included...", "There's stronger levels? Why aren't they in the book...")
//Colossus
/obj/structure/closet/crate/necropolis/colossus
name = "colossus chest"
@@ -243,6 +243,10 @@
icon_state = "none"
relevant_layers = null
/datum/sprite_accessory/insect_fluff/brown
name = "Brown"
icon_state = "brown"
/datum/sprite_accessory/insect_fluff/punished
name = "Burnt Off"
icon_state = "punished"
@@ -271,6 +275,10 @@
name = "Deathshead"
icon_state = "deathhead"
/datum/sprite_accessory/insect_fluff/featherymoth
name = "Feathery Moth"
icon_state = "featherymoth"
/datum/sprite_accessory/insect_fluff/firewatch
name = "Firewatch"
icon_state = "firewatch"
@@ -291,18 +299,22 @@
name = "Moon Fly"
icon_state = "moonfly"
/datum/sprite_accessory/insect_fluff/oakworm
name = "Oak Worm"
icon_state = "oakworm"
/datum/sprite_accessory/insect_fluff/plain
name = "Plain"
icon_state = "plain"
/datum/sprite_accessory/insect_fluff/plasmafire
name = "Plasma Fire"
icon_state = "plasmafire"
/datum/sprite_accessory/insect_fluff/poison
name = "Poison"
icon_state = "poison"
/datum/sprite_accessory/insect_fluff/oakworm
name = "Oak Worm"
icon_state = "oakworm"
/datum/sprite_accessory/insect_fluff/ragged
name = "Ragged"
icon_state = "ragged"
@@ -311,6 +323,10 @@
name = "Reddish"
icon_state = "redish"
/datum/sprite_accessory/insect_fluff/rosy
name = "Rosy"
icon_state = "rosy"
/datum/sprite_accessory/insect_fluff/royal
name = "Royal"
icon_state = "royal"
@@ -326,4 +342,3 @@
/datum/sprite_accessory/insect_fluff/witchwing
name = "Witch Wing"
icon_state = "witchwing"
@@ -58,9 +58,7 @@
dimension_y = 34
relevant_layers = list(BODY_BEHIND_LAYER, BODY_ADJ_LAYER, BODY_FRONT_LAYER)
/datum/sprite_accessory/deco_wings/atlas
name = "Atlas"
icon_state = "atlas"
//nonmoth wings
/datum/sprite_accessory/deco_wings/bat
name = "Bat"
@@ -70,18 +68,76 @@
name = "Bee"
icon_state = "bee"
/datum/sprite_accessory/deco_wings/deathhead
name = "Deathshead"
icon_state = "deathhead"
/datum/sprite_accessory/deco_wings/bee2
name = "Small Bee"
icon_state = "beewings"
/datum/sprite_accessory/deco_wings/dragon
name = "Dragon"
icon_state = "dragon"
/datum/sprite_accessory/deco_wings/dragonfly
name = "Dragonfly"
icon_state = "dragonfly"
/datum/sprite_accessory/deco_wings/fairy
name = "Fairy"
icon_state = "fairy"
/datum/sprite_accessory/deco_wings/feathery
/datum/sprite_accessory/deco_wings/featheredwing
name = "Feathery"
icon_state = "feathery"
/datum/sprite_accessory/deco_wings/featheredwingmedium
name = "Medium Feathered"
icon_state = "feathered3"
/datum/sprite_accessory/deco_wings/featheredwinglarge
name = "Large Feathered"
icon_state = "feathered2"
/datum/sprite_accessory/deco_wings/harpywings
name = "Harpy"
icon_state = "harpywings"
/datum/sprite_accessory/deco_wings/roboticwing
name = "Robotic"
icon_state = "drago"
/datum/sprite_accessory/deco_wings/succubusblack
name = "Succubus Black"
icon_state = "succubusblack"
/datum/sprite_accessory/deco_wings/succubuspurple
name = "Succubus Purple"
icon_state = "succubuspurple"
/datum/sprite_accessory/deco_wings/succubusred
name = "Succubus Red"
icon_state = "succubusred"
/datum/sprite_accessory/deco_wings/xenobackplate
name = "Xenomorph Backplate"
icon_state = "snagbackplate"
//moth wings
/datum/sprite_accessory/deco_wings/atlas
name = "Atlas"
icon_state = "atlas"
/datum/sprite_accessory/deco_wings/brown
name = "Brown"
icon_state = "brown"
/datum/sprite_accessory/deco_wings/deathhead
name = "Deathshead"
icon_state = "deathhead"
/datum/sprite_accessory/deco_wings/featherymoth
name = "Feathery Moth Wings"
icon_state = "featherymoth"
/datum/sprite_accessory/deco_wings/firewatch
name = "Firewatch"
icon_state = "firewatch"
@@ -90,6 +146,10 @@
name = "Gothic"
icon_state = "gothic"
/datum/sprite_accessory/deco_wings/jungle
name = "Jungle"
icon_state = "jungle"
/datum/sprite_accessory/deco_wings/lovers
name = "Lovers"
icon_state = "lovers"
@@ -106,10 +166,18 @@
name = "Moon Fly"
icon_state = "moonfly"
/datum/sprite_accessory/deco_wings/oakworm
name = "Oak Worm"
icon_state = "oakworm"
/datum/sprite_accessory/deco_wings/plain
name = "Plain"
icon_state = "plain"
/datum/sprite_accessory/deco_wings/plasmafire
name = "Plasma Fire"
icon_state = "plasmafire"
/datum/sprite_accessory/deco_wings/poison
name = "Poison"
icon_state = "poison"
@@ -126,6 +194,10 @@
name = "Reddish"
icon_state = "redish"
/datum/sprite_accessory/deco_wings/rosy
name = "Rosy"
icon_state = "rosy"
/datum/sprite_accessory/deco_wings/royal
name = "Royal"
icon_state = "royal"
@@ -138,18 +210,10 @@
name = "White Fly"
icon_state = "whitefly"
/datum/sprite_accessory/deco_wings/oakworm
name = "Oak Worm"
icon_state = "oakworm"
/datum/sprite_accessory/deco_wings/witchwing
name = "Witch Wing"
icon_state = "witchwing"
/datum/sprite_accessory/deco_wings/jungle
name = "Jungle"
icon_state = "jungle"
//INSECT WINGS
/datum/sprite_accessory/insect_wings
@@ -157,6 +221,69 @@
color_src = WINGCOLOR
relevant_layers = list(BODY_BEHIND_LAYER, BODY_FRONT_LAYER)
//non insect wings
/datum/sprite_accessory/deco_wings/bat
name = "Bat"
icon_state = "bat"
/datum/sprite_accessory/insect_wings/bee
name = "Bee"
icon_state = "bee"
/datum/sprite_accessory/insect_wings/bee2
name = "Small Bee"
icon_state = "beewings"
/datum/sprite_accessory/insect_wings/dragon
name = "Dragon"
icon_state = "dragon"
/datum/sprite_accessory/insect_wings/dragonfly
name = "Dragonfly"
icon_state = "dragonfly"
/datum/sprite_accessory/insect_wings/fairy
name = "Fairy"
icon_state = "fairy"
/datum/sprite_accessory/insect_wings/featheredwing
name = "Feathery"
icon_state = "feathery"
/datum/sprite_accessory/insect_wings/featheredwingmedium
name = "Medium Feathered"
icon_state = "feathered3"
/datum/sprite_accessory/insect_wings/featheredwinglarge
name = "Large Feathered"
icon_state = "feathered2"
/datum/sprite_accessory/insect_wings/harpywings
name = "Harpy"
icon_state = "harpywings"
/datum/sprite_accessory/insect_wings/roboticwing
name = "Robotic"
icon_state = "drago"
/datum/sprite_accessory/insect_wings/succubusblack
name = "Succubus Black"
icon_state = "succubusblack"
/datum/sprite_accessory/insect_wings/succubuspurple
name = "Succubus Purple"
icon_state = "succubuspurple"
/datum/sprite_accessory/insect_wings/succubusred
name = "Succubus Red"
icon_state = "succubusred"
/datum/sprite_accessory/insect_wings/xenobackplate
name = "Xenomorph Backplate"
icon_state = "snagbackplate"
//moth wings
/datum/sprite_accessory/insect_wings/none
name = "None"
icon_state = "none"
@@ -166,25 +293,17 @@
name = "Atlas"
icon_state = "atlas"
/datum/sprite_accessory/insect_wings/bat
name = "Bat"
icon_state = "bat"
/datum/sprite_accessory/insect_wings/bee
name = "Bee"
icon_state = "bee"
/datum/sprite_accessory/insect_wings/brown
name = "Brown"
icon_state = "brown"
/datum/sprite_accessory/insect_wings/deathhead
name = "Deathshead"
icon_state = "deathhead"
/datum/sprite_accessory/insect_wings/fairy
name = "Fairy"
icon_state = "fairy"
/datum/sprite_accessory/insect_wings/feathery
name = "Feathery"
icon_state = "feathery"
/datum/sprite_accessory/insect_wings/featherymoth
name = "Feathery Moth Wings"
icon_state = "featherymoth"
/datum/sprite_accessory/insect_wings/firewatch
name = "Firewatch"
@@ -222,6 +341,10 @@
name = "Plain"
icon_state = "plain"
/datum/sprite_accessory/insect_wings/plasmafire
name = "Plasma Fire"
icon_state = "plasmafire"
/datum/sprite_accessory/insect_wings/poison
name = "Poison"
icon_state = "poison"
@@ -238,6 +361,10 @@
name = "Reddish"
icon_state = "redish"
/datum/sprite_accessory/insect_wings/rosy
name = "Rosy"
icon_state = "rosy"
/datum/sprite_accessory/insect_wings/royal
name = "Royal"
icon_state = "royal"
@@ -265,45 +392,25 @@
icon_state = "none"
relevant_layers = null
/datum/sprite_accessory/insect_markings/reddish
name = "Reddish"
icon_state = "reddish"
/datum/sprite_accessory/insect_markings/royal
name = "Royal"
icon_state = "royal"
/datum/sprite_accessory/insect_markings/gothic
name = "Gothic"
icon_state = "gothic"
/datum/sprite_accessory/insect_markings/whitefly
name = "White Fly"
icon_state = "whitefly"
/datum/sprite_accessory/insect_markings/lovers
name = "Lovers"
icon_state = "lovers"
/datum/sprite_accessory/insect_markings/punished
name = "Punished"
icon_state = "punished"
/datum/sprite_accessory/insect_markings/deathhead
name = "Deathshead"
icon_state = "deathhead"
/datum/sprite_accessory/insect_markings/firewatch
name = "Firewatch"
icon_state = "firewatch"
/datum/sprite_accessory/insect_markings/deathhead
name = "Deathshead"
icon_state = "deathhead"
/datum/sprite_accessory/insect_markings/gothic
name = "Gothic"
icon_state = "gothic"
/datum/sprite_accessory/insect_markings/poison
name = "Poison"
icon_state = "poison"
/datum/sprite_accessory/insect_markings/jungle
name = "Jungle"
icon_state = "jungle"
/datum/sprite_accessory/insect_markings/ragged
name = "Ragged"
icon_state = "ragged"
/datum/sprite_accessory/insect_markings/lovers
name = "Lovers"
icon_state = "lovers"
/datum/sprite_accessory/insect_markings/moonfly
name = "Moon Fly"
@@ -313,10 +420,42 @@
name = "Oak Worm"
icon_state = "oakworm"
/datum/sprite_accessory/insect_markings/jungle
name = "Jungle"
icon_state = "jungle"
/datum/sprite_accessory/insect_markings/poison
name = "Poison"
icon_state = "poison"
/datum/sprite_accessory/insect_markings/punished
name = "Punished"
icon_state = "punished"
/datum/sprite_accessory/insect_markings/ragged
name = "Ragged"
icon_state = "ragged"
/datum/sprite_accessory/insect_markings/reddish
name = "Reddish"
icon_state = "reddish"
/datum/sprite_accessory/insect_markings/royal
name = "Royal"
icon_state = "royal"
/datum/sprite_accessory/insect_markings/whitefly
name = "White Fly"
icon_state = "whitefly"
/datum/sprite_accessory/insect_markings/witchwing
name = "Witch Wing"
icon_state = "witchwing"
//DONATOR WINGS
/datum/sprite_accessory/deco_wings/eyestalks
name = "gazer eyestalks"
icon_state = "eyestalks"
//ckeys_allowed = list("liquidfirefly","seiga") //At request.
/datum/sprite_accessory/insect_wings/eyestalks
name = "gazer eyestalks"
icon_state = "eyestalks"
//ckeys_allowed = list("liquidfirefly","seiga") //At request.
@@ -304,10 +304,16 @@
emote("wag")
else if(check_zone(M.zone_selected) == BODY_ZONE_R_ARM || check_zone(M.zone_selected) == BODY_ZONE_L_ARM)
M.visible_message( \
"<span class='notice'>[M] shakes [src]'s hand.</span>", \
"<span class='notice'>You shake [src]'s hand.</span>", target = src,
target_message = "<span class='notice'>[M] shakes your hand.</span>")
if((pulling == M) && (grab_state == GRAB_PASSIVE))
M.visible_message( \
"<span class='notice'>[M] squeezes [src]'s hand.</span>", \
"<span class='notice'>You squeeze [src]'s hand.</span>", target = src,
target_message = "<span class='notice'>[M] squeezes your hand.</span>")
else
M.visible_message( \
"<span class='notice'>[M] shakes [src]'s hand.</span>", \
"<span class='notice'>You shake [src]'s hand.</span>", target = src,
target_message = "<span class='notice'>[M] shakes your hand.</span>")
else
M.visible_message("<span class='notice'>[M] hugs [src] to make [p_them()] feel better!</span>", \
@@ -80,10 +80,11 @@
if("shortlimbdisable")
var/disabled_type = pick(list(TRAIT_PARALYSIS_L_ARM, TRAIT_PARALYSIS_R_ARM, TRAIT_PARALYSIS_L_LEG, TRAIT_PARALYSIS_R_LEG))
ADD_TRAIT(src, disabled_type, CORRUPTED_SYSTEM)
update_disabled_bodyparts()
addtimer(CALLBACK(src, .proc/reenable_limb, disabled_type), 5 SECONDS)
to_chat(src, "<span class='warning'>Error - Limb control subsystem partially shutdown, rebooting.</span>")
if("shortblind")
ADD_TRAIT(src, TRAIT_BLIND, CORRUPTED_SYSTEM)
become_blind(CORRUPTED_SYSTEM)
addtimer(CALLBACK(src, .proc/reenable_vision), 5 SECONDS)
to_chat(src, "<span class='warning'>Visual receptor shutdown detected - Initiating reboot.</span>")
if("shortstun")
@@ -105,10 +106,11 @@
if("longlimbdisable")
var/disabled_type = pick(list(TRAIT_PARALYSIS_L_ARM, TRAIT_PARALYSIS_R_ARM, TRAIT_PARALYSIS_L_LEG, TRAIT_PARALYSIS_R_LEG))
ADD_TRAIT(src, disabled_type, CORRUPTED_SYSTEM)
update_disabled_bodyparts()
addtimer(CALLBACK(src, .proc/reenable_limb, disabled_type), 25 SECONDS)
to_chat(src, "<span class='warning'>Fatal error in limb control subsystem - rebooting.</span>")
if("blindmutedeaf")
ADD_TRAIT(src, TRAIT_BLIND, CORRUPTED_SYSTEM)
become_blind(CORRUPTED_SYSTEM)
addtimer(CALLBACK(src, .proc/reenable_vision), (rand(10, 25)) SECONDS)
ADD_TRAIT(src, TRAIT_DEAF, CORRUPTED_SYSTEM)
addtimer(CALLBACK(src, .proc/reenable_hearing), (rand(15, 35)) SECONDS)
@@ -140,6 +142,7 @@
/mob/living/carbon/proc/reenable_limb(disabled_limb)
REMOVE_TRAIT(src, disabled_limb, CORRUPTED_SYSTEM)
update_disabled_bodyparts()
to_chat(src, "<span class='notice'>Limb control subsystem successfully rebooted.</span>")
/mob/living/carbon/proc/reenable_hearing()
@@ -147,7 +150,7 @@
to_chat(src, "<span class='notice'>Hearing restored.</span>")
/mob/living/carbon/proc/reenable_vision()
REMOVE_TRAIT(src, TRAIT_BLIND, CORRUPTED_SYSTEM)
cure_blind(CORRUPTED_SYSTEM)
to_chat(src, "<span class='notice'>Visual receptors back online.</span>")
/mob/living/carbon/proc/reenable_speech()
@@ -411,15 +411,18 @@
if(isrobotic(src))
apply_status_effect(/datum/status_effect/no_combat_mode/robotic_emp, severity / 20)
severity *= 0.5
var/do_not_stun = FALSE
if(HAS_TRAIT(src, TRAIT_ROBOTIC_ORGANISM))
severity *= 0.5 //Robotpeople take less limb damage, but instead suffer system corruption (see carbon emp_act)
do_not_stun = TRUE
for(var/obj/item/bodypart/L in src.bodyparts)
if(L.is_robotic_limb())
if(!informed)
to_chat(src, "<span class='userdanger'>You feel a sharp pain as your robotic limbs overload.</span>")
informed = TRUE
L.receive_damage(0,severity/10)
Stun(severity*2)
if(!do_not_stun) //Tiny bit better than checking for the trait another six times in succession
Stun(severity*2)
/mob/living/carbon/human/acid_act(acidpwr, acid_volume, bodyzone_hit)
var/list/damaged = list()
@@ -426,6 +426,10 @@
//Misc
.["Cyborg - Misc (dog - blade)"] = process_holoform_icon_filter(icon('modular_citadel/icons/mob/widerobot.dmi', "blade"), HOLOFORM_FILTER_PAI, FALSE)
// Gorillas
.["Gorilla (standing)"] = process_holoform_icon_filter(icon('icons/mob/gorilla.dmi', "standing"), HOLOFORM_FILTER_PAI, FALSE)
.["Gorilla (crawling)"] = process_holoform_icon_filter(icon('icons/mob/gorilla.dmi', "crawling"), HOLOFORM_FILTER_PAI, FALSE)
/mob/living/silicon/pai/proc/default_chassis_pixel_offsets_x()
. = list()
//Engi
@@ -94,16 +94,17 @@
consume_bait()
/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/proc/consume_bait()
var/obj/item/stack/ore/diamond/diamonds = locate(/obj/item/stack/ore/diamond) in oview(src, 9)
var/obj/item/pen/survival/bait = locate(/obj/item/pen/survival) in oview(src, 9)
if(!diamonds && !bait)
return
var/list/L = list()
for(var/obj/O in view(src, 9))
L += O
var/obj/item/stack/ore/diamond/diamonds = locate(/obj/item/stack/ore/diamond) in L
if(diamonds)
var/distanced = 0
distanced = get_dist(loc,diamonds.loc)
if(distanced <= 1 && diamonds)
qdel(diamonds)
src.visible_message("<span class='notice'>[src] consumes [diamonds], and it disappears! ...At least, you think.</span>")
var/obj/item/pen/survival/bait = locate(/obj/item/pen/survival) in L
if(bait)
var/distanceb = 0
distanceb = get_dist(loc,bait.loc)
+2 -1
View File
@@ -150,7 +150,8 @@
H.DefaultCombatKnockdown(40)
playsound(src, 'sound/effects/woodhit.ogg', 60, TRUE, 1)
else if(filled)
victim.adjustStaminaLoss(1)
if(iscarbon(victim))
victim.adjustStaminaLoss(1)
playsound(src, "water_wade", 20, TRUE)
return ..()
@@ -373,7 +373,6 @@
sawn_off = TRUE
slot_flags = ITEM_SLOT_BELT
/obj/item/gun/ballistic/revolver/reverse //Fires directly at its user... unless the user is a clown, of course.
clumsy_check = 0
@@ -318,7 +318,7 @@
pump()
return TRUE
// DOUBLE BARRELED SHOTGUN and IMPROVISED SHOTGUN are in revolver.dm
//due to code weirdness, and the fact that a refactor is coming soon anyway, the barman's shotgun and maint shotgun are in revolver.dm
/obj/item/gun/ballistic/shotgun/doublebarrel/hook
name = "hook modified sawn-off shotgun"
+47 -14
View File
@@ -173,18 +173,60 @@
force = 15
ammo_type = list(/obj/item/ammo_casing/energy/plasma/adv)
//Sci guns
/obj/item/gun/energy/gravity_gun
name = "one-point gravitational manipulator"
desc = "An experimental, multi-mode device that fires bolts of Zero-Point Energy, causing local distortions in gravity. Requires an anomaly core to function."
ammo_type = list(/obj/item/ammo_casing/energy/gravity/repulse, /obj/item/ammo_casing/energy/gravity/attract, /obj/item/ammo_casing/energy/gravity/chaos)
item_state = "gravity_gun"
icon_state = "gravity_gun"
var/power = 4
var/firing_core = FALSE
/obj/item/gun/energy/gravity_gun/attackby(obj/item/C, mob/user)
if(istype(C, /obj/item/assembly/signaler/anomaly))
to_chat(user, "<span class='notice'>You insert [C] into the gravitational manipulator and the weapon gently hums to life.</span>")
firing_core = TRUE
playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE)
qdel(C)
return
return ..()
/obj/item/gun/energy/gravity_gun/can_shoot()
if(!firing_core)
return FALSE
return ..()
/obj/item/gun/energy/wormhole_projector
name = "bluespace wormhole projector"
desc = "A projector that emits high density quantum-coupled bluespace beams."
desc = "A projector that emits high density quantum-coupled bluespace beams. Requires an anomaly core to function."
ammo_type = list(/obj/item/ammo_casing/energy/wormhole, /obj/item/ammo_casing/energy/wormhole/orange)
item_state = null
icon_state = "wormhole_projector"
pin = null
inaccuracy_modifier = 0.25
automatic_charge_overlays = FALSE
var/obj/effect/portal/p_blue
var/obj/effect/portal/p_orange
var/atmos_link = FALSE
var/firing_core = FALSE
/obj/item/gun/energy/wormhole_projector/attackby(obj/item/C, mob/user)
if(istype(C, /obj/item/assembly/signaler/anomaly))
to_chat(user, "<span class='notice'>You insert [C] into the wormhole projector and the weapon gently hums to life.</span>")
firing_core = TRUE
playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE)
qdel(C)
return
/obj/item/gun/energy/wormhole_projector/can_shoot()
if(!firing_core)
return FALSE
return ..()
/obj/item/gun/energy/wormhole_projector/shoot_with_empty_chamber(mob/living/user)
. = ..()
to_chat(user, "<span class='danger'>The display says, 'NO CORE INSTALLED'.</span>")
/obj/item/gun/energy/wormhole_projector/update_icon_state()
icon_state = "[initial(icon_state)][current_firemode_index]"
@@ -243,6 +285,9 @@
p_blue = P
crosslink()
/obj/item/gun/energy/wormhole_projector/core_inserted
firing_core = TRUE
/* 3d printer 'pseudo guns' for borgs */
/obj/item/gun/energy/printer
@@ -298,18 +343,6 @@
/obj/item/gun/energy/laser/instakill/emp_act() //implying you could stop the instagib
return
/obj/item/gun/energy/gravity_gun
name = "one-point bluespace-gravitational manipulator"
desc = "An experimental, multi-mode device that fires bolts of Zero-Point Energy, causing local distortions in gravity."
ammo_type = list(/obj/item/ammo_casing/energy/gravity/repulse, /obj/item/ammo_casing/energy/gravity/attract, /obj/item/ammo_casing/energy/gravity/chaos)
item_state = "gravity_gun"
icon_state = "gravity_gun"
pin = null
var/power = 4
/obj/item/gun/energy/gravity_gun/security
pin = /obj/item/firing_pin
//Emitter Gun
/obj/item/gun/energy/emitter
@@ -20,8 +20,9 @@
newcasing.modified = modified
var/obj/item/projectile/bullet/reusable/foam_dart/newdart = newcasing.BB
newdart.modified = modified
newdart.damage = damage
newdart.nodamage = nodamage
if(modified)
newdart.damage = 5
newdart.nodamage = FALSE
newdart.damage_type = damage_type
if(pen)
newdart.pen = pen
@@ -625,8 +625,9 @@
myseed.adjust_potency(round(chems.get_reagent_amount(src.type) * 0.5))
/datum/reagent/consumable/buzz_fuzz/on_mob_life(mob/living/carbon/M)
M.reagents.add_reagent(/datum/reagent/consumable/sugar,1)
if(prob(5))
if(prob(33))
M.reagents.add_reagent(/datum/reagent/consumable/sugar,1)
if(prob(1))
M.reagents.add_reagent(/datum/reagent/consumable/honey,1)
..()
@@ -1125,7 +1125,7 @@
/datum/reagent/space_cleaner/sterilizine/reaction_obj(obj/O, reac_volume)
if(istype(O, /obj/item/stack/medical/gauze))
var/obj/item/stack/medical/gauze/G = O
reac_volume = min((reac_volume / 10), G.amount)
reac_volume = min((reac_volume / 5), G.amount)
new /obj/item/stack/medical/gauze/adv(get_turf(G), reac_volume)
G.use(reac_volume)
@@ -74,12 +74,12 @@
build_path = /obj/item/restraints/handcuffs
category = list("hacked", "Security")
/datum/design/rifle_receiver
name = "Rifle Receiver"
id = "rifle_receiver"
/datum/design/reciever
name = "Modular Receiver"
id = "modular_receiver"
build_type = AUTOLATHE
materials = list(/datum/material/iron = 24000)
build_path = /obj/item/weaponcrafting/improvised_parts/rifle_receiver
build_path = /obj/item/weaponcrafting/receiver
category = list("hacked", "Security")
/datum/design/shotgun_slug
@@ -282,10 +282,3 @@
build_path = /obj/item/vending_refill/custom
category = list("initial", "Misc")
/datum/design/trigger_assembly
name = "Trigger Assembly"
id = "trigger_assembly"
build_type = AUTOLATHE
materials = list(/datum/material/iron = 6500, /datum/material/glass = 50)
build_path = /obj/item/weaponcrafting/improvised_parts/trigger_assembly
category = list("initial", "Misc")
@@ -481,7 +481,7 @@
build_path = /obj/item/holosign_creator/atmos
category = list("Tool Designs")
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
/*
/datum/design/holosignfirelock
name = "ATMOS Holofirelock Projector"
desc = "A holographic projector that creates holographic barriers that prevent changes in temperature conditions."
@@ -491,7 +491,7 @@
build_path = /obj/item/holosign_creator/firelock
category = list("Tool Designs")
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
*/
/datum/design/holosigncombifan
name = "ATMOS Holo-Combifan Projector"
desc = "A holographic projector that creates holographic barriers that prevent changes in atmospheric and temperature conditions."
@@ -38,7 +38,7 @@
display_name = "Electromagnetic Theory"
description = "Study into usage of frequencies in the electromagnetic spectrum."
prereq_ids = list("base")
design_ids = list("holosign", "holosignsec", "holosignengi", "holosignatmos", "holosignfirelock", "inducer", "tray_goggles", "holopad")
design_ids = list("holosign", "holosignsec", "holosignengi", "holosignatmos",/* "holosignfirelock",*/ "inducer", "tray_goggles", "holopad")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
/datum/techweb_node/emp_adv
@@ -75,15 +75,14 @@
prereq_ids = list("base")
design_ids = list("sticky_tape")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
hidden = TRUE
experimental = TRUE
starting_node = TRUE
// Can be researched after getting the basic sticky technology from the BEPIS major reward
// now a BEPIS locked thing
/datum/techweb_node/sticky_advanced
id = "sticky_advanced"
display_name = "Advanced Sticky Technology"
description = "Taking a good joke too far? Nonsense!"
prereq_ids = list("sticky_basic")
design_ids = list("super_sticky_tape", "pointy_tape")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
hidden = TRUE
experimental = TRUE
@@ -0,0 +1,39 @@
/obj/effect/proc_holder/spell/self/mantra
name = "Inner Mantra"
desc = "Control your Inner Mantra, gaining strength and durability for a cost."
clothes_req = NONE
mobs_whitelist = list(/mob/living/carbon/human)
charge_max = 100
antimagic_allowed = TRUE
invocation = "SU'UP'AH S'EI YEN"
invocation_type = "shout"
level_max = 0
cooldown_min = 100
action_icon = 'icons/obj/magic.dmi'
action_icon_state = "iconmantra"
/obj/effect/proc_holder/spell/self/mantra/cast(mob/living/carbon/human/user)
if(user.has_status_effect(STATUS_EFFECT_MANTRA))
user.remove_status_effect(STATUS_EFFECT_MANTRA)
else
user.apply_status_effect(STATUS_EFFECT_MANTRA)
/obj/effect/proc_holder/spell/self/asura
name = "Asura's Wrath"
desc = "Unleash your rage as corrosive power fills your muscles."
clothes_req = NONE
mobs_whitelist = list(/mob/living/carbon/human)
charge_max = 100
antimagic_allowed = TRUE
invocation = "KYE Y'O'KEN"
invocation_type = "shout"
level_max = 0
cooldown_min = 100
action_icon = 'icons/obj/magic.dmi'
action_icon_state = "iconasura"
/obj/effect/proc_holder/spell/self/asura/cast(mob/living/carbon/human/user)
if(user.has_status_effect(STATUS_EFFECT_ASURA))
user.remove_status_effect(STATUS_EFFECT_ASURA)
else
user.apply_status_effect(STATUS_EFFECT_ASURA)
@@ -297,6 +297,7 @@
owner.update_stamina()
consider_processing()
update_disabled()
update_threshhold_state()
return update_bodypart_damage_state()
/// Allows us to roll for and apply a wound without actually dealing damage. Used for aggregate wounding power with pellet clouds
@@ -475,6 +476,7 @@
owner.updatehealth()
consider_processing()
update_disabled()
update_threshhold_state()
return update_bodypart_damage_state()
//Returns total damage.
+62
View File
@@ -0,0 +1,62 @@
//Emergency Reboot: A surgery that allows for revival of Synthetics without the need for a defib. Doesn't all all the organs like the Revival surgery though.
/datum/surgery/emergency_reboot
name = "Emergency Reboot"
desc = "A surgery forcing the posibrain of a robot to begin it's reboot procedure, if their body can sustain its operation."
possible_locs = list(BODY_ZONE_HEAD)
requires_bodypart_type = BODYPART_ROBOTIC //If you are a Synth with a organic head (somehow), this won't work.
steps = list(/datum/surgery_step/mechanic_open, /datum/surgery_step/open_hatch, /datum/surgery_step/mechanic_unwrench, /datum/surgery_step/force_reboot, /datum/surgery_step/mechanic_wrench, /datum/surgery_step/mechanic_close)
/datum/surgery/emergency_reboot/can_start(mob/user, mob/living/carbon/target, obj/item/tool)
if(!..())
return FALSE
if(target.stat != DEAD)
return FALSE
if(target.suiciding || HAS_TRAIT(target, TRAIT_NOCLONE) || target.hellbound)
return FALSE
if(!HAS_TRAIT(target, TRAIT_ROBOTIC_ORGANISM))
return FALSE
var/obj/item/organ/brain/B = target.getorganslot(ORGAN_SLOT_BRAIN)
if(!B || !istype(B, /obj/item/organ/brain/ipc))
return FALSE
return TRUE
/datum/surgery_step/force_reboot
name = "initiate system reboot"
implements = list(TOOL_MULTITOOL = 100, /obj/item/borg/upgrade/restart = 100)
time = 100
/datum/surgery_step/force_reboot/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
display_results(user, target, "<span class='notice'>You prepare to begin rebooting [target]'s posibrain.</span>",
"[user] prepares to reboot [target]'s posibrain with [tool].",
"[user] prepares to reboot [target]'s posibrain with [tool].")
target.notify_ghost_cloning("Someone is trying to reboot you! Re-enter your corpse if you want to be revived!", source = target)
/datum/surgery_step/force_reboot/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
display_results(user, target, "<span class='notice'>You successfully initiate a reboot in [target]'s posibrain...</span>",
"[user] initiates a reboot in [target]'s posibrain...",
"[user] initiates a reboot in [target]'s posibrain...")
target.adjustOxyLoss(-50, 0)
target.updatehealth()
var/tplus = world.time - target.timeofdeath
if(target.revive())
target.visible_message("...[target]'s posibrain flickers to life once again!")
target.emote("ping")
var/list/policies = CONFIG_GET(keyed_list/policyconfig)
var/timelimit = CONFIG_GET(number/defib_cmd_time_limit) * 10 //the config is in seconds, not deciseconds
var/late = timelimit && (tplus > timelimit)
var/policy = late? policies[POLICYCONFIG_ON_DEFIB_LATE] : policies[POLICYCONFIG_ON_DEFIB_INTACT]
if(policy)
to_chat(target, policy)
target.log_message("revived using surgical revival, [tplus] deciseconds from time of death, considered [late? "late" : "memory-intact"] revival under configured policy limits.", LOG_GAME)
return TRUE
else
target.visible_message("...[target]'s posibrain flickers a few times, before the lights fade yet again...")
return FALSE
/datum/surgery_step/force_reboot/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
display_results(user, target, "<span class='notice'>You attempt to reboot [target]'s posibrain, but [target.p_they()] doesn't react.</span>",
"[user] attempts to reboot [target]'s posibrain, but [target.p_they()] doesn't react.",
"[user] attempts to reboot [target]'s posibrain, but [target.p_they()] doesn't react")
target.adjustOrganLoss(ORGAN_SLOT_BRAIN, 15, 199)
return FALSE
@@ -2,11 +2,17 @@
name = "removal of embedded objects"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/remove_object)
possible_locs = list(BODY_ZONE_R_ARM,BODY_ZONE_L_ARM,BODY_ZONE_R_LEG,BODY_ZONE_L_LEG,BODY_ZONE_CHEST,BODY_ZONE_HEAD)
/datum/surgery/embedded_removal/robot
requires_bodypart_type = BODYPART_ROBOTIC
steps = list(/datum/surgery_step/mechanic_open, /datum/surgery_step/open_hatch, /datum/surgery_step/remove_object)
/datum/surgery_step/remove_object
name = "remove embedded objects"
time = 32
accept_hand = 1
var/obj/item/bodypart/L = null
/datum/surgery_step/remove_object/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
L = surgery.operated_bodypart
if(L)
-1
View File
@@ -2,7 +2,6 @@
name = "KinkMate"
desc = "A vending machine for all your unmentionable desires."
icon_state = "kink"
circuit = /obj/item/circuitboard/machine/kinkmate
product_slogans = "Kinky!;Sexy!;Check me out, big boy!"
vend_reply = "Have fun, you shameless pervert!"
products = list(
+2 -1
View File
@@ -34,7 +34,8 @@
/obj/item/healthanalyzer/wound = 4,
/obj/item/stack/medical/ointment = 2,
/obj/item/stack/medical/suture = 2,
/obj/item/stack/medical/bone_gel = 4)
/obj/item/stack/medical/bone_gel = 4,
/obj/item/stack/medical/nanogel = 4)
contraband = list(/obj/item/reagent_containers/pill/tox = 3,
/obj/item/reagent_containers/pill/morphine = 4,
/obj/item/reagent_containers/pill/charcoal = 6)
+1
View File
@@ -13,6 +13,7 @@
/obj/item/reagent_containers/medspray/sterilizine = 1,
/obj/item/healthanalyzer/wound = 2,
/obj/item/stack/medical/bone_gel = 2,
/obj/item/stack/medical/nanogel = 2,
/obj/item/reagent_containers/syringe/dart = 10)
contraband = list(/obj/item/reagent_containers/pill/tox = 2,
/obj/item/reagent_containers/pill/morphine = 2)
+2 -1
View File
@@ -17,7 +17,8 @@
/obj/item/tank/internals/anesthetic = 2,
/obj/item/clothing/mask/breath/medical = 5,
/obj/item/screwdriver = 5,
/obj/item/crowbar = 5)
/obj/item/crowbar = 6,
/obj/item/stack/medical/nanogel = 5)
armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50)
resistance_flags = FIRE_PROOF
default_price = PRICE_EXPENSIVE
+1 -1
View File
@@ -212,7 +212,7 @@
/obj/item/clothing/under/rank/rnd/roboticist/sleek = 3,
/obj/item/clothing/under/rank/rnd/roboticist/skirt = 3,
/obj/item/clothing/suit/hooded/wintercoat/robotics = 3,
/obj/item/clothing/suit/toggle/labcoat = 3,
/obj/item/clothing/suit/toggle/labcoat/roboticist = 3,
/obj/item/clothing/shoes/sneakers/black = 3,
/obj/item/clothing/gloves/fingerless = 3,
/obj/item/clothing/head/soft/black = 3,
+4
View File
@@ -359,6 +359,10 @@
if(QDELETED(tasted) || (tasted.ckey && !(tasted.client?.prefs.vore_flags & LICKABLE)) || !Adjacent(tasted) || incapacitated(ignore_restraints = TRUE))
return
if(ishuman(tasted))
var/mob/living/carbon/human/H = tasted
H.wash_cream()
visible_message("<span class='warning'>[src] licks [tasted]!</span>","<span class='notice'>You lick [tasted]. They taste rather like [tasted.get_taste_message()].</span>","<b>Slurp!</b>")
/mob/living/proc/get_taste_message(allow_generic = TRUE, datum/species/mrace)