Merge branch 'master' of https://github.com/Citadel-Station-13/Citadel-Station-13 into Ghommie-cit277
This commit is contained in:
@@ -686,6 +686,20 @@
|
||||
log_admin("[key_name(usr)] set the pre-game delay to [DisplayTimeText(newtime)].")
|
||||
SSblackbox.record_feedback("tally", "admin_verb", 1, "Delay Game Start") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
/datum/admins/proc/toggledynamicvote()
|
||||
set category = "Server"
|
||||
set desc="Switches between secret/extended and dynamic voting"
|
||||
set name="Toggle Dynamic Vote"
|
||||
var/prev_dynamic_voting = CONFIG_GET(flag/dynamic_voting)
|
||||
CONFIG_SET(flag/dynamic_voting,!prev_dynamic_voting)
|
||||
if (!prev_dynamic_voting)
|
||||
to_chat(world, "<B>Vote is now between extended and dynamic chaos.</B>")
|
||||
else
|
||||
to_chat(world, "<B>Vote is now between extended and secret.</B>")
|
||||
log_admin("[key_name(usr)] [prev_dynamic_voting ? "disabled" : "enabled"] dynamic voting.")
|
||||
message_admins("<span class='adminnotice'>[key_name_admin(usr)] toggled dynamic voting.</span>")
|
||||
SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Dynamic Voting", "[prev_dynamic_voting ? "Disabled" : "Enabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
/datum/admins/proc/unprison(mob/M in GLOB.mob_list)
|
||||
set category = "Admin"
|
||||
set name = "Unprison"
|
||||
|
||||
@@ -121,6 +121,7 @@ GLOBAL_LIST_INIT(admin_verbs_server, world.AVerbsServer())
|
||||
/client/proc/everyone_random,
|
||||
/datum/admins/proc/toggleAI,
|
||||
/datum/admins/proc/toggleMulticam,
|
||||
/datum/admins/proc/toggledynamicvote,
|
||||
/client/proc/cmd_admin_delete, /*delete an instance/object/mob/etc*/
|
||||
/client/proc/cmd_debug_del_all,
|
||||
/client/proc/toggle_random_events,
|
||||
|
||||
@@ -1449,9 +1449,7 @@
|
||||
if(GLOB.master_mode != "dynamic")
|
||||
return alert(usr, "The game mode has to be dynamic mode!", null, null, null, null)
|
||||
|
||||
var/new_centre = input(usr,"Change the centre of the dynamic mode threat curve. A negative value will give a more peaceful round ; a positive value, a round with higher threat. Any number between -5 and +5 is allowed.", "Change curve centre", null) as num
|
||||
if (new_centre < -5 || new_centre > 5)
|
||||
return alert(usr, "Only values between -5 and +5 are allowed.", null, null, null, null)
|
||||
var/new_centre = input(usr,"Change the centre of the dynamic mode threat curve. A negative value will give a more peaceful round ; a positive value, a round with higher threat. Any number is allowed. This is adjusted by dynamic voting.", "Change curve centre", null) as num
|
||||
|
||||
log_admin("[key_name(usr)] changed the distribution curve center to [new_centre].")
|
||||
message_admins("[key_name(usr)] changed the distribution curve center to [new_centre]", 1)
|
||||
|
||||
@@ -56,7 +56,7 @@
|
||||
if(used)
|
||||
to_chat(H, "You already used this contract!")
|
||||
return
|
||||
var/list/candidates = pollCandidatesForMob("Do you want to play as a wizard's [href_list["school"]] apprentice?", ROLE_WIZARD, null, ROLE_WIZARD, 150, src)
|
||||
var/list/candidates = pollCandidatesForMob("Do you want to play as a wizard's [href_list["school"]] apprentice?", ROLE_WIZARD, null, ROLE_WIZARD, 150, src, ignore_category = POLL_IGNORE_WIZARD)
|
||||
if(LAZYLEN(candidates))
|
||||
if(QDELETED(src))
|
||||
return
|
||||
@@ -182,6 +182,10 @@
|
||||
name = "syndicate medical teleporter"
|
||||
borg_to_spawn = "Medical"
|
||||
|
||||
/obj/item/antag_spawner/nuke_ops/borg_tele/saboteur
|
||||
name = "syndicate saboteur teleporter"
|
||||
borg_to_spawn = "Saboteur"
|
||||
|
||||
/obj/item/antag_spawner/nuke_ops/borg_tele/spawn_antag(client/C, turf/T, kind, datum/mind/user)
|
||||
var/mob/living/silicon/robot/R
|
||||
var/datum/antagonist/nukeop/creator_op = user.has_antag_datum(/datum/antagonist/nukeop,TRUE)
|
||||
@@ -191,6 +195,8 @@
|
||||
switch(borg_to_spawn)
|
||||
if("Medical")
|
||||
R = new /mob/living/silicon/robot/modules/syndicate/medical(T)
|
||||
if("Saboteur")
|
||||
R = new /mob/living/silicon/robot/modules/syndicate/saboteur(T)
|
||||
else
|
||||
R = new /mob/living/silicon/robot/modules/syndicate(T) //Assault borg by default
|
||||
|
||||
@@ -235,7 +241,7 @@
|
||||
return
|
||||
if(used)
|
||||
return
|
||||
var/list/candidates = pollCandidatesForMob("Do you want to play as a [initial(demon_type.name)]?", ROLE_ALIEN, null, ROLE_ALIEN, 50, src)
|
||||
var/list/candidates = pollCandidatesForMob("Do you want to play as a [initial(demon_type.name)]?", ROLE_ALIEN, null, ROLE_ALIEN, 50, src, ignore_category = POLL_IGNORE_DEMON)
|
||||
if(LAZYLEN(candidates))
|
||||
if(used || QDELETED(src))
|
||||
return
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
for(var/obj/item/abductor/gizmo/G in B.contents)
|
||||
console.AddGizmo(G)
|
||||
|
||||
/datum/outfit/abductor/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
|
||||
/datum/outfit/abductor/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
|
||||
..()
|
||||
if(!visualsOnly)
|
||||
link_to_console(H)
|
||||
@@ -49,7 +49,7 @@
|
||||
/obj/item/abductor/gizmo = 1
|
||||
)
|
||||
|
||||
/datum/outfit/abductor/scientist/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
|
||||
/datum/outfit/abductor/scientist/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
|
||||
..()
|
||||
if(!visualsOnly)
|
||||
var/obj/item/implant/abductor/beamplant = new
|
||||
|
||||
@@ -17,9 +17,9 @@
|
||||
|
||||
/obj/machinery/computer/camera_advanced/abductor/CreateEye()
|
||||
..()
|
||||
eyeobj.visible_icon = 1
|
||||
eyeobj.icon = 'icons/obj/abductor.dmi'
|
||||
eyeobj.icon_state = "camera_target"
|
||||
eyeobj.visible_icon = TRUE
|
||||
eyeobj.icon = 'icons/mob/cameramob.dmi'
|
||||
eyeobj.icon_state = "generic_camera"
|
||||
|
||||
/obj/machinery/computer/camera_advanced/abductor/GrantActions(mob/living/carbon/user)
|
||||
..()
|
||||
|
||||
@@ -9,7 +9,7 @@ GLOBAL_LIST_EMPTY(blob_nodes)
|
||||
name = "Blob Overmind"
|
||||
real_name = "Blob Overmind"
|
||||
desc = "The overmind. It controls the blob."
|
||||
icon = 'icons/mob/blob.dmi'
|
||||
icon = 'icons/mob/cameramob.dmi'
|
||||
icon_state = "marker"
|
||||
mouse_opacity = MOUSE_OPACITY_ICON
|
||||
move_on_shuttle = 1
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
name = "Spawn Sentient Disease"
|
||||
typepath = /datum/round_event/ghost_role/sentient_disease
|
||||
weight = 7
|
||||
gamemode_blacklist = list("dynamic")
|
||||
max_occurrences = 1
|
||||
min_players = 5
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@ the new instance inside the host to be updated to the template's stats.
|
||||
name = "Sentient Disease"
|
||||
real_name = "Sentient Disease"
|
||||
desc = ""
|
||||
icon = 'icons/mob/blob.dmi'
|
||||
icon = 'icons/mob/cameramob.dmi'
|
||||
icon_state = "marker"
|
||||
mouse_opacity = MOUSE_OPACITY_ICON
|
||||
move_on_shuttle = FALSE
|
||||
|
||||
@@ -0,0 +1,181 @@
|
||||
/obj/item/borg_chameleon
|
||||
name = "cyborg chameleon projector"
|
||||
icon = 'icons/obj/device.dmi'
|
||||
icon_state = "shield0"
|
||||
flags_1 = CONDUCT_1
|
||||
item_flags = NOBLUDGEON
|
||||
item_state = "electronic"
|
||||
lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
var/friendlyName
|
||||
var/savedName
|
||||
var/active = FALSE
|
||||
var/activationCost = 300
|
||||
var/activationUpkeep = 50
|
||||
var/disguise = null
|
||||
var/disguise_icon_override = null
|
||||
var/disguise_pixel_offset = null
|
||||
var/mob/listeningTo
|
||||
var/static/list/signalCache = list( // list here all signals that should break the camouflage
|
||||
COMSIG_PARENT_ATTACKBY,
|
||||
COMSIG_ATOM_ATTACK_HAND,
|
||||
COMSIG_MOVABLE_IMPACT_ZONE,
|
||||
COMSIG_ATOM_BULLET_ACT,
|
||||
COMSIG_ATOM_EX_ACT,
|
||||
COMSIG_ATOM_FIRE_ACT,
|
||||
COMSIG_ATOM_EMP_ACT,
|
||||
)
|
||||
var/mob/living/silicon/robot/user // needed for process()
|
||||
var/animation_playing = FALSE
|
||||
|
||||
var/list/engymodels = list("Default", "Default - Treads", "Heavy", "Sleek", "Marina", "Can", "Spider", "Loader","Handy", "Pup Dozer", "Vale")
|
||||
|
||||
|
||||
/obj/item/borg_chameleon/Initialize()
|
||||
. = ..()
|
||||
friendlyName = pick(GLOB.ai_names)
|
||||
|
||||
/obj/item/borg_chameleon/Destroy()
|
||||
listeningTo = null
|
||||
return ..()
|
||||
|
||||
/obj/item/borg_chameleon/dropped(mob/user)
|
||||
. = ..()
|
||||
disrupt(user)
|
||||
|
||||
/obj/item/borg_chameleon/equipped(mob/user)
|
||||
. = ..()
|
||||
disrupt(user)
|
||||
|
||||
/obj/item/borg_chameleon/attack_self(mob/living/silicon/robot/user)
|
||||
if (user && user.cell && user.cell.charge > activationCost)
|
||||
if (isturf(user.loc))
|
||||
toggle(user)
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You can't use [src] while inside something!</span>")
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You need at least [activationCost] charge in your cell to use [src]!</span>")
|
||||
|
||||
/obj/item/borg_chameleon/proc/toggle(mob/living/silicon/robot/user)
|
||||
if(active)
|
||||
playsound(src, 'sound/effects/pop.ogg', 100, TRUE, -6)
|
||||
to_chat(user, "<span class='notice'>You deactivate \the [src].</span>")
|
||||
deactivate(user)
|
||||
else
|
||||
if(animation_playing)
|
||||
to_chat(user, "<span class='notice'>\the [src] is recharging.</span>")
|
||||
return
|
||||
var/borg_icon = input(user, "Select an icon!", "Robot Icon", null) as null|anything in engymodels
|
||||
if(!borg_icon)
|
||||
return FALSE
|
||||
switch(borg_icon)
|
||||
if("Default")
|
||||
disguise = "engineer"
|
||||
disguise_icon_override = 'icons/mob/robots.dmi'
|
||||
if("Default - Treads")
|
||||
disguise = "engi-tread"
|
||||
disguise_icon_override = 'modular_citadel/icons/mob/robots.dmi'
|
||||
if("Loader")
|
||||
disguise = "loaderborg"
|
||||
disguise_icon_override = 'modular_citadel/icons/mob/robots.dmi'
|
||||
if("Handy")
|
||||
disguise = "handyeng"
|
||||
disguise_icon_override = 'modular_citadel/icons/mob/robots.dmi'
|
||||
if("Sleek")
|
||||
disguise = "sleekeng"
|
||||
disguise_icon_override = 'modular_citadel/icons/mob/robots.dmi'
|
||||
if("Can")
|
||||
disguise = "caneng"
|
||||
disguise_icon_override = 'modular_citadel/icons/mob/robots.dmi'
|
||||
if("Marina")
|
||||
disguise = "marinaeng"
|
||||
disguise_icon_override = 'modular_citadel/icons/mob/robots.dmi'
|
||||
if("Spider")
|
||||
disguise = "spidereng"
|
||||
disguise_icon_override = 'modular_citadel/icons/mob/robots.dmi'
|
||||
if("Heavy")
|
||||
disguise = "heavyeng"
|
||||
disguise_icon_override = 'modular_citadel/icons/mob/robots.dmi'
|
||||
if("Pup Dozer")
|
||||
disguise = "pupdozer"
|
||||
disguise_icon_override = 'modular_citadel/icons/mob/widerobot.dmi'
|
||||
disguise_pixel_offset = -16
|
||||
if("Vale")
|
||||
disguise = "valeeng"
|
||||
disguise_icon_override = 'modular_citadel/icons/mob/widerobot.dmi'
|
||||
disguise_pixel_offset = -16
|
||||
animation_playing = TRUE
|
||||
to_chat(user, "<span class='notice'>You activate \the [src].</span>")
|
||||
playsound(src, 'sound/effects/seedling_chargeup.ogg', 100, TRUE, -6)
|
||||
var/start = user.filters.len
|
||||
var/X,Y,rsq,i,f
|
||||
for(i=1, i<=7, ++i)
|
||||
do
|
||||
X = 60*rand() - 30
|
||||
Y = 60*rand() - 30
|
||||
rsq = X*X + Y*Y
|
||||
while(rsq<100 || rsq>900)
|
||||
user.filters += filter(type="wave", x=X, y=Y, size=rand()*2.5+0.5, offset=rand())
|
||||
for(i=1, i<=7, ++i)
|
||||
f = user.filters[start+i]
|
||||
animate(f, offset=f:offset, time=0, loop=3, flags=ANIMATION_PARALLEL)
|
||||
animate(offset=f:offset-1, time=rand()*20+10)
|
||||
if (do_after(user, 50, target=user) && user.cell.use(activationCost))
|
||||
playsound(src, 'sound/effects/bamf.ogg', 100, TRUE, -6)
|
||||
to_chat(user, "<span class='notice'>You are now disguised as the Nanotrasen engineering borg \"[friendlyName]\".</span>")
|
||||
activate(user)
|
||||
else
|
||||
to_chat(user, "<span class='warning'>The chameleon field fizzles.</span>")
|
||||
do_sparks(3, FALSE, user)
|
||||
for(i=1, i<=min(7, user.filters.len), ++i) // removing filters that are animating does nothing, we gotta stop the animations first
|
||||
f = user.filters[start+i]
|
||||
animate(f)
|
||||
user.filters = null
|
||||
animation_playing = FALSE
|
||||
|
||||
/obj/item/borg_chameleon/process()
|
||||
if (user)
|
||||
if (!user.cell || !user.cell.use(activationUpkeep))
|
||||
disrupt(user)
|
||||
else
|
||||
return PROCESS_KILL
|
||||
|
||||
/obj/item/borg_chameleon/proc/activate(mob/living/silicon/robot/user)
|
||||
START_PROCESSING(SSobj, src)
|
||||
src.user = user
|
||||
savedName = user.name
|
||||
user.name = friendlyName
|
||||
user.module.cyborg_base_icon = disguise
|
||||
user.module.cyborg_icon_override = disguise_icon_override
|
||||
user.module.cyborg_pixel_offset = disguise_pixel_offset
|
||||
user.bubble_icon = "robot"
|
||||
active = TRUE
|
||||
user.update_icons()
|
||||
|
||||
if(listeningTo == user)
|
||||
return
|
||||
if(listeningTo)
|
||||
UnregisterSignal(listeningTo, signalCache)
|
||||
RegisterSignal(user, signalCache, .proc/disrupt)
|
||||
listeningTo = user
|
||||
|
||||
/obj/item/borg_chameleon/proc/deactivate(mob/living/silicon/robot/user)
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
if(listeningTo)
|
||||
UnregisterSignal(listeningTo, signalCache)
|
||||
listeningTo = null
|
||||
do_sparks(5, FALSE, user)
|
||||
user.name = savedName
|
||||
user.module.cyborg_base_icon = initial(user.module.cyborg_base_icon)
|
||||
user.module.cyborg_icon_override = 'icons/mob/robots.dmi'
|
||||
user.bubble_icon = "syndibot"
|
||||
active = FALSE
|
||||
user.update_icons()
|
||||
user.pixel_x = 0 //this solely exists because of dogborgs. I want anyone who ever reads this code later on to know this. Don't ask me why it's here, doesn't work above update_icons()
|
||||
src.user = user
|
||||
|
||||
/obj/item/borg_chameleon/proc/disrupt(mob/living/silicon/robot/user)
|
||||
if(active)
|
||||
to_chat(user, "<span class='danger'>Your chameleon field deactivates.</span>")
|
||||
deactivate(user)
|
||||
@@ -74,6 +74,11 @@ GLOBAL_VAR_INIT(war_declared, FALSE)
|
||||
new uplink_type(get_turf(user), user.key, CHALLENGE_TELECRYSTALS - tc_malus + CEILING(PLAYER_SCALING * actual_players, 1))
|
||||
|
||||
CONFIG_SET(number/shuttle_refuel_delay, max(CONFIG_GET(number/shuttle_refuel_delay), CHALLENGE_SHUTTLE_DELAY))
|
||||
if(istype(SSticker.mode, /datum/game_mode/dynamic))
|
||||
var/datum/game_mode/dynamic/mode = SSticker.mode
|
||||
var/threat_spent = CONFIG_GET(number/dynamic_warops_cost)
|
||||
mode.spend_threat(threat_spent)
|
||||
mode.log_threat("Nuke ops spent [threat_spent] on war ops.")
|
||||
SSblackbox.record_feedback("amount", "nuclear_challenge_mode", 1)
|
||||
|
||||
qdel(src)
|
||||
@@ -94,6 +99,14 @@ GLOBAL_VAR_INIT(war_declared, FALSE)
|
||||
if(board.moved)
|
||||
to_chat(user, "The shuttle has already been moved! You have forfeit the right to declare war.")
|
||||
return FALSE
|
||||
if(istype(SSticker.mode, /datum/game_mode/dynamic))
|
||||
var/datum/game_mode/dynamic/mode = SSticker.mode
|
||||
if(mode.threat_level < CONFIG_GET(number/dynamic_warops_requirement))
|
||||
to_chat(user, "Due to the dynamic space in which the station resides, you are too deep into Nanotrasen territory to reasonably go loud.")
|
||||
return FALSE
|
||||
else if(mode.threat < CONFIG_GET(number/dynamic_warops_cost))
|
||||
to_chat(user, "Due to recent threats on the station, Nanotrasen is looking too closely for a war declaration to be wise.")
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/obj/item/nuclear_challenge/clownops
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
name = "Spawn Revenant" // Did you mean 'griefghost'?
|
||||
typepath = /datum/round_event/ghost_role/revenant
|
||||
weight = 7
|
||||
gamemode_blacklist = list("dynamic")
|
||||
max_occurrences = 1
|
||||
min_players = 5
|
||||
|
||||
|
||||
@@ -207,9 +207,20 @@
|
||||
owner.current.visible_message("<span class='deconversion_message'>The frame beeps contentedly, purging the hostile memory engram from the MMI before initalizing it.</span>", null, null, null, owner.current)
|
||||
to_chat(owner, "<span class='userdanger'>The frame's firmware detects and deletes your neural reprogramming! You remember nothing of your time spent reprogrammed, you can't even remember the names or identities of anyone involved...</span>")
|
||||
|
||||
/datum/antagonist/rev/head/farewell()
|
||||
if((ishuman(owner.current) || ismonkey(owner.current)))
|
||||
if(owner.current.stat != DEAD)
|
||||
owner.current.visible_message("<span class='deconversion_message'>[owner.current] looks like [owner.current.p_theyve()] just remembered [owner.current.p_their()] real allegiance!</span>", null, null, null, owner.current)
|
||||
to_chat(owner, "<span class ='deconversion_message bold'>You have given up your cause of overthrowing the command staff. You are no longer a Head Revolutionary.</span>")
|
||||
else
|
||||
to_chat(owner, "<span class ='deconversion_message bold'>The sweet release of death. You are no longer a Head Revolutionary.</span>")
|
||||
else if(issilicon(owner.current))
|
||||
owner.current.visible_message("<span class='deconversion_message'>The frame beeps contentedly, suppressing the disloyal personality traits from the MMI before initalizing it.</span>", null, null, null, owner.current)
|
||||
to_chat(owner, "<span class='userdanger'>The frame's firmware detects and suppresses your unwanted personality traits! You feel more content with the leadership around these parts.</span>")
|
||||
|
||||
//blunt trauma deconversions call this through species.dm spec_attacked_by()
|
||||
/datum/antagonist/rev/proc/remove_revolutionary(borged, deconverter)
|
||||
log_attack("[key_name(owner.current)] has been deconverted from the revolution by [key_name(deconverter)]!")
|
||||
log_attack("[key_name(owner.current)] has been deconverted from the revolution by [ismob(deconverter) ? key_name(deconverter) : deconverter]!")
|
||||
if(borged)
|
||||
message_admins("[ADMIN_LOOKUPFLW(owner.current)] has been borged while being a [name]")
|
||||
owner.special_role = null
|
||||
@@ -219,9 +230,8 @@
|
||||
owner.remove_antag_datum(type)
|
||||
|
||||
/datum/antagonist/rev/head/remove_revolutionary(borged,deconverter)
|
||||
if(!borged)
|
||||
return
|
||||
. = ..()
|
||||
if(borged || deconverter == "gamemode")
|
||||
. = ..()
|
||||
|
||||
/datum/antagonist/rev/head/equip_rev()
|
||||
var/mob/living/carbon/human/H = owner.current
|
||||
@@ -253,6 +263,8 @@
|
||||
/datum/team/revolution
|
||||
name = "Revolution"
|
||||
var/max_headrevs = 3
|
||||
var/list/ex_headrevs = list() // Dynamic removes revs on loss, used to keep a list for the roundend report.
|
||||
var/list/ex_revs = list()
|
||||
|
||||
/datum/team/revolution/proc/update_objectives(initial = FALSE)
|
||||
var/untracked_heads = SSjob.get_all_heads()
|
||||
@@ -296,9 +308,12 @@
|
||||
|
||||
addtimer(CALLBACK(src,.proc/update_heads),HEAD_UPDATE_PERIOD,TIMER_UNIQUE)
|
||||
|
||||
/datum/team/revolution/proc/save_members()
|
||||
ex_headrevs = get_antag_minds(/datum/antagonist/rev/head, TRUE)
|
||||
ex_revs = get_antag_minds(/datum/antagonist/rev, TRUE)
|
||||
|
||||
/datum/team/revolution/roundend_report()
|
||||
if(!members.len)
|
||||
if(!members.len && !ex_headrevs.len)
|
||||
return
|
||||
|
||||
var/list/result = list()
|
||||
@@ -318,8 +333,17 @@
|
||||
|
||||
|
||||
var/list/targets = list()
|
||||
var/list/datum/mind/headrevs = get_antag_minds(/datum/antagonist/rev/head)
|
||||
var/list/datum/mind/revs = get_antag_minds(/datum/antagonist/rev,TRUE)
|
||||
var/list/datum/mind/headrevs
|
||||
var/list/datum/mind/revs
|
||||
if(ex_headrevs.len)
|
||||
headrevs = ex_headrevs
|
||||
else
|
||||
headrevs = get_antag_minds(/datum/antagonist/rev/head, TRUE)
|
||||
|
||||
if(ex_revs.len)
|
||||
revs = ex_revs
|
||||
else
|
||||
revs = get_antag_minds(/datum/antagonist/rev, TRUE)
|
||||
if(headrevs.len)
|
||||
var/list/headrev_part = list()
|
||||
headrev_part += "<span class='header'>The head revolutionaries were:</span>"
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
typepath = /datum/round_event/ghost_role/slaughter
|
||||
weight = 1 //Very rare
|
||||
max_occurrences = 1
|
||||
gamemode_blacklist = list("dynamic")
|
||||
earliest_start = 1 HOURS
|
||||
min_players = 20
|
||||
|
||||
|
||||
@@ -70,7 +70,17 @@
|
||||
|
||||
/datum/antagonist/traitor/proc/forge_human_objectives()
|
||||
var/is_hijacker = FALSE
|
||||
if (GLOB.joined_player_list.len >= 30) // Less murderboning on lowpop thanks
|
||||
var/datum/game_mode/dynamic/mode
|
||||
var/is_dynamic = FALSE
|
||||
if(istype(SSticker.mode,/datum/game_mode/dynamic))
|
||||
mode = SSticker.mode
|
||||
is_dynamic = TRUE
|
||||
if(GLOB.joined_player_list.len>=GLOB.dynamic_high_pop_limit)
|
||||
is_hijacker = (prob(10) && mode.threat_level > CONFIG_GET(number/dynamic_hijack_high_population_requirement))
|
||||
else
|
||||
var/indice_pop = min(10,round(GLOB.joined_player_list.len/mode.pop_per_requirement)+1)
|
||||
is_hijacker = (prob(10) && (mode.threat_level >= CONFIG_GET(number_list/dynamic_hijack_requirements)[indice_pop]))
|
||||
else if (GLOB.joined_player_list.len >= 30) // Less murderboning on lowpop thanks
|
||||
is_hijacker = prob(10)
|
||||
var/martyr_chance = prob(20)
|
||||
var/objective_count = is_hijacker //Hijacking counts towards number of objectives
|
||||
@@ -91,6 +101,10 @@
|
||||
var/datum/objective/hijack/hijack_objective = new
|
||||
hijack_objective.owner = owner
|
||||
add_objective(hijack_objective)
|
||||
if(is_dynamic)
|
||||
var/threat_spent = CONFIG_GET(number/dynamic_hijack_cost)
|
||||
mode.spend_threat(threat_spent)
|
||||
mode.log_threat("[owner.name] spent [threat_spent] on hijack.")
|
||||
return
|
||||
|
||||
|
||||
@@ -104,6 +118,10 @@
|
||||
var/datum/objective/martyr/martyr_objective = new
|
||||
martyr_objective.owner = owner
|
||||
add_objective(martyr_objective)
|
||||
if(is_dynamic)
|
||||
var/threat_spent = CONFIG_GET(number/dynamic_hijack_cost)
|
||||
mode.spend_threat(threat_spent)
|
||||
mode.log_threat("[owner.name] spent [threat_spent] on glorious death.")
|
||||
return
|
||||
|
||||
else
|
||||
@@ -139,7 +157,18 @@
|
||||
|
||||
/datum/antagonist/traitor/proc/forge_single_human_objective() //Returns how many objectives are added
|
||||
.=1
|
||||
if(prob(50))
|
||||
var/assassin_prob = 50
|
||||
var/is_dynamic = FALSE
|
||||
var/datum/game_mode/dynamic/mode
|
||||
if(istype(SSticker.mode,/datum/game_mode/dynamic))
|
||||
mode = SSticker.mode
|
||||
is_dynamic = TRUE
|
||||
assassin_prob = mode.threat_level*(2/3)
|
||||
if(prob(assassin_prob))
|
||||
if(is_dynamic)
|
||||
var/threat_spent = CONFIG_GET(number/dynamic_assassinate_cost)
|
||||
mode.spend_threat(threat_spent)
|
||||
mode.log_threat("[owner.name] spent [threat_spent] on an assassination target.")
|
||||
var/list/active_ais = active_ais()
|
||||
if(active_ais.len && prob(100/GLOB.joined_player_list.len))
|
||||
var/datum/objective/destroy/destroy_objective = new
|
||||
|
||||
@@ -383,7 +383,9 @@
|
||||
if(!istype(user) || on_cooldown)
|
||||
return
|
||||
var/turf/T = get_turf(user)
|
||||
if(!T)
|
||||
var/area/A = get_area(user)
|
||||
if(!T || !A || A.noteleport)
|
||||
to_chat(user, "<span class='warning'>You play \the [src], yet no sound comes out of it... Looks like it won't work here.</span>")
|
||||
return
|
||||
on_cooldown = TRUE
|
||||
last_user = user
|
||||
|
||||
@@ -11,12 +11,18 @@
|
||||
var/buy_word = "Learn"
|
||||
var/limit //used to prevent a spellbook_entry from being bought more than X times with one wizard spellbook
|
||||
var/list/no_coexistance_typecache //Used so you can't have specific spells together
|
||||
var/dynamic_cost = 0 // How much threat the spell costs to purchase for dynamic.
|
||||
var/dynamic_requirement = 0 // How high the threat level needs to be for purchasing in dynamic.
|
||||
|
||||
/datum/spellbook_entry/New()
|
||||
..()
|
||||
no_coexistance_typecache = typecacheof(no_coexistance_typecache)
|
||||
|
||||
/datum/spellbook_entry/proc/IsAvailible() // For config prefs / gamemode restrictions - these are round applied
|
||||
if(istype(SSticker.mode,/datum/game_mode/dynamic))
|
||||
var/datum/game_mode/dynamic/mode = SSticker.mode
|
||||
if(dynamic_requirement > 0 && mode.threat_level < dynamic_requirement)
|
||||
return 0
|
||||
return 1
|
||||
|
||||
/datum/spellbook_entry/proc/CanBuy(mob/living/carbon/human/user,obj/item/spellbook/book) // Specific circumstances
|
||||
@@ -25,6 +31,10 @@
|
||||
for(var/spell in user.mind.spell_list)
|
||||
if(is_type_in_typecache(spell, no_coexistance_typecache))
|
||||
return 0
|
||||
if(dynamic_cost>0 && istype(SSticker.mode,/datum/game_mode/dynamic))
|
||||
var/datum/game_mode/dynamic/mode = SSticker.mode
|
||||
if(mode.threat < dynamic_cost)
|
||||
return 0
|
||||
return 1
|
||||
|
||||
/datum/spellbook_entry/proc/Buy(mob/living/carbon/human/user,obj/item/spellbook/book) //return 1 on success
|
||||
@@ -60,6 +70,10 @@
|
||||
SSblackbox.record_feedback("nested tally", "wizard_spell_improved", 1, list("[name]", "[aspell.spell_level]"))
|
||||
return 1
|
||||
//No same spell found - just learn it
|
||||
if(dynamic_cost > 0 && istype(SSticker.mode,/datum/game_mode/dynamic))
|
||||
var/datum/game_mode/dynamic/mode = SSticker.mode
|
||||
mode.spend_threat(dynamic_cost)
|
||||
mode.log_threat("Wizard spent [dynamic_cost] on [name].")
|
||||
SSblackbox.record_feedback("tally", "wizard_spell_learned", 1, name)
|
||||
user.mind.AddSpell(S)
|
||||
to_chat(user, "<span class='notice'>You have learned [S.name].</span>")
|
||||
@@ -83,6 +97,10 @@
|
||||
if(!S)
|
||||
S = new spell_type()
|
||||
var/spell_levels = 0
|
||||
if(dynamic_cost > 0 && istype(SSticker.mode,/datum/game_mode/dynamic))
|
||||
var/datum/game_mode/dynamic/mode = SSticker.mode
|
||||
mode.refund_threat(dynamic_cost)
|
||||
mode.log_threat("Wizard refunded [dynamic_cost] on [name].")
|
||||
for(var/obj/effect/proc_holder/spell/aspell in user.mind.spell_list)
|
||||
if(initial(S.name) == initial(aspell.name))
|
||||
spell_levels = aspell.spell_level
|
||||
@@ -285,6 +303,8 @@
|
||||
name = "Staff of Change"
|
||||
desc = "An artefact that spits bolts of coruscating energy which cause the target's very form to reshape itself."
|
||||
item_path = /obj/item/gun/magic/staff/change
|
||||
dynamic_requirement = 60
|
||||
dynamic_cost = 20
|
||||
|
||||
/datum/spellbook_entry/item/staffanimation
|
||||
name = "Staff of Animation"
|
||||
@@ -369,6 +389,8 @@
|
||||
desc = "A magical contract binding an apprentice wizard to your service, using it will summon them to your side."
|
||||
item_path = /obj/item/antag_spawner/contract
|
||||
category = "Assistance"
|
||||
dynamic_requirement = 50
|
||||
dynamic_cost = 10
|
||||
|
||||
/datum/spellbook_entry/item/guardian
|
||||
name = "Guardian Deck"
|
||||
@@ -388,6 +410,11 @@
|
||||
item_path = /obj/item/antag_spawner/slaughter_demon
|
||||
limit = 3
|
||||
category = "Assistance"
|
||||
dynamic_requirement = 60
|
||||
|
||||
/datum/spellbook_entry/item/bloodbottle/New()
|
||||
..()
|
||||
dynamic_cost = CONFIG_GET(keyed_list/dynamic_cost)["slaughter_demon"]
|
||||
|
||||
/datum/spellbook_entry/item/hugbottle
|
||||
name = "Bottle of Tickles"
|
||||
@@ -402,6 +429,11 @@
|
||||
cost = 1 //non-destructive; it's just a jape, sibling!
|
||||
limit = 3
|
||||
category = "Assistance"
|
||||
dynamic_requirement = 40
|
||||
|
||||
/datum/spellbook_entry/item/hugbottle/New()
|
||||
..()
|
||||
dynamic_cost = CONFIG_GET(keyed_list/dynamic_cost)["slaughter_demon"]/3
|
||||
|
||||
/datum/spellbook_entry/item/mjolnir
|
||||
name = "Mjolnir"
|
||||
@@ -465,7 +497,7 @@
|
||||
if(!SSticker.mode)
|
||||
return FALSE
|
||||
else
|
||||
return TRUE
|
||||
return ..()
|
||||
|
||||
/datum/spellbook_entry/summon/ghosts/Buy(mob/living/carbon/human/user, obj/item/spellbook/book)
|
||||
SSblackbox.record_feedback("tally", "wizard_spell_learned", 1, name)
|
||||
@@ -478,11 +510,13 @@
|
||||
/datum/spellbook_entry/summon/guns
|
||||
name = "Summon Guns"
|
||||
desc = "Nothing could possibly go wrong with arming a crew of lunatics just itching for an excuse to kill you. Just be careful not to stand still too long!"
|
||||
dynamic_cost = 10
|
||||
dynamic_requirement = 60
|
||||
|
||||
/datum/spellbook_entry/summon/guns/IsAvailible()
|
||||
if(!SSticker.mode) // In case spellbook is placed on map
|
||||
return 0
|
||||
return !CONFIG_GET(flag/no_summon_guns)
|
||||
return (!CONFIG_GET(flag/no_summon_guns) && ..())
|
||||
|
||||
/datum/spellbook_entry/summon/guns/Buy(mob/living/carbon/human/user,obj/item/spellbook/book)
|
||||
SSblackbox.record_feedback("tally", "wizard_spell_learned", 1, name)
|
||||
@@ -490,16 +524,23 @@
|
||||
active = 1
|
||||
playsound(get_turf(user), 'sound/magic/castsummon.ogg', 50, 1)
|
||||
to_chat(user, "<span class='notice'>You have cast summon guns!</span>")
|
||||
if(istype(SSticker.mode,/datum/game_mode/dynamic))
|
||||
var/datum/game_mode/dynamic/mode = SSticker.mode
|
||||
var/threat_spent = dynamic_cost
|
||||
mode.spend_threat(threat_spent)
|
||||
mode.log_threat("Wizard spent [threat_spent] on summon guns.")
|
||||
return 1
|
||||
|
||||
/datum/spellbook_entry/summon/magic
|
||||
name = "Summon Magic"
|
||||
desc = "Share the wonders of magic with the crew and show them why they aren't to be trusted with it at the same time."
|
||||
dynamic_cost = 10
|
||||
dynamic_requirement = 60
|
||||
|
||||
/datum/spellbook_entry/summon/magic/IsAvailible()
|
||||
if(!SSticker.mode) // In case spellbook is placed on map
|
||||
return 0
|
||||
return !CONFIG_GET(flag/no_summon_magic)
|
||||
return (!CONFIG_GET(flag/no_summon_guns) && ..())
|
||||
|
||||
/datum/spellbook_entry/summon/magic/Buy(mob/living/carbon/human/user,obj/item/spellbook/book)
|
||||
SSblackbox.record_feedback("tally", "wizard_spell_learned", 1, name)
|
||||
@@ -507,21 +548,33 @@
|
||||
active = 1
|
||||
playsound(get_turf(user), 'sound/magic/castsummon.ogg', 50, 1)
|
||||
to_chat(user, "<span class='notice'>You have cast summon magic!</span>")
|
||||
if(istype(SSticker.mode,/datum/game_mode/dynamic))
|
||||
var/datum/game_mode/dynamic/mode = SSticker.mode
|
||||
var/threat_spent = dynamic_cost
|
||||
mode.spend_threat(threat_spent)
|
||||
mode.log_threat("Wizard spent [threat_spent] on summon magic.")
|
||||
return 1
|
||||
|
||||
/datum/spellbook_entry/summon/events
|
||||
name = "Summon Events"
|
||||
desc = "Give Murphy's law a little push and replace all events with special wizard ones that will confound and confuse everyone. Multiple castings increase the rate of these events."
|
||||
dynamic_cost = 20
|
||||
dynamic_requirement = 60
|
||||
var/times = 0
|
||||
|
||||
/datum/spellbook_entry/summon/events/IsAvailible()
|
||||
if(!SSticker.mode) // In case spellbook is placed on map
|
||||
return 0
|
||||
return !CONFIG_GET(flag/no_summon_events)
|
||||
return (!CONFIG_GET(flag/no_summon_events) && ..())
|
||||
|
||||
/datum/spellbook_entry/summon/events/Buy(mob/living/carbon/human/user,obj/item/spellbook/book)
|
||||
SSblackbox.record_feedback("tally", "wizard_spell_learned", 1, name)
|
||||
summonevents()
|
||||
if(istype(SSticker.mode,/datum/game_mode/dynamic) && times == 0)
|
||||
var/datum/game_mode/dynamic/mode = SSticker.mode
|
||||
var/threat_spent = dynamic_cost
|
||||
mode.spend_threat(threat_spent)
|
||||
mode.log_threat("Wizard spent [threat_spent] on summon events.")
|
||||
times++
|
||||
playsound(get_turf(user), 'sound/magic/castsummon.ogg', 50, 1)
|
||||
to_chat(user, "<span class='notice'>You have cast summon events.</span>")
|
||||
|
||||
@@ -165,7 +165,7 @@
|
||||
owner.AddSpell(new /obj/effect/proc_holder/spell/aimed/fireball(null))
|
||||
to_chat(owner, "<B>Your service has not gone unrewarded, however. Studying under [master.current.real_name], you have learned powerful, destructive spells. You are able to cast magic missile and fireball.")
|
||||
if(APPRENTICE_BLUESPACE)
|
||||
owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/area_teleport/teleport(null))
|
||||
owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/turf_teleport/blink(null))
|
||||
owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/ethereal_jaunt(null))
|
||||
to_chat(owner, "<B>Your service has not gone unrewarded, however. Studying under [master.current.real_name], you have learned reality bending mobility spells. You are able to cast teleport and ethereal jaunt.")
|
||||
if(APPRENTICE_HEALING)
|
||||
|
||||
@@ -199,7 +199,7 @@
|
||||
var/radiated_temperature = location.air.temperature*FIRE_SPREAD_RADIOSITY_SCALE
|
||||
for(var/t in location.atmos_adjacent_turfs)
|
||||
var/turf/open/T = t
|
||||
if(T.active_hotspot)
|
||||
if(!T.active_hotspot)
|
||||
T.hotspot_expose(radiated_temperature, CELL_VOLUME/4)
|
||||
|
||||
else
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
|
||||
//used for mapping and for breathing while in walls (because that's a thing that needs to be accounted for...)
|
||||
//string parsed by /datum/gas/proc/copy_from_turf
|
||||
var/initial_gas_mix = "o2=22;n2=82;TEMP=293.15"
|
||||
var/initial_gas_mix = OPENTURF_DEFAULT_ATMOS
|
||||
//approximation of MOLES_O2STANDARD and MOLES_N2STANDARD pending byond allowing constant expressions to be embedded in constant strings
|
||||
// If someone will place 0 of some gas there, SHIT WILL BREAK. Do not do that.
|
||||
|
||||
|
||||
@@ -487,7 +487,7 @@
|
||||
r_pocket = /obj/item/ammo_box/magazine/recharge/ctf
|
||||
r_hand = /obj/item/gun/ballistic/automatic/laser/ctf
|
||||
|
||||
/datum/outfit/ctf/post_equip(mob/living/carbon/human/H, visualsOnly=FALSE)
|
||||
/datum/outfit/ctf/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
|
||||
if(visualsOnly)
|
||||
return
|
||||
var/list/no_drops = list()
|
||||
@@ -529,7 +529,7 @@
|
||||
r_hand = /obj/item/gun/energy/laser/instakill/blue
|
||||
shoes = /obj/item/clothing/shoes/jackboots/fast
|
||||
|
||||
/datum/outfit/ctf/red/post_equip(mob/living/carbon/human/H)
|
||||
/datum/outfit/ctf/red/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
|
||||
..()
|
||||
var/obj/item/radio/R = H.ears
|
||||
R.set_frequency(FREQ_CTF_RED)
|
||||
@@ -537,7 +537,7 @@
|
||||
R.independent = TRUE
|
||||
H.dna.species.stunmod = 0
|
||||
|
||||
/datum/outfit/ctf/blue/post_equip(mob/living/carbon/human/H)
|
||||
/datum/outfit/ctf/blue/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
|
||||
..()
|
||||
var/obj/item/radio/R = H.ears
|
||||
R.set_frequency(FREQ_CTF_BLUE)
|
||||
|
||||
@@ -440,7 +440,7 @@
|
||||
uniform = /obj/item/clothing/under/pants/youngfolksjeans
|
||||
id = /obj/item/card/id
|
||||
|
||||
/datum/outfit/beachbum/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
|
||||
/datum/outfit/beachbum/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
|
||||
..()
|
||||
if(visualsOnly)
|
||||
return
|
||||
|
||||
@@ -154,7 +154,7 @@
|
||||
//liquid plasma!!!!!!//
|
||||
|
||||
/turf/open/floor/plasteel/dark/snowdin
|
||||
initial_gas_mix = "o2=22;n2=82;TEMP=180"
|
||||
initial_gas_mix = FROZEN_ATMOS
|
||||
planetary_atmos = 1
|
||||
temperature = 180
|
||||
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
#define PRINTER_TIMEOUT 10
|
||||
|
||||
|
||||
|
||||
/obj/machinery/computer/bounty
|
||||
name = "Nanotrasen bounty console"
|
||||
desc = "Used to check and claim bounties offered by Nanotrasen"
|
||||
@@ -24,9 +26,9 @@
|
||||
for(var/datum/bounty/B in GLOB.bounties_list)
|
||||
if(B.claimed)
|
||||
continue
|
||||
info += "<h3>[B.name]</h3>"
|
||||
info += "<ul><li>Reward: [B.reward_string()]</li>"
|
||||
info += "<li>Completed: [B.completion_string()]</li></ul>"
|
||||
info += {"<h3>[B.name]</h3>
|
||||
<ul><li>Reward: [B.reward_string()]</li>
|
||||
<li>Completed: [B.completion_string()]</li></ul>"}
|
||||
|
||||
/obj/machinery/computer/bounty/ui_interact(mob/user)
|
||||
. = ..()
|
||||
@@ -34,39 +36,36 @@
|
||||
if(!GLOB.bounties_list.len)
|
||||
setup_bounties()
|
||||
|
||||
var/dat = ""
|
||||
dat += "<a href='?src=[REF(src)];refresh=1'>Refresh</a>"
|
||||
dat += "<a href='?src=[REF(src)];refresh=1;choice=Print'>Print Paper</a>"
|
||||
dat += "<p>Credits: <b>[SSshuttle.points]</b></p>"
|
||||
dat += {"<table style="text-align:center;" border="1" cellspacing="0" width="100%">"}
|
||||
dat += "<tr><th>Name</th><th>Description</th><th>Reward</th><th>Completion</th><th>Status</th></tr>"
|
||||
var/list/dat = list({"<a href='?src=[REF(src)];refresh=1'>Refresh</a>
|
||||
<a href='?src=[REF(src)];refresh=1;choice=Print'>Print Paper</a>
|
||||
<p>Credits: <b>[SSshuttle.points]</b></p>
|
||||
<table style="text-align:center;" border="1" cellspacing="0" width="100%">
|
||||
<tr><th>Name</th><th>Description</th><th>Reward</th><th>Completion</th><th>Status</th></tr>"})
|
||||
for(var/datum/bounty/B in GLOB.bounties_list)
|
||||
var/background
|
||||
if(B.can_claim())
|
||||
background = "'background-color:#4F7529;'"
|
||||
else if(B.claimed)
|
||||
background = "'background-color:#294675;'"
|
||||
if(B.claimed)
|
||||
dat += "<tr style='background-color:#294675;'>"
|
||||
else if(B.can_claim())
|
||||
dat += "<tr style='background-color:#4F7529;'>"
|
||||
else
|
||||
background = "'background-color:#990000;'"
|
||||
dat += "<tr style=[background]>"
|
||||
dat += "<tr style='background-color:#990000;'>"
|
||||
if(B.high_priority)
|
||||
dat += text("<td><b>[]</b></td>", B.name)
|
||||
dat += text("<td><b>High Priority:</b> []</td>", B.description)
|
||||
dat += text("<td><b>[]</b></td>", B.reward_string())
|
||||
dat += {"<td><b>[B.name]</b></td>
|
||||
<td><b>High Priority:</b> [B.description]</td>
|
||||
<td><b>[B.reward_string()]</b></td>"}
|
||||
else
|
||||
dat += text("<td>[]</td>", B.name)
|
||||
dat += text("<td>[]</td>", B.description)
|
||||
dat += text("<td>[]</td>", B.reward_string())
|
||||
dat += text("<td>[]</td>", B.completion_string())
|
||||
if(B.can_claim())
|
||||
dat += text("<td><A href='?src=[REF(src)];refresh=1;choice=Claim;d_rec=[REF(B)]'>Claim</a></td>")
|
||||
else if(B.claimed)
|
||||
dat += text("<td>Claimed</td>")
|
||||
dat += {"<td>[B.name]</td>
|
||||
<td>[B.description]</td>
|
||||
<td>[B.reward_string()]</td>"}
|
||||
dat += "<td>[B.completion_string()]</td>"
|
||||
if(B.claimed)
|
||||
dat += "<td>Claimed</td>"
|
||||
else if(B.can_claim())
|
||||
dat += "<td><A href='?src=[REF(src)];refresh=1;choice=Claim;d_rec=[REF(B)]'>Claim</a></td>"
|
||||
else
|
||||
dat += text("<td>Unclaimed</td>")
|
||||
dat += "<td>Unclaimed</td>"
|
||||
dat += "</tr>"
|
||||
dat += "</table>"
|
||||
|
||||
dat = dat.Join()
|
||||
var/datum/browser/popup = new(user, "bounties", "Nanotrasen Bounties", 700, 600)
|
||||
popup.set_content(dat)
|
||||
popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
|
||||
@@ -91,4 +90,3 @@
|
||||
playsound(src, "terminal_type", 25, 0)
|
||||
|
||||
updateUsrDialog()
|
||||
|
||||
|
||||
@@ -167,7 +167,7 @@
|
||||
if(ishuman(usr))
|
||||
var/mob/living/carbon/human/H = usr
|
||||
name = H.get_authentification_name()
|
||||
rank = H.get_assignment()
|
||||
rank = H.get_assignment(hand_first = TRUE)
|
||||
else if(issilicon(usr))
|
||||
name = usr.real_name
|
||||
rank = "Silicon"
|
||||
|
||||
@@ -156,7 +156,7 @@
|
||||
if(ishuman(usr))
|
||||
var/mob/living/carbon/human/H = usr
|
||||
name = H.get_authentification_name()
|
||||
rank = H.get_assignment()
|
||||
rank = H.get_assignment(hand_first = TRUE)
|
||||
else if(issilicon(usr))
|
||||
name = usr.real_name
|
||||
rank = "Silicon"
|
||||
|
||||
@@ -58,6 +58,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
var/inquisitive_ghost = 1
|
||||
var/allow_midround_antag = 1
|
||||
var/preferred_map = null
|
||||
var/preferred_chaos = null
|
||||
var/pda_style = MONO
|
||||
var/pda_color = "#808000"
|
||||
var/pda_skin = PDA_SKIN_ALT
|
||||
@@ -834,6 +835,12 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
dat += "<b>Screen Shake:</b> <a href='?_src_=prefs;preference=screenshake'>[(screenshake==100) ? "Full" : ((screenshake==0) ? "None" : "[screenshake]")]</a><br>"
|
||||
if (user && user.client && !user.client.prefs.screenshake==0)
|
||||
dat += "<b>Damage Screen Shake:</b> <a href='?_src_=prefs;preference=damagescreenshake'>[(damagescreenshake==1) ? "On" : ((damagescreenshake==0) ? "Off" : "Only when down")]</a><br>"
|
||||
var/p_chaos
|
||||
if (!preferred_chaos)
|
||||
p_chaos = "No preference"
|
||||
else
|
||||
p_chaos = preferred_chaos
|
||||
dat += "<b>Preferred Chaos Amount:</b> <a href='?_src_=prefs;preference=preferred_chaos;task=input'>[p_chaos]</a><br>"
|
||||
dat += "<br>"
|
||||
dat += "</td>"
|
||||
dat += "</tr></table>"
|
||||
@@ -1996,6 +2003,9 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
if (pickedmap)
|
||||
preferred_map = maplist[pickedmap]
|
||||
|
||||
if ("preferred_chaos")
|
||||
var/pickedchaos = input(user, "Choose your preferred level of chaos. This will help with dynamic threat level ratings.", "Character Preference") as null|anything in list(CHAOS_NONE,CHAOS_LOW,CHAOS_MED,CHAOS_HIGH,CHAOS_MAX)
|
||||
preferred_chaos = pickedchaos
|
||||
if ("clientfps")
|
||||
var/desiredfps = input(user, "Choose your desired fps. (0 = synced with server tick rate (currently:[world.fps]))", "Character Preference", clientfps) as null|num
|
||||
if (!isnull(desiredfps))
|
||||
@@ -2289,10 +2299,6 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
character.shirt_color = shirt_color
|
||||
character.socks_color = socks_color
|
||||
|
||||
|
||||
character.backbag = backbag
|
||||
character.jumpsuit_style = jumpsuit_style
|
||||
|
||||
var/datum/species/chosen_species
|
||||
if(!roundstart_checks || (pref_species.id in GLOB.roundstart_races))
|
||||
chosen_species = pref_species.type
|
||||
|
||||
@@ -183,6 +183,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
S["autostand"] >> autostand
|
||||
S["cit_toggles"] >> cit_toggles
|
||||
S["lewdchem"] >> lewdchem
|
||||
S["preferred_chaos"] >> preferred_chaos
|
||||
|
||||
|
||||
//try to fix any outdated data if necessary
|
||||
if(needs_update >= 0)
|
||||
@@ -278,6 +280,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
WRITE_FILE(S["autostand"], autostand)
|
||||
WRITE_FILE(S["cit_toggles"], cit_toggles)
|
||||
WRITE_FILE(S["lewdchem"], lewdchem)
|
||||
WRITE_FILE(S["preferred_chaos"], preferred_chaos)
|
||||
|
||||
return 1
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
|
||||
/obj/item/clothing/gloves/ComponentInitialize()
|
||||
. = ..()
|
||||
RegisterSignal(src, COMSIG_COMPONENT_CLEAN_ACT, /obj/item/clothing/gloves/clean_blood)
|
||||
RegisterSignal(src, COMSIG_COMPONENT_CLEAN_ACT, /atom.proc/clean_blood)
|
||||
|
||||
/obj/item/clothing/gloves/clean_blood(datum/source, strength)
|
||||
. = ..()
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
gloves = /obj/item/clothing/gloves/combat
|
||||
ears = /obj/item/radio/headset/headset_cent/alt
|
||||
|
||||
/datum/outfit/ert/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
|
||||
/datum/outfit/ert/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
|
||||
if(visualsOnly)
|
||||
return
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
/obj/item/gun/energy/e_gun=1)
|
||||
l_pocket = /obj/item/switchblade
|
||||
|
||||
/datum/outfit/ert/commander/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
|
||||
/datum/outfit/ert/commander/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
|
||||
..()
|
||||
|
||||
if(visualsOnly)
|
||||
@@ -46,7 +46,7 @@
|
||||
|
||||
/datum/outfit/ert/commander/alert
|
||||
name = "ERT Commander - Amber Alert"
|
||||
|
||||
|
||||
suit = /obj/item/clothing/suit/space/hardsuit/ert/alert
|
||||
glasses = /obj/item/clothing/glasses/thermal/eyepatch
|
||||
backpack_contents = list(/obj/item/storage/box/engineer=1,\
|
||||
@@ -76,7 +76,7 @@
|
||||
/obj/item/gun/energy/e_gun/stun=1,\
|
||||
/obj/item/melee/baton/loaded=1)
|
||||
|
||||
/datum/outfit/ert/security/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
|
||||
/datum/outfit/ert/security/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
|
||||
..()
|
||||
|
||||
if(visualsOnly)
|
||||
@@ -88,7 +88,7 @@
|
||||
|
||||
/datum/outfit/ert/security/alert
|
||||
name = "ERT Security - Amber Alert"
|
||||
|
||||
|
||||
suit = /obj/item/clothing/suit/space/hardsuit/ert/alert/sec
|
||||
backpack_contents = list(/obj/item/storage/box/engineer=1,\
|
||||
/obj/item/storage/box/handcuffs=1,\
|
||||
@@ -120,7 +120,7 @@
|
||||
/obj/item/reagent_containers/hypospray/combat=1,\
|
||||
/obj/item/gun/medbeam=1)
|
||||
|
||||
/datum/outfit/ert/medic/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
|
||||
/datum/outfit/ert/medic/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
|
||||
..()
|
||||
|
||||
if(visualsOnly)
|
||||
@@ -166,7 +166,7 @@
|
||||
/obj/item/gun/energy/e_gun=1,\
|
||||
/obj/item/construction/rcd/loaded=1)
|
||||
|
||||
/datum/outfit/ert/engineer/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
|
||||
/datum/outfit/ert/engineer/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
|
||||
..()
|
||||
|
||||
if(visualsOnly)
|
||||
@@ -214,7 +214,7 @@
|
||||
l_hand = /obj/item/storage/toolbox/plastitanium
|
||||
gloves = /obj/item/clothing/gloves/color/yellow
|
||||
|
||||
/datum/outfit/ert/greybois/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
|
||||
/datum/outfit/ert/greybois/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
|
||||
if(visualsOnly)
|
||||
return
|
||||
var/obj/item/card/id/W = H.wear_id
|
||||
@@ -238,7 +238,7 @@
|
||||
l_hand = /obj/item/clipboard
|
||||
id = /obj/item/card/id
|
||||
|
||||
/datum/outfit/centcom_official/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
|
||||
/datum/outfit/centcom_official/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
|
||||
if(visualsOnly)
|
||||
return
|
||||
|
||||
@@ -288,7 +288,7 @@
|
||||
/obj/item/reagent_containers/hypospray/combat/heresypurge=1,
|
||||
/obj/item/gun/medbeam=1)
|
||||
|
||||
/datum/outfit/ert/chaplain/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
|
||||
/datum/outfit/ert/chaplain/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
|
||||
..()
|
||||
|
||||
if(visualsOnly)
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
belt = /obj/item/tank/internals/emergency_oxygen/double
|
||||
id = /obj/item/card/id/gold
|
||||
|
||||
/datum/outfit/santa/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
|
||||
/datum/outfit/santa/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
|
||||
if(visualsOnly)
|
||||
return
|
||||
H.fully_replace_character_name(H.real_name, "Santa Claus")
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
l_pocket = /obj/item/grenade/chem_grenade/cleaner
|
||||
backpack_contents = list(/obj/item/stack/tile/plasteel=6)
|
||||
|
||||
/datum/outfit/tournament/janitor/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
|
||||
/datum/outfit/tournament/janitor/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
|
||||
if(visualsOnly)
|
||||
return
|
||||
|
||||
@@ -97,7 +97,7 @@
|
||||
/datum/outfit/pirate/space/captain
|
||||
head = /obj/item/clothing/head/helmet/space/pirate
|
||||
|
||||
/datum/outfit/pirate/post_equip(mob/living/carbon/human/H)
|
||||
/datum/outfit/pirate/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
|
||||
H.faction |= "pirate"
|
||||
|
||||
var/obj/item/radio/R = H.ears
|
||||
@@ -125,7 +125,7 @@
|
||||
id = /obj/item/card/id
|
||||
r_hand = /obj/item/twohanded/fireaxe
|
||||
|
||||
/datum/outfit/tunnel_clown/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
|
||||
/datum/outfit/tunnel_clown/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
|
||||
if(visualsOnly)
|
||||
return
|
||||
|
||||
@@ -150,7 +150,7 @@
|
||||
r_pocket = /obj/item/scalpel
|
||||
r_hand = /obj/item/twohanded/fireaxe
|
||||
|
||||
/datum/outfit/psycho/post_equip(mob/living/carbon/human/H)
|
||||
/datum/outfit/psycho/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
|
||||
for(var/obj/item/carried_item in H.get_equipped_items(TRUE))
|
||||
carried_item.add_mob_blood(H)//Oh yes, there will be blood...
|
||||
for(var/obj/item/I in H.held_items)
|
||||
@@ -170,7 +170,7 @@
|
||||
id = /obj/item/card/id/syndicate
|
||||
belt = /obj/item/pda/heads
|
||||
|
||||
/datum/outfit/assassin/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
|
||||
/datum/outfit/assassin/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
|
||||
var/obj/item/clothing/under/U = H.w_uniform
|
||||
U.attach_accessory(new /obj/item/clothing/accessory/waistcoat(H))
|
||||
|
||||
@@ -216,7 +216,7 @@
|
||||
back = /obj/item/storage/backpack/satchel/leather
|
||||
id = /obj/item/card/id
|
||||
|
||||
/datum/outfit/centcom_commander/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
|
||||
/datum/outfit/centcom_commander/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
|
||||
if(visualsOnly)
|
||||
return
|
||||
|
||||
@@ -244,7 +244,7 @@
|
||||
back = /obj/item/storage/backpack/satchel/leather
|
||||
id = /obj/item/card/id
|
||||
|
||||
/datum/outfit/spec_ops/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
|
||||
/datum/outfit/spec_ops/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
|
||||
if(visualsOnly)
|
||||
return
|
||||
|
||||
@@ -283,7 +283,7 @@
|
||||
back = /obj/item/storage/backpack
|
||||
backpack_contents = list(/obj/item/storage/box=1)
|
||||
|
||||
/datum/outfit/wizard/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
|
||||
/datum/outfit/wizard/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
|
||||
if(visualsOnly)
|
||||
return
|
||||
|
||||
@@ -325,7 +325,7 @@
|
||||
|
||||
id = /obj/item/card/id
|
||||
|
||||
/datum/outfit/soviet/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
|
||||
/datum/outfit/soviet/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
|
||||
if(visualsOnly)
|
||||
return
|
||||
|
||||
@@ -349,7 +349,7 @@
|
||||
r_hand = /obj/item/gun/ballistic/automatic/tommygun
|
||||
id = /obj/item/card/id
|
||||
|
||||
/datum/outfit/mobster/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
|
||||
/datum/outfit/mobster/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
|
||||
if(visualsOnly)
|
||||
return
|
||||
|
||||
@@ -391,7 +391,7 @@
|
||||
/obj/item/flashlight=1,\
|
||||
/obj/item/grenade/plastic/x4=1)
|
||||
|
||||
/datum/outfit/death_commando/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
|
||||
/datum/outfit/death_commando/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
|
||||
if(visualsOnly)
|
||||
return
|
||||
|
||||
|
||||
@@ -5,10 +5,10 @@
|
||||
ears = /obj/item/radio/headset
|
||||
id = /obj/item/card/id
|
||||
|
||||
/datum/outfit/vr/pre_equip(mob/living/carbon/human/H)
|
||||
/datum/outfit/vr/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
|
||||
H.dna.species.before_equip_job(null, H)
|
||||
|
||||
/datum/outfit/vr/post_equip(mob/living/carbon/human/H)
|
||||
/datum/outfit/vr/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
|
||||
var/obj/item/card/id/id = H.wear_id
|
||||
if (istype(id))
|
||||
id.access |= get_all_accesses()
|
||||
@@ -25,9 +25,10 @@
|
||||
backpack_contents = list(/obj/item/storage/box/syndie=1,\
|
||||
/obj/item/kitchen/knife/combat/survival)
|
||||
|
||||
/datum/outfit/vr/syndicate/post_equip(mob/living/carbon/human/H)
|
||||
/datum/outfit/vr/syndicate/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
|
||||
. = ..()
|
||||
var/obj/item/uplink/U = new /obj/item/uplink/nuclear_restricted(H, H.key, 80)
|
||||
var/key = H.key ? H.key : preference_source ? preference_source.key : null
|
||||
var/obj/item/uplink/U = new /obj/item/uplink/nuclear_restricted(H, key, 80)
|
||||
H.equip_to_slot_or_del(U, SLOT_IN_BACKPACK)
|
||||
var/obj/item/implant/weapons_auth/W = new
|
||||
W.implant(H)
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
var/list/vv_values
|
||||
var/list/stored_access
|
||||
|
||||
/datum/outfit/varedit/pre_equip(mob/living/carbon/human/H, visualsOnly)
|
||||
/datum/outfit/varedit/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
|
||||
H.delete_equipment() //Applying VV to wrong objects is not reccomended.
|
||||
. = ..()
|
||||
|
||||
@@ -120,7 +120,7 @@
|
||||
GLOB.custom_outfits += O
|
||||
to_chat(usr,"Outfit registered, use select equipment to equip it.")
|
||||
|
||||
/datum/outfit/varedit/post_equip(mob/living/carbon/human/H, visualsOnly)
|
||||
/datum/outfit/varedit/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
|
||||
. = ..()
|
||||
//Apply VV
|
||||
for(var/slot in vv_values)
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
|
||||
/obj/item/clothing/shoes/ComponentInitialize()
|
||||
. = ..()
|
||||
RegisterSignal(src, COMSIG_COMPONENT_CLEAN_ACT, /obj/item/clothing/shoes/clean_blood)
|
||||
RegisterSignal(src, COMSIG_COMPONENT_CLEAN_ACT, /atom.proc/clean_blood)
|
||||
|
||||
/obj/item/clothing/shoes/suicide_act(mob/living/carbon/user)
|
||||
if(rand(2)>1)
|
||||
|
||||
@@ -519,6 +519,16 @@
|
||||
/obj/item/clothing/head/hooded/winterhood/captain
|
||||
icon_state = "winterhood_captain"
|
||||
|
||||
/obj/item/clothing/suit/hooded/wintercoat/hop
|
||||
name = "head of personnel's winter coat"
|
||||
icon_state = "coathop"
|
||||
item_state = "coathop"
|
||||
armor = list("melee" = 5, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 5, "bio" = 5, "rad" = 0, "fire" = 0, "acid" = 5)
|
||||
hoodtype = /obj/item/clothing/head/hooded/winterhood/hop
|
||||
|
||||
/obj/item/clothing/head/hooded/winterhood/hop
|
||||
icon_state = "winterhood_hop"
|
||||
|
||||
/obj/item/clothing/suit/hooded/wintercoat/security
|
||||
name = "security winter coat"
|
||||
icon_state = "coatsecurity"
|
||||
@@ -533,6 +543,20 @@
|
||||
/obj/item/clothing/head/hooded/winterhood/security
|
||||
icon_state = "winterhood_security"
|
||||
|
||||
/obj/item/clothing/suit/hooded/wintercoat/hos
|
||||
name = "head of security's winter coat"
|
||||
icon_state = "coathos"
|
||||
item_state = "coathos"
|
||||
armor = list("melee" = 35, "bullet" = 35, "laser" = 35, "energy" = 15, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 55)
|
||||
hoodtype = /obj/item/clothing/head/hooded/winterhood/hos
|
||||
|
||||
/obj/item/clothing/suit/hooded/wintercoat/hos/Initialize()
|
||||
. = ..()
|
||||
allowed = GLOB.security_wintercoat_allowed
|
||||
|
||||
/obj/item/clothing/head/hooded/winterhood/hos
|
||||
icon_state = "winterhood_hos"
|
||||
|
||||
/obj/item/clothing/suit/hooded/wintercoat/medical
|
||||
name = "medical winter coat"
|
||||
icon_state = "coatmedical"
|
||||
@@ -544,6 +568,39 @@
|
||||
/obj/item/clothing/head/hooded/winterhood/medical
|
||||
icon_state = "winterhood_medical"
|
||||
|
||||
/obj/item/clothing/suit/hooded/wintercoat/cmo
|
||||
name = "chief medical officer's winter coat"
|
||||
icon_state = "coatcmo"
|
||||
item_state = "coatcmo"
|
||||
allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
|
||||
armor = list("melee" = 5, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 50, "rad" = 0, "fire" = 0, "acid" = 0)
|
||||
hoodtype = /obj/item/clothing/head/hooded/winterhood/cmo
|
||||
|
||||
/obj/item/clothing/head/hooded/winterhood/cmo
|
||||
icon_state = "winterhood_cmo"
|
||||
|
||||
/obj/item/clothing/suit/hooded/wintercoat/chemistry
|
||||
name = "chemistry winter coat"
|
||||
icon_state = "coatchemistry"
|
||||
item_state = "coatchemistry"
|
||||
allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 30, "rad" = 0, "fire" = 30, "acid" = 45)
|
||||
hoodtype = /obj/item/clothing/head/hooded/winterhood/chemistry
|
||||
|
||||
/obj/item/clothing/head/hooded/winterhood/chemistry
|
||||
icon_state = "winterhood_chemistry"
|
||||
|
||||
/obj/item/clothing/suit/hooded/wintercoat/viro
|
||||
name = "virology winter coat"
|
||||
icon_state = "coatviro"
|
||||
item_state = "coatviro"
|
||||
allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 30, "rad" = 0, "fire" = 0, "acid" = 0)
|
||||
hoodtype = /obj/item/clothing/head/hooded/winterhood/viro
|
||||
|
||||
/obj/item/clothing/head/hooded/winterhood/viro
|
||||
icon_state = "winterhood_viro"
|
||||
|
||||
/obj/item/clothing/suit/hooded/wintercoat/science
|
||||
name = "science winter coat"
|
||||
icon_state = "coatscience"
|
||||
@@ -555,6 +612,49 @@
|
||||
/obj/item/clothing/head/hooded/winterhood/science
|
||||
icon_state = "winterhood_science"
|
||||
|
||||
/obj/item/clothing/suit/hooded/wintercoat/robotics
|
||||
name = "robotics winter coat"
|
||||
icon_state = "coatrobotics"
|
||||
item_state = "coatrobotics"
|
||||
allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/screwdriver, /obj/item/crowbar, /obj/item/wrench, /obj/item/stack/cable_coil, /obj/item/weldingtool, /obj/item/multitool)
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
|
||||
hoodtype = /obj/item/clothing/head/hooded/winterhood/robotics
|
||||
|
||||
/obj/item/clothing/head/hooded/winterhood/robotics
|
||||
icon_state = "winterhood_robotics"
|
||||
|
||||
/obj/item/clothing/suit/hooded/wintercoat/genetics
|
||||
name = "genetics winter coat"
|
||||
icon_state = "coatgenetics"
|
||||
item_state = "coatgenetics"
|
||||
allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
|
||||
hoodtype = /obj/item/clothing/head/hooded/winterhood/genetics
|
||||
|
||||
/obj/item/clothing/head/hooded/winterhood/genetics
|
||||
icon_state = "winterhood_genetics"
|
||||
|
||||
/obj/item/clothing/suit/hooded/wintercoat/rd
|
||||
name = "research director's winter coat"
|
||||
icon_state = "coatrd"
|
||||
item_state = "coatrd"
|
||||
allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 5,"energy" = 0, "bomb" = 15, "bio" = 5, "rad" = 5, "fire" = 0, "acid" = 0)
|
||||
hoodtype = /obj/item/clothing/head/hooded/winterhood/rd
|
||||
|
||||
/obj/item/clothing/head/hooded/winterhood/rd
|
||||
icon_state = "winterhood_rd"
|
||||
|
||||
/obj/item/clothing/suit/hooded/wintercoat/ce
|
||||
name = "chief engineer's winter coat"
|
||||
icon_state = "coatce"
|
||||
item_state = "coatce"
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 5, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 30, "fire" = 35, "acid" = 45)
|
||||
allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/t_scanner, /obj/item/construction/rcd, /obj/item/pipe_dispenser, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter)
|
||||
hoodtype = /obj/item/clothing/head/hooded/winterhood/ce
|
||||
|
||||
/obj/item/clothing/head/hooded/winterhood/ce
|
||||
icon_state = "winterhood_ce"
|
||||
|
||||
/obj/item/clothing/suit/hooded/wintercoat/engineering
|
||||
name = "engineering winter coat"
|
||||
icon_state = "coatengineer"
|
||||
@@ -585,6 +685,26 @@
|
||||
/obj/item/clothing/head/hooded/winterhood/hydro
|
||||
icon_state = "winterhood_hydro"
|
||||
|
||||
/obj/item/clothing/suit/hooded/wintercoat/cosmic
|
||||
name = "cosmic winter coat"
|
||||
icon_state = "coatcosmic"
|
||||
item_state = "coatcosmic"
|
||||
allowed = list(/obj/item/flashlight)
|
||||
hoodtype = /obj/item/clothing/head/hooded/winterhood/cosmic
|
||||
|
||||
/obj/item/clothing/head/hooded/winterhood/cosmic
|
||||
icon_state = "winterhood_cosmic"
|
||||
|
||||
/obj/item/clothing/suit/hooded/wintercoat/janitor
|
||||
name = "janitors winter coat"
|
||||
icon_state = "coatjanitor"
|
||||
item_state = "coatjanitor"
|
||||
allowed = list(/obj/item/toy, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/storage/fancy/cigarettes, /obj/item/lighter,/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/melee/flyswatter,/obj/item/paint/paint_remover,/obj/item/storage/bag/trash,/obj/item/reagent_containers/glass/bucket)
|
||||
hoodtype = /obj/item/clothing/head/hooded/winterhood/janitor
|
||||
|
||||
/obj/item/clothing/head/hooded/winterhood/janitor
|
||||
icon_state = "winterhood_janitor"
|
||||
|
||||
/obj/item/clothing/suit/hooded/wintercoat/cargo
|
||||
name = "cargo winter coat"
|
||||
icon_state = "coatcargo"
|
||||
@@ -594,6 +714,15 @@
|
||||
/obj/item/clothing/head/hooded/winterhood/cargo
|
||||
icon_state = "winterhood_cargo"
|
||||
|
||||
/obj/item/clothing/suit/hooded/wintercoat/qm
|
||||
name = "quartermaster's winter coat"
|
||||
icon_state = "coatqm"
|
||||
item_state = "coatqm"
|
||||
hoodtype = /obj/item/clothing/head/hooded/winterhood/qm
|
||||
|
||||
/obj/item/clothing/head/hooded/winterhood/qm
|
||||
icon_state = "winterhood_qm"
|
||||
|
||||
/obj/item/clothing/suit/hooded/wintercoat/miner
|
||||
name = "mining winter coat"
|
||||
icon_state = "coatminer"
|
||||
@@ -636,7 +765,7 @@
|
||||
|
||||
/obj/item/clothing/suit/assu_suit
|
||||
name = "DAB suit"
|
||||
desc = "A cheap replica of old SWAT armor. On its back, it is written: \"<i>Desperate Assistance Battle-force</i>\"."
|
||||
desc = "A cheap replica of old SWAT armor. On its back, it is written: \"<i>Desperate Assistance Battleforce</i>\"."
|
||||
icon_state = "assu_suit"
|
||||
item_state = "assu_suit"
|
||||
blood_overlay_type = "armor"
|
||||
|
||||
@@ -158,3 +158,31 @@
|
||||
time = 50
|
||||
always_availible = TRUE
|
||||
category = CAT_CLOTHING
|
||||
|
||||
/datum/crafting_recipe/wintercoat_cosmic
|
||||
name = "Cosmic Winter Coat"
|
||||
result = /obj/item/clothing/suit/hooded/wintercoat/cosmic
|
||||
reqs = list(/obj/item/clothing/suit/hooded/wintercoat = 1,
|
||||
/obj/item/clothing/suit/hooded/wintercoat/captain = 1,
|
||||
/obj/item/clothing/suit/hooded/wintercoat/hop = 1,
|
||||
/obj/item/clothing/suit/hooded/wintercoat/hos = 1,
|
||||
/obj/item/clothing/suit/hooded/wintercoat/rd = 1,
|
||||
/obj/item/clothing/suit/hooded/wintercoat/ce = 1,
|
||||
/obj/item/clothing/suit/hooded/wintercoat/cmo = 1,
|
||||
/obj/item/clothing/suit/hooded/wintercoat/qm = 1,
|
||||
/obj/item/clothing/suit/hooded/wintercoat/robotics = 1,
|
||||
/obj/item/clothing/suit/hooded/wintercoat/engineering/atmos = 1,
|
||||
/obj/item/clothing/suit/hooded/wintercoat/engineering = 1,
|
||||
/obj/item/clothing/suit/hooded/wintercoat/science = 1,
|
||||
/obj/item/clothing/suit/hooded/wintercoat/genetics = 1,
|
||||
/obj/item/clothing/suit/hooded/wintercoat/chemistry = 1,
|
||||
/obj/item/clothing/suit/hooded/wintercoat/medical = 1,
|
||||
/obj/item/clothing/suit/hooded/wintercoat/viro = 1,
|
||||
/obj/item/clothing/suit/hooded/wintercoat/janitor = 1,
|
||||
/obj/item/clothing/suit/hooded/wintercoat/security = 1,
|
||||
/obj/item/clothing/suit/hooded/wintercoat/cargo = 1,
|
||||
/obj/item/clothing/suit/hooded/wintercoat/hydro = 1,
|
||||
/obj/item/clothing/suit/hooded/wintercoat/miner = 1)
|
||||
time = 60
|
||||
always_availible = TRUE
|
||||
category = CAT_CLOTHING
|
||||
|
||||
@@ -34,6 +34,7 @@
|
||||
|
||||
/datum/round_event_control/wizard
|
||||
wizardevent = 1
|
||||
var/can_be_midround_wizard = TRUE
|
||||
|
||||
// Checks if the event can be spawned. Used by event controller and "false alarm" event.
|
||||
// Admin-created events override this.
|
||||
@@ -54,6 +55,13 @@
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/datum/round_event_control/wizard/canSpawnEvent(var/players_amt, var/gamemode)
|
||||
if(istype(SSticker.mode, /datum/game_mode/dynamic))
|
||||
var/var/datum/game_mode/dynamic/mode = SSticker.mode
|
||||
if (locate(/datum/dynamic_ruleset/midround/from_ghosts/wizard) in mode.executed_rules)
|
||||
return can_be_midround_wizard && ..()
|
||||
return ..()
|
||||
|
||||
/datum/round_event_control/proc/preRunEvent()
|
||||
if(!ispath(typepath, /datum/round_event))
|
||||
return EVENT_CANT_RUN
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
weight = 10
|
||||
max_occurrences = 1
|
||||
min_players = 20
|
||||
gamemode_blacklist = list("nuclear","wizard","revolution")
|
||||
gamemode_blacklist = list("nuclear","wizard","revolution","dynamic")
|
||||
|
||||
/datum/round_event/ghost_role/abductor
|
||||
minimum_required = 2
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
name = "Alien Infestation"
|
||||
typepath = /datum/round_event/ghost_role/alien_infestation
|
||||
weight = 5
|
||||
|
||||
gamemode_blacklist = list("dynamic")
|
||||
min_players = 10
|
||||
max_occurrences = 1
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
typepath = /datum/round_event/anomaly/anomaly_bluespace
|
||||
max_occurrences = 1
|
||||
weight = 5
|
||||
gamemode_blacklist = list("dynamic")
|
||||
|
||||
/datum/round_event/anomaly/anomaly_bluespace
|
||||
startWhen = 3
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
min_players = 10
|
||||
max_occurrences = 5
|
||||
weight = 20
|
||||
gamemode_blacklist = list("dynamic")
|
||||
|
||||
/datum/round_event/anomaly/anomaly_flux
|
||||
startWhen = 10
|
||||
|
||||
@@ -3,6 +3,8 @@
|
||||
typepath = /datum/round_event/anomaly/anomaly_grav
|
||||
max_occurrences = 5
|
||||
weight = 20
|
||||
gamemode_blacklist = list("dynamic")
|
||||
|
||||
|
||||
/datum/round_event/anomaly/anomaly_grav
|
||||
startWhen = 3
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
typepath = /datum/round_event/anomaly/anomaly_pyro
|
||||
max_occurrences = 5
|
||||
weight = 20
|
||||
gamemode_blacklist = list("dynamic")
|
||||
|
||||
/datum/round_event/anomaly/anomaly_pyro
|
||||
startWhen = 3
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
min_players = 20
|
||||
max_occurrences = 2
|
||||
weight = 5
|
||||
gamemode_blacklist = list("dynamic")
|
||||
|
||||
/datum/round_event/anomaly/anomaly_vortex
|
||||
startWhen = 10
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
earliest_start = 40 MINUTES
|
||||
min_players = 35
|
||||
|
||||
gamemode_blacklist = list("blob") //Just in case a blob survives that long
|
||||
gamemode_blacklist = list("blob","dynamic") //Just in case a blob survives that long
|
||||
|
||||
/datum/round_event/ghost_role/blob
|
||||
announceWhen = -1
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
|
||||
min_players = 15
|
||||
max_occurrences = 1
|
||||
gamemode_blacklist = list("dynamic")
|
||||
|
||||
/datum/round_event/brand_intelligence
|
||||
announceWhen = 21
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
min_players = 2
|
||||
earliest_start = 10 MINUTES
|
||||
max_occurrences = 6
|
||||
gamemode_blacklist = list("dynamic")
|
||||
|
||||
/datum/round_event/carp_migration
|
||||
announceWhen = 3
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
name = "Communications Blackout"
|
||||
typepath = /datum/round_event/communications_blackout
|
||||
weight = 30
|
||||
gamemode_blacklist = list("dynamic")
|
||||
|
||||
/datum/round_event/communications_blackout
|
||||
announceWhen = 1
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
max_occurrences = 1000
|
||||
earliest_start = 0 MINUTES
|
||||
alertadmins = 0
|
||||
gamemode_blacklist = list("dynamic")
|
||||
|
||||
/datum/round_event/space_dust
|
||||
startWhen = 1
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
min_players = 5
|
||||
weight = 40
|
||||
alertadmins = 0
|
||||
gamemode_blacklist = list("dynamic")
|
||||
|
||||
/datum/round_event/electrical_storm
|
||||
var/lightsoutAmount = 1
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
weight = 20
|
||||
max_occurrences = 2
|
||||
min_players = 40 // To avoid shafting lowpop
|
||||
gamemode_blacklist = list("dynamic")
|
||||
|
||||
/datum/round_event/heart_attack/start()
|
||||
var/list/heart_attack_contestants = list()
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
/datum/round_event_control/ion_storm
|
||||
name = "Ion Storm"
|
||||
typepath = /datum/round_event/ion_storm
|
||||
gamemode_blacklist = list("dynamic")
|
||||
weight = 15
|
||||
min_players = 2
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
name = "Major Space Dust"
|
||||
typepath = /datum/round_event/meteor_wave/major_dust
|
||||
weight = 8
|
||||
gamemode_blacklist = list("dynamic")
|
||||
|
||||
/datum/round_event/meteor_wave/major_dust
|
||||
wave_name = "space dust"
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
min_players = 15
|
||||
max_occurrences = 3
|
||||
earliest_start = 25 MINUTES
|
||||
gamemode_blacklist = list("dynamic")
|
||||
|
||||
/datum/round_event/meteor_wave
|
||||
startWhen = 6
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
name = "Spawn Nightmare"
|
||||
typepath = /datum/round_event/ghost_role/nightmare
|
||||
max_occurrences = 1
|
||||
gamemode_blacklist = list("dynamic")
|
||||
min_players = 20
|
||||
|
||||
/datum/round_event/ghost_role/nightmare
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
max_occurrences = 1
|
||||
min_players = 10
|
||||
earliest_start = 30 MINUTES
|
||||
gamemode_blacklist = list("nuclear")
|
||||
gamemode_blacklist = list("nuclear","dynamic")
|
||||
|
||||
/datum/round_event_control/pirates/preRunEvent()
|
||||
if (!SSmapping.empty_space)
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
typepath = /datum/round_event/processor_overload
|
||||
weight = 15
|
||||
min_players = 20
|
||||
gamemode_blacklist = list("dynamic")
|
||||
|
||||
/datum/round_event/processor_overload
|
||||
announceWhen = 1
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
name = "Radiation Storm"
|
||||
typepath = /datum/round_event/radiation_storm
|
||||
max_occurrences = 1
|
||||
gamemode_blacklist = list("dynamic")
|
||||
|
||||
/datum/round_event/radiation_storm
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
name = "Spider Infestation"
|
||||
typepath = /datum/round_event/spider_infestation
|
||||
weight = 5
|
||||
gamemode_blacklist = list("dynamic")
|
||||
max_occurrences = 1
|
||||
min_players = 15
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
typepath = /datum/round_event/vent_clog
|
||||
weight = 10
|
||||
max_occurrences = 3
|
||||
gamemode_blacklist = list("dynamic")
|
||||
min_players = 25
|
||||
|
||||
/datum/round_event/vent_clog
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
typepath = /datum/round_event/wizard/cursed_items
|
||||
max_occurrences = 3
|
||||
earliest_start = 0 MINUTES
|
||||
can_be_midround_wizard = FALSE
|
||||
|
||||
//Note about adding items to this: Because of how NODROP_1 works if an item spawned to the hands can also be equiped to a slot
|
||||
//it will be able to be put into that slot from the hand, but then get stuck there. To avoid this make a new subtype of any
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
typepath = /datum/round_event/wizard/deprevolt
|
||||
max_occurrences = 1
|
||||
earliest_start = 0 MINUTES
|
||||
can_be_midround_wizard = FALSE // not removing it completely yet
|
||||
|
||||
/datum/round_event/wizard/deprevolt/start()
|
||||
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
typepath = /datum/round_event/wizard/race
|
||||
max_occurrences = 5
|
||||
earliest_start = 0 MINUTES
|
||||
can_be_midround_wizard = FALSE
|
||||
|
||||
/datum/round_event/wizard/race
|
||||
var/list/stored_name
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
typepath = /datum/round_event/wizard/shuffleloc
|
||||
max_occurrences = 5
|
||||
earliest_start = 0 MINUTES
|
||||
can_be_midround_wizard = FALSE // not removing it completely yet
|
||||
|
||||
/datum/round_event/wizard/shuffleloc/start()
|
||||
var/list/moblocs = list()
|
||||
@@ -43,6 +44,7 @@
|
||||
typepath = /datum/round_event/wizard/shufflenames
|
||||
max_occurrences = 5
|
||||
earliest_start = 0 MINUTES
|
||||
can_be_midround_wizard = FALSE // not removing it completely yet
|
||||
|
||||
/datum/round_event/wizard/shufflenames/start()
|
||||
var/list/mobnames = list()
|
||||
@@ -77,6 +79,7 @@
|
||||
typepath = /datum/round_event/wizard/shuffleminds
|
||||
max_occurrences = 3
|
||||
earliest_start = 0 MINUTES
|
||||
can_be_midround_wizard = FALSE // not removing it completely yet
|
||||
|
||||
/datum/round_event/wizard/shuffleminds/start()
|
||||
var/list/mobs = list()
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
typepath = /datum/round_event/wizard/summonguns
|
||||
max_occurrences = 1
|
||||
earliest_start = 0 MINUTES
|
||||
can_be_midround_wizard = FALSE // not removing it completely yet
|
||||
|
||||
/datum/round_event_control/wizard/summonguns/New()
|
||||
if(CONFIG_GET(flag/no_summon_guns))
|
||||
@@ -19,6 +20,7 @@
|
||||
typepath = /datum/round_event/wizard/summonmagic
|
||||
max_occurrences = 1
|
||||
earliest_start = 0 MINUTES
|
||||
can_be_midround_wizard = FALSE // not removing it completely yet
|
||||
|
||||
/datum/round_event_control/wizard/summonmagic/New()
|
||||
if(CONFIG_GET(flag/no_summon_magic))
|
||||
|
||||
@@ -546,3 +546,10 @@ Since Ramadan is an entire month that lasts 29.5 days on average, the start and
|
||||
|
||||
/datum/holiday/easter/getStationPrefix()
|
||||
return pick("Fluffy","Bunny","Easter","Egg")
|
||||
|
||||
//Random citadel thing for halloween species
|
||||
/proc/force_enable_halloween_species()
|
||||
var/list/oldlist = SSevents.holidays
|
||||
SSevents.holidays = list(HALLOWEEN = new /datum/holiday/halloween)
|
||||
generate_selectable_species(FALSE)
|
||||
SSevents.holidays = oldlist
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
|
||||
/turf/open/floor/holofloor/plating/burnmix
|
||||
name = "burn-mix floor"
|
||||
initial_gas_mix = "o2=2500;plasma=5000;TEMP=370"
|
||||
initial_gas_mix = BURNMIX_ATMOS
|
||||
|
||||
/turf/open/floor/holofloor/grass
|
||||
gender = PLURAL
|
||||
|
||||
@@ -35,6 +35,12 @@
|
||||
/obj/item/proc/GetID()
|
||||
return null
|
||||
|
||||
/obj/item/proc/RemoveID()
|
||||
return null
|
||||
|
||||
/obj/item/proc/InsertID()
|
||||
return FALSE
|
||||
|
||||
/obj/proc/text2access(access_text)
|
||||
. = list()
|
||||
if(!access_text)
|
||||
|
||||
@@ -101,8 +101,9 @@
|
||||
//Equip the rest of the gear
|
||||
H.dna.species.before_equip_job(src, H, visualsOnly)
|
||||
|
||||
if(outfit_override || outfit)
|
||||
H.equipOutfit(outfit_override ? outfit_override : outfit, visualsOnly)
|
||||
var/datum/outfit/job/O = outfit_override || outfit
|
||||
if(O)
|
||||
H.equipOutfit(O, visualsOnly, preference_source) //mob doesn't have a client yet.
|
||||
|
||||
H.dna.species.after_equip_job(src, H, visualsOnly)
|
||||
|
||||
@@ -177,8 +178,8 @@
|
||||
|
||||
var/pda_slot = SLOT_BELT
|
||||
|
||||
/datum/outfit/job/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
|
||||
switch(H.backbag)
|
||||
/datum/outfit/job/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
|
||||
switch(preference_source?.prefs.backbag)
|
||||
if(GBACKPACK)
|
||||
back = /obj/item/storage/backpack //Grey backpack
|
||||
if(GSATCHEL)
|
||||
@@ -196,7 +197,7 @@
|
||||
|
||||
//converts the uniform string into the path we'll wear, whether it's the skirt or regular variant
|
||||
var/holder
|
||||
if(H.jumpsuit_style == PREF_SKIRT)
|
||||
if(preference_source && preference_source.prefs.jumpsuit_style == PREF_SKIRT)
|
||||
holder = "[uniform]/skirt"
|
||||
if(!text2path(holder))
|
||||
holder = "[uniform]"
|
||||
@@ -204,7 +205,7 @@
|
||||
holder = "[uniform]"
|
||||
uniform = text2path(holder)
|
||||
|
||||
/datum/outfit/job/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
|
||||
/datum/outfit/job/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
|
||||
if(visualsOnly)
|
||||
return
|
||||
|
||||
@@ -232,6 +233,8 @@
|
||||
PDA.owner = H.real_name
|
||||
PDA.ownjob = J.title
|
||||
PDA.update_label()
|
||||
if(preference_source && !PDA.equipped) //PDA's screen color, font style and look depend on client preferences.
|
||||
PDA.update_style(preference_source)
|
||||
|
||||
/datum/outfit/job/get_chameleon_disguise_info()
|
||||
var/list/types = ..()
|
||||
|
||||
@@ -28,15 +28,16 @@ Assistant
|
||||
name = "Assistant"
|
||||
jobtype = /datum/job/assistant
|
||||
|
||||
/datum/outfit/job/assistant/pre_equip(mob/living/carbon/human/H)
|
||||
/datum/outfit/job/assistant/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
|
||||
..()
|
||||
var/suited = !preference_source || preference_source.prefs.jumpsuit_style == PREF_SUIT
|
||||
if (CONFIG_GET(flag/grey_assistants))
|
||||
if(H.jumpsuit_style == PREF_SUIT)
|
||||
if(suited)
|
||||
uniform = /obj/item/clothing/under/color/grey
|
||||
else
|
||||
uniform = /obj/item/clothing/under/skirt/color/grey
|
||||
else
|
||||
if(H.jumpsuit_style == PREF_SUIT)
|
||||
if(suited)
|
||||
uniform = /obj/item/clothing/under/color/random
|
||||
else
|
||||
uniform = /obj/item/clothing/under/skirt/color/random
|
||||
|
||||
@@ -16,11 +16,6 @@
|
||||
|
||||
display_order = JOB_DISPLAY_ORDER_CLOWN
|
||||
|
||||
|
||||
/datum/job/clown/after_spawn(mob/living/carbon/human/H, mob/M)
|
||||
. = ..()
|
||||
H.apply_pref_name("clown", M.client)
|
||||
|
||||
/datum/outfit/job/clown
|
||||
name = "Clown"
|
||||
jobtype = /datum/job/clown
|
||||
@@ -48,11 +43,15 @@
|
||||
|
||||
chameleon_extras = /obj/item/stamp/clown
|
||||
|
||||
/datum/outfit/job/clown/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
|
||||
/datum/outfit/job/clown/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
|
||||
..()
|
||||
if(visualsOnly)
|
||||
return
|
||||
|
||||
H.fully_replace_character_name(H.real_name, pick(GLOB.clown_names)) //rename the mob AFTER they're equipped so their ID gets updated properly.
|
||||
var/client/C = H.client || preference_source
|
||||
if(C)
|
||||
H.apply_pref_name("clown", C) //rename the mob AFTER they're equipped so their ID gets updated properly.
|
||||
else
|
||||
H.fully_replace_character_name(H.real_name, pick(GLOB.clown_names))
|
||||
H.dna.add_mutation(CLOWNMUT)
|
||||
H.dna.add_mutation(SMILE)
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
mask = /obj/item/clothing/mask/fakemoustache/italian
|
||||
backpack_contents = list(/obj/item/sharpener = 1)
|
||||
|
||||
/datum/outfit/job/cook/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
|
||||
/datum/outfit/job/cook/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
|
||||
..()
|
||||
var/datum/job/cook/J = SSjob.GetJobType(jobtype)
|
||||
if(J) // Fix for runtime caused by invalid job being passed
|
||||
@@ -39,7 +39,7 @@
|
||||
if(!visualsOnly)
|
||||
J.cooks++
|
||||
|
||||
/datum/outfit/job/cook/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
|
||||
/datum/outfit/job/cook/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
|
||||
..()
|
||||
if(visualsOnly)
|
||||
return
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
/obj/item/barcodescanner = 1
|
||||
)
|
||||
|
||||
/datum/outfit/job/curator/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
|
||||
/datum/outfit/job/curator/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
|
||||
..()
|
||||
|
||||
if(visualsOnly)
|
||||
|
||||
@@ -46,7 +46,7 @@
|
||||
|
||||
chameleon_extras = list(/obj/item/gun/ballistic/revolver/detective, /obj/item/clothing/glasses/sunglasses)
|
||||
|
||||
/datum/outfit/job/detective/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
|
||||
/datum/outfit/job/detective/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
|
||||
..()
|
||||
var/obj/item/clothing/mask/cigarette/cig = H.wear_mask
|
||||
if(istype(cig)) //Some species specfic changes can mess this up (plasmamen)
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
chameleon_extras = /obj/item/stamp/law
|
||||
|
||||
|
||||
/datum/outfit/job/lawyer/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
|
||||
/datum/outfit/job/lawyer/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
|
||||
..()
|
||||
if(visualsOnly)
|
||||
return
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
satchel = /obj/item/storage/backpack/mime
|
||||
|
||||
|
||||
/datum/outfit/job/mime/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
|
||||
/datum/outfit/job/mime/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
|
||||
..()
|
||||
|
||||
if(visualsOnly)
|
||||
@@ -47,3 +47,9 @@
|
||||
H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/mime/speak(null))
|
||||
H.mind.miming = 1
|
||||
|
||||
var/client/C = H.client || preference_source
|
||||
if(C)
|
||||
H.apply_pref_name("mime", C)
|
||||
else
|
||||
H.fully_replace_character_name(H.real_name, pick(GLOB.mime_names))
|
||||
|
||||
|
||||
@@ -64,7 +64,7 @@
|
||||
/obj/item/gun/energy/kinetic_accelerator=1,\
|
||||
/obj/item/stack/marker_beacon/ten=1)
|
||||
|
||||
/datum/outfit/job/miner/equipped/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
|
||||
/datum/outfit/job/miner/equipped/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
|
||||
..()
|
||||
if(visualsOnly)
|
||||
return
|
||||
|
||||
@@ -1,7 +1,4 @@
|
||||
/mob/living/carbon/human/key_down(_key, client/user)
|
||||
if("Shift")
|
||||
sprint_hotkey(TRUE)
|
||||
return
|
||||
if(client.keys_held["Shift"])
|
||||
switch(_key)
|
||||
if("E") // Put held thing in belt or take out most recent thing from belt
|
||||
@@ -59,6 +56,10 @@
|
||||
return
|
||||
stored.attack_hand(src) // take out thing from backpack
|
||||
return
|
||||
switch(_key)
|
||||
if("Shift")
|
||||
sprint_hotkey(TRUE)
|
||||
return
|
||||
return ..()
|
||||
|
||||
/mob/living/carbon/human/key_up(_key, client/user)
|
||||
|
||||
@@ -25,7 +25,6 @@
|
||||
max_matter = 600 //Bigger container and faster speeds due to being specialized and stationary.
|
||||
no_ammo_message = "<span class='warning'>Internal matter exhausted. Please add additional materials.</span>"
|
||||
delay_mod = 0.5
|
||||
adjacency_check = FALSE
|
||||
upgrade = TRUE
|
||||
var/obj/machinery/computer/camera_advanced/base_construction/console
|
||||
|
||||
@@ -207,19 +206,14 @@
|
||||
to_chat(owner, "Build mode is now [buildmode].")
|
||||
|
||||
/datum/action/innate/aux_base/airlock_type
|
||||
name = "Change Airlock Settings"
|
||||
name = "Select Airlock Type"
|
||||
button_icon_state = "airlock_select"
|
||||
|
||||
/datum/action/innate/aux_base/airlock_type/Activate()
|
||||
if(..())
|
||||
return
|
||||
|
||||
var/mode = alert("Modify Type or Access?", "Airlock Settings", "Type", "Access", "None")
|
||||
switch(mode)
|
||||
if("Type")
|
||||
B.RCD.change_airlock_setting(usr)
|
||||
if("Access")
|
||||
B.RCD.change_airlock_access(usr)
|
||||
B.RCD.change_airlock_access(usr)
|
||||
|
||||
|
||||
/datum/action/innate/aux_base/window_type
|
||||
|
||||
@@ -63,8 +63,7 @@
|
||||
|
||||
/obj/item/twohanded/kinetic_crusher/attack(mob/living/target, mob/living/carbon/user)
|
||||
if(!wielded)
|
||||
to_chat(user, "<span class='warning'>[src] is too heavy to use with one hand. You fumble and drop everything.")
|
||||
user.drop_all_held_items()
|
||||
to_chat(user, "<span class='warning'>[src] is too heavy to use with one hand.")
|
||||
return
|
||||
var/datum/status_effect/crusher_damage/C = target.has_status_effect(STATUS_EFFECT_CRUSHERDAMAGETRACKING)
|
||||
var/target_health = target.health
|
||||
|
||||
@@ -37,6 +37,9 @@
|
||||
new /obj/item/clothing/gloves/color/black(src)
|
||||
new /obj/item/clothing/gloves/color/black(src)
|
||||
new /obj/item/clothing/gloves/color/black(src)
|
||||
new /obj/item/clothing/suit/hooded/wintercoat/miner(src) //yes, even both mining locker types
|
||||
new /obj/item/clothing/suit/hooded/wintercoat/miner(src)
|
||||
new /obj/item/clothing/suit/hooded/wintercoat/miner(src)
|
||||
|
||||
/obj/structure/closet/secure_closet/miner
|
||||
name = "miner's equipment"
|
||||
@@ -61,6 +64,7 @@
|
||||
new /obj/item/clothing/glasses/meson(src)
|
||||
new /obj/item/survivalcapsule(src)
|
||||
new /obj/item/assault_pod/mining(src)
|
||||
new /obj/item/clothing/suit/hooded/wintercoat/miner(src) //because you know you want it
|
||||
|
||||
|
||||
/**********************Shuttle Computer**************************/
|
||||
|
||||
@@ -473,10 +473,7 @@
|
||||
var/free_space = 0
|
||||
for(var/list/category in list(GLOB.command_positions) + list(GLOB.supply_positions) + list(GLOB.engineering_positions) + list(GLOB.nonhuman_positions - "pAI") + list(GLOB.civilian_positions) + list(GLOB.medical_positions) + list(GLOB.science_positions) + list(GLOB.security_positions))
|
||||
var/cat_color = "fff" //random default
|
||||
if(SSjob.name_occupations && SSjob.name_occupations[category[1]])
|
||||
cat_color = SSjob.name_occupations[category[1]].selection_color //use the color of the first job in the category (the department head) as the category color
|
||||
else
|
||||
cat_color = SSjob.occupations[category[1]].selection_color
|
||||
cat_color = SSjob.name_occupations[category[1]].selection_color //use the color of the first job in the category (the department head) as the category color
|
||||
dat += "<fieldset style='width: 185px; border: 2px solid [cat_color]; display: inline'>"
|
||||
dat += "<legend align='center' style='color: [cat_color]'>[SSjob.name_occupations[category[1]].exp_type_department]</legend>"
|
||||
|
||||
|
||||
@@ -306,7 +306,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
if(stat == DEAD)
|
||||
ghostize(1)
|
||||
else
|
||||
var/response = alert(src, "Are you -sure- you want to ghost?\n(You are alive. If you ghost whilst alive you won't be able to re-enter this round [penalty ? "or play ghost roles [penalty != CANT_REENTER_ROUND ? "until the round is over" : "for the next [DisplayTimeText(penalty)]"]" : ""]! You can't change your mind so choose wisely!!)","Are you sure you want to ghost?","Ghost","Stay in body")
|
||||
var/response = alert(src, "Are you -sure- you want to ghost?\n(You are alive. If you ghost whilst alive you won't be able to re-enter this round [penalty ? "or play ghost roles [penalty == CANT_REENTER_ROUND ? "until the round is over" : "for the next [DisplayTimeText(penalty)]"]" : ""]! You can't change your mind so choose wisely!!)","Are you sure you want to ghost?","Ghost","Stay in body")
|
||||
if(response != "Ghost")
|
||||
return //didn't want to ghost after-all
|
||||
if(istype(loc, /obj/machinery/cryopod))
|
||||
@@ -331,7 +331,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
if(penalty + world.realtime - SSshuttle.realtimeofstart > SSshuttle.auto_call + SSshuttle.emergencyCallTime + SSshuttle.emergencyDockTime + SSshuttle.emergencyEscapeTime)
|
||||
penalty = CANT_REENTER_ROUND
|
||||
|
||||
var/response = alert(src, "Are you -sure- you want to ghost?\n(You are alive. If you ghost whilst alive you won't be able to re-enter this round [penalty ? "or play ghost roles [penalty != CANT_REENTER_ROUND ? "until the round is over" : "for the next [DisplayTimeText(penalty)]"]" : ""]! You can't change your mind so choose wisely!!)","Are you sure you want to ghost?","Ghost","Stay in body")
|
||||
var/response = alert(src, "Are you -sure- you want to ghost?\n(You are alive. If you ghost whilst alive you won't be able to re-enter this round [penalty ? "or play ghost roles [penalty == CANT_REENTER_ROUND ? "until the round is over" : "for the next [DisplayTimeText(penalty)]"]" : ""]! You can't change your mind so choose wisely!!)","Are you sure you want to ghost?","Ghost","Stay in body")
|
||||
if(response != "Ghost")
|
||||
return
|
||||
ghostize(0, penalize = TRUE)
|
||||
@@ -629,8 +629,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
set name = "Possess!"
|
||||
set desc= "Take over the body of a mindless creature!"
|
||||
|
||||
if(reenter_round_timeout > world.realtime)
|
||||
to_chat(src, "<span class='warning'>You are unable to re-enter the round yet. Your ghost role blacklist will expire in [DisplayTimeText(reenter_round_timeout - world.realtime)].</span>")
|
||||
if(!can_reenter_round())
|
||||
return FALSE
|
||||
|
||||
var/list/possessible = list()
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
var/datum/dna/stored/stored_dna // dna var for brain. Used to store dna, brain dna is not considered like actual dna, brain.has_dna() returns FALSE.
|
||||
stat = DEAD //we start dead by default
|
||||
see_invisible = SEE_INVISIBLE_LIVING
|
||||
possible_a_intents = list(INTENT_HELP, INTENT_HARM) //for mechas
|
||||
speech_span = SPAN_ROBOT
|
||||
|
||||
/mob/living/brain/Initialize()
|
||||
@@ -72,10 +73,9 @@
|
||||
|
||||
/mob/living/brain/ClickOn(atom/A, params)
|
||||
..()
|
||||
if(istype(loc, /obj/item/mmi))
|
||||
var/obj/item/mmi/MMI = loc
|
||||
var/obj/mecha/M = MMI.mecha
|
||||
if((src == MMI.brainmob) && istype(M))
|
||||
if(container)
|
||||
var/obj/mecha/M = container.mecha
|
||||
if(istype(M))
|
||||
return M.click_action(A,src,params)
|
||||
|
||||
/mob/living/brain/forceMove(atom/destination)
|
||||
@@ -90,3 +90,16 @@
|
||||
doMove(destination)
|
||||
else
|
||||
CRASH("Brainmob without a container [src] attempted to move to [destination].")
|
||||
|
||||
/mob/living/brain/update_mouse_pointer()
|
||||
if (!client)
|
||||
return
|
||||
client.mouse_pointer_icon = initial(client.mouse_pointer_icon)
|
||||
if(!container)
|
||||
return
|
||||
if (container.mecha)
|
||||
var/obj/mecha/M = container.mecha
|
||||
if(M.mouse_pointer)
|
||||
client.mouse_pointer_icon = M.mouse_pointer
|
||||
if (client && ranged_ability && ranged_ability.ranged_mousepointer)
|
||||
client.mouse_pointer_icon = ranged_ability.ranged_mousepointer
|
||||
|
||||
@@ -170,6 +170,7 @@
|
||||
stop_pulling()
|
||||
if(HAS_TRAIT(src, TRAIT_PACIFISM))
|
||||
to_chat(src, "<span class='notice'>You gently let go of [throwable_mob].</span>")
|
||||
return
|
||||
adjustStaminaLossBuffered(25)//CIT CHANGE - throwing an entire person shall be very tiring
|
||||
var/turf/start_T = get_turf(loc) //Get the start and target tile for the descriptors
|
||||
var/turf/end_T = get_turf(target)
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
adjustStaminaLoss(damage_amount, forced = forced)
|
||||
//citadel code
|
||||
if(AROUSAL)
|
||||
adjustArousalLoss(damage_amount, forced = forced)
|
||||
adjustArousalLoss(damage_amount)
|
||||
return TRUE
|
||||
|
||||
|
||||
|
||||
@@ -54,11 +54,16 @@
|
||||
/mob/living/carbon/human/proc/makeSkeleton()
|
||||
ADD_TRAIT(src, TRAIT_DISFIGURED, TRAIT_GENERIC)
|
||||
set_species(/datum/species/skeleton)
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
|
||||
/mob/living/carbon/proc/Drain()
|
||||
become_husk(CHANGELING_DRAIN)
|
||||
ADD_TRAIT(src, TRAIT_NOCLONE, CHANGELING_DRAIN)
|
||||
blood_volume = 0
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
/mob/living/carbon/proc/makeUncloneable()
|
||||
ADD_TRAIT(src, TRAIT_NOCLONE, MADE_UNCLONEABLE)
|
||||
blood_volume = 0
|
||||
return TRUE
|
||||
@@ -32,7 +32,7 @@
|
||||
if(CONFIG_GET(flag/disable_stambuffer))
|
||||
togglesprint()
|
||||
|
||||
RegisterSignal(src, COMSIG_COMPONENT_CLEAN_ACT, /mob/living/carbon/human/clean_blood)
|
||||
RegisterSignal(src, COMSIG_COMPONENT_CLEAN_ACT, /atom.proc/clean_blood)
|
||||
|
||||
|
||||
/mob/living/carbon/human/ComponentInitialize()
|
||||
@@ -574,7 +574,7 @@
|
||||
return threatcount
|
||||
|
||||
//Check for ID
|
||||
var/obj/item/card/id/idcard = get_idcard()
|
||||
var/obj/item/card/id/idcard = get_idcard(FALSE)
|
||||
if( (judgement_criteria & JUDGE_IDCHECK) && !idcard && name=="Unknown")
|
||||
threatcount += 4
|
||||
|
||||
|
||||
@@ -339,8 +339,10 @@
|
||||
apply_damage(damage, BRUTE, affecting, armor_block)
|
||||
|
||||
/mob/living/carbon/human/mech_melee_attack(obj/mecha/M)
|
||||
|
||||
if(M.occupant.a_intent == INTENT_HARM)
|
||||
if(HAS_TRAIT(M.occupant, TRAIT_PACIFISM))
|
||||
to_chat(M.occupant, "<span class='warning'>You don't want to harm other living beings!</span>")
|
||||
return
|
||||
M.do_attack_animation(src)
|
||||
if(M.damtype == "brute")
|
||||
step_away(src,M,15)
|
||||
|
||||
@@ -34,8 +34,6 @@
|
||||
var/shirt_color = "FFFFFF"
|
||||
var/socks = "Nude" //Which socks the player wants
|
||||
var/socks_color = "FFFFFF"
|
||||
var/backbag = DBACKPACK //Which backpack type the player has chosen.
|
||||
var/jumpsuit_style = PREF_SUIT //suit/skirt
|
||||
|
||||
//Equipment slots
|
||||
var/obj/item/wear_suit = null
|
||||
|
||||
@@ -11,8 +11,8 @@
|
||||
|
||||
//gets assignment from ID or ID inside PDA or PDA itself
|
||||
//Useful when player do something with computers
|
||||
/mob/living/carbon/human/proc/get_assignment(if_no_id = "No id", if_no_job = "No job")
|
||||
var/obj/item/card/id/id = get_idcard()
|
||||
/mob/living/carbon/human/proc/get_assignment(if_no_id = "No id", if_no_job = "No job", hand_first = TRUE)
|
||||
var/obj/item/card/id/id = get_idcard(hand_first)
|
||||
if(id)
|
||||
. = id.assignment
|
||||
else
|
||||
@@ -27,7 +27,7 @@
|
||||
//gets name from ID or ID inside PDA or PDA itself
|
||||
//Useful when player do something with computers
|
||||
/mob/living/carbon/human/proc/get_authentification_name(if_no_id = "Unknown")
|
||||
var/obj/item/card/id/id = get_idcard()
|
||||
var/obj/item/card/id/id = get_idcard(FALSE)
|
||||
if(id)
|
||||
return id.registered_name
|
||||
var/obj/item/pda/pda = wear_id
|
||||
@@ -86,10 +86,15 @@
|
||||
return
|
||||
|
||||
//gets ID card object from special clothes slot or null.
|
||||
/mob/living/carbon/human/get_idcard()
|
||||
if(wear_id)
|
||||
return wear_id.GetID()
|
||||
|
||||
/mob/living/carbon/human/get_idcard(hand_first = TRUE)
|
||||
. = ..()
|
||||
if(. && hand_first)
|
||||
return
|
||||
//Check inventory slots
|
||||
var/obj/item/card/id/id_card = wear_id?.GetID()
|
||||
if(!id_card)
|
||||
id_card = belt?.GetID()
|
||||
return id_card || .
|
||||
|
||||
/mob/living/carbon/human/IsAdvancedToolUser()
|
||||
if(HAS_TRAIT(src, TRAIT_MONKEYLIKE))
|
||||
@@ -100,7 +105,6 @@
|
||||
return dna.species.handle_chemicals(R,src)
|
||||
// if it returns 0, it will run the usual on_mob_life for that reagent. otherwise, it will stop after running handle_chemicals for the species.
|
||||
|
||||
|
||||
/mob/living/carbon/human/can_track(mob/living/user)
|
||||
if(wear_id && istype(wear_id.GetID(), /obj/item/card/id/syndicate))
|
||||
return 0
|
||||
|
||||
@@ -251,7 +251,7 @@
|
||||
sec_hud_set_security_status()
|
||||
..()
|
||||
|
||||
/mob/living/carbon/human/proc/equipOutfit(outfit, visualsOnly = FALSE)
|
||||
/mob/living/carbon/human/proc/equipOutfit(outfit, visualsOnly = FALSE, client/preference_source)
|
||||
var/datum/outfit/O = null
|
||||
|
||||
if(ispath(outfit))
|
||||
@@ -263,7 +263,7 @@
|
||||
if(!O)
|
||||
return 0
|
||||
|
||||
return O.equip(src, visualsOnly)
|
||||
return O.equip(src, visualsOnly, preference_source)
|
||||
|
||||
|
||||
//delete all equipment without dropping anything
|
||||
|
||||
@@ -118,11 +118,14 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
|
||||
..()
|
||||
|
||||
|
||||
/proc/generate_selectable_species()
|
||||
/proc/generate_selectable_species(clear = FALSE)
|
||||
if(clear)
|
||||
GLOB.roundstart_races = list()
|
||||
GLOB.roundstart_race_names = list()
|
||||
for(var/I in subtypesof(/datum/species))
|
||||
var/datum/species/S = new I
|
||||
if(S.check_roundstart_eligible())
|
||||
GLOB.roundstart_races += S.id
|
||||
GLOB.roundstart_races |= S.id
|
||||
GLOB.roundstart_race_names["[S.name]"] = S.id
|
||||
qdel(S)
|
||||
if(!GLOB.roundstart_races.len)
|
||||
@@ -1476,7 +1479,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
|
||||
|
||||
|
||||
/datum/species/proc/harm(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style)
|
||||
if(HAS_TRAIT(user, TRAIT_PACIFISM))
|
||||
if(!attacker_style && HAS_TRAIT(user, TRAIT_PACIFISM))
|
||||
to_chat(user, "<span class='warning'>You don't want to harm [target]!</span>")
|
||||
return FALSE
|
||||
if(user.getStaminaLoss() >= STAMINA_SOFTCRIT) //CITADEL CHANGE - makes it impossible to punch while in stamina softcrit
|
||||
@@ -1678,6 +1681,8 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
|
||||
return
|
||||
if(M.mind)
|
||||
attacker_style = M.mind.martial_art
|
||||
if(attacker_style?.pacifism_check && HAS_TRAIT(M, TRAIT_PACIFISM)) // most martial arts are quite harmful, alas.
|
||||
attacker_style = null
|
||||
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>")
|
||||
|
||||
@@ -336,7 +336,7 @@ There are several things that need to be remembered:
|
||||
if(!t_state)
|
||||
t_state = s_store.icon_state
|
||||
overlays_standing[SUIT_STORE_LAYER] = mutable_appearance(((s_store.alternate_worn_icon) ? s_store.alternate_worn_icon : 'icons/mob/belt_mirror.dmi'), t_state, -SUIT_STORE_LAYER)
|
||||
var/mutable_appearance/s_store_overlay = overlays_standing[SUIT_LAYER]
|
||||
var/mutable_appearance/s_store_overlay = overlays_standing[SUIT_STORE_LAYER]
|
||||
if(OFFSET_S_STORE in dna.species.offset_features)
|
||||
s_store_overlay.pixel_x += dna.species.offset_features[OFFSET_S_STORE][1]
|
||||
s_store_overlay.pixel_y += dna.species.offset_features[OFFSET_S_STORE][2]
|
||||
|
||||
@@ -98,7 +98,7 @@
|
||||
var/datum/gas_mixture/breath
|
||||
|
||||
if(!getorganslot(ORGAN_SLOT_BREATHING_TUBE))
|
||||
if(health <= HEALTH_THRESHOLD_FULLCRIT || (pulledby && pulledby.grab_state >= GRAB_KILL) || !lungs || lungs.organ_flags & ORGAN_FAILING)
|
||||
if(health <= HEALTH_THRESHOLD_FULLCRIT || (pulledby && pulledby.grab_state >= GRAB_KILL) || (lungs && lungs.organ_flags & ORGAN_FAILING))
|
||||
losebreath++ //You can't breath at all when in critical or when being choked, so you're going to miss a breath
|
||||
|
||||
else if(health <= crit_threshold)
|
||||
|
||||
@@ -92,6 +92,9 @@
|
||||
|
||||
/mob/living/mech_melee_attack(obj/mecha/M)
|
||||
if(M.occupant.a_intent == INTENT_HARM)
|
||||
if(HAS_TRAIT(M.occupant, TRAIT_PACIFISM))
|
||||
to_chat(M.occupant, "<span class='warning'>You don't want to harm other living beings!</span>")
|
||||
return
|
||||
M.do_attack_animation(src)
|
||||
if(M.damtype == "brute")
|
||||
step_away(src,M,15)
|
||||
|
||||
@@ -882,6 +882,7 @@
|
||||
/mob/living/silicon/ai/revive(full_heal = 0, admin_revive = 0)
|
||||
. = ..()
|
||||
if(.) //successfully ressuscitated from death
|
||||
set_eyeobj_visible(TRUE)
|
||||
set_core_display_icon(display_icon_override)
|
||||
|
||||
/mob/living/silicon/ai/proc/malfhacked(obj/machinery/power/apc/apc)
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
update_canmove()
|
||||
if(eyeobj)
|
||||
eyeobj.setLoc(get_turf(src))
|
||||
set_eyeobj_visible(FALSE)
|
||||
|
||||
GLOB.shuttle_caller_list -= src
|
||||
SSshuttle.autoEvac()
|
||||
|
||||
@@ -6,6 +6,8 @@
|
||||
/mob/camera/aiEye
|
||||
name = "Inactive AI Eye"
|
||||
|
||||
icon_state = "ai_camera"
|
||||
icon = 'icons/mob/cameramob.dmi'
|
||||
invisibility = INVISIBILITY_MAXIMUM
|
||||
hud_possible = list(ANTAG_HUD, AI_DETECT_HUD = HUD_LIST_LIST)
|
||||
var/list/visibleCameraChunks = list()
|
||||
@@ -158,11 +160,11 @@
|
||||
cameraFollow = null
|
||||
unset_machine()
|
||||
|
||||
if(!eyeobj || !eyeobj.loc || QDELETED(eyeobj))
|
||||
if(isturf(loc) && (QDELETED(eyeobj) || !eyeobj.loc))
|
||||
to_chat(src, "ERROR: Eyeobj not found. Creating new eye...")
|
||||
create_eye()
|
||||
|
||||
eyeobj.setLoc(loc)
|
||||
eyeobj?.setLoc(loc)
|
||||
|
||||
/mob/living/silicon/ai/proc/create_eye()
|
||||
if(eyeobj)
|
||||
@@ -172,6 +174,13 @@
|
||||
eyeobj.ai = src
|
||||
eyeobj.setLoc(loc)
|
||||
eyeobj.name = "[name] (AI Eye)"
|
||||
set_eyeobj_visible(TRUE)
|
||||
|
||||
/mob/living/silicon/ai/proc/set_eyeobj_visible(state = TRUE)
|
||||
if(!eyeobj)
|
||||
return
|
||||
eyeobj.mouse_opacity = state ? MOUSE_OPACITY_ICON : initial(eyeobj.mouse_opacity)
|
||||
eyeobj.invisibility = state ? INVISIBILITY_OBSERVER : initial(eyeobj.invisibility)
|
||||
|
||||
/mob/living/silicon/ai/verb/toggle_acceleration()
|
||||
set category = "AI Commands"
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user