Merge remote-tracking branch 'upstream/master' into dynamicport
This commit is contained in:
@@ -82,34 +82,6 @@
|
||||
. += ""
|
||||
. += "Chemical Storage: [changeling.chem_charges]/[changeling.chem_storage]"
|
||||
. += "Absorbed DNA: [changeling.absorbedcount]"
|
||||
//NINJACODE
|
||||
if(istype(wear_suit, /obj/item/clothing/suit/space/space_ninja)) //Only display if actually a ninja.
|
||||
var/obj/item/clothing/suit/space/space_ninja/SN = wear_suit
|
||||
. += "SpiderOS Status: [SN.s_initialized ? "Initialized" : "Disabled"]"
|
||||
. += "Current Time: [STATION_TIME_TIMESTAMP("hh:mm:ss", world.time)]"
|
||||
if(SN.s_initialized)
|
||||
//Suit gear
|
||||
. += "Energy Charge: [round(SN.cell.charge/100)]%"
|
||||
. += "Smoke Bombs: \Roman [SN.s_bombs]"
|
||||
//Ninja status
|
||||
. += "Fingerprints: [md5(dna.uni_identity)]"
|
||||
. += "Unique Identity: [dna.unique_enzymes]"
|
||||
. += "Overall Status: [stat > 1 ? "dead" : "[health]% healthy"]"
|
||||
. += "Nutrition Status: [nutrition]"
|
||||
. += "Oxygen Loss: [getOxyLoss()]"
|
||||
. += "Toxin Levels: [getToxLoss()]"
|
||||
. += "Burn Severity: [getFireLoss()]"
|
||||
. += "Brute Trauma: [getBruteLoss()]"
|
||||
. += "Radiation Levels: [radiation] rad"
|
||||
. += "Body Temperature: [bodytemperature-T0C] degrees C ([bodytemperature*1.8-459.67] degrees F)"
|
||||
|
||||
//Diseases
|
||||
if(length(diseases))
|
||||
. += "Viruses:"
|
||||
for(var/thing in diseases)
|
||||
var/datum/disease/D = thing
|
||||
. += "* [D.name], Type: [D.spread_text], Stage: [D.stage]/[D.max_stages], Possible Cure: [D.cure_text]"
|
||||
|
||||
|
||||
/mob/living/carbon/human/show_inv(mob/user)
|
||||
user.set_machine(src)
|
||||
|
||||
@@ -807,11 +807,11 @@
|
||||
|
||||
/datum/species/golem/plastic/on_species_gain(mob/living/carbon/C, datum/species/old_species)
|
||||
. = ..()
|
||||
C.AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
|
||||
C.AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_NUDE)
|
||||
|
||||
/datum/species/golem/plastic/on_species_loss(mob/living/carbon/C)
|
||||
. = ..()
|
||||
C.RemoveElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
|
||||
C.RemoveElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_NUDE)
|
||||
|
||||
/datum/species/golem/bronze
|
||||
name = "Bronze Golem"
|
||||
|
||||
@@ -322,6 +322,17 @@
|
||||
else
|
||||
to_chat(user, "Encryption Key ports not configured.")
|
||||
|
||||
/obj/item/paicard/emag_act(mob/user) // Emag to wipe the master DNA and supplemental directive
|
||||
. = ..()
|
||||
if(!pai)
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You override [pai]'s directive system, clearing its master string and supplied directive.</span>")
|
||||
to_chat(pai, "<span class='danger'>Warning: System override detected, check directive sub-system for any changes.'</span>")
|
||||
log_game("[key_name(user)] emagged [key_name(pai)], wiping their master DNA and supplemental directive.")
|
||||
pai.master = null
|
||||
pai.master_dna = null
|
||||
pai.laws.supplied[1] = "None." // Sets supplemental directive to this
|
||||
|
||||
/mob/living/silicon/pai/proc/short_radio()
|
||||
if(radio_short_timerid)
|
||||
deltimer(radio_short_timerid)
|
||||
|
||||
@@ -811,6 +811,32 @@
|
||||
<i>Help the operatives secure the disk at all costs!</i></b>"
|
||||
set_module = /obj/item/robot_module/saboteur
|
||||
|
||||
/mob/living/silicon/robot/modules/syndicate/spider// used for space ninja and their cyborg hacking special objective
|
||||
bubble_icon = "spider"
|
||||
playstyle_string = "<span class='big bold'>You are a Spider Clan assault cyborg!</span><br>\
|
||||
<b>You are armed with powerful offensive tools to aid you in your mission: obey your ninja masters by any means necessary. \
|
||||
Your cyborg LMG will slowly produce ammunition from your power supply, and your pinpointer will find and locate fellow members of the Spider Clan.</b>"
|
||||
set_module = /obj/item/robot_module/syndicate/spider
|
||||
|
||||
/mob/living/silicon/robot/modules/syndicate_medical/spider// ditto
|
||||
bubble_icon = "spider"
|
||||
var/playstyle_string = "<span class='big bold'>You are a Spider Clan medical cyborg!</span><br>\
|
||||
<b>You are armed with powerful medical tools to aid you in your mission: obey your ninja masters by any means necessary. \
|
||||
Your hypospray will produce Restorative Nanites, a wonder-drug that will heal most types of bodily damages, including clone and brain damage. It also produces morphine for offense. \
|
||||
Your defibrillator paddles can revive allies through their hardsuits, or can be used on harm intent to shock enemies! \
|
||||
Your energy saw functions as a circular saw, but can be activated to deal more damage, and your pinpointer will find and locate fellow members of the Spider Clan.</b>"
|
||||
set_module = /obj/item/robot_module/syndicate_medical/spider
|
||||
|
||||
/mob/living/silicon/robot/modules/saboteur/spider// ditto
|
||||
bubble_icon = "spider"
|
||||
var/playstyle_string = "<span class='big bold'>You are a Spider Clan saboteur cyborg!</span><br>\
|
||||
<b>You are armed with robust engineering tools to aid you in your mission: obey your ninja masters by any means necessary. \
|
||||
Your destination tagger will allow you to stealthily traverse the disposal network across the station. \
|
||||
Your welder will can be used to repair yourself or any allied silicon units, while serving as an impromptu melee weapon. \
|
||||
Your cyborg chameleon projector allows you to assume the appearance and registered name of a Nanotrasen engineering borg, and undertake covert actions on the station, \
|
||||
be aware that almost any physical contact or incidental damage will break your camouflage.</b>"
|
||||
set_module = /obj/item/robot_module/saboteur/spider
|
||||
|
||||
/mob/living/silicon/robot/proc/notify_ai(notifytype, oldname, newname)
|
||||
if(!connected_ai)
|
||||
return
|
||||
|
||||
@@ -1034,6 +1034,7 @@
|
||||
/obj/item/extinguisher/mini,
|
||||
/obj/item/crowbar/cyborg,
|
||||
/obj/item/reagent_containers/borghypo/syndicate,
|
||||
/obj/item/gripper/medical,
|
||||
/obj/item/shockpaddles/syndicate,
|
||||
/obj/item/healthanalyzer/advanced,
|
||||
/obj/item/surgical_drapes/advanced,
|
||||
@@ -1147,3 +1148,73 @@
|
||||
max_energy = 30
|
||||
recharge_rate = 1
|
||||
name = "Wrapping Paper Storage"
|
||||
|
||||
/obj/item/robot_module/syndicate/spider// used for space ninja and their cyborg hacking special objective
|
||||
name = "Spider Assault"
|
||||
basic_modules = list(
|
||||
/obj/item/assembly/flash/cyborg,
|
||||
/obj/item/extinguisher/mini,
|
||||
/obj/item/crowbar/cyborg,
|
||||
/obj/item/melee/transforming/energy/sword/cyborg,
|
||||
/obj/item/gun/energy/printer,
|
||||
/obj/item/pinpointer/spider_cyborg)
|
||||
|
||||
cyborg_base_icon = "spider_sec"
|
||||
|
||||
/obj/item/robot_module/syndicate_medical/spider// ditto
|
||||
name = "Spider Medical"
|
||||
basic_modules = list(
|
||||
/obj/item/assembly/flash/cyborg,
|
||||
/obj/item/extinguisher/mini,
|
||||
/obj/item/crowbar/cyborg,
|
||||
/obj/item/reagent_containers/borghypo/syndicate,
|
||||
/obj/item/gripper/medical,
|
||||
/obj/item/shockpaddles/syndicate,
|
||||
/obj/item/healthanalyzer/advanced,
|
||||
/obj/item/surgical_drapes/advanced,
|
||||
/obj/item/retractor,
|
||||
/obj/item/hemostat,
|
||||
/obj/item/cautery,
|
||||
/obj/item/surgicaldrill,
|
||||
/obj/item/scalpel,
|
||||
/obj/item/bonesetter,
|
||||
/obj/item/stack/medical/bone_gel,
|
||||
/obj/item/melee/transforming/energy/sword/cyborg/saw,
|
||||
/obj/item/roller/robo,
|
||||
/obj/item/stack/medical/gauze/cyborg,
|
||||
/obj/item/gun/medbeam,
|
||||
/obj/item/organ_storage,
|
||||
/obj/item/pinpointer/spider_cyborg)
|
||||
|
||||
cyborg_base_icon = "spider_medical"
|
||||
|
||||
/obj/item/robot_module/saboteur/spider// ditto
|
||||
name = "Spider Saboteur"
|
||||
basic_modules = list(
|
||||
/obj/item/assembly/flash/cyborg,
|
||||
/obj/item/borg/sight/thermal,
|
||||
/obj/item/construction/rcd/borg/syndicate,
|
||||
/obj/item/pipe_dispenser,
|
||||
/obj/item/restraints/handcuffs/cable/zipties,
|
||||
/obj/item/extinguisher,
|
||||
/obj/item/weldingtool/largetank/cyborg,
|
||||
/obj/item/screwdriver/nuke,
|
||||
/obj/item/wrench/cyborg,
|
||||
/obj/item/crowbar/cyborg,
|
||||
/obj/item/wirecutters/cyborg,
|
||||
/obj/item/multitool/cyborg,
|
||||
/obj/item/storage/part_replacer/cyborg,
|
||||
/obj/item/holosign_creator/atmos,
|
||||
/obj/item/gripper,
|
||||
/obj/item/lightreplacer/cyborg,
|
||||
/obj/item/stack/sheet/metal/cyborg,
|
||||
/obj/item/stack/sheet/glass/cyborg,
|
||||
/obj/item/stack/sheet/rglass/cyborg,
|
||||
/obj/item/stack/rods/cyborg,
|
||||
/obj/item/stack/tile/plasteel/cyborg,
|
||||
/obj/item/destTagger/borg,
|
||||
/obj/item/stack/cable_coil/cyborg,
|
||||
/obj/item/borg_chameleon,
|
||||
/obj/item/pinpointer/spider_cyborg)
|
||||
|
||||
cyborg_base_icon = "spider_engi"
|
||||
|
||||
@@ -99,15 +99,17 @@
|
||||
evolve()
|
||||
return
|
||||
for(var/obj/item/trash/garbage in range(1, src))
|
||||
if(prob(2))
|
||||
qdel(garbage)
|
||||
evolve_plague()
|
||||
return
|
||||
if(is_station_level(z))
|
||||
if(prob(2))
|
||||
qdel(garbage)
|
||||
evolve_plague()
|
||||
return
|
||||
for(var/obj/effect/decal/cleanable/blood/gibs/leftovers in range(1, src))
|
||||
if(prob(2))
|
||||
qdel(leftovers)
|
||||
evolve_plague()
|
||||
return
|
||||
if(is_station_level(z))
|
||||
if(prob(2))
|
||||
qdel(leftovers)
|
||||
evolve_plague()
|
||||
return
|
||||
|
||||
/**
|
||||
*Checks the mouse cap, if it's above the cap, doesn't spawn a mouse. If below, spawns a mouse and adds it to cheeserats.
|
||||
@@ -202,4 +204,5 @@ GLOBAL_VAR(tom_existed)
|
||||
|
||||
/mob/living/simple_animal/mouse/handle_environment(datum/gas_mixture/environment)
|
||||
. = ..()
|
||||
miasma()
|
||||
if(is_station_level(z))
|
||||
miasma()
|
||||
|
||||
@@ -60,6 +60,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians
|
||||
var/magic_fluff_string = "<span class='holoparasite'>You draw the Coder, symbolizing bugs and errors. This shouldn't happen! Submit a bug report!</span>"
|
||||
var/tech_fluff_string = "<span class='holoparasite'>BOOT SEQUENCE COMPLETE. ERROR MODULE LOADED. THIS SHOULDN'T HAPPEN. Submit a bug report!</span>"
|
||||
var/carp_fluff_string = "<span class='holoparasite'>CARP CARP CARP SOME SORT OF HORRIFIC BUG BLAME THE CODERS CARP CARP CARP</span>"
|
||||
var/customized
|
||||
/// sigh, fine.
|
||||
var/datum/song/holoparasite/music_datum
|
||||
|
||||
@@ -142,11 +143,13 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians
|
||||
to_chat(src, "<span class='holoparasite'>You are capable of manifesting or recalling to your master with the buttons on your HUD. You will also find a button to communicate with [summoner.p_them()] privately there.</span>")
|
||||
to_chat(src, "<span class='holoparasite'>While personally invincible, you will die if [summoner.real_name] does, and any damage dealt to you will have a portion passed on to [summoner.p_them()] as you feed upon [summoner.p_them()] to sustain yourself.</span>")
|
||||
to_chat(src, playstyle_string)
|
||||
guardiancustomize()
|
||||
if(!customized)
|
||||
guardiancustomize()
|
||||
|
||||
/mob/living/simple_animal/hostile/guardian/proc/guardiancustomize()
|
||||
guardianrecolor()
|
||||
guardianrename()
|
||||
customized = TRUE
|
||||
|
||||
/mob/living/simple_animal/hostile/guardian/proc/guardianrecolor()
|
||||
guardiancolor = input(src,"What would you like your color to be?","Choose Your Color","#ffffff") as color|null
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
#define RAT_VENT_CHANCE 1.75
|
||||
GLOBAL_LIST_EMPTY(plague_rats)
|
||||
|
||||
/mob/living/simple_animal/hostile/plaguerat
|
||||
name = "plague rat"
|
||||
desc = "A large decaying rat. It spreads its filth and emits a putrid odor to create more of its kind."
|
||||
@@ -11,8 +14,8 @@
|
||||
gender = NEUTER
|
||||
speak_chance = 1
|
||||
turns_per_move = 5
|
||||
maxHealth = 15
|
||||
health = 15
|
||||
maxHealth = 100
|
||||
health = 100
|
||||
see_in_dark = 6
|
||||
obj_damage = 10
|
||||
butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 1)
|
||||
@@ -22,8 +25,8 @@
|
||||
response_disarm_simple = "skoff at"
|
||||
response_harm_continuous = "slashes"
|
||||
response_harm_simple = "slash"
|
||||
melee_damage_lower = 5
|
||||
melee_damage_upper = 7
|
||||
melee_damage_lower = 6
|
||||
melee_damage_upper = 8
|
||||
attack_verb_continuous = "slashes"
|
||||
attack_verb_simple = "slash"
|
||||
attack_sound = 'sound/weapons/punch1.ogg'
|
||||
@@ -34,27 +37,69 @@
|
||||
mob_biotypes = MOB_ORGANIC|MOB_BEAST
|
||||
var/datum/action/cooldown/scavenge
|
||||
var/last_spawn_time = 0
|
||||
///Number assigned to rats and mice, checked when determining infighting.
|
||||
var/in_vent = FALSE
|
||||
var/min_next_vent = 0
|
||||
var/obj/machinery/atmospherics/components/unary/entry_vent
|
||||
var/obj/machinery/atmospherics/components/unary/exit_vent
|
||||
|
||||
/mob/living/simple_animal/hostile/plaguerat/Initialize()
|
||||
. = ..()
|
||||
SSmobs.cheeserats += src
|
||||
GLOB.plague_rats += src
|
||||
AddComponent(/datum/component/swarming)
|
||||
AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
|
||||
scavenge = new /datum/action/cooldown/scavenge
|
||||
scavenge.Grant(src)
|
||||
|
||||
/mob/living/simple_animal/hostile/plaguerat/Destroy()
|
||||
SSmobs.cheeserats -= src
|
||||
GLOB.plague_rats -= src
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/hostile/plaguerat/Life(seconds, times_fired)
|
||||
. = ..()
|
||||
//Don't try to path to one target for too long. If it takes longer than a certain amount of time, assume it can't be reached and find a new one
|
||||
//Literally only here to prevent farming and that's it.
|
||||
if(!client) //don't do this shit if there's a client, they're capable of ventcrawling manually
|
||||
if(in_vent)
|
||||
target = null
|
||||
if(entry_vent && get_dist(src, entry_vent) <= 1)
|
||||
var/list/vents = list()
|
||||
var/datum/pipeline/entry_vent_parent = entry_vent.parents[1]
|
||||
for(var/obj/machinery/atmospherics/components/unary/temp_vent in entry_vent_parent.other_atmosmch)
|
||||
vents += temp_vent
|
||||
if(!vents.len)
|
||||
entry_vent = null
|
||||
in_vent = FALSE
|
||||
return
|
||||
exit_vent = pick(vents)
|
||||
visible_message("<span class='notice'>[src] crawls into the ventilation ducts!</span>")
|
||||
|
||||
loc = exit_vent
|
||||
var/travel_time = round(get_dist(loc, exit_vent.loc) / 2)
|
||||
addtimer(CALLBACK(src, .proc/exit_vents), travel_time) //come out at exit vent in 2 to 20 seconds
|
||||
|
||||
|
||||
if(world.time > min_next_vent && !entry_vent && !in_vent && prob(RAT_VENT_CHANCE)) //small chance to go into a vent
|
||||
for(var/obj/machinery/atmospherics/components/unary/v in view(7,src))
|
||||
if(!v.welded)
|
||||
entry_vent = v
|
||||
in_vent = TRUE
|
||||
walk_to(src, entry_vent)
|
||||
break
|
||||
|
||||
/mob/living/simple_animal/hostile/plaguerat/BiologicalLife(seconds, times_fired)
|
||||
if(!(. = ..()))
|
||||
return
|
||||
if(isopenturf(loc))
|
||||
var/turf/open/T = src.loc
|
||||
var/datum/gas_mixture/stank = new
|
||||
var/miasma_moles = T.air.get_moles(GAS_MIASMA)
|
||||
stank.set_moles(GAS_MIASMA,5)
|
||||
stank.set_temperature(BODYTEMP_NORMAL)
|
||||
if(T.air)
|
||||
T.atmos_spawn_air("miasma=5;TEMP=293.15")
|
||||
if(miasma_moles < 200)
|
||||
T.assume_air(stank)
|
||||
T.air_update_turf()
|
||||
|
||||
if(prob(40))
|
||||
scavenge.Trigger()
|
||||
if(prob(50))
|
||||
@@ -66,9 +111,10 @@
|
||||
playsound(src, 'sound/effects/sparks2.ogg', 100, TRUE)
|
||||
C.deconstruct()
|
||||
for(var/obj/O in range(1,src))
|
||||
if(istype(O, /obj/item/trash) || istype(O, /obj/effect/decal/cleanable/blood/gibs))
|
||||
if((world.time - last_spawn_time) > 10 SECONDS && istype(O, /obj/item/trash) || istype(O, /obj/effect/decal/cleanable/blood/gibs))
|
||||
qdel(O)
|
||||
be_fruitful()
|
||||
last_spawn_time = world.time
|
||||
|
||||
/mob/living/simple_animal/hostile/plaguerat/CanAttack(atom/the_target)
|
||||
if(istype(the_target,/mob/living/simple_animal))
|
||||
@@ -86,14 +132,29 @@
|
||||
*/
|
||||
|
||||
/mob/living/simple_animal/hostile/plaguerat/proc/be_fruitful()
|
||||
var/cap = CONFIG_GET(number/ratcap)
|
||||
if(LAZYLEN(SSmobs.cheeserats) >= cap)
|
||||
var/cap = 10
|
||||
if(LAZYLEN(GLOB.plague_rats) >= cap)
|
||||
visible_message("<span class='warning'>[src] gnaws into its food, [cap] rats are now on the station!</span>")
|
||||
return
|
||||
var/mob/living/newmouse = new /mob/living/simple_animal/hostile/plaguerat(loc)
|
||||
SSmobs.cheeserats += newmouse
|
||||
visible_message("<span class='notice'>[src] gnaws into its food, attracting another rat!</span>")
|
||||
|
||||
/mob/living/simple_animal/hostile/plaguerat/proc/exit_vents()
|
||||
if(!exit_vent || exit_vent.welded)
|
||||
loc = entry_vent
|
||||
entry_vent = null
|
||||
return
|
||||
loc = exit_vent.loc
|
||||
entry_vent = null
|
||||
exit_vent = null
|
||||
in_vent = FALSE
|
||||
var/area/new_area = get_area(loc)
|
||||
message_admins("[src] came out at [new_area][ADMIN_JMP(loc)]!")
|
||||
if(new_area)
|
||||
new_area.Entered(src)
|
||||
visible_message("<span class='notice'>[src] climbs out of the ventilation ducts!</span>")
|
||||
min_next_vent = world.time + 900 //90 seconds between ventcrawls
|
||||
|
||||
/**
|
||||
*Creates a chance to spawn more trash or gibs to repopulate. Otherwise, spawns a corpse or dirt.
|
||||
*/
|
||||
@@ -116,16 +177,12 @@
|
||||
if(1 to 3)
|
||||
var/pickedtrash = pick(GLOB.ratking_trash)
|
||||
to_chat(owner, "<span class='notice'>Excellent, you find more trash to spread your filth!</span>")
|
||||
new /obj/effect/decal/cleanable/dirt(T)
|
||||
new pickedtrash(T)
|
||||
if(4 to 6)
|
||||
to_chat(owner, "<span class='notice'>You find blood and gibs to feed your young!</span>")
|
||||
new /obj/effect/decal/cleanable/blood/gibs(T)
|
||||
new /obj/effect/decal/cleanable/blood/(T)
|
||||
if(7 to 18)
|
||||
to_chat(owner, "<span class='notice'>A corpse rises from the ground. Best to leave it alone.</span>")
|
||||
new /obj/effect/mob_spawn/human/corpse/assistant(T)
|
||||
if(19 to 100)
|
||||
if(!locate(/obj/effect/decal/cleanable/blood) in T)
|
||||
new /obj/effect/decal/cleanable/blood/(T)
|
||||
if(7 to 100)
|
||||
to_chat(owner, "<span class='notice'>Drat. Nothing.</span>")
|
||||
new /obj/effect/decal/cleanable/dirt(T)
|
||||
StartCooldown()
|
||||
|
||||
Reference in New Issue
Block a user