Merge remote-tracking branch 'upstream/master' into Funny-Coder-Bus

This commit is contained in:
Chemlight
2020-11-09 23:16:19 -08:00
38 changed files with 1163 additions and 1021 deletions
+7 -1
View File
@@ -23,7 +23,13 @@
name = "Full Tank of Tritium"
description = "Station 42 is looking to kickstart their research program. Ship them a tank full of Tritium."
gas_type = /datum/gas/tritium
//Hyperstation edit
/datum/bounty/item/engineering/gas/hypernoblium_tank
name = "Full Tank of Hyper-Noblium"
description = "The 7th Echelon is looking to research the effects of this rare gas in organics. They ask for a full tank of it. Are you up to the task?"
gas_type = /datum/gas/hypernoblium
reward = 75000 //Very, very difficult to make, requires a fuckton of structural re-design around engineering and can actually royally fuck up the entirety of the station if not done correctly.
//Hypersation edit end
/datum/bounty/item/engineering/pacman
name = "P.A.C.M.A.N.-type portable generator"
description = "A neighboring station had a problem with their SMES, and now need something to power their communications console. Can you send them a P.AC.M.A.N.?"
+1 -1
View File
@@ -8,7 +8,7 @@
name = "Trash Bag of Holding"
description = "Centcom would make good use of high-capacity trash bags. If you have any, please ship them."
reward = 3000
wanted_types = list(/obj/item/storage/backpack/holding)
wanted_types = list(/obj/item/storage/bag/trash/bluespace)
/datum/bounty/item/science/bluespace_syringe
name = "Bluespace Syringe"
+10
View File
@@ -1,3 +1,11 @@
/var/list/blacklisted_sentient_animals = typecacheof(list(
/mob/living/simple_animal/slime,
/mob/living/simple_animal/hostile/megafauna,
/mob/living/simple_animal/hostile/blob,
/mob/living/simple_animal/jacq,
/mob/living/simple_animal/holodeck_monkey,
/mob/living/simple_animal/astral))
/datum/round_event_control/sentience
name = "Random Human-level Intelligence"
typepath = /datum/round_event/ghost_role/sentience
@@ -33,6 +41,8 @@
var/turf/T = get_turf(L)
if(!T || !is_station_level(T.z))
continue
if(is_type_in_typecache(L, blacklisted_sentient_animals))
continue
if(!(L in GLOB.player_list) && !L.mind)
potential += L
+7 -6
View File
@@ -53,7 +53,7 @@
desc = "A plant sculped by extensive genetic engineering. The spaceman's trumpet is said to bear no resemblance to its wild ancestors. Inside NT AgriSci circles it is better known as NTPW-0372."
icon_state = "seed-trumpet"
species = "spacemanstrumpet"
plantname = "Spaceman's Trumpet Plant"
plantname = "Spaceman Trumpet"
product = /obj/item/reagent_containers/food/snacks/grown/trumpet
lifespan = 80
production = 5
@@ -68,13 +68,14 @@
icon_grow = "spacemanstrumpet-grow"
icon_dead = "spacemanstrumpet-dead"
mutatelist = list()
genes = list( "Polypyrylium Oligomers")
genes = list(/datum/plant_gene/reagent/polypyr)
reagents_add = list("nutriment" = 0.05)
rarity = 30
/obj/item/seeds/poppy/lily/trumpet/Initialize()
..()
unset_mutability(/datum/plant_gene/reagent/polypyr, PLANT_GENE_EXTRACTABLE)
/obj/item/seeds/poppy/lily/trumpet/Initialize(mapload, nogenes = FALSE)
. = ..()
if(!nogenes)
unset_mutability(/datum/plant_gene/reagent/polypyr, PLANT_GENE_EXTRACTABLE)
/obj/item/reagent_containers/food/snacks/grown/trumpet
seed = /obj/item/seeds/poppy/lily/trumpet
@@ -317,4 +318,4 @@
filling_color = "#FF6347"
bitesize_mod = 8
tastes = list("wax" = 1)
foodtype = SUGAR
foodtype = SUGAR
+4 -3
View File
@@ -83,9 +83,10 @@
mutatelist = list()
reagents_add = list("nutriment" = 0.05, "silibinin" = 0.1)
/obj/item/seeds/galaxythistle/Initialize()
..()
unset_mutability(/datum/plant_gene/trait/invasive, PLANT_GENE_REMOVABLE)
/obj/item/seeds/galaxythistle/Initialize(mapload, nogenes = FALSE)
. = ..()
if(!nogenes)
unset_mutability(/datum/plant_gene/trait/invasive, PLANT_GENE_REMOVABLE)
/obj/item/reagent_containers/food/snacks/grown/galaxythistle
seed = /obj/item/seeds/galaxythistle
+5 -4
View File
@@ -216,10 +216,11 @@
growing_icon = 'icons/obj/hydroponics/growing_mushrooms.dmi'
reagents_add = list("nutriment" = 0.1)
/obj/item/seeds/chanterelle/jupitercup/Initialize()
..()
unset_mutability(/datum/plant_gene/reagent/teslium, PLANT_GENE_EXTRACTABLE)
unset_mutability(/datum/plant_gene/trait/plant_type/carnivory, PLANT_GENE_REMOVABLE)
/obj/item/seeds/chanterelle/jupitercup/Initialize(mapload, nogenes = FALSE)
. = ..()
if(!nogenes)
unset_mutability(/datum/plant_gene/reagent/teslium, PLANT_GENE_EXTRACTABLE)
unset_mutability(/datum/plant_gene/trait/plant_type/carnivory, PLANT_GENE_REMOVABLE)
/obj/item/reagent_containers/food/snacks/grown/mushroom/jupitercup
seed = /obj/item/seeds/chanterelle/jupitercup
+6 -4
View File
@@ -18,7 +18,9 @@
return !istype(S, /obj/item/seeds/sample) // Samples can't accept new genes
/datum/plant_gene/proc/Copy()
return new type
var/datum/plant_gene/G = new type
G.mutability_flags = mutability_flags
return G
/datum/plant_gene/proc/apply_vars(obj/item/seeds/S) // currently used for fire resist, can prob. be further refactored
return
@@ -151,9 +153,9 @@
return FALSE
return TRUE
/datum/plant_gene/reagent/polypyr
/datum/plant_gene/reagent/polypyr
name = "Polypyrylium Oligomers"
reagent_id = "polypyrylium_oligomers"
reagent_id = "polypyr"
rate = 0.15
/datum/plant_gene/reagent/teslium
@@ -495,4 +497,4 @@ datum/plant_gene/trait/glow/white
name ="?????"
/datum/plant_gene/trait/plant_type/carnivory
name = "Obligate Carnivory"
name = "Obligate Carnivory"
@@ -56,6 +56,11 @@
for(var/obj/item/stock_parts/manipulator/M in component_parts)
seed_multiplier = M.rating
/obj/machinery/seed_extractor/examine(mob/user)
. = ..()
if(in_range(user, src) || isobserver(user))
. += "<span class='notice'>The status display reads: Extracting <b>[seed_multiplier]</b> seed(s) per piece of produce.<br>Machine can store up to <b>[max_seeds]</b> seeds.</span>"
/obj/machinery/seed_extractor/attackby(obj/item/O, mob/user, params)
if(default_deconstruction_screwdriver(user, "sextractor_open", "sextractor", O))
+1 -1
View File
@@ -36,7 +36,7 @@
var/weed_rate = 1 //If the chance below passes, then this many weeds sprout during growth
var/weed_chance = 5 //Percentage chance per tray update to grow weeds
/obj/item/seeds/Initialize(loc, nogenes = 0)
/obj/item/seeds/Initialize(mapload, nogenes = 0)
. = ..()
pixel_x = rand(-8, 8)
pixel_y = rand(-8, 8)
@@ -1780,6 +1780,130 @@ GLOBAL_LIST_EMPTY(roundstart_races)
H.forcesay(GLOB.hit_appends) //forcesay checks stat already.
return TRUE
/datum/species/proc/alt_spec_attack_hand(mob/living/carbon/human/M, mob/living/carbon/human/H, datum/martial_art/attacker_style)
if(!istype(M))
return TRUE
CHECK_DNA_AND_SPECIES(M)
CHECK_DNA_AND_SPECIES(H)
if(!istype(M)) //sanity check for drones.
return TRUE
if(M.mind)
attacker_style = M.mind.martial_art
if((M != H) && M.a_intent != INTENT_HELP && H.check_shields(M, 0, M.name, attack_type = UNARMED_ATTACK))
log_combat(M, H, "attempted to touch")
H.visible_message("<span class='warning'>[M] attempted to touch [H]!</span>")
return TRUE
switch(M.a_intent)
if(INTENT_HELP)
if(M == H)
althelp(M, H, attacker_style)
return TRUE
return FALSE
if(INTENT_DISARM)
altdisarm(M, H, attacker_style)
return TRUE
return FALSE
/datum/species/proc/althelp(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style)
if(user == target && istype(user))
if(user.getStaminaLoss() >= STAMINA_SOFTCRIT)
to_chat(user, "<span class='warning'>You're too exhausted for that.</span>")
return
if(!user.resting)
to_chat(user, "<span class='notice'>You can only force yourself up if you're on the ground.</span>")
return
user.visible_message("<span class='notice'>[user] forces [p_them()]self up to [p_their()] feet!</span>", "<span class='notice'>You force yourself up to your feet!</span>")
user.resting = 0
user.update_canmove()
user.adjustStaminaLossBuffered(user.stambuffer) //Rewards good stamina management by making it easier to instantly get up from resting
playsound(user, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
/datum/species/proc/altdisarm(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style)
if(user.getStaminaLoss() >= STAMINA_SOFTCRIT)
to_chat(user, "<span class='warning'>You're too exhausted.</span>")
return FALSE
if(target.check_block())
target.visible_message("<span class='warning'>[target] blocks [user]'s shoving attempt!</span>")
return FALSE
if(attacker_style && attacker_style.disarm_act(user,target))
return TRUE
if(user.resting)
return FALSE
else
if(user == target)
return
user.do_attack_animation(target, ATTACK_EFFECT_DISARM)
user.adjustStaminaLossBuffered(4)
playsound(target, 'sound/weapons/thudswoosh.ogg', 50, TRUE, -1)
if(target.w_uniform)
target.w_uniform.add_fingerprint(user)
SEND_SIGNAL(target, COMSIG_HUMAN_DISARM_HIT, user, user.zone_selected)
if(!target.resting)
target.adjustStaminaLoss(5)
if(target.is_shove_knockdown_blocked())
return
var/turf/target_oldturf = target.loc
var/shove_dir = get_dir(user.loc, target_oldturf)
var/turf/target_shove_turf = get_step(target.loc, shove_dir)
var/mob/living/carbon/human/target_collateral_human
var/shove_blocked = FALSE //Used to check if a shove is blocked so that if it is knockdown logic can be applied
//Thank you based whoneedsspace
target_collateral_human = locate(/mob/living/carbon/human) in target_shove_turf.contents
if(target_collateral_human && target_collateral_human.resting)
shove_blocked = TRUE
else
target_collateral_human = null
target.Move(target_shove_turf, shove_dir)
if(get_turf(target) == target_oldturf)
shove_blocked = TRUE
if(shove_blocked && !target.buckled)
var/directional_blocked = !target.Adjacent(target_shove_turf)
var/targetatrest = target.resting
if((directional_blocked || (!target_collateral_human && !target_shove_turf.shove_act(target, user))) && !targetatrest)
target.Knockdown(SHOVE_KNOCKDOWN_SOLID)
user.visible_message("<span class='danger'>[user.name] shoves [target.name], knocking them down!</span>",
"<span class='danger'>You shove [target.name], knocking them down!</span>", null, COMBAT_MESSAGE_RANGE)
log_combat(user, target, "shoved", "knocking them down")
else if(target_collateral_human && !targetatrest)
target.Knockdown(SHOVE_KNOCKDOWN_HUMAN)
target_collateral_human.Knockdown(SHOVE_KNOCKDOWN_COLLATERAL)
user.visible_message("<span class='danger'>[user.name] shoves [target.name] into [target_collateral_human.name]!</span>",
"<span class='danger'>You shove [target.name] into [target_collateral_human.name]!</span>", null, COMBAT_MESSAGE_RANGE)
log_combat(user, target, "shoved", "into [target_collateral_human.name]")
else
user.visible_message("<span class='danger'>[user.name] shoves [target.name]!</span>",
"<span class='danger'>You shove [target.name]!</span>", null, COMBAT_MESSAGE_RANGE)
var/target_held_item = target.get_active_held_item()
var/knocked_item = FALSE
if(!is_type_in_typecache(target_held_item, GLOB.shove_disarming_types))
target_held_item = null
if(!target.has_movespeed_modifier(SHOVE_SLOWDOWN_ID))
target.add_movespeed_modifier(SHOVE_SLOWDOWN_ID, multiplicative_slowdown = SHOVE_SLOWDOWN_STRENGTH)
if(target_held_item)
target.visible_message("<span class='danger'>[target.name]'s grip on \the [target_held_item] loosens!</span>",
"<span class='danger'>Your grip on \the [target_held_item] loosens!</span>", null, COMBAT_MESSAGE_RANGE)
addtimer(CALLBACK(target, /mob/living/carbon/human/proc/clear_shove_slowdown), SHOVE_SLOWDOWN_LENGTH)
else if(target_held_item)
target.dropItemToGround(target_held_item)
knocked_item = TRUE
target.visible_message("<span class='danger'>[target.name] drops \the [target_held_item]!!</span>",
"<span class='danger'>You drop \the [target_held_item]!!</span>", null, COMBAT_MESSAGE_RANGE)
var/append_message = ""
if(target_held_item)
if(knocked_item)
append_message = "causing them to drop [target_held_item]"
else
append_message = "loosening their grip on [target_held_item]"
log_combat(user, target, "shoved", append_message)
/datum/species/proc/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked, mob/living/carbon/human/H)
var/hit_percent = (100-(blocked+armor))/100
hit_percent = (hit_percent * (100-H.physiology.damage_resistance))/100
@@ -113,30 +113,26 @@
icon_dead = "original_dead"
//Read_Memory()
. = ..()
/*
/mob/living/simple_animal/pet/cat/Runtime/Life()
/*
if(!cats_deployed && SSticker.current_state >= GAME_STATE_SETTING_UP)
Deploy_The_Cats()
if(!stat && SSticker.current_state == GAME_STATE_FINISHED && !memory_saved)
Write_Memory()
memory_saved = TRUE
*/
..()
*/
/mob/living/simple_animal/pet/cat/Runtime/make_babies()
var/mob/baby = ..()
if(baby)
children += baby
return baby
/mob/living/simple_animal/pet/cat/Runtime/death()
/*
/mob/living/simple_animal/pet/cat/Runtime/death()
if(!memory_saved)
Write_Memory(TRUE)
..()
*/
/mob/living/simple_animal/pet/cat/Runtime/proc/Read_Memory()
if(fexists("data/npc_saves/Runtime.sav")) //legacy compatability to convert old format to new
var/savefile/S = new /savefile("data/npc_saves/Runtime.sav")
@@ -130,8 +130,11 @@
/mob/living/simple_animal/hostile/proc/ListTargets()//Step 1, find out what we can see
if(!search_objects)
. = hearers(vision_range, targets_from) - src //Remove self, so we don't suicide
var/static/hostile_machines = typecacheof(list(/obj/machinery/porta_turret, /obj/mecha, /obj/structure/destructible/clockwork/ocular_warden,/obj/item/electronic_assembly))
var/static/hostile_machines
if(istype(src, /mob/living/simple_animal/hostile/megafauna)) //If we are a megafauna, don't attack turrets as they're hard coded to not shoot us.
hostile_machines = typecacheof(list(/obj/mecha, /obj/structure/destructible/clockwork/ocular_warden,/obj/item/electronic_assembly))
else
hostile_machines = typecacheof(list(/obj/machinery/porta_turret, /obj/mecha, /obj/structure/destructible/clockwork/ocular_warden,/obj/item/electronic_assembly))
for(var/HM in typecache_filter_list(range(vision_range, targets_from), hostile_machines))
if(can_see(targets_from, HM, vision_range))
@@ -260,7 +260,7 @@
visible_message("<span class='danger'>[M] pulls [src] off!</span>")
return
attacked += 5
if(nutrition >= 100) //steal some nutrition. negval handled in life()
if(nutrition >= 100 && !istype(src, /mob/living/simple_animal/slime)) //steal some nutrition. negval handled in life()
nutrition -= (50 + (40 * M.is_adult))
M.add_nutrition(50 + (40 * M.is_adult))
if(health > 0)
@@ -1481,8 +1481,8 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
/datum/reagent/medicine/polypyr //This is intended to be an ingredient in advanced chems.
name = "Polypyrylium Oligomers"
id = "polypyrylium_oligomers"
description = "A?purple mixture of short polyelectrolyte chains not easily synthesized in the laboratory. It is valued as an intermediate in the synthesis of the cutting edge pharmaceuticals."
id = "polypyr"
description = "A purple mixture of short polyelectrolyte chains not easily synthesized in the laboratory. It is valued as an intermediate in the synthesis of the cutting edge pharmaceuticals."
reagent_state = SOLID
color = "#9423FF"
metabolization_rate = 0.25 * REAGENTS_METABOLISM
+27 -9
View File
@@ -119,14 +119,7 @@
stuff_mob_in(target, user)
/obj/machinery/disposal/proc/stuff_mob_in(mob/living/target, mob/living/user)
if(!iscarbon(user) && !user.ventcrawler) //only carbon and ventcrawlers can climb into disposal by themselves.
return
if(!isturf(user.loc)) //No magically doing it from inside closets
return
if(target.buckled || target.has_buckled_mobs())
return
if(target.mob_size > MOB_SIZE_HUMAN)
to_chat(user, "<span class='warning'>[target] doesn't fit inside [src]!</span>")
if(!can_stuff_mob_in(target, user))
return
add_fingerprint(user)
if(user == target)
@@ -145,6 +138,19 @@
target.LAssailant = user
update_icon()
/obj/machinery/disposal/proc/can_stuff_mob_in(mob/living/target, mob/living/user, pushing = FALSE)
if(!pushing && !iscarbon(user) && !user.ventcrawler) //only carbon and ventcrawlers can climb into disposal by themselves.
return FALSE
if(!isturf(user.loc)) //No magically doing it from inside closets
return FALSE
if(target.buckled || target.has_buckled_mobs())
return FALSE
if(target.mob_size > MOB_SIZE_HUMAN)
if(!pushing)
to_chat(user, "<span class='warning'>[target] doesn't fit inside [src]!</span>")
return FALSE
return TRUE
/obj/machinery/disposal/relaymove(mob/user)
attempt_escape(user)
@@ -273,6 +279,7 @@
desc = "A pneumatic waste disposal unit."
icon_state = "disposal"
var/datum/oracle_ui/themed/nano/ui
obj_flags = CAN_BE_HIT | USES_TGUI | SHOVABLE_ONTO
/obj/machinery/disposal/bin/Initialize(mapload, obj/structure/disposalconstruct/make_from)
. = ..()
@@ -313,7 +320,7 @@
if(Adjacent(user))
return TRUE
return ..()
/obj/machinery/disposal/bin/oui_data(mob/user)
var/list/data = list()
@@ -368,6 +375,17 @@
else
return ..()
/obj/machinery/disposal/bin/shove_act(mob/living/target, mob/living/user)
if(can_stuff_mob_in(target, user, TRUE))
target.Knockdown(SHOVE_KNOCKDOWN_SOLID)
target.forceMove(src)
user.visible_message("<span class='danger'>[user.name] shoves [target.name] into \the [src]!</span>",
"<span class='danger'>You shove [target.name] into \the [src]!</span>", null, COMBAT_MESSAGE_RANGE)
log_combat(user, target, "shoved", "into [src] (disposal bin)")
return TRUE
return FALSE
/obj/machinery/disposal/bin/flush()
..()
full_pressure = FALSE