mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-20 18:47:20 +01:00
Merge branch 'master' of https://github.com/ParadiseSS13/Paradise into BookClub
This commit is contained in:
@@ -145,6 +145,9 @@
|
||||
/datum/action/item_action/startchainsaw
|
||||
name = "Pull The Starting Cord"
|
||||
|
||||
/datum/action/item_action/print_report
|
||||
name = "Print Forensic Report"
|
||||
|
||||
/datum/action/item_action/toggle_gunlight
|
||||
name = "Toggle Gunlight"
|
||||
|
||||
@@ -244,6 +247,15 @@
|
||||
name = "Adjust [target.name]"
|
||||
button.name = name
|
||||
|
||||
/datum/action/item_action/pontificate
|
||||
name = "Pontificate Evilly"
|
||||
|
||||
/datum/action/item_action/tip_fedora
|
||||
name = "Tip Fedora"
|
||||
|
||||
/datum/action/item_action/flip_cap
|
||||
name = "Flip Cap"
|
||||
|
||||
/datum/action/item_action/switch_hud
|
||||
name = "Switch HUD"
|
||||
|
||||
|
||||
@@ -129,6 +129,7 @@
|
||||
proc/get_id_photo(var/mob/living/carbon/human/H)
|
||||
var/icon/preview_icon = null
|
||||
var/obj/item/organ/external/head/head_organ = H.get_organ("head")
|
||||
var/obj/item/organ/internal/eyes/eyes_organ = H.get_int_organ(/obj/item/organ/internal/eyes)
|
||||
|
||||
var/g = "m"
|
||||
if(H.gender == FEMALE)
|
||||
@@ -170,7 +171,12 @@ proc/get_id_photo(var/mob/living/carbon/human/H)
|
||||
var/icon/face_s = new/icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = "bald_s")
|
||||
if(!(H.species.bodyflags & NO_EYES))
|
||||
var/icon/eyes_s = new/icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = H.species ? H.species.eyes : "eyes_s")
|
||||
eyes_s.Blend(rgb(H.r_eyes, H.g_eyes, H.b_eyes), ICON_ADD)
|
||||
if(!eyes_organ)
|
||||
return
|
||||
var/eye_red = eyes_organ.eye_colour[1]
|
||||
var/eye_green = eyes_organ.eye_colour[2]
|
||||
var/eye_blue = eyes_organ.eye_colour[3]
|
||||
eyes_s.Blend(rgb(eye_red, eye_green, eye_blue), ICON_ADD)
|
||||
face_s.Blend(eyes_s, ICON_OVERLAY)
|
||||
|
||||
var/datum/sprite_accessory/hair_style = hair_styles_list[head_organ.h_style]
|
||||
|
||||
@@ -384,16 +384,9 @@ body
|
||||
html += "</ol>"
|
||||
else
|
||||
html += "<ul>"
|
||||
// First loop to check for associativity
|
||||
var/associative = FALSE
|
||||
for(var/entry in L)
|
||||
if(!(isnum(entry) || isnull(L[entry])))
|
||||
associative = TRUE
|
||||
break
|
||||
// then we do it again! Except now with knowledge of associativity
|
||||
var/index = 1
|
||||
for(var/entry in L)
|
||||
if(associative)
|
||||
if(istext(entry))
|
||||
html += debug_variable(entry, L[entry], level + 1)
|
||||
else
|
||||
html += debug_variable(index, L[index], level + 1)
|
||||
|
||||
@@ -6,62 +6,63 @@
|
||||
/datum/events
|
||||
var/list/events
|
||||
|
||||
New()
|
||||
..()
|
||||
events = new
|
||||
/datum/events/New()
|
||||
..()
|
||||
events = new
|
||||
|
||||
proc/addEventType(event_type as text)
|
||||
if(!(event_type in events) || !islist(events[event_type]))
|
||||
events[event_type] = list()
|
||||
return 1
|
||||
return
|
||||
|
||||
|
||||
// Arguments: event_type as text, proc_holder as datum, proc_name as text
|
||||
// Returns: New event, null on error.
|
||||
proc/addEvent(event_type as text, proc_holder, proc_name as text)
|
||||
if(!event_type || !proc_holder || !proc_name)
|
||||
return
|
||||
addEventType(event_type)
|
||||
var/list/event = events[event_type]
|
||||
var/datum/events_event/E = new /datum/events_event(proc_holder,proc_name)
|
||||
event += E
|
||||
return E
|
||||
|
||||
// Arguments: event_type as text, any number of additional arguments to pass to event handler
|
||||
// Returns: null
|
||||
proc/fireEvent()
|
||||
// to_chat(world, "Events in [args[1]] called")
|
||||
var/list/event = listgetindex(events,args[1])
|
||||
if(istype(event))
|
||||
spawn(-1)
|
||||
for(var/datum/events_event/E in event)
|
||||
if(!E.Fire(arglist(args.Copy(2))))
|
||||
clearEvent(args[1],E)
|
||||
return
|
||||
|
||||
// Arguments: event_type as text, E as /datum/events_event
|
||||
// Returns: 1 if event cleared, null on error
|
||||
proc/clearEvent(event_type as text, datum/events_event/E)
|
||||
if(!event_type || !E)
|
||||
return
|
||||
var/list/event = listgetindex(events,event_type)
|
||||
event -= E
|
||||
/datum/events/proc/addEventType(event_type as text)
|
||||
if(!(event_type in events) || !islist(events[event_type]))
|
||||
events[event_type] = list()
|
||||
return 1
|
||||
return
|
||||
|
||||
|
||||
/datum/events_event
|
||||
// Arguments: event_type as text, proc_holder as datum, proc_name as text
|
||||
// Returns: New event, null on error.
|
||||
/datum/events/proc/addEvent(event_type as text, proc_holder, proc_name as text)
|
||||
if(!event_type || !proc_holder || !proc_name)
|
||||
return
|
||||
addEventType(event_type)
|
||||
var/list/event = events[event_type]
|
||||
var/datum/event/E = new /datum/event(proc_holder,proc_name)
|
||||
event += E
|
||||
return E
|
||||
|
||||
// Arguments: event_type as text, any number of additional arguments to pass to event handler
|
||||
// Returns: null
|
||||
/datum/events/proc/fireEvent()
|
||||
//world << "Events in [args[1]] called"
|
||||
var/list/event = listgetindex(events,args[1])
|
||||
if(istype(event))
|
||||
spawn(0)
|
||||
for(var/datum/event/E in event)
|
||||
if(!E.Fire(arglist(args.Copy(2))))
|
||||
clearEvent(args[1],E)
|
||||
return
|
||||
|
||||
// Arguments: event_type as text, E as /datum/event
|
||||
// Returns: 1 if event cleared, null on error
|
||||
|
||||
/datum/events/proc/clearEvent(event_type as text, datum/event/E)
|
||||
if(!event_type || !E)
|
||||
return
|
||||
var/list/event = listgetindex(events,event_type)
|
||||
event -= E
|
||||
return 1
|
||||
|
||||
|
||||
/datum/event
|
||||
var/listener
|
||||
var/proc_name
|
||||
|
||||
New(tlistener,tprocname)
|
||||
listener = tlistener
|
||||
proc_name = tprocname
|
||||
return ..()
|
||||
/datum/event/New(tlistener,tprocname)
|
||||
listener = tlistener
|
||||
proc_name = tprocname
|
||||
return ..()
|
||||
|
||||
proc/Fire()
|
||||
// to_chat(world, "Event fired")
|
||||
if(listener)
|
||||
call(listener,proc_name)(arglist(args))
|
||||
return 1
|
||||
return
|
||||
/datum/event/proc/Fire()
|
||||
//world << "Event fired"
|
||||
if(listener)
|
||||
call(listener,proc_name)(arglist(args))
|
||||
return 1
|
||||
return
|
||||
|
||||
@@ -75,6 +75,9 @@
|
||||
//put this here for easier tracking ingame
|
||||
var/datum/money_account/initial_account
|
||||
|
||||
//zealot_master is a reference to the mob that converted them into a zealot (for ease of investigation and such)
|
||||
var/mob/living/carbon/human/zealot_master = null
|
||||
|
||||
/datum/mind/proc/transfer_to(mob/living/new_character)
|
||||
if(!istype(new_character))
|
||||
log_to_dd("## DEBUG: transfer_to(): Some idiot has tried to transfer_to() a non mob/living mob. Please inform Carn")
|
||||
@@ -1475,6 +1478,72 @@
|
||||
if(G)
|
||||
G.reenter_corpse()
|
||||
|
||||
/datum/mind/proc/make_zealot(mob/living/carbon/human/missionary, convert_duration = 6000, team_color = "red")
|
||||
if(!missionary || !istype(missionary)) //better provide a proper missionary or the rest of this is gonna break
|
||||
return 0
|
||||
|
||||
zealot_master = missionary
|
||||
|
||||
var/list/implanters
|
||||
var/ref = "\ref[missionary.mind]"
|
||||
if(!(missionary.mind in ticker.mode.implanter))
|
||||
ticker.mode.implanter[ref] = list()
|
||||
implanters = ticker.mode.implanter[ref]
|
||||
implanters.Add(src)
|
||||
ticker.mode.implanted.Add(src)
|
||||
ticker.mode.implanted[src] = missionary.mind
|
||||
//ticker.mode.implanter[missionary.mind] += src
|
||||
ticker.mode.implanter[ref] = implanters
|
||||
ticker.mode.traitors += src
|
||||
special_role = "traitor"
|
||||
to_chat(current, "<span class='warning'><B>You're now a loyal zealot of [missionary.name]!</B> You now must lay down your life to protect them and assist in their goals at any cost.</span>")
|
||||
var/datum/objective/protect/mindslave/MS = new
|
||||
MS.owner = src
|
||||
MS.target = missionary.mind
|
||||
MS.explanation_text = "Obey every order from and protect [missionary.real_name], the [missionary.mind.assigned_role=="MODE" ? (missionary.mind.special_role) : (missionary.mind.assigned_role)]."
|
||||
objectives += MS
|
||||
for(var/datum/objective/objective in objectives)
|
||||
to_chat(current, "<B>Objective #1</B>: [objective.explanation_text]")
|
||||
|
||||
ticker.mode.update_traitor_icons_added(missionary.mind)
|
||||
ticker.mode.update_traitor_icons_added(src)//handles datahuds/observerhuds
|
||||
|
||||
if(missionary.mind.som)//do not add if not a traitor..and you just picked up a robe and staff in the hall...
|
||||
var/datum/mindslaves/slaved = missionary.mind.som
|
||||
som = slaved
|
||||
slaved.serv += current
|
||||
slaved.add_serv_hud(missionary.mind, "master") //handles master servent icons
|
||||
slaved.add_serv_hud(src, "mindslave")
|
||||
|
||||
var/obj/item/clothing/under/jumpsuit = null
|
||||
if(ishuman(current)) //only bother with the jumpsuit stuff if we are a human type, since we won't have the slot otherwise
|
||||
var/mob/living/carbon/human/H = current
|
||||
if(H.w_uniform)
|
||||
jumpsuit = H.w_uniform
|
||||
jumpsuit.color = team_color
|
||||
H.update_inv_w_uniform(0,0)
|
||||
|
||||
log_admin("[ckey(missionary.key)] has converted [ckey(current.key)] as a zealot.")
|
||||
addtimer(src, "remove_zealot", convert_duration, FALSE, jumpsuit) //deconverts after the timer expires
|
||||
|
||||
return 1
|
||||
|
||||
/datum/mind/proc/remove_zealot(obj/item/clothing/under/jumpsuit = null)
|
||||
if(!zealot_master) //if they aren't a zealot, we can't remove their zealot status, obviously. don't bother with the rest so we don't confuse them with the messages
|
||||
return
|
||||
ticker.mode.remove_traitor_mind(src)
|
||||
log_admin("[ckey(current.key)] has deconverted and is no longer a zealot of [ckey(zealot_master.key)].")
|
||||
zealot_master = null
|
||||
|
||||
if(jumpsuit)
|
||||
jumpsuit.color = initial(jumpsuit.color) //reset the jumpsuit no matter where our mind is
|
||||
if(ishuman(current)) //but only try updating us if we are still a human type since it is a human proc
|
||||
var/mob/living/carbon/human/H = current
|
||||
H.update_inv_w_uniform(0,0)
|
||||
|
||||
to_chat(current, "<span class='warning'>You seem to have forgotten the events of the past 10 minutes or so, and your head aches a bit as if someone beat it savagely with a stick.</span>")
|
||||
to_chat(current, "<span class='warning'>This means you don't remember who you were working for or what you were doing.</span>")
|
||||
|
||||
//Initialisation procs
|
||||
/mob/proc/mind_initialize()
|
||||
if(mind)
|
||||
|
||||
@@ -0,0 +1,39 @@
|
||||
// Not TECHNICALLY a datum, but this should never be instantiated
|
||||
// outside of the stat panel
|
||||
// Clickable stat() button
|
||||
/obj/effect/statclick
|
||||
var/target
|
||||
|
||||
/obj/effect/statclick/New(ntarget, text)
|
||||
name = text
|
||||
target = ntarget
|
||||
|
||||
/obj/effect/statclick/proc/update(text)
|
||||
name = text
|
||||
return src
|
||||
|
||||
/obj/effect/statclick/debug
|
||||
var/class
|
||||
|
||||
/obj/effect/statclick/debug/New(ntarget)
|
||||
name = "Initializing..."
|
||||
target = ntarget
|
||||
if(istype(target, /datum/controller/process))
|
||||
class = "process"
|
||||
else if(istype(target, /datum/controller/processScheduler))
|
||||
class = "scheduler"
|
||||
else if(istype(target, /datum/controller))
|
||||
class = "controller"
|
||||
else if(istype(target, /datum))
|
||||
class = "datum"
|
||||
else
|
||||
class = "unknown"
|
||||
|
||||
// This bit is called when clicked in the stat panel
|
||||
/obj/effect/statclick/debug/Click()
|
||||
if(!usr.client.holder)
|
||||
return
|
||||
|
||||
usr.client.debug_variables(target)
|
||||
|
||||
message_admins("Admin [key_name_admin(usr)] is debugging the [target] [class].")
|
||||
@@ -1198,10 +1198,8 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
|
||||
/obj/item/weapon/reagent_containers/food/drinks/bottle/holywater,
|
||||
/obj/item/weapon/storage/bible/booze,
|
||||
/obj/item/weapon/storage/bible/booze,
|
||||
/obj/item/clothing/suit/chaplain_hoodie,
|
||||
/obj/item/clothing/head/chaplain_hood,
|
||||
/obj/item/clothing/suit/chaplain_hoodie,
|
||||
/obj/item/clothing/head/chaplain_hood)
|
||||
/obj/item/clothing/suit/hooded/chaplain_hoodie,
|
||||
/obj/item/clothing/suit/hooded/chaplain_hoodie)
|
||||
cost = 40
|
||||
containername = "religious supplies crate"
|
||||
|
||||
|
||||
@@ -180,6 +180,14 @@ var/list/uplink_items = list()
|
||||
cost = 13
|
||||
job = list("Chaplain")
|
||||
|
||||
/datum/uplink_item/jobspecific/missionary_kit
|
||||
name = "Missionary Starter Kit"
|
||||
desc = "A box containing a missionary staff, missionary robes, and bible. The robes and staff can be linked to allow you to convert victims at range for a short time to do your bidding. The bible is for bible stuff."
|
||||
reference = "MK"
|
||||
item = /obj/item/weapon/storage/box/syndie_kit/missionary_set
|
||||
cost = 15
|
||||
job = list("Chaplain")
|
||||
|
||||
/datum/uplink_item/jobspecific/artistic_toolbox
|
||||
name = "Artistic Toolbox"
|
||||
desc = "An accursed toolbox that grants its followers extreme power at the cost of requiring repeated sacrifices to it. If sacrifices are not provided, it will turn on its follower."
|
||||
@@ -309,7 +317,7 @@ var/list/uplink_items = list()
|
||||
item = /obj/item/clothing/under/contortionist
|
||||
cost = 6
|
||||
job = list("Life Support Specialist")
|
||||
|
||||
|
||||
/datum/uplink_item/dangerous/energizedfireaxe
|
||||
name = "Energized Fire Axe"
|
||||
desc = "A fire axe with a massive electrical charge built into it. It can release this charge on its first victim and will be rather plain after that."
|
||||
|
||||
Reference in New Issue
Block a user