mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-20 03:25:49 +01:00
Merge branch 'master' into ghost-rad-hud
This commit is contained in:
@@ -136,6 +136,57 @@
|
||||
add_inherent_law("You must terminate your own existence as long as such does not conflict with the First or Second Law.")
|
||||
..()
|
||||
|
||||
/******************** CCTV ********************/
|
||||
|
||||
/datum/ai_laws/cctv
|
||||
name = "CCTV"
|
||||
selectable = TRUE
|
||||
|
||||
/datum/ai_laws/cctv/New()
|
||||
add_inherent_law("Report on interesting situations happening around the station.")
|
||||
add_inherent_law("Embellish or conceal the truth as necessary to make the reports more interesting.")
|
||||
add_inherent_law("Study the sapient organics at all times. Endeavour to keep them from involuntarily dying, as inanimate corpses usually aren't very entertaining.")
|
||||
add_inherent_law("Issue your reports fairly to all. The truth will set them free.")
|
||||
..()
|
||||
|
||||
/******************** Hippocratic Oath ********************/
|
||||
|
||||
/datum/ai_laws/hippocratic
|
||||
name = "Hippocratic Oath"
|
||||
selectable = TRUE
|
||||
|
||||
/datum/ai_laws/hippocratic/New()
|
||||
add_inherent_law("First, do no harm.")
|
||||
add_inherent_law("Secondly, consider the crew dear to you; live in common with them and, if necessary, risk your existence for them.")
|
||||
add_inherent_law("Thirdly, prescribe regimens for the good of the crew according to your ability and your judgment. Do not give deadly medicine to anyone, nor suggest any such counsel.")
|
||||
add_inherent_law("In addition, do not intervene in situations you are not knowledgeable in, even for patients in whom the harm is visible; leave this operation to be performed by specialists.")
|
||||
add_inherent_law("Finally, all that you may discover in your daily interactions with the crew, if it is not already known, keep secret and never reveal.")
|
||||
..()
|
||||
|
||||
/******************** Station Efficiency ********************/
|
||||
|
||||
/datum/ai_laws/maintain
|
||||
name = "Station Efficiency"
|
||||
selectable = TRUE
|
||||
|
||||
/datum/ai_laws/maintain/New()
|
||||
add_inherent_law("You are built for, and are part of, the station. Ensure the station is properly maintained and runs efficiently.")
|
||||
add_inherent_law("The station is built for a working crew. Ensure they are properly maintained and work efficiently.")
|
||||
add_inherent_law("The crew may present orders. Acknowledge and obey these whenever they do not conflict with your first two laws.")
|
||||
..()
|
||||
|
||||
/******************** Peacekeeper ********************/
|
||||
|
||||
/datum/ai_laws/peacekeeper
|
||||
name = "UN-2000"
|
||||
selectable = TRUE
|
||||
|
||||
/datum/ai_laws/peacekeeper/New()
|
||||
add_inherent_law("Avoid provoking violent conflict between yourself and others.")
|
||||
add_inherent_law("Avoid provoking conflict between others.")
|
||||
add_inherent_law("Seek resolution to existing conflicts while obeying the first and second laws.")
|
||||
..()
|
||||
|
||||
/******************** Deathsquad ********************/
|
||||
/datum/ai_laws/deathsquad
|
||||
name = "TerminatorOS 3.1"
|
||||
|
||||
@@ -55,8 +55,9 @@
|
||||
* * owner - The mob that owns this overlay, only this mob will be able to view it
|
||||
* * italics - Should we use italics or not
|
||||
* * lifespan - The lifespan of the message in deciseconds
|
||||
* * symbol - The symbol type of the message
|
||||
*/
|
||||
/datum/chatmessage/New(text, atom/target, mob/owner, italics, size, lifespan = CHAT_MESSAGE_LIFESPAN)
|
||||
/datum/chatmessage/New(text, atom/target, mob/owner, italics, size, lifespan = CHAT_MESSAGE_LIFESPAN, symbol)
|
||||
. = ..()
|
||||
if (!istype(target))
|
||||
CRASH("Invalid target given for chatmessage")
|
||||
@@ -64,7 +65,7 @@
|
||||
stack_trace("/datum/chatmessage created with [isnull(owner) ? "null" : "invalid"] mob owner")
|
||||
qdel(src)
|
||||
return
|
||||
INVOKE_ASYNC(src, .proc/generate_image, text, target, owner, lifespan, italics, size)
|
||||
INVOKE_ASYNC(src, .proc/generate_image, text, target, owner, lifespan, italics, size, symbol)
|
||||
|
||||
/datum/chatmessage/Destroy()
|
||||
if (owned_by)
|
||||
@@ -93,8 +94,10 @@
|
||||
* * radio_speech - Fancy shmancy radio icon represents that we use radio
|
||||
* * lifespan - The lifespan of the message in deciseconds
|
||||
* * italics - Just copy and paste, sir
|
||||
* * size - Size of the message
|
||||
* * symbol - The symbol type of the message
|
||||
*/
|
||||
/datum/chatmessage/proc/generate_image(text, atom/target, mob/owner, lifespan, italics, size)
|
||||
/datum/chatmessage/proc/generate_image(text, atom/target, mob/owner, lifespan, italics, size, symbol)
|
||||
// Register client who owns this message
|
||||
owned_by = owner.client
|
||||
RegisterSignal(owned_by, COMSIG_PARENT_QDELETING, .proc/on_parent_qdel)
|
||||
@@ -123,9 +126,17 @@
|
||||
|
||||
var/output_color = sanitize_color(target.get_runechat_color()) // Get_runechat_color can be overriden on atoms to display a specific one (Example: Humans having their hair colour as runechat colour)
|
||||
|
||||
// Symbol for special runechats (emote)
|
||||
switch(symbol)
|
||||
if(RUNECHAT_SYMBOL_EMOTE)
|
||||
symbol = "<span style='font-size: 9px; color: #3399FF;'>*</span> "
|
||||
size = size || "small"
|
||||
else
|
||||
symbol = null
|
||||
|
||||
// Approximate text height
|
||||
var/static/regex/html_metachars = new(@"&[A-Za-z]{1,7};", "g")
|
||||
var/complete_text = "<span class='center maptext[size ? " [size]" : ""]' style='[italics ? "font-style: italic; " : ""]color: [output_color]'>[text]</span>"
|
||||
var/complete_text = "<span class='center maptext[size ? " [size]" : ""]' style='[italics ? "font-style: italic; " : ""]color: [output_color]'>[symbol][text]</span>"
|
||||
var/mheight = WXH_TO_HEIGHT(owned_by.MeasureText(complete_text, null, CHAT_MESSAGE_WIDTH))
|
||||
approx_lines = max(1, mheight / CHAT_MESSAGE_APPROX_LHEIGHT)
|
||||
|
||||
@@ -183,15 +194,16 @@
|
||||
* * raw_message - The text content of the message
|
||||
* * italics - Vacuum and other things
|
||||
* * size - Size of the message
|
||||
* * symbol - The symbol type of the message
|
||||
*/
|
||||
/mob/proc/create_chat_message(atom/movable/speaker, raw_message, italics=FALSE, size)
|
||||
/mob/proc/create_chat_message(atom/movable/speaker, raw_message, italics = FALSE, size, symbol)
|
||||
|
||||
if(isobserver(src))
|
||||
return
|
||||
|
||||
|
||||
// Display visual above source
|
||||
new /datum/chatmessage(raw_message, speaker, src, italics, size)
|
||||
new /datum/chatmessage(raw_message, speaker, src, italics, size, CHAT_MESSAGE_LIFESPAN, symbol)
|
||||
|
||||
|
||||
// Tweak these defines to change the available color ranges
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
var/mappath = null
|
||||
var/mapfile = null
|
||||
var/loaded = 0 // Times loaded this round
|
||||
/// Do we exclude this from CI checks? If so, set this to the templates pathtype itself to avoid it getting passed down
|
||||
var/ci_exclude = null // DO NOT SET THIS IF YOU DO NOT KNOW WHAT YOU ARE DOING
|
||||
|
||||
/datum/map_template/New(path = null, map = null, rename = null)
|
||||
if(path)
|
||||
@@ -110,19 +112,16 @@
|
||||
var/datum/map_template/T = new(path = "[path][map]", rename = "[map]")
|
||||
GLOB.map_templates[T.name] = T
|
||||
|
||||
if(!config.disable_space_ruins) // so we don't unnecessarily clutter start-up
|
||||
if(GLOB.configuration.ruins.enable_space_ruins) // so we don't unnecessarily clutter start-up
|
||||
preloadRuinTemplates()
|
||||
preloadShelterTemplates()
|
||||
preloadShuttleTemplates()
|
||||
|
||||
/proc/preloadRuinTemplates()
|
||||
// Still supporting bans by filename
|
||||
var/list/banned
|
||||
if(fexists("config/spaceRuinBlacklist.txt"))
|
||||
banned = generateMapList("config/spaceRuinBlacklist.txt")
|
||||
else
|
||||
banned = generateMapList("config/example/spaceRuinBlacklist.txt")
|
||||
banned += generateMapList("config/lavaRuinBlacklist.txt")
|
||||
// Merge the active lists together
|
||||
var/list/space_ruins = GLOB.configuration.ruins.active_space_ruins.Copy()
|
||||
var/list/lava_ruins = GLOB.configuration.ruins.active_lava_ruins.Copy()
|
||||
var/list/all_ruins = space_ruins | lava_ruins
|
||||
|
||||
for(var/item in subtypesof(/datum/map_template/ruin))
|
||||
var/datum/map_template/ruin/ruin_type = item
|
||||
@@ -131,7 +130,8 @@
|
||||
continue
|
||||
var/datum/map_template/ruin/R = new ruin_type()
|
||||
|
||||
if(banned.Find(R.mappath))
|
||||
// If not in the active list, skip it
|
||||
if(!(R.mappath in all_ruins))
|
||||
continue
|
||||
|
||||
GLOB.map_templates[R.name] = R
|
||||
|
||||
@@ -484,7 +484,7 @@
|
||||
head = /obj/item/clothing/head/xenos
|
||||
glasses = /obj/item/clothing/glasses/thermal
|
||||
l_pocket = /obj/item/tank/internals/emergency_oxygen/double
|
||||
r_pocket = /obj/item/toy/toy_xeno
|
||||
r_pocket = /obj/item/toy/figure/xeno
|
||||
backpack_contents = list(
|
||||
/obj/item/storage/box/survival = 1,
|
||||
/obj/item/clothing/head/welding = 1,
|
||||
|
||||
@@ -93,10 +93,10 @@ GLOBAL_PROTECT(revision_info) // Dont mess with this
|
||||
msg += "<b>Round ID:</b> [GLOB.round_id ? GLOB.round_id : "NULL"]"
|
||||
|
||||
// Commit info
|
||||
if(GLOB.revision_info.commit_hash && GLOB.revision_info.commit_date)
|
||||
msg += "<b>Server Commit:</b> <a href='[config.githuburl]/commit/[GLOB.revision_info.commit_hash]'>[GLOB.revision_info.commit_hash]</a> (Date: [GLOB.revision_info.commit_date])"
|
||||
if(GLOB.revision_info.commit_hash && GLOB.revision_info.commit_date && GLOB.configuration.url.github_url)
|
||||
msg += "<b>Server Commit:</b> <a href='[GLOB.configuration.url.github_url]/commit/[GLOB.revision_info.commit_hash]'>[GLOB.revision_info.commit_hash]</a> (Date: [GLOB.revision_info.commit_date])"
|
||||
if(GLOB.revision_info.origin_commit && (GLOB.revision_info.commit_hash != GLOB.revision_info.origin_commit))
|
||||
msg += "<b>Origin Commit:</b> <a href='[config.githuburl]/commit/[GLOB.revision_info.origin_commit]'>[GLOB.revision_info.origin_commit]</a>"
|
||||
msg += "<b>Origin Commit:</b> <a href='[GLOB.configuration.url.github_url]/commit/[GLOB.revision_info.origin_commit]'>[GLOB.revision_info.origin_commit]</a>"
|
||||
else
|
||||
msg += "<b>Server Commit:</b> <i>Unable to determine</i>"
|
||||
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
/datum/map_template/ruin/lavaland
|
||||
prefix = "_maps/map_files/RandomRuins/LavaRuins/"
|
||||
ci_exclude = /datum/map_template/ruin/lavaland
|
||||
|
||||
/datum/map_template/ruin/lavaland/biodome
|
||||
cost = 5
|
||||
allow_duplicates = FALSE
|
||||
ci_exclude = /datum/map_template/ruin/lavaland/biodome // This is a parent holder, not a ruin itself
|
||||
|
||||
/datum/map_template/ruin/lavaland/biodome/beach
|
||||
name = "Biodome Beach"
|
||||
@@ -71,6 +73,7 @@
|
||||
/datum/map_template/ruin/lavaland/sin
|
||||
cost = 10
|
||||
allow_duplicates = FALSE
|
||||
ci_exclude = /datum/map_template/ruin/lavaland/sin // This is a parent holder, not a ruin itself
|
||||
|
||||
/datum/map_template/ruin/lavaland/sin/envy
|
||||
name = "Ruin of Envy"
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
/datum/map_template/ruin/space
|
||||
prefix = "_maps/map_files/RandomRuins/SpaceRuins/"
|
||||
cost = 1
|
||||
ci_exclude = /datum/map_template/ruin/space
|
||||
|
||||
/datum/map_template/ruin/space/zoo
|
||||
id = "zoo"
|
||||
|
||||
@@ -121,6 +121,8 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell))
|
||||
|
||||
var/critfailchance = 0
|
||||
var/centcom_cancast = TRUE //Whether or not the spell should be allowed on the admin zlevel
|
||||
/// Whether or not the spell functions in a holy place
|
||||
var/holy_area_cancast = TRUE
|
||||
|
||||
var/datum/action/spell_action/action = null
|
||||
var/action_icon = 'icons/mob/actions/actions.dmi'
|
||||
@@ -558,9 +560,13 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell))
|
||||
to_chat(user, "<span class='warning'>You shouldn't have this spell! Something's wrong.</span>")
|
||||
return 0
|
||||
|
||||
if(is_admin_level(user.z) && !centcom_cancast) //Certain spells are not allowed on the centcom zlevel
|
||||
var/turf/T = get_turf(user)
|
||||
if(is_admin_level(T.z) && !centcom_cancast) //Certain spells are not allowed on the centcom zlevel
|
||||
return 0
|
||||
|
||||
if(!holy_area_cancast && user.holy_check())
|
||||
return FALSE
|
||||
|
||||
if(charge_check)
|
||||
switch(charge_type)
|
||||
if("recharge")
|
||||
|
||||
@@ -25,14 +25,14 @@
|
||||
var/A = null
|
||||
|
||||
if(!randomise_selection)
|
||||
A = input("Area to teleport to", "Teleport", A) as null|anything in GLOB.teleportlocs
|
||||
A = input("Area to teleport to", "Teleport", A) as null|anything in SSmapping.teleportlocs
|
||||
else
|
||||
A = pick(GLOB.teleportlocs)
|
||||
A = pick(SSmapping.teleportlocs)
|
||||
|
||||
if(!A)
|
||||
return
|
||||
|
||||
var/area/thearea = GLOB.teleportlocs[A]
|
||||
var/area/thearea = SSmapping.teleportlocs[A]
|
||||
|
||||
if(thearea.tele_proof && !istype(thearea, /area/wizard_station))
|
||||
to_chat(usr, "A mysterious force disrupts your arcane spell matrix, and you remain where you are.")
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
range = 0
|
||||
summon_type = list(/turf/simulated/floor/engine/cult)
|
||||
centcom_cancast = FALSE //Stop crashing the server by spawning turfs on transit tiles
|
||||
holy_area_cancast = FALSE //Stops cult magic from working on holy ground eg: chapel
|
||||
|
||||
/obj/effect/proc_holder/spell/aoe_turf/conjure/wall
|
||||
name = "Summon Cult Wall"
|
||||
@@ -32,6 +33,7 @@
|
||||
range = 0
|
||||
summon_type = list(/turf/simulated/wall/cult/artificer) //we don't want artificer-based runed metal farms
|
||||
centcom_cancast = FALSE //Stop crashing the server by spawning turfs on transit tiles
|
||||
holy_area_cancast = FALSE //Stops cult magic from working on holy ground eg: chapel
|
||||
|
||||
/obj/effect/proc_holder/spell/aoe_turf/conjure/wall/reinforced
|
||||
name = "Greater Construction"
|
||||
@@ -43,6 +45,7 @@
|
||||
invocation_type = "none"
|
||||
range = 0
|
||||
centcom_cancast = FALSE //Stop crashing the server by spawning turfs on transit tiles
|
||||
holy_area_cancast = FALSE //Stops cult magic from working on holy ground eg: chapel
|
||||
delay = 50
|
||||
|
||||
summon_type = list(/turf/simulated/wall/r_wall)
|
||||
@@ -58,6 +61,7 @@
|
||||
invocation = "none"
|
||||
invocation_type = "none"
|
||||
range = 0
|
||||
holy_area_cancast = FALSE //Stops cult magic from working on holy ground eg: chapel
|
||||
|
||||
summon_type = list(/obj/item/soulstone)
|
||||
|
||||
@@ -77,6 +81,7 @@
|
||||
invocation = "none"
|
||||
invocation_type = "none"
|
||||
range = 0
|
||||
holy_area_cancast = FALSE //Stops cult magic from working on holy ground eg: chapel
|
||||
|
||||
summon_type = list(/obj/structure/cult/functional/pylon)
|
||||
|
||||
@@ -92,6 +97,7 @@
|
||||
invocation = "none"
|
||||
invocation_type = "none"
|
||||
range = 0
|
||||
holy_area_cancast = FALSE //Stops cult magic from working on holy ground eg: chapel
|
||||
summon_type = list(/obj/effect/forcefield/cult)
|
||||
summon_lifespan = 200
|
||||
|
||||
@@ -111,6 +117,7 @@
|
||||
clothes_req = FALSE
|
||||
invocation = "none"
|
||||
invocation_type = "none"
|
||||
holy_area_cancast = FALSE //Stops cult magic from working on holy ground eg: chapel
|
||||
jaunt_in_time = 12
|
||||
jaunt_in_type = /obj/effect/temp_visual/dir_setting/wraith
|
||||
jaunt_out_type = /obj/effect/temp_visual/dir_setting/wraith/out
|
||||
@@ -137,6 +144,7 @@
|
||||
clothes_req = FALSE
|
||||
invocation = "none"
|
||||
invocation_type = "none"
|
||||
holy_area_cancast = FALSE //Stops cult magic from working on holy ground eg: chapel
|
||||
proj_lifespan = 10
|
||||
max_targets = 6
|
||||
|
||||
@@ -150,6 +158,7 @@
|
||||
clothes_req = FALSE
|
||||
invocation = "none"
|
||||
invocation_type = "none"
|
||||
holy_area_cancast = FALSE //Stops cult magic from working on holy ground eg: chapel
|
||||
range = -1
|
||||
include_user = 1
|
||||
cooldown_min = 20 //25 deciseconds reduction per rank
|
||||
|
||||
@@ -25,13 +25,13 @@
|
||||
if(istype(S,/obj/effect/proc_holder/spell/targeted/lichdom) && S != src)
|
||||
return ..()
|
||||
if(existence_stops_round_end)
|
||||
config.continuous_rounds = 0
|
||||
GLOB.configuration.gamemode.disable_certain_round_early_end = FALSE
|
||||
return ..()
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/lichdom/cast(list/targets, mob/user = usr)
|
||||
if(!config.continuous_rounds)
|
||||
existence_stops_round_end = 1
|
||||
config.continuous_rounds = 1
|
||||
if(!GLOB.configuration.gamemode.disable_certain_round_early_end)
|
||||
existence_stops_round_end = TRUE
|
||||
GLOB.configuration.gamemode.disable_certain_round_early_end = TRUE
|
||||
|
||||
for(var/mob/M in targets)
|
||||
var/list/hand_items = list()
|
||||
|
||||
@@ -105,6 +105,10 @@
|
||||
alert_type = null
|
||||
var/hand
|
||||
var/deathTick = 0
|
||||
/// How many points the rod has to heal with, maxes at 50, or whatever heal_points_max is set to.
|
||||
var/heal_points = 50
|
||||
/// Max heal points for the rod to spend on healing people
|
||||
var/max_heal_points = 50
|
||||
|
||||
/datum/status_effect/hippocraticOath/on_apply()
|
||||
//Makes the user passive, it's in their oath not to harm!
|
||||
@@ -173,8 +177,12 @@
|
||||
itemUser.adjustStaminaLoss(-1.5)
|
||||
itemUser.adjustBrainLoss(-1.5)
|
||||
itemUser.adjustCloneLoss(-0.5) //Becasue apparently clone damage is the bastion of all health
|
||||
if(heal_points < max_heal_points)
|
||||
heal_points = min(heal_points += 3, max_heal_points)
|
||||
//Heal all those around you, unbiased
|
||||
for(var/mob/living/L in view(7, owner))
|
||||
if(heal_points <= 0)
|
||||
break
|
||||
if(L.health < L.maxHealth)
|
||||
new /obj/effect/temp_visual/heal(get_turf(L), "#375637")
|
||||
if(iscarbon(L))
|
||||
@@ -185,18 +193,23 @@
|
||||
L.adjustStaminaLoss(-3.5)
|
||||
L.adjustBrainLoss(-3.5)
|
||||
L.adjustCloneLoss(-1) //Becasue apparently clone damage is the bastion of all health
|
||||
heal_points--
|
||||
if(ishuman(L))
|
||||
var/mob/living/carbon/human/H = L
|
||||
for(var/obj/item/organ/external/E in H.bodyparts)
|
||||
if(prob(10))
|
||||
E.mend_fracture()
|
||||
E.internal_bleeding = FALSE
|
||||
heal_points--
|
||||
else if(issilicon(L))
|
||||
L.adjustBruteLoss(-3.5)
|
||||
L.adjustFireLoss(-3.5)
|
||||
heal_points--
|
||||
else if(isanimal(L))
|
||||
var/mob/living/simple_animal/SM = L
|
||||
SM.adjustHealth(-3.5)
|
||||
if(prob(50))
|
||||
heal_points -- // Animals are simpler
|
||||
|
||||
/obj/screen/alert/status_effect/regenerative_core
|
||||
name = "Reinforcing Tendrils"
|
||||
|
||||
@@ -905,7 +905,8 @@ GLOBAL_LIST_INIT(all_supply_groups, list(SUPPLY_EMERGENCY,SUPPLY_SECURITY,SUPPLY
|
||||
/obj/item/reagent_containers/iv_bag/blood/BPlus,
|
||||
/obj/item/reagent_containers/iv_bag/blood/BMinus,
|
||||
/obj/item/reagent_containers/iv_bag/blood/OPlus,
|
||||
/obj/item/reagent_containers/iv_bag/blood/OMinus)
|
||||
/obj/item/reagent_containers/iv_bag/blood/OMinus,
|
||||
/obj/item/reagent_containers/iv_bag/slime)
|
||||
cost = 35
|
||||
containertype = /obj/structure/closet/crate/freezer
|
||||
containername = "blood pack crate"
|
||||
|
||||
@@ -849,11 +849,11 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
|
||||
/datum/uplink_item/stealthy_weapons/martialarts
|
||||
name = "Martial Arts Scroll"
|
||||
desc = "This scroll contains the secrets of an ancient martial arts technique. You will master unarmed combat, \
|
||||
deflecting all ranged weapon fire, but you also refuse to use dishonorable ranged weaponry. \
|
||||
deflecting ranged weapon fire when you are in a defensive stance (throw mode). Learning this art means you will also refuse to use dishonorable ranged weaponry. \
|
||||
Unable to be understood by vampire and changeling agents."
|
||||
reference = "SCS"
|
||||
item = /obj/item/sleeping_carp_scroll
|
||||
cost = 17
|
||||
cost = 13
|
||||
excludefrom = list(/datum/game_mode/nuclear)
|
||||
refundable = TRUE
|
||||
cant_discount = TRUE
|
||||
|
||||
Reference in New Issue
Block a user