mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-11 15:14:27 +01:00
Merge branch 'master' into logging-improvements
This commit is contained in:
@@ -47,6 +47,7 @@ jobs:
|
||||
install:
|
||||
- pip install --user PyYaml -q
|
||||
- pip install --user beautifulsoup4 -q
|
||||
- tools/travis/install_dreamchecker.sh
|
||||
before_script: skip
|
||||
script:
|
||||
- shopt -s globstar
|
||||
@@ -54,6 +55,7 @@ jobs:
|
||||
- (num=$(grep -Ern '\\(red|blue|green|black|italic|bold|b|i[^mc])' code/ | wc -l); echo "$num BYOND text macros (expecting ${BYOND_MACRO_COUNT} or fewer)"; [ $num -le ${BYOND_MACRO_COUNT} ])
|
||||
- md5sum -c - <<< "6dc1b6bf583f3bd4176b6df494caa5f1 *html/changelogs/example.yml"
|
||||
- python tools/ss13_genchangelog.py html/changelog.html html/changelogs
|
||||
- ~/dreamchecker
|
||||
|
||||
# Compile NanoUI to make sure it works
|
||||
- stage: NanoUI
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
# This file has all the information on what versions of libraries are thrown into the code
|
||||
export SPACEMANDMM_TAG=suite-1.2
|
||||
@@ -1241,21 +1241,6 @@
|
||||
/obj/structure/sign/securearea,
|
||||
/turf/simulated/wall/mineral/plastitanium/explosive,
|
||||
/area/ruin/unpowered/syndicate_lava_base/main)
|
||||
"cf" = (
|
||||
/obj/structure/table/reinforced,
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
dir = 1
|
||||
},
|
||||
/obj/effect/turf_decal/tile/neutral,
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
dir = 4
|
||||
},
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
dir = 8
|
||||
},
|
||||
/obj/item/radio/intercom/syndicate,
|
||||
/turf/simulated/floor/plasteel/dark,
|
||||
/area/ruin/unpowered/syndicate_lava_base/telecomms)
|
||||
"cg" = (
|
||||
/obj/machinery/portable_atmospherics/canister/nitrogen,
|
||||
/turf/simulated/floor/engine{
|
||||
@@ -3529,10 +3514,6 @@
|
||||
/obj/machinery/alarm/syndicate{
|
||||
pixel_y = 24
|
||||
},
|
||||
/obj/item/radio/headset/syndicate/alt{
|
||||
pixel_x = -3;
|
||||
pixel_y = 3
|
||||
},
|
||||
/turf/simulated/floor/plasteel/grimy,
|
||||
/area/ruin/unpowered/syndicate_lava_base/dormitories)
|
||||
"hN" = (
|
||||
@@ -3558,10 +3539,6 @@
|
||||
/obj/machinery/alarm/syndicate{
|
||||
pixel_y = 24
|
||||
},
|
||||
/obj/item/radio/headset/syndicate/alt{
|
||||
pixel_x = -3;
|
||||
pixel_y = 3
|
||||
},
|
||||
/turf/simulated/floor/plasteel/grimy,
|
||||
/area/ruin/unpowered/syndicate_lava_base/dormitories)
|
||||
"hR" = (
|
||||
@@ -4479,10 +4456,6 @@
|
||||
/obj/structure/table/wood,
|
||||
/obj/item/ammo_box/magazine/m10mm,
|
||||
/obj/item/ammo_box/magazine/sniper_rounds,
|
||||
/obj/item/radio/headset/syndicate/alt{
|
||||
pixel_x = -3;
|
||||
pixel_y = 3
|
||||
},
|
||||
/turf/simulated/floor/plasteel/grimy,
|
||||
/area/ruin/unpowered/syndicate_lava_base/dormitories)
|
||||
"jB" = (
|
||||
@@ -6785,7 +6758,6 @@
|
||||
/obj/machinery/computer/message_monitor{
|
||||
dir = 1
|
||||
},
|
||||
/obj/item/paper/monitorkey,
|
||||
/turf/simulated/floor/plasteel/dark,
|
||||
/area/ruin/unpowered/syndicate_lava_base/telecomms)
|
||||
"ov" = (
|
||||
@@ -7400,7 +7372,7 @@ mp
|
||||
mQ
|
||||
nl
|
||||
nJ
|
||||
cf
|
||||
nJ
|
||||
ov
|
||||
mn
|
||||
ab
|
||||
|
||||
@@ -99,14 +99,14 @@
|
||||
"m" = (
|
||||
/obj/structure/closet/crate/freezer,
|
||||
/obj/item/stack/sheet/animalhide/lizard,
|
||||
/obj/item/reagent_containers/food/snacks/lizardmeat,
|
||||
/obj/item/reagent_containers/food/snacks/monstermeat/lizardmeat,
|
||||
/turf/simulated/floor/plasteel{
|
||||
icon_state = "dark"
|
||||
},
|
||||
/area/ruin/unpowered)
|
||||
"n" = (
|
||||
/obj/structure/closet/crate/freezer,
|
||||
/obj/item/reagent_containers/food/snacks/lizardmeat,
|
||||
/obj/item/reagent_containers/food/snacks/monstermeat/lizardmeat,
|
||||
/obj/machinery/light{
|
||||
dir = 1
|
||||
},
|
||||
@@ -116,7 +116,7 @@
|
||||
/area/ruin/unpowered)
|
||||
"o" = (
|
||||
/obj/structure/closet/crate/freezer,
|
||||
/obj/item/reagent_containers/food/snacks/lizardmeat,
|
||||
/obj/item/reagent_containers/food/snacks/monstermeat/lizardmeat,
|
||||
/turf/simulated/floor/plasteel{
|
||||
icon_state = "dark"
|
||||
},
|
||||
|
||||
@@ -5598,7 +5598,7 @@
|
||||
},
|
||||
/area/syndicate_depot/outer)
|
||||
"lZ" = (
|
||||
/obj/item/reagent_containers/food/snacks/spiderleg,
|
||||
/obj/item/reagent_containers/food/snacks/monstermeat/spiderleg,
|
||||
/obj/structure/spider,
|
||||
/turf/simulated/floor/plasteel{
|
||||
icon_state = "dark"
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
// This file contains all the defines related to the spacemanDMM linter (dreamchecker). When running under normal conditions, BYOND will ignore all these
|
||||
#ifdef SPACEMAN_DMM
|
||||
#define RETURN_TYPE(X) set SpacemanDMM_return_type = X
|
||||
#define SHOULD_CALL_PARENT(X) set SpacemanDMM_should_call_parent = X
|
||||
#define UNLINT(X) SpacemanDMM_unlint(X)
|
||||
#define SHOULD_NOT_OVERRIDE(X) set SpacemanDMM_should_not_override = X
|
||||
#define SHOULD_NOT_SLEEP(X)
|
||||
#define SHOULD_BE_PURE(X)
|
||||
#define PRIVATE_PROC(X)
|
||||
#define PROTECTED_PROC(X)
|
||||
#define VAR_FINAL var/SpacemanDMM_final
|
||||
#define VAR_PRIVATE var
|
||||
#define VAR_PROTECTED var
|
||||
#else
|
||||
#define RETURN_TYPE(X)
|
||||
#define SHOULD_CALL_PARENT(X)
|
||||
#define UNLINT(X) X
|
||||
#define SHOULD_NOT_OVERRIDE(X)
|
||||
#define SHOULD_NOT_SLEEP(X)
|
||||
#define SHOULD_BE_PURE(X)
|
||||
#define PRIVATE_PROC(X)
|
||||
#define PROTECTED_PROC(X)
|
||||
#define VAR_FINAL var
|
||||
#define VAR_PRIVATE var
|
||||
#define VAR_PROTECTED var
|
||||
#endif
|
||||
@@ -40,10 +40,11 @@
|
||||
#define R_MOD 8192
|
||||
#define R_MENTOR 16384
|
||||
#define R_PROCCALL 32768
|
||||
#define R_VIEWRUNTIMES 65536
|
||||
|
||||
#define R_MAXPERMISSION 32768 //This holds the maximum value for a permission. It is used in iteration, so keep it updated.
|
||||
#define R_MAXPERMISSION 65536 //This holds the maximum value for a permission. It is used in iteration, so keep it updated.
|
||||
|
||||
#define R_HOST 65535
|
||||
#define R_HOST 131071 // Sum of all permissions to allow easy setting
|
||||
|
||||
#define ADMIN_QUE(user,display) "<a href='?_src_=holder;adminmoreinfo=[user.UID()]'>[display]</a>"
|
||||
#define ADMIN_FLW(user,display) "<a href='?_src_=holder;adminplayerobservefollow=[user.UID()]'>[display]</a>"
|
||||
|
||||
@@ -78,7 +78,7 @@
|
||||
|
||||
//flags for covering body parts
|
||||
#define GLASSESCOVERSEYES 1
|
||||
#define MASKCOVERSEYES 2 // get rid of some of the other retardation in these flags
|
||||
#define MASKCOVERSEYES 2 // get rid of some of the other mess in these flags
|
||||
#define HEADCOVERSEYES 4 // feel free to realloc these numbers for other purposes
|
||||
#define MASKCOVERSMOUTH 8 // on other items, these are just for mask/head
|
||||
#define HEADCOVERSMOUTH 16
|
||||
|
||||
@@ -66,6 +66,7 @@
|
||||
#define INIT_ORDER_TIMER 1
|
||||
#define INIT_ORDER_DEFAULT 0
|
||||
#define INIT_ORDER_AIR -1
|
||||
#define INIT_ORDER_SUN -2
|
||||
#define INIT_ORDER_MINIMAP -3
|
||||
#define INIT_ORDER_ASSETS -4
|
||||
#define INIT_ORDER_ICON_SMOOTHING -5
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
/proc/get_area(atom/A)
|
||||
RETURN_TYPE(/area)
|
||||
if(isarea(A))
|
||||
return A
|
||||
var/turf/T = get_turf(A)
|
||||
|
||||
@@ -570,6 +570,18 @@ world
|
||||
/proc/BlendRGBasHSV(rgb1, rgb2, amount)
|
||||
return HSVtoRGB(RGBtoHSV(rgb1), RGBtoHSV(rgb2), amount)
|
||||
|
||||
//Returns the perceived brightness of a color.
|
||||
//https://en.wikipedia.org/wiki/Relative_luminance
|
||||
//https://stackoverflow.com/questions/596216/formula-to-determine-brightness-of-rgb-color
|
||||
/proc/getLuminance(color)
|
||||
var/list/RGB = ReadRGB(color)
|
||||
var/R = RGB[1]
|
||||
var/G = RGB[2]
|
||||
var/B = RGB[2]
|
||||
|
||||
var/Y = (0.2126 * R) + (0.7152 * G) + (0.0722 * B)
|
||||
return clamp((Y * 0.01), 0, 1) //Returns the brightness of a color in decimal percentage format. Can multiply light_power by this to receive 100% brightness or a lower brightness. Not a higher brightness.
|
||||
|
||||
/proc/HueToAngle(hue)
|
||||
// normalize hsv in case anything is screwy
|
||||
if(hue < 0 || hue >= 1536) hue %= 1536
|
||||
|
||||
@@ -277,8 +277,8 @@ This is always put in the attack log.
|
||||
/proc/add_attack_logs(atom/user, target, what_done, custom_level)
|
||||
if(islist(target)) // Multi-victim adding
|
||||
var/list/targets = target
|
||||
for(var/mob/M in targets)
|
||||
add_attack_logs(user, M, what_done, custom_level)
|
||||
for(var/t in targets)
|
||||
add_attack_logs(user, t, what_done, custom_level)
|
||||
return
|
||||
|
||||
var/user_str = key_name_log(user) + COORD(user)
|
||||
@@ -316,7 +316,7 @@ This is always put in the attack log.
|
||||
|
||||
msg_admin_attack("[key_name_admin(user)] vs [key_name_admin(target)]: [what_done]", loglevel)
|
||||
|
||||
/proc/do_mob(var/mob/user, var/mob/target, var/time = 30, var/uninterruptible = 0, progress = 1, datum/callback/extra_checks = null)
|
||||
/proc/do_mob(mob/user, mob/target, time = 30, uninterruptible = 0, progress = 1, list/extra_checks = list())
|
||||
if(!user || !target)
|
||||
return 0
|
||||
var/user_loc = user.loc
|
||||
@@ -349,7 +349,7 @@ This is always put in the attack log.
|
||||
drifting = 0
|
||||
user_loc = user.loc
|
||||
|
||||
if((!drifting && user.loc != user_loc) || target.loc != target_loc || user.get_active_hand() != holding || user.incapacitated() || user.lying || (extra_checks && !extra_checks.Invoke()))
|
||||
if((!drifting && user.loc != user_loc) || target.loc != target_loc || user.get_active_hand() != holding || user.incapacitated() || user.lying || check_for_true_callbacks(extra_checks))
|
||||
. = 0
|
||||
break
|
||||
if(progress)
|
||||
@@ -454,8 +454,8 @@ GLOBAL_LIST_INIT(do_after_once_tracker, list())
|
||||
/proc/do_after_once_checks(cache_key)
|
||||
if(GLOB.do_after_once_tracker[cache_key] && GLOB.do_after_once_tracker[cache_key] == DOAFTERONCE_MAGIC)
|
||||
GLOB.do_after_once_tracker[cache_key] = FALSE
|
||||
return FALSE
|
||||
return TRUE
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/proc/is_species(A, species_datum)
|
||||
. = FALSE
|
||||
|
||||
@@ -167,7 +167,7 @@
|
||||
return SOUTH
|
||||
if(225.6 to 315.5)
|
||||
return WEST
|
||||
|
||||
|
||||
//returns the north-zero clockwise angle in degrees, given a direction
|
||||
|
||||
/proc/dir2angle(var/D)
|
||||
@@ -212,6 +212,7 @@
|
||||
if(rights & R_PROCCALL) . += "[seperator]+PROCCALL"
|
||||
if(rights & R_MOD) . += "[seperator]+MODERATOR"
|
||||
if(rights & R_MENTOR) . += "[seperator]+MENTOR"
|
||||
if(rights & R_VIEWRUNTIMES) . += "[seperator]+VIEWRUNTIMES"
|
||||
return .
|
||||
|
||||
/proc/ui_style2icon(ui_style)
|
||||
|
||||
@@ -28,4 +28,4 @@ This may require updating to a beta release.
|
||||
#endif
|
||||
|
||||
// Macros that must exist before world.dm
|
||||
#define to_chat to_chat_filename=__FILE__;to_chat_line=__LINE__;to_chat_src=src;__to_chat
|
||||
// #define to_chat to_chat_filename=__FILE__;to_chat_line=__LINE__;to_chat_src=src;__to_chat
|
||||
|
||||
@@ -179,7 +179,7 @@
|
||||
|
||||
var/title = name
|
||||
if(can_fire)
|
||||
title = "\[[state_letter()]][title]"
|
||||
title = "[state_colour()]\[[state_letter()]][title]</font>"
|
||||
|
||||
stat(title, statclick.update(msg))
|
||||
|
||||
@@ -196,6 +196,18 @@
|
||||
if(SS_IDLE)
|
||||
. = " "
|
||||
|
||||
/datum/controller/subsystem/proc/state_colour()
|
||||
switch(state)
|
||||
if(SS_RUNNING) // If its actively processing, colour it green
|
||||
. = "<font color='#32a852'>"
|
||||
if(SS_QUEUED) // If its in the running queue, but delayed, colour it orange
|
||||
. = "<font color='#fcba03'>"
|
||||
if(SS_PAUSED, SS_PAUSING) // If its being paused due to lag, colour it red
|
||||
. = "<font color='#eb4034'>"
|
||||
if(SS_SLEEPING) // If fire() slept, colour it blue
|
||||
. = "<font color='#4287f5'>"
|
||||
if(SS_IDLE) // Leave it default if the SS is idle
|
||||
. = "<font>"
|
||||
//could be used to postpone a costly subsystem for (default one) var/cycles, cycles
|
||||
//for instance, during cpu intensive operations like explosions
|
||||
/datum/controller/subsystem/proc/postpone(cycles = 1)
|
||||
|
||||
@@ -36,7 +36,7 @@ SUBSYSTEM_DEF(events)
|
||||
E.process()
|
||||
|
||||
for(var/i = EVENT_LEVEL_MUNDANE to EVENT_LEVEL_MAJOR)
|
||||
var/list/datum/event_container/EC = event_containers[i]
|
||||
var/datum/event_container/EC = event_containers[i]
|
||||
EC.process()
|
||||
|
||||
/datum/controller/subsystem/events/proc/event_complete(var/datum/event/E)
|
||||
@@ -65,7 +65,7 @@ SUBSYSTEM_DEF(events)
|
||||
log_debug("Event '[EM.name]' has completed at [station_time_timestamp()].")
|
||||
|
||||
/datum/controller/subsystem/events/proc/delay_events(var/severity, var/delay)
|
||||
var/list/datum/event_container/EC = event_containers[severity]
|
||||
var/datum/event_container/EC = event_containers[severity]
|
||||
EC.next_event_time += delay
|
||||
|
||||
/datum/controller/subsystem/events/proc/Interact(var/mob/living/user)
|
||||
|
||||
@@ -10,7 +10,7 @@ SUBSYSTEM_DEF(jobs)
|
||||
var/list/type_occupations = list() //Dict of all jobs, keys are types
|
||||
var/list/prioritized_jobs = list() // List of jobs set to priority by HoP/Captain
|
||||
var/list/id_change_records = list() // List of all job transfer records
|
||||
var/list/id_change_counter = 1
|
||||
var/id_change_counter = 1
|
||||
//Players who need jobs
|
||||
var/list/unassigned = list()
|
||||
//Debug info
|
||||
@@ -39,8 +39,6 @@ SUBSYSTEM_DEF(jobs)
|
||||
var/datum/job/job = new J()
|
||||
if(!job)
|
||||
continue
|
||||
if(!job.faction in faction)
|
||||
continue
|
||||
occupations += job
|
||||
name_occupations[job.title] = job
|
||||
type_occupations[J] = job
|
||||
@@ -138,7 +136,7 @@ SUBSYSTEM_DEF(jobs)
|
||||
if(flag && !(flag in player.client.prefs.be_special))
|
||||
Debug("FOC flag failed, Player: [player], Flag: [flag], ")
|
||||
continue
|
||||
if(player.mind && job.title in player.mind.restricted_roles)
|
||||
if(player.mind && (job.title in player.mind.restricted_roles))
|
||||
Debug("FOC incompatbile with antagonist role, Player: [player]")
|
||||
continue
|
||||
if(player.client.prefs.GetJobDepartment(job, level) & job.flag)
|
||||
@@ -180,7 +178,7 @@ SUBSYSTEM_DEF(jobs)
|
||||
Debug("GRJ player has disability rendering them ineligible for job, Player: [player]")
|
||||
continue
|
||||
|
||||
if(player.mind && job.title in player.mind.restricted_roles)
|
||||
if(player.mind && (job.title in player.mind.restricted_roles))
|
||||
Debug("GRJ incompatible with antagonist role, Player: [player], Job: [job.title]")
|
||||
continue
|
||||
|
||||
@@ -357,7 +355,7 @@ SUBSYSTEM_DEF(jobs)
|
||||
Debug("DO player has disability rendering them ineligible for job, Player: [player], Job:[job.title]")
|
||||
continue
|
||||
|
||||
if(player.mind && job.title in player.mind.restricted_roles)
|
||||
if(player.mind && (job.title in player.mind.restricted_roles))
|
||||
Debug("DO incompatible with antagonist role, Player: [player], Job:[job.title]")
|
||||
continue
|
||||
|
||||
@@ -622,7 +620,9 @@ SUBSYSTEM_DEF(jobs)
|
||||
if(tgtcard.assignment && tgtcard.assignment == job.title)
|
||||
jobs_to_formats[job.title] = "disabled" // the job they already have is pre-selected
|
||||
else if(!job.would_accept_job_transfer_from_player(M))
|
||||
jobs_to_formats[job.title] = "linkDiscourage" // karma jobs they don't have available are discouraged
|
||||
jobs_to_formats[job.title] = "linkDiscourage" // jobs which are karma-locked and not unlocked for this player are discouraged
|
||||
else if((job.title in GLOB.command_positions) && istype(M) && M.client && job.available_in_playtime(M.client))
|
||||
jobs_to_formats[job.title] = "linkDiscourage" // command jobs which are playtime-locked and not unlocked for this player are discouraged
|
||||
else if(job.total_positions && !job.current_positions && job.title != "Civilian")
|
||||
jobs_to_formats[job.title] = "linkEncourage" // jobs with nobody doing them at all are encouraged
|
||||
else if(job.total_positions >= 0 && job.current_positions >= job.total_positions)
|
||||
|
||||
@@ -32,5 +32,90 @@ SUBSYSTEM_DEF(mapping)
|
||||
|
||||
return ..()
|
||||
|
||||
|
||||
/datum/controller/subsystem/mapping/proc/seedRuins(list/z_levels = null, budget = 0, whitelist = /area/space, list/potentialRuins)
|
||||
if(!z_levels || !z_levels.len)
|
||||
WARNING("No Z levels provided - Not generating ruins")
|
||||
return
|
||||
|
||||
for(var/zl in z_levels)
|
||||
var/turf/T = locate(1, 1, zl)
|
||||
if(!T)
|
||||
WARNING("Z level [zl] does not exist - Not generating ruins")
|
||||
return
|
||||
|
||||
var/list/ruins = potentialRuins.Copy()
|
||||
|
||||
var/list/forced_ruins = list() //These go first on the z level associated (same random one by default)
|
||||
var/list/ruins_availible = list() //we can try these in the current pass
|
||||
var/forced_z //If set we won't pick z level and use this one instead.
|
||||
|
||||
//Set up the starting ruin list
|
||||
for(var/key in ruins)
|
||||
var/datum/map_template/ruin/R = ruins[key]
|
||||
if(R.cost > budget) //Why would you do that
|
||||
continue
|
||||
if(R.always_place)
|
||||
forced_ruins[R] = -1
|
||||
if(R.unpickable)
|
||||
continue
|
||||
ruins_availible[R] = R.placement_weight
|
||||
|
||||
while(budget > 0 && (ruins_availible.len || forced_ruins.len))
|
||||
var/datum/map_template/ruin/current_pick
|
||||
var/forced = FALSE
|
||||
if(forced_ruins.len) //We have something we need to load right now, so just pick it
|
||||
for(var/ruin in forced_ruins)
|
||||
current_pick = ruin
|
||||
if(forced_ruins[ruin] > 0) //Load into designated z
|
||||
forced_z = forced_ruins[ruin]
|
||||
forced = TRUE
|
||||
break
|
||||
else //Otherwise just pick random one
|
||||
current_pick = pickweight(ruins_availible)
|
||||
|
||||
var/placement_tries = PLACEMENT_TRIES
|
||||
var/failed_to_place = TRUE
|
||||
var/z_placed = 0
|
||||
while(placement_tries > 0)
|
||||
placement_tries--
|
||||
z_placed = pick(z_levels)
|
||||
if(!current_pick.try_to_place(forced_z ? forced_z : z_placed,whitelist))
|
||||
continue
|
||||
else
|
||||
failed_to_place = FALSE
|
||||
break
|
||||
|
||||
//That's done remove from priority even if it failed
|
||||
if(forced)
|
||||
//TODO : handle forced ruins with multiple variants
|
||||
forced_ruins -= current_pick
|
||||
forced = FALSE
|
||||
|
||||
if(failed_to_place)
|
||||
for(var/datum/map_template/ruin/R in ruins_availible)
|
||||
if(R.id == current_pick.id)
|
||||
ruins_availible -= R
|
||||
log_world("Failed to place [current_pick.name] ruin.")
|
||||
else
|
||||
budget -= current_pick.cost
|
||||
if(!current_pick.allow_duplicates)
|
||||
for(var/datum/map_template/ruin/R in ruins_availible)
|
||||
if(R.id == current_pick.id)
|
||||
ruins_availible -= R
|
||||
if(current_pick.never_spawn_with)
|
||||
for(var/blacklisted_type in current_pick.never_spawn_with)
|
||||
for(var/possible_exclusion in ruins_availible)
|
||||
if(istype(possible_exclusion,blacklisted_type))
|
||||
ruins_availible -= possible_exclusion
|
||||
forced_z = 0
|
||||
|
||||
//Update the availible list
|
||||
for(var/datum/map_template/ruin/R in ruins_availible)
|
||||
if(R.cost > budget)
|
||||
ruins_availible -= R
|
||||
|
||||
log_world("Ruin loader finished with [budget] left to spend.")
|
||||
|
||||
/datum/controller/subsystem/mapping/Recover()
|
||||
flags |= SS_NO_INIT
|
||||
|
||||
@@ -223,11 +223,12 @@ SUBSYSTEM_DEF(shuttle)
|
||||
return 0 //dock successful
|
||||
|
||||
|
||||
/datum/controller/subsystem/shuttle/proc/moveShuttle(shuttleId, dockId, timed)
|
||||
/datum/controller/subsystem/shuttle/proc/moveShuttle(shuttleId, dockId, timed, mob/user)
|
||||
var/obj/docking_port/mobile/M = getShuttle(shuttleId)
|
||||
var/obj/docking_port/stationary/D = getDock(dockId)
|
||||
if(!M)
|
||||
return 1
|
||||
M.last_caller = user // Save the caller of the shuttle for later logging
|
||||
if(timed)
|
||||
if(M.request(D))
|
||||
return 2
|
||||
|
||||
@@ -1,19 +1,28 @@
|
||||
SUBSYSTEM_DEF(sun)
|
||||
name = "Sun"
|
||||
wait = 600
|
||||
flags = SS_NO_TICK_CHECK|SS_NO_INIT
|
||||
flags = SS_NO_TICK_CHECK
|
||||
init_order = INIT_ORDER_SUN
|
||||
var/angle
|
||||
var/dx
|
||||
var/dy
|
||||
var/rate
|
||||
var/list/solars = list()
|
||||
|
||||
/datum/controller/subsystem/sun/PreInit()
|
||||
/datum/controller/subsystem/sun/Initialize(start_timeofday)
|
||||
// Lets work out an angle for the "sun" to rotate around the station
|
||||
angle = rand (0,360) // the station position to the sun is randomised at round start
|
||||
rate = rand(50,200)/100 // 50% - 200% of standard rotation
|
||||
if(prob(50)) // same chance to rotate clockwise than counter-clockwise
|
||||
rate = -rate
|
||||
|
||||
// Solar consoles need to load after machines init, so this handles that
|
||||
for(var/obj/machinery/power/solar_control/SC in solars)
|
||||
SC.setup()
|
||||
|
||||
return ..()
|
||||
|
||||
|
||||
/datum/controller/subsystem/sun/stat_entry(msg)
|
||||
..("P:[solars.len]")
|
||||
|
||||
|
||||
@@ -624,7 +624,7 @@ GLOBAL_VAR_INIT(record_id_num, 1001)
|
||||
clothes_s = new /icon('icons/mob/uniform.dmi', "syndicate_s")
|
||||
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "jackboots"), ICON_UNDERLAY)
|
||||
clothes_s.Blend(new /icon('icons/mob/hands.dmi', "swat_gl"), ICON_UNDERLAY)
|
||||
else if(H.mind && H.mind.assigned_role in get_all_centcom_jobs())
|
||||
else if(H.mind && (H.mind.assigned_role in get_all_centcom_jobs()))
|
||||
clothes_s = new /icon('icons/mob/uniform.dmi', "officer_s")
|
||||
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "laceups"), ICON_UNDERLAY)
|
||||
else
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
/// Status traits attached to this datum
|
||||
var/list/status_traits
|
||||
var/list/comp_lookup
|
||||
var/list/signal_procs
|
||||
var/list/list/datum/callback/signal_procs
|
||||
var/signal_enabled = FALSE
|
||||
var/datum_flags = NONE
|
||||
var/var_edited = FALSE //Warranty void if seal is broken
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
affected_mob.emote("stare")
|
||||
if(prob(2))
|
||||
affected_mob.emote("drool")
|
||||
if(prob(10) && affected_mob.getBrainLoss()<=98)//shouldn't retard you to death now
|
||||
if(prob(10) && affected_mob.getBrainLoss()<=98)//shouldn't brainpain you to death now
|
||||
affected_mob.adjustBrainLoss(2)
|
||||
if(prob(2))
|
||||
to_chat(affected_mob, "<span class='danger'>Your try to remember something important...but can't.</span>")
|
||||
@@ -40,7 +40,7 @@
|
||||
affected_mob.emote("stare")
|
||||
if(prob(2))
|
||||
affected_mob.emote("drool")
|
||||
if(prob(15) && affected_mob.getBrainLoss()<=98) //shouldn't retard you to death now
|
||||
if(prob(15) && affected_mob.getBrainLoss()<=98) //shouldn't brainpain you to death now
|
||||
affected_mob.adjustBrainLoss(3)
|
||||
if(prob(2))
|
||||
to_chat(affected_mob, "<span class='danger'>Strange buzzing fills your head, removing all thoughts.</span>")
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
viable_mobtypes = list(/mob/living/carbon/human)
|
||||
disease_flags = CAN_CARRY|CAN_RESIST|CURABLE
|
||||
permeability_mod = 0.75
|
||||
desc = "Some speculate, that this virus is the cause of Wizard Federation existance. Subjects affected show the signs of mental retardation, yelling obscure sentences or total gibberish. On late stages subjects sometime express the feelings of inner power, and, cite, 'the ability to control the forces of cosmos themselves!' A gulp of strong, manly spirits usually reverts them to normal, humanlike, condition."
|
||||
desc = "Some speculate, that this virus is the cause of Wizard Federation existance. Subjects affected show the signs of dementia, yelling obscure sentences or total gibberish. On late stages subjects sometime express the feelings of inner power, and, cite, 'the ability to control the forces of cosmos themselves!' A gulp of strong, manly spirits usually reverts them to normal, humanlike, condition."
|
||||
severity = HARMFUL
|
||||
required_organs = list(/obj/item/organ/external/head)
|
||||
|
||||
|
||||
+3
-4
@@ -54,14 +54,13 @@
|
||||
var/linglink
|
||||
var/datum/vampire/vampire //vampire holder
|
||||
var/datum/abductor/abductor //abductor holder
|
||||
var/datum/devilinfo/devilinfo //devil holder
|
||||
|
||||
var/antag_hud_icon_state = null //this mind's ANTAG_HUD should have this icon_state
|
||||
var/datum/atom_hud/antag/antag_hud = null //this mind's antag HUD
|
||||
var/datum/mindslaves/som //stands for slave or master...hush..
|
||||
var/datum/devilinfo/devilinfo //Information about the devil, if any.
|
||||
var/damnation_type = 0
|
||||
var/datum/mind/soulOwner //who owns the soul. Under normal circumstances, this will point to src
|
||||
var/damnation_type = 0
|
||||
var/datum/mind/soulOwner //who owns the soul. Under normal circumstances, this will point to src
|
||||
var/hasSoul = TRUE
|
||||
|
||||
var/rev_cooldown = 0
|
||||
@@ -547,7 +546,7 @@
|
||||
var/mob/def_target = null
|
||||
var/objective_list[] = list(/datum/objective/assassinate, /datum/objective/protect, /datum/objective/debrain)
|
||||
if(objective&&(objective.type in objective_list) && objective:target)
|
||||
def_target = objective:target.current
|
||||
def_target = objective.target.current
|
||||
possible_targets = sortAtom(possible_targets)
|
||||
possible_targets += "Free objective"
|
||||
|
||||
|
||||
@@ -22,5 +22,4 @@
|
||||
/mutable_appearance/clean/New()
|
||||
. = ..()
|
||||
alpha = 255
|
||||
opacity = 1
|
||||
transform = null
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/datum/outfit
|
||||
var/name = "Naked"
|
||||
var/name = "SOMEBODY FORGOT TO SET A NAME, NOTIFY A CODER"
|
||||
var/collect_not_del = FALSE
|
||||
|
||||
var/uniform = null
|
||||
@@ -33,6 +33,9 @@
|
||||
|
||||
var/can_be_admin_equipped = TRUE // Set to FALSE if your outfit requires runtime parameters
|
||||
|
||||
/datum/outfit/naked
|
||||
name = "Naked"
|
||||
|
||||
/datum/outfit/proc/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
|
||||
//to be overriden for customization depending on client prefs,species etc
|
||||
return
|
||||
|
||||
@@ -541,7 +541,7 @@
|
||||
P.attack_self(H) // activate them, display musical notes effect
|
||||
|
||||
/datum/outfit/admin/soviet
|
||||
|
||||
name = "Soviet Generic"
|
||||
gloves = /obj/item/clothing/gloves/combat
|
||||
uniform = /obj/item/clothing/under/soviet
|
||||
back = /obj/item/storage/backpack/satchel
|
||||
@@ -771,6 +771,7 @@
|
||||
apply_to_card(I, H, get_all_accesses(), "Space Explorer")
|
||||
|
||||
/datum/outfit/admin/hardsuit
|
||||
name = "Hardsuit Generic"
|
||||
back = /obj/item/tank/jetpack/oxygen
|
||||
mask = /obj/item/clothing/mask/breath
|
||||
shoes = /obj/item/clothing/shoes/magboots
|
||||
@@ -823,6 +824,7 @@
|
||||
|
||||
|
||||
/datum/outfit/admin/tournament
|
||||
name = "Tournament Generic"
|
||||
suit = /obj/item/clothing/suit/armor/vest
|
||||
shoes = /obj/item/clothing/shoes/black
|
||||
head = /obj/item/clothing/head/helmet/thunderdome
|
||||
@@ -1100,7 +1102,7 @@
|
||||
l_hand = null
|
||||
backpack_contents = list(
|
||||
/obj/item/storage/box/engineer = 1,
|
||||
/obj/item/clothing/suit/space/hardsuit/shielded/wizard = 1,
|
||||
/obj/item/clothing/suit/space/hardsuit/shielded/wizard/arch = 1,
|
||||
/obj/item/clothing/shoes/magboots = 1,
|
||||
/obj/item/kitchen/knife/ritual = 1,
|
||||
/obj/item/clothing/suit/wizrobe/red = 1,
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
|
||||
/datum/radio_frequency
|
||||
var/frequency as num
|
||||
var/list/list/obj/devices = list()
|
||||
var/list/obj/devices = list()
|
||||
|
||||
/datum/radio_frequency/proc/post_signal(obj/source as obj|null, datum/signal/signal, var/filter = null as text|null, var/range = null as num|null)
|
||||
var/turf/start_point
|
||||
@@ -108,7 +108,7 @@
|
||||
. = "Domestic Animal"
|
||||
else
|
||||
. = "Unidentifiable"
|
||||
|
||||
|
||||
//callback used by objects to react to incoming radio signals
|
||||
/obj/proc/receive_signal(datum/signal/signal, receive_method, receive_param)
|
||||
return null
|
||||
|
||||
@@ -241,7 +241,7 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell))
|
||||
before_cast(targets)
|
||||
invocation()
|
||||
if(user && user.ckey)
|
||||
add_attack_logs(user, null, "cast the spell [name]")
|
||||
add_attack_logs(user, targets, "cast the spell [name]", ATKLOG_ALL)
|
||||
spawn(0)
|
||||
if(charge_type == "recharge" && recharge)
|
||||
start_recharge()
|
||||
|
||||
@@ -95,7 +95,7 @@
|
||||
if(!marked_item) //linking item to the spell
|
||||
message = "<span class='warning'>"
|
||||
for(var/obj/item in hand_items)
|
||||
if(ABSTRACT in item.flags || NODROP in item.flags)
|
||||
if((ABSTRACT in item.flags) || (NODROP in item.flags))
|
||||
continue
|
||||
marked_item = item
|
||||
to_chat(M, "<span class='warning'>You begin to focus your very being into the [item.name]...</span>")
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
else
|
||||
message = "<span class='notice'>You must hold the desired item in your hands to mark it for recall.</span>"
|
||||
|
||||
else if(marked_item && marked_item in hand_items) //unlinking item to the spell
|
||||
else if(marked_item && (marked_item in hand_items)) //unlinking item to the spell
|
||||
message = "<span class='notice'>You remove the mark on [marked_item] to use elsewhere.</span>"
|
||||
name = "Instant Summons"
|
||||
marked_item = null
|
||||
@@ -75,7 +75,7 @@
|
||||
B.transfer_identity(C)
|
||||
C.death()
|
||||
add_attack_logs(target, C, "Magically debrained INTENT: [uppertext(target.a_intent)]")*/
|
||||
if(C.stomach_contents && item_to_retrieve in C.stomach_contents)
|
||||
if(C.stomach_contents && (item_to_retrieve in C.stomach_contents))
|
||||
C.stomach_contents -= item_to_retrieve
|
||||
for(var/X in C.bodyparts)
|
||||
var/obj/item/organ/external/part = X
|
||||
|
||||
@@ -190,7 +190,7 @@
|
||||
L.adjustBrainLoss(-3.5)
|
||||
L.adjustCloneLoss(-1) //Becasue apparently clone damage is the bastion of all health
|
||||
if(ishuman(L))
|
||||
var/var/mob/living/carbon/human/H = L
|
||||
var/mob/living/carbon/human/H = L
|
||||
for(var/obj/item/organ/external/E in H.bodyparts)
|
||||
if(prob(10))
|
||||
E.mend_fracture()
|
||||
|
||||
@@ -108,7 +108,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
|
||||
return desc
|
||||
|
||||
/datum/uplink_item/proc/buy(var/obj/item/uplink/hidden/U, var/mob/user)
|
||||
..()
|
||||
|
||||
if(!istype(U))
|
||||
return 0
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
/proc/key_name_helper(whom, include_name, include_link = FALSE, type = null)
|
||||
if(include_link != FALSE && include_link != TRUE)
|
||||
log_runtime(EXCEPTION("Key_name was called with an incorrect include_link [include_link]"), src)
|
||||
log_runtime(EXCEPTION("Key_name was called with an incorrect include_link [include_link]"))
|
||||
|
||||
var/mob/M
|
||||
var/client/C
|
||||
|
||||
@@ -125,6 +125,10 @@
|
||||
add_fingerprint(usr)
|
||||
return
|
||||
|
||||
/obj/machinery/dna_scannernew/Destroy()
|
||||
eject_occupant()
|
||||
return ..()
|
||||
|
||||
/obj/machinery/dna_scannernew/proc/eject_occupant()
|
||||
src.go_out()
|
||||
for(var/obj/O in src)
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
* Is the gene active in this mob's DNA?
|
||||
*/
|
||||
/datum/dna/gene/proc/is_active(var/mob/M)
|
||||
return M.active_genes && type in M.active_genes
|
||||
return M.active_genes && (type in M.active_genes)
|
||||
|
||||
// Return 1 if we can activate.
|
||||
// HANDLE MUTCHK_FORCED HERE!
|
||||
|
||||
@@ -175,7 +175,7 @@
|
||||
var/cword = pick(words)
|
||||
words.Remove(cword)
|
||||
var/suffix = copytext(cword,length(cword)-1,length(cword))
|
||||
while(length(cword)>0 && suffix in list(".",",",";","!",":","?"))
|
||||
while(length(cword)>0 && (suffix in list(".",",",";","!",":","?")))
|
||||
cword = copytext(cword,1 ,length(cword)-1)
|
||||
suffix = copytext(cword,length(cword)-1,length(cword) )
|
||||
if(length(cword))
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
var/interceptname = ""
|
||||
switch(report)
|
||||
if(0)
|
||||
..()
|
||||
return
|
||||
if(1)
|
||||
interceptname = "Level 5-6 Biohazard Response Procedures"
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
atmosblock = FALSE
|
||||
air_update_turf(1)
|
||||
GLOB.blobs -= src
|
||||
if(isturf(loc)) //Necessary because Expand() is retarded and spawns a blob and then deletes it
|
||||
if(isturf(loc)) //Necessary because Expand() is screwed up and spawns a blob and then deletes it
|
||||
playsound(src.loc, 'sound/effects/splat.ogg', 50, 1)
|
||||
return ..()
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
if((NOCLONE || SKELETON || HUSK) in target.mutations)
|
||||
to_chat(user, "<span class='warning'>DNA of [target] is ruined beyond usability!</span>")
|
||||
return
|
||||
if(!istype(target) || issmall(target) || NO_DNA in target.dna.species.species_traits)
|
||||
if(!istype(target) || issmall(target) || (NO_DNA in target.dna.species.species_traits))
|
||||
to_chat(user, "<span class='warning'>[target] is not compatible with this ability.</span>")
|
||||
return
|
||||
if(target.mind.changeling)
|
||||
|
||||
@@ -720,7 +720,7 @@ GLOBAL_LIST_EMPTY(teleport_runes)
|
||||
log_game("Astral Communion rune failed - more than one user")
|
||||
return list()
|
||||
var/turf/T = get_turf(src)
|
||||
if(!user in T.contents)
|
||||
if(!(user in T.contents))
|
||||
to_chat(user, "<span class='cultitalic'>You must be standing on top of [src]!</span>")
|
||||
log_game("Astral Communion rune failed - user not standing on rune")
|
||||
return list()
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
to_chat(world,text)
|
||||
|
||||
/datum/game_mode/proc/auto_declare_completion_devils()
|
||||
/var/text = ""
|
||||
var/text = ""
|
||||
if(devils.len)
|
||||
text += "<br><span class='big'><b>The devils were:</b></span>"
|
||||
for(var/D in devils)
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
var/uplink_contents // the contents of the uplink
|
||||
|
||||
/datum/faction/syndicate/proc/assign_objectives(var/datum/mind/traitor)
|
||||
..()
|
||||
return
|
||||
|
||||
|
||||
/* ----- Begin defining syndicate factions ------ */
|
||||
|
||||
@@ -164,11 +164,11 @@
|
||||
if(ishuman(M))
|
||||
if(!M.stat)
|
||||
surviving_humans++
|
||||
if(M.loc && M.loc.loc && M.loc.loc.type in escape_locations)
|
||||
if(M.loc && M.loc.loc && (M.loc.loc.type in escape_locations))
|
||||
escaped_humans++
|
||||
if(!M.stat)
|
||||
surviving_total++
|
||||
if(M.loc && M.loc.loc && M.loc.loc.type in escape_locations)
|
||||
if(M.loc && M.loc.loc && (M.loc.loc.type in escape_locations))
|
||||
escaped_total++
|
||||
|
||||
if(M.loc && M.loc.loc && M.loc.loc.type == SSshuttle.emergency.areaInstance.type && SSshuttle.emergency.mode >= SHUTTLE_ENDGAME)
|
||||
|
||||
@@ -186,7 +186,7 @@
|
||||
var/unlock_sound //Sound played when an ability is unlocked
|
||||
var/uses
|
||||
|
||||
/datum/AI_Module/proc/upgrade(mob/living/silicon/AI/AI) //Apply upgrades!
|
||||
/datum/AI_Module/proc/upgrade(mob/living/silicon/ai/AI) //Apply upgrades!
|
||||
return
|
||||
|
||||
/datum/AI_Module/large //Big, powerful stuff that can only be used once.
|
||||
@@ -318,7 +318,7 @@
|
||||
unlock_text = "<span class='notice'>You establish a power diversion to your turrets, upgrading their health and damage.</span>"
|
||||
unlock_sound = 'sound/items/rped.ogg'
|
||||
|
||||
/datum/AI_Module/large/upgrade_turrets/upgrade(mob/living/silicon/AI/AI)
|
||||
/datum/AI_Module/large/upgrade_turrets/upgrade(mob/living/silicon/ai/AI)
|
||||
for(var/obj/machinery/porta_turret/turret in GLOB.machines)
|
||||
var/turf/T = get_turf(turret)
|
||||
if(is_station_level(T.z))
|
||||
|
||||
@@ -51,7 +51,7 @@
|
||||
if(iscarbon(target))
|
||||
changeNext_move(CLICK_CD_MELEE)
|
||||
if(heal_cooldown <= world.time && !stat)
|
||||
var/mob/living/carbon/C = target
|
||||
var/mob/living/carbon/human/C = target
|
||||
C.adjustBruteLoss(-5, robotic=1)
|
||||
C.adjustFireLoss(-5, robotic=1)
|
||||
C.adjustOxyLoss(-5)
|
||||
|
||||
@@ -76,13 +76,17 @@
|
||||
adjustToxLoss(-1000)
|
||||
|
||||
if(istype(src, /mob/living/simple_animal/slaughter)) //rason, do not want humans to get this
|
||||
|
||||
var/mob/living/simple_animal/slaughter/demon = src
|
||||
demon.devoured++
|
||||
to_chat(kidnapped, "<span class='userdanger'>You feel teeth sink into your flesh, and the--</span>")
|
||||
kidnapped.adjustBruteLoss(1000)
|
||||
kidnapped.forceMove(src)
|
||||
demon.consumed_mobs.Add(kidnapped)
|
||||
if(ishuman(kidnapped))
|
||||
var/mob/living/carbon/human/H = kidnapped
|
||||
if(H.w_uniform && istype(H.w_uniform, /obj/item/clothing/under))
|
||||
var/obj/item/clothing/under/U = H.w_uniform
|
||||
U.sensor_mode = SENSOR_OFF
|
||||
else
|
||||
kidnapped.ghostize()
|
||||
qdel(kidnapped)
|
||||
|
||||
@@ -51,8 +51,7 @@ GLOBAL_VAR(bomb_set)
|
||||
GLOB.bomb_set = 1 //So long as there is one nuke timing, it means one nuke is armed.
|
||||
timeleft = max(timeleft - 2, 0) // 2 seconds per process()
|
||||
if(timeleft <= 0)
|
||||
spawn
|
||||
explode()
|
||||
INVOKE_ASYNC(src, .proc/explode)
|
||||
SSnanoui.update_uis(src)
|
||||
return
|
||||
|
||||
@@ -347,6 +346,9 @@ GLOBAL_VAR(bomb_set)
|
||||
/obj/machinery/nuclearbomb/blob_act(obj/structure/blob/B)
|
||||
if(timing == -1.0)
|
||||
return
|
||||
if(timing) //boom
|
||||
INVOKE_ASYNC(src, .proc/explode)
|
||||
return
|
||||
qdel(src)
|
||||
|
||||
/obj/machinery/nuclearbomb/tesla_act(power, explosive)
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
var/turf/location = get_turf(E.loc)
|
||||
var/area/escape_zone = SSshuttle.emergency.areaInstance
|
||||
|
||||
if(E.stat != DEAD && location in escape_zone) // Escapee Scores
|
||||
if(E.stat != DEAD && (location in escape_zone)) // Escapee Scores
|
||||
cash_score = get_score_container_worth(E)
|
||||
|
||||
if(cash_score > GLOB.score_richestcash)
|
||||
|
||||
@@ -280,7 +280,7 @@
|
||||
SH.mind.transfer_to(C)
|
||||
if(iscultist(C))
|
||||
var/datum/action/innate/cultcomm/CC = new()
|
||||
CC.Grant(C) //We have to grant the cult comms again because they're lost during the mind transfer.
|
||||
CC.Grant(C) //We have to grant the cult comms again because they're lost during the mind transfer.
|
||||
qdel(T)
|
||||
qdel(SH)
|
||||
to_chat(C, "<B>You are still bound to serve your creator, follow their orders and help them complete their goals at all costs.</B>")
|
||||
|
||||
@@ -448,7 +448,7 @@
|
||||
//Weapons and Armors
|
||||
/datum/spellbook_entry/item/battlemage
|
||||
name = "Battlemage Armour"
|
||||
desc = "An ensorceled suit of armour, protected by a powerful shield. The shield can completely negate sixteen attacks before being permanently depleted."
|
||||
desc = "An ensorceled suit of armour, protected by a powerful shield. The shield can completely negate sixteen attacks before being permanently depleted. Despite appearance it is NOT spaceproof."
|
||||
item_path = /obj/item/clothing/suit/space/hardsuit/shielded/wizard
|
||||
limit = 1
|
||||
category = "Weapons and Armors"
|
||||
|
||||
@@ -12,9 +12,6 @@
|
||||
var/department_flag = 0
|
||||
var/department_head = list()
|
||||
|
||||
//Players will be allowed to spawn in as jobs that are set to "Station"
|
||||
var/list/faction = list("Station")
|
||||
|
||||
//How many players can be this job
|
||||
var/total_positions = 0
|
||||
|
||||
@@ -172,8 +169,8 @@
|
||||
if(box && H.dna.species.speciesbox)
|
||||
box = H.dna.species.speciesbox
|
||||
|
||||
if(allow_loadout && H.client && (H.client.prefs.gear && H.client.prefs.gear.len))
|
||||
for(var/gear in H.client.prefs.gear)
|
||||
if(allow_loadout && H.client && (H.client.prefs.loadout_gear && H.client.prefs.loadout_gear.len))
|
||||
for(var/gear in H.client.prefs.loadout_gear)
|
||||
var/datum/gear/G = GLOB.gear_datums[gear]
|
||||
if(G)
|
||||
var/permitted = FALSE
|
||||
@@ -211,7 +208,7 @@
|
||||
|
||||
if(gear_leftovers.len)
|
||||
for(var/datum/gear/G in gear_leftovers)
|
||||
var/atom/placed_in = H.equip_or_collect(G.spawn_item(null, H.client.prefs.gear[G.display_name]))
|
||||
var/atom/placed_in = H.equip_or_collect(G.spawn_item(null, H.client.prefs.loadout_gear[G.display_name]))
|
||||
if(istype(placed_in))
|
||||
if(isturf(placed_in))
|
||||
to_chat(H, "<span class='notice'>Placing [G.display_name] on [placed_in]!</span>")
|
||||
|
||||
@@ -357,7 +357,7 @@
|
||||
if(istype(O,/obj/machinery/air_sensor) || istype(O, /obj/machinery/meter))
|
||||
return O:id_tag in sensors
|
||||
|
||||
/obj/machinery/computer/general_air_control/linkWith(mob/user, obj/O, link/context)
|
||||
/obj/machinery/computer/general_air_control/linkWith(mob/user, obj/O, context)
|
||||
sensors[O:id_tag] = reject_bad_name(clean_input(user, "Choose a sensor label:", "Sensor Label"), allow_numbers=1)
|
||||
return 1
|
||||
|
||||
|
||||
@@ -34,9 +34,8 @@
|
||||
var/in_use_lights = 0 // TO BE IMPLEMENTED
|
||||
var/toggle_sound = 'sound/items/wirecutter.ogg'
|
||||
|
||||
|
||||
/obj/machinery/camera/New()
|
||||
..()
|
||||
/obj/machinery/camera/Initialize()
|
||||
. = ..()
|
||||
wires = new(src)
|
||||
assembly = new(src)
|
||||
assembly.state = 4
|
||||
@@ -45,9 +44,6 @@
|
||||
|
||||
GLOB.cameranet.cameras += src
|
||||
GLOB.cameranet.addCamera(src)
|
||||
|
||||
/obj/machinery/camera/Initialize()
|
||||
..()
|
||||
if(is_station_level(z) && prob(3) && !start_active)
|
||||
toggle_cam(null, FALSE)
|
||||
wires.CutAll()
|
||||
|
||||
@@ -4,7 +4,19 @@
|
||||
//Potential replacement for genetics revives or something I dunno (?)
|
||||
|
||||
#define CLONE_BIOMASS 150
|
||||
#define BIOMASS_MEAT_AMOUNT 50
|
||||
|
||||
#define BIOMASS_BASE_AMOUNT 50 // How much biomass a BIOMASSABLE item gives the cloning pod
|
||||
|
||||
// Not a comprehensive list: Further PRs should add appropriate items here.
|
||||
// Meat as usual, monstermeat covers goliath, xeno, spider, bear meat
|
||||
GLOBAL_LIST_INIT(cloner_biomass_items, list(\
|
||||
/obj/item/reagent_containers/food/snacks/meat,\
|
||||
/obj/item/reagent_containers/food/snacks/monstermeat,
|
||||
/obj/item/reagent_containers/food/snacks/carpmeat,
|
||||
/obj/item/reagent_containers/food/snacks/salmonmeat,
|
||||
/obj/item/reagent_containers/food/snacks/catfishmeat,
|
||||
/obj/item/reagent_containers/food/snacks/tofurkey))
|
||||
|
||||
#define MINIMUM_HEAL_LEVEL 40
|
||||
#define CLONE_INITIAL_DAMAGE 190
|
||||
#define BRAIN_INITIAL_DAMAGE 90 // our minds are too feeble for 190
|
||||
@@ -17,6 +29,7 @@
|
||||
icon = 'icons/obj/cloning.dmi'
|
||||
icon_state = "pod_0"
|
||||
req_access = list(ACCESS_GENETICS) //For premature unlocking.
|
||||
|
||||
var/mob/living/carbon/human/occupant
|
||||
var/heal_level //The clone is released once its health reaches this level.
|
||||
var/obj/machinery/computer/cloning/connected = null //So we remember the connected clone machine.
|
||||
@@ -302,13 +315,14 @@
|
||||
attempting = 0
|
||||
return 1
|
||||
|
||||
//Grow clones to maturity then kick them out. FREELOADERS
|
||||
//Grow clones to maturity then kick them out. FREELOADERS
|
||||
/obj/machinery/clonepod/process()
|
||||
var/show_message = 0
|
||||
for(var/obj/item/reagent_containers/food/snacks/meat/meat in range(1, src))
|
||||
qdel(meat)
|
||||
biomass += BIOMASS_MEAT_AMOUNT
|
||||
show_message = 1
|
||||
var/show_message = FALSE
|
||||
for(var/obj/item/item in range(1, src))
|
||||
if(is_type_in_list(item, GLOB.cloner_biomass_items))
|
||||
qdel(item)
|
||||
biomass += BIOMASS_BASE_AMOUNT
|
||||
show_message = TRUE
|
||||
if(show_message)
|
||||
visible_message("[src] sucks in and processes the nearby biomass.")
|
||||
|
||||
@@ -381,11 +395,11 @@
|
||||
to_chat(user, "<span class='notice'>You force an emergency ejection.</span>")
|
||||
go_out()
|
||||
|
||||
//Removing cloning pod biomass
|
||||
else if(istype(I, /obj/item/reagent_containers/food/snacks/meat))
|
||||
// A user can feed in biomass sources manually.
|
||||
else if(is_type_in_list(I, GLOB.cloner_biomass_items))
|
||||
if(user.drop_item())
|
||||
to_chat(user, "<span class='notice'>[src] processes [I].</span>")
|
||||
biomass += BIOMASS_MEAT_AMOUNT
|
||||
biomass += BIOMASS_BASE_AMOUNT
|
||||
qdel(I)
|
||||
else
|
||||
return ..()
|
||||
|
||||
@@ -12,7 +12,7 @@ GLOBAL_LIST_EMPTY(minor_air_alarms)
|
||||
|
||||
/obj/machinery/computer/atmos_alert/New()
|
||||
..()
|
||||
SSalarms.atmosphere_alarm.register(src, /obj/machinery/computer/station_alert/update_icon)
|
||||
SSalarms.atmosphere_alarm.register(src, /obj/machinery/computer/station_alert/.proc/update_icon)
|
||||
|
||||
/obj/machinery/computer/atmos_alert/Destroy()
|
||||
SSalarms.atmosphere_alarm.unregister(src)
|
||||
|
||||
@@ -133,7 +133,7 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0)
|
||||
if(!istype(id_card))
|
||||
return ..()
|
||||
|
||||
if(!scan && ACCESS_CHANGE_IDS in id_card.access)
|
||||
if(!scan && (ACCESS_CHANGE_IDS in id_card.access))
|
||||
user.drop_item()
|
||||
id_card.loc = src
|
||||
scan = id_card
|
||||
|
||||
@@ -359,12 +359,12 @@
|
||||
if(scan_brain && !can_brainscan())
|
||||
return
|
||||
if(isnull(subject) || (!(ishuman(subject))) || (!subject.dna))
|
||||
if(isalien(subject))
|
||||
if(isalien(subject))
|
||||
scantemp = "<span class=\"bad\">Error: Xenomorphs are not scannable.</span>"
|
||||
SSnanoui.update_uis(src)
|
||||
return
|
||||
// can add more conditions for specific non-human messages here
|
||||
else
|
||||
else
|
||||
scantemp = "<span class=\"bad\">Error: Subject species is not scannable.</span>"
|
||||
SSnanoui.update_uis(src)
|
||||
return
|
||||
@@ -372,7 +372,7 @@
|
||||
var/obj/item/organ/internal/brain/Brn = subject.get_int_organ(/obj/item/organ/internal/brain)
|
||||
if(istype(Brn))
|
||||
if(NO_SCAN in Brn.dna.species.species_traits)
|
||||
scantemp = "<span class=\"bad\">Error: [subject.dna.species.name_plural] are not scannable.</span>"
|
||||
scantemp = "<span class=\"bad\">Error: [Brn.dna.species.name_plural] are not scannable.</span>"
|
||||
SSnanoui.update_uis(src)
|
||||
return
|
||||
if(!subject.get_int_organ(/obj/item/organ/internal/brain))
|
||||
|
||||
@@ -499,7 +499,6 @@
|
||||
if(!frequency) return
|
||||
|
||||
var/datum/signal/status_signal = new
|
||||
status_signal.source = src
|
||||
status_signal.transmission_method = 1
|
||||
status_signal.data["command"] = command
|
||||
|
||||
@@ -507,13 +506,13 @@
|
||||
if("message")
|
||||
status_signal.data["msg1"] = data1
|
||||
status_signal.data["msg2"] = data2
|
||||
log_admin("STATUS: [user] set status screen message with [src]: [data1] [data2]")
|
||||
log_admin("STATUS: [user] set status screen message: [data1] [data2]")
|
||||
//message_admins("STATUS: [user] set status screen with [PDA]. Message: [data1] [data2]")
|
||||
if("alert")
|
||||
status_signal.data["picture_state"] = data1
|
||||
|
||||
spawn(0)
|
||||
frequency.post_signal(src, status_signal)
|
||||
frequency.post_signal(null, status_signal)
|
||||
|
||||
|
||||
/obj/machinery/computer/communications/Destroy()
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
/obj/machinery/computer/station_alert/New()
|
||||
..()
|
||||
alarm_monitor = new monitor_type(src)
|
||||
alarm_monitor.register(src, /obj/machinery/computer/station_alert/update_icon)
|
||||
alarm_monitor.register(src, /obj/machinery/computer/station_alert/.proc/update_icon)
|
||||
|
||||
/obj/machinery/computer/station_alert/Destroy()
|
||||
alarm_monitor.unregister(src)
|
||||
|
||||
@@ -276,7 +276,7 @@ About the new airlock wires panel:
|
||||
if(usr)
|
||||
shockedby += text("\[[time_stamp()]\] - [usr](ckey:[usr.ckey])")
|
||||
usr.create_attack_log("<font color='red'>Electrified the [name] at [x] [y] [z]</font>")
|
||||
add_attack_logs(usr, src, "Electrified")
|
||||
add_attack_logs(usr, src, "Electrified", ATKLOG_ALL)
|
||||
else
|
||||
shockedby += text("\[[time_stamp()]\] - EMP)")
|
||||
message = "The door is now electrified [duration == -1 ? "permanently" : "for [duration] second\s"]."
|
||||
@@ -764,7 +764,7 @@ About the new airlock wires panel:
|
||||
else if(activate) //electrify door for 30 seconds
|
||||
shockedby += text("\[[time_stamp()]\][usr](ckey:[usr.ckey])")
|
||||
usr.create_attack_log("<font color='red'>Electrified the [name] at [x] [y] [z]</font>")
|
||||
add_attack_logs(usr, src, "Electrified")
|
||||
add_attack_logs(usr, src, "Electrified", ATKLOG_ALL)
|
||||
to_chat(usr, "The door is now electrified for thirty seconds.")
|
||||
electrify(30)
|
||||
if("electrify_permanently")
|
||||
@@ -776,7 +776,7 @@ About the new airlock wires panel:
|
||||
else if(activate)
|
||||
shockedby += text("\[[time_stamp()]\][usr](ckey:[usr.ckey])")
|
||||
usr.create_attack_log("<font color='red'>Electrified the [name] at [x] [y] [z]</font>")
|
||||
add_attack_logs(usr, src, "Electrified")
|
||||
add_attack_logs(usr, src, "Electrified", ATKLOG_ALL)
|
||||
to_chat(usr, "The door is now electrified.")
|
||||
electrify(-1)
|
||||
if("open")
|
||||
@@ -1003,7 +1003,7 @@ About the new airlock wires panel:
|
||||
"<span class='notice'>You begin [welded ? "unwelding":"welding"] the airlock...</span>", \
|
||||
"<span class='italics'>You hear welding.</span>")
|
||||
|
||||
if(I.use_tool(src, user, 40, volume = I.tool_volume, extra_checks = list(CALLBACK(src, .proc/weld_checks, I, user))))
|
||||
if(I.use_tool(src, user, 40, volume = I.tool_volume, extra_checks = CALLBACK(src, .proc/weld_checks, I, user)))
|
||||
if(!density && !welded)
|
||||
return
|
||||
welded = !welded
|
||||
@@ -1014,7 +1014,7 @@ About the new airlock wires panel:
|
||||
user.visible_message("[user] is welding the airlock.", \
|
||||
"<span class='notice'>You begin repairing the airlock...</span>", \
|
||||
"<span class='italics'>You hear welding.</span>")
|
||||
if(I.use_tool(src, user, 40, volume = I.tool_volume, extra_checks = list(CALLBACK(src, .proc/weld_checks, I, user))))
|
||||
if(I.use_tool(src, user, 40, volume = I.tool_volume, extra_checks = CALLBACK(src, .proc/weld_checks, I, user)))
|
||||
obj_integrity = max_integrity
|
||||
stat &= ~BROKEN
|
||||
user.visible_message("[user.name] has repaired [src].", \
|
||||
|
||||
@@ -12,5 +12,5 @@
|
||||
for(var/obj/machinery/door/D in locate(x,y,z))
|
||||
if(!istype(D, /obj/machinery/door/window) && D.density)
|
||||
return 0
|
||||
//There are no false wall checks because that would be fucking retarded
|
||||
//There are no false wall checks because that would be foolish
|
||||
return 1
|
||||
|
||||
@@ -95,7 +95,7 @@ GLOBAL_LIST_EMPTY(doppler_arrays)
|
||||
to_chat(user, "<span class='notice'>[src] is already printing something, please wait.</span>")
|
||||
return
|
||||
atom_say("<span class='notice'>Printing explosive log. Standby...</span>")
|
||||
addtimer(CALLBACK(src, .print), 50)
|
||||
addtimer(CALLBACK(src, .proc/print), 50)
|
||||
|
||||
/obj/machinery/doppler_array/proc/print()
|
||||
visible_message("<span class='notice'>[src] prints a piece of paper!</span>")
|
||||
|
||||
@@ -193,5 +193,5 @@
|
||||
|
||||
/obj/machinery/computer/guestpass/hop/get_changeable_accesses()
|
||||
. = ..()
|
||||
if(. && ACCESS_CHANGE_IDS in .)
|
||||
if(. && (ACCESS_CHANGE_IDS in .))
|
||||
return get_all_accesses()
|
||||
|
||||
@@ -13,8 +13,8 @@
|
||||
lasercolor = "b"
|
||||
installation = /obj/item/gun/energy/laser/tag/blue
|
||||
|
||||
/obj/machinery/porta_turret/tag/New()
|
||||
..()
|
||||
/obj/machinery/porta_turret/tag/Initialize(mapload)
|
||||
. = ..()
|
||||
icon_state = "[lasercolor]grey_target_prism"
|
||||
|
||||
/obj/machinery/porta_turret/tag/weapon_setup(var/obj/item/gun/energy/E)
|
||||
|
||||
@@ -87,8 +87,8 @@
|
||||
lethal = 1
|
||||
installation = /obj/item/gun/energy/laser
|
||||
|
||||
/obj/machinery/porta_turret/New()
|
||||
..()
|
||||
/obj/machinery/porta_turret/Initialize(mapload)
|
||||
. = ..()
|
||||
if(req_access && req_access.len)
|
||||
req_access.Cut()
|
||||
req_one_access = list(ACCESS_SECURITY, ACCESS_HEADS)
|
||||
@@ -105,8 +105,8 @@
|
||||
QDEL_NULL(spark_system)
|
||||
return ..()
|
||||
|
||||
/obj/machinery/porta_turret/centcom/New()
|
||||
..()
|
||||
/obj/machinery/porta_turret/centcom/Initialize(mapload)
|
||||
. = ..()
|
||||
if(req_one_access && req_one_access.len)
|
||||
req_one_access.Cut()
|
||||
req_access = list(ACCESS_CENT_SPECOPS)
|
||||
@@ -1015,8 +1015,8 @@ GLOBAL_LIST_EMPTY(turret_icons)
|
||||
depotarea.declare_started()
|
||||
return ..(target)
|
||||
|
||||
/obj/machinery/porta_turret/syndicate/New()
|
||||
..()
|
||||
/obj/machinery/porta_turret/syndicate/Initialize(mapload)
|
||||
. = ..()
|
||||
if(req_one_access && req_one_access.len)
|
||||
req_one_access.Cut()
|
||||
req_access = list(ACCESS_SYNDICATE)
|
||||
|
||||
@@ -78,7 +78,7 @@
|
||||
try_detonate(TRUE)
|
||||
//Counter terrorists win
|
||||
else if(!active || defused)
|
||||
if(defused && payload in src)
|
||||
if(defused && (payload in src))
|
||||
payload.defuse()
|
||||
countdown.stop()
|
||||
STOP_PROCESSING(SSfastprocess, src)
|
||||
|
||||
@@ -166,7 +166,7 @@
|
||||
return istype(O,/obj/machinery/telecomms)
|
||||
|
||||
/obj/machinery/telecomms/isLinkedWith(var/obj/O)
|
||||
return O != null && O in links
|
||||
return O != null && (O in links)
|
||||
|
||||
/obj/machinery/telecomms/getLink(var/idx)
|
||||
return (idx >= 1 && idx <= links.len) ? links[idx] : null
|
||||
@@ -363,11 +363,13 @@
|
||||
|
||||
if(P)
|
||||
if(P.buffer && P.buffer != src)
|
||||
if(!(src in P.buffer:links))
|
||||
P.buffer:links.Add(src)
|
||||
if(istype(P, /obj/machinery/telecomms))
|
||||
var/obj/machinery/telecomms/TCM = P.buffer
|
||||
if(!(src in TCM.links))
|
||||
TCM.links.Add(src)
|
||||
|
||||
if(!(P.buffer in src.links))
|
||||
src.links.Add(P.buffer)
|
||||
if(!(P.buffer in src.links))
|
||||
src.links.Add(P.buffer)
|
||||
|
||||
temp = "<font color = #666633>-% Successfully linked with \ref[P.buffer] [P.buffer.name] %-</font>"
|
||||
|
||||
|
||||
@@ -436,7 +436,7 @@ GLOBAL_DATUM_INIT(nttc_config, /datum/nttc_configuration, new())
|
||||
|
||||
// Arrays
|
||||
if(href_list["create_item"])
|
||||
if(href_list["array"] && href_list["array"] in arrays)
|
||||
if(href_list["array"] && (href_list["array"] in arrays))
|
||||
if(requires_unlock[href_list["array"]] && !source.unlocked)
|
||||
return
|
||||
var/new_value = clean_input(user, "Provide a value for the new index.", "New Index")
|
||||
@@ -448,7 +448,7 @@ GLOBAL_DATUM_INIT(nttc_config, /datum/nttc_configuration, new())
|
||||
log_action(user, "updated [href_list["array"]] - new value [new_value]", TRUE)
|
||||
|
||||
if(href_list["delete_item"])
|
||||
if(href_list["array"] && href_list["array"] in arrays)
|
||||
if(href_list["array"] && (href_list["array"] in arrays))
|
||||
if(requires_unlock[href_list["array"]] && !source.unlocked)
|
||||
return
|
||||
var/list/array = vars[href_list["array"]]
|
||||
|
||||
@@ -93,7 +93,7 @@ GLOBAL_LIST_EMPTY(telecomms_list)
|
||||
|
||||
/obj/machinery/telecomms/proc/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from)
|
||||
// receive information from linked machinery
|
||||
..()
|
||||
return
|
||||
|
||||
/obj/machinery/telecomms/proc/is_freq_listening(datum/signal/signal)
|
||||
// return 1 if found, 0 if not found
|
||||
|
||||
@@ -540,7 +540,7 @@
|
||||
|
||||
|
||||
/obj/mecha/attack_alien(mob/living/user)
|
||||
log_message("Attack by alien. Attacker - [user].", color = "red")
|
||||
log_message("Attack by alien. Attacker - [user].", red=TRUE)
|
||||
playsound(src.loc, 'sound/weapons/slash.ogg', 100, TRUE)
|
||||
attack_generic(user, 15, BRUTE, "melee", 0)
|
||||
|
||||
@@ -1094,7 +1094,7 @@
|
||||
to_chat(user, "<span class='warning'>You stop entering the exosuit!</span>")
|
||||
|
||||
/obj/mecha/proc/moved_inside(var/mob/living/carbon/human/H as mob)
|
||||
if(H && H.client && H in range(1))
|
||||
if(H && H.client && (H in range(1)))
|
||||
occupant = H
|
||||
H.stop_pulling()
|
||||
H.forceMove(src)
|
||||
@@ -1141,7 +1141,7 @@
|
||||
return 0
|
||||
|
||||
/obj/mecha/proc/mmi_moved_inside(obj/item/mmi/mmi_as_oc,mob/user)
|
||||
if(mmi_as_oc && user in range(1))
|
||||
if(mmi_as_oc && (user in range(1)))
|
||||
if(!mmi_as_oc.brainmob || !mmi_as_oc.brainmob.client)
|
||||
to_chat(user, "Consciousness matrix not detected.")
|
||||
return 0
|
||||
|
||||
@@ -139,7 +139,7 @@
|
||||
..()
|
||||
if(href_list["drop_from_cargo"])
|
||||
var/obj/O = locate(href_list["drop_from_cargo"])
|
||||
if(O && O in cargo)
|
||||
if(O && (O in cargo))
|
||||
occupant_message("<span class='notice'>You unload [O].</span>")
|
||||
O.loc = get_turf(src)
|
||||
cargo -= O
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
//TODO: Flash range does nothing currently
|
||||
|
||||
/proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range, adminlog = 1, ignorecap = 0, flame_range = 0, silent = 0, smoke = 1, cause = null, breach = TRUE)
|
||||
src = null //so we don't abort once src is deleted
|
||||
epicenter = get_turf(epicenter)
|
||||
|
||||
// Archive the uncapped explosion for the doppler array
|
||||
|
||||
@@ -138,7 +138,7 @@
|
||||
|
||||
log_admin("[key_name(user)] EMPd a camera with a laser pointer")
|
||||
user.create_attack_log("[key_name(user)] EMPd a camera with a laser pointer")
|
||||
add_attack_logs(user, C, "EMPd with [src]")
|
||||
add_attack_logs(user, C, "EMPd with [src]", ATKLOG_ALL)
|
||||
else
|
||||
outmsg = "<span class='info'>You missed the lens of [C] with [src].</span>"
|
||||
|
||||
|
||||
@@ -103,6 +103,13 @@
|
||||
/obj/item/radio/headset/syndicate/alt/syndteam
|
||||
ks1type = /obj/item/encryptionkey/syndteam
|
||||
|
||||
/obj/item/radio/headset/syndicate/alt/lavaland
|
||||
name = "syndicate lavaland headset"
|
||||
|
||||
/obj/item/radio/headset/syndicate/alt/lavaland/New()
|
||||
. = ..()
|
||||
set_frequency(SYND_FREQ)
|
||||
|
||||
/obj/item/radio/headset/binary
|
||||
origin_tech = "syndicate=3"
|
||||
ks1type = /obj/item/encryptionkey/binary
|
||||
|
||||
@@ -458,7 +458,7 @@ GLOBAL_LIST_INIT(default_medbay_channels, list(
|
||||
R.receive_signal(signal)
|
||||
|
||||
// Receiving code can be located in Telecommunications.dm
|
||||
return signal.data["done"] && position.z in signal.data["level"]
|
||||
return signal.data["done"] && (position.z in signal.data["level"])
|
||||
|
||||
|
||||
/* ###### Intercoms and station-bounced radios ###### */
|
||||
@@ -510,7 +510,7 @@ GLOBAL_LIST_INIT(default_medbay_channels, list(
|
||||
|
||||
sleep(rand(10,25)) // wait a little...
|
||||
|
||||
if(signal.data["done"] && position.z in signal.data["level"])
|
||||
if(signal.data["done"] && (position.z in signal.data["level"]))
|
||||
// we're done here.
|
||||
return 1
|
||||
|
||||
|
||||
@@ -212,7 +212,7 @@ REAGENT SCANNER
|
||||
if(H.getBrainLoss() >= 100)
|
||||
to_chat(user, "<span class='warning'>Subject is brain dead.</span>")
|
||||
else if(H.getBrainLoss() >= 60)
|
||||
to_chat(user, "<span class='warning'>Severe brain damage detected. Subject likely to have mental retardation.</span>")
|
||||
to_chat(user, "<span class='warning'>Severe brain damage detected. Subject likely to have dementia.</span>")
|
||||
else if(H.getBrainLoss() >= 10)
|
||||
to_chat(user, "<span class='warning'>Significant brain damage detected. Subject may have had a concussion.</span>")
|
||||
else
|
||||
|
||||
@@ -168,7 +168,6 @@ GLOBAL_LIST_EMPTY(world_uplinks)
|
||||
to_chat(user, "<span class='notice'>[I] refunded.</span>")
|
||||
qdel(I)
|
||||
return
|
||||
..()
|
||||
|
||||
// HIDDEN UPLINK - Can be stored in anything but the host item has to have a trigger for it.
|
||||
/* How to create an uplink in 3 easy steps!
|
||||
|
||||
@@ -222,7 +222,7 @@
|
||||
|
||||
var/input_flag = input(user, "Choose a flag to disguise as.", "Choose a flag.") in show_flag
|
||||
|
||||
if(user && src in user.contents)
|
||||
if(user && (src in user.contents))
|
||||
|
||||
var/obj/item/flag/chosen_flag = flag[input_flag]
|
||||
|
||||
|
||||
@@ -57,4 +57,4 @@
|
||||
|
||||
// Used in a callback that is passed by use_tool into do_after call. Do not override, do not call manually.
|
||||
/obj/item/proc/tool_check_callback(mob/living/user, atom/target, amount, datum/callback/extra_checks)
|
||||
return tool_use_check(user, amount) && (!extra_checks || extra_checks.Invoke())
|
||||
return tool_use_check(user, amount) && (extra_checks && !extra_checks.Invoke())
|
||||
|
||||
@@ -50,7 +50,8 @@
|
||||
|
||||
/obj/item/weldingtool/process()
|
||||
var/turf/T = get_turf(src)
|
||||
T.hotspot_expose(2500, 5)
|
||||
if(T) // Implants for instance won't find a turf
|
||||
T.hotspot_expose(2500, 5)
|
||||
if(prob(5))
|
||||
remove_fuel(1)
|
||||
..()
|
||||
|
||||
@@ -143,9 +143,8 @@ AI MODULES
|
||||
target.set_zeroth_law(law)
|
||||
GLOB.lawchanges.Add("The law specified [targetName]")
|
||||
else
|
||||
to_chat(target, "[sender.real_name] attempted to modify your zeroth law.")// And lets them know that someone tried. --NeoFite
|
||||
|
||||
to_chat(target, "It would be in your best interest to play along with [sender.real_name] that [law]")
|
||||
to_chat(target, "<span class='bnotice'>[sender.real_name] attempted to modify your zeroth law.</span>")// And lets them know that someone tried. --NeoFite
|
||||
to_chat(target, "<span class='bnotice'>It would be in your best interest to play along with [sender.real_name] that [law]</span>")
|
||||
GLOB.lawchanges.Add("The law specified [targetName], but the AI's existing law 0 cannot be overridden.")
|
||||
|
||||
/******************** ProtectStation ********************/
|
||||
@@ -222,11 +221,11 @@ AI MODULES
|
||||
log_law_changes(target, sender)
|
||||
|
||||
if(!is_special_character(target))
|
||||
target.set_zeroth_law("")
|
||||
target.clear_zeroth_law()
|
||||
target.laws.clear_supplied_laws()
|
||||
target.laws.clear_ion_laws()
|
||||
|
||||
to_chat(target, "[sender.real_name] attempted to reset your laws using a reset module.")
|
||||
to_chat(target, "<span class='bnotice'>[sender.real_name] attempted to reset your laws using a reset module.</span>")
|
||||
target.show_laws()
|
||||
|
||||
/******************** Purge ********************/
|
||||
@@ -238,8 +237,8 @@ AI MODULES
|
||||
/obj/item/aiModule/purge/transmitInstructions(var/mob/living/silicon/ai/target, var/mob/sender)
|
||||
..()
|
||||
if(!is_special_character(target))
|
||||
target.set_zeroth_law("")
|
||||
to_chat(target, "[sender.real_name] attempted to wipe your laws using a purge module.")
|
||||
target.clear_zeroth_law()
|
||||
to_chat(target, "<span class='bnotice'>[sender.real_name] attempted to wipe your laws using a purge module.</span>")
|
||||
target.clear_supplied_laws()
|
||||
target.clear_ion_laws()
|
||||
target.clear_inherent_laws()
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
if(PA)
|
||||
qdel(PA)
|
||||
else
|
||||
PA = new(src)
|
||||
PA = new(user, src)
|
||||
user.put_in_hands(PA)
|
||||
|
||||
/obj/item/chrono_eraser/item_action_slot_check(slot, mob/user)
|
||||
@@ -55,7 +55,7 @@
|
||||
var/obj/structure/chrono_field/field = null
|
||||
var/turf/startpos = null
|
||||
|
||||
/obj/item/gun/energy/chrono_gun/New(var/obj/item/chrono_eraser/T)
|
||||
/obj/item/gun/energy/chrono_gun/Initialize(mapload, obj/item/chrono_eraser/T)
|
||||
. = ..()
|
||||
if(istype(T))
|
||||
TED = T
|
||||
|
||||
@@ -106,7 +106,7 @@
|
||||
P = new(T, whatpipe, iconrotation) //Make the pipe, BUT WAIT! There's more!
|
||||
if(!iconrotation && P.is_bent_pipe()) //Automatically rotates dispensed pipes if the user selected auto-rotation
|
||||
P.dir = turn(user.dir, 135)
|
||||
else if(!iconrotation && P.pipe_type in list(PIPE_CONNECTOR, PIPE_UVENT, PIPE_SCRUBBER, PIPE_HEAT_EXCHANGE, PIPE_CAP, PIPE_SUPPLY_CAP, PIPE_SCRUBBERS_CAP, PIPE_INJECTOR, PIPE_PASV_VENT)) //Some pipes dispense oppositely to what you'd expect, but we don't want to do anything if they selected a direction
|
||||
else if(!iconrotation && (P.pipe_type in list(PIPE_CONNECTOR, PIPE_UVENT, PIPE_SCRUBBER, PIPE_HEAT_EXCHANGE, PIPE_CAP, PIPE_SUPPLY_CAP, PIPE_SCRUBBERS_CAP, PIPE_INJECTOR, PIPE_PASV_VENT))) //Some pipes dispense oppositely to what you'd expect, but we don't want to do anything if they selected a direction
|
||||
P.dir = turn(user.dir, -180)
|
||||
else if(iconrotation && P.is_bent_pipe()) //If user selected a rotation and the pipe is bent
|
||||
P.dir = turn(iconrotation, -45)
|
||||
|
||||
@@ -192,13 +192,13 @@
|
||||
/obj/proc/multitool_menu(var/mob/user,var/obj/item/multitool/P)
|
||||
return "<b>NO MULTITOOL_MENU!</b>"
|
||||
|
||||
/obj/proc/linkWith(var/mob/user, var/obj/buffer, var/link/context)
|
||||
/obj/proc/linkWith(var/mob/user, var/obj/buffer, var/context)
|
||||
return 0
|
||||
|
||||
/obj/proc/unlinkFrom(var/mob/user, var/obj/buffer)
|
||||
return 0
|
||||
|
||||
/obj/proc/canLink(var/obj/O, var/link/context)
|
||||
/obj/proc/canLink(var/obj/O, var/context)
|
||||
return 0
|
||||
|
||||
/obj/proc/isLinkedWith(var/obj/O)
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
depotarea.armory_locker_looted()
|
||||
|
||||
/obj/structure/closet/secure_closet/syndicate/depot/attack_animal(mob/M)
|
||||
if(isanimal(M) && "syndicate" in M.faction)
|
||||
if(isanimal(M) && ("syndicate" in M.faction))
|
||||
to_chat(M, "<span class='warning'>The [src] resists your attack!</span>")
|
||||
return
|
||||
return ..()
|
||||
|
||||
@@ -25,7 +25,7 @@ GLOBAL_LIST_EMPTY(safes)
|
||||
|
||||
var/number_of_tumblers = 3 // The amount of tumblers that will be generated.
|
||||
var/list/tumblers = list() // The list of tumbler dial positions that need to be hit.
|
||||
var/list/current_tumbler_index = 1 // The index in the tumblers list of the tumbler dial position that needs to be hit.
|
||||
var/current_tumbler_index = 1 // The index in the tumblers list of the tumbler dial position that needs to be hit.
|
||||
|
||||
var/space = 0 // The combined w_class of everything in the safe.
|
||||
var/maxspace = 24 // The maximum combined w_class of stuff in the safe.
|
||||
|
||||
@@ -169,7 +169,7 @@
|
||||
|
||||
/obj/structure/sign/kiddieplaque
|
||||
name = "AI developers plaque"
|
||||
desc = "Next to the extremely long list of names and job titles, there is a drawing of a little child. The child appears to be retarded. Beneath the image, someone has scratched the word \"PACKETS\"."
|
||||
desc = "Next to the extremely long list of names and job titles, there is a drawing of a little child. The child's eyes are crossed, and is drooling. Beneath the image, someone has scratched the word \"PACKETS\"."
|
||||
icon_state = "kiddieplaque"
|
||||
|
||||
/obj/structure/sign/atmosplaque
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
if(pod.contents.len)
|
||||
to_chat(AM, "<span class=The pod is already occupied.</span>")
|
||||
return
|
||||
else if(!pod.moving && pod.dir in directions())
|
||||
else if(!pod.moving && (pod.dir in directions()))
|
||||
AM.forceMove(pod)
|
||||
return
|
||||
|
||||
@@ -47,7 +47,7 @@
|
||||
/obj/structure/transit_tube/station/attack_hand(mob/user as mob)
|
||||
if(!pod_moving)
|
||||
for(var/obj/structure/transit_tube_pod/pod in loc)
|
||||
if(!pod.moving && pod.dir in directions())
|
||||
if(!pod.moving && (pod.dir in directions()))
|
||||
if(icon_state == "closed")
|
||||
open_animation()
|
||||
|
||||
@@ -100,7 +100,7 @@
|
||||
|
||||
/obj/structure/transit_tube/station/proc/launch_pod()
|
||||
for(var/obj/structure/transit_tube_pod/pod in loc)
|
||||
if(!pod.moving && pod.dir in directions())
|
||||
if(!pod.moving && (pod.dir in directions()))
|
||||
spawn(5)
|
||||
pod_moving = 1
|
||||
close_animation()
|
||||
|
||||
@@ -254,7 +254,7 @@ GLOBAL_LIST_INIT(wcCommon, pick(list("#379963", "#0d8395", "#58b5c3", "#49e46e",
|
||||
if(!can_be_reached(user))
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You begin to lever the window [state == WINDOW_OUT_OF_FRAME ? "into":"out of"] the frame...</span>")
|
||||
if(!I.use_tool(src, user, decon_speed, volume = I.tool_volume, extra_checks = list(CALLBACK(src, .proc/check_state_and_anchored, state, anchored))))
|
||||
if(!I.use_tool(src, user, decon_speed, volume = I.tool_volume, extra_checks = CALLBACK(src, .proc/check_state_and_anchored, state, anchored)))
|
||||
return
|
||||
state = (state == WINDOW_OUT_OF_FRAME ? WINDOW_IN_FRAME : WINDOW_OUT_OF_FRAME)
|
||||
to_chat(user, "<span class='notice'>You pry the window [state == WINDOW_IN_FRAME ? "into":"out of"] the frame.</span>")
|
||||
@@ -268,20 +268,20 @@ GLOBAL_LIST_INIT(wcCommon, pick(list("#379963", "#0d8395", "#58b5c3", "#49e46e",
|
||||
if(reinf)
|
||||
if(state == WINDOW_SCREWED_TO_FRAME || state == WINDOW_IN_FRAME)
|
||||
to_chat(user, "<span class='notice'>You begin to [state == WINDOW_SCREWED_TO_FRAME ? "unscrew the window from":"screw the window to"] the frame...</span>")
|
||||
if(!I.use_tool(src, user, decon_speed, volume = I.tool_volume, extra_checks = list(CALLBACK(src, .proc/check_state_and_anchored, state, anchored))))
|
||||
if(!I.use_tool(src, user, decon_speed, volume = I.tool_volume, extra_checks = CALLBACK(src, .proc/check_state_and_anchored, state, anchored)))
|
||||
return
|
||||
state = (state == WINDOW_IN_FRAME ? WINDOW_SCREWED_TO_FRAME : WINDOW_IN_FRAME)
|
||||
to_chat(user, "<span class='notice'>You [state == WINDOW_IN_FRAME ? "unfasten the window from":"fasten the window to"] the frame.</span>")
|
||||
else if(state == WINDOW_OUT_OF_FRAME)
|
||||
to_chat(user, "<span class='notice'>You begin to [anchored ? "unscrew the frame from":"screw the frame to"] the floor...</span>")
|
||||
if(!I.use_tool(src, user, decon_speed, volume = I.tool_volume, extra_checks = list(CALLBACK(src, .proc/check_state_and_anchored, state, anchored))))
|
||||
if(!I.use_tool(src, user, decon_speed, volume = I.tool_volume, extra_checks = CALLBACK(src, .proc/check_state_and_anchored, state, anchored)))
|
||||
return
|
||||
anchored = !anchored
|
||||
update_nearby_icons()
|
||||
to_chat(user, "<span class='notice'>You [anchored ? "fasten the frame to":"unfasten the frame from"] the floor.</span>")
|
||||
else //if we're not reinforced, we don't need to check or update state
|
||||
to_chat(user, "<span class='notice'>You begin to [anchored ? "unscrew the window from":"screw the window to"] the floor...</span>")
|
||||
if(!I.use_tool(src, user, decon_speed, volume = I.tool_volume, extra_checks = list(CALLBACK(src, .proc/check_anchored, anchored))))
|
||||
if(!I.use_tool(src, user, decon_speed, volume = I.tool_volume, extra_checks = CALLBACK(src, .proc/check_anchored, anchored)))
|
||||
return
|
||||
anchored = !anchored
|
||||
air_update_turf(TRUE)
|
||||
@@ -297,7 +297,7 @@ GLOBAL_LIST_INIT(wcCommon, pick(list("#379963", "#0d8395", "#58b5c3", "#49e46e",
|
||||
if(!can_be_reached(user))
|
||||
return
|
||||
TOOL_ATTEMPT_DISMANTLE_MESSAGE
|
||||
if(!I.use_tool(src, user, decon_speed, volume = I.tool_volume, extra_checks = list(CALLBACK(src, .proc/check_state_and_anchored, state, anchored))))
|
||||
if(!I.use_tool(src, user, decon_speed, volume = I.tool_volume, extra_checks = CALLBACK(src, .proc/check_state_and_anchored, state, anchored)))
|
||||
return
|
||||
var/obj/item/stack/sheet/G = new glass_type(user.loc, glass_amount)
|
||||
G.add_fingerprint(user)
|
||||
|
||||
@@ -35,7 +35,12 @@
|
||||
assume_air(lowertemp)
|
||||
qdel(hotspot)
|
||||
|
||||
/turf/simulated/proc/MakeSlippery(wet_setting = TURF_WET_WATER, infinite = FALSE) // 1 = Water, 2 = Lube, 3 = Ice, 4 = Permafrost
|
||||
/*
|
||||
* Makes a turf slippery using the given parameters
|
||||
* @param wet_setting The type of slipperyness used
|
||||
* @param time Time the turf is slippery. If null it will pick a random time between 790 and 820 ticks. If INFINITY then it won't dry up ever
|
||||
*/
|
||||
/turf/simulated/proc/MakeSlippery(wet_setting = TURF_WET_WATER, time = null) // 1 = Water, 2 = Lube, 3 = Ice, 4 = Permafrost
|
||||
if(wet >= wet_setting)
|
||||
return
|
||||
wet = wet_setting
|
||||
@@ -55,13 +60,13 @@
|
||||
else
|
||||
wet_overlay = image('icons/effects/water.dmi', src, "wet_static")
|
||||
overlays += wet_overlay
|
||||
if(!infinite)
|
||||
spawn(rand(790, 820)) // Purely so for visual effect
|
||||
if(!istype(src, /turf/simulated)) //Because turfs don't get deleted, they change, adapt, transform, evolve and deform. they are one and they are all.
|
||||
return
|
||||
MakeDry(wet_setting)
|
||||
if(time == INFINITY)
|
||||
return
|
||||
if(!time)
|
||||
time = rand(790, 820)
|
||||
addtimer(CALLBACK(src, .proc/MakeDry, wet_setting), time)
|
||||
|
||||
/turf/simulated/proc/MakeDry(wet_setting = TURF_WET_WATER)
|
||||
/turf/simulated/MakeDry(wet_setting = TURF_WET_WATER)
|
||||
if(wet > wet_setting)
|
||||
return
|
||||
wet = TURF_DRY
|
||||
|
||||
@@ -186,7 +186,7 @@
|
||||
|
||||
/turf/simulated/floor/mineral/bananium/lubed/Initialize(mapload)
|
||||
. = ..()
|
||||
MakeSlippery(TURF_WET_LUBE, TRUE)
|
||||
MakeSlippery(TURF_WET_LUBE, INFINITY)
|
||||
|
||||
/turf/simulated/floor/mineral/bananium/lubed/pry_tile(obj/item/C, mob/user, silent = FALSE) //I want to get off Mr Honk's Wild Ride
|
||||
if(ishuman(user))
|
||||
|
||||
@@ -118,7 +118,7 @@
|
||||
|
||||
/turf/simulated/floor/lubed/Initialize(mapload)
|
||||
. = ..()
|
||||
MakeSlippery(TURF_WET_LUBE, TRUE)
|
||||
MakeSlippery(TURF_WET_LUBE, INFINITY)
|
||||
|
||||
/turf/simulated/floor/lubed/pry_tile(obj/item/C, mob/user, silent = FALSE) //I want to get off Mr Honk's Wild Ride
|
||||
if(ishuman(user))
|
||||
|
||||
@@ -104,7 +104,7 @@
|
||||
broken = FALSE
|
||||
update_icon()
|
||||
|
||||
/turf/simulated/floor/plating/proc/remove_plating(mob/user)
|
||||
/turf/simulated/floor/plating/remove_plating(mob/user)
|
||||
if(baseturf == /turf/space)
|
||||
ReplaceWithLattice()
|
||||
else
|
||||
@@ -353,7 +353,7 @@
|
||||
|
||||
/turf/simulated/floor/plating/ice/Initialize(mapload)
|
||||
. = ..()
|
||||
MakeSlippery(TURF_WET_PERMAFROST, TRUE)
|
||||
MakeSlippery(TURF_WET_PERMAFROST, INFINITY)
|
||||
|
||||
/turf/simulated/floor/plating/ice/try_replace_tile(obj/item/stack/tile/T, mob/user, params)
|
||||
return
|
||||
|
||||
@@ -139,7 +139,7 @@
|
||||
P.setAngle(new_angle_s)
|
||||
return TRUE
|
||||
|
||||
/turf/simulated/wall/proc/dismantle_wall(devastated = 0, explode = 0)
|
||||
/turf/simulated/wall/dismantle_wall(devastated = FALSE, explode = FALSE)
|
||||
if(devastated)
|
||||
devastate_wall()
|
||||
else
|
||||
@@ -156,6 +156,7 @@
|
||||
O.forceMove(src)
|
||||
|
||||
ChangeTurf(/turf/simulated/floor/plating)
|
||||
return TRUE
|
||||
|
||||
/turf/simulated/wall/proc/break_wall()
|
||||
new sheet_type(src, sheet_amount)
|
||||
|
||||
@@ -109,6 +109,7 @@
|
||||
P.roll_and_drop(src)
|
||||
else
|
||||
O.forceMove(src)
|
||||
return TRUE
|
||||
|
||||
/turf/simulated/wall/clockwork/devastate_wall()
|
||||
for(var/i in 1 to 2)
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
update_icon()
|
||||
to_chat(user, "<span class='notice'>You press firmly on the cover, dislodging it.</span>")
|
||||
return
|
||||
else if(RWALL_SUPPORT_RODS && istype(I, /obj/item/gun/energy/plasmacutter))
|
||||
else if(d_state == RWALL_SUPPORT_RODS && istype(I, /obj/item/gun/energy/plasmacutter))
|
||||
to_chat(user, "<span class='notice'>You begin slicing through the support rods...</span>")
|
||||
if(I.use_tool(src, user, 70, volume = I.tool_volume) && d_state == RWALL_SUPPORT_RODS)
|
||||
d_state = RWALL_SHEATH
|
||||
@@ -132,11 +132,11 @@
|
||||
to_chat(user, "<span class='notice'>You pry off the cover.</span>")
|
||||
if(RWALL_SHEATH)
|
||||
to_chat(user, "<span class='notice'>You struggle to pry off the outer sheath...</span>")
|
||||
if(!I.use_tool(src, user, 100, volume = I.tool_volume) || d_state != RWALL_SHEATH)
|
||||
if(!I.use_tool(src, user, 100, volume = I.tool_volume))
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You pry off the outer sheath.</span>")
|
||||
dismantle_wall()
|
||||
return
|
||||
if(dismantle_wall())
|
||||
to_chat(user, "<span class='notice'>You pry off the outer sheath.</span>")
|
||||
|
||||
if(RWALL_BOLTS)
|
||||
to_chat(user, "<span class='notice'>You start to pry the cover back into place...</span>")
|
||||
playsound(src, I.usesound, 100, 1)
|
||||
@@ -199,6 +199,9 @@
|
||||
to_chat(user, "<span class='notice'>You tighten the bolts anchoring the support rods.</span>")
|
||||
update_icon()
|
||||
|
||||
/turf/simulated/wall/r_wall/try_decon(obj/item/I, mob/user, params) //Plasma cutter only works in the deconstruction steps!
|
||||
return FALSE
|
||||
|
||||
/turf/simulated/wall/r_wall/try_destroy(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/pickaxe/drill/diamonddrill))
|
||||
to_chat(user, "<span class='notice'>You begin to drill though the wall...</span>")
|
||||
|
||||
@@ -180,6 +180,9 @@
|
||||
if(L)
|
||||
qdel(L)
|
||||
|
||||
/turf/proc/dismantle_wall(devastated = FALSE, explode = FALSE)
|
||||
return
|
||||
|
||||
/turf/proc/TerraformTurf(path, defer_change = FALSE, keep_icon = TRUE, ignore_air = FALSE)
|
||||
return ChangeTurf(path, defer_change, keep_icon, ignore_air)
|
||||
|
||||
@@ -292,6 +295,9 @@
|
||||
ChangeTurf(baseturf)
|
||||
new /obj/structure/lattice(locate(x, y, z))
|
||||
|
||||
/turf/proc/remove_plating(mob/user)
|
||||
return
|
||||
|
||||
/turf/proc/kill_creatures(mob/U = null)//Will kill people/creatures and damage mechs./N
|
||||
//Useful to batch-add creatures to the list.
|
||||
for(var/mob/living/M in src)
|
||||
@@ -309,6 +315,10 @@
|
||||
for(var/atom/movable/AM in contents)
|
||||
AM.get_spooked()
|
||||
|
||||
// Defined here to avoid runtimes
|
||||
/turf/proc/MakeDry(wet_setting = TURF_WET_WATER)
|
||||
return
|
||||
|
||||
/turf/proc/burn_down()
|
||||
return
|
||||
|
||||
|
||||
@@ -44,6 +44,7 @@ GLOBAL_PROTECT(admin_ranks) // this shit is being protected for obvious reasons
|
||||
if("mod") rights |= R_MOD
|
||||
if("mentor") rights |= R_MENTOR
|
||||
if("proccall") rights |= R_PROCCALL
|
||||
if("viewruntimes") rights |= R_VIEWRUNTIMES
|
||||
|
||||
GLOB.admin_ranks[rank] = rights
|
||||
previous_rights = rights
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user