Merge branch 'master' into upstream-merge-31309

This commit is contained in:
LetterJay
2017-10-07 01:07:59 -04:00
committed by GitHub
47 changed files with 1229 additions and 309 deletions

View File

@@ -141054,9 +141054,9 @@ cHW
cHW
cHW
cOy
cQx
cRP
cTA
epl
epm
epn
cOy
cHW
cHS
@@ -155987,7 +155987,7 @@ esD
dAw
dBO
dDd
esF
esB
dFd
dGE
dHP
@@ -156238,13 +156238,13 @@ drs
dsS
drs
dvx
esA
esz
dyb
dzf
dAx
dBP
dDe
esG
esB
dFe
dGF
dHP
@@ -157015,7 +157015,7 @@ dzi
dAA
dBS
esE
esH
esB
dEY
dGA
dHP

View File

@@ -20,6 +20,7 @@
#define LATTICE_LAYER 2.2
#define DISPOSAL_PIPE_LAYER 2.3
#define GAS_PIPE_HIDDEN_LAYER 2.35
#define TURF_DECAL_LAYER 2.39
#define WIRE_LAYER 2.4
#define WIRE_TERMINAL_LAYER 2.45
#define GAS_SCRUBBER_LAYER 2.46

View File

@@ -154,9 +154,3 @@
#define ui_ghost_reenter_corpse "SOUTH:6,CENTER:24"
#define ui_ghost_teleport "SOUTH:6,CENTER+1:24"
#define ui_ghost_pai "SOUTH: 6, CENTER+2:24"
//Hand of God, god
#define ui_deityhealth "EAST-1:28,CENTER-2:13"
#define ui_deitypower "EAST-1:28,CENTER-1:15"
#define ui_deityfollowers "EAST-1:28,CENTER:17"

View File

@@ -23,9 +23,6 @@
var/obj/screen/devil/soul_counter/devilsouldisplay
var/obj/screen/deity_power_display
var/obj/screen/deity_follower_display
var/obj/screen/nightvisionicon
var/obj/screen/action_intent
var/obj/screen/zone_select
@@ -114,8 +111,6 @@
blobpwrdisplay = null
alien_plasma_display = null
alien_queen_finder = null
deity_power_display = null
deity_follower_display = null
nightvisionicon = null
if(plane_masters.len)

View File

@@ -485,11 +485,6 @@
icon = 'icons/mob/screen_cyborg.dmi'
screen_loc = ui_borg_health
/obj/screen/healths/deity
name = "Nexus Health"
icon_state = "deity_nexus"
screen_loc = ui_deityhealth
/obj/screen/healths/blob
name = "blob health"
icon_state = "block"

View File

@@ -93,6 +93,9 @@ GLOBAL_LIST_EMPTY(mentors)
GLOBAL_VAR_INIT(looc_allowed, 1)
GLOBAL_VAR_INIT(dlooc_allowed, 1)
//Crew objective and miscreants stuff
GLOBAL_VAR_INIT(miscreants_allowed, FALSE)
/client/proc/reload_mentors()
set name = "Reload Mentors"
set category = "Admin"

View File

@@ -0,0 +1,44 @@
/datum/controller/subsystem/ticker/proc/generate_crew_objectives()
for(var/datum/mind/crewMind in SSticker.minds)
if(prob(2) && !issilicon(crewMind.current) && !jobban_isbanned(crewMind, "Syndicate") && GLOB.miscreants_allowed)
generate_miscreant_objectives(crewMind)
else
if(CONFIG_GET(flag/allow_crew_objectives))
generate_individual_objectives(crewMind)
return
/datum/controller/subsystem/ticker/proc/generate_individual_objectives(var/datum/mind/crewMind)
if(!(CONFIG_GET(flag/allow_crew_objectives)))
return
if(!crewMind)
return
if(!crewMind.current || !crewMind.objectives || crewMind.special_role)
return
if(!crewMind.assigned_role)
return
var/list/validobjs = get_valid_crew_objs(ckey(crewMind.assigned_role))
if(!validobjs || !validobjs.len)
return
var/selectedObj = pick(validobjs)
var/datum/objective/crew/newObjective = new selectedObj
if(!newObjective)
return
newObjective.owner = crewMind
crewMind.objectives += newObjective
to_chat(crewMind, "<B>Your objective:</B> [newObjective.explanation_text]")
/datum/controller/subsystem/ticker/proc/get_valid_crew_objs(var/job = "")//taken from old hippie with adjustments
var/list/objpaths = typesof(/datum/objective/crew)
var/list/objlist = list()
for(var/hoorayhackyshit in objpaths)
var/datum/objective/crew/obj = hoorayhackyshit //dm is not a sane language in any way, shape, or form.
var/list/availableto = splittext(initial(obj.jobs),",")
if(job in availableto)
objlist += obj
return objlist
/datum/objective/crew/
var/jobs = ""
explanation_text = "Yell on the development discussion channel on Citadels discord if this ever shows up. Something just broke here, dude"
/datum/objective/crew/proc/setup()

View File

@@ -182,7 +182,7 @@
multiple_sprites = 2
/obj/item/gun/ballistic/automatic/x9/toy
name = "donksoft X9"
name = "\improper Foam Force X9"
desc = "An old but reliable assault rifle made for combat against unknown enemies. Appears to be hastily converted. Ages 8 and up."
icon = 'icons/obj/guns/cit_guns.dmi'
icon_state = "toy9"
@@ -192,6 +192,14 @@
casing_ejector = 0
spread = 45 //MAXIMUM XCOM MEMES (actually that'd be 90 spread)
/datum/design/foam_x9
name = "Foam Force X9 Rifle"
id = "foam_x9"
build_type = AUTOLATHE
materials = list(MAT_METAL = 20000, MAT_GLASS = 10000)
build_path = /obj/item/gun/ballistic/automatic/x9/toy
category = list("hacked", "Misc")
////////XCOM2 Magpistol/////////
@@ -470,6 +478,34 @@
materials = list(MAT_METAL = 6000, MAT_SILVER = 500, MAT_TITANIUM = 500)
build_path = /obj/item/ammo_box/magazine/mmag
///foamagrifle///
/obj/item/ammo_box/magazine/toy/foamag
name = "foam force magrifle magazine"
icon = 'icons/obj/guns/cit_guns.dmi'
icon_state = "foamagmag"
max_ammo = 15
multiple_sprites = 2
ammo_type = /obj/item/ammo_casing/caseless/foam_dart/mag
/obj/item/gun/ballistic/automatic/magrifle/toy
name = "foamag rifle"
desc = "A foam launching magnetic rifle. Ages 8 and up."
icon_state = "foamagrifle"
needs_permit = 0
mag_type = /obj/item/ammo_box/magazine/toy/foamag
casing_ejector = FALSE
origin_tech = "combat=2;engineering=2;magnets=2"
/datum/design/foam_magrifle
name = "Foam Force MagRifle"
id = "foam_magrifle"
build_type = AUTOLATHE
materials = list(MAT_METAL = 15000, MAT_GLASS = 7500)
build_path = /obj/item/gun/ballistic/automatic/magrifle/toy
category = list("hacked", "Misc")
//////Hyper-Burst Rifle//////
///projectiles///
@@ -556,6 +592,53 @@
..()
icon_state = "hyperburst[magazine ? "-[get_ammo()]" : ""][chambered ? "" : "-e"]"
///toy memes///
/obj/item/projectile/beam/lasertag/mag //the projectile, compatible with regular laser tag armor
icon = 'icons/obj/guns/cit_guns.dmi'
icon_state = "magjectile-toy"
name = "lasertag magbolt"
forcedodge = TRUE //for penetration memes
range = 5 //so it isn't super annoying
light_range = 2
light_color = LIGHT_COLOR_YELLOW
eyeblur = 0
/obj/item/ammo_casing/energy/laser/magtag
projectile_type = /obj/item/projectile/beam/lasertag/mag
select_name = "magtag"
pellets = 3
variance = 30
e_cost = 1000
fire_sound = 'sound/weapons/magburst.ogg'
/obj/item/gun/energy/laser/practice/hyperburst
name = "toy hyper-burst launcher"
desc = "A toy laser with a unique beam shaping lens that projects harmless bolts capable of going through objects. Compatible with existing laser tag systems."
ammo_type = list(/obj/item/ammo_casing/energy/laser/magtag)
icon = 'icons/obj/guns/cit_guns.dmi'
icon_state = "toyburst"
clumsy_check = FALSE
needs_permit = FALSE
fire_delay = 40
weapon_weight = WEAPON_HEAVY
selfcharge = TRUE
charge_delay = 2
recoil = 2
cell_type = /obj/item/stock_parts/cell/toymagburst
/obj/item/stock_parts/cell/toymagburst
name = "toy mag burst rifle power supply"
maxcharge = 4000
/datum/design/foam_hyperburst
name = "MagTag Hyper Rifle"
id = "foam_hyperburst"
build_type = AUTOLATHE
materials = list(MAT_METAL = 35000, MAT_GLASS = 15000)
build_path = /obj/item/gun/energy/laser/practice/hyperburst
category = list("hacked", "Misc")
/* made redundant by reskinnable stetchkins
//////Stealth Pistol//////
@@ -583,6 +666,40 @@
*/
///foam stealth pistol///
/obj/item/gun/ballistic/automatic/toy/pistol/stealth
name = "foam force stealth pistol"
desc = "A small, easily concealable toy bullpup handgun. Ages 8 and up."
icon = 'icons/obj/guns/cit_guns.dmi'
icon_state = "foamsp"
w_class = WEIGHT_CLASS_SMALL
mag_type = /obj/item/ammo_box/magazine/toy/pistol
can_suppress = FALSE
fire_sound = 'sound/weapons/gunshot_silenced.ogg'
suppressed = TRUE
burst_size = 1
fire_delay = 0
actions_types = list()
/obj/item/gun/ballistic/automatic/toy/pistol/stealth/update_icon()
..()
if(magazine)
cut_overlays()
add_overlay("foamsp-magazine")
else
cut_overlays()
icon_state = "[initial(icon_state)][chambered ? "" : "-e"]"
/datum/design/foam_sp
name = "Foam Force Stealth Pistol"
id = "foam_sp"
build_type = AUTOLATHE
materials = list(MAT_METAL = 15000, MAT_GLASS = 1000)
build_path = /obj/item/gun/ballistic/automatic/toy/pistol/stealth
category = list("hacked", "Misc")
//////10mm soporific bullets//////
obj/item/projectile/bullet/c10mm/soporific
@@ -769,3 +886,32 @@ obj/item/projectile/bullet/c10mm/soporific
add_overlay("[unique_reskin[current_skin]]-magazine")
else
cut_overlays()
/////////RAYGUN MEMES/////////
/obj/item/projectile/beam/lasertag/ray //the projectile, compatible with regular laser tag armor
icon = 'icons/obj/guns/cit_guns.dmi'
icon_state = "ray"
name = "ray bolt"
eyeblur = 0
/obj/item/ammo_casing/energy/laser/raytag
projectile_type = /obj/item/projectile/beam/lasertag/ray
select_name = "raytag"
fire_sound = 'sound/weapons/raygun.ogg'
/obj/item/gun/energy/laser/practice/raygun
name = "toy ray gun"
icon = 'icons/obj/guns/cit_guns.dmi'
icon_state = "raygun"
desc = "A toy laser with a classic, retro feel and look. Compatible with existing laser tag systems."
ammo_type = list(/obj/item/ammo_casing/energy/laser/raytag)
selfcharge = TRUE
/datum/design/toyray
name = "RayTag Gun"
id = "toyray"
build_type = AUTOLATHE
materials = list(MAT_METAL = 7500, MAT_GLASS = 1000)
build_path = /obj/item/gun/energy/laser/practice/raygun
category = list("hacked", "Misc")

View File

@@ -0,0 +1,61 @@
/datum/controller/subsystem/ticker/proc/generate_miscreant_objectives(var/datum/mind/crewMind)
if(!GLOB.miscreants_allowed)
return
if(!crewMind)
return
if(!crewMind.current || !crewMind.objectives || crewMind.special_role)
return
if(!crewMind.assigned_role)
return
if(jobban_isbanned(crewMind, "Syndicate"))
return
var/list/objectiveTypes = typesof(/datum/objective/miscreant) - /datum/objective/miscreant
if(!objectiveTypes.len)
return
var/selectedType = pick(objectiveTypes)
var/datum/objective/miscreant/newObjective = new selectedType
if(!newObjective)
return
newObjective.owner = crewMind
crewMind.objectives += newObjective
crewMind.special_role = "miscreant"
to_chat(crewMind, "<B><font size=3 color=red>You are a Miscreant.</font></B>")
to_chat(crewMind, "<B>Pursuing your objective is entirely optional, as the completion of your objective is unable to be tracked. Performing traitorous acts not directly related to your objective may result in permanent termination of your employment.</B>")
to_chat(crewMind, "<B>Your objective:</B> [newObjective.explanation_text]")
/datum/objective/miscreant
explanation_text = "Something broke. Horribly. Dear god, im so sorry. Yell about this in the development discussion channel of citadels discord."
/* Goon's Miscreant Objectives */
/datum/objective/miscreant/blockade
explanation_text = "Try to completely block off access to an area, under the pretense that it's too dangerous."
/datum/objective/miscreant/incompetent
explanation_text = "Be as useless and incompetent as possible without getting killed."
/datum/objective/miscreant/litterbug
explanation_text = "Make a huge mess wherever you go."
/datum/objective/miscreant/stalk
explanation_text = "Single out a crew member and stalk them everywhere."
/datum/objective/miscreant/creepy
explanation_text = "Sneak around looking as suspicious as possible without actually doing anything illegal."
/datum/objective/miscreant/construction
explanation_text = "Perform obnoxious construction and renovation projects. Insist that you're just doing your job."
/datum/objective/miscreant/access
explanation_text = "Make as much of the station as possible accessible to the public."
/datum/objective/miscreant/whiny
explanation_text = "Complain incessantly about every minor issue you find."
/* Citadel's Miscreant Objectives */
/datum/objective/miscreant/immersions
explanation_text = "Act as out of character as you possibly can."
/datum/objective/miscreant/racism
explanation_text = "Attempt to establish superiority of your race."

View File

@@ -0,0 +1,81 @@
/* CARGO OBJECTIVES */
/datum/objective/crew/petsplosion
explanation_text = "Ensure there are at least (If you see this, yell on citadels discord in the development discussion channel) pets on the station by the end of the shift. Interpret this as you wish."
jobs = "quartermaster,cargotechnician"
/datum/objective/crew/petsplosion/New()
. = ..()
target_amount = rand(10,30)
update_explanation_text()
/datum/objective/crew/petsplosion/update_explanation_text()
. = ..()
explanation_text = "Ensure there are at least [target_amount] pets on the station by the end of the shift. Interpret this as you wish."
/datum/objective/crew/petsplosion/check_completion()
var/petcount = target_amount
for(var/mob/living/simple_animal/pet/P in GLOB.mob_list)
if(!(P.stat == DEAD))
if(P.z == ZLEVEL_STATION_PRIMARY || SSshuttle.emergency.shuttle_areas[get_area(P)])
petcount--
for(var/mob/living/carbon/human/H in GLOB.mob_list)
if(!(H.stat == DEAD))
if(H.z == ZLEVEL_STATION_PRIMARY || SSshuttle.emergency.shuttle_areas[get_area(H)])
if(istype(H.wear_neck, /obj/item/clothing/neck/petcollar))
petcount--
if(petcount <= 0)
return TRUE
else
return FALSE
/datum/objective/crew/points //ported from old hippie
explanation_text = "Make sure the station has at least (Something broke, report this to the development discussion channel of citadels discord) supply points at the end of the shift."
jobs = "quartermaster,cargotechnician"
/datum/objective/crew/points/New()
. = ..()
target_amount = rand(25000,100000)
update_explanation_text()
/datum/objective/crew/points/update_explanation_text()
. = ..()
explanation_text = "Make sure the station has at least [target_amount] supply points at the end of the shift."
/datum/objective/crew/points/check_completion()
if(SSshuttle.points >= target_amount)
return TRUE
else
return FALSE
/datum/objective/crew/bubblegum
explanation_text = "Ensure Bubblegum is dead at the end of the shift."
jobs = "shaftminer"
/datum/objective/crew/bubblegum/check_completion()
for(var/mob/living/simple_animal/hostile/megafauna/bubblegum/B in GLOB.mob_list)
if(!(B.stat == DEAD))
return FALSE
return TRUE
/datum/objective/crew/fatstacks //ported from old hippie
explanation_text = "Have at least (something broke, report this to the development discussion channel of citadels discord) mining points on your ID at the end of the shift."
jobs = "shaftminer"
/datum/objective/crew/fatstacks/New()
. = ..()
target_amount = rand(15000,50000)
update_explanation_text()
/datum/objective/crew/fatstacks/update_explanation_text()
. = ..()
explanation_text = "Have at least [target_amount] mining points on your ID at the end of the shift."
/datum/objective/crew/fatstacks/check_completion()
if(owner && owner.current)
var/mob/living/carbon/human/H = owner.current
var/obj/item/card/id/theID = H.get_idcard()
if(istype(theID))
if(theID.mining_points >= target_amount)
return TRUE
return FALSE

View File

@@ -0,0 +1,267 @@
/* CIVILIAN OBJECTIVES */
/datum/objective/crew/druglordbot //ported from old Hippie with adjustments
var/targetchem = "none"
var/datum/reagent/chempath
explanation_text = "Have at least (somethin broke here) harvested plants containing (report this on the development discussion channel of citadel's discord) when the shift ends."
jobs = "botanist"
/datum/objective/crew/druglordbot/New()
. = ..()
target_amount = rand(3,20)
var/blacklist = list(/datum/reagent/drug, /datum/reagent/drug/menthol, /datum/reagent/medicine, /datum/reagent/medicine/adminordrazine, /datum/reagent/medicine/adminordrazine/nanites, /datum/reagent/medicine/mine_salve, /datum/reagent/medicine/syndicate_nanites, /datum/reagent/medicine/strange_reagent, /datum/reagent/medicine/miningnanites, /datum/reagent/medicine/changelingAdrenaline, /datum/reagent/medicine/changelingAdrenaline2)
var/drugs = typesof(/datum/reagent/drug) - blacklist
var/meds = typesof(/datum/reagent/medicine) - blacklist
var/chemlist = drugs + meds
chempath = pick(chemlist)
targetchem = initial(chempath.id)
update_explanation_text()
/datum/objective/crew/druglordbot/update_explanation_text()
. = ..()
explanation_text = "Have at least [target_amount] harvested plants containing [initial(chempath.name)] when the shift ends."
/datum/objective/crew/druglordbot/check_completion()
var/pillcount = target_amount
if(owner.current)
if(owner.current.contents)
for(var/obj/item/reagent_containers/food/snacks/grown/P in owner.current.get_contents())
if(P.reagents.has_reagent(targetchem))
pillcount--
if(pillcount <= 0)
return TRUE
else
return FALSE
/datum/objective/crew/foodhoard
var/datum/crafting_recipe/food/targetfood
var/obj/item/reagent_containers/food/foodpath
explanation_text = "Personally deliver at least (yo something broke) (report this to the developer discussion channel in citadels discord)s to Centcom."
jobs = "cook"
/datum/objective/crew/foodhoard/New()
. = ..()
target_amount = rand(2,10)
var/blacklist = list(/datum/crafting_recipe/food, /datum/crafting_recipe/food/cak)
var/possiblefoods = typesof(/datum/crafting_recipe/food) - blacklist
targetfood = pick(possiblefoods)
foodpath = initial(targetfood.result)
update_explanation_text()
/datum/objective/crew/foodhoard/update_explanation_text()
. = ..()
explanation_text = "Personally deliver at least [target_amount] [initial(foodpath.name)]s to Centcom."
/datum/objective/crew/foodhoard/check_completion()
if(owner.current && owner.current.check_contents_for(foodpath) && SSshuttle.emergency.shuttle_areas[get_area(owner.current)])
return TRUE
else
return FALSE
/datum/objective/crew/responsibility
explanation_text = "Make sure nobody dies with alcohol poisoning."
jobs = "bartender"
/datum/objective/crew/responsibility/check_completion()
for(var/mob/living/carbon/human/H in GLOB.mob_list)
if(H.stat == DEAD && H.drunkenness >= 80)
if(H.z == ZLEVEL_STATION_PRIMARY || SSshuttle.emergency.shuttle_areas[get_area(H)])
return FALSE
return TRUE
/datum/objective/crew/clean //ported from old Hippie
var/list/areas = list()
var/hardmode = FALSE
explanation_text = "Ensure sure that (Yo, something broke. Yell about this in citadels devlopmeent discussion channel.) remain spotless at the end of the shift."
jobs = "janitor"
/datum/objective/crew/clean/New()
. = ..()
if(prob(1))
hardmode = TRUE
var/list/blacklistnormal = list(typesof(/area/space) - typesof(/area/lavaland) - typesof(/area/mine) - typesof(/area/ai_monitored/turret_protected) - typesof(/area/tcommsat))
var/list/blacklisthard = list(typesof(/area/lavaland) - typesof(/area/mine))
var/list/possibleareas = list()
if(hardmode)
possibleareas = GLOB.teleportlocs - /area - blacklisthard
else
possibleareas = GLOB.teleportlocs - /area - blacklistnormal
for(var/i in 1 to rand(1,6))
areas |= pick_n_take(possibleareas)
update_explanation_text()
/datum/objective/crew/clean/update_explanation_text()
. = ..()
explanation_text = "Ensure that the"
for(var/i in 1 to areas.len)
var/area/A = areas[i]
explanation_text += " [A]"
if(i != areas.len && areas.len >= 3)
explanation_text += ","
if(i == areas.len - 1)
explanation_text += "and"
explanation_text += " [(areas.len ==1) ? "is completely" : "are [(areas.len == 2) ? "completely" : "all"]"] clean at the end of the shift."
if(hardmode)
explanation_text += " Chop-chop."
/datum/objective/crew/clean/check_completion()
for(var/area/A in areas)
for(var/obj/effect/decal/cleanable/C in area_contents(A))
return FALSE
return TRUE
/datum/objective/crew/slipster //ported from old Hippie with adjustments
explanation_text = "Slip at least (Yell on citadel's development discussion channel if you see this) different people with your PDA, and have it on you at the end of the shift."
jobs = "clown"
/datum/objective/crew/slipster/New()
. = ..()
target_amount = rand(5, 20)
update_explanation_text()
/datum/objective/crew/slipster/update_explanation_text()
. = ..()
explanation_text = "Slip at least [target_amount] different people with your PDA, and have it on you at the end of the shift."
/datum/objective/crew/slipster/check_completion()
var/list/uniqueslips = list()
if(owner && owner.current)
for(var/obj/item/device/pda/clown/PDA in owner.current.get_contents())
for(var/mob/living/carbon/human/H in PDA.slipvictims)
uniqueslips |= H
if(uniqueslips.len >= target_amount)
return TRUE
else
return FALSE
/datum/objective/crew/vow //ported from old Hippie
explanation_text = "Never break your vow of silence."
jobs = "mime"
/datum/objective/crew/vow/check_completion()
if(owner && owner.current)
var/list/say_log = owner.current.logging[INDIVIDUAL_SAY_LOG]
if(say_log.len > 0)
return FALSE
return TRUE
/datum/objective/crew/nullrod
explanation_text = "Don't lose your holy rod."
jobs = "chaplain"
/datum/objective/crew/nullrod/check_completion()
if(owner && owner.current)
if(owner.current.check_contents_for(typesof(/obj/item/nullrod)))
return TRUE
if(owner.current.getorgan(/obj/item/organ/genital/penis))
return TRUE
return FALSE
/datum/objective/crew/reporter //ported from old hippie
var/charcount = 100
explanation_text = "Publish at least (Yo something broke) articles containing at least (Report this to Citadels development channel) characters."
jobs = "curator"
/datum/objective/crew/reporter/New()
. = ..()
target_amount = rand(2,10)
charcount = rand(20,250)
update_explanation_text()
/datum/objective/crew/reporter/update_explanation_text()
. = ..()
explanation_text = "Publish at least [target_amount] articles containing at least [charcount] characters."
/datum/objective/crew/reporter/check_completion()
if(owner && owner.current)
var/ownername = "[ckey(owner.current.real_name)][ckey(owner.assigned_role)]"
for(var/datum/newscaster/feed_channel/chan in GLOB.news_network.network_channels)
for(var/datum/newscaster/feed_message/msg in chan.messages)
if(ckey(msg.returnAuthor()) == ckey(ownername))
if(length(msg.returnBody()) >= charcount)
target_amount--
if(target_amount <= 0)
return TRUE
else
return FALSE
/datum/objective/crew/departmentclothes
var/obj/item/clothing/under/rank/targetuniform
explanation_text = "Be wearing a (Yo, this objective broke. report this to citadels discord via the development channel) at the end of the shift."
jobs = "assistant"
/datum/objective/crew/departmentclothes/New()
. = ..()
var/list/blacklist = list(/obj/item/clothing/under/rank, /obj/item/clothing/under/rank/miner, /obj/item/clothing/under/rank/medical/blue, /obj/item/clothing/under/rank/medical/green, /obj/item/clothing/under/rank/medical/purple, /obj/item/clothing/under/rank/security/grey, /obj/item/clothing/under/rank/warden/grey, /obj/item/clothing/under/rank/head_of_security/grey, /obj/item/clothing/under/rank/mailman, /obj/item/clothing/under/rank/psyche, /obj/item/clothing/under/rank/clown/sexy, /obj/item/clothing/under/rank/centcom_officer, /obj/item/clothing/under/rank/centcom_commander, /obj/item/clothing/under/rank/security/navyblue/russian, /obj/item/clothing/under/rank/security/blueshirt)
var/list/validclothes = typesof(/obj/item/clothing/under/rank) - blacklist
targetuniform = pick(validclothes)
update_explanation_text()
/datum/objective/crew/departmentclothes/update_explanation_text()
. = ..()
explanation_text = "Be wearing a [initial(targetuniform.name)] at the end of the shift."
/datum/objective/crew/departmentclothes/check_completion()
if(owner && owner.current)
var/mob/living/carbon/human/H = owner.current
if(istype(H.w_uniform, targetuniform))
return TRUE
return FALSE
/datum/objective/crew/pwrgame //ported from Goon with adjustments
var/obj/item/clothing/targettidegarb
explanation_text = "Get your grubby hands on a (Dear god something broke. Report this to Citadel's development dicussion channel)."
jobs = "assistant"
/datum/objective/crew/pwrgame/New()
. = ..()
var/list/muhvalids = list(/obj/item/clothing/mask/gas, /obj/item/clothing/head/welding, /obj/item/clothing/head/ushanka, /obj/item/clothing/gloves/color/yellow, /obj/item/clothing/mask/gas/owl_mask, /obj/item/clothing/suit/space)
targettidegarb = pick(muhvalids)
update_explanation_text()
/datum/objective/crew/pwrgame/update_explanation_text()
. = ..()
explanation_text = "Get your grubby hands on a [initial(targettidegarb.name)]."
/* DM is not a sane language in any way, shape, or form. If anyone wants to try to get this bit functioning proper, I hold no responsibility for broken keyboards.
if(owner && owner.current)
var/mob/living/carbon/human/H = owner.current
if(H && H.dna && H.dna.species && H.dna.species.id)
explanation_text = "Get your "
if(H.dna.species.id == "avian")
explanation_text += "scratchy claws "
else if(H.dna.species.id == "mammal")
explanation_text += "dirty paws "
else if(H.dna.species.id == "aquatic")
explanation_text += "fishy hands "
else if(H.dna.species.id == "xeno")
explanation_text += "weird claws "
else if(H.dna.species.id == "guilmon")
explanation_text += "digital claws "
else if(H.dna.species.id == "lizard")
explanation_text += "slimy claws "
else if(H.dna.species.id == "datashark")
explanation_text += "glitchy hands "
else if(H.dna.species.id == "insect")
explanation_text += "gross grabbers "
else
explanation_text += "grubby hands "
explanation_text += "on a space suit." replace this if you're making this monstrosity work */
/datum/objective/crew/pwrgame/check_completion()
if(owner.current && owner.current.check_contents_for(typesof(targettidegarb)))
return TRUE
else
return FALSE
/datum/objective/crew/promotion //ported from Goon
explanation_text = "Have a non-assistant ID registered to you at the end of the shift."
jobs = "assistant"
/datum/objective/crew/promotion/check_completion()
if(owner && owner.current)
var/mob/living/carbon/human/H = owner.current
var/obj/item/card/id/theID = H.get_idcard()
if(istype(theID))
if(!(H.get_assignment() == "Assistant") && !(H.get_assignment() == "No id") && !(H.get_assignment() == "No job"))
return TRUE
return FALSE

View File

@@ -0,0 +1,33 @@
/* COMMAND OBJECTIVES */
/datum/objective/crew/caphat //Ported from Goon
explanation_text = "Don't lose your hat."
jobs = "captain"
/datum/objective/crew/caphat/check_completion()
if(owner.current && owner.current.check_contents_for(/obj/item/clothing/head/caphat))
return TRUE
else
return FALSE
/datum/objective/crew/datfukkendisk //Ported from old Hippie
explanation_text = "Defend the nuclear authentication disk at all costs, and be the one to personally deliver it to Centcom."
jobs = "captain" //give this to other heads at your own risk.
/datum/objective/crew/datfukkendisk/check_completion()
if(owner.current && owner.current.check_contents_for(/obj/item/disk/nuclear) && SSshuttle.emergency.shuttle_areas[get_area(owner.current)])
return TRUE
else
return FALSE
/datum/objective/crew/ian //Ported from old Hippie
explanation_text = "Defend Ian at all costs, and ensure he gets delivered to Centcom at the end of the shift."
jobs = "headofpersonnel"
/datum/objective/crew/ian/check_completion()
if(owner.current)
for(var/mob/living/simple_animal/pet/dog/corgi/Ian/goodboy in GLOB.mob_list)
if(goodboy.stat != DEAD && SSshuttle.emergency.shuttle_areas[get_area(goodboy)])
return TRUE
return FALSE
return FALSE

View File

@@ -0,0 +1,34 @@
/* ENGINEERING OBJECTIVES */
/datum/objective/crew/integrity //ported from old Hippie
explanation_text = "Ensure the station's integrity rating is at least (Yo something broke, yell on the development discussion channel of citadels discord about this)% when the shift ends."
jobs = "chiefengineer,stationengineer"
/datum/objective/crew/integrity/New()
. = ..()
target_amount = rand(60,95)
update_explanation_text()
/datum/objective/crew/integrity/update_explanation_text()
. = ..()
explanation_text = "Ensure the station's integrity rating is at least [target_amount]% when the shift ends."
/datum/objective/crew/integrity/check_completion()
var/datum/station_state/end_state = new /datum/station_state()
end_state.count()
var/station_integrity = min(PERCENT(GLOB.start_state.score(end_state)), 100)
if(!SSticker.mode.station_was_nuked && station_integrity >= target_amount)
return TRUE
else
return FALSE
/datum/objective/crew/poly
explanation_text = "Make sure Poly keeps his headset, and stays alive until the end of the shift."
jobs = "chiefengineer"
/datum/objective/crew/poly/check_completion()
for(var/mob/living/simple_animal/parrot/Poly/dumbbird in GLOB.mob_list)
if(!(dumbbird.stat == DEAD) && dumbbird.ears)
if(istype(dumbbird.ears, /obj/item/device/radio/headset))
return TRUE
return FALSE

View File

@@ -0,0 +1,86 @@
/* MEDICAL OBJECTIVES */
/datum/objective/crew/morgue //Ported from old Hippie
explanation_text = "Ensure there are no corpses on the station outside of the morgue when the shift ends."
jobs = "chiefmedicalofficer,geneticist,medicaldoctor"
/datum/objective/crew/morgue/check_completion()
for(var/mob/living/carbon/human/H in GLOB.mob_list)
if(H.stat == DEAD && H.z == ZLEVEL_STATION_PRIMARY)
if(get_area(H) != /area/medical/morgue)
return FALSE
return TRUE
/datum/objective/crew/chems //Ported from old Hippie
var/targetchem = "none"
var/datum/reagent/chempath
explanation_text = "Have (yell about this in the development discussion channel of citadel's discord, something broke) in your bloodstream when the shift ends."
jobs = "chiefmedicalofficer,chemist"
/datum/objective/crew/chems/New()
. = ..()
var/blacklist = list(/datum/reagent/drug, /datum/reagent/drug/nicotine, /datum/reagent/drug/menthol, /datum/reagent/medicine, /datum/reagent/medicine/adminordrazine, /datum/reagent/medicine/adminordrazine/nanites, /datum/reagent/medicine/mine_salve, /datum/reagent/medicine/omnizine, /datum/reagent/medicine/syndicate_nanites, /datum/reagent/medicine/earthsblood, /datum/reagent/medicine/strange_reagent, /datum/reagent/medicine/miningnanites, /datum/reagent/medicine/changelingAdrenaline, /datum/reagent/medicine/changelingAdrenaline2)
var/drugs = typesof(/datum/reagent/drug) - blacklist
var/meds = typesof(/datum/reagent/medicine) - blacklist
var/chemlist = drugs + meds
chempath = pick(chemlist)
targetchem = initial(chempath.id)
update_explanation_text()
/datum/objective/crew/chems/update_explanation_text()
. = ..()
explanation_text = "Have [initial(chempath.name)] in your bloodstream when the shift ends."
/datum/objective/crew/chems/check_completion()
if(owner.current)
if(!owner.current.stat == DEAD && owner.current.reagents)
if(owner.current.reagents.has_reagent(targetchem))
return TRUE
else
return FALSE
/datum/objective/crew/druglordchem //ported from old Hippie with adjustments
var/targetchem = "none"
var/datum/reagent/chempath
var/chemamount = 0
explanation_text = "Have at least (somethin broke here) pills containing at least (like really broke) units of(report this on the development discussion channel of citadel's discord) when the shift ends."
jobs = "chemist"
/datum/objective/crew/druglordchem/New()
. = ..()
target_amount = rand(5,50)
chemamount = rand(1,20)
var/blacklist = list(/datum/reagent/drug, /datum/reagent/drug/nicotine, /datum/reagent/drug/menthol)
var/drugs = typesof(/datum/reagent/drug) - blacklist
var/chemlist = drugs
chempath = pick(chemlist)
targetchem = initial(chempath.id)
update_explanation_text()
/datum/objective/crew/druglordchem/update_explanation_text()
. = ..()
explanation_text = "Have at least [target_amount] pills containing at least [chemamount] units of [initial(chempath.name)] when the shift ends."
/datum/objective/crew/druglordchem/check_completion()
var/pillcount = target_amount
if(owner.current)
if(owner.current.contents)
for(var/obj/item/reagent_containers/pill/P in owner.current.get_contents())
if(P.reagents.has_reagent(targetchem, chemamount))
pillcount--
if(pillcount <= 0)
return TRUE
else
return FALSE
/datum/objective/crew/noinfections
explanation_text = "Ensure no living crew members are infected with harmful viruses at the end of the shift"
jobs = "virologist"
/datum/objective/crew/noinfections/check_completion()
for(var/mob/living/carbon/human/H in GLOB.mob_list)
if(!H.stat == DEAD)
if(H.z == ZLEVEL_STATION_PRIMARY || SSshuttle.emergency.shuttle_areas[get_area(H)])
if(H.check_virus() == 2)
return FALSE
return TRUE

View File

@@ -0,0 +1,45 @@
/* SCIENCE OBJECTIVES */
/datum/objective/crew/cyborgs //Ported from old Hippie
explanation_text = "Ensure there are at least (Yo something broke here, yell on citadel's development discussion channel about this) functioning cyborgs when the shift ends."
jobs = "researchdirector,roboticist"
/datum/objective/crew/cyborgs/New()
. = ..()
target_amount = rand(3,10)
update_explanation_text()
/datum/objective/crew/cyborgs/update_explanation_text()
. = ..()
explanation_text = "Ensure there are at least [target_amount] functioning cyborgs when the shift ends."
/datum/objective/crew/cyborgs/check_completion()
var/borgcount = target_amount
for(var/mob/living/silicon/robot/R in GLOB.living_mob_list)
if(!(R.stat == DEAD))
borgcount--
if(borgcount <= 0)
return TRUE
else
return FALSE
/datum/objective/crew/research //inspired by old hippie's research level objective. should hopefully be compatible with techwebs when that gets finished. hopefully. should be easy to update in the event that it is incompatible with techwebs.
var/datum/design/targetdesign
explanation_text = "Make sure the research required to produce a (something broke, yell on citadel's development discussion channel about this) is available on the R&D server by the end of the shift."
jobs = "researchdirector,scientist"
/datum/objective/crew/research/New()
. = ..()
targetdesign = pick(subtypesof(/datum/design))
update_explanation_text()
/datum/objective/crew/research/update_explanation_text()
. = ..()
explanation_text = "Make sure the research required to produce a [initial(targetdesign.name)] is available on the R&D server by the end of the shift."
/datum/objective/crew/research/check_completion()
for(var/obj/machinery/r_n_d/server/S in GLOB.machines)
if(S && S.files && S.files.known_designs)
if(targetdesign in S.files.known_designs)
return TRUE
return FALSE

View File

@@ -0,0 +1,33 @@
/* SECURITY OBJECTIVES */
/datum/objective/crew/enjoyyourstay
explanation_text = "Welcome to Space Station 13. Enjoy your stay."
jobs = "headofsecurity,securityofficer,warden,detective"
var/list/edglines = list("Welcome to Space Station 13. Enjoy your stay.", "You signed up for this.", "Abandon hope.", "The tide's gonna stop eventually.", "Hey, someone's gotta do it.", "No, you can't resign.", "Security is a mission, not an intermission.")
/datum/objective/crew/enjoyyourstay/New()
. = ..()
update_explanation_text()
/datum/objective/crew/enjoyyourstay/update_explanation_text()
. = ..()
explanation_text = pick(edglines)
/datum/objective/crew/enjoyyourstay/check_completion()
explanation_text = "Enforce Space Law to the best of your ability."
if(owner && owner.current)
if(owner.current.stat != DEAD)
return TRUE
return FALSE
/datum/objective/crew/justicecrew
explanation_text = "Ensure there are no innocent crew members in the brig when the shift ends."
jobs = "lawyer"
/datum/objective/crew/justicecrew/check_completion()
if(owner && owner.current)
for(var/datum/mind/M in SSticker.minds)
if(M.current && isliving(M.current))
if(!M.special_role && !(M.assigned_role == "Security Officer") && !(M.assigned_role == "Detective") && !(M.assigned_role == "Head of Security") && !(M.assigned_role == "Lawyer") && !(M.assigned_role == "Warden") && get_area(M.current) != typesof(/area/security))
return FALSE
return TRUE

View File

@@ -256,6 +256,10 @@ CONFIG_DEF(number/bombcap)
value = 14
min_val = 4
CONFIG_DEF(flag/allow_crew_objectives)
CONFIG_DEF(flag/allow_miscreants)
CONFIG_DEF(flag/allow_extended_miscreants)
/datum/config_entry/number/bombcap/ValidateAndSet(str_val)
. = ..()
if(.)

View File

@@ -88,3 +88,11 @@ SUBSYSTEM_DEF(lighting)
/datum/controller/subsystem/lighting/Recover()
initialized = SSlighting.initialized
..()
/datum/controller/subsystem/lighting/proc/initialize_lighting_objects(list/turfs)
for(var/turf/T in turfs)
if(!IS_DYNAMIC_LIGHTING(T))
continue
new/atom/movable/lighting_object(T)
CHECK_TICK

View File

@@ -259,6 +259,13 @@ SUBSYSTEM_DEF(ticker)
if(S.name != "AI")
qdel(S)
//assign crew objectives and generate miscreants
if(CONFIG_GET(flag/allow_extended_miscreants) && GLOB.master_mode == "extended")
GLOB.miscreants_allowed = TRUE
if(CONFIG_GET(flag/allow_miscreants) && GLOB.master_mode != "extended")
GLOB.miscreants_allowed = TRUE
generate_crew_objectives()
var/list/adm = get_admin_counts()
var/list/allmins = adm["present"]
send2irc("Server", "Round [GLOB.round_id ? "#[GLOB.round_id]:" : "of"] [hide_mode ? "secret":"[mode.name]"] has started[allmins.len ? ".":" with no active admins online!"]")
@@ -333,6 +340,8 @@ SUBSYSTEM_DEF(ticker)
var/num_survivors = 0
var/num_escapees = 0
var/num_shuttle_escapees = 0
var/list/successfulCrew = list()
var/list/miscreants = list()
to_chat(world, "<BR><BR><BR><FONT size=3><B>The round has ended.</B></FONT>")
if(LAZYLEN(GLOB.round_end_notifiees))
@@ -459,6 +468,37 @@ SUBSYSTEM_DEF(ticker)
CHECK_TICK
for(var/datum/mind/crewMind in minds)
if(!crewMind.current || !crewMind.objectives.len)
continue
for(var/datum/objective/miscreant/MO in crewMind.objectives)
miscreants += "<B>[crewMind.current.real_name]</B> (Played by: <B>[crewMind.key]</B>). <B>Objective</B>: [MO.explanation_text]"
for(var/datum/objective/crew/CO in crewMind.objectives)
if(CO.check_completion())
to_chat(crewMind.current, "<br><B>Your objective</B>: [CO.explanation_text] <font color='green'><B>Success!</B></font>")
successfulCrew += "<B>[crewMind.current.real_name]</B> (Played by: <B>[crewMind.key]</B>). <B>Objective</B>: [CO.explanation_text]"
else
to_chat(crewMind.current, "<br><B>Your objective</B>: [CO.explanation_text] <font color='red'><B>Failed.</B></font>")
if (successfulCrew.len)
var/completedObjectives = "<B>The following crew members completed their Crew Objectives:</B><BR>"
for(var/i in successfulCrew)
completedObjectives += "[i]<BR>"
to_chat(world, "[completedObjectives]<BR>")
else
if(CONFIG_GET(flag/allow_crew_objectives))
to_chat(world, "<B>Nobody completed their Crew Objectives!</B><BR>")
CHECK_TICK
if (miscreants.len)
var/miscreantObjectives = "<B>The following crew members were miscreants:</B><BR>"
for(var/i in miscreants)
miscreantObjectives += "[i]<BR>"
to_chat(world, "[miscreantObjectives]<BR>")
CHECK_TICK
mode.declare_station_goal_completion()
CHECK_TICK

View File

@@ -245,13 +245,21 @@ GLOBAL_LIST_INIT(slot2type, list("head" = /obj/item/clothing/head/changeling, "w
if(changeling.objectives.len)
var/count = 1
for(var/datum/objective/objective in changeling.objectives)
if(objective.check_completion())
text += "<br><b>Objective #[count]</b>: [objective.explanation_text] <font color='green'><b>Success!</b></font>"
SSblackbox.add_details("changeling_objective","[objective.type]|SUCCESS")
if(istype(objective, /datum/objective/crew))
if(objective.check_completion())
text += "<br><b>Objective #[count]</b>: [objective.explanation_text] <font color='green'><b>Success!</b></font> <font color='grey'>(Optional)</font>"
SSblackbox.add_details("changeling_objective","[objective.type]|SUCCESS")
else
text += "<br><b>Objective #[count]</b>: [objective.explanation_text] <span class='danger'>Fail.</span> <font color='grey'>(Optional)</font>"
SSblackbox.add_details("changeling_objective","[objective.type]|FAIL")
else
text += "<br><b>Objective #[count]</b>: [objective.explanation_text] <span class='danger'>Fail.</span>"
SSblackbox.add_details("changeling_objective","[objective.type]|FAIL")
changelingwin = 0
if(objective.check_completion())
text += "<br><b>Objective #[count]</b>: [objective.explanation_text] <font color='green'><b>Success!</b></font>"
SSblackbox.add_details("changeling_objective","[objective.type]|SUCCESS")
else
text += "<br><b>Objective #[count]</b>: [objective.explanation_text] <span class='danger'>Fail.</span>"
SSblackbox.add_details("changeling_objective","[objective.type]|FAIL")
changelingwin = 0
count++
if(changelingwin)
@@ -520,4 +528,3 @@ GLOBAL_LIST_INIT(slot2type, list("head" = /obj/item/clothing/head/changeling, "w
var/datum/atom_hud/antag/hud = GLOB.huds[ANTAG_HUD_CHANGELING]
hud.leave_hud(changling_mind.current)
set_antag_hud(changling_mind.current, null)

View File

@@ -111,13 +111,21 @@
if(traitor.objectives.len)//If the traitor had no objectives, don't need to process this.
var/count = 1
for(var/datum/objective/objective in traitor.objectives)
if(objective.check_completion())
objectives += "<br><B>Objective #[count]</B>: [objective.explanation_text] <font color='green'><B>Success!</B></font>"
SSblackbox.add_details("traitor_objective","[objective.type]|SUCCESS")
if(istype(objective, /datum/objective/crew))
if(objective.check_completion())
objectives += "<br><B>Objective #[count]</B>: [objective.explanation_text] <font color='green'><B>Success!</B></font> <font color='grey'>(Optional)</font>"
SSblackbox.add_details("traitor_objective","[objective.type]|SUCCESS")
else
objectives += "<br><B>Objective #[count]</B>: [objective.explanation_text] <font color='red'>Fail.</font> <font color='grey'>(Optional)</font>"
SSblackbox.add_details("traitor_objective","[objective.type]|FAIL")
else
objectives += "<br><B>Objective #[count]</B>: [objective.explanation_text] <font color='red'>Fail.</font>"
SSblackbox.add_details("traitor_objective","[objective.type]|FAIL")
traitorwin = 0
if(objective.check_completion())
objectives += "<br><B>Objective #[count]</B>: [objective.explanation_text] <font color='green'><B>Success!</B></font>"
SSblackbox.add_details("traitor_objective","[objective.type]|SUCCESS")
else
objectives += "<br><B>Objective #[count]</B>: [objective.explanation_text] <font color='red'>Fail.</font>"
SSblackbox.add_details("traitor_objective","[objective.type]|FAIL")
traitorwin = 0
count++
if(uplink_true)

View File

@@ -212,13 +212,21 @@
var/count = 1
var/wizardwin = 1
for(var/datum/objective/objective in wizard.objectives)
if(objective.check_completion())
text += "<br><B>Objective #[count]</B>: [objective.explanation_text] <font color='green'><B>Success!</B></font>"
SSblackbox.add_details("wizard_objective","[objective.type]|SUCCESS")
if(istype(objective, /datum/objective/crew))
if(objective.check_completion())
text += "<br><B>Objective #[count]</B>: [objective.explanation_text] <font color='green'><B>Success!</B></font> <font color='grey'>(Optional)</font>"
SSblackbox.add_details("wizard_objective","[objective.type]|SUCCESS")
else
text += "<br><B>Objective #[count]</B>: [objective.explanation_text] <font color='red'>Fail.</font> <font color='grey'>(Optional)</font>"
SSblackbox.add_details("wizard_objective","[objective.type]|FAIL")
else
text += "<br><B>Objective #[count]</B>: [objective.explanation_text] <font color='red'>Fail.</font>"
SSblackbox.add_details("wizard_objective","[objective.type]|FAIL")
wizardwin = 0
if(objective.check_completion())
text += "<br><B>Objective #[count]</B>: [objective.explanation_text] <font color='green'><B>Success!</B></font>"
SSblackbox.add_details("wizard_objective","[objective.type]|SUCCESS")
else
text += "<br><B>Objective #[count]</B>: [objective.explanation_text] <font color='red'>Fail.</font>"
SSblackbox.add_details("wizard_objective","[objective.type]|FAIL")
wizardwin = 0
count++
if(wizard.current && wizard.current.stat!=2 && wizardwin)

View File

@@ -19,6 +19,7 @@
var/group = TURF_DECAL_PAINT
icon = 'icons/turf/decals.dmi'
icon_state = "warningline"
layer = TURF_DECAL_LAYER
anchored = TRUE
//in case we need some special decals

View File

@@ -6,6 +6,7 @@
icon_state = "pda-clown"
desc = "A portable microcomputer by Thinktronic Systems, LTD. The surface is coated with polytetrafluoroethylene and banana drippings."
ttone = "honk"
var/slipvictims = list()
/obj/item/device/pda/clown/Initialize()
. = ..()
@@ -18,6 +19,7 @@
return
var/mob/living/carbon/human/M = S.slip_victim
if (istype(M) && (M.real_name != src.owner))
slipvictims |= M
var/obj/item/cartridge/virus/clown/cart = cartridge
if(istype(cart) && cart.charges < 5)
cart.charges++

View File

@@ -274,7 +274,7 @@ GLOBAL_LIST_INIT(runed_metal_recipes, list ( \
desc = "Sheets of cold metal with shifting inscriptions writ upon them."
singular_name = "runed metal sheet"
icon_state = "sheet-runed"
icon = 'icons/obj/items_and_weapons.dmi'
icon = 'icons/obj/stack_objects.dmi'
sheettype = "runed"
merge_type = /obj/item/stack/sheet/runed_metal
novariants = TRUE
@@ -326,7 +326,7 @@ GLOBAL_LIST_INIT(brass_recipes, list ( \
desc = "Sheets made out of brass."
singular_name = "brass sheet"
icon_state = "sheet-brass"
icon = 'icons/obj/items_and_weapons.dmi'
icon = 'icons/obj/stack_objects.dmi'
resistance_flags = FIRE_PROOF | ACID_PROOF
throwforce = 10
max_amount = 50

View File

@@ -338,6 +338,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
if(!silent)
SSblackbox.inc("ahelp_resolve")
var/msg = "Ticket [TicketHref("#[id]")] resolved by [key_name]"
to_chat(initiator, "<span class='adminhelp'>Your ticket has been resolved by an admin. The Adminhelp verb will be returned to you shortly.</span>")
message_admins(msg)
log_admin_private(msg)

View File

@@ -136,40 +136,18 @@ GLOBAL_VAR_INIT(sc_safecode5, "[rand(0,9)]")
/*
* Modified Nar-Sie
*/
/obj/singularity/narsie/sc_Narsie
/obj/singularity/narsie/mini
desc = "Your body becomes weak and your feel your mind slipping away as you try to comprehend what you know can't be possible."
move_self = 0 //Contianed narsie does not move!
grav_pull = 0 //Contained narsie does not pull stuff in!
var/uneatable = list(/turf/open/space, /obj/effect/overlay, /mob/living/simple_animal/hostile/construct)
//Override this to prevent no adminlog runtimes and admin warnings about a singularity without containment
/obj/singularity/narsie/sc_Narsie/admin_investigate_setup()
/obj/singularity/narsie/mini/admin_investigate_setup()
return
/obj/singularity/narsie/sc_Narsie/process()
/obj/singularity/narsie/mini/process()
eat()
if(prob(25))
mezzer()
/obj/singularity/narsie/sc_Narsie/consume(atom/A)
if(is_type_in_list(A, uneatable))
return 0
if(isliving(A))
var/mob/living/L = A
L.gib()
else if(istype(A, /obj/))
var/obj/O = A
O.ex_act(EXPLODE_DEVASTATE)
if(O) qdel(O)
else if(isturf(A))
var/turf/T = A
if(T.intact)
for(var/obj/O in T.contents)
if(O.level != 1)
continue
if(O.invisibility == INVISIBILITY_MAXIMUM)
src.consume(O)
T.ChangeTurf(/turf/open/space)
return
/obj/singularity/narsie/sc_Narsie/ex_act()
/obj/singularity/narsie/mini/ex_act()
return

View File

@@ -53,6 +53,7 @@
smooth_zlevel(world.maxz)
repopulate_sorted_areas()
SSlighting.initialize_lighting_objects(block(locate(bounds[MAP_MINX], bounds[MAP_MINY], bounds[MAP_MINZ]),locate(bounds[MAP_MAXX], bounds[MAP_MAXY], bounds[MAP_MAXZ])))
//initialize things that are normally initialized after map load
initTemplateBounds(bounds)
log_game("Z-level [name] loaded at at [x],[y],[world.maxz]")

View File

@@ -375,6 +375,11 @@
if(GLOB.highlander)
to_chat(humanc, "<span class='userdanger'><i>THERE CAN BE ONLY ONE!!!</i></span>")
humanc.make_scottish()
if(prob(2) && !issilicon(humanc) && !jobban_isbanned(humanc.mind, "Syndicate") && GLOB.miscreants_allowed)
SSticker.generate_miscreant_objectives(humanc.mind)
else
if(CONFIG_GET(flag/allow_crew_objectives))
SSticker.generate_individual_objectives(humanc.mind)
GLOB.joined_player_list += character.ckey
GLOB.latejoiners += character

View File

@@ -281,7 +281,7 @@
if(getBrainLoss() >= 60)
msg += "[t_He] [t_has] a stupid expression on [t_his] face.\n"
if(InCritical())
msg += "[t_He] is barely concious.\n"
msg += "[t_He] is barely conscious.\n"
if(getorgan(/obj/item/organ/brain))
if(istype(src, /mob/living/carbon/human/interactive))
var/mob/living/carbon/human/interactive/auto = src

View File

@@ -635,6 +635,7 @@ Difficulty: Very Hard
environment_smash = ENVIRONMENT_SMASH_NONE
AIStatus = AI_OFF
stop_automated_movement = 1
gold_core_spawnable = TRUE
var/heal_power = 5
/mob/living/simple_animal/hostile/lightgeist/Initialize()

View File

@@ -27,6 +27,7 @@
idle_vision_range = 5
mob_size = MOB_SIZE_SMALL
environment_smash = ENVIRONMENT_SMASH_NONE
gold_core_spawnable = TRUE
var/wumbo = 0
var/inflate_cooldown = 0
loot = list(/obj/item/asteroid/fugu_gland{layer = ABOVE_MOB_LAYER})

View File

@@ -324,7 +324,7 @@ won't update every console in existence) but it's more of a hassle to do. Also,
if(linked_lathe) //Also sends salvaged materials to a linked protolathe, if any.
for(var/material in linked_destroy.loaded_item.materials)
linked_materials.insert_amount(min((linked_materials.max_amount - linked_materials.total_amount), (linked_destroy.loaded_item.materials[material]*(linked_destroy.decon_mod/10))), material)
linked_materials.insert_amount(min((linked_materials.max_amount - linked_materials.total_amount), (min(linked_destroy.loaded_item.materials[material]*(linked_destroy.decon_mod/10), linked_destroy.loaded_item.materials[material]))), material)
SSblackbox.add_details("item_deconstructed","[linked_destroy.loaded_item.type]")
linked_destroy.loaded_item = null
for(var/obj/I in linked_destroy.contents)

View File

@@ -498,3 +498,14 @@ MICE_ROUNDSTART 10
## If the percentage of players alive (doesn't count conversions) drops below this threshold the emergency shuttle will be forcefully called (provided it can be)
#EMERGENCY_SHUTTLE_AUTOCALL_THRESHOLD 0.2
## CREW OBJECTIVES ##
## Comment to disable objectives for innocent crew members.
ALLOW_CREW_OBJECTIVES
## MISCREANTS ##
## Comment to allow miscreants to spawn. Miscreants are a mini-antag with objectives that are not tracked.
ALLOW_MISCREANTS
## Uncomment to let miscreants spawn during Extended. I hold no responsibility for fun that may occur while this is enabled.
#ALLOW_EXTENDED_MISCREANTS

View File

@@ -0,0 +1,5 @@
author: "deathride58"
delete-after: True
changes:
- rscadd: "Ported Crew Objectives from Goon, featuring objectives from both Goon and old Hippie."
- rscadd: "Ported Miscreants from Goon. They will appear based on the server's configuration."

View File

@@ -0,0 +1,4 @@
author: "Xhuis"
delete-after: True
changes:
- bugfix: "Runed metal and brass are no longer invisible."

View File

@@ -0,0 +1,10 @@
author: "Toriate"
delete-after: True
changes:
- rscadd: "Added foam Magrifles"
- rscadd: "Added foam Stealth Pistols"
- rscadd: "Added toy Hyper Burst Rifles"
- rscadd: "Added toy ray gun"
- tweak: "foam X9s now available in autolathe"
- soundadd: "added raygun noises"
- imageadd: "added all the sprites for all those toys"

View File

@@ -0,0 +1,4 @@
author: "CitadelStationBot"
delete-after: True
changes:
- imageadd: "Changed the drop, throw, pull and resist icons."

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 38 KiB

BIN
sound/weapons/raygun.ogg Normal file

Binary file not shown.

View File

@@ -130,7 +130,6 @@
#include "code\_onclick\click.dm"
#include "code\_onclick\cyborg.dm"
#include "code\_onclick\drag_drop.dm"
#include "code\_onclick\god.dm"
#include "code\_onclick\item_attack.dm"
#include "code\_onclick\observer.dm"
#include "code\_onclick\other_mobs.dm"
@@ -165,16 +164,25 @@
#include "code\citadel\_cit_helpers.dm"
#include "code\citadel\cit_areas.dm"
#include "code\citadel\cit_arousal.dm"
#include "code\citadel\cit_crewobjectives.dm"
#include "code\citadel\cit_emotes.dm"
#include "code\citadel\cit_genemods.dm"
#include "code\citadel\cit_guns.dm"
#include "code\citadel\cit_kegs.dm"
#include "code\citadel\cit_miscreants.dm"
#include "code\citadel\cit_reagents.dm"
#include "code\citadel\cit_spawners.dm"
#include "code\citadel\cit_uniforms.dm"
#include "code\citadel\cit_vendors.dm"
#include "code\citadel\dogborgstuff.dm"
#include "code\citadel\plasmacases.dm"
#include "code\citadel\crew_objectives\cit_crewobjectives_cargo.dm"
#include "code\citadel\crew_objectives\cit_crewobjectives_civilian.dm"
#include "code\citadel\crew_objectives\cit_crewobjectives_command.dm"
#include "code\citadel\crew_objectives\cit_crewobjectives_engineering.dm"
#include "code\citadel\crew_objectives\cit_crewobjectives_medical.dm"
#include "code\citadel\crew_objectives\cit_crewobjectives_science.dm"
#include "code\citadel\crew_objectives\cit_crewobjectives_security.dm"
#include "code\citadel\custom_loadout\custom_items.dm"
#include "code\citadel\custom_loadout\load_to_mob.dm"
#include "code\citadel\custom_loadout\read_from_file.dm"

View File

@@ -99,11 +99,8 @@ switch (strtolower($_SERVER['HTTP_X_GITHUB_EVENT'])) {
case 'pull_request_review':
if($payload['action'] == 'submitted'){
$lower_state = strtolower($payload['review']['state']);
if(($lower_state == 'approved' || $lower_state == 'changes_requested') && is_maintainer($payload, $payload['review']['user']['login'])){
$lower_association = strtolower($payload['review']['author_association']);
if($lower_association == 'member' || $lower_association == 'contributor' || $lower_association == 'owner')
remove_ready_for_review($payload);
}
if(($lower_state == 'approved' || $lower_state == 'changes_requested') && is_maintainer($payload, $payload['review']['user']['login']))
remove_ready_for_review($payload);
}
break;
default:
@@ -209,7 +206,7 @@ function tag_pr($payload, $opened) {
$tags[] = 'Merge Conflict';
$treetags = array('_maps' => 'Map Edit', 'tools' => 'Tools', 'SQL' => 'SQL');
$addonlytags = array('icons' => 'Sprites', 'sounds' => 'Sound', 'config' => 'Config Update', 'code/controllers/configuration/entries' => 'Config Update');
$addonlytags = array('icons' => 'Sprites', 'sounds' => 'Sound', 'config' => 'Config Update', 'code/controllers/configuration/entries' => 'Config Update', 'tgui' => 'UI');
foreach($treetags as $tree => $tag)
if(has_tree_been_edited($payload, $tree))
$tags[] = $tag;
@@ -286,9 +283,8 @@ function check_ready_for_review($payload, $labels = null){
$reviews_ids_with_changes_requested = array();
$dismissed_an_approved_review = false;
foreach($reviews as $R){
$lower_association = strtolower($R['author_association']);
if($lower_association == 'member' || $lower_association == 'contributor' || $lower_association == 'owner'){
foreach($reviews as $R)
if(is_maintainer($R['user']['login'])){
$lower_state = strtolower($R['state']);
if($lower_state == 'changes_requested')
$reviews_ids_with_changes_requested[] = $R['id'];
@@ -297,7 +293,6 @@ function check_ready_for_review($payload, $labels = null){
$dismissed_an_approved_review = true;
}
}
}
if(!$dismissed_an_approved_review && count($reviews_ids_with_changes_requested) == 0){
if($has_label_already)