Merge remote-tracking branch 'refs/remotes/Citadel-Station-13/master' into job-menu-improvements

This commit is contained in:
Poojawa
2019-08-17 23:41:28 -05:00
35 changed files with 210 additions and 90 deletions
+1
View File
@@ -93,6 +93,7 @@
#define FIRE_PRIORITY_SERVER_MAINT 10
#define FIRE_PRIORITY_RESEARCH 10
#define FIRE_PRIORITY_VIS 10
#define FIRE_PRIORITY_VORE 10
#define FIRE_PRIORITY_GARBAGE 15
#define FIRE_PRIORITY_WET_FLOORS 20
#define FIRE_PRIORITY_AIR 20
+1 -1
View File
@@ -107,7 +107,7 @@ GLOBAL_LIST_INIT(maintenance_loot, list(
/obj/item/storage/toolbox/artistic = 2,
/obj/item/toy/eightball = 1,
/obj/item/reagent_containers/pill/floorpill = 1,
/obj/item/reagent_containers/food/snacks/cannedpeaches/maint = 1,
/obj/item/reagent_containers/food/snacks/cannedpeaches/maint = 2,
/obj/item/storage/daki = 3, //VERY IMPORTANT CIT CHANGE - adds bodypillows to maint
/obj/item/storage/pill_bottle/penis_enlargement = 2,
/obj/item/storage/pill_bottle/breast_enlargement = 2,
@@ -9,6 +9,7 @@ PROCESSING_SUBSYSTEM_DEF(quirks)
runlevels = RUNLEVEL_GAME
var/list/quirks = list() //Assoc. list of all roundstart quirk datum types; "name" = /path/
var/list/quirk_names_by_path = list()
var/list/quirk_points = list() //Assoc. list of quirk names and their "point cost"; positive numbers are good traits, and negative ones are bad
var/list/quirk_objects = list() //A list of all quirk objects in the game, since some may process
@@ -22,11 +23,68 @@ PROCESSING_SUBSYSTEM_DEF(quirks)
var/datum/quirk/T = V
quirks[initial(T.name)] = T
quirk_points[initial(T.name)] = initial(T.value)
quirk_names_by_path[T] = initial(T.name)
/datum/controller/subsystem/processing/quirks/proc/AssignQuirks(mob/living/user, client/cli, spawn_effects)
/datum/controller/subsystem/processing/quirks/proc/AssignQuirks(mob/living/user, client/cli, spawn_effects, roundstart = FALSE, datum/job/job, silent = FALSE, mob/to_chat_target)
GenerateQuirks(cli)
for(var/V in cli.prefs.character_quirks)
var/list/quirks = cli.prefs.character_quirks.Copy()
var/list/cut
if(job && job.blacklisted_quirks)
cut = filter_quirks(quirks, job)
for(var/V in quirks)
user.add_quirk(V, spawn_effects)
if(!silent && LAZYLEN(cut))
to_chat(to_chat_target || user, "<span class='boldwarning'>All of your non-neutral character quirks have been cut due to these quirks conflicting with your job assignment: [english_list(cut)].</span>")
/datum/controller/subsystem/processing/quirks/proc/quirk_path_by_name(name)
return quirks[name]
/datum/controller/subsystem/processing/quirks/proc/quirk_points_by_name(name)
return quirk_points[name]
/datum/controller/subsystem/processing/quirks/proc/quirk_name_by_path(path)
return quirk_names_by_path[path]
/datum/controller/subsystem/processing/quirks/proc/total_points(list/quirk_names)
. = 0
for(var/i in quirk_names)
. += quirk_points_by_name(i)
/datum/controller/subsystem/processing/quirks/proc/filter_quirks(list/quirks, datum/job/job)
var/list/cut = list()
var/list/banned_names = list()
for(var/i in job.blacklisted_quirks)
var/name = quirk_name_by_path(i)
if(name)
banned_names += name
var/list/blacklisted = quirks & banned_names
if(length(blacklisted))
for(var/i in blacklisted)
quirks -= i
cut += i
/* //Code to automatically reduce positive quirks until balance is even.
var/points_used = total_points(quirks)
if(points_used > 0)
//they owe us points, let's collect.
for(var/i in quirks)
var/points = quirk_points_by_name(i)
if(points > 0)
cut += i
quirks -= i
points_used -= points
if(points_used <= 0)
break
*/
//Nah, let's null all non-neutrals out.
if(cut.len)
for(var/i in quirks)
if(quirk_points_by_name(i) != 0)
//cut += i -- Commented out: Only show the ones that triggered the quirk purge.
quirks -= i
return cut
/datum/controller/subsystem/processing/quirks/proc/GenerateQuirks(client/user)
if(user.prefs.character_quirks.len)
+1 -1
View File
@@ -385,7 +385,7 @@ SUBSYSTEM_DEF(ticker)
if(player.mind.assigned_role != player.mind.special_role)
SSjob.EquipRank(N, player.mind.assigned_role, 0)
if(CONFIG_GET(flag/roundstart_traits) && ishuman(N.new_character))
SSquirks.AssignQuirks(N.new_character, N.client, TRUE)
SSquirks.AssignQuirks(N.new_character, N.client, TRUE, TRUE, SSjob.GetJob(player.mind.assigned_role), FALSE, N)
CHECK_TICK
if(captainless)
for(var/mob/dead/new_player/N in GLOB.player_list)
+1 -1
View File
@@ -7,7 +7,7 @@
SUBSYSTEM_DEF(bellies)
name = "Bellies"
priority = 5
priority = FIRE_PRIORITY_VORE
wait = 1 SECONDS
flags = SS_KEEP_TIMING|SS_NO_INIT
runlevels = RUNLEVEL_GAME|RUNLEVEL_POSTGAME
-1
View File
@@ -13,7 +13,6 @@
var/mob/living/quirk_holder
/datum/quirk/New(mob/living/quirk_mob, spawn_effects)
..()
if(!quirk_mob || (human_only && !ishuman(quirk_mob)) || quirk_mob.has_quirk(type))
qdel(src)
quirk_holder = quirk_mob
@@ -498,6 +498,23 @@ Code:
else
menu += "[ldat]"
menu += "<h4>Pimpin' Ride:</h4>"
ldat = null
for (var/obj/vehicle/ridden/janicart/M in world)
var/turf/ml = get_turf(M)
if(ml)
if (ml.z != cl.z)
continue
var/direction = get_dir(src, M)
ldat += "Ride - <b>\[[ml.x],[ml.y] ([uppertext(dir2text(direction))])\]</b><br>"
if (!ldat)
menu += "None"
else
menu += "[ldat]"
menu += "<h4>Located Janitorial Cart:</h4>"
ldat = null
+3
View File
@@ -524,12 +524,15 @@
/obj/item/grenade/chem_grenade,
/obj/item/lightreplacer,
/obj/item/flashlight,
/obj/item/reagent_containers/glass/beaker,
/obj/item/reagent_containers/glass/bottle,
/obj/item/reagent_containers/spray,
/obj/item/soap,
/obj/item/holosign_creator,
/obj/item/key/janitor,
/obj/item/clothing/gloves,
/obj/item/melee/flyswatter,
/obj/item/paint/paint_remover,
/obj/item/assembly/mousetrap
))
+3 -2
View File
@@ -137,7 +137,7 @@ GLOBAL_VAR(restart_counter)
// but those are both private, so let's put the commit info in the runtime
// log which is ultimately public.
log_runtime(GLOB.revdata.get_log_message())
/world/Topic(T, addr, master, key)
TGS_TOPIC //redirect to server tools if necessary
@@ -270,7 +270,8 @@ GLOBAL_VAR(restart_counter)
if (M.client)
n++
features += "[SSmapping.config.map_name]" //CIT CHANGE - makes the hub entry display the current map
if(SSmapping.config) // this just stops the runtime, honk.
features += "[SSmapping.config.map_name]" //CIT CHANGE - makes the hub entry display the current map
if(get_security_level())//CIT CHANGE - makes the hub entry show the security level
features += "[get_security_level()] alert"
+12 -1
View File
@@ -1699,7 +1699,7 @@
/datum/supply_pack/service/janitor/janpremium
name = "Janitor Premium Supplies"
desc = "Do to the union for better supplies, we have desided to make a deal for you, In this crate you can get a brand new chem, Drying Angent this stuff is the work of slimes or magic! This crate also contains a rag to test out the Drying Angent magic, three wet floor signs, and some spare bottles of ammonia."
cost = 3000
cost = 1750
access = ACCESS_JANITOR
contains = list(/obj/item/caution,
/obj/item/caution,
@@ -1707,9 +1707,20 @@
/obj/item/reagent_containers/rag,
/obj/item/reagent_containers/glass/bottle/ammonia,
/obj/item/reagent_containers/glass/bottle/ammonia,
/obj/item/reagent_containers/glass/bottle/ammonia,
/obj/item/reagent_containers/spray/drying_agent)
crate_name = "janitor backpack crate"
/datum/supply_pack/service/janitor/janpimp
name = "Custodial Cruiser"
desc = "Clown steal your ride? Assistant lock it in the dorms? Order a new one and get back to cleaning in style!"
cost = 3000
access = ACCESS_JANITOR
contains = list(/obj/vehicle/ridden/janicart,
/obj/item/key/janitor)
crate_name = "janitor ride crate"
crate_type = /obj/structure/closet/crate/large
/datum/supply_pack/service/mule
name = "MULEbot Crate"
desc = "Pink-haired Quartermaster not doing her job? Replace her with this tireless worker, today!"
@@ -65,6 +65,9 @@
var/warcry = "AT"
/obj/item/clothing/gloves/rapid/Touch(mob/living/target,proximity = TRUE)
if(!istype(target))
return
var/mob/living/M = loc
if(M.a_intent == INTENT_HARM)
@@ -87,6 +90,9 @@
warcry = "owo" //Shouldn't ever come into play
/obj/item/clothing/gloves/rapid/hug/Touch(mob/living/target,proximity = TRUE)
if(!istype(target))
return
var/mob/living/M = loc
if(M.a_intent == INTENT_HELP)
+7 -1
View File
@@ -78,6 +78,12 @@
// these vars are not really standardized but all would theoretically create stuff on death
for(var/v in list("butcher_results","corpse","weapon1","weapon2","blood_volume") & mob.vars)
mob.vars[v] = null
ENABLE_BITFIELD(mob.flags_1, HOLOGRAM_1)
if(isliving(mob))
var/mob/living/L = mob
L.feeding = FALSE
L.devourable = FALSE
L.digestable = FALSE
return mob
/obj/effect/holodeck_effect/mobspawner/deactivate(var/obj/machinery/computer/holodeck/HC)
@@ -100,7 +106,7 @@
/obj/effect/holodeck_effect/mobspawner/penguin
mobtype = /mob/living/simple_animal/pet/penguin/emperor
/obj/effect/holodeck_effect/mobspawner/penguin/Initialize()
if(prob(1))
mobtype = /mob/living/simple_animal/pet/penguin/emperor/shamebrero
+2
View File
@@ -69,6 +69,8 @@
if(default_deconstruction_screwdriver(user, "dnamod", "dnamod", I))
update_icon()
return
else if(default_unfasten_wrench(user, I))
return
if(default_deconstruction_crowbar(I))
return
if(iscyborg(user))
+3 -3
View File
@@ -218,13 +218,13 @@
// Strawberry
/obj/item/seeds/strawberries
name = "pack of green grape seeds"
name = "pack of strawberrie seeds"
desc = "These seeds grow into strawberries vines."
icon_state = "seed-strawberry"
species = "strawberry"
plantname = "Strawberry Vine"
product = /obj/item/reagent_containers/food/snacks/grown/strawberries
reagents_add = list("vitamin" = 0.07, "nutriment" = 0.1, "sugar" = 0.1)
reagents_add = list("vitamin" = 0.07, "nutriment" = 0.1, "sugar" = 0.2)
mutatelist = list()
/obj/item/reagent_containers/food/snacks/grown/strawberries
@@ -233,4 +233,4 @@
icon_state = "strawberries"
filling_color = "#7FFF00"
tastes = list("strawberries" = 1)
wine_power = 20
wine_power = 20
+1
View File
@@ -57,6 +57,7 @@
var/antag_rep = 10
var/list/mind_traits // Traits added to the mind of the mob assigned this job
var/list/blacklisted_quirks //list of quirk typepaths blacklisted.
var/display_order = JOB_DISPLAY_ORDER_DEFAULT
+2
View File
@@ -25,6 +25,8 @@
display_order = JOB_DISPLAY_ORDER_CAPTAIN
blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/nonviolent, /datum/quirk/insanity)
/datum/job/captain/get_access()
return get_all_accesses()
@@ -419,7 +419,7 @@
SSticker.mode.make_antag_chance(humanc)
if(humanc && CONFIG_GET(flag/roundstart_traits))
SSquirks.AssignQuirks(humanc, humanc.client, TRUE)
SSquirks.AssignQuirks(humanc, humanc.client, TRUE, FALSE, job, FALSE)
log_manifest(character.mind.key,character.mind,character,latejoin = TRUE)
+7 -6
View File
@@ -636,14 +636,15 @@
else if(canmove)
if(on_fire)
resist_fire() //stop, drop, and roll
else if(resting) //cit change - allows resisting out of resting
return
if(resting) //cit change - allows resisting out of resting
resist_a_rest() // ditto
else if(iscarbon(src)) //Citadel Change for embedded removal memes
var/mob/living/carbon/C = src
if(!C.handcuffed && !C.legcuffed)
return TRUE
else if(last_special <= world.time)
return
if(resist_embedded()) //Citadel Change for embedded removal memes
return
if(last_special <= world.time)
resist_restraints() //trying to remove cuffs.
return
/mob/proc/resist_grab(moving_resist)
@@ -49,6 +49,8 @@
// Simple animals have only one belly. This creates it (if it isn't already set up)
/mob/living/simple_animal/init_vore()
vore_init = TRUE
if(CHECK_BITFIELD(flags_1, HOLOGRAM_1))
return
if(vore_organs.len)
return
if(no_vore) //If it can't vore, let's not give it a stomach.
@@ -32,4 +32,12 @@
id = "mining"
build_path = /obj/item/circuitboard/computer/mining
category = list("Computer Boards")
departmental_flags = DEPARTMENTAL_FLAG_CARGO | DEPARTMENTAL_FLAG_SECURITY
departmental_flags = DEPARTMENTAL_FLAG_CARGO | DEPARTMENTAL_FLAG_SECURITY
/datum/design/board/miningshuttle
name = "Computer Design (Mining Shuttle Console)"
desc = "Allows for the construction of circuit boards used to build a Mining Shuttle Console."
id = "miningshuttle"
build_path = /obj/item/circuitboard/computer/mining_shuttle
category = list("Computer Boards")
departmental_flags = DEPARTMENTAL_FLAG_CARGO
@@ -290,6 +290,16 @@
category = list("Equipment")
departmental_flags = DEPARTMENTAL_FLAG_SERVICE
/datum/design/light_replacer
name = "Light Replacer"
desc = "A device to automatically replace lights. Refill with working light bulbs."
id = "light_replacer"
build_type = PROTOLATHE
materials = list(MAT_METAL = 1500, MAT_SILVER = 150, MAT_GLASS = 3000)
build_path = /obj/item/lightreplacer
category = list("Equipment")
departmental_flags = DEPARTMENTAL_FLAG_SERVICE
/datum/design/blutrash
name = "Trashbag of Holding"
desc = "An advanced trash bag with bluespace properties; capable of holding a plethora of garbage."
@@ -57,16 +57,6 @@
category = list("Misc","Power Designs")
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING
/datum/design/light_replacer
name = "Light Replacer"
desc = "A device to automatically replace lights. Refill with working light bulbs."
id = "light_replacer"
build_type = PROTOLATHE
materials = list(MAT_METAL = 1500, MAT_SILVER = 150, MAT_GLASS = 3000)
build_path = /obj/item/lightreplacer
category = list("Power Designs")
departmental_flags = DEPARTMENTAL_FLAG_SERVICE
/datum/design/inducer
name = "Inducer"
desc = "The NT-75 Electromagnetic Power Inducer can wirelessly induce electric charge in an object, allowing you to recharge power cells without having to remove them."
+1 -1
View File
@@ -432,7 +432,7 @@
display_name = "Computer Consoles"
description = "Computers and how they work."
prereq_ids = list("datatheory")
design_ids = list("cargo", "cargorequest", "libraryconsole", "mining", "crewconsole", "rdcamera", "comconsole", "idcardconsole", "seccamera")
design_ids = list("cargo", "cargorequest", "libraryconsole", "mining", "miningshuttle", "crewconsole", "rdcamera", "comconsole", "idcardconsole", "seccamera")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000)
export_price = 5000
+2 -1
View File
@@ -354,7 +354,8 @@
if("mam_body_markings" in S.default_features)
var/datum/sprite_accessory/Smark
Smark = GLOB.mam_body_markings_list[H.dna.features["mam_body_markings"]]
body_markings_icon = Smark.icon
if(Smark)
body_markings_icon = Smark.icon
if(H.dna.features.["mam_body_markings"] != "None")
body_markings = lowertext(H.dna.features.["mam_body_markings"])
auxmarking = lowertext(H.dna.features.["mam_body_markings"])
+2
View File
@@ -31,7 +31,9 @@
/obj/item/seeds/replicapod = 3,
/obj/item/seeds/wheat/rice = 3,
/obj/item/seeds/soya = 3,
/obj/item/seeds/sugarcane = 3,
/obj/item/seeds/sunflower = 3,
/obj/item/seeds/strawberries = 3,
/obj/item/seeds/tea = 3,
/obj/item/seeds/tobacco = 3,
/obj/item/seeds/tomato = 3,
@@ -0,0 +1,4 @@
author: "Bhijn"
delete-after: True
changes:
- bugfix: "You can now actually use the resist hotkey to resist out of handcuffs. Woah, revolutionary"
@@ -0,0 +1,4 @@
author: "Linzolle"
delete-after: True
changes:
- rscadd: "mining shuttle console can now be printed after computer consoles have been researched"
@@ -0,0 +1,9 @@
author: "Owai-Seek"
delete-after: True
changes:
- rscadd: "custodial cruiser cargo crate"
- tweak: "removed light replacer from power designs and moved to misc designs"
- tweak: "added pimpin ride to custodial locator"
- tweak: "added additional items to janibelt whitelist"
- tweak: "made plant DNA manipulator unwrenchable"
- balance: "reduced janitor premium supply costs"
@@ -0,0 +1,4 @@
author: "Raptorizer"
delete-after: True
changes:
- tweak: "Doubled peach spawn rate"
@@ -0,0 +1,4 @@
author: "kappa-sama"
delete-after: True
changes:
- bugfix: "seed"
@@ -3,9 +3,7 @@
// box of hugs
/obj/item/storage/box/hug/attack_self(mob/user)
. = ..()
GET_COMPONENT_FROM(mood, /datum/component/mood, user)
if(mood)
mood.add_event("hugbox", /datum/mood_event/hugbox)
SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT,"hugbox", /datum/mood_event/hugbox)
//Removed headpats here, duplicate code?
@@ -13,25 +11,17 @@
/obj/item/toy/plush/attack_self(mob/user)
. = ..()
if(stuffed || grenade)
GET_COMPONENT_FROM(mood, /datum/component/mood, user)
if(mood)
mood.add_event("plushpet", /datum/mood_event/plushpet)
SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT,"plushpet", /datum/mood_event/plushpet)
else
GET_COMPONENT_FROM(mood, /datum/component/mood, user)
if(mood)
mood.add_event("plush_nostuffing", /datum/mood_event/plush_nostuffing)
SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT,"plush_nostuffing", /datum/mood_event/plush_nostuffing)
// Jack the Ripper starring plush
/obj/item/toy/plush/attackby(obj/item/I, mob/living/user, params)
. = ..()
if(I.is_sharp())
if(!grenade)
GET_COMPONENT_FROM(mood, /datum/component/mood, user)
if(mood)
mood.add_event("plushjack", /datum/mood_event/plushjack)
SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT,"plushjack", /datum/mood_event/plushjack)
// plush playing (plush-on-plush action)
if(istype(I, /obj/item/toy/plush))
GET_COMPONENT_FROM(mood, /datum/component/mood, user)
if(mood)
mood.add_event("plushplay", /datum/mood_event/plushplay)
SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT,"plushplay", /datum/mood_event/plushplay)
@@ -322,31 +322,6 @@
name = "worn pet collar"
desc = "a pet collar that looks well used."
/obj/item/clothing/neck/petcollar/naomi/examine(mob/user)
. = ..()
if(usr.ckey != "technicalmagi")
to_chat(user, "There's something odd about the it. You probably shouldn't wear it...")//warn people not to wear it if they're not Naomi, lest they become as crazy as she is
/obj/item/clothing/neck/petcollar/naomi/equipped()
. = ..()
START_PROCESSING(SSobj, src)
/obj/item/clothing/neck/petcollar/naomi/dropped()
. = ..()
STOP_PROCESSING(SSobj, src)
/obj/item/clothing/neck/petcollar/naomi/process()
var/mob/living/carbon/human/H
if(ishuman(loc))
H = loc
if(!H)
return
else if(H.get_item_by_slot(SLOT_NECK) == src)
if(H.arousalloss < H.max_arousal / 3)
H.arousalloss = H.max_arousal / 3
if(prob(5) && H.hallucination < 15)
H.hallucination += 10
/obj/item/clothing/neck/cloak/green
name = "Generic Green Cloak"
desc = "This cloak doesn't seem too special."
@@ -13,18 +13,19 @@
/mob/living/carbon/human/species/xeno
race = /datum/species/xeno
/mob/living/carbon/human/resist()
. = ..()
if(wear_suit && wear_suit.breakouttime)//added in human cuff breakout proc
/mob/living/proc/resist_embedded()
return
/mob/living/carbon/human/resist_embedded()
if(handcuffed || legcuffed || (wear_suit && wear_suit.breakouttime))
return
if(.)
if(canmove && !on_fire)
for(var/obj/item/bodypart/L in bodyparts)
if(istype(L) && L.embedded_objects.len)
for(var/obj/item/I in L.embedded_objects)
if(istype(I) && I.w_class >= WEIGHT_CLASS_NORMAL) //minimum weight class to insta-ripout via resist
remove_embedded_unsafe(L, I, src, 1.5) //forcefully call the remove embedded unsafe proc but with extra pain multiplier. if you want to remove it less painfully, examine and remove it carefully.
return FALSE //Hands are occupied
if(canmove && !on_fire)
for(var/obj/item/bodypart/L in bodyparts)
if(istype(L) && L.embedded_objects.len)
for(var/obj/item/I in L.embedded_objects)
if(istype(I) && I.w_class >= WEIGHT_CLASS_NORMAL) //minimum weight class to insta-ripout via resist
remove_embedded_unsafe(L, I, src, 1.5) //forcefully call the remove embedded unsafe proc but with extra pain multiplier. if you want to remove it less painfully, examine and remove it carefully.
return TRUE //Hands are occupied
return
/mob/living/carbon/human/proc/remove_embedded_unsafe(obj/item/bodypart/L, obj/item/I, mob/user, painmul = 1)
@@ -152,11 +152,13 @@
SSbellies.belly_list += src
/obj/belly/Destroy()
SSbellies.belly_list -= src
if(owner)
owner.vore_organs -= src
owner = null
. = ..()
Remove(owner)
return ..()
/obj/belly/proc/Remove(mob/living/owner)
owner.vore_organs -= src
owner = null
// Called whenever an atom enters this belly
/obj/belly/Entered(var/atom/movable/thing,var/atom/OldLoc)
@@ -4,10 +4,16 @@
recent_sound = FALSE
return SSBELLIES_IGNORED
if(!owner)
qdel(src)
SSbellies.belly_list -= src
return SSBELLIES_PROCESSED
if(loc != owner)
if(istype(owner))
loc = owner
if(isliving(owner)) //we don't have machine based bellies. (yet :honk:)
forceMove(owner)
else
SSbellies.belly_list -= src
qdel(src)
return SSBELLIES_PROCESSED